From 5862bca2c1ef89f4745458684e20c07cfde4a33d Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 17 Jun 2020 11:42:48 +0200 Subject: [PATCH] Axiom: added metadata to AxiomValue Signed-off-by: Tony Tkacik --- .../com/evolveum/axiom/api/AxiomComplexValue.java | 5 ++--- .../java/com/evolveum/axiom/api/AxiomValue.java | 10 ++++++++++ .../com/evolveum/axiom/api/ComplexValueImpl.java | 14 ++++++++++++-- .../axiom/api/schema/DelegatedItemDefinition.java | 2 +- .../lang/spi/AxiomIdentifierDefinitionImpl.java | 2 +- .../axiom/lang/spi/AxiomItemDefinitionImpl.java | 4 ++-- .../axiom/lang/spi/AxiomTypeDefinitionImpl.java | 7 +++---- .../axiom/lang/test/TestAxiomExtension.java | 2 +- 8 files changed, 32 insertions(+), 14 deletions(-) diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java index af88a4e017e..e472c549a03 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomComplexValue.java @@ -20,9 +20,8 @@ default Optional> item(AxiomItemDefinition def) { return (Optional) item(def.name()); } - @SuppressWarnings("unchecked") - default Optional> item(AxiomName name) { - return Optional.ofNullable((AxiomItem) itemMap().get(name)); + default Optional> item(AxiomName name) { + return Optional.ofNullable(itemMap().get(name)); } default Optional> onlyValue(Class type, AxiomItemDefinition... components) { diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomValue.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomValue.java index 31a29a3aded..27f14464260 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomValue.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/AxiomValue.java @@ -10,11 +10,21 @@ public interface AxiomValue extends AxiomInfraValue { AxiomName TYPE = AxiomName.axiom("type"); AxiomName VALUE = AxiomName.axiom("value"); + AxiomName METADATA = AxiomName.axiom("metadata"); Optional type(); V value(); + + default Optional metadata() { + return infraItem(METADATA).flatMap(v -> v.onlyValue().asComplex()); + } + + default Optional> metadata(AxiomName name) { + return metadata().flatMap(m -> m.item(name)); + } + default Optional asComplex() { if(this instanceof AxiomComplexValue) { return Optional.of((AxiomComplexValue) this); diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/ComplexValueImpl.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/ComplexValueImpl.java index 5f1a9400cc8..95361ae8b37 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/api/ComplexValueImpl.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/ComplexValueImpl.java @@ -6,6 +6,7 @@ import com.evolveum.axiom.api.schema.AxiomItemDefinition; import com.evolveum.axiom.api.schema.AxiomTypeDefinition; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; public class ComplexValueImpl implements AxiomComplexValue { @@ -38,8 +39,12 @@ public Optional> item(AxiomItemDefinition def) { } @Override - public Optional> item(AxiomName name) { - return Optional.ofNullable((AxiomItem) items.get(name)); + public Optional> item(AxiomName name) { + return Optional.ofNullable(items.get(name)); + } + + protected AxiomItem requireItem(AxiomName name) { + return item(name).orElseThrow(() -> new IllegalStateException(Strings.lenientFormat("Required item %s not present.", name))); } public Collection> items() { @@ -55,4 +60,9 @@ public Map> itemMap() { public Map> infraItems() { return infraItems; } + + @SuppressWarnings("unchecked") + protected Optional> as(Class type, Optional> item) { + return (Optional>) item; + } } diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/schema/DelegatedItemDefinition.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/schema/DelegatedItemDefinition.java index 8fafd5b6c8e..1b22dc782e9 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/api/schema/DelegatedItemDefinition.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/schema/DelegatedItemDefinition.java @@ -41,7 +41,7 @@ public Optional> item(AxiomItemDefinition def) { } @Override - public Optional> item(AxiomName name) { + public Optional> item(AxiomName name) { return delegate().asComplex().get().item(name); } diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomIdentifierDefinitionImpl.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomIdentifierDefinitionImpl.java index cf54528c88a..482ab22aaa4 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomIdentifierDefinitionImpl.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomIdentifierDefinitionImpl.java @@ -21,7 +21,7 @@ public AxiomIdentifierDefinitionImpl(AxiomTypeDefinition axiomItemDefinition, Ma super(axiomItemDefinition, items, infraItems); ImmutableList.Builder components = ImmutableList.builder(); - for (AxiomValue val : this.item(Item.ID_MEMBER.name()).get().values()) { + for (AxiomValue val : as(AxiomName.class,item(Item.ID_MEMBER.name())).get().values()) { components.add(val.value()); } this.components = components.build(); diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomItemDefinitionImpl.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomItemDefinitionImpl.java index 76e43d66e51..240c062ebfb 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomItemDefinitionImpl.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomItemDefinitionImpl.java @@ -24,8 +24,8 @@ public AxiomItemDefinitionImpl(AxiomTypeDefinition axiomItemDefinition, Map AxiomIdentifierDefinitionImpl.from(v)); - minOccurs = this.item(Item.MIN_OCCURS.name()); - substitutionOf = this.item(Item.SUBSTITUTION_OF.name()).map(v -> v.onlyValue().value()); + minOccurs = as(String.class,item(Item.MIN_OCCURS.name())); + substitutionOf = as(AxiomName.class, item(Item.SUBSTITUTION_OF.name())).map(v -> v.onlyValue().value()); } @Override diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomTypeDefinitionImpl.java b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomTypeDefinitionImpl.java index 0b12de00f83..852f06c3de8 100644 --- a/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomTypeDefinitionImpl.java +++ b/infra/axiom/src/main/java/com/evolveum/axiom/lang/spi/AxiomTypeDefinitionImpl.java @@ -30,7 +30,7 @@ public AxiomTypeDefinitionImpl(AxiomTypeDefinition def, Map builder = ImmutableMap.builder(); - Optional> itemDef = item(Item.ITEM_DEFINITION.name()); + Optional> itemDef = as(AxiomItemDefinition.class, item(Item.ITEM_DEFINITION.name())); if(itemDef.isPresent()) { supplyAll(name(),builder, itemDef.get().values()); } @@ -38,8 +38,7 @@ public AxiomTypeDefinitionImpl(AxiomTypeDefinition def, Map from(v.asComplex().get())); - - argument = this.item(Item.ARGUMENT.name()).flatMap(v -> itemDefinition(v.onlyValue().value())); + argument = as(AxiomName.class,item(Item.ARGUMENT.name())).flatMap(v -> itemDefinition(v.onlyValue().value())); identifiers = Collections2.transform((this.item(Item.IDENTIFIER_DEFINITION).map(v -> v.values()).orElse(Collections.emptyList())), AxiomIdentifierDefinitionImpl::from); } @@ -52,7 +51,7 @@ public static AxiomTypeDefinition from(AxiomComplexValue value) { } @Override - public Optional> item(AxiomName name) { + public Optional> item(AxiomName name) { return super.item(name); } diff --git a/infra/axiom/src/test/java/com/evolveum/axiom/lang/test/TestAxiomExtension.java b/infra/axiom/src/test/java/com/evolveum/axiom/lang/test/TestAxiomExtension.java index f9a8290512f..b328f0a290f 100644 --- a/infra/axiom/src/test/java/com/evolveum/axiom/lang/test/TestAxiomExtension.java +++ b/infra/axiom/src/test/java/com/evolveum/axiom/lang/test/TestAxiomExtension.java @@ -87,7 +87,7 @@ public void axiomTestLanguageExtension() throws IOException, AxiomSyntaxExceptio Optional personDef = schemaContext.getType(PERSON); assertTrue(personDef.isPresent()); - AxiomItem extension = personDef.get().asComplex().get().item(STORAGE).get(); + AxiomItem extension = personDef.get().asComplex().get().item(STORAGE).get(); assertFalse(extension.values().isEmpty(), "Extension statements should be available."); assertEquals(2, personDef.get().itemDefinitions().entrySet().size());