Skip to content

Commit 792f1cb

Browse files
committed
Added a new control type so we can know when thigns have changed
1 parent 18bf953 commit 792f1cb

6 files changed

Lines changed: 427 additions & 196 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package graphql.schema.visitor;
2+
3+
import graphql.PublicApi;
4+
import graphql.schema.GraphQLSchemaElement;
5+
import graphql.util.TraversalControl;
6+
import graphql.util.TraverserContext;
7+
import graphql.util.TreeTransformerUtil;
8+
9+
/**
10+
* This indicates what traversal control to apply during the visitation
11+
* and can be created via calls to methods like {@link GraphQLSchemaVisitorEnvironment#ok()}
12+
* or {@link GraphQLSchemaVisitorEnvironment#changeNode(GraphQLSchemaElement)} say
13+
*/
14+
@PublicApi
15+
class GraphQLSchemaTraversalControl {
16+
private final GraphQLSchemaElement element;
17+
private final Control control;
18+
19+
enum Control {
20+
CONTINUE(TraversalControl.CONTINUE),
21+
QUIT(TraversalControl.QUIT),
22+
ABORT(TraversalControl.ABORT),
23+
CHANGE(TraversalControl.CONTINUE),
24+
DELETE(TraversalControl.CONTINUE),
25+
INSERT_BEFORE(TraversalControl.CONTINUE),
26+
INSERT_AFTER(TraversalControl.CONTINUE);
27+
28+
private final TraversalControl traversalControl;
29+
30+
Control(TraversalControl traversalControl) {
31+
this.traversalControl = traversalControl;
32+
}
33+
34+
public TraversalControl toTraversalControl() {
35+
return traversalControl;
36+
}
37+
}
38+
39+
static final GraphQLSchemaTraversalControl CONTINUE = new GraphQLSchemaTraversalControl(Control.CONTINUE, null);
40+
static final GraphQLSchemaTraversalControl QUIT = new GraphQLSchemaTraversalControl(Control.QUIT, null);
41+
static final GraphQLSchemaTraversalControl ABORT = new GraphQLSchemaTraversalControl(Control.ABORT, null);
42+
static final GraphQLSchemaTraversalControl DELETE = new GraphQLSchemaTraversalControl(Control.DELETE, null);
43+
44+
GraphQLSchemaTraversalControl(Control control, GraphQLSchemaElement element) {
45+
this.element = element;
46+
this.control = control;
47+
}
48+
49+
GraphQLSchemaElement getElement() {
50+
return element;
51+
}
52+
53+
Control getControl() {
54+
return control;
55+
}
56+
57+
boolean isAbortive() {
58+
return control == Control.ABORT || control == Control.QUIT;
59+
}
60+
61+
boolean isMutative() {
62+
return control == Control.DELETE || control == Control.CHANGE || control == Control.INSERT_AFTER || control == Control.INSERT_BEFORE;
63+
}
64+
65+
TraversalControl toTraversalControl(TraverserContext<GraphQLSchemaElement> context) {
66+
if (control == Control.CONTINUE || control == Control.QUIT || control == Control.ABORT) {
67+
return control.toTraversalControl();
68+
}
69+
if (control == Control.DELETE) {
70+
TreeTransformerUtil.deleteNode(context);
71+
}
72+
if (control == Control.CHANGE) {
73+
TreeTransformerUtil.changeNode(context, element);
74+
}
75+
if (control == Control.INSERT_AFTER) {
76+
TreeTransformerUtil.insertAfter(context, element);
77+
}
78+
if (control == Control.INSERT_BEFORE) {
79+
TreeTransformerUtil.insertAfter(context, element);
80+
}
81+
return TraversalControl.CONTINUE;
82+
}
83+
}

