diff --git a/infra/axiom/src/main/java/com/evolveum/axiom/api/meta/Inheritance.java b/infra/axiom/src/main/java/com/evolveum/axiom/api/meta/Inheritance.java new file mode 100644 index 00000000000..ffb44ca0606 --- /dev/null +++ b/infra/axiom/src/main/java/com/evolveum/axiom/api/meta/Inheritance.java @@ -0,0 +1,35 @@ +package com.evolveum.axiom.api.meta; + +import com.evolveum.axiom.api.AxiomIdentifier; +import com.evolveum.axiom.lang.api.AxiomItemDefinition; + +public interface Inheritance { + + Inheritance INHERIT = Inheritance::inheritNamespace; + Inheritance NO_CHANGE = Inheritance::noChange; + Inheritance NO_NAMESPACE = Inheritance::noNamespace; + Inheritance CURRENT = NO_CHANGE; + + + static AxiomIdentifier adapt(AxiomIdentifier parent, AxiomIdentifier child) { + return CURRENT.apply(parent, child); + } + + static AxiomIdentifier adapt(AxiomIdentifier parent, AxiomItemDefinition child) { + return child.inherited() ? adapt(parent, child.name()) : child.name(); + } + + AxiomIdentifier apply(AxiomIdentifier parent, AxiomIdentifier child); + + static AxiomIdentifier inheritNamespace(AxiomIdentifier parent, AxiomIdentifier name) { + return parent.localName(name.localName()); + } + + static AxiomIdentifier noNamespace(AxiomIdentifier parent, AxiomIdentifier name) { + return name.defaultNamespace(); + } + + static AxiomIdentifier noChange(AxiomIdentifier parent, AxiomIdentifier name) { + return 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 9125c157dc5..b7b828113f0 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 @@ -81,11 +81,9 @@ public void axiomTestLanguageExtension() throws IOException, AxiomSyntaxExceptio AxiomTypeDefinition typeDef = schemaContext.getType(Type.TYPE_DEFINITION.name()).get(); assertNotNull(typeDef.itemDefinition(STORAGE).get()); - ModelReactorContext extendedLanguage = ModelReactorContext.reactor(schemaContext); extendedLanguage.loadModelFromSource(source(LANG_EXT)); extendedLanguage.loadModelFromSource(source(LANG_EXT_USE)); - schemaContext = extendedLanguage.computeSchemaContext(); AxiomTypeDefinition langExtDef = schemaContext.getType(Type.EXTENSION_DEFINITION.name()).get(); @@ -95,8 +93,8 @@ public void axiomTestLanguageExtension() throws IOException, AxiomSyntaxExceptio assertTrue(personDef.isPresent()); AxiomItem extension = personDef.get().item(STORAGE).get(); - assertFalse(extension.values().isEmpty(), "Extension statements should be available."); + assertFalse(extension.values().isEmpty(), "Extension statements should be available."); assertEquals(2, personDef.get().itemDefinitions().entrySet().size()); } diff --git a/infra/axiom/src/test/resources/prism/common-core.axiom b/infra/axiom/src/test/resources/prism/common-core.axiom index 83b95e6c0b4..91e4d698f41 100644 --- a/infra/axiom/src/test/resources/prism/common-core.axiom +++ b/infra/axiom/src/test/resources/prism/common-core.axiom @@ -885,15 +885,15 @@ model common-core { // Example of short version of container definition. prism:container { - name Assignment; - itemName assignment; + name Assignment; + itemName assignment; - // item description; // TODO make this work - // item documentation; // TODO make this work - // item extension; // TODO make this work + // item description; // TODO make this work + // item documentation; // TODO make this work + // item extension; // TODO make this work - // ... - } + // ... + } prism:container { name Extension; diff --git a/infra/axiom/src/test/resources/prism/common-core.prism b/infra/axiom/src/test/resources/prism/common-core.prism index 031e94abd26..1dba7175fab 100644 --- a/infra/axiom/src/test/resources/prism/common-core.prism +++ b/infra/axiom/src/test/resources/prism/common-core.prism @@ -10,7 +10,7 @@ prism:model common-core { namespace "http://midpoint.evolveum.com/xml/ns/public/common/common-3"; version "3.0.0"; - + import prism { namespace "http://midpoint.evolveum.com/xml/ns/public/common/prism"; } @@ -861,7 +861,7 @@ prism:model common-core { } } - mixin Documentation { + mixin Documentation { item documentation { type string; documentation """ diff --git a/infra/axiom/src/test/resources/prism/prism.axiom b/infra/axiom/src/test/resources/prism/prism.axiom index 690fd745a7f..1de7e6a2088 100644 --- a/infra/axiom/src/test/resources/prism/prism.axiom +++ b/infra/axiom/src/test/resources/prism/prism.axiom @@ -12,7 +12,7 @@ model prism { extension PrismModelExtension { target axiom:AxiomModel; - + item object { type PrismObjectDefinition; } @@ -28,6 +28,9 @@ model prism { type PrismModel { extends axiom:AxiomModel; + item type { // {}:type + type PrismTypeDefinition; + } } extension PrismTypeDefinitionAnnotation {