-
Notifications
You must be signed in to change notification settings - Fork 188
/
AbstractContext.java
74 lines (59 loc) · 2.16 KB
/
AbstractContext.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
package com.evolveum.axiom.lang.impl;
import java.util.Map;
import java.util.Optional;
import com.evolveum.axiom.api.AxiomIdentifier;
import com.evolveum.axiom.api.schema.AxiomItemDefinition;
import com.evolveum.axiom.api.schema.AxiomIdentifierDefinition.Scope;
import com.evolveum.axiom.lang.api.IdentifierSpaceKey;
import com.evolveum.axiom.lang.spi.SourceLocation;
abstract class AbstractContext<P extends AbstractContext<?>> implements IdentifierSpaceHolder {
private final P parent;
private SourceLocation start;
private final IdentifierSpaceHolder localSpace;
public AbstractContext(P context, SourceLocation loc, Scope scope) {
this(context,loc, new IdentifierSpaceHolderImpl(scope));
}
public AbstractContext(P context, SourceLocation loc, IdentifierSpaceHolder space) {
parent = context;
start = loc;
localSpace = space;
}
public P parent() {
return parent;
}
protected abstract Optional<AxiomItemDefinition> childDef(AxiomIdentifier id);
protected SourceContext rootImpl() {
return parent.rootImpl();
}
public SourceLocation startLocation() {
return start;
}
@Override
public ValueContext<?> lookup(AxiomIdentifier space, IdentifierSpaceKey key) {
ValueContext<?> maybe = localSpace.lookup(space, key);
if(maybe != null) {
return maybe;
}
return parent().lookup(space, key);
}
@Override
public void register(AxiomIdentifier space, Scope scope, IdentifierSpaceKey key, ValueContext<?> context) {
switch (scope) {
case GLOBAL:
rootImpl().register(space, scope, key, context);
break;
case PARENT:
parent().register(space, Scope.LOCAL, key, context);
break;
case LOCAL:
localSpace.register(space, scope, key, context);
break;
default:
throw new IllegalStateException("Unsupported scope");
}
}
@Override
public Map<IdentifierSpaceKey, ValueContext<?>> space(AxiomIdentifier space) {
return localSpace.space(space);
}
}