Skip to content

Commit bd73fc6

Browse files
committed
Increase coverage and fix sonar issues in osgi
1 parent 5a226d0 commit bd73fc6

File tree

8 files changed

+339
-227
lines changed

8 files changed

+339
-227
lines changed

graphql-java-servlet/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
compileOnly 'org.osgi:org.osgi.service.metatype.annotations:1.3.0'
3030
compileOnly 'org.osgi:org.osgi.annotation:6.0.0'
3131

32-
testCompile 'io.github.graphql-java:graphql-java-annotations:5.2'
32+
testCompile 'io.github.graphql-java:graphql-java-annotations:8.3'
3333

3434
// Unit testing
3535
testCompile "org.codehaus.groovy:groovy-all:2.4.1"
@@ -40,4 +40,4 @@ dependencies {
4040
testCompile 'org.springframework:spring-test:4.3.7.RELEASE'
4141
testRuntime 'org.springframework:spring-web:4.3.7.RELEASE'
4242
testCompile 'com.google.guava:guava:24.1.1-jre'
43-
}
43+
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/OsgiGraphQLHttpServlet.java

+38-203
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
package graphql.kickstart.servlet;
2+
3+
import static graphql.schema.GraphQLObjectType.newObject;
4+
import static graphql.schema.GraphQLSchema.newSchema;
5+
import static java.util.stream.Collectors.toSet;
6+
7+
import graphql.Scalars;
8+
import graphql.execution.preparsed.NoOpPreparsedDocumentProvider;
9+
import graphql.execution.preparsed.PreparsedDocumentProvider;
10+
import graphql.kickstart.execution.GraphQLObjectMapper;
11+
import graphql.kickstart.execution.GraphQLQueryInvoker;
12+
import graphql.kickstart.execution.config.DefaultExecutionStrategyProvider;
13+
import graphql.kickstart.execution.config.ExecutionStrategyProvider;
14+
import graphql.kickstart.execution.config.InstrumentationProvider;
15+
import graphql.kickstart.execution.error.DefaultGraphQLErrorHandler;
16+
import graphql.kickstart.execution.error.GraphQLErrorHandler;
17+
import graphql.kickstart.execution.instrumentation.NoOpInstrumentationProvider;
18+
import graphql.kickstart.servlet.config.DefaultGraphQLSchemaServletProvider;
19+
import graphql.kickstart.servlet.config.GraphQLSchemaServletProvider;
20+
import graphql.kickstart.servlet.context.DefaultGraphQLServletContextBuilder;
21+
import graphql.kickstart.servlet.context.GraphQLServletContextBuilder;
22+
import graphql.kickstart.servlet.core.DefaultGraphQLRootObjectBuilder;
23+
import graphql.kickstart.servlet.core.GraphQLServletRootObjectBuilder;
24+
import graphql.kickstart.servlet.input.GraphQLInvocationInputFactory;
25+
import graphql.kickstart.servlet.osgi.GraphQLCodeRegistryProvider;
26+
import graphql.kickstart.servlet.osgi.GraphQLFieldProvider;
27+
import graphql.kickstart.servlet.osgi.GraphQLMutationProvider;
28+
import graphql.kickstart.servlet.osgi.GraphQLQueryProvider;
29+
import graphql.kickstart.servlet.osgi.GraphQLSubscriptionProvider;
30+
import graphql.kickstart.servlet.osgi.GraphQLTypesProvider;
31+
import graphql.schema.GraphQLCodeRegistry;
32+
import graphql.schema.GraphQLFieldDefinition;
33+
import graphql.schema.GraphQLObjectType;
34+
import graphql.schema.GraphQLType;
35+
import java.util.ArrayList;
36+
import java.util.Collection;
37+
import java.util.List;
38+
import java.util.Set;
39+
import java.util.concurrent.Executors;
40+
import java.util.concurrent.ScheduledExecutorService;
41+
import java.util.concurrent.ScheduledFuture;
42+
import java.util.concurrent.TimeUnit;
43+
import lombok.Setter;
44+
45+
@Setter
46+
class OsgiSchemaBuilder {
47+
48+
private final List<GraphQLQueryProvider> queryProviders = new ArrayList<>();
49+
private final List<GraphQLMutationProvider> mutationProviders = new ArrayList<>();
50+
private final List<GraphQLSubscriptionProvider> subscriptionProviders = new ArrayList<>();
51+
private final List<GraphQLTypesProvider> typesProviders = new ArrayList<>();
52+
53+
private GraphQLServletContextBuilder contextBuilder = new DefaultGraphQLServletContextBuilder();
54+
private GraphQLServletRootObjectBuilder rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
55+
private ExecutionStrategyProvider executionStrategyProvider = new DefaultExecutionStrategyProvider();
56+
private InstrumentationProvider instrumentationProvider = new NoOpInstrumentationProvider();
57+
private GraphQLErrorHandler errorHandler = new DefaultGraphQLErrorHandler();
58+
private PreparsedDocumentProvider preparsedDocumentProvider = NoOpPreparsedDocumentProvider.INSTANCE;
59+
private GraphQLCodeRegistryProvider codeRegistryProvider = () -> GraphQLCodeRegistry
60+
.newCodeRegistry().build();
61+
62+
private GraphQLSchemaServletProvider schemaProvider;
63+
64+
private ScheduledExecutorService executor;
65+
private ScheduledFuture<?> updateFuture;
66+
private int schemaUpdateDelay;
67+
68+
void activate(int schemaUpdateDelay) {
69+
this.schemaUpdateDelay = schemaUpdateDelay;
70+
if (schemaUpdateDelay != 0) {
71+
executor = Executors.newSingleThreadScheduledExecutor();
72+
}
73+
}
74+
75+
void deactivate() {
76+
if (executor != null) {
77+
executor.shutdown();
78+
}
79+
}
80+
81+
void updateSchema() {
82+
if (schemaUpdateDelay == 0) {
83+
doUpdateSchema();
84+
} else {
85+
if (updateFuture != null) {
86+
updateFuture.cancel(true);
87+
}
88+
89+
updateFuture = executor
90+
.schedule(this::doUpdateSchema, schemaUpdateDelay, TimeUnit.MILLISECONDS);
91+
}
92+
}
93+
94+
private void doUpdateSchema() {
95+
this.schemaProvider = new DefaultGraphQLSchemaServletProvider(
96+
newSchema().query(buildQueryType())
97+
.mutation(buildMutationType())
98+
.subscription(buildSubscriptionType())
99+
.additionalTypes(buildTypes())
100+
.codeRegistry(codeRegistryProvider.getCodeRegistry())
101+
.build());
102+
}
103+
104+
private GraphQLObjectType buildQueryType() {
105+
final GraphQLObjectType.Builder queryTypeBuilder = newObject().name("Query")
106+
.description("Root query type");
107+
108+
if (!queryProviders.isEmpty()) {
109+
for (GraphQLQueryProvider provider : queryProviders) {
110+
if (provider.getQueries() != null && !provider.getQueries().isEmpty()) {
111+
provider.getQueries().forEach(queryTypeBuilder::field);
112+
}
113+
}
114+
} else {
115+
// graphql-java enforces Query type to be there with at least some field.
116+
queryTypeBuilder.field(
117+
GraphQLFieldDefinition
118+
.newFieldDefinition()
119+
.name("_empty")
120+
.type(Scalars.GraphQLBoolean)
121+
.build());
122+
}
123+
return queryTypeBuilder.build();
124+
}
125+
126+
private Set<GraphQLType> buildTypes() {
127+
return typesProviders.stream()
128+
.map(GraphQLTypesProvider::getTypes)
129+
.flatMap(Collection::stream)
130+
.collect(toSet());
131+
}
132+
133+
private GraphQLObjectType buildMutationType() {
134+
return buildObjectType("Mutation", new ArrayList<>(mutationProviders));
135+
}
136+
137+
private GraphQLObjectType buildSubscriptionType() {
138+
return buildObjectType("Subscription", new ArrayList<>(subscriptionProviders));
139+
}
140+
141+
private GraphQLObjectType buildObjectType(String name, List<GraphQLFieldProvider> providers) {
142+
if (!providers.isEmpty()) {
143+
final GraphQLObjectType.Builder typeBuilder = newObject().name(name)
144+
.description("Root " + name.toLowerCase() + " type");
145+
146+
for (GraphQLFieldProvider provider : providers) {
147+
provider.getFields().forEach(typeBuilder::field);
148+
}
149+
150+
if (!typeBuilder.build().getFieldDefinitions().isEmpty()) {
151+
return typeBuilder.build();
152+
}
153+
}
154+
return null;
155+
}
156+
157+
void add(GraphQLQueryProvider provider) {
158+
queryProviders.add(provider);
159+
}
160+
161+
void add(GraphQLMutationProvider provider) {
162+
mutationProviders.add(provider);
163+
}
164+
165+
void add(GraphQLSubscriptionProvider provider) {
166+
subscriptionProviders.add(provider);
167+
}
168+
169+
void add(GraphQLTypesProvider provider) {
170+
typesProviders.add(provider);
171+
}
172+
173+
void remove(GraphQLQueryProvider provider) {
174+
queryProviders.remove(provider);
175+
}
176+
177+
void remove(GraphQLMutationProvider provider) {
178+
mutationProviders.remove(provider);
179+
}
180+
181+
void remove(GraphQLSubscriptionProvider provider) {
182+
subscriptionProviders.remove(provider);
183+
}
184+
185+
void remove(GraphQLTypesProvider provider) {
186+
typesProviders.remove(provider);
187+
}
188+
189+
GraphQLSchemaServletProvider getSchemaProvider() {
190+
return schemaProvider;
191+
}
192+
193+
GraphQLConfiguration buildConfiguration() {
194+
return GraphQLConfiguration
195+
.with(buildInvocationInputFactory())
196+
.with(buildQueryInvoker())
197+
.with(buildObjectMapper())
198+
.build();
199+
}
200+
201+
private GraphQLInvocationInputFactory buildInvocationInputFactory() {
202+
return GraphQLInvocationInputFactory.newBuilder(this::getSchemaProvider)
203+
.withGraphQLContextBuilder(contextBuilder)
204+
.withGraphQLRootObjectBuilder(rootObjectBuilder)
205+
.build();
206+
}
207+
208+
private GraphQLQueryInvoker buildQueryInvoker() {
209+
return GraphQLQueryInvoker.newBuilder()
210+
.withPreparsedDocumentProvider(preparsedDocumentProvider)
211+
.withInstrumentation(() -> instrumentationProvider.getInstrumentation())
212+
.withExecutionStrategyProvider(executionStrategyProvider).build();
213+
}
214+
215+
private GraphQLObjectMapper buildObjectMapper() {
216+
return GraphQLObjectMapper.newBuilder()
217+
.withGraphQLErrorHandler(errorHandler)
218+
.build();
219+
}
220+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package graphql.kickstart.servlet.osgi;
2+
3+
import graphql.schema.GraphQLFieldDefinition;
4+
import java.util.Collection;
5+
6+
public interface GraphQLFieldProvider extends GraphQLProvider {
7+
8+
Collection<GraphQLFieldDefinition> getFields();
9+
10+
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLMutationProvider.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
import graphql.schema.GraphQLFieldDefinition;
44
import java.util.Collection;
55

6-
public interface GraphQLMutationProvider extends GraphQLProvider {
6+
public interface GraphQLMutationProvider extends GraphQLFieldProvider {
77

88
Collection<GraphQLFieldDefinition> getMutations();
99

10+
default Collection<GraphQLFieldDefinition> getFields() {
11+
return getMutations();
12+
}
13+
1014
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLQueryProvider.java

+4
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ public interface GraphQLQueryProvider extends GraphQLProvider {
1313
*/
1414
Collection<GraphQLFieldDefinition> getQueries();
1515

16+
default Collection<GraphQLFieldDefinition> getFields() {
17+
return getQueries();
18+
}
19+
1620
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/osgi/GraphQLSubscriptionProvider.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
import graphql.schema.GraphQLFieldDefinition;
44
import java.util.Collection;
55

6-
public interface GraphQLSubscriptionProvider extends GraphQLProvider {
6+
public interface GraphQLSubscriptionProvider extends GraphQLFieldProvider {
77

88
Collection<GraphQLFieldDefinition> getSubscriptions();
9+
10+
default Collection<GraphQLFieldDefinition> getFields() {
11+
return getSubscriptions();
12+
}
13+
914
}

0 commit comments

Comments
 (0)