Skip to content

Commit 234c3cf

Browse files
author
Thomas Draier
committed
Better OSGi integration - create new OSGi entry point and allows to override each component
1 parent 1086e38 commit 234c3cf

22 files changed

+501
-182
lines changed

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

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,17 @@
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;
22+
import graphql.annotations.processor.retrievers.GraphQLExtensionsHandler;
2323
import graphql.annotations.processor.retrievers.GraphQLObjectHandler;
2424
import graphql.annotations.processor.typeFunctions.DefaultTypeFunction;
2525
import graphql.annotations.processor.typeFunctions.TypeFunction;
2626
import graphql.relay.Relay;
2727
import graphql.schema.GraphQLObjectType;
28-
import org.osgi.service.component.annotations.Component;
29-
import org.osgi.service.component.annotations.Reference;
3028

31-
import java.util.HashSet;
3229
import java.util.Map;
3330

3431
import static graphql.annotations.processor.util.NamingKit.toGraphqlName;
@@ -37,18 +34,20 @@
3734
* A utility class for extracting GraphQL data structures from annotated
3835
* elements.
3936
*/
40-
@Component
4137
public class GraphQLAnnotations implements GraphQLAnnotationsProcessor {
4238

4339
private GraphQLObjectHandler graphQLObjectHandler;
40+
private GraphQLExtensionsHandler graphQLExtensionsHandler;
41+
4442
private ProcessingElementsContainer container;
4543

4644
public GraphQLAnnotations() {
47-
this(new DefaultTypeFunction(new GraphQLInputProcessor(), new GraphQLOutputProcessor()), new GraphQLObjectHandler());
45+
this(new DefaultTypeFunction(new GraphQLInputProcessor(), new GraphQLOutputProcessor()), new GraphQLObjectHandler(), new GraphQLExtensionsHandler());
4846
}
4947

50-
public GraphQLAnnotations(TypeFunction defaultTypeFunction, GraphQLObjectHandler graphQLObjectHandler) {
48+
public GraphQLAnnotations(TypeFunction defaultTypeFunction, GraphQLObjectHandler graphQLObjectHandler, GraphQLExtensionsHandler graphQLExtensionsHandler) {
5149
this.graphQLObjectHandler = graphQLObjectHandler;
50+
this.graphQLExtensionsHandler = graphQLExtensionsHandler;
5251
this.container = new ProcessingElementsContainer(defaultTypeFunction);
5352
}
5453

@@ -73,28 +72,7 @@ public static GraphQLObjectType object(Class<?> object) throws GraphQLAnnotation
7372
}
7473

7574
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-
}
75+
graphQLExtensionsHandler.registerTypeExtension(objectClass, container);
9876
}
9977

10078
public void registerType(TypeFunction typeFunction) {
@@ -117,7 +95,6 @@ public void setContainer(ProcessingElementsContainer container) {
11795
this.container = container;
11896
}
11997

120-
@Reference(target = "(type=default)")
12198
public void setDefaultTypeFunction(TypeFunction function) {
12299
this.container.setDefaultTypeFunction(function);
123100
}
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: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,25 @@
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;
30+
public GraphQLInputProcessor(GraphQLTypeRetriever graphQLTypeRetriever) {
3731
this.graphQLTypeRetriever = graphQLTypeRetriever;
3832
}
3933

4034
public GraphQLInputProcessor() {
41-
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever());
35+
this(new GraphQLTypeRetriever());
4236
}
4337

4438
/**
@@ -48,12 +42,21 @@ public GraphQLInputProcessor() {
4842
* @param container a class that hold several members that are required in order to build schema
4943
* @return a {@link GraphQLInputType} that represents that object class
5044
*/
51-
5245
public GraphQLInputType getInputTypeOrRef(Class<?> object, ProcessingElementsContainer container) {
5346
boolean considerAsInput = true;
5447
if (Enum.class.isAssignableFrom(object)) {
5548
considerAsInput = false;
5649
}
5750
return (GraphQLInputType) graphQLTypeRetriever.getGraphQLType(object, container, considerAsInput);
5851
}
52+
53+
@Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
54+
public void setGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
55+
this.graphQLTypeRetriever = graphQLTypeRetriever;
56+
}
57+
58+
public void unsetGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
59+
this.graphQLTypeRetriever = new GraphQLTypeRetriever();
60+
}
61+
5962
}

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,25 @@
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

3032

31-
public GraphQLOutputProcessor(GraphQLObjectInfoRetriever graphQLObjectInfoRetriever, GraphQLTypeRetriever graphQLTypeRetriever) {
32-
this.graphQLObjectInfoRetriever = graphQLObjectInfoRetriever;
33+
public GraphQLOutputProcessor(GraphQLTypeRetriever graphQLTypeRetriever) {
3334
this.graphQLTypeRetriever = graphQLTypeRetriever;
3435
}
3536

3637
public GraphQLOutputProcessor() {
37-
this(new GraphQLObjectInfoRetriever(), new GraphQLTypeRetriever());
38+
this(new GraphQLTypeRetriever());
3839
}
3940

4041
/**
@@ -48,9 +49,16 @@ public GraphQLOutputProcessor() {
4849
*
4950
* @throws GraphQLAnnotationsException if the object class cannot be examined
5051
*/
51-
5252
public GraphQLOutputType getOutputTypeOrRef(Class<?> object, ProcessingElementsContainer container) throws GraphQLAnnotationsException {
5353
return (GraphQLOutputType) graphQLTypeRetriever.getGraphQLType(object, container, false);
5454
}
5555

56+
@Reference(policy = ReferencePolicy.DYNAMIC, policyOption = ReferencePolicyOption.GREEDY)
57+
public void setGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
58+
this.graphQLTypeRetriever = graphQLTypeRetriever;
59+
}
60+
61+
public void unsetGraphQLTypeRetriever(GraphQLTypeRetriever graphQLTypeRetriever) {
62+
this.graphQLTypeRetriever = new GraphQLTypeRetriever();
63+
}
5664
}

0 commit comments

Comments
 (0)