Skip to content

Commit 209af33

Browse files
Fixed a schema generation bug causing an existing test to fail due to improper handling of JSON keys.
Added basic support for arbitrary Metapath command execution, building on #96. Metapath execution allows for evaluating expressions without a module or instance. Resolves usnistgov/metaschema-java#241.
1 parent b0341a6 commit 209af33

File tree

24 files changed

+698
-218
lines changed

24 files changed

+698
-218
lines changed

.lycheeignore

+6-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ https://github.com/hamcrest/JavaHamcrest/hamcrest-core
1616
https://github.com/javaparser/.*
1717
https://github.com/vsch/flexmark-java/.*
1818
https://hc.apache.org/httpcomponents-client-5.0.x/5.1.3/httpclient5/
19+
http://logback.qos.ch/logback-classic
20+
http://logback.qos.ch/logback-core
1921
https://logging.apache.org/log4j/2.x/log4j/.*
2022
http://mojo.codehaus.org/.*
2123
https://pmd.github.io/latest/pmd_userdocs_cpd.html
@@ -34,7 +36,8 @@ http://www.thymeleaf.org/thymeleaf-lib/thymeleaf
3436
# broken license references
3537
https://opensource.org/licenses/Apache-2.0,https://opensource.org/licenses/EPL-2.0
3638
# prone to long timeouts
37-
http://nexus.sonatype.org/oss-repository-hosting.html/.*
3839
https://glassfish.dev.java.net/.*
39-
40-
40+
http://nexus.sonatype.org/oss-repository-hosting.html/.*
41+
https://projects.eclipse.org/projects/eclipse.jdt
42+
# fix later
43+
https://github.com/metaschema-framework/liboscal-java/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.metapath.item;
7+
8+
import gov.nist.secauto.metaschema.core.metapath.ICollectionValue;
9+
import gov.nist.secauto.metaschema.core.metapath.ISequence;
10+
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
11+
import gov.nist.secauto.metaschema.core.metapath.item.function.IArrayItem;
12+
import gov.nist.secauto.metaschema.core.metapath.item.function.IMapItem;
13+
import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
14+
15+
import java.io.PrintWriter;
16+
17+
import edu.umd.cs.findbugs.annotations.NonNull;
18+
19+
/**
20+
* Produces a textual representation of a Metapath sequence.
21+
*/
22+
public class DefaultItemWriter implements IItemWriter {
23+
24+
@NonNull
25+
private final PrintWriter writer;
26+
@NonNull
27+
private final Visitor visitor = new Visitor();
28+
29+
/**
30+
* Construct a new item writer.
31+
*
32+
* @param writer
33+
* the writer to append text to
34+
*/
35+
public DefaultItemWriter(@NonNull PrintWriter writer) {
36+
this.writer = writer;
37+
}
38+
39+
@Override
40+
public void writeSequence(ISequence<?> sequence) {
41+
boolean wrap = sequence.size() != 1;
42+
if (wrap) {
43+
writer.append('(');
44+
}
45+
boolean first = true;
46+
for (IItem item : sequence) {
47+
48+
if (first) {
49+
first = false;
50+
} else {
51+
writer.append(',');
52+
}
53+
54+
item.accept(visitor);
55+
}
56+
57+
if (wrap) {
58+
writer.append(')');
59+
}
60+
}
61+
62+
@Override
63+
public void writeArray(IArrayItem<?> array) {
64+
writer.append('[');
65+
boolean first = true;
66+
for (ICollectionValue value : array) {
67+
assert value != null;
68+
69+
if (first) {
70+
first = false;
71+
} else {
72+
writer.append(',');
73+
}
74+
75+
writeCollectionValue(value);
76+
}
77+
writer.append(']');
78+
}
79+
80+
@Override
81+
public void writeMap(IMapItem<?> map) {
82+
writer.append("map {");
83+
boolean first = true;
84+
for (ICollectionValue value : map.values()) {
85+
assert value != null;
86+
87+
if (first) {
88+
first = false;
89+
} else {
90+
writer.append(',');
91+
}
92+
93+
writeCollectionValue(value);
94+
}
95+
writer.append('}');
96+
}
97+
98+
@Override
99+
public void writeNode(INodeItem node) {
100+
writer.append(node.getBaseUri().toString());
101+
writer.append('#');
102+
writer.append(node.getMetapath());
103+
}
104+
105+
@Override
106+
public void writeAtomicValue(IAnyAtomicItem node) {
107+
writer.append(node.asString());
108+
}
109+
110+
/**
111+
* Write the provided collection value.
112+
*
113+
* @param value
114+
* the value to write
115+
*/
116+
protected void writeCollectionValue(@NonNull ICollectionValue value) {
117+
if (value instanceof IItem) {
118+
((IItem) value).accept(visitor);
119+
} else if (value instanceof ISequence) {
120+
writeSequence((ISequence<?>) value);
121+
}
122+
}
123+
124+
private final class Visitor implements IItemVisitor {
125+
126+
@Override
127+
public void visit(IArrayItem<?> array) {
128+
writeArray(array);
129+
}
130+
131+
@Override
132+
public void visit(IMapItem<?> map) {
133+
writeMap(map);
134+
}
135+
136+
@Override
137+
public void visit(INodeItem node) {
138+
writeNode(node);
139+
}
140+
141+
@Override
142+
public void visit(IAnyAtomicItem node) {
143+
writeAtomicValue(node);
144+
}
145+
}
146+
}

