Skip to content

Commit 28e6ebd

Browse files
Reworked how Metapath expressions are compiled to ensure the static context from their source is used in compilation.
Also improved node item, definition, and instance creation for easier use in unit tests.
1 parent 6a9f9d1 commit 28e6ebd

File tree

81 files changed

+993
-580
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+993
-580
lines changed

core/src/main/antlr4/Metapath10.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ parenthesizeditemtype : OP itemtype CP ;
148148

149149

150150
// Error in the spec. EQName also includes acceptable keywords.
151-
eqname : NCName | QName | URIQualifiedName
151+
eqname : URIQualifiedName | NCName | QName
152152
| KW_ANCESTOR
153153
| KW_ANCESTOR_OR_SELF
154154
| KW_AND

core/src/main/antlr4/Metapath10Lexer.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ DecimalLiteral : '.' FragDigits | FragDigits '.' [0-9]*;
117117
DoubleLiteral : ('.' FragDigits | FragDigits ('.' [0-9]*)?) [eE] [+-]? FragDigits;
118118
StringLiteral : '"' (~["] | FragEscapeQuot)* '"' | '\'' (~['] | FragEscapeApos)* '\'';
119119
URIQualifiedName : BracedURILiteral NCName;
120-
BracedURILiteral : 'Q' '{' [^{}]* '}';
120+
BracedURILiteral : 'Q' '{' ~[{}]* '}';
121121
// Error in spec: EscapeQuot and EscapeApos are not terminals!
122122
fragment FragEscapeQuot : '""';
123123
fragment FragEscapeApos : '\'\'';

core/src/main/java/gov/nist/secauto/metaschema/core/mdm/IDMAssemblyNodeItem.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
package gov.nist.secauto.metaschema.core.mdm;
77

8+
import gov.nist.secauto.metaschema.core.mdm.impl.DefinitionAssemblyNodeItem;
89
import gov.nist.secauto.metaschema.core.mdm.impl.IDMModelNodeItem;
10+
import gov.nist.secauto.metaschema.core.metapath.StaticContext;
911
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
1012
import gov.nist.secauto.metaschema.core.metapath.item.node.IAssemblyNodeItem;
1113
import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
1214
import gov.nist.secauto.metaschema.core.model.IAssemblyInstance;
1315
import gov.nist.secauto.metaschema.core.model.IFieldInstance;
14-
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
1516

1617
import edu.umd.cs.findbugs.annotations.NonNull;
1718

@@ -21,36 +22,44 @@
2122
*/
2223
public interface IDMAssemblyNodeItem
2324
extends IAssemblyNodeItem, IDMModelNodeItem<IAssemblyDefinition, IAssemblyInstance> {
25+
/**
26+
* Create new assembly node item that is detached from a parent node item.
27+
*
28+
* @param definition
29+
* the Metaschema field definition describing the assembly
30+
* @param staticContext
31+
* the atomic field value
32+
* @return the new field node item
33+
*/
34+
@NonNull
35+
static IDMAssemblyNodeItem newInstance(
36+
@NonNull IAssemblyDefinition definition,
37+
@NonNull StaticContext staticContext) {
38+
return new DefinitionAssemblyNodeItem(definition, staticContext);
39+
}
40+
2441
/**
2542
* Create and add a new field to the underlying data model.
2643
*
2744
* @param instance
2845
* the Metaschema field instance describing the field
29-
* @param resourceLocation
30-
* information about the location of the field within the containing
31-
* resource
3246
* @param value
3347
* the atomic field value
3448
* @return the new field node item
3549
*/
3650
@NonNull
3751
IDMFieldNodeItem newField(
3852
@NonNull IFieldInstance instance,
39-
@NonNull IResourceLocation resourceLocation,
4053
@NonNull IAnyAtomicItem value);
4154

4255
/**
4356
* Create and add a new assembly to the underlying data model.
4457
*
4558
* @param instance
4659
* the Metaschema assembly instance describing the assembly
47-
* @param resourceLocation
48-
* information about the location of the assembly within the containing
49-
* resource
5060
* @return the new assembly node item
5161
*/
5262
@NonNull
5363
IDMAssemblyNodeItem newAssembly(
54-
@NonNull IAssemblyInstance instance,
55-
@NonNull IResourceLocation resourceLocation);
64+
@NonNull IAssemblyInstance instance);
5665
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.mdm;
7+
8+
import gov.nist.secauto.metaschema.core.metapath.item.node.IDefinitionNodeItem;
9+
import gov.nist.secauto.metaschema.core.model.IDefinition;
10+
import gov.nist.secauto.metaschema.core.model.INamedInstance;
11+
12+
public interface IDMDefinitionNodeItem<D extends IDefinition, I extends INamedInstance>
13+
extends IDMNodeItem, IDefinitionNodeItem<D, I> {
14+
15+
}

core/src/main/java/gov/nist/secauto/metaschema/core/mdm/IDMDocumentNodeItem.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import gov.nist.secauto.metaschema.core.mdm.impl.DocumentImpl;
99
import gov.nist.secauto.metaschema.core.metapath.item.node.IDocumentNodeItem;
1010
import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
11-
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
1211

1312
import java.net.URI;
1413

@@ -28,21 +27,14 @@ public interface IDMDocumentNodeItem
2827
*
2928
* @param resource
3029
* the base URI of the document resource
31-
* @param resourceLocation
32-
* information about the (intended) location of the document resource
3330
* @param rootAssembly
3431
* the assembly that is at the root of the node tree for this document
35-
* @param rootAssemblyLocation
36-
* information about the (intended) location of the root assembly
37-
* resource
3832
* @return the document node item
3933
*/
4034
@NonNull
4135
static IDMDocumentNodeItem newInstance(
4236
@NonNull URI resource,
43-
@NonNull IResourceLocation resourceLocation,
44-
@NonNull IAssemblyDefinition rootAssembly,
45-
@NonNull IResourceLocation rootAssemblyLocation) {
46-
return new DocumentImpl(resource, resourceLocation, rootAssembly, rootAssemblyLocation);
37+
@NonNull IAssemblyDefinition rootAssembly) {
38+
return new DocumentImpl(resource, rootAssembly);
4739
}
4840
}

core/src/main/java/gov/nist/secauto/metaschema/core/mdm/IDMFieldNodeItem.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,40 @@
55

66
package gov.nist.secauto.metaschema.core.mdm;
77

8+
import gov.nist.secauto.metaschema.core.mdm.impl.DefinitionFieldNodeItem;
9+
import gov.nist.secauto.metaschema.core.mdm.impl.IDMAtomicValuedNodeItem;
810
import gov.nist.secauto.metaschema.core.mdm.impl.IDMModelNodeItem;
11+
import gov.nist.secauto.metaschema.core.metapath.StaticContext;
12+
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
913
import gov.nist.secauto.metaschema.core.metapath.item.node.IFieldNodeItem;
1014
import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
1115
import gov.nist.secauto.metaschema.core.model.IFieldInstance;
1216

17+
import edu.umd.cs.findbugs.annotations.NonNull;
18+
1319
/**
1420
* A field node item implementation that is backed by a simple Metaschema
1521
* module-based data model.
1622
*/
1723
public interface IDMFieldNodeItem
18-
extends IFieldNodeItem, IDMModelNodeItem<IFieldDefinition, IFieldInstance> {
19-
// no additional methods
24+
extends IFieldNodeItem, IDMModelNodeItem<IFieldDefinition, IFieldInstance>, IDMAtomicValuedNodeItem {
25+
/**
26+
* Create new field node item that is detached from a parent node item.
27+
*
28+
* @param definition
29+
* the Metaschema field definition describing the field
30+
* @param value
31+
* the field's initial value
32+
* @param staticContext
33+
* the atomic field value
34+
* @return the new field node item
35+
*/
36+
@NonNull
37+
static IDMFieldNodeItem newInstance(
38+
@NonNull IFieldDefinition definition,
39+
@NonNull IAnyAtomicItem value,
40+
@NonNull StaticContext staticContext) {
41+
return new DefinitionFieldNodeItem(definition, value, staticContext);
42+
}
43+
2044
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.mdm;
7+
8+
import gov.nist.secauto.metaschema.core.mdm.impl.IDMAtomicValuedNodeItem;
9+
import gov.nist.secauto.metaschema.core.metapath.item.node.IFlagNodeItem;
10+
11+
public interface IDMFlagNodeItem extends IFlagNodeItem, IDMNodeItem, IDMAtomicValuedNodeItem {
12+
// no additional methods
13+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.mdm;
7+
8+
import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
9+
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
10+
11+
import edu.umd.cs.findbugs.annotations.NonNull;
12+
13+
public interface IDMNodeItem extends INodeItem {
14+
/**
15+
*
16+
* @param location
17+
* information about the location of the node within the containing
18+
* resource
19+
*/
20+
void setLocation(@NonNull IResourceLocation location);
21+
}

core/src/main/java/gov/nist/secauto/metaschema/core/mdm/impl/AbstractDMAssemblyNodeItem.java

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88
import gov.nist.secauto.metaschema.core.mdm.IDMAssemblyNodeItem;
99
import gov.nist.secauto.metaschema.core.mdm.IDMFieldNodeItem;
1010
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
11-
import gov.nist.secauto.metaschema.core.metapath.item.node.AbstractNodeItem;
12-
import gov.nist.secauto.metaschema.core.metapath.item.node.IFlagNodeItem;
11+
import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
1312
import gov.nist.secauto.metaschema.core.model.IAssemblyInstance;
1413
import gov.nist.secauto.metaschema.core.model.IFieldInstance;
15-
import gov.nist.secauto.metaschema.core.model.IFlagInstance;
16-
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
1714
import gov.nist.secauto.metaschema.core.qname.IEnhancedQName;
1815
import gov.nist.secauto.metaschema.core.util.CollectionUtil;
1916
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
@@ -28,21 +25,14 @@
2825
import edu.umd.cs.findbugs.annotations.NonNull;
2926

3027
public abstract class AbstractDMAssemblyNodeItem
31-
extends AbstractNodeItem
28+
extends AbstractDMModelNodeItem<IAssemblyDefinition, IAssemblyInstance>
3229
implements IDMAssemblyNodeItem {
3330
@NonNull
34-
private final Map<IEnhancedQName, IFlagNodeItem> flags = new ConcurrentHashMap<>();
35-
@NonNull
3631
private final Map<IEnhancedQName, List<IDMModelNodeItem<?, ?>>> modelItems
3732
= new ConcurrentHashMap<>();
3833

3934
protected AbstractDMAssemblyNodeItem() {
40-
// nothing to do
41-
}
42-
43-
@Override
44-
public Object getValue() {
45-
return this;
35+
// only allow extending classes to create instances
4636
}
4737

4838
@Override
@@ -55,26 +45,6 @@ protected String getValueSignature() {
5545
return "";
5646
}
5747

58-
@Override
59-
public Collection<? extends IFlagNodeItem> getFlags() {
60-
return ObjectUtils.notNull(flags.values());
61-
}
62-
63-
@Override
64-
public IFlagNodeItem getFlagByName(IEnhancedQName name) {
65-
return flags.get(name);
66-
}
67-
68-
@Override
69-
public IFlagNodeItem newFlag(
70-
@NonNull IFlagInstance instance,
71-
@NonNull IResourceLocation resourceLocation,
72-
@NonNull IAnyAtomicItem value) {
73-
IFlagNodeItem flag = new FlagImpl(instance, this, resourceLocation, value);
74-
flags.put(instance.getQName(), flag);
75-
return flag;
76-
}
77-
7848
@Override
7949
public Collection<List<IDMModelNodeItem<?, ?>>> getModelItems() {
8050
return ObjectUtils.notNull(modelItems.values());
@@ -87,21 +57,21 @@ public IFlagNodeItem newFlag(
8757
}
8858

8959
@Override
90-
public IDMFieldNodeItem newField(IFieldInstance instance, IResourceLocation resourceLocation, IAnyAtomicItem value) {
60+
public IDMFieldNodeItem newField(IFieldInstance instance, IAnyAtomicItem value) {
9161
List<IDMModelNodeItem<?, ?>> result = modelItems.computeIfAbsent(
9262
instance.getQName(),
9363
name -> Collections.synchronizedList(new LinkedList<IDMModelNodeItem<?, ?>>()));
94-
IDMFieldNodeItem field = new FieldImpl(instance, this, resourceLocation, value);
64+
IDMFieldNodeItem field = new ChildFieldNodeItem(instance, this, value);
9565
result.add(field);
9666
return field;
9767
}
9868

9969
@Override
100-
public IDMAssemblyNodeItem newAssembly(IAssemblyInstance instance, IResourceLocation resourceLocation) {
70+
public IDMAssemblyNodeItem newAssembly(IAssemblyInstance instance) {
10171
List<IDMModelNodeItem<?, ?>> result = modelItems.computeIfAbsent(
10272
instance.getQName(),
10373
name -> Collections.synchronizedList(new LinkedList<IDMModelNodeItem<?, ?>>()));
104-
IDMAssemblyNodeItem assembly = new AssemblyImpl(instance, this, resourceLocation);
74+
IDMAssemblyNodeItem assembly = new ChildAssemblyNodeItem(instance, this);
10575
result.add(assembly);
10676
return assembly;
10777
}

core/src/main/java/gov/nist/secauto/metaschema/core/mdm/impl/FieldImpl.java renamed to core/src/main/java/gov/nist/secauto/metaschema/core/mdm/impl/AbstractDMFieldNodeItem.java

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,24 @@
77

88
import gov.nist.secauto.metaschema.core.mdm.IDMFieldNodeItem;
99
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
10-
import gov.nist.secauto.metaschema.core.metapath.item.node.IAssemblyNodeItem;
11-
import gov.nist.secauto.metaschema.core.metapath.item.node.IFlagNodeItem;
1210
import gov.nist.secauto.metaschema.core.metapath.item.node.IModelNodeItem;
1311
import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
1412
import gov.nist.secauto.metaschema.core.model.IFieldInstance;
15-
import gov.nist.secauto.metaschema.core.model.IFlagInstance;
16-
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
1713
import gov.nist.secauto.metaschema.core.qname.IEnhancedQName;
1814
import gov.nist.secauto.metaschema.core.util.CollectionUtil;
19-
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
2015

2116
import java.util.Collection;
2217
import java.util.List;
23-
import java.util.Map;
24-
import java.util.concurrent.ConcurrentHashMap;
2518

2619
import edu.umd.cs.findbugs.annotations.NonNull;
2720

28-
public class FieldImpl
29-
extends AbstractDMInstanceNodeItem<IFieldDefinition, IFieldInstance, IAssemblyNodeItem>
21+
public abstract class AbstractDMFieldNodeItem
22+
extends AbstractDMModelNodeItem<IFieldDefinition, IFieldInstance>
3023
implements IDMFieldNodeItem {
3124
@NonNull
3225
private IAnyAtomicItem value;
33-
@NonNull
34-
private final Map<IEnhancedQName, IFlagNodeItem> flags = new ConcurrentHashMap<>();
3526

36-
public FieldImpl(
37-
@NonNull IFieldInstance instance,
38-
@NonNull IAssemblyNodeItem parent,
39-
@NonNull IResourceLocation resourceLocation,
40-
@NonNull IAnyAtomicItem value) {
41-
super(instance, parent, resourceLocation);
27+
protected AbstractDMFieldNodeItem(@NonNull IAnyAtomicItem value) {
4228
this.value = value;
4329
}
4430

@@ -55,11 +41,6 @@ public void setValue(@NonNull Object value) {
5541
this.value = getValueItemType().newItem(value);
5642
}
5743

58-
@Override
59-
public Object getValue() {
60-
return toAtomicItem().getValue();
61-
}
62-
6344
@Override
6445
public String stringValue() {
6546
return toAtomicItem().asString();
@@ -70,21 +51,6 @@ protected String getValueSignature() {
7051
return toAtomicItem().toSignature();
7152
}
7253

73-
@Override
74-
public int getPosition() {
75-
return getParentNodeItem().getModelItemsByName(getQName()).indexOf(this);
76-
}
77-
78-
@Override
79-
public Collection<? extends IFlagNodeItem> getFlags() {
80-
return ObjectUtils.notNull(flags.values());
81-
}
82-
83-
@Override
84-
public IFlagNodeItem getFlagByName(IEnhancedQName name) {
85-
return flags.get(name);
86-
}
87-
8854
@Override
8955
public Collection<? extends List<? extends IModelNodeItem<?, ?>>> getModelItems() {
9056
// no model items
@@ -97,13 +63,4 @@ public IFlagNodeItem getFlagByName(IEnhancedQName name) {
9763
return CollectionUtil.emptyList();
9864
}
9965

100-
@Override
101-
public IFlagNodeItem newFlag(
102-
@NonNull IFlagInstance instance,
103-
@NonNull IResourceLocation resourceLocation,
104-
@NonNull IAnyAtomicItem value) {
105-
IFlagNodeItem flag = new FlagImpl(instance, this, resourceLocation, value);
106-
flags.put(instance.getQName(), flag);
107-
return flag;
108-
}
10966
}

0 commit comments

Comments
 (0)