Skip to content

Commit

Permalink
Added substitution group to model
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Tkacik <tonydamage@gmail.com>
  • Loading branch information
tonydamage committed Jun 16, 2020
1 parent 0783318 commit 5cf1e75
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 12 deletions.
Expand Up @@ -50,22 +50,26 @@ public Optional<AxiomIdentifierDefinition> identifierDefinition() {
return Optional.of(NAME_IDENTIFIER.get());
}
};
public static final AxiomItemDefinition SUBSTITUTION_DEFINITION = new Item("substitution", Type.SUBSTITUTION_DEFINITION, false) {

@Override
public Optional<AxiomIdentifierDefinition> identifierDefinition() {
return Optional.of(NAME_IDENTIFIER.get());
}
};
public static final Item MODEL_DEFINITION = new Item("model", Type.MODEL, false);
public static final AxiomItemDefinition MIN_OCCURS = new Item("minOccurs", Type.STRING, false);
public static final AxiomItemDefinition MAX_OCCURS = new Item("maxOccurs", Type.STRING, false);
public static final AxiomItemDefinition TARGET_TYPE = new Item("targetType", Type.IDENTIFIER, true);
public static final AxiomItemDefinition ALLOWS_SUBSTITUTION= new Item("allowsSubstitution", Type.STRING, false);
public static final AxiomItemDefinition OPERATIONAL = new Item("operational", Type.IDENTIFIER, true);

public static final AxiomItemDefinition IDENTIFIER_DEFINITION = new Item("identifier", Type.IDENTIFIER_DEFINITION, true);

public static final AxiomItemDefinition ID_MEMBER = new Item("key", Type.STRING, false);
public static final AxiomItemDefinition ID_SCOPE = new Item("scope", Type.STRING, false);
public static final AxiomItemDefinition ID_SPACE = new Item("space", Type.IDENTIFIER, false);

public static final AxiomItemDefinition TARGET = new Item("target", Type.TYPE_REFERENCE, true);
public static final AxiomItemDefinition REF_TARGET = new Item("target", Type.TYPE_DEFINITION, true);
public static final AxiomItemDefinition SUBSTITUTION_OF = new Item("target", Type.IDENTIFIER, true);
public static final AxiomItemDefinition USES = new Item("include", Type.TYPE_REFERENCE, true);

public static final AxiomItemDefinition VALUE = new Item("value", null, true);

