diff --git a/.gitignore b/.gitignore
index b8b0f75b1f..e252fa8eaa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,4 +13,49 @@ docs/_build/
\.classpath
\.project
\.settings/
-/.nb-gradle/
\ No newline at end of file
+/.nb-gradle/
+
+HELP.md
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+out/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
\ No newline at end of file
diff --git a/src/main/java/graphql/GraphQL.java b/src/main/java/graphql/GraphQL.java
index d0242a48e3..e57b4a9683 100644
--- a/src/main/java/graphql/GraphQL.java
+++ b/src/main/java/graphql/GraphQL.java
@@ -1,20 +1,7 @@
package graphql;
-import graphql.execution.AbortExecutionException;
-import graphql.execution.AsyncExecutionStrategy;
-import graphql.execution.AsyncSerialExecutionStrategy;
-import graphql.execution.Execution;
-import graphql.execution.ExecutionId;
-import graphql.execution.ExecutionIdProvider;
-import graphql.execution.ExecutionStrategy;
-import graphql.execution.SubscriptionExecutionStrategy;
-import graphql.execution.ValueUnboxer;
-import graphql.execution.instrumentation.ChainedInstrumentation;
-import graphql.execution.instrumentation.DocumentAndVariables;
-import graphql.execution.instrumentation.Instrumentation;
-import graphql.execution.instrumentation.InstrumentationContext;
-import graphql.execution.instrumentation.InstrumentationState;
-import graphql.execution.instrumentation.SimpleInstrumentation;
+import graphql.execution.*;
+import graphql.execution.instrumentation.*;
import graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation;
import graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters;
import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters;
@@ -38,6 +25,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;
@@ -50,15 +38,15 @@
* This class is where all graphql-java query execution begins. It combines the objects that are needed
* to make a successful graphql query, with the most important being the {@link graphql.schema.GraphQLSchema schema}
* and the {@link graphql.execution.ExecutionStrategy execution strategy}
- *
+ *
* Building this object is very cheap and can be done on each execution if necessary. Building the schema is often not
* as cheap, especially if its parsed from graphql IDL schema format via {@link graphql.schema.idl.SchemaParser}.
- *
+ *
* The data for a query is returned via {@link ExecutionResult#getData()} and any errors encountered as placed in
* {@link ExecutionResult#getErrors()}.
*
*
Runtime Exceptions
- *
+ *
* Runtime exceptions can be thrown by the graphql engine if certain situations are encountered. These are not errors
* in execution but rather totally unacceptable conditions in which to execute a graphql query.
*
@@ -112,7 +100,6 @@ public class GraphQL {
* A GraphQL object ready to execute queries
*
* @param graphQLSchema the schema to use
- *
* @deprecated use the {@link #newGraphQL(GraphQLSchema)} builder instead. This will be removed in a future version.
*/
@Internal
@@ -127,7 +114,6 @@ public GraphQL(GraphQLSchema graphQLSchema) {
*
* @param graphQLSchema the schema to use
* @param queryStrategy the query execution strategy to use
- *
* @deprecated use the {@link #newGraphQL(GraphQLSchema)} builder instead. This will be removed in a future version.
*/
@Internal
@@ -143,7 +129,6 @@ public GraphQL(GraphQLSchema graphQLSchema, ExecutionStrategy queryStrategy) {
* @param graphQLSchema the schema to use
* @param queryStrategy the query execution strategy to use
* @param mutationStrategy the mutation execution strategy to use
- *
* @deprecated use the {@link #newGraphQL(GraphQLSchema)} builder instead. This will be removed in a future version.
*/
@Internal
@@ -159,7 +144,6 @@ public GraphQL(GraphQLSchema graphQLSchema, ExecutionStrategy queryStrategy, Exe
* @param queryStrategy the query execution strategy to use
* @param mutationStrategy the mutation execution strategy to use
* @param subscriptionStrategy the subscription execution strategy to use
- *
* @deprecated use the {@link #newGraphQL(GraphQLSchema)} builder instead. This will be removed in a future version.
*/
@Internal
@@ -190,19 +174,21 @@ private GraphQL(GraphQLSchema graphQLSchema,
* Helps you build a GraphQL object ready to execute queries
*
* @param graphQLSchema the schema to use
- *
* @return a builder of GraphQL objects
*/
public static Builder newGraphQL(GraphQLSchema graphQLSchema) {
return new Builder(graphQLSchema);
}
+ public static Builder newGraphQL(GraphQLSchema graphQLSchema, BiFunction updateLocalContextMethod) {
+ return new Builder(graphQLSchema, updateLocalContextMethod);
+ }
+
/**
* This helps you transform the current GraphQL object into another one by starting a builder with all
* the current values and allows you to transform it how you want.
*
* @param builderConsumer the consumer code that will be given a builder to transform
- *
* @return a new GraphQL object based on calling build on that builder
*/
public GraphQL transform(Consumer builderConsumer) {
@@ -241,6 +227,12 @@ public Builder(GraphQLSchema graphQLSchema) {
this.graphQLSchema = graphQLSchema;
}
+ public Builder(GraphQLSchema graphQLSchema, BiFunction updateLocalContextMethod) {
+ this.graphQLSchema = graphQLSchema;
+ this.queryExecutionStrategy = new AsyncExecutionStrategy(updateLocalContextMethod);
+
+ }
+
public Builder schema(GraphQLSchema graphQLSchema) {
this.graphQLSchema = assertNotNull(graphQLSchema, "GraphQLSchema must be non null");
return this;
@@ -311,7 +303,6 @@ public GraphQL build() {
* Executes the specified graphql query/mutation/subscription
*
* @param query the query/mutation/subscription
- *
* @return an {@link ExecutionResult} which can include errors
*/
public ExecutionResult execute(String query) {
@@ -326,9 +317,7 @@ public ExecutionResult execute(String query) {
*
* @param query the query/mutation/subscription
* @param context custom object provided to each {@link graphql.schema.DataFetcher}
- *
* @return an {@link ExecutionResult} which can include errors
- *
* @deprecated Use {@link #execute(ExecutionInput)}
*/
@Deprecated
@@ -347,9 +336,7 @@ public ExecutionResult execute(String query, Object context) {
* @param query the query/mutation/subscription
* @param operationName the name of the operation to execute
* @param context custom object provided to each {@link graphql.schema.DataFetcher}
- *
* @return an {@link ExecutionResult} which can include errors
- *
* @deprecated Use {@link #execute(ExecutionInput)}
*/
@Deprecated
@@ -369,9 +356,7 @@ public ExecutionResult execute(String query, String operationName, Object contex
* @param query the query/mutation/subscription
* @param context custom object provided to each {@link graphql.schema.DataFetcher}
* @param variables variable values uses as argument
- *
* @return an {@link ExecutionResult} which can include errors
- *
* @deprecated Use {@link #execute(ExecutionInput)}
*/
@Deprecated
@@ -392,9 +377,7 @@ public ExecutionResult execute(String query, Object context, Map
* @param operationName name of the operation to execute
* @param context custom object provided to each {@link graphql.schema.DataFetcher}
* @param variables variable values uses as argument
- *
* @return an {@link ExecutionResult} which can include errors
- *
* @deprecated Use {@link #execute(ExecutionInput)}
*/
@Deprecated
@@ -413,7 +396,6 @@ public ExecutionResult execute(String query, String operationName, Object contex
* Executes the graphql query using the provided input object builder
*
* @param executionInputBuilder {@link ExecutionInput.Builder}
- *
* @return an {@link ExecutionResult} which can include errors
*/
public ExecutionResult execute(ExecutionInput.Builder executionInputBuilder) {
@@ -431,7 +413,6 @@ public ExecutionResult execute(ExecutionInput.Builder executionInputBuilder) {
*
*
* @param builderFunction a function that is given a {@link ExecutionInput.Builder}
- *
* @return an {@link ExecutionResult} which can include errors
*/
public ExecutionResult execute(UnaryOperator builderFunction) {
@@ -442,7 +423,6 @@ public ExecutionResult execute(UnaryOperator builderFunc
* Executes the graphql query using the provided input object
*
* @param executionInput {@link ExecutionInput}
- *
* @return an {@link ExecutionResult} which can include errors
*/
public ExecutionResult execute(ExecutionInput executionInput) {
@@ -464,7 +444,6 @@ public ExecutionResult execute(ExecutionInput executionInput) {
* which is the result of executing the provided query.
*
* @param executionInputBuilder {@link ExecutionInput.Builder}
- *
* @return a promise to an {@link ExecutionResult} which can include errors
*/
public CompletableFuture executeAsync(ExecutionInput.Builder executionInputBuilder) {
@@ -485,7 +464,6 @@ public CompletableFuture executeAsync(ExecutionInput.Builder ex
*
*
* @param builderFunction a function that is given a {@link ExecutionInput.Builder}
- *
* @return a promise to an {@link ExecutionResult} which can include errors
*/
public CompletableFuture executeAsync(UnaryOperator builderFunction) {
@@ -499,7 +477,6 @@ public CompletableFuture executeAsync(UnaryOperator executeAsync(ExecutionInput executionInput) {
diff --git a/src/main/java/graphql/execution/AbstractAsyncExecutionStrategy.java b/src/main/java/graphql/execution/AbstractAsyncExecutionStrategy.java
index c2bb3b096e..e3781a63ad 100644
--- a/src/main/java/graphql/execution/AbstractAsyncExecutionStrategy.java
+++ b/src/main/java/graphql/execution/AbstractAsyncExecutionStrategy.java
@@ -8,6 +8,7 @@
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
public abstract class AbstractAsyncExecutionStrategy extends ExecutionStrategy {
@@ -19,6 +20,10 @@ public AbstractAsyncExecutionStrategy(DataFetcherExceptionHandler dataFetcherExc
super(dataFetcherExceptionHandler);
}
+ public AbstractAsyncExecutionStrategy(BiFunction updateLocalContextMethod) {
+ super(updateLocalContextMethod);
+ }
+
protected BiConsumer, Throwable> handleResults(ExecutionContext executionContext, List fieldNames, CompletableFuture overallResult) {
return (List results, Throwable exception) -> {
if (exception != null) {
diff --git a/src/main/java/graphql/execution/AsyncExecutionStrategy.java b/src/main/java/graphql/execution/AsyncExecutionStrategy.java
index f5a33b0452..27a9cbf80c 100644
--- a/src/main/java/graphql/execution/AsyncExecutionStrategy.java
+++ b/src/main/java/graphql/execution/AsyncExecutionStrategy.java
@@ -18,6 +18,7 @@
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -44,6 +45,10 @@ public AsyncExecutionStrategy(DataFetcherExceptionHandler exceptionHandler) {
super(exceptionHandler);
}
+ public AsyncExecutionStrategy(BiFunction updateLocalContextMethod) {
+ super(updateLocalContextMethod);
+ }
+
@Override
@SuppressWarnings("FutureReturnValueIgnored")
public CompletableFuture execute(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException {
diff --git a/src/main/java/graphql/execution/ExecutionStrategy.java b/src/main/java/graphql/execution/ExecutionStrategy.java
index ea51cd308f..fd4eabe75a 100644
--- a/src/main/java/graphql/execution/ExecutionStrategy.java
+++ b/src/main/java/graphql/execution/ExecutionStrategy.java
@@ -1,14 +1,6 @@
package graphql.execution;
-import graphql.ExecutionResult;
-import graphql.ExecutionResultImpl;
-import graphql.GraphQLError;
-import graphql.Internal;
-import graphql.PublicSpi;
-import graphql.SerializationError;
-import graphql.TrivialDataFetcher;
-import graphql.TypeMismatchError;
-import graphql.UnresolvedTypeError;
+import graphql.*;
import graphql.execution.directives.QueryDirectivesImpl;
import graphql.execution.instrumentation.Instrumentation;
import graphql.execution.instrumentation.InstrumentationContext;
@@ -18,40 +10,21 @@
import graphql.introspection.Introspection;
import graphql.language.Argument;
import graphql.language.Field;
-import graphql.schema.CoercingSerializeException;
-import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
-import graphql.schema.DataFetchingFieldSelectionSet;
-import graphql.schema.DataFetchingFieldSelectionSetImpl;
-import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLEnumType;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLOutputType;
-import graphql.schema.GraphQLScalarType;
-import graphql.schema.GraphQLSchema;
-import graphql.schema.GraphQLType;
+import graphql.schema.*;
import graphql.util.FpKit;
import graphql.util.LogKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
+import java.util.function.BiFunction;
import static graphql.execution.Async.exceptionallyCompletedFuture;
import static graphql.execution.ExecutionStepInfo.newExecutionStepInfo;
import static graphql.execution.FieldCollectorParameters.newParameters;
-import static graphql.execution.FieldValueInfo.CompleteValueType.ENUM;
-import static graphql.execution.FieldValueInfo.CompleteValueType.LIST;
-import static graphql.execution.FieldValueInfo.CompleteValueType.NULL;
-import static graphql.execution.FieldValueInfo.CompleteValueType.OBJECT;
-import static graphql.execution.FieldValueInfo.CompleteValueType.SCALAR;
+import static graphql.execution.FieldValueInfo.CompleteValueType.*;
import static graphql.schema.DataFetchingEnvironmentImpl.newDataFetchingEnvironment;
import static graphql.schema.GraphQLTypeUtil.isList;
import static java.util.concurrent.CompletableFuture.completedFuture;
@@ -122,6 +95,7 @@ public abstract class ExecutionStrategy {
private final ResolveType resolvedType = new ResolveType();
protected final DataFetcherExceptionHandler dataFetcherExceptionHandler;
+ protected final BiFunction updateLocalContext;
/**
* The default execution strategy constructor uses the {@link SimpleDataFetcherExceptionHandler}
@@ -129,6 +103,7 @@ public abstract class ExecutionStrategy {
*/
protected ExecutionStrategy() {
dataFetcherExceptionHandler = new SimpleDataFetcherExceptionHandler();
+ updateLocalContext = null;
}
/**
@@ -139,6 +114,12 @@ protected ExecutionStrategy() {
*/
protected ExecutionStrategy(DataFetcherExceptionHandler dataFetcherExceptionHandler) {
this.dataFetcherExceptionHandler = dataFetcherExceptionHandler;
+ updateLocalContext = null;
+ }
+
+ public ExecutionStrategy(BiFunction updateLocalContextMethod) {
+ dataFetcherExceptionHandler = new SimpleDataFetcherExceptionHandler();
+ updateLocalContext = updateLocalContextMethod;
}
/**
@@ -146,9 +127,7 @@ protected ExecutionStrategy(DataFetcherExceptionHandler dataFetcherExceptionHand
*
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
- *
* @return a promise to an {@link ExecutionResult}
- *
* @throws NonNullableFieldWasNullException in the future if a non null field resolves to a null value
*/
public abstract CompletableFuture execute(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException;
@@ -164,9 +143,7 @@ protected ExecutionStrategy(DataFetcherExceptionHandler dataFetcherExceptionHand
*
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
- *
* @return a promise to an {@link ExecutionResult}
- *
* @throws NonNullableFieldWasNullException in the future if a non null field resolves to a null value
*/
protected CompletableFuture resolveField(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
@@ -184,9 +161,7 @@ protected CompletableFuture resolveField(ExecutionContext execu
*
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
- *
* @return a promise to a {@link FieldValueInfo}
- *
* @throws NonNullableFieldWasNullException in the {@link FieldValueInfo#getFieldValue()} future if a non null field resolves to a null value
*/
protected CompletableFuture resolveFieldWithInfo(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
@@ -224,9 +199,7 @@ protected CompletableFuture resolveFieldWithInfoToNull(Execution
*
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
- *
* @return a promise to a fetched object
- *
* @throws NonNullableFieldWasNullException in the future if a non null field resolves to a null value
*/
protected CompletableFuture fetchField(ExecutionContext executionContext, ExecutionStrategyParameters parameters) {
@@ -296,7 +269,6 @@ protected CompletableFuture fetchField(ExecutionContext executionC
FetchedValue unboxPossibleDataFetcherResult(ExecutionContext executionContext,
ExecutionStrategyParameters parameters,
Object result) {
-
if (result instanceof DataFetcherResult) {
//noinspection unchecked
DataFetcherResult> dataFetcherResult = (DataFetcherResult) result;
@@ -320,10 +292,15 @@ FetchedValue unboxPossibleDataFetcherResult(ExecutionContext executionContext,
.localContext(localContext)
.build();
} else {
+ Object localContext = parameters.getLocalContext();
+ if (updateLocalContext != null) {
+ localContext = updateLocalContext.apply(localContext, result);
+ }
+
return FetchedValue.newFetchedValue()
.fetchedValue(executionContext.getValueUnboxer().unbox(result))
.rawFetchedValue(result)
- .localContext(parameters.getLocalContext())
+ .localContext(localContext)
.build();
}
}
@@ -355,9 +332,7 @@ private void handleFetchingException(ExecutionContext executionContext,
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
* @param fetchedValue the fetched raw value
- *
* @return a {@link FieldValueInfo}
- *
* @throws NonNullableFieldWasNullException in the {@link FieldValueInfo#getFieldValue()} future if a non null field resolves to a null value
*/
protected FieldValueInfo completeField(ExecutionContext executionContext, ExecutionStrategyParameters parameters, FetchedValue fetchedValue) {
@@ -407,9 +382,7 @@ protected FieldValueInfo completeField(ExecutionContext executionContext, Execut
*
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
- *
* @return a {@link FieldValueInfo}
- *
* @throws NonNullableFieldWasNullException if a non null field resolves to a null value
*/
protected FieldValueInfo completeValue(ExecutionContext executionContext, ExecutionStrategyParameters parameters) throws NonNullableFieldWasNullException {
@@ -471,7 +444,6 @@ private CompletableFuture completeValueForNull(ExecutionStrateg
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
* @param result the result to complete, raw result
- *
* @return a {@link FieldValueInfo}
*/
protected FieldValueInfo completeValueForList(ExecutionContext executionContext, ExecutionStrategyParameters parameters, Object result) {
@@ -494,7 +466,6 @@ protected FieldValueInfo completeValueForList(ExecutionContext executionContext,
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
* @param iterableValues the values to complete, can't be null
- *
* @return a {@link FieldValueInfo}
*/
protected FieldValueInfo completeValueForList(ExecutionContext executionContext, ExecutionStrategyParameters parameters, Iterable iterableValues) {
@@ -570,7 +541,6 @@ protected FieldValueInfo completeValueForList(ExecutionContext executionContext,
* @param parameters contains the parameters holding the fields to be executed and source object
* @param scalarType the type of the scalar
* @param result the result to be coerced
- *
* @return a promise to an {@link ExecutionResult}
*/
protected CompletableFuture completeValueForScalar(ExecutionContext executionContext, ExecutionStrategyParameters parameters, GraphQLScalarType scalarType, Object result) {
@@ -601,7 +571,6 @@ protected CompletableFuture completeValueForScalar(ExecutionCon
* @param parameters contains the parameters holding the fields to be executed and source object
* @param enumType the type of the enum
* @param result the result to be coerced
- *
* @return a promise to an {@link ExecutionResult}
*/
protected CompletableFuture completeValueForEnum(ExecutionContext executionContext, ExecutionStrategyParameters parameters, GraphQLEnumType enumType, Object result) {
@@ -626,7 +595,6 @@ protected CompletableFuture completeValueForEnum(ExecutionConte
* @param parameters contains the parameters holding the fields to be executed and source object
* @param resolvedObjectType the resolved object type
* @param result the result to be coerced
- *
* @return a promise to an {@link ExecutionResult}
*/
protected CompletableFuture completeValueForObject(ExecutionContext executionContext, ExecutionStrategyParameters parameters, GraphQLObjectType resolvedObjectType, Object result) {
@@ -672,9 +640,7 @@ private Object handleCoercionProblem(ExecutionContext context, ExecutionStrategy
* Converts an object that is known to should be an Iterable into one
*
* @param result the result object
- *
* @return an Iterable from that object
- *
* @throws java.lang.ClassCastException if its not an Iterable
*/
@SuppressWarnings("unchecked")
@@ -711,7 +677,6 @@ private void handleTypeMismatchProblem(ExecutionContext context, ExecutionStrate
* @param executionContext contains the top level execution parameters
* @param parameters contains the parameters holding the fields to be executed and source object
* @param field the field to find the definition of
- *
* @return a {@link GraphQLFieldDefinition}
*/
protected GraphQLFieldDefinition getFieldDef(ExecutionContext executionContext, ExecutionStrategyParameters parameters, Field field) {
@@ -725,7 +690,6 @@ protected GraphQLFieldDefinition getFieldDef(ExecutionContext executionContext,
* @param schema the schema in play
* @param parentType the parent type of the field
* @param field the field to find the definition of
- *
* @return a {@link GraphQLFieldDefinition}
*/
protected GraphQLFieldDefinition getFieldDef(GraphQLSchema schema, GraphQLObjectType parentType, Field field) {
@@ -743,7 +707,6 @@ protected GraphQLFieldDefinition getFieldDef(GraphQLSchema schema, GraphQLObject
*
* @param e this indicates that a null value was returned for a non null field, which needs to cause the parent field
* to become null OR continue on as an exception
- *
* @throws NonNullableFieldWasNullException if a non null field resolves to a null value
*/
protected void assertNonNullFieldPrecondition(NonNullableFieldWasNullException e) throws NonNullableFieldWasNullException {
@@ -791,7 +754,6 @@ protected ExecutionResult handleNonNullException(ExecutionContext executionConte
* @param parameters contains the parameters holding the fields to be executed and source object
* @param fieldDefinition the field definition to build type info for
* @param fieldContainer the field container
- *
* @return a new type info
*/
protected ExecutionStepInfo createExecutionStepInfo(ExecutionContext executionContext,