Skip to content

Commit 0886c26

Browse files
authored
Added locale to execution input and then finally to DataFetcherEnv (#1576)
* Added locale to execution input and then finally to DataFetcherEnv * Make is pass unit tests * Missing during merge?? * Put the newStatics back
1 parent a634053 commit 0886c26

File tree

9 files changed

+140
-33
lines changed

9 files changed

+140
-33
lines changed

src/main/java/graphql/ExecutionInput.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.dataloader.DataLoaderRegistry;
77

88
import java.util.Collections;
9+
import java.util.Locale;
910
import java.util.Map;
1011
import java.util.function.Consumer;
1112
import java.util.function.UnaryOperator;
@@ -25,10 +26,11 @@ public class ExecutionInput {
2526
private final DataLoaderRegistry dataLoaderRegistry;
2627
private final CacheControl cacheControl;
2728
private final ExecutionId executionId;
29+
private final Locale locale;
2830

2931

3032
@Internal
31-
private ExecutionInput(String query, String operationName, Object context, Object root, Map<String, Object> variables, DataLoaderRegistry dataLoaderRegistry, CacheControl cacheControl, ExecutionId executionId) {
33+
private ExecutionInput(String query, String operationName, Object context, Object root, Map<String, Object> variables, DataLoaderRegistry dataLoaderRegistry, CacheControl cacheControl, ExecutionId executionId, Locale locale) {
3234
this.query = assertNotNull(query, "query can't be null");
3335
this.operationName = operationName;
3436
this.context = context;
@@ -37,6 +39,7 @@ private ExecutionInput(String query, String operationName, Object context, Objec
3739
this.dataLoaderRegistry = dataLoaderRegistry;
3840
this.cacheControl = cacheControl;
3941
this.executionId = executionId;
42+
this.locale = locale;
4043
}
4144

4245
/**
@@ -95,6 +98,15 @@ public ExecutionId getExecutionId() {
9598
return executionId;
9699
}
97100

101+
/**
102+
* This returns the locale of this operation.
103+
*
104+
* @return the locale of this operation
105+
*/
106+
public Locale getLocale() {
107+
return locale;
108+
}
109+
98110
/**
99111
* This helps you transform the current ExecutionInput object into another one by starting a builder with all
100112
* the current values and allows you to transform it how you want.
@@ -111,14 +123,14 @@ public ExecutionInput transform(Consumer<Builder> builderConsumer) {
111123
.dataLoaderRegistry(this.dataLoaderRegistry)
112124
.cacheControl(this.cacheControl)
113125
.variables(this.variables)
114-
.executionId(executionId);
126+
.executionId(this.executionId)
127+
.locale(this.locale);
115128

116129
builderConsumer.accept(builder);
117130

118131
return builder.build();
119132
}
120133

121-
122134
@Override
123135
public String toString() {
124136
return "ExecutionInput{" +
@@ -129,6 +141,7 @@ public String toString() {
129141
", variables=" + variables +
130142
", dataLoaderRegistry=" + dataLoaderRegistry +
131143
", executionId= " + executionId +
144+
", locale= " + locale +
132145
'}';
133146
}
134147

@@ -162,7 +175,8 @@ public static class Builder {
162175
//
163176
private DataLoaderRegistry dataLoaderRegistry = DataLoaderDispatcherInstrumentationState.EMPTY_DATALOADER_REGISTRY;
164177
private CacheControl cacheControl = CacheControl.newCacheControl();
165-
private ExecutionId executionId = null;
178+
private Locale locale;
179+
private ExecutionId executionId;
166180

167181
public Builder query(String query) {
168182
this.query = assertNotNull(query, "query can't be null");
@@ -185,6 +199,19 @@ public Builder executionId(ExecutionId executionId) {
185199
return this;
186200
}
187201

202+
203+
/**
204+
* Sets the locale to use for this operation
205+
*
206+
* @param locale the locale to use
207+
*
208+
* @return this builder
209+
*/
210+
public Builder locale(Locale locale) {
211+
this.locale = locale;
212+
return this;
213+
}
214+
188215
/**
189216
* By default you will get a {@link GraphQLContext} object but you can set your own.
190217
*
@@ -236,7 +263,7 @@ public Builder cacheControl(CacheControl cacheControl) {
236263
}
237264

238265
public ExecutionInput build() {
239-
return new ExecutionInput(query, operationName, context, root, variables, dataLoaderRegistry, cacheControl, executionId);
266+
return new ExecutionInput(query, operationName, context, root, variables, dataLoaderRegistry, cacheControl, executionId, locale);
240267
}
241268
}
242269
}

src/main/java/graphql/execution/Execution.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public CompletableFuture<ExecutionResult> execute(Document document, GraphQLSche
9292
.operationDefinition(operationDefinition)
9393
.dataLoaderRegistry(executionInput.getDataLoaderRegistry())
9494
.cacheControl(executionInput.getCacheControl())
95+
.locale(executionInput.getLocale())
9596
.build();
9697

9798

src/main/java/graphql/execution/ExecutionContext.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.Collections;
1818
import java.util.HashSet;
1919
import java.util.List;
20+
import java.util.Locale;
2021
import java.util.Map;
2122
import java.util.Set;
2223
import java.util.concurrent.CopyOnWriteArrayList;
@@ -43,10 +44,11 @@ public class ExecutionContext {
4344
private final Set<ExecutionPath> errorPaths = new HashSet<>();
4445
private final DataLoaderRegistry dataLoaderRegistry;
4546
private final CacheControl cacheControl;
47+
private final Locale locale;
4648
private final DeferSupport deferSupport = new DeferSupport();
4749

4850
@Internal
49-
ExecutionContext(Instrumentation instrumentation, ExecutionId executionId, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState, ExecutionStrategy queryStrategy, ExecutionStrategy mutationStrategy, ExecutionStrategy subscriptionStrategy, Map<String, FragmentDefinition> fragmentsByName, Document document, OperationDefinition operationDefinition, Map<String, Object> variables, Object context, Object root, DataLoaderRegistry dataLoaderRegistry, CacheControl cacheControl, List<GraphQLError> startingErrors) {
51+
ExecutionContext(Instrumentation instrumentation, ExecutionId executionId, GraphQLSchema graphQLSchema, InstrumentationState instrumentationState, ExecutionStrategy queryStrategy, ExecutionStrategy mutationStrategy, ExecutionStrategy subscriptionStrategy, Map<String, FragmentDefinition> fragmentsByName, Document document, OperationDefinition operationDefinition, Map<String, Object> variables, Object context, Object root, DataLoaderRegistry dataLoaderRegistry, CacheControl cacheControl, Locale locale, List<GraphQLError> startingErrors) {
5052
this.graphQLSchema = graphQLSchema;
5153
this.executionId = executionId;
5254
this.instrumentationState = instrumentationState;
@@ -62,6 +64,7 @@ public class ExecutionContext {
6264
this.instrumentation = instrumentation;
6365
this.dataLoaderRegistry = dataLoaderRegistry;
6466
this.cacheControl = cacheControl;
67+
this.locale = locale;
6568
this.errors.addAll(startingErrors);
6669
}
6770

@@ -120,6 +123,10 @@ public CacheControl getCacheControl() {
120123
return cacheControl;
121124
}
122125

126+
public Locale getLocale() {
127+
return locale;
128+
}
129+
123130
/**
124131
* This method will only put one error per field path.
125132
*

src/main/java/graphql/execution/ExecutionContextBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.ArrayList;
1616
import java.util.LinkedHashMap;
1717
import java.util.List;
18+
import java.util.Locale;
1819
import java.util.Map;
1920

2021
import static graphql.Assert.assertNotNull;
@@ -37,6 +38,7 @@ public class ExecutionContextBuilder {
3738
private Map<String, FragmentDefinition> fragmentsByName = new LinkedHashMap<>();
3839
private DataLoaderRegistry dataLoaderRegistry;
3940
private CacheControl cacheControl;
41+
private Locale locale;
4042
private List<GraphQLError> errors = new ArrayList<>();
4143

4244
/**
@@ -78,6 +80,7 @@ public ExecutionContextBuilder() {
7880
fragmentsByName = new LinkedHashMap<>(other.getFragmentsByName());
7981
dataLoaderRegistry = other.getDataLoaderRegistry();
8082
cacheControl = other.getCacheControl();
83+
locale = other.getLocale();
8184
errors = new ArrayList<>(other.getErrors());
8285
}
8386

@@ -156,6 +159,11 @@ public ExecutionContextBuilder cacheControl(CacheControl cacheControl) {
156159
return this;
157160
}
158161

162+
public ExecutionContextBuilder locale(Locale locale) {
163+
this.locale = locale;
164+
return this;
165+
}
166+
159167
public ExecutionContext build() {
160168
// preconditions
161169
assertNotNull(executionId, "You must provide a query identifier");
@@ -176,6 +184,7 @@ public ExecutionContext build() {
176184
root,
177185
dataLoaderRegistry,
178186
cacheControl,
187+
locale,
179188
errors
180189
);
181190
}

src/main/java/graphql/language/Node.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public interface Node<T extends Node> extends Serializable {
6868
*
6969
* <p>
7070
* NOTE: The reason this is a map of strings is so the Node
71-
* can stay an immutable object, which Map String,Object would not allow
71+
* can stay an immutable object, which Map&lt;String,Object&gt; would not allow
7272
* say.
7373
*
7474
* @return the map of additional data about this node

src/main/java/graphql/schema/DataFetchingEnvironment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.dataloader.DataLoaderRegistry;
1515

1616
import java.util.List;
17+
import java.util.Locale;
1718
import java.util.Map;
1819

1920

@@ -215,6 +216,11 @@ public interface DataFetchingEnvironment {
215216
*/
216217
CacheControl getCacheControl();
217218

219+
/**
220+
* @return the current {@link java.util.Locale} instance used for this request
221+
*/
222+
Locale getLocale();
223+
218224
/**
219225
* @return the current operation that is being executed
220226
*/

src/main/java/graphql/schema/DataFetchingEnvironmentImpl.java

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Collections;
1919
import java.util.List;
20+
import java.util.Locale;
2021
import java.util.Map;
2122

2223
@SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
@@ -38,6 +39,7 @@ public class DataFetchingEnvironmentImpl implements DataFetchingEnvironment {
3839
private final ExecutionStepInfo executionStepInfo;
3940
private final DataLoaderRegistry dataLoaderRegistry;
4041
private final CacheControl cacheControl;
42+
private final Locale locale;
4143
private final OperationDefinition operationDefinition;
4244
private final Document document;
4345
private final Map<String, Object> variables;
@@ -60,12 +62,40 @@ private DataFetchingEnvironmentImpl(Builder builder) {
6062
this.executionStepInfo = builder.executionStepInfo;
6163
this.dataLoaderRegistry = builder.dataLoaderRegistry;
6264
this.cacheControl = builder.cacheControl;
65+
this.locale = builder.locale;
6366
this.operationDefinition = builder.operationDefinition;
6467
this.document = builder.document;
6568
this.variables = builder.variables == null ? Collections.emptyMap() : builder.variables;
6669
this.queryDirectives = builder.queryDirectives;
6770
}
6871

72+
/**
73+
* @return a new {@link graphql.schema.DataFetchingEnvironmentImpl.Builder}
74+
*/
75+
public static Builder newDataFetchingEnvironment() {
76+
return new Builder();
77+
}
78+
79+
public static Builder newDataFetchingEnvironment(DataFetchingEnvironment environment) {
80+
return new Builder((DataFetchingEnvironmentImpl) environment);
81+
}
82+
83+
public static Builder newDataFetchingEnvironment(ExecutionContext executionContext) {
84+
return new Builder()
85+
.context(executionContext.getContext())
86+
.root(executionContext.getRoot())
87+
.graphQLSchema(executionContext.getGraphQLSchema())
88+
.fragmentsByName(executionContext.getFragmentsByName())
89+
.dataLoaderRegistry(executionContext.getDataLoaderRegistry())
90+
.cacheControl(executionContext.getCacheControl())
91+
.locale(executionContext.getLocale())
92+
.locale(executionContext.getLocale())
93+
.document(executionContext.getDocument())
94+
.operationDefinition(executionContext.getOperationDefinition())
95+
.variables(executionContext.getVariables())
96+
.executionId(executionContext.getExecutionId());
97+
}
98+
6999
@Override
70100
public <T> T getSource() {
71101
return (T) source;
@@ -181,6 +211,11 @@ public CacheControl getCacheControl() {
181211
return cacheControl;
182212
}
183213

214+
@Override
215+
public Locale getLocale() {
216+
return locale;
217+
}
218+
184219
@Override
185220
public OperationDefinition getOperationDefinition() {
186221
return operationDefinition;
@@ -203,31 +238,6 @@ public String toString() {
203238
'}';
204239
}
205240

206-
/**
207-
* @return a new {@link graphql.schema.DataFetchingEnvironmentImpl.Builder}
208-
*/
209-
public static Builder newDataFetchingEnvironment() {
210-
return new Builder();
211-
}
212-
213-
public static Builder newDataFetchingEnvironment(DataFetchingEnvironment environment) {
214-
return new Builder((DataFetchingEnvironmentImpl) environment);
215-
}
216-
217-
public static Builder newDataFetchingEnvironment(ExecutionContext executionContext) {
218-
return new Builder()
219-
.context(executionContext.getContext())
220-
.root(executionContext.getRoot())
221-
.graphQLSchema(executionContext.getGraphQLSchema())
222-
.fragmentsByName(executionContext.getFragmentsByName())
223-
.dataLoaderRegistry(executionContext.getDataLoaderRegistry())
224-
.cacheControl(executionContext.getCacheControl())
225-
.document(executionContext.getDocument())
226-
.operationDefinition(executionContext.getOperationDefinition())
227-
.variables(executionContext.getVariables())
228-
.executionId(executionContext.getExecutionId());
229-
}
230-
231241
public static class Builder {
232242

233243
private Object source;
@@ -244,6 +254,7 @@ public static class Builder {
244254
private ExecutionStepInfo executionStepInfo;
245255
private DataLoaderRegistry dataLoaderRegistry;
246256
private CacheControl cacheControl;
257+
private Locale locale;
247258
private OperationDefinition operationDefinition;
248259
private Document document;
249260
private Map<String, Object> arguments;
@@ -268,6 +279,7 @@ public Builder(DataFetchingEnvironmentImpl env) {
268279
this.executionStepInfo = env.executionStepInfo;
269280
this.dataLoaderRegistry = env.dataLoaderRegistry;
270281
this.cacheControl = env.cacheControl;
282+
this.localContext = env.locale;
271283
this.operationDefinition = env.operationDefinition;
272284
this.document = env.document;
273285
this.variables = env.variables;
@@ -357,6 +369,11 @@ public Builder cacheControl(CacheControl cacheControl) {
357369
return this;
358370
}
359371

372+
public Builder locale(Locale locale) {
373+
this.locale = locale;
374+
return this;
375+
}
376+
360377
public Builder operationDefinition(OperationDefinition operationDefinition) {
361378
this.operationDefinition = operationDefinition;
362379
return this;

0 commit comments

Comments
 (0)