protected static final Lazy<AxiomIdentifierDefinition> NAME_IDENTIFIER = Lazy.from(
Expand Down Expand Up @@ -177,19 +181,26 @@ public static class Type implements AxiomTypeDefinition {
new Type("AxiomTypeDefinition", BASE_DEFINITION, () -> itemDefs(
Item.ARGUMENT,
Item.SUPERTYPE_REFERENCE,
Item.ITEM_DEFINITION
Item.ITEM_DEFINITION,
Item.SUBSTITUTION_DEFINITION
));


public static final Type ITEM_DEFINITION =
new Type("AxiomItemDefinition", BASE_DEFINITION, () -> itemDefs(
Item.TYPE_REFERENCE,
Item.IDENTIFIER_DEFINITION,
Item.ALLOWS_SUBSTITUTION,
Item.MIN_OCCURS,
Item.MAX_OCCURS,
Item.OPERATIONAL
));

public static final Type SUBSTITUTION_DEFINITION =
new Type("AxiomSubstitutionDefinition", ITEM_DEFINITION, () -> itemDefs(
Item.SUBSTITUTION_OF
));

public static final Type ROOT_DEFINITION = new Type("AxiomRootDefinition", ITEM_DEFINITION);

public static final Type IDENTIFIER_DEFINITION =
Expand Down
Expand Up @@ -35,6 +35,8 @@ default AxiomTypeDefinition typeDefinition() {

Dependency<AxiomValueContext<?>> modify(AxiomName identifierSpace, IdentifierSpaceKey identifier);

Dependency<AxiomValueContext<?>> modify();

Dependency.Search<AxiomValue<?>> global(AxiomName identifierSpace, IdentifierSpaceKey identifier);

Dependency.Search<AxiomValueReference<?>> reference(AxiomName identifierSpace, IdentifierSpaceKey identifier);
Expand Down
Expand Up @@ -36,6 +36,8 @@ default AxiomValueContext<?> parentValue() {

void replaceValue(V object);

<V> AxiomValueReference<V> asReference();

/*V requireValue() throws AxiomSemanticException;
AxiomItemDefinition definition();
Expand Down
@@ -1,6 +1,5 @@
package com.evolveum.axiom.lang.impl;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
Expand All @@ -10,20 +9,16 @@
import com.evolveum.axiom.api.AxiomComplexValue;
import com.evolveum.axiom.api.AxiomItem;
import com.evolveum.axiom.api.AxiomValue;
import com.evolveum.axiom.api.meta.Inheritance;
import com.evolveum.axiom.api.schema.AxiomIdentifierDefinition;
import com.evolveum.axiom.api.schema.AxiomIdentifierDefinition.Scope;
import com.evolveum.axiom.api.schema.AxiomItemDefinition;
import com.evolveum.axiom.api.schema.AxiomTypeDefinition;
import com.evolveum.axiom.lang.api.AxiomBuiltIn;
import com.evolveum.axiom.lang.api.AxiomBuiltIn.Item;
import com.evolveum.axiom.lang.api.AxiomBuiltIn.Type;
import com.evolveum.axiom.lang.api.AxiomModel;
import com.evolveum.axiom.lang.api.IdentifierSpaceKey;
import com.evolveum.axiom.lang.spi.AxiomSemanticException;
import com.evolveum.axiom.reactor.Dependency;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;

Expand Down Expand Up @@ -151,6 +146,21 @@ public void apply(Lookup<AxiomName> context, ActionBuilder<AxiomName> action) th
});
}
},
ITEM_FROM_SUBSTITUTION(items(Item.SUBSTITUTION_DEFINITION), types(Type.SUBSTITUTION_DEFINITION)) {

@Override
public void apply(Lookup<AxiomName> context, ActionBuilder<AxiomName> action) throws AxiomSemanticException {
// FIXME: Resolve original item
/*action.require(context.child(Item.NAME,AxiomName.class).flatMap(v -> {
}));*/
Dependency<AxiomValueContext<?>> parent = action.require(context.parentValue().modify());
action.apply(value -> {
parent.get().childItem(Item.ITEM_DEFINITION).addOperationalValue(value.asReference());
});
}

},
IMPORT_DEFAULT_TYPES(all(), types(Type.MODEL)) {
@Override
public void apply(Lookup<AxiomName> context, ActionBuilder<AxiomName> action) throws AxiomSemanticException {
Expand Down
Expand Up @@ -228,6 +228,11 @@ public <T> Dependency.Search<AxiomItem<T>> requireChild(AxiomName item) {
});
}

@Override
public <V> AxiomValueReference<V> asReference() {
return (AxiomValueReference<V>) reference;
}

@Override
public void replaceValue(V object) {
mutable().value = object;
Expand Down Expand Up @@ -308,6 +313,11 @@ public Dependency<AxiomValueContext<?>> modify(AxiomName space, IdentifierSpaceK
}));
}

@Override
public Dependency<AxiomValueContext<?>> modify() {
return Dependency.immediate(ValueContext.this);
}

@Override
public Dependency.Search<AxiomValue<?>> global(AxiomName space,
IdentifierSpaceKey key) {
Expand Down
Expand Up @@ -71,7 +71,7 @@ public static AxiomItemDefinition from(AxiomValue<?> value) {
if(value instanceof AxiomItemDefinition) {
return (AxiomItemDefinition) value;
}
return new AxiomItemDefinitionImpl(value.type().get(), null, value.asComplex().get().itemMap());
return new AxiomItemDefinitionImpl(value.type().get(), value.asComplex().get().itemMap(), value.asComplex().get().infraItems());
}

}
21 changes: 21 additions & 0 deletions infra/axiom/src/main/resources/axiom-model.axiom
Expand Up @@ -151,6 +151,16 @@ model axiom-model {
Definition of child items
""";
minOccurs 0;
allowsSubstitution true;
}

substitution substitution {
type AxiomSubstitutionDefinition;
identifier name;
documentation """
Definition of Substitution;
""";
minOccurs 0;
}

}
Expand Down Expand Up @@ -220,6 +230,17 @@ model axiom-model {
// item AxiomItem;
//}
}

item allowsSubstitution {
type boolean;
}
}

type AxiomSubstitutionDefinition {
supertype AxiomItemDefinition;
item target {
type AxiomName;
}
}

type AxiomRootDefinition {
Expand Down

0 comments on commit 5cf1e75

Please sign in to comment.