SLING-10900 - Upgrade graphql-java and adjusted
the Selection Set and Selected Field Wrapers as well as its tests
Also upgrade com.graphql-java.java-dataloader as v 3.1.0 and 3.1.1 are not valid Maven bundles
diff --git a/pom.xml b/pom.xml
index 730e165..a20a44d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,7 +121,14 @@
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
- <version>15.0</version>
+ <version>17.4</version>
+ <scope>provided</scope>
+ </dependency>
+ <!-- The version 3.1.0, 3.1.1 are not valid Maven Bundles and so some IT tests fail -->
+ <dependency>
+ <groupId>com.graphql-java</groupId>
+ <artifactId>java-dataloader</artifactId>
+ <version>3.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
diff --git a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
index 0a0cb41..421cec4 100644
--- a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
+++ b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
@@ -304,7 +304,8 @@
private DataFetcher<Object> getDataFetcher(FieldDefinition field, Resource currentResource) {
DataFetcher<Object> result = null;
- final Directive d = field.getDirective(FETCHER_DIRECTIVE);
+// final Directive d = field.getDirective(FETCHER_DIRECTIVE);
+ final Directive d = field.getDirectives().stream().filter( i -> FETCHER_DIRECTIVE.equals(i.getName())).findFirst().orElse(null);
if (d != null) {
final String name = validateFetcherName(getDirectiveArgumentValue(d, FETCHER_NAME));
final String options = getDirectiveArgumentValue(d, FETCHER_OPTIONS);
@@ -319,7 +320,8 @@
private <T extends TypeDefinition<T>> TypeResolver getTypeResolver(TypeDefinition<T> typeDefinition, Resource currentResource) {
TypeResolver resolver = null;
- final Directive d = typeDefinition.getDirective(RESOLVER_DIRECTIVE);
+// final Directive d = typeDefinition.getDirective(RESOLVER_DIRECTIVE);
+ final Directive d = typeDefinition.getDirectives().stream().filter( i -> RESOLVER_DIRECTIVE.equals(i.getName())).findFirst().orElse(null);
if (d != null) {
final String name = validateResolverName(getDirectiveArgumentValue(d, RESOLVER_NAME));
final String options = getDirectiveArgumentValue(d, RESOLVER_OPTIONS);
@@ -406,7 +408,8 @@
private void handleConnectionTypes(ObjectTypeDefinition typeDefinition, TypeDefinitionRegistry typeRegistry) {
for (FieldDefinition fieldDefinition : typeDefinition.getFieldDefinitions()) {
- Directive directive = fieldDefinition.getDirective("connection");
+// Directive directive = fieldDefinition.getDirective("connection");
+ Directive directive = fieldDefinition.getDirectives().stream().filter( i -> "connection".equals(i.getName())).findFirst().orElse(null);
if (directive != null) {
if (directive.getArgument(CONNECTION_FOR) != null) {
String forType = ((StringValue) directive.getArgument(CONNECTION_FOR).getValue()).getValue();
diff --git a/src/main/java/org/apache/sling/graphql/core/engine/SelectedFieldWrapper.java b/src/main/java/org/apache/sling/graphql/core/engine/SelectedFieldWrapper.java
index 6ca27a3..381092c 100644
--- a/src/main/java/org/apache/sling/graphql/core/engine/SelectedFieldWrapper.java
+++ b/src/main/java/org/apache/sling/graphql/core/engine/SelectedFieldWrapper.java
@@ -22,6 +22,7 @@
import graphql.language.InlineFragment;
import graphql.language.Selection;
import graphql.language.SelectionSet;
+import graphql.schema.DataFetchingFieldSelectionSet;
import org.apache.sling.graphql.api.SelectedField;
import java.util.Arrays;
@@ -36,10 +37,15 @@
public class SelectedFieldWrapper implements SelectedField {
private String name;
+ @Deprecated
private boolean isInline;
+ private boolean conditional;
+ private List<String> objectTypeBNames;
private Map<String, SelectedField> subFieldMap = new HashMap<>();
private List<SelectedField> subFields;
+ //TODO: old 15.0 code -> remove when done with upgrade
+ @Deprecated
public SelectedFieldWrapper(Selection selection) {
SelectionSet selectionSet = null;
if (selection instanceof InlineFragment) {
@@ -62,6 +68,20 @@
subFields = subFieldMap.values().stream().collect(Collectors.toList());
}
+ public SelectedFieldWrapper(graphql.schema.SelectedField selectedField) {
+ this.name = selectedField.getName();
+ this.objectTypeBNames = selectedField.getObjectTypeNames();
+ this.conditional = selectedField.isConditional();
+ DataFetchingFieldSelectionSet selectionSet = selectedField.getSelectionSet();
+ if (selectionSet != null) {
+ selectionSet.getImmediateFields().forEach(sf -> {
+ SelectedFieldWrapper selectedChildField = new SelectedFieldWrapper(sf);
+ subFieldMap.put(selectedChildField.getName(), selectedChildField);
+ });
+ }
+ subFields = subFieldMap.values().stream().collect(Collectors.toList());
+ }
+
@Override
public String getName() {
return name;
diff --git a/src/main/java/org/apache/sling/graphql/core/engine/SelectionSetWrapper.java b/src/main/java/org/apache/sling/graphql/core/engine/SelectionSetWrapper.java
index 7db2229..a753659 100644
--- a/src/main/java/org/apache/sling/graphql/core/engine/SelectionSetWrapper.java
+++ b/src/main/java/org/apache/sling/graphql/core/engine/SelectionSetWrapper.java
@@ -41,11 +41,22 @@
public SelectionSetWrapper(@Nullable DataFetchingFieldSelectionSet selectionSet) {
if (selectionSet != null) {
- selectionSet.get().getSubFields().forEach((k, v) -> {
- SelectedFieldWrapper selectedField = new SelectedFieldWrapper(v.getSingleField());
- fieldsMap.put(k, selectedField);
- if (!k.contains("/")) {
- fields.add(selectedField);
+// TODO: old 15.0 version code -> remove it when done with the upgrade
+// selectionSet.get().getSubFields().forEach((k, v) -> {
+// SelectedFieldWrapper selectedField = new SelectedFieldWrapper(v.getSingleField());
+// fieldsMap.put(k, selectedField);
+// if (!k.contains("/")) {
+// fields.add(selectedField);
+// }
+// });
+ selectionSet.getImmediateFields().forEach(sf -> {
+ String name = sf.getName();
+ SelectedFieldWrapper selectedField = new SelectedFieldWrapper(sf);
+ if (!fieldsMap.containsKey(name)) {
+ fieldsMap.put(name, selectedField);
+ if (!name.contains("/")) {
+ fields.add(selectedField);
+ }
}
});
initFlatMap(fields, "");
diff --git a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
index 136c73b..dd8aeca 100644
--- a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
+++ b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
@@ -75,14 +75,16 @@
}
private void assertQuerySyntaxError(String ... selectors) {
- final String invalidQuery = "INVALID " + UUID.randomUUID();
+// final String invalidQuery = "INVALID " + UUID.randomUUID();
+ final String invalidQuery = "INVALID " + "4ecae67c-13c5-432e-b36c-7a29d35118c1";
queryJSON(invalidQuery, selectors);
capture.assertContains(
Level.ERROR,
"Query failed for Resource " + resource.getPath(),
"query=" + invalidQuery,
"Errors:Error: type=InvalidSyntax",
- "message=Invalid Syntax : offending token 'INVALID' at line 1 column 1",
+// "message=Invalid Syntax : offending token 'INVALID' at line 1 column 1",
+ "message=Invalid Syntax : token recognition error at: '4ec' at line 1 column 9",
String.format("selectors=%s", Arrays.toString(selectors))
);
}
diff --git a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
index 19f9765..07c5418 100644
--- a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
+++ b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
@@ -251,7 +251,7 @@
};
final List<SelectedField> selectionSetFields = selectionSet.getFields();
for (String expectedFieldname : expectedFieldNames) {
- assertTrue(selectionSetFields.stream().anyMatch(f -> expectedFieldname.equals(f.getName())));
+ assertTrue("Failed to find expected field name: '" + expectedFieldname + "'", selectionSetFields.stream().anyMatch(f -> expectedFieldname.equals(f.getName())));
}
// Assert it contains the expected results
@@ -267,57 +267,63 @@
"allTests/boolValue",
"allTests/resourcePath",
"unionTest",
- "unionTest/Human",
- "unionTest/Human/id",
- "unionTest/Human/address",
- "unionTest/Droid",
- "unionTest/Droid/id",
- "unionTest/Droid/primaryFunction",
+// "unionTest/Human",
+// "unionTest/Human/id",
+ "unionTest/id",
+// "unionTest/Human/address",
+ "unionTest/address",
+// "unionTest/Droid",
+// "unionTest/Droid/id",
+// "unionTest/Droid/primaryFunction",
+ "unionTest/primaryFunction",
"interfaceTest",
"interfaceTest/id",
- "interfaceTest/Human",
- "interfaceTest/Human/address",
- "interfaceTest/Droid",
- "interfaceTest/Droid/primaryFunction"
+// "interfaceTest/Human",
+// "interfaceTest/Human/address",
+ "interfaceTest/address",
+// "interfaceTest/Droid",
+ "interfaceTest/primaryFunction"
+// "interfaceTest/Droid/primaryFunction"
};
for (String expectedQN : expectedQualifiedName) {
- assertTrue(selectionSet.contains(expectedQN));
+ assertTrue("Failed to find qualified field name: '" + expectedQN + "'", selectionSet.contains(expectedQN));
}
- String[] expectedNonInlineQNs = new String[] {
- "boolValue",
- "resourcePath",
- "aTest",
- "aTest/test",
- "aTest/boolValue",
- "aTest/resourcePath",
- "allTests",
- "allTests/test",
- "allTests/boolValue",
- "allTests/resourcePath",
- "unionTest",
- "unionTest/Human/id",
- "unionTest/Human/address",
- "unionTest/Droid/id",
- "unionTest/Droid/primaryFunction",
- "interfaceTest",
- "interfaceTest/id",
- "interfaceTest/Human/address",
- "interfaceTest/Droid/primaryFunction"
- };
- for (String expectedNonInlineQN : expectedNonInlineQNs) {
- assertFalse(Objects.requireNonNull(selectionSet.get(expectedNonInlineQN)).isInline());
- }
-
- String[] expectedInlineQNs = new String[] {
- "unionTest/Human",
- "unionTest/Droid",
- "interfaceTest/Human",
- "interfaceTest/Droid"
- };
- for (String expectedInlineQN : expectedInlineQNs) {
- assertTrue(Objects.requireNonNull(selectionSet.get(expectedInlineQN)).isInline());
- }
+//TODO: No more inline fragments in 17.4 -> remove when done upgrading
+// String[] expectedNonInlineQNs = new String[] {
+// "boolValue",
+// "resourcePath",
+// "aTest",
+// "aTest/test",
+// "aTest/boolValue",
+// "aTest/resourcePath",
+// "allTests",
+// "allTests/test",
+// "allTests/boolValue",
+// "allTests/resourcePath",
+// "unionTest",
+// "unionTest/Human/id",
+// "unionTest/Human/address",
+// "unionTest/Droid/id",
+// "unionTest/Droid/primaryFunction",
+// "interfaceTest",
+// "interfaceTest/id",
+// "interfaceTest/Human/address",
+// "interfaceTest/Droid/primaryFunction"
+// };
+// for (String expectedNonInlineQN : expectedNonInlineQNs) {
+// assertFalse(Objects.requireNonNull(selectionSet.get(expectedNonInlineQN)).isInline());
+// }
+//
+// String[] expectedInlineQNs = new String[] {
+// "unionTest/Human",
+// "unionTest/Droid",
+// "interfaceTest/Human",
+// "interfaceTest/Droid"
+// };
+// for (String expectedInlineQN : expectedInlineQNs) {
+// assertTrue(Objects.requireNonNull(selectionSet.get(expectedInlineQN)).isInline());
+// }
String[] expectedSubFieldNames = new String[] {
"test",
@@ -333,6 +339,7 @@
}
}
+
@Test
public void testCachedTypeRegistry() throws IOException {
// by default we'll get the test-schema