Skip to content

Commit a8e83bb

Browse files
cporteleazahnen
andauthored
JSON Schema support, Parameters in CQL2-JSON (#411)
Co-authored-by: Andreas Zahnen <[email protected]>
1 parent f41dcf2 commit a8e83bb

Some content is hidden

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

44 files changed

+1560
-90
lines changed

xtraplatform-cql/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ descriptionDe = 'CQL2 Ausdrücke.'
1010
dependencies {
1111
provided project(":xtraplatform-crs")
1212
provided project(":xtraplatform-geometries")
13+
provided project(":xtraplatform-jsonschema")
1314

1415
antlr libs.antlr
1516

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlCoordinateChecker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.google.common.collect.ImmutableList;
1111
import de.ii.xtraplatform.cql.domain.Bbox;
1212
import de.ii.xtraplatform.cql.domain.CqlNode;
13+
import de.ii.xtraplatform.cql.domain.CqlVisitorBase;
1314
import de.ii.xtraplatform.cql.domain.GeometryNode;
1415
import de.ii.xtraplatform.cql.domain.PositionNode;
1516
import de.ii.xtraplatform.cql.domain.SpatialLiteral;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlImpl.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,11 @@
1616
import com.fasterxml.jackson.databind.util.StdConverter;
1717
import com.github.azahnen.dagger.annotations.AutoBind;
1818
import com.google.common.collect.ImmutableList;
19-
import de.ii.xtraplatform.cql.domain.BooleanValue2;
2019
import de.ii.xtraplatform.cql.domain.Cql;
2120
import de.ii.xtraplatform.cql.domain.Cql2Expression;
2221
import de.ii.xtraplatform.cql.domain.CqlParseException;
2322
import de.ii.xtraplatform.cql.domain.CqlToText;
24-
import de.ii.xtraplatform.cql.domain.Operation;
23+
import de.ii.xtraplatform.cql.domain.CqlVisitorExtractParameters;
2524
import de.ii.xtraplatform.cql.domain.TemporalFunction;
2625
import de.ii.xtraplatform.cql.domain.TemporalLiteral;
2726
import de.ii.xtraplatform.cql.infra.CqlTextParser;
@@ -80,16 +79,19 @@ public Cql2Expression read(String cql, Format format, EpsgCrs crs) throws CqlPar
8079
case TEXT:
8180
return cqlTextParser.parse(cql, crs);
8281
case JSON:
83-
// handle boolean value
84-
if (cql.trim().equalsIgnoreCase("true")) {
85-
return BooleanValue2.of(true);
86-
} else if (cql.trim().equalsIgnoreCase("false")) {
87-
return BooleanValue2.of(false);
88-
}
8982
cqlJsonMapper.setInjectableValues(
9083
new InjectableValues.Std().addValue("filterCrs", Optional.ofNullable(crs)));
9184
try {
92-
return cqlJsonMapper.readValue(cql, Operation.class);
85+
Cql2Expression expression = cqlJsonMapper.readValue(cql, Cql2Expression.class);
86+
87+
// parameters are a CQL2-JSON extension used in stored queries; they must not appear in
88+
// normal CQL2 expressions
89+
if (!expression.accept(new CqlVisitorExtractParameters(Map.of()), true).isEmpty()) {
90+
throw new CqlParseException(
91+
"Parameters are not allowed in CQL2 filter expressions, except in stored queries.");
92+
}
93+
94+
return expression;
9395
} catch (IOException e) {
9496
throw new CqlParseException(e.getMessage());
9597
}

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlPropertyChecker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.google.common.collect.ImmutableList;
1313
import com.google.common.collect.Lists;
1414
import de.ii.xtraplatform.cql.domain.CqlNode;
15+
import de.ii.xtraplatform.cql.domain.CqlVisitorBase;
1516
import de.ii.xtraplatform.cql.domain.Property;
1617
import java.util.ArrayList;
1718
import java.util.Collection;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlTypeAndFunctionChecker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import de.ii.xtraplatform.cql.domain.Cql;
2323
import de.ii.xtraplatform.cql.domain.Cql2Expression;
2424
import de.ii.xtraplatform.cql.domain.CqlNode;
25+
import de.ii.xtraplatform.cql.domain.CqlVisitorBase;
2526
import de.ii.xtraplatform.cql.domain.Eq;
2627
import de.ii.xtraplatform.cql.domain.Function;
2728
import de.ii.xtraplatform.cql.domain.ImmutableBetween;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlVisitorMapEnvelopes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import de.ii.xtraplatform.cql.domain.Bbox;
1111
import de.ii.xtraplatform.cql.domain.CqlNode;
12+
import de.ii.xtraplatform.cql.domain.CqlVisitorCopy;
1213
import de.ii.xtraplatform.cql.domain.GeometryNode;
1314
import de.ii.xtraplatform.cql.domain.SpatialLiteral;
1415
import de.ii.xtraplatform.crs.domain.CrsInfo;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlVisitorMapNots.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import de.ii.xtraplatform.cql.domain.And;
1111
import de.ii.xtraplatform.cql.domain.Cql2Expression;
1212
import de.ii.xtraplatform.cql.domain.CqlNode;
13+
import de.ii.xtraplatform.cql.domain.CqlVisitorCopy;
1314
import de.ii.xtraplatform.cql.domain.Eq;
1415
import de.ii.xtraplatform.cql.domain.Gt;
1516
import de.ii.xtraplatform.cql.domain.Gte;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlVisitorMapTemporalOperators.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import de.ii.xtraplatform.cql.domain.And;
1212
import de.ii.xtraplatform.cql.domain.BinaryTemporalOperation;
1313
import de.ii.xtraplatform.cql.domain.CqlNode;
14+
import de.ii.xtraplatform.cql.domain.CqlVisitorCopy;
1415
import de.ii.xtraplatform.cql.domain.Eq;
1516
import de.ii.xtraplatform.cql.domain.Function;
1617
import de.ii.xtraplatform.cql.domain.Gt;

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/app/CqlVisitorPropertyPrefix.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package de.ii.xtraplatform.cql.app;
99

1010
import de.ii.xtraplatform.cql.domain.CqlNode;
11+
import de.ii.xtraplatform.cql.domain.CqlVisitorCopy;
1112
import de.ii.xtraplatform.cql.domain.Property;
1213
import java.util.List;
1314

xtraplatform-cql/src/main/java/de/ii/xtraplatform/cql/domain/Cql2Expression.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,45 @@
77
*/
88
package de.ii.xtraplatform.cql.domain;
99

10+
import com.fasterxml.jackson.core.JsonParser;
11+
import com.fasterxml.jackson.databind.DeserializationContext;
12+
import com.fasterxml.jackson.databind.JsonMappingException;
13+
import com.fasterxml.jackson.databind.JsonNode;
14+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
15+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
16+
import java.io.IOException;
17+
18+
@JsonDeserialize(using = Cql2Expression.Cql2JsonDeserializer.class)
1019
public interface Cql2Expression extends Operand, CqlNode {
1120

21+
class Cql2JsonDeserializer extends StdDeserializer<Cql2Expression> {
22+
23+
protected Cql2JsonDeserializer() {
24+
this(null);
25+
}
26+
27+
protected Cql2JsonDeserializer(Class<?> vc) {
28+
super(vc);
29+
}
30+
31+
@Override
32+
public Cql2Expression deserialize(JsonParser parser, DeserializationContext ctxt)
33+
throws IOException, JsonMappingException {
34+
35+
JsonNode node = parser.getCodec().readTree(parser);
36+
37+
if (node.isBoolean()) {
38+
return BooleanValue2.of(node.asBoolean());
39+
}
40+
41+
try {
42+
return parser.getCodec().treeToValue(node, Operation.class);
43+
} catch (IOException e) {
44+
throw new CqlParseException(e.getMessage());
45+
}
46+
}
47+
}
48+
1249
default <T> T accept(CqlVisitor<T> visitor, boolean isRoot) {
1350
T visited = accept(visitor);
1451
return isRoot ? visitor.postProcess(this, visited) : visited;

0 commit comments

Comments
 (0)