Skip to content

Commit 2d447d6

Browse files
authored
Merge pull request #134 from Jahia/osgi
Better OSGi integration -
2 parents c67f2db + 80176af commit 2d447d6

26 files changed

+541
-229
lines changed

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: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,46 +14,41 @@
1414
*/
1515
package graphql.annotations.processor.graphQLProcessors;
1616

17-
1817
import graphql.annotations.processor.ProcessingElementsContainer;
19-
import graphql.annotations.processor.retrievers.GraphQLObjectInfoRetriever;
2018
import graphql.annotations.processor.retrievers.GraphQLTypeRetriever;
2119
import graphql.schema.GraphQLInputType;
22-
import graphql.schema.GraphQLType;
23-
import graphql.schema.GraphQLTypeReference;
24-
25-
import java.util.Map;
26-
27-
import static graphql.annotations.processor.util.InputPropertiesUtil.DEFAULT_INPUT_PREFIX;
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;
2824

25+
@Component(service = GraphQLInputProcessor.class)
2926
public class GraphQLInputProcessor {
3027

31-
32-
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
3328
private GraphQLTypeRetriever graphQLTypeRetriever;
3429

35-
public GraphQLInputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLTypeRetriever) {
36-
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
37-
this.graphQLTypeRetriever = graphQLTypeRetriever;
38-
}
39-
40-
public GraphQLInputProcessor() {
41-
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever());
42-
}
43-
4430
/**
4531
* This will examine the object class and return a {@link GraphQLInputType} representation
4632
*
4733
* @param object the object class to examine
4834
* @param container a class that hold several members that are required in order to build schema
4935
* @return a {@link GraphQLInputType} that represents that object class
5036
*/
51-
5237
public GraphQLInputType getInputTypeOrRef(Class<?> object, ProcessingElementsContainer container) {
5338
boolean considerAsInput = true;
5439
if (Enum.class.isAssignableFrom(object)) {
5540
considerAsInput = false;
5641
}
5742
return (GraphQLInputType) graphQLTypeRetriever.getGraphQLType(object, container, considerAsInput);
5843
}
44+
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+
}
53+
5954
}

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,18 @@
1717

1818
import graphql.annotations.processor.exceptions.GraphQLAnnotationsException;
1919
import graphql.annotations.processor.ProcessingElementsContainer;
20-
import graphql.annotations.processor.retrievers.GraphQLObjectInfoRetriever;
2120
import graphql.annotations.processor.retrievers.GraphQLTypeRetriever;
2221
import graphql.schema.GraphQLOutputType;
23-
import graphql.schema.GraphQLTypeReference;
22+
import org.osgi.service.component.annotations.Component;
23+
import org.osgi.service.component.annotations.Reference;
24+
import org.osgi.service.component.annotations.ReferencePolicy;
25+
import org.osgi.service.component.annotations.ReferencePolicyOption;
2426

27+
@Component(service = GraphQLOutputProcessor.class, immediate = true)
2528
public class GraphQLOutputProcessor {
2629

27-
private GraphQLObjectInfoRetriever graphQLObjectInfoRetriever;
2830
private GraphQLTypeRetriever graphQLTypeRetriever;
2931

30-
31-
public GraphQLOutputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLTypeRetriever) {
32-
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
33-
this.graphQLTypeRetriever = graphQLTypeRetriever;
34-
}
35-
36-
public GraphQLOutputProcessor() {
37-
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever());
38-
}
39-
4032
/**
4133
* This will examine the object class and return a {@link GraphQLOutputType} representation
4234
* which may be a {@link GraphQLOutputType} or a {@link graphql.schema.GraphQLTypeReference}
@@ -48,9 +40,16 @@ public GraphQLOutputProcessor() {
4840
*
4941
* @throws GraphQLAnnotationsException if the object class cannot be examined
5042
*/
51-
5243
public GraphQLOutputType getOutputTypeOrRef(Class<?> object, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
5344
return (GraphQLOutputType) graphQLTypeRetriever.getGraphQLType(object, container, false);
5445
}
5546

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

0 commit comments

Comments
 (0)