From 33bff5c9d7982f6fd049aed9fe054d9b9d4a3595 Mon Sep 17 00:00:00 2001 From: Kocsis Tibor Date: Tue, 15 Aug 2017 13:50:21 +0200 Subject: [PATCH] change supported graphql-java library to 3.0.0 --- .gitignore | 4 + build.gradle | 2 +- .../graphql/execution/RxExecutionResult.java | 32 +++++-- .../execution/RxExecutionStrategy.java | 83 +++++++++++-------- src/test/groovy/graphql/HelloWorld.java | 16 +++- 5 files changed, 93 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index 0fb3f4a..6a8fa82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,11 @@ .idea .gradle build +.classpath +.settings +.project graphql-rxjava.iml .DS_Store +/bin/ diff --git a/build.gradle b/build.gradle index 99b0bed..7beb946 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ jar { dependencies { compile 'org.antlr:antlr4-runtime:4.5.1' compile 'org.slf4j:slf4j-api:1.7.12' - compile 'com.graphql-java:graphql-java:2015-11-04T21-08-13' + compile 'com.graphql-java:graphql-java:3.0.0' compile 'io.reactivex:rxjava:1.0.12' compile 'org.apache.commons:commons-lang3:3.1' diff --git a/src/main/java/graphql/execution/RxExecutionResult.java b/src/main/java/graphql/execution/RxExecutionResult.java index 75f1e2b..779e058 100644 --- a/src/main/java/graphql/execution/RxExecutionResult.java +++ b/src/main/java/graphql/execution/RxExecutionResult.java @@ -1,13 +1,15 @@ package graphql.execution; -import graphql.ExecutionResult; -import graphql.GraphQLError; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import rx.Observable; -import java.util.List; -import java.util.Map; +import graphql.ExecutionResult; +import graphql.GraphQLError; +import rx.Observable; public class RxExecutionResult implements ExecutionResult { @@ -16,10 +18,17 @@ public class RxExecutionResult implements ExecutionResult { private Observable dataObservable; private Observable> errorsObservable; + + private Observable> extensionsObservable; public RxExecutionResult(Observable data, Observable> errors) { + this(data, errors, Observable.just(new HashMap<>())); + } + + public RxExecutionResult(Observable data, Observable> errors, Observable> extensions) { dataObservable = data; errorsObservable = errors; + extensionsObservable = extensions; } public Observable getDataObservable() { @@ -29,8 +38,13 @@ public Observable getDataObservable() { public Observable> getErrorsObservable() { return errorsObservable; } + + public Observable> getExtensionsObservable() { + return extensionsObservable; + } - @Override + @SuppressWarnings("unchecked") + @Override public Object getData() { logger.warn("getData() called instead of getDataObservable(), blocking (likely a bug)"); return dataObservable.toBlocking().first(); @@ -41,4 +55,10 @@ public List getErrors() { logger.warn("getErrors() called instead of getErrorsObservable(), blocking (likely a bug)"); return errorsObservable.toBlocking().first(); } + + @Override + public Map getExtensions() { + logger.warn("getExtensions() called instead of getExtensionsObservable(), blocking (likely a bug)"); + return extensionsObservable.toBlocking().first(); + } } diff --git a/src/main/java/graphql/execution/RxExecutionStrategy.java b/src/main/java/graphql/execution/RxExecutionStrategy.java index c5108d3..ed24ca7 100644 --- a/src/main/java/graphql/execution/RxExecutionStrategy.java +++ b/src/main/java/graphql/execution/RxExecutionStrategy.java @@ -1,38 +1,32 @@ package graphql.execution; -import graphql.ExecutionResult; -import graphql.GraphQLException; -import graphql.execution.ExecutionContext; -import graphql.execution.ExecutionStrategy; -import graphql.language.Field; -import graphql.schema.GraphQLList; -import graphql.schema.GraphQLObjectType; -import graphql.schema.GraphQLType; -import org.apache.commons.lang3.tuple.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import rx.Observable; - import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import java.util.stream.IntStream; +import java.util.stream.StreamSupport; +import org.apache.commons.lang3.tuple.Pair; -public class RxExecutionStrategy extends ExecutionStrategy { +import graphql.ExecutionResult; +import graphql.language.Field; +import graphql.schema.GraphQLList; +import rx.Observable; - private final static Logger logger = LoggerFactory.getLogger(RxExecutionStrategy.class); +public class RxExecutionStrategy extends ExecutionStrategy { @Override - public ExecutionResult execute(ExecutionContext executionContext, GraphQLObjectType parentType, Object source, Map> fields) { - - List>> observables = new ArrayList<>(); + public ExecutionResult execute(ExecutionContext executionContext, ExecutionParameters parameters) + throws NonNullableFieldWasNullException + { + List>> observables = new ArrayList<>(); + Map> fields = parameters.fields(); for (String fieldName : fields.keySet()) { final List fieldList = fields.get(fieldName); - ExecutionResult executionResult = resolveField(executionContext, parentType, source, fieldList); + ExecutionResult executionResult = resolveField(executionContext, parameters, fieldList); if (executionResult instanceof RxExecutionResult) { RxExecutionResult rxResult = (RxExecutionResult)executionResult; @@ -60,26 +54,47 @@ public ExecutionResult execute(ExecutionContext executionContext, GraphQLObjectT return new RxExecutionResult(result, Observable.just(executionContext.getErrors())); } - + @Override - protected ExecutionResult completeValue(ExecutionContext executionContext, GraphQLType fieldType, List fields, Object result) { - if (result instanceof Observable) { - return new RxExecutionResult(((Observable) result).map(r -> super.completeValue(executionContext, fieldType, fields, r)), null); + protected ExecutionResult completeValue(ExecutionContext executionContext, ExecutionParameters parameters, + List fields) + { + Object result = parameters.source(); + if (result instanceof Observable) { + return new RxExecutionResult(((Observable) result).map(r -> { + + ExecutionParameters newParameters = ExecutionParameters.newParameters() + .typeInfo(parameters.typeInfo()) + .fields(parameters.fields()) + .source(r).build(); + + return super.completeValue(executionContext, newParameters, fields); + }), null); } - return super.completeValue(executionContext, fieldType, fields, result); + return super.completeValue(executionContext, parameters, fields); } - + @Override - protected ExecutionResult completeValueForList(ExecutionContext executionContext, GraphQLList fieldType, List fields, List result) { - Observable resultObservable = + protected ExecutionResult completeValueForList(ExecutionContext executionContext, ExecutionParameters parameters, + List fields, Iterable result) + { + TypeInfo typeInfo = parameters.typeInfo(); + GraphQLList fieldType = typeInfo.castType(GraphQLList.class); + AtomicInteger idx = new AtomicInteger(0); + Observable resultObservable = Observable.from( - IntStream.range(0, result.size()) - .mapToObj(idx -> new ListTuple(idx, result.get(idx))) - .toArray(ListTuple[]::new) + StreamSupport.stream(result.spliterator(), false) + .map(i -> new ListTuple(idx.getAndIncrement(), i)) + .toArray(ListTuple[]::new) ) .flatMap(tuple -> { - ExecutionResult executionResult = completeValue(executionContext, fieldType.getWrappedType(), fields, tuple.result); - + TypeInfo newType = typeInfo.asType(fieldType.getWrappedType()); + ExecutionParameters newParameters = ExecutionParameters.newParameters() + .typeInfo(newType) + .fields(parameters.fields()) + .source(tuple.result).build(); + + ExecutionResult executionResult = completeValue(executionContext, newParameters, fields); if (executionResult instanceof RxExecutionResult) { return Observable.zip(Observable.just(tuple.index), ((RxExecutionResult)executionResult).getDataObservable(), ListTuple::new); } @@ -95,7 +110,7 @@ protected ExecutionResult completeValueForList(ExecutionContext executionContext return new RxExecutionResult(resultObservable, null); } - + private class ListTuple { public int index; public Object result; diff --git a/src/test/groovy/graphql/HelloWorld.java b/src/test/groovy/graphql/HelloWorld.java index 799104e..b253714 100644 --- a/src/test/groovy/graphql/HelloWorld.java +++ b/src/test/groovy/graphql/HelloWorld.java @@ -32,7 +32,11 @@ public static void main(String[] args) { .query(queryType) .build(); - Observable result = ((RxExecutionResult)new GraphQL(schema, new RxExecutionStrategy()).execute("{hello}")).getDataObservable(); + GraphQL graphQL = GraphQL.newGraphQL(schema) + .queryExecutionStrategy(new RxExecutionStrategy()) + .mutationExecutionStrategy(new RxExecutionStrategy()) + .build(); + Observable result = ((RxExecutionResult) graphQL.execute("{hello}")).getDataObservable(); result.subscribe(System.out::println); } @@ -52,9 +56,15 @@ public void helloWorldTest() { .query(queryType) .build(); - RxExecutionResult executionResult = (RxExecutionResult)new GraphQL(schema, new RxExecutionStrategy()).execute("{hello}"); + GraphQL graphQL = GraphQL.newGraphQL(schema) + .queryExecutionStrategy(new RxExecutionStrategy()) + .mutationExecutionStrategy(new RxExecutionStrategy()) + .build(); + + RxExecutionResult executionResult = (RxExecutionResult) graphQL.execute("{hello}"); - Observable> result = (Observable>)executionResult.getDataObservable(); + @SuppressWarnings("unchecked") + Observable> result = (Observable>) executionResult.getDataObservable(); TestSubscriber> testSubscriber = new TestSubscriber<>();