core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/IItem.java

+10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import java.util.stream.Stream;
1313

14+
import edu.umd.cs.findbugs.annotations.NonNull;
15+
1416
public interface IItem extends ICollectionValue {
1517

1618
/**
@@ -49,4 +51,12 @@ default ISequence<?> asSequence() {
4951
default Stream<? extends IItem> flatten() {
5052
return Stream.of(this);
5153
}
54+
55+
/**
56+
* A visitor callback used to visit a variety of Metapath item types.
57+
*
58+
* @param visitor
59+
* the visitor to call back
60+
*/
61+
void accept(@NonNull IItemVisitor visitor);
5262
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.metapath.item;
7+
8+
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
9+
import gov.nist.secauto.metaschema.core.metapath.item.function.IArrayItem;
10+
import gov.nist.secauto.metaschema.core.metapath.item.function.IMapItem;
11+
import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
12+
13+
import edu.umd.cs.findbugs.annotations.NonNull;
14+
15+
public interface IItemVisitor {
16+
/**
17+
* Visit the array item instance.
18+
*
19+
* @param array
20+
* the instance to visit
21+
*/
22+
void visit(@NonNull IArrayItem<?> array);
23+
24+
/**
25+
* Visit the map item instance.
26+
*
27+
* @param map
28+
* the instance to visit
29+
*/
30+
void visit(@NonNull IMapItem<?> map);
31+
32+
/**
33+
* Visit the node item instance.
34+
*
35+
* @param node
36+
* the instance to visit
37+
*/
38+
void visit(@NonNull INodeItem node);
39+
40+
/**
41+
* Visit the atomic item instance.
42+
*
43+
* @param item
44+
* the instance to visit
45+
*/
46+
void visit(@NonNull IAnyAtomicItem item);
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* SPDX-FileCopyrightText: none
3+
* SPDX-License-Identifier: CC0-1.0
4+
*/
5+
6+
package gov.nist.secauto.metaschema.core.metapath.item;
7+
8+
import gov.nist.secauto.metaschema.core.metapath.ISequence;
9+
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
10+
import gov.nist.secauto.metaschema.core.metapath.item.function.IArrayItem;
11+
import gov.nist.secauto.metaschema.core.metapath.item.function.IMapItem;
12+
import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
13+
14+
import edu.umd.cs.findbugs.annotations.NonNull;
15+
16+
public interface IItemWriter {
17+
/**
18+
* Write the provided sequence instance.
19+
*
20+
* @param sequence
21+
* the instance to write
22+
*/
23+
void writeSequence(@NonNull ISequence<?> sequence);
24+
25+
/**
26+
* Write the provided array item instance.
27+
*
28+
* @param array
29+
* the instance to write
30+
*/
31+
void writeArray(@NonNull IArrayItem<?> array);
32+
33+
/**
34+
* Write the provided map item instance.
35+
*
36+
* @param map
37+
* the instance to write
38+
*/
39+
void writeMap(@NonNull IMapItem<?> map);
40+
41+
/**
42+
* Write the provided node item instance.
43+
*
44+
* @param node
45+
* the instance to write
46+
*/
47+
void writeNode(@NonNull INodeItem node);
48+
49+
/**
50+
* Write the provided atomic item instance.
51+
*
52+
* @param item
53+
* the instance to write
54+
*/
55+
void writeAtomicValue(@NonNull IAnyAtomicItem item);
56+
}

core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/atomic/IAnyAtomicItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
99
import gov.nist.secauto.metaschema.core.metapath.IPrintable;
10+
import gov.nist.secauto.metaschema.core.metapath.item.IItemVisitor;
1011
import gov.nist.secauto.metaschema.core.metapath.item.function.IMapItem;
1112
import gov.nist.secauto.metaschema.core.metapath.item.function.IMapKey;
1213
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
@@ -103,4 +104,9 @@ default IStringItem asStringItem() {
103104
* than, equal to, or greater than the {@code item}.
104105
*/
105106
int compareTo(@NonNull IAnyAtomicItem other);
107+
108+
@Override
109+
default void accept(IItemVisitor visitor) {
110+
visitor.visit(this);
111+
}
106112
}

core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IArrayItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import gov.nist.secauto.metaschema.core.metapath.impl.AbstractArrayItem;
1616
import gov.nist.secauto.metaschema.core.metapath.impl.ArrayItemN;
1717
import gov.nist.secauto.metaschema.core.metapath.item.IItem;
18+
import gov.nist.secauto.metaschema.core.metapath.item.IItemVisitor;
1819
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
1920

2021
import java.util.ArrayList;
@@ -570,4 +571,9 @@ static <T extends ICollectionValue> IArrayItem<T> copyOf(@NonNull Collection<? e
570571
? empty()
571572
: new ArrayItemN<>(new ArrayList<>(collection));
572573
}
574+
575+
@Override
576+
default void accept(IItemVisitor visitor) {
577+
visitor.visit(this);
578+
}
573579
}

core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/function/IMapItem.java

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import gov.nist.secauto.metaschema.core.metapath.impl.AbstractMapItem;
1717
import gov.nist.secauto.metaschema.core.metapath.impl.MapItemN;
1818
import gov.nist.secauto.metaschema.core.metapath.item.IItem;
19+
import gov.nist.secauto.metaschema.core.metapath.item.IItemVisitor;
1920
import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
2021

2122
import java.util.LinkedHashMap;
@@ -782,4 +783,9 @@ IMapItem<V> copyOf(Map<? extends IMapKey, ? extends V> map) {
782783
? empty()
783784
: new MapItemN<>(new LinkedHashMap<>(map));
784785
}
786+
787+
@Override
788+
default void accept(IItemVisitor visitor) {
789+
visitor.visit(this);
790+
}
785791
}

