Skip to content

Commit 1606d7e

Browse files
committed
Merge branch 'master-up'
2 parents e88a742 + 2d447d6 commit 1606d7e

File tree

50 files changed

+1417
-502
lines changed

Some content is hidden

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

50 files changed

+1417
-502
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ syntax for GraphQL schema definition.
1212

1313
```groovy
1414
dependencies {
15-
compile "io.github.graphql-java:graphql-java-annotations:5.0.6"
15+
compile "io.github.graphql-java:graphql-java-annotations:5.0.7"
1616
}
1717
```
1818

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ gradle.projectsEvaluated {
8888

8989
dependencies {
9090
compile 'javax.validation:validation-api:1.1.0.Final'
91-
compile 'com.graphql-java:graphql-java:5.0'
91+
compile 'com.graphql-java:graphql-java:6.0'
9292

9393
// OSGi
9494
compileOnly 'org.osgi:org.osgi.core:6.0.0'

src/main/java/graphql/annotations/connection/ConnectionDataFetcher.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

src/main/java/graphql/annotations/connection/PaginatedDataConnectionFetcher.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public Connection<T> get(DataFetchingEnvironment environment) {
5252
}
5353

5454
private PageInfo getPageInfo(List<Edge<T>> edges, PaginatedData<T> paginatedData) {
55+
if (edges.isEmpty()) {
56+
return new DefaultPageInfo(null,null,false,false);
57+
}
5558
ConnectionCursor firstCursor = edges.get(0).getCursor();
5659
ConnectionCursor lastCursor = edges.get(edges.size() - 1).getCursor();
5760
return new DefaultPageInfo(

src/main/java/graphql/annotations/processor/GraphQLAnnotations.java

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,19 @@
1515
package graphql.annotations.processor;
1616

1717
import graphql.annotations.annotationTypes.GraphQLName;
18-
import graphql.annotations.annotationTypes.GraphQLTypeExtension;
1918
import graphql.annotations.processor.exceptions.GraphQLAnnotationsException;
2019
import graphql.annotations.processor.graphQLProcessors.GraphQLAnnotationsProcessor;
2120
import graphql.annotations.processor.graphQLProcessors.GraphQLInputProcessor;
2221
import graphql.annotations.processor.graphQLProcessors.GraphQLOutputProcessor;
23-
import graphql.annotations.processor.retrievers.GraphQLObjectHandler;
22+
import graphql.annotations.processor.retrievers.*;
23+
import graphql.annotations.processor.searchAlgorithms.BreadthFirstSearch;
24+
import graphql.annotations.processor.searchAlgorithms.ParentalSearch;
2425
import graphql.annotations.processor.typeFunctions.DefaultTypeFunction;
2526
import graphql.annotations.processor.typeFunctions.TypeFunction;
27+
import graphql.annotations.processor.util.DataFetcherConstructor;
2628
import graphql.relay.Relay;
2729
import graphql.schema.GraphQLObjectType;
28-
import org.osgi.service.component.annotations.Component;
29-
import org.osgi.service.component.annotations.Reference;
3030

31-
import java.util.HashSet;
3231
import java.util.Map;
3332

3433
import static graphql.annotations.processor.util.NamingKit.toGraphqlName;
@@ -37,18 +36,51 @@
3736
* A utility class for extracting GraphQL data structures from annotated
3837
* elements.
3938
*/
40-
@Component
4139
public class GraphQLAnnotations implements GraphQLAnnotationsProcessor {
4240

4341
private GraphQLObjectHandler graphQLObjectHandler;
42+
private GraphQLExtensionsHandler graphQLExtensionsHandler;
43+
4444
private ProcessingElementsContainer container;
4545

4646
public GraphQLAnnotations() {
47-
this(new DefaultTypeFunction(new GraphQLInputProcessor(), new GraphQLOutputProcessor()), new GraphQLObjectHandler());
47+
GraphQLObjectHandler objectHandler = new GraphQLObjectHandler();
48+
GraphQLTypeRetriever typeRetriever = new GraphQLTypeRetriever();
49+
GraphQLObjectInfoRetriever objectInfoRetriever = new GraphQLObjectInfoRetriever();
50+
GraphQLInterfaceRetriever interfaceRetriever = new GraphQLInterfaceRetriever();
51+
GraphQLFieldRetriever fieldRetriever = new GraphQLFieldRetriever();
52+
GraphQLInputProcessor inputProcessor = new GraphQLInputProcessor();
53+
GraphQLOutputProcessor outputProcessor = new GraphQLOutputProcessor();
54+
BreadthFirstSearch methodSearchAlgorithm = new BreadthFirstSearch(objectInfoRetriever);
55+
ParentalSearch fieldSearchAlgorithm = new ParentalSearch(objectInfoRetriever);
56+
DataFetcherConstructor dataFetcherConstructor = new DataFetcherConstructor();
57+
GraphQLExtensionsHandler extensionsHandler = new GraphQLExtensionsHandler();
58+
DefaultTypeFunction defaultTypeFunction = new DefaultTypeFunction(inputProcessor, outputProcessor);
59+
60+
objectHandler.setTypeRetriever(typeRetriever);
61+
typeRetriever.setGraphQLObjectInfoRetriever(objectInfoRetriever);
62+
typeRetriever.setGraphQLInterfaceRetriever(interfaceRetriever);
63+
typeRetriever.setMethodSearchAlgorithm(methodSearchAlgorithm);
64+
typeRetriever.setFieldSearchAlgorithm(fieldSearchAlgorithm);
65+
typeRetriever.setExtensionsHandler(extensionsHandler);
66+
typeRetriever.setGraphQLFieldRetriever(fieldRetriever);
67+
interfaceRetriever.setGraphQLTypeRetriever(typeRetriever);
68+
fieldRetriever.setDataFetcherConstructor(dataFetcherConstructor);
69+
inputProcessor.setGraphQLTypeRetriever(typeRetriever);
70+
outputProcessor.setGraphQLTypeRetriever(typeRetriever);
71+
extensionsHandler.setGraphQLObjectInfoRetriever(objectInfoRetriever);
72+
extensionsHandler.setFieldSearchAlgorithm(fieldSearchAlgorithm);
73+
extensionsHandler.setMethodSearchAlgorithm(methodSearchAlgorithm);
74+
extensionsHandler.setFieldRetriever(fieldRetriever);
75+
76+
this.graphQLObjectHandler = objectHandler;
77+
this.graphQLExtensionsHandler = extensionsHandler;
78+
this.container = new ProcessingElementsContainer(defaultTypeFunction);
4879
}
4980

50-
public GraphQLAnnotations(TypeFunction defaultTypeFunction, GraphQLObjectHandler graphQLObjectHandler) {
81+
public GraphQLAnnotations(TypeFunction defaultTypeFunction, GraphQLObjectHandler graphQLObjectHandler, GraphQLExtensionsHandler graphQLExtensionsHandler) {
5182
this.graphQLObjectHandler = graphQLObjectHandler;
83+
this.graphQLExtensionsHandler = graphQLExtensionsHandler;
5284
this.container = new ProcessingElementsContainer(defaultTypeFunction);
5385
}
5486

@@ -73,28 +105,7 @@ public static GraphQLObjectType object(Class<?> object) throws GraphQLAnnotation
73105
}
74106

75107
public void registerTypeExtension(Class<?> objectClass) {
76-
GraphQLTypeExtension typeExtension = objectClass.getAnnotation(GraphQLTypeExtension.class);
77-
if (typeExtension == null) {
78-
throw new GraphQLAnnotationsException("Class is not annotated with GraphQLTypeExtension", null);
79-
} else {
80-
Class<?> aClass = typeExtension.value();
81-
if (!container.getExtensionsTypeRegistry().containsKey(aClass)) {
82-
container.getExtensionsTypeRegistry().put(aClass, new HashSet<>());
83-
}
84-
container.getExtensionsTypeRegistry().get(aClass).add(objectClass);
85-
}
86-
}
87-
88-
public void unregisterTypeExtension(Class<?> objectClass) {
89-
GraphQLTypeExtension typeExtension = objectClass.getAnnotation(GraphQLTypeExtension.class);
90-
if (typeExtension == null) {
91-
throw new GraphQLAnnotationsException("Class is not annotated with GraphQLTypeExtension", null);
92-
} else {
93-
Class<?> aClass = typeExtension.value();
94-
if (container.getExtensionsTypeRegistry().containsKey(aClass)) {
95-
container.getExtensionsTypeRegistry().get(aClass).remove(objectClass);
96-
}
97-
}
108+
graphQLExtensionsHandler.registerTypeExtension(objectClass, container);
98109
}
99110

100111
public void registerType(TypeFunction typeFunction) {
@@ -109,6 +120,14 @@ public Map<String, graphql.schema.GraphQLType> getTypeRegistry() {
109120
return container.getTypeRegistry();
110121
}
111122

123+
public GraphQLObjectHandler getObjectHandler() {
124+
return graphQLObjectHandler;
125+
}
126+
127+
public GraphQLExtensionsHandler getExtensionsHandler() {
128+
return graphQLExtensionsHandler;
129+
}
130+
112131
public ProcessingElementsContainer getContainer() {
113132
return container;
114133
}
@@ -117,7 +136,6 @@ public void setContainer(ProcessingElementsContainer container) {
117136
this.container = container;
118137
}
119138

120-
@Reference(target = "(type=default)")
121139
public void setDefaultTypeFunction(TypeFunction function) {
122140
this.container.setDefaultTypeFunction(function);
123141
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* Copyright 2016 Yurii Rashkovskii
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
*/
15+
package graphql.annotations.processor;
16+
17+
import graphql.annotations.processor.graphQLProcessors.GraphQLInputProcessor;
18+
import graphql.annotations.processor.graphQLProcessors.GraphQLOutputProcessor;
19+
import graphql.annotations.processor.retrievers.GraphQLExtensionsHandler;
20+
import graphql.annotations.processor.typeFunctions.TypeFunction;
21+
import org.osgi.service.component.annotations.*;
22+
23+
@Component(service = GraphQLAnnotationsComponent.class, immediate = true)
24+
public class GraphQLAnnotationsComponent {
25+
26+
private TypeFunction defaultTypeFunction;
27+
private GraphQLOutputProcessor outputTypeProcessor;
28+
private GraphQLInputProcessor inputTypeProcessor;
29+
private GraphQLExtensionsHandler extensionsHandler;
30+
31+
public ProcessingElementsContainer createContainer() {
32+
return new ProcessingElementsContainer(defaultTypeFunction);
33+
}
34+
35+
public GraphQLOutputProcessor getOutputTypeProcessor() {
36+
return outputTypeProcessor;
37+
}
38+
39+
public GraphQLInputProcessor getInputTypeProcessor() {
40+
return inputTypeProcessor;
41+
}
42+
43+
public GraphQLExtensionsHandler getExtensionsHandler() {
44+
return extensionsHandler;
45+
}
46+
47+
@Reference(target = "(type=default)", policy=ReferencePolicy.DYNAMIC, policyOption= ReferencePolicyOption.GREEDY)
48+
public void setDefaultTypeFunction(TypeFunction defaultTypeFunction) {
49+
this.defaultTypeFunction = defaultTypeFunction;
50+
}
51+
52+
public void unsetDefaultTypeFunction(TypeFunction defaultTypeFunction) {
53+
this.defaultTypeFunction = null;
54+
}
55+
56+
@Reference(policy=ReferencePolicy.DYNAMIC, policyOption= ReferencePolicyOption.GREEDY)
57+
public void setOutputTypeProcessor(GraphQLOutputProcessor outputTypeProcessor) {
58+
this.outputTypeProcessor = outputTypeProcessor;
59+
}
60+
61+
public void unsetOutputTypeProcessor(GraphQLOutputProcessor outputTypeProcessor) {
62+
this.outputTypeProcessor = null;
63+
}
64+
65+
@Reference(policy=ReferencePolicy.DYNAMIC, policyOption= ReferencePolicyOption.GREEDY)
66+
public void setInputTypeProcessor(GraphQLInputProcessor inputTypeProcessor) {
67+
this.inputTypeProcessor = inputTypeProcessor;
68+
}
69+
70+
public void unsetInputTypeProcessor(GraphQLInputProcessor inputTypeProcessor) {
71+
this.inputTypeProcessor = null;
72+
}
73+
74+
@Reference(policy=ReferencePolicy.DYNAMIC, policyOption= ReferencePolicyOption.GREEDY)
75+
public void setExtensionsHandler(GraphQLExtensionsHandler extensionsHandler) {
76+
this.extensionsHandler = extensionsHandler;
77+
}
78+
79+
public void unsetExtensionsHandler(GraphQLExtensionsHandler extensionsHandler) {
80+
this.extensionsHandler = null;
81+
}
82+
}

src/main/java/graphql/annotations/processor/graphQLProcessors/GraphQLAnnotationsProcessor.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ public interface GraphQLAnnotationsProcessor {
2626
*/
2727
void registerTypeExtension(Class<?> objectClass);
2828

29-
/**
30-
* Unregister a type extension class.
31-
*
32-
* @param objectClass The extension class to unregister
33-
*/
34-
void unregisterTypeExtension(Class<?> objectClass);
35-
3629
/**
3730
* Allows you to set a custom relay object
3831
*

src/main/java/graphql/annotations/processor/graphQLProcessors/GraphQLInputProcessor.java

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,18 @@
1414
*/
1515
package graphql.annotations.processor.graphQLProcessors;
1616

17-
18-
import graphql.annotations.processor.retrievers.GraphQLInputObjectRetriever;
19-
import graphql.annotations.processor.retrievers.GraphQLObjectHandler;
2017
import graphql.annotations.processor.ProcessingElementsContainer;
21-
import graphql.annotations.processor.retrievers.GraphQLObjectInfoRetriever;
22-
import graphql.schema.GraphQLInputObjectType;
18+
import graphql.annotations.processor.retrievers.GraphQLTypeRetriever;
2319
import graphql.schema.GraphQLInputType;
24-
import graphql.schema.GraphQLType;
25-
26-
import java.util.Map;
20+
import org.osgi.service.component.annotations.Component;
21+
import org.osgi.service.component.annotations.Reference;
22+
import org.osgi.service.component.annotations.ReferencePolicy;
23+
import org.osgi.service.component.annotations.ReferencePolicyOption;
2724

25+
@Component(service = GraphQLInputProcessor.class)
2826
public class GraphQLInputProcessor {
2927

30-
private static final String DEFAULT_INPUT_PREFIX = "Input";
31-
32-
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
33-
private GraphQLObjectHandler graphQLObjectHandler;
34-
private GraphQLInputObjectRetriever graphQLInputObjectRetriever;
35-
36-
public GraphQLInputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLObjectHandler graphQLObjectHandler, GraphQLInputObjectRetriever graphQLInputObjectRetriever) {
37-
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
38-
this.graphQLObjectHandler = graphQLObjectHandler;
39-
this.graphQLInputObjectRetriever = graphQLInputObjectRetriever;
40-
}
41-
42-
public GraphQLInputProcessor() {
43-
this(new GraphQLObjectInfoRetriever(), new GraphQLObjectHandler(), new GraphQLInputObjectRetriever());
44-
}
28+
private GraphQLTypeRetriever graphQLTypeRetriever;
4529

4630
/**
4731
* This will examine the object class and return a {@link GraphQLInputType} representation
@@ -50,20 +34,21 @@ public GraphQLInputProcessor() {
5034
* @param container a class that hold several members that are required in order to build schema
5135
* @return a {@link GraphQLInputType} that represents that object class
5236
*/
53-
54-
public GraphQLInputObjectType getInputObject(Class<?> object, ProcessingElementsContainer container) {
55-
String typeName = DEFAULT_INPUT_PREFIX + graphQLObjectInfoRetriever.getTypeName(object);
56-
Map<String, GraphQLType> typeRegistry = container.getTypeRegistry();
57-
58-
if (typeRegistry.containsKey(typeName)) {
59-
return (GraphQLInputObjectType) container.getTypeRegistry().get(typeName);
60-
} else {
61-
graphql.schema.GraphQLType graphQLType = graphQLObjectHandler.getObject(object, container);
62-
GraphQLInputObjectType inputObject = (GraphQLInputObjectType) graphQLInputObjectRetriever.getInputObject(graphQLType, DEFAULT_INPUT_PREFIX, typeRegistry);
63-
typeRegistry.put(inputObject.getName(), inputObject);
64-
return inputObject;
37+
public GraphQLInputType getInputTypeOrRef(Class<?> object, ProcessingElementsContainer container) {
38+
boolean considerAsInput = true;
39+
if (Enum.class.isAssignableFrom(object)) {
40+
considerAsInput = false;
6541
}
42+
return (GraphQLInputType) graphQLTypeRetriever.getGraphQLType(object, container, considerAsInput);
6643
}
6744

45+
@Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
46+
public void setGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
47+
this.graphQLTypeRetriever = graphQLTypeRetriever;
48+
}
49+
50+
public void unsetGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
51+
this.graphQLTypeRetriever = null;
52+
}
6853

6954
}

0 commit comments

Comments
 (0)