Skip to content

Commit

Permalink
Axiom: Added test for metadata serialized in Axiom
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Tkacik <tony.tkacik@evolveum.com>
  • Loading branch information
tonydamage committed Jun 22, 2020
1 parent 4cdddb7 commit 1b22585
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 9 deletions.
Expand Up @@ -69,7 +69,7 @@ public AxiomValue<V> get() {
return (AxiomValue) factory.createComplex(type, build(children), build(infra));
}
Preconditions.checkState(children.isEmpty(), "%s does not have items. Items found %s", type.name(), children.keySet());
return factory.createSimple(type, value, Collections.emptyMap());
return factory.createSimple(type, value, build(infra));
}

private static Map<AxiomName,AxiomItem<?>> build(Map<AxiomName, Supplier<? extends AxiomItem<?>>> children) {
Expand Down
Expand Up @@ -9,7 +9,9 @@
import java.util.Collection;
import java.util.Optional;

import com.evolveum.axiom.api.AxiomInfraValue;
import com.evolveum.axiom.api.AxiomName;
import com.evolveum.axiom.api.AxiomValue;

public interface AxiomSchemaContext {

Expand All @@ -21,4 +23,8 @@ public interface AxiomSchemaContext {

Collection<AxiomTypeDefinition> types();

default AxiomTypeDefinition valueInfraType() {
return getType(AxiomValue.AXIOM_VALUE).get();
}

}
Expand Up @@ -28,17 +28,19 @@ public class AxiomItemTarget extends AxiomBuilderStreamTarget implements Supplie

private final AxiomSchemaContext context;
private final AxiomNameResolver resolver;
private AxiomTypeDefinition infraType = AxiomBuiltIn.Type.AXIOM_VALUE;
private final AxiomTypeDefinition infraType;
private Item<?> result;

public AxiomItemTarget(AxiomSchemaContext context) {
this(context, AxiomNameResolver.nullResolver());

}

public AxiomItemTarget(AxiomSchemaContext context, AxiomNameResolver rootResolver) {
offer(new Root());
this.context = context;
this.resolver = Preconditions.checkNotNull(rootResolver, "rootResolver");
infraType = context.valueInfraType();
}

@Override
Expand Down Expand Up @@ -122,7 +124,7 @@ public AxiomNameResolver valueResolver() {

@Override
public AxiomNameResolver infraResolver() {
return AxiomNameResolver.defaultNamespaceFromType(infraType);
return AxiomNameResolver.defaultNamespaceFromType(infraType).or(itemResolver());
}

protected Value<V> onlyValue() {
Expand Down Expand Up @@ -277,7 +279,7 @@ public AxiomName name() {

@Override
public AxiomNameResolver itemResolver() {
return AxiomNameResolver.defaultNamespaceFromType(builder.type());
return AxiomNameResolver.defaultNamespaceFromType(builder.type()).or(resolver);
}

@Override
Expand Down
Expand Up @@ -44,6 +44,10 @@ static AxiomNameResolver nullResolver() {
return NULL_RESOLVER;
}

default AxiomNameResolver orPrefix(String prefix, String namespace) {
return or((p, localName) -> prefix.equals(p) ? AxiomName.from(namespace, localName) : null);
}

default AxiomNameResolver or(AxiomNameResolver next) {
return (prefix, localName) -> {
AxiomName maybe = this.resolveIdentifier(prefix, localName);
Expand Down
7 changes: 3 additions & 4 deletions infra/axiom/src/main/resources/axiom-data.axiom
Expand Up @@ -45,15 +45,14 @@ model axiom-data {
item metadata {
type ValueMetadata;
}
item value {
type DynamicType;
}
}

type AxiomSimpleValue {
supertype AxiomValue;
argument value;

item value {
type DynamicType;
}
}

type AxiomStructuredValue {
Expand Down
1 change: 0 additions & 1 deletion infra/axiom/src/main/resources/axiom-model.axiom
Expand Up @@ -358,7 +358,6 @@ model axiom-model {

type MetadataDefinition {
supertype AugmentationDefinition;
// TODO: Add limits for specific types
item target {
const data:ValueMetadata;
}
Expand Down
Expand Up @@ -11,20 +11,25 @@
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;
import java.util.Optional;

import org.testng.annotations.Test;

import com.evolveum.axiom.api.AxiomName;
import com.evolveum.axiom.api.AxiomStructuredValue;
import com.evolveum.axiom.api.AxiomValue;
import com.evolveum.axiom.api.AxiomItem;
import com.evolveum.axiom.api.schema.AxiomItemDefinition;
import com.evolveum.axiom.api.schema.AxiomSchemaContext;
import com.evolveum.axiom.api.schema.AxiomTypeDefinition;
import com.evolveum.axiom.api.stream.AxiomItemTarget;
import com.evolveum.axiom.lang.antlr.AxiomAntlrStatementSource;
import com.evolveum.axiom.lang.api.AxiomBuiltIn.Type;
import com.evolveum.axiom.lang.impl.ModelReactorContext;
import com.evolveum.axiom.lang.spi.AxiomNameResolver;
import com.evolveum.axiom.lang.spi.AxiomSyntaxException;


Expand All @@ -43,6 +48,18 @@ public class TestAxiomExtension extends AbstractReactorTest {
private static final String METADATA_EXT = DIR + "metadata.axiom";
private static final AxiomName METADATA_MODIFIED = AxiomName.from("https://example.org/metadata", "modified");


private static final String DERIVED = "multimodel/derived/";
private static final String BASE_PERSON = DERIVED + "base-person.axiom";
private static final String DERIVED_PERSON = DERIVED + "derived-person.axiom";
private static final String JOHN_DOE_SUBSTITUTION_FILE = DIR + "john-doe-substitution.axiomd";

private static final AxiomName DERIVED_PERSON_TYPE = AxiomName.from("https://example.org/derived", "Person");

private static final AxiomName NAME = AxiomName.from("https://example.org/base", "name");
private static final AxiomName FIRST_NAME = DERIVED_PERSON_TYPE.localName("firstName");


@Test
public void axiomTestExtension() throws IOException, AxiomSyntaxException {
ModelReactorContext context = ModelReactorContext.defaultReactor();
Expand Down Expand Up @@ -102,11 +119,30 @@ public void axiomTestLanguageExtension() throws IOException, AxiomSyntaxExceptio
public void axiomTestMetadata() throws AxiomSyntaxException, IOException {
ModelReactorContext context = ModelReactorContext.defaultReactor();
context.loadModelFromSource(source(METADATA_EXT));
context.loadModelFromSource(source(BASE_PERSON));
context.loadModelFromSource(source(DERIVED_PERSON));
AxiomSchemaContext schemaContext = context.computeSchemaContext();
AxiomTypeDefinition metadataTypeDef = schemaContext.getType(AxiomValue.METADATA_TYPE).get();
Map<AxiomName, AxiomItemDefinition> defs = metadataTypeDef.itemDefinitions();
assertFalse(defs.isEmpty());
metadataTypeDef.itemDefinition(METADATA_MODIFIED).isPresent();


AxiomAntlrStatementSource stream = dataSource(JOHN_DOE_SUBSTITUTION_FILE);
AxiomItemTarget target = new AxiomItemTarget(schemaContext,
AxiomNameResolver.defaultNamespace(DERIVED_PERSON_TYPE.namespace())
.orPrefix("mymeta", METADATA_MODIFIED.namespace())
);
stream.stream(target);
AxiomItem<?> root = target.get();
assertEquals(root.name(), DERIVED_PERSON_TYPE.localName("person"));
AxiomStructuredValue person = root.onlyValue().asComplex().get();
assertEquals(person.item(NAME).get().onlyValue().value(), "John Doe");
assertEquals(person.item(FIRST_NAME).get().onlyValue().value(), "John");
assertEquals(person.metadata(METADATA_MODIFIED).get().onlyValue().value(), "structure");
assertEquals(person.item(FIRST_NAME).get().onlyValue().metadata(METADATA_MODIFIED).get().onlyValue().value(), "substitution");


}

}
@@ -0,0 +1,11 @@
person "John Doe" {
@metadata {
mymeta:modified "structure";
}
givenName "John" {
@metadata {
mymeta:modified "substitution";
}
}
familyName "Doe";
}

0 comments on commit 1b22585

Please sign in to comment.