Skip to content

Commit 0a77e21

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 0240df0 commit 0a77e21

File tree

24 files changed

+624
-218
lines changed

24 files changed

+624
-218
lines changed

.lycheeignore

+7-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
@@ -27,13 +29,15 @@ https://www.antlr.org/antlr4-runtime/
2729
http://www.eclipse.org/eclipselink/moxy/org.eclipse.persistence.moxy
2830
http://www.eclipse.org/sisu/org.eclipse.sisu.plexus/
2931
http://www.eclipse.org/sisu/org.eclipse.sisu.inject/
32+
http://www.jdom.org/
3033
http://www.mojohaus.org/appassembler-maven-plugin/appassembler/appassembler-maven-plugin
3134
http://www.seamframework.org/Weld/cdi-api
3235
http://www.thymeleaf.org/thymeleaf-lib/thymeleaf
3336
# broken license references
3437
https://opensource.org/licenses/Apache-2.0,https://opensource.org/licenses/EPL-2.0
3538
# prone to long timeouts
36-
http://nexus.sonatype.org/oss-repository-hosting.html/.*
3739
https://glassfish.dev.java.net/.*
38-
39-
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,131 @@
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+
public class DefaultItemWriter implements IItemWriter {
20+
21+
@NonNull
22+
private final PrintWriter writer;
23+
@NonNull
24+
private final Visitor visitor = new Visitor();
25+
26+
public DefaultItemWriter(@NonNull PrintWriter writer) {
27+
this.writer = writer;
28+
}
29+
30+
@Override
31+
public void writeSequence(ISequence<?> sequence) {
32+
boolean wrap = sequence.size() != 1;
33+
if (wrap) {
34+
writer.append('(');
35+
}
36+
boolean first = true;
37+
for (IItem item : sequence) {
38+
39+
if (first) {
40+
first = false;
41+
} else {
42+
writer.append(',');
43+
}
44+
45+
item.accept(visitor);
46+
}
47+
48+
if (wrap) {
49+
writer.append(')');
50+
}
51+
}
52+
53+
@Override
54+
public void writeArray(IArrayItem<?> array) {
55+
writer.append('[');
56+
boolean first = true;
57+
for (ICollectionValue value : array) {
58+
assert value != null;
59+
60+
if (first) {
61+
first = false;
62+
} else {
63+
writer.append(',');
64+
}
65+
66+
writeCollectionValue(value);
67+
}
68+
writer.append(']');
69+
}
70+
71+
@Override
72+
public void writeMap(IMapItem<?> map) {
73+
writer.append("map {");
74+
boolean first = true;
75+
for (ICollectionValue value : map.values()) {
76+
assert value != null;
77+
78+
if (first) {
79+
first = false;
80+
} else {
81+
writer.append(',');
82+
}
83+
84+
writeCollectionValue(value);
85+
}
86+
writer.append('}');
87+
}
88+
89+
@Override
90+
public void writeNode(INodeItem node) {
91+
writer.append(node.getBaseUri().toString());
92+
writer.append('#');
93+
writer.append(node.getMetapath());
94+
}
95+
96+
@Override
97+
public void writeAtomicValue(IAnyAtomicItem node) {
98+
writer.append(node.asString());
99+
}
100+
101+
protected void writeCollectionValue(@NonNull ICollectionValue value) {
102+
if (value instanceof IItem) {
103+
((IItem) value).accept(visitor);
104+
} else if (value instanceof ISequence) {
105+
writeSequence((ISequence<?>) value);
106+
}
107+
}
108+
109+
private final class Visitor implements IItemVisitor {
110+
111+
@Override
112+
public void visit(IArrayItem<?> array) {
113+
writeArray(array);
114+
}
115+
116+
@Override
117+
public void visit(IMapItem<?> map) {
118+
writeMap(map);
119+
}
120+
121+
@Override
122+
public void visit(INodeItem node) {
123+
writeNode(node);
124+
}
125+
126+
@Override
127+
public void visit(IAnyAtomicItem node) {
128+
writeAtomicValue(node);
129+
}
130+
}
131+
}

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

+4
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,6 @@ default ISequence<?> asSequence() {
4951
default Stream<? extends IItem> flatten() {
5052
return Stream.of(this);
5153
}
54+
55+
void accept(@NonNull IItemVisitor visitor);
5256
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
void visit(@NonNull IArrayItem<?> array);
17+
18+
void visit(@NonNull IMapItem<?> map);
19+
20+
void visit(@NonNull INodeItem node);
21+
22+
void visit(@NonNull IAnyAtomicItem node);
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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+
void writeSequence(@NonNull ISequence<?> sequence);
18+
19+
void writeArray(@NonNull IArrayItem<?> array);
20+
21+
void writeMap(@NonNull IMapItem<?> map);
22+
23+
void writeNode(@NonNull INodeItem node);
24+
25+
void writeAtomicValue(@NonNull IAnyAtomicItem node);
26+
}

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

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

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import gov.nist.secauto.metaschema.core.metapath.format.IPathFormatter;
66
import gov.nist.secauto.metaschema.core.metapath.format.IPathSegment;
77
import gov.nist.secauto.metaschema.core.metapath.item.IItem;
8+
import gov.nist.secauto.metaschema.core.metapath.item.IItemVisitor;
89
import gov.nist.secauto.metaschema.core.model.IResourceLocation;
910
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
1011

@@ -285,4 +286,9 @@ default Stream<? extends IFlagNodeItem> flags() {
285286
*/
286287
@NonNull
287288
StaticContext getStaticContext();
289+
290+
@Override
291+
default void accept(IItemVisitor visitor) {
292+
visitor.visit(this);
293+
}
288294
}

databind/src/test/resources/metaschema/fields_with_flags/example.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
}
2222
],
2323
"complex-fields4": {
24-
"complex-field4-1": {"STRVALUE": "test-string5"},
25-
"complex-field4-2": {"STRVALUE": "test-string6"}
24+
"complex-field4-1": "test-string5",
25+
"complex-field4-2": "test-string6"
2626
}
2727
}
2828
}

metaschema-cli/pom.xml

+11
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@
6363
<groupId>org.apache.logging.log4j</groupId>
6464
<artifactId>log4j-api</artifactId>
6565
</dependency>
66+
67+
<dependency>
68+
<groupId>io.github.hakky54</groupId>
69+
<artifactId>logcaptor</artifactId>
70+
<scope>test</scope>
71+
</dependency>
72+
<dependency>
73+
<groupId>org.assertj</groupId>
74+
<artifactId>assertj-core</artifactId>
75+
<scope>test</scope>
76+
</dependency>
6677
</dependencies>
6778

6879
<build>

metaschema-cli/src/main/java/gov/nist/secauto/metaschema/cli/commands/AbstractValidateContentCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public abstract class AbstractValidateContentCommand
8080
private static final Option CONSTRAINTS_OPTION = ObjectUtils.notNull(
8181
Option.builder("c")
8282
.hasArgs()
83-
.argName("URI")
83+
.argName("URL")
8484
.desc("additional constraint definitions")
8585
.build());
8686
@NonNull

0 commit comments

Comments
 (0)