src/main/java/graphql/schema/visitor/GraphQLSchemaVisitor.java

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ interface AppliedDirectiveVisitorEnvironment extends GraphQLSchemaVisitorEnviron
4747
* @param appliedDirective the schema element being visited
4848
* @param environment the visiting environment
4949
*
50-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
50+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
5151
*/
52-
default TraversalControl visitAppliedDirective(GraphQLAppliedDirective appliedDirective, AppliedDirectiveVisitorEnvironment environment) {
53-
return TraversalControl.CONTINUE;
52+
default GraphQLSchemaTraversalControl visitAppliedDirective(GraphQLAppliedDirective appliedDirective, AppliedDirectiveVisitorEnvironment environment) {
53+
return environment.ok();
5454
}
5555

5656
/**
@@ -72,10 +72,10 @@ interface AppliedDirectiveArgumentVisitorEnvironment extends GraphQLSchemaVisito
7272
* @param appliedDirectiveArgument the schema element being visited
7373
* @param environment the visiting environment
7474
*
75-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
75+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
7676
*/
77-
default TraversalControl visitAppliedDirectiveArgument(GraphQLAppliedDirectiveArgument appliedDirectiveArgument, AppliedDirectiveArgumentVisitorEnvironment environment) {
78-
return TraversalControl.CONTINUE;
77+
default GraphQLSchemaTraversalControl visitAppliedDirectiveArgument(GraphQLAppliedDirectiveArgument appliedDirectiveArgument, AppliedDirectiveArgumentVisitorEnvironment environment) {
78+
return environment.ok();
7979
}
8080

8181
/**
@@ -99,10 +99,10 @@ interface ArgumentVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<Gra
9999
* @param argument the schema element being visited
100100
* @param environment the visiting environment
101101
*
102-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
102+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
103103
*/
104-
default TraversalControl visitArgument(GraphQLArgument argument, ArgumentVisitorEnvironment environment) {
105-
return TraversalControl.CONTINUE;
104+
default GraphQLSchemaTraversalControl visitArgument(GraphQLArgument argument, ArgumentVisitorEnvironment environment) {
105+
return environment.ok();
106106
}
107107

108108
interface DirectiveVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<GraphQLDirective> {
@@ -114,10 +114,10 @@ interface DirectiveVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<Gr
114114
* @param directive the schema element being visited
115115
* @param environment the visiting environment
116116
*
117-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
117+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
118118
*/
119-
default TraversalControl visitDirective(GraphQLDirective directive, DirectiveVisitorEnvironment environment) {
120-
return TraversalControl.CONTINUE;
119+
default GraphQLSchemaTraversalControl visitDirective(GraphQLDirective directive, DirectiveVisitorEnvironment environment) {
120+
return environment.ok();
121121
}
122122
/**
123123
* A {@link GraphQLSchemaVisitorEnvironment} environment specific to {@link GraphQLEnumType}
@@ -131,10 +131,10 @@ interface EnumTypeVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<Gra
131131
* @param enumType the schema element being visited
132132
* @param environment the visiting environment
133133
*
134-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
134+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
135135
*/
136-
default TraversalControl visitEnumType(GraphQLEnumType enumType, EnumTypeVisitorEnvironment environment) {
137-
return TraversalControl.CONTINUE;
136+
default GraphQLSchemaTraversalControl visitEnumType(GraphQLEnumType enumType, EnumTypeVisitorEnvironment environment) {
137+
return environment.ok();
138138
}
139139

140140
/**
@@ -150,10 +150,10 @@ interface EnumValueDefinitionVisitorEnvironment extends GraphQLSchemaVisitorEnvi
150150
* @param enumValueDefinition the schema element being visited
151151
* @param environment the visiting environment
152152
*
153-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
153+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
154154
*/
155-
default TraversalControl visitEnumValueDefinition(GraphQLEnumValueDefinition enumValueDefinition, EnumValueDefinitionVisitorEnvironment environment) {
156-
return TraversalControl.CONTINUE;
155+
default GraphQLSchemaTraversalControl visitEnumValueDefinition(GraphQLEnumValueDefinition enumValueDefinition, EnumValueDefinitionVisitorEnvironment environment) {
156+
return environment.ok();
157157
}
158158

159159

@@ -175,10 +175,10 @@ interface FieldDefinitionVisitorEnvironment extends GraphQLSchemaVisitorEnvironm
175175
* @param fieldDefinition the schema element being visited
176176
* @param environment the visiting environment
177177
*
178-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
178+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
179179
*/
180-
default TraversalControl visitFieldDefinition(GraphQLFieldDefinition fieldDefinition, FieldDefinitionVisitorEnvironment environment) {
181-
return TraversalControl.CONTINUE;
180+
default GraphQLSchemaTraversalControl visitFieldDefinition(GraphQLFieldDefinition fieldDefinition, FieldDefinitionVisitorEnvironment environment) {
181+
return environment.ok();
182182
}
183183

184184
/**
@@ -199,10 +199,10 @@ interface InputObjectFieldVisitorEnvironment extends GraphQLSchemaVisitorEnviron
199199
* @param inputObjectField the schema element being visited
200200
* @param environment the visiting environment
201201
*
202-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
202+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
203203
*/
204-
default TraversalControl visitInputObjectField(GraphQLInputObjectField inputObjectField, InputObjectFieldVisitorEnvironment environment) {
205-
return TraversalControl.CONTINUE;
204+
default GraphQLSchemaTraversalControl visitInputObjectField(GraphQLInputObjectField inputObjectField, InputObjectFieldVisitorEnvironment environment) {
205+
return environment.ok();
206206
}
207207

208208
/**
@@ -217,10 +217,10 @@ interface InputObjectTypeVisitorEnvironment extends GraphQLSchemaVisitorEnvironm
217217
* @param inputObjectType the schema element being visited
218218
* @param environment the visiting environment
219219
*
220-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
220+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
221221
*/
222-
default TraversalControl visitInputObjectType(GraphQLInputObjectType inputObjectType, InputObjectTypeVisitorEnvironment environment) {
223-
return TraversalControl.CONTINUE;
222+
default GraphQLSchemaTraversalControl visitInputObjectType(GraphQLInputObjectType inputObjectType, InputObjectTypeVisitorEnvironment environment) {
223+
return environment.ok();
224224
}
225225

226226
/**
@@ -235,10 +235,10 @@ interface InterfaceTypeVisitorEnvironment extends GraphQLSchemaVisitorEnvironmen
235235
* @param interfaceType the schema element being visited
236236
* @param environment the visiting environment
237237
*
238-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
238+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
239239
*/
240-
default TraversalControl visitInterfaceType(GraphQLInterfaceType interfaceType, InterfaceTypeVisitorEnvironment environment) {
241-
return TraversalControl.CONTINUE;
240+
default GraphQLSchemaTraversalControl visitInterfaceType(GraphQLInterfaceType interfaceType, InterfaceTypeVisitorEnvironment environment) {
241+
return environment.ok();
242242
}
243243

244244

@@ -254,10 +254,10 @@ interface ObjectVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<Graph
254254
* @param objectType the schema element being visited
255255
* @param environment the visiting environment
256256
*
257-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
257+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
258258
*/
259-
default TraversalControl visitObjectType(GraphQLObjectType objectType, ObjectVisitorEnvironment environment) {
260-
return TraversalControl.CONTINUE;
259+
default GraphQLSchemaTraversalControl visitObjectType(GraphQLObjectType objectType, ObjectVisitorEnvironment environment) {
260+
return environment.ok();
261261
}
262262

263263
/**
@@ -272,10 +272,10 @@ interface ScalarTypeVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<G
272272
* @param scalarType the schema element being visited
273273
* @param environment the visiting environment
274274
*
275-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
275+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
276276
*/
277-
default TraversalControl visitScalarType(GraphQLScalarType scalarType, ScalarTypeVisitorEnvironment environment) {
278-
return TraversalControl.CONTINUE;
277+
default GraphQLSchemaTraversalControl visitScalarType(GraphQLScalarType scalarType, ScalarTypeVisitorEnvironment environment) {
278+
return environment.ok();
279279
}
280280

281281
/**
@@ -290,10 +290,10 @@ interface UnionTypeVisitorEnvironment extends GraphQLSchemaVisitorEnvironment<Gr
290290
* @param unionType the schema element being visited
291291
* @param environment the visiting environment
292292
*
293-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
293+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
294294
*/
295-
default TraversalControl visitUnionType(GraphQLUnionType unionType, UnionTypeVisitorEnvironment environment) {
296-
return TraversalControl.CONTINUE;
295+
default GraphQLSchemaTraversalControl visitUnionType(GraphQLUnionType unionType, UnionTypeVisitorEnvironment environment) {
296+
return environment.ok();
297297
}
298298

299299

@@ -310,10 +310,10 @@ interface SchemaElementVisitorEnvironment extends GraphQLSchemaVisitorEnvironmen
310310
* @param schemaElement the schema element being visited
311311
* @param environment the visiting environment
312312
*
313-
* @return a control value which is typically {@link TraversalControl#CONTINUE}
313+
* @return a control value which is typically {@link GraphQLSchemaVisitorEnvironment#ok()}}
314314
*/
315-
default TraversalControl visitSchemaElement(GraphQLSchemaElement schemaElement, SchemaElementVisitorEnvironment environment) {
316-
return TraversalControl.CONTINUE;
315+
default GraphQLSchemaTraversalControl visitSchemaElement(GraphQLSchemaElement schemaElement, SchemaElementVisitorEnvironment environment) {
316+
return environment.ok();
317317
}
318318

319319
/**

0 commit comments

Comments
 (0)