-
Notifications
You must be signed in to change notification settings - Fork 188
/
AxiomTypeDefinitionImpl.java
90 lines (74 loc) · 3.54 KB
/
AxiomTypeDefinitionImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.evolveum.axiom.lang.spi;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import com.evolveum.axiom.api.AxiomName;
import com.evolveum.axiom.api.AxiomStructuredValue;
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.AxiomItemDefinition;
import com.evolveum.axiom.api.schema.AxiomTypeDefinition;
import com.evolveum.axiom.lang.api.AxiomBuiltIn.Item;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
public class AxiomTypeDefinitionImpl extends AbstractBaseDefinition implements AxiomTypeDefinition {
public static final AxiomStructuredValue.Factory FACTORY = AxiomTypeDefinitionImpl::new;
private final Map<AxiomName, AxiomItemDefinition> itemDefinitions;
private final Optional<AxiomTypeDefinition> superType;
private final Optional<AxiomItemDefinition> argument;
private final Collection<AxiomIdentifierDefinition> identifiers;
public AxiomTypeDefinitionImpl(AxiomTypeDefinition def, Map<AxiomName, AxiomItem<?>> keywordMap, Map<AxiomName, AxiomItem<?>> infraItems) {
super(def, keywordMap, infraItems);
ImmutableMap.Builder<AxiomName, AxiomItemDefinition> builder = ImmutableMap.builder();
Optional<AxiomItem<AxiomItemDefinition>> itemDef = as(AxiomItemDefinition.class, item(Item.ITEM_DEFINITION.name()));
if(itemDef.isPresent()) {
supplyAll(name(),builder, itemDef.get().values());
}
itemDefinitions = builder.build();
superType = onlyValue(AxiomTypeDefinition.class,Item.SUPERTYPE_REFERENCE, Item.REF_TARGET).map(v -> from(v.asComplex().get()));
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);
}
public static AxiomTypeDefinition from(AxiomStructuredValue value) {
if(value instanceof AxiomTypeDefinition) {
return (AxiomTypeDefinition) value;
}
return new AxiomTypeDefinitionImpl(value.type().get(), null, value.asComplex().get().itemMap());
}
@Override
public Optional<? extends AxiomItem<?>> item(AxiomName name) {
return super.item(name);
}
@Override
public Optional<AxiomItemDefinition> argument() {
if (!argument.isPresent() && superType().isPresent()) {
return superType().get().argument();
}
return argument;
}
@Override
public Optional<AxiomTypeDefinition> superType() {
return superType;
}
@Override
public Map<AxiomName, AxiomItemDefinition> itemDefinitions() {
return itemDefinitions;
}
@Override
public Collection<AxiomIdentifierDefinition> identifierDefinitions() {
return identifiers;
}
private void supplyAll(AxiomName type, Builder<AxiomName, AxiomItemDefinition> builder,
Collection<? extends AxiomValue<AxiomItemDefinition>> values) {
for(AxiomValue<AxiomItemDefinition> v : values) {
AxiomItemDefinition val = AxiomItemDefinitionImpl.from(v);
AxiomName name = Inheritance.adapt(type, val.name());
builder.put(name, val);
}
}
}