core/src/main/java/gov/nist/secauto/metaschema/core/metapath/item/node/AbstractFlagInstanceNodeItem.java

+2-29
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,11 @@
1111
* A {@link INodeItem} supported by a {@link IFlagInstance}.
1212
*/
1313
abstract class AbstractFlagInstanceNodeItem
14+
extends AbstractInstanceNodeItem<IFlagDefinition, IFlagInstance, IModelNodeItem<?, ?>>
1415
implements IFlagNodeItem {
15-
@NonNull
16-
private final IFlagInstance instance;
17-
@NonNull
18-
private final IModelNodeItem<?, ?> parent;
1916

2017
public AbstractFlagInstanceNodeItem(@NonNull IFlagInstance instance, @NonNull IModelNodeItem<?, ?> parent) {
21-
this.instance = instance;
22-
this.parent = parent;
23-
}
24-
25-
@Override
26-
public IFlagDefinition getDefinition() {
27-
return getInstance().getDefinition();
28-
}
29-
30-
@Override
31-
@NonNull
32-
public IFlagInstance getInstance() {
33-
return instance;
34-
}
35-
36-
@Override
37-
@NonNull
38-
public IModelNodeItem<?, ?> getParentContentNodeItem() {
39-
return getParentNodeItem();
40-
}
41-
42-
@Override
43-
@NonNull
44-
public IModelNodeItem<?, ?> getParentNodeItem() {
45-
return parent;
18+
super(instance, parent);
4619
}
4720

4821
@Override

0 commit comments

Comments
 (0)