提交 2f4ca869 编写于 作者: B Bogdan Kobylynskyi

Merge branch 'master' into 178-generated

......@@ -20,7 +20,7 @@ repositories {
dependencies {
implementation "org.freemarker:freemarker:2.3.30"
implementation "com.graphql-java:graphql-java:15.0"
implementation "com.fasterxml.jackson.core:jackson-databind:2.11.0"
implementation "com.fasterxml.jackson.core:jackson-databind:2.11.1"
implementation "org.projectlombok:lombok:1.18.12"
annotationProcessor "org.projectlombok:lombok:1.18.12"
......@@ -46,6 +46,19 @@ task codeCoverageReport(type: JacocoReport) {
}
}
test {
testLogging {
events "failed"
showExceptions true
exceptionFormat "full"
showCauses true
showStackTraces true
showStandardStreams = false
}
}
codeCoverageReport.dependsOn test
......
......@@ -17,18 +17,21 @@
| `generateImmutableModels` | Boolean | False | Specifies whether generated model classes should be immutable. |
| `generateToString` | Boolean | False | Specifies whether generated model classes should have toString method defined. |
| `apiNamePrefix` | String | Empty | Sets the prefix for GraphQL api classes (query, mutation, subscription). |
| `apiNameSuffix` | String | Resolver | Sets the suffix for GraphQL api classes (query, mutation, subscription). |
| `apiNameSuffix` | String | `Resolver` | Sets the suffix for GraphQL api classes (query, mutation, subscription). |
| `apiRootInterfaceStrategy` | *See [ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* | `SINGLE_INTERFACE` | |
| `apiNamePrefixStrategy` | *See [ApiNamePrefixStrategy](#option-apinameprefixstrategy)* | `CONSTANT` | |
| `modelNamePrefix` | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). |
| `modelNameSuffix` | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). |
| `modelValidationAnnotation` | String | @javax.validation.<br>constraints.NotNull | Annotation for mandatory (NonNull) fields. Can be null/empty. |
| `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. |
| `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. |
| `customTypesMapping` | Map(String,String) | Empty | Can be used to supply custom mappings for scalars. <br/> Supports:<br/> * Map of (GraphqlObjectName.fieldName) to (JavaType) <br/> * Map of (GraphqlType) to (JavaType) |
| `customAnnotationsMapping` | Map(String,String) | Empty | Can be used to supply custom annotations (serializers) for scalars. <br/> Supports:<br/> * Map of (GraphqlObjectName.fieldName) to (JavaAnnotation) <br/> * Map of (GraphqlType) to (JavaAnnotation) |
| `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName`. |
| `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. |
| `generateParameterizedFieldsResolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. |
| `generateExtensionFieldsResolvers` | Boolean | False | Specifies whether all fields in extensions (`extend type` and `extend interface`) should be present in Resolver interface instead of the type class itself. |
| `generateModelsForRootTypes` | Boolean | False | Specifies whether model classes should be generated for `type Query`, `type Subscription`, `type Mutation`. |
| `subscriptionReturnType` | String | Empty | Return type for subscription methods. For example: `org.reactivestreams.Publisher`, `io.reactivex.Observable`, etc. |
| `generateClient` | Boolean | False | Specifies whether client-side classes should be generated for each query, mutation and subscription. This includes: `Request` classes (contain input data), `ResponseProjection` classes for each type (contain response fields) and `Response` classes (contain response data). |
| `requestSuffix` | String | Request | Sets the suffix for `Request` classes. |
......
......@@ -50,7 +50,9 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
private ApiNamePrefixStrategy apiNamePrefixStrategy = MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY;
private ApiRootInterfaceStrategy apiRootInterfaceStrategy = MappingConfigConstants.DEFAULT_API_ROOT_INTERFACE_STRATEGY;
private String apiNamePrefix;
private String apiNameSuffix;
private String apiNameSuffix = MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX;;
private String typeResolverPrefix;
private String typeResolverSuffix = MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX;
private String modelPackageName;
private String modelNamePrefix;
private String modelNameSuffix;
......@@ -65,6 +67,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
private Boolean generateParameterizedFieldsResolvers = MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS;
private Boolean generateExtensionFieldsResolvers = MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS;
private Boolean generateDataFetchingEnvironmentArgumentInApis = MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV;
private Boolean generateModelsForRootTypes = MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES;
private Set<String> fieldsWithResolvers = new HashSet<>();
private Set<String> fieldsWithoutResolvers = new HashSet<>();
......@@ -86,7 +89,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
public void generate() throws Exception {
MappingConfig mappingConfig = new MappingConfig();
mappingConfig.setPackageName(packageName);
mappingConfig.setCustomTypesMapping(customTypesMapping);
mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>());
mappingConfig.setApiNameSuffix(apiNameSuffix);
mappingConfig.setApiNamePrefix(apiNamePrefix);
mappingConfig.setApiRootInterfaceStrategy(apiRootInterfaceStrategy);
......@@ -97,18 +100,21 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
mappingConfig.setModelPackageName(modelPackageName);
mappingConfig.setGenerateBuilder(generateBuilder);
mappingConfig.setGenerateApis(generateApis);
mappingConfig.setTypeResolverSuffix(typeResolverSuffix);
mappingConfig.setTypeResolverPrefix(typeResolverPrefix);
mappingConfig.setModelValidationAnnotation(modelValidationAnnotation);
mappingConfig.setSubscriptionReturnType(subscriptionReturnType);
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping);
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>());
mappingConfig.setGenerateEqualsAndHashCode(generateEqualsAndHashCode);
mappingConfig.setGenerateImmutableModels(generateImmutableModels);
mappingConfig.setGenerateToString(generateToString);
mappingConfig.setSubscriptionReturnType(subscriptionReturnType);
mappingConfig.setGenerateAsyncApi(generateAsyncApi);
mappingConfig.setGenerateParameterizedFieldsResolvers(generateParameterizedFieldsResolvers);
mappingConfig.setGenerateExtensionFieldsResolvers(generateExtensionFieldsResolvers);
mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(generateDataFetchingEnvironmentArgumentInApis);
mappingConfig.setFieldsWithResolvers(fieldsWithResolvers);
mappingConfig.setFieldsWithoutResolvers(fieldsWithoutResolvers);
mappingConfig.setGenerateExtensionFieldsResolvers(generateExtensionFieldsResolvers);
mappingConfig.setGenerateModelsForRootTypes(generateModelsForRootTypes);
mappingConfig.setFieldsWithResolvers(fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>());
mappingConfig.setFieldsWithoutResolvers(fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>());
mappingConfig.setGenerateClient(generateClient);
mappingConfig.setRequestSuffix(requestSuffix);
mappingConfig.setResponseSuffix(responseSuffix);
......@@ -328,6 +334,17 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
this.generateApis = generateApis;
}
@Input
@Optional
@Override
public Boolean getGenerateModelsForRootTypes() {
return generateModelsForRootTypes;
}
public void setGenerateModelsForRootTypes(Boolean generateModelsForRootTypes) {
this.generateModelsForRootTypes = generateModelsForRootTypes;
}
@Input
@Optional
@Override
......@@ -416,6 +433,28 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
this.generateParameterizedFieldsResolvers = generateParameterizedFieldsResolvers;
}
@Input
@Optional
@Override
public String getTypeResolverPrefix() {
return typeResolverPrefix;
}
public void setTypeResolverPrefix(String typeResolverPrefix) {
this.typeResolverPrefix = typeResolverPrefix;
}
@Input
@Optional
@Override
public String getTypeResolverSuffix() {
return typeResolverSuffix;
}
public void setTypeResolverSuffix(String typeResolverSuffix) {
this.typeResolverSuffix = typeResolverSuffix;
}
@Input
@Optional
@Override
......
......@@ -71,7 +71,7 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
@Parameter
private String apiNamePrefix;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_API_NAME_SUFFIX)
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX)
private String apiNameSuffix;
@Parameter
......@@ -83,6 +83,12 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
@Parameter
private String modelNameSuffix;
@Parameter
private String typeResolverPrefix;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX)
private String typeResolverSuffix;
@Parameter
private String subscriptionReturnType;
......@@ -107,6 +113,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV_STRING)
private boolean generateDataFetchingEnvironmentArgumentInApis;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES_STRING)
private boolean generateModelsForRootTypes;
@Parameter
private Set<String> fieldsWithResolvers = new HashSet<>();
......@@ -125,7 +134,7 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_SUFFIX)
private String responseProjectionSuffix;
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFIX)
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFFIX)
private String parametrizedInputSuffix;
@Parameter
......@@ -157,6 +166,8 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
mappingConfig.setModelPackageName(modelPackageName);
mappingConfig.setGenerateBuilder(generateBuilder);
mappingConfig.setGenerateApis(generateApis);
mappingConfig.setTypeResolverSuffix(typeResolverSuffix);
mappingConfig.setTypeResolverPrefix(typeResolverPrefix);
mappingConfig.setModelValidationAnnotation(modelValidationAnnotation);
mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>());
mappingConfig.setGenerateEqualsAndHashCode(generateEqualsAndHashCode);
......@@ -167,6 +178,7 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
mappingConfig.setGenerateParameterizedFieldsResolvers(generateParameterizedFieldsResolvers);
mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(generateDataFetchingEnvironmentArgumentInApis);
mappingConfig.setGenerateExtensionFieldsResolvers(generateExtensionFieldsResolvers);
mappingConfig.setGenerateModelsForRootTypes(generateModelsForRootTypes);
mappingConfig.setFieldsWithResolvers(fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>());
mappingConfig.setFieldsWithoutResolvers(fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>());
mappingConfig.setGenerateClient(generateClient);
......@@ -359,6 +371,15 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
this.generateApis = generateApis;
}
@Override
public Boolean getGenerateModelsForRootTypes() {
return generateModelsForRootTypes;
}
public void setGenerateModelsForRootTypes(boolean generateModelsForRootTypes) {
this.generateModelsForRootTypes = generateModelsForRootTypes;
}
@Override
public Boolean getGenerateEqualsAndHashCode() {
return generateEqualsAndHashCode;
......@@ -422,6 +443,24 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
this.generateParameterizedFieldsResolvers = generateParameterizedFieldsResolvers;
}
@Override
public String getTypeResolverPrefix() {
return typeResolverPrefix;
}
public void setTypeResolverPrefix(String typeResolverPrefix) {
this.typeResolverPrefix = typeResolverPrefix;
}
@Override
public String getTypeResolverSuffix() {
return typeResolverSuffix;
}
public void setTypeResolverSuffix(String typeResolverSuffix) {
this.typeResolverSuffix = typeResolverSuffix;
}
@Override
public Boolean getGenerateDataFetchingEnvironmentArgumentInApis() {
return generateDataFetchingEnvironmentArgumentInApis;
......
......@@ -82,10 +82,11 @@ public class GraphQLCodegen {
this.mappingConfig = mappingConfig;
this.mappingConfig.combine(externalMappingConfigSupplier != null ? externalMappingConfigSupplier.get() : null);
initDefaultValues(mappingConfig);
validateConfigs(mappingConfig);
this.generatedInformation = generatedInformation;
}
private void initDefaultValues(MappingConfig mappingConfig) {
private static void initDefaultValues(MappingConfig mappingConfig) {
if (mappingConfig.getModelValidationAnnotation() == null) {
mappingConfig.setModelValidationAnnotation(MappingConfigConstants.DEFAULT_VALIDATION_ANNOTATION);
}
......@@ -108,7 +109,7 @@ public class GraphQLCodegen {
mappingConfig.setResponseProjectionSuffix(MappingConfigConstants.DEFAULT_RESPONSE_PROJECTION_SUFFIX);
}
if (mappingConfig.getParametrizedInputSuffix() == null) {
mappingConfig.setParametrizedInputSuffix(MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFIX);
mappingConfig.setParametrizedInputSuffix(MappingConfigConstants.DEFAULT_PARAMETRIZED_INPUT_SUFFIX);
}
if (mappingConfig.getGenerateImmutableModels() == null) {
mappingConfig.setGenerateImmutableModels(MappingConfigConstants.DEFAULT_GENERATE_IMMUTABLE_MODELS);
......@@ -120,7 +121,10 @@ public class GraphQLCodegen {
mappingConfig.setGenerateApis(MappingConfigConstants.DEFAULT_GENERATE_APIS);
}
if (mappingConfig.getApiNameSuffix() == null) {
mappingConfig.setApiNameSuffix(MappingConfigConstants.DEFAULT_API_NAME_SUFFIX);
mappingConfig.setApiNameSuffix(MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX);
}
if (mappingConfig.getTypeResolverSuffix() == null) {
mappingConfig.setTypeResolverSuffix(MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX);
}
if (mappingConfig.getGenerateAsyncApi() == null) {
mappingConfig.setGenerateAsyncApi(MappingConfigConstants.DEFAULT_GENERATE_ASYNC_APIS);
......@@ -134,6 +138,9 @@ public class GraphQLCodegen {
if (mappingConfig.getGenerateDataFetchingEnvironmentArgumentInApis() == null) {
mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV);
}
if (mappingConfig.getGenerateModelsForRootTypes() == null) {
mappingConfig.setGenerateModelsForRootTypes(MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES);
}
if (mappingConfig.getApiNamePrefixStrategy() == null) {
mappingConfig.setApiNamePrefixStrategy(MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY);
}
......@@ -144,11 +151,30 @@ public class GraphQLCodegen {
// required for request serialization
mappingConfig.setGenerateToString(true);
}
}
private static void validateConfigs(MappingConfig mappingConfig) {
if (mappingConfig.getApiRootInterfaceStrategy() == ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA &&
mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) {
// that's because we will have a conflict in case there is "type Query" in multiple graphql schema files
// we will have a conflict in case there is "type Query" in multiple graphql schema files
throw new IllegalArgumentException("API prefix should not be CONSTANT for INTERFACE_PER_SCHEMA option");
}
if (mappingConfig.getGenerateApis() &&
mappingConfig.getGenerateModelsForRootTypes() &&
mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) {
// checking for conflict between root type model classes and api interfaces
if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getModelNamePrefix()) &&
Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getModelNameSuffix())) {
// we will have a conflict between model pojo (Query.java) and api interface (Query.java)
throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and model classes");
}
// checking for conflict between root type model resolver classes and api interfaces
if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getTypeResolverPrefix()) &&
Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getTypeResolverSuffix())) {
// we will have a conflict between model resolver interface (QueryResolver.java) and api interface resolver (QueryResolver.java)
throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes");
}
}
}
public List<File> generate() throws IOException {
......@@ -156,7 +182,7 @@ public class GraphQLCodegen {
long startTime = System.currentTimeMillis();
List<File> generatedFiles = Collections.emptyList();
if (!schemas.isEmpty()) {
ExtendedDocument document = GraphQLDocumentParser.getDocument(schemas);
ExtendedDocument document = GraphQLDocumentParser.getDocument(mappingConfig, schemas);
initCustomTypeMappings(document.getScalarDefinitions());
generatedFiles = processDefinitions(document);
}
......
......@@ -2,6 +2,8 @@ package com.kobylynskyi.graphql.codegen;
import com.kobylynskyi.graphql.codegen.model.exception.SchemaValidationException;
import graphql.GraphQLException;
import graphql.parser.MultiSourceReader;
import graphql.parser.Parser;
import lombok.AllArgsConstructor;
import java.io.IOException;
......@@ -18,16 +20,15 @@ public class GraphQLCodegenValidate {
private final List<String> schemas;
public void validate() throws IOException {
for (String schema : schemas) {
try {
long startTime = System.currentTimeMillis();
GraphQLDocumentParser.getDocument(schema);
System.out.println(String.format("Validated schema '%s' in %d ms",
schema, System.currentTimeMillis() - startTime));
} catch (GraphQLException e) {
throw new SchemaValidationException(e.getMessage());
}
long startTime = System.currentTimeMillis();
try (MultiSourceReader reader = GraphQLDocumentParser.createMultiSourceReader(schemas)) {
new Parser().parseDocument(reader);
System.out.println(String.format("Validated schemas '%s' in %d ms",
schemas, System.currentTimeMillis() - startTime));
} catch (GraphQLException e) {
throw new SchemaValidationException(e.getMessage());
}
}
}
package com.kobylynskyi.graphql.codegen;
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDefinition;
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDocument;
import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedEnumTypeDefinition;
......@@ -28,7 +29,6 @@ import graphql.parser.MultiSourceReader;
import graphql.parser.Parser;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -41,11 +41,7 @@ class GraphQLDocumentParser {
private GraphQLDocumentParser() {
}
static ExtendedDocument getDocument(String schemaFilePath) throws IOException {
return getDocument(Collections.singletonList(schemaFilePath));
}
static ExtendedDocument getDocument(List<String> schemaPaths) throws IOException {
static ExtendedDocument getDocument(MappingConfig mappingConfig, List<String> schemaPaths) throws IOException {
Document document = readDocument(schemaPaths);
Map<String, ExtendedObjectTypeDefinition> operationDefinitions = new HashMap<>();
......@@ -68,6 +64,11 @@ class GraphQLDocumentParser {
populateDefinition(operationDefinitions, definition, definitionName,
ObjectTypeDefinition.class, ObjectTypeExtensionDefinition.class,
s -> new ExtendedObjectTypeDefinition());
if (Boolean.TRUE.equals(mappingConfig.getGenerateModelsForRootTypes())) {
populateDefinition(typeDefinitions, definition, definitionName,
ObjectTypeDefinition.class, ObjectTypeExtensionDefinition.class,
s -> new ExtendedObjectTypeDefinition());
}
} else {
populateDefinition(typeDefinitions, definition, definitionName,
ObjectTypeDefinition.class, ObjectTypeExtensionDefinition.class,
......@@ -108,12 +109,15 @@ class GraphQLDocumentParser {
}
@SuppressWarnings("unchecked")
private static <D extends ExtendedDefinition<B, E>, B extends NamedNode<B>, E extends B> void populateDefinition(Map<String, D> definitionsMap,
Definition<?> definition,
String definitionName,
Class<B> baseDefinitionClass,
Class<E> extensionDefinitionClass,
Function<String, D> mappingFunction) {
private static <
D extends ExtendedDefinition<B, E>,
B extends NamedNode<B>,
E extends B> void populateDefinition(Map<String, D> definitionsMap,
Definition<?> definition,
String definitionName,
Class<B> baseDefinitionClass,
Class<E> extensionDefinitionClass,
Function<String, D> mappingFunction) {
D extendedDefinition = definitionsMap.computeIfAbsent(definitionName, mappingFunction);
if (extensionDefinitionClass.isAssignableFrom(definition.getClass())) {
extendedDefinition.getExtensions().add((E) definition);
......@@ -128,7 +132,10 @@ class GraphQLDocumentParser {
}
}
private static MultiSourceReader createMultiSourceReader(List<String> schemaPaths) throws IOException {
public static MultiSourceReader createMultiSourceReader(List<String> schemaPaths) throws IOException {
if (schemaPaths == null) {
return MultiSourceReader.newMultiSourceReader().build();
}
MultiSourceReader.Builder builder = MultiSourceReader.newMultiSourceReader();
for (String path : schemaPaths) {
// appending EOL to ensure that schema tokens are not mixed in case files are not properly ended with EOL
......
......@@ -48,7 +48,7 @@ public class FieldDefinitionsToResolverDataModelMapper {
List<ExtendedFieldDefinition> fieldDefs,
String parentTypeName) {
// Example: PersonResolver
String className = parentTypeName + "Resolver";
String className = MapperUtils.getTypeResolverClassNameWithPrefixAndSuffix(mappingContext, parentTypeName);
return mapToResolverModel(mappingContext, parentTypeName, className, fieldDefs,
singletonList("Resolver for " + parentTypeName),
getParentInterface(mappingContext, parentTypeName));
......
......@@ -82,6 +82,25 @@ class MapperUtils {
return classNameBuilder.toString();
}
/**
* Generates a type resolver class name including prefix and suffix (if any)
*
* @param mappingContext Global mapping context
* @param typeName GraphQL type name
* @return Class name of GraphQL type resolver
*/
static String getTypeResolverClassNameWithPrefixAndSuffix(MappingContext mappingContext, String typeName) {
StringBuilder classNameBuilder = new StringBuilder();
if (Utils.isNotBlank(mappingContext.getTypeResolverPrefix())) {
classNameBuilder.append(mappingContext.getTypeResolverPrefix());
}
classNameBuilder.append(Utils.capitalize(typeName));
if (Utils.isNotBlank(mappingContext.getTypeResolverSuffix())) {
classNameBuilder.append(mappingContext.getTypeResolverSuffix());
}
return classNameBuilder.toString();
}
/**
* Generates an api class name including prefix and suffix (if any)
* Examples: CreateEventMutationResolver, EventsQueryResolver, EventsByIdsQueryResolver (rootTypeName is "Query" or the likes)
......
......@@ -42,6 +42,13 @@ public interface GraphQLCodegenConfiguration {
*/
Boolean getGenerateApis();
/**
* Specifies whether model classes should be generated for Query/Subscription/Mutation.
*
* @return <b>true</b> is model classes (POJOs) should be generated for GraphQL root types.
*/
Boolean getGenerateModelsForRootTypes();
/**
* Specifies the strategy of generating root api interface.
*
......@@ -164,6 +171,20 @@ public interface GraphQLCodegenConfiguration {
*/
Boolean getGenerateParameterizedFieldsResolvers();
/**
* Sets the prefix for GraphQL type resolver classes.
*
* @return The prefix for GraphQL type resolver classes.
*/
String getTypeResolverPrefix();
/**
* Sets the suffix for GraphQL type resolver classes.
*
* @return The suffix for GraphQL type resolver classes.
*/
String getTypeResolverSuffix();
/**
* Whether all fields in extensions (<code>extend type</code> and <code>extend interface</code>) should be present
* in Resolver interface instead of the type class itself.
......
......@@ -29,6 +29,8 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
private String modelNameSuffix;
private String apiNamePrefix;
private String apiNameSuffix;
private String typeResolverPrefix;
private String typeResolverSuffix;
private ApiRootInterfaceStrategy apiRootInterfaceStrategy;
private ApiNamePrefixStrategy apiNamePrefixStrategy;
private String modelValidationAnnotation;
......@@ -44,6 +46,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
private Boolean generateParameterizedFieldsResolvers;
private Boolean generateExtensionFieldsResolvers;
private Boolean generateDataFetchingEnvironmentArgumentInApis;
private Boolean generateModelsForRootTypes;
// field resolvers configs:
private Set<String> fieldsWithResolvers = new HashSet<>();
......@@ -87,6 +90,8 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
this.apiNameSuffix = source.apiNameSuffix != null ? source.apiNameSuffix : this.apiNameSuffix;
this.apiRootInterfaceStrategy = source.apiRootInterfaceStrategy != null ? source.apiRootInterfaceStrategy : this.apiRootInterfaceStrategy;
this.apiNamePrefixStrategy = source.apiNamePrefixStrategy != null ? source.apiNamePrefixStrategy : this.apiNamePrefixStrategy;
this.typeResolverPrefix = source.typeResolverPrefix != null ? source.typeResolverPrefix : this.typeResolverPrefix;
this.typeResolverSuffix = source.typeResolverSuffix != null ? source.typeResolverSuffix : this.typeResolverSuffix;
this.modelValidationAnnotation = source.modelValidationAnnotation != null ? source.modelValidationAnnotation : this.modelValidationAnnotation;
this.subscriptionReturnType = source.subscriptionReturnType != null ? source.subscriptionReturnType : this.subscriptionReturnType;
this.generateBuilder = source.generateBuilder != null ? source.generateBuilder : this.generateBuilder;
......@@ -97,6 +102,7 @@ public class MappingConfig implements GraphQLCodegenConfiguration, Combinable<Ma
this.generateParameterizedFieldsResolvers = source.generateParameterizedFieldsResolvers != null ? source.generateParameterizedFieldsResolvers : this.generateParameterizedFieldsResolvers;
this.generateExtensionFieldsResolvers = source.generateExtensionFieldsResolvers != null ? source.generateExtensionFieldsResolvers : this.generateExtensionFieldsResolvers;
this.generateDataFetchingEnvironmentArgumentInApis = source.generateDataFetchingEnvironmentArgumentInApis != null ? source.generateDataFetchingEnvironmentArgumentInApis : this.generateDataFetchingEnvironmentArgumentInApis;
this.generateModelsForRootTypes = source.generateModelsForRootTypes != null ? source.generateModelsForRootTypes : this.generateModelsForRootTypes;
if (this.fieldsWithResolvers != null && source.fieldsWithResolvers != null) {
this.fieldsWithResolvers.addAll(source.fieldsWithResolvers);
} else if (this.fieldsWithResolvers == null) {
......
......@@ -6,7 +6,6 @@ public class MappingConfigConstants {
public static final String PARENT_INTERFACE_TYPE_PLACEHOLDER = "{{TYPE}}";
public static final boolean DEFAULT_GENERATE_APIS = true;
public static final String DEFAULT_GENERATE_APIS_STRING = "true";
public static final String DEFAULT_API_NAME_SUFFIX = "Resolver";
public static final boolean DEFAULT_GENERATE_ASYNC_APIS = false;
public static final String DEFAULT_GENERATE_ASYNC_APIS_STRING = "false";
public static final boolean DEFAULT_BUILDER = true;
......@@ -23,17 +22,20 @@ public class MappingConfigConstants {
public static final String DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS_STRING = "false";
public static final boolean DEFAULT_GENERATE_DATA_FETCHING_ENV = false;
public static final String DEFAULT_GENERATE_DATA_FETCHING_ENV_STRING = "false";
public static final boolean DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES = false;
public static final String DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES_STRING = "false";
public static final ApiNamePrefixStrategy DEFAULT_API_NAME_PREFIX_STRATEGY = ApiNamePrefixStrategy.CONSTANT;
public static final String DEFAULT_API_NAME_PREFIX_STRATEGY_STRING = "CONSTANT";
public static final ApiRootInterfaceStrategy DEFAULT_API_ROOT_INTERFACE_STRATEGY = ApiRootInterfaceStrategy.SINGLE_INTERFACE;
public static final String DEFAULT_API_ROOT_INTERFACE_STRATEGY_STRING = "SINGLE_INTERFACE";
public static final boolean DEFAULT_GENERATE_CLIENT = false;
public static final String DEFAULT_GENERATE_CLIENT_STRING = "false";
public static final String DEFAULT_RESOLVER_SUFFIX = "Resolver";
public static final String DEFAULT_REQUEST_SUFFIX = "Request";
public static final String DEFAULT_RESPONSE_SUFFIX = "Response";
public static final String DEFAULT_RESPONSE_PROJECTION_SUFFIX = "ResponseProjection";
public static final String DEFAULT_PARAMETRIZED_INPUT_SUFIX = "ParametrizedInput";
public static final String DEFAULT_PARAMETRIZED_INPUT_SUFFIX = "ParametrizedInput";
private MappingConfigConstants() {
}
......
......@@ -38,6 +38,11 @@ public class MappingContext implements GraphQLCodegenConfiguration {
return config.getGenerateApis();
}
@Override
public Boolean getGenerateModelsForRootTypes() {
return config.getGenerateModelsForRootTypes();
}
@Override
public ApiRootInterfaceStrategy getApiRootInterfaceStrategy() {
return config.getApiRootInterfaceStrategy();
......@@ -123,6 +128,16 @@ public class MappingContext implements GraphQLCodegenConfiguration {
return config.getGenerateParameterizedFieldsResolvers();
}
@Override
public String getTypeResolverPrefix() {
return config.getTypeResolverPrefix();
}
@Override
public String getTypeResolverSuffix() {
return config.getTypeResolverSuffix();
}
@Override
public Boolean getGenerateExtensionFieldsResolvers() {
return config.getGenerateExtensionFieldsResolvers();
......
......@@ -9,6 +9,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.Objects;
/**
* Various utilities
......@@ -90,6 +91,36 @@ public final class Utils {
return false;
}
/**
* Copy of org.apache.commons.lang3.StringUtils.isBlank(CharSequence cs)
*
* @param cs the CharSequence to check, may be null
* @return {@code true} if the CharSequence is null, empty or whitespace only
*/
public static boolean isBlank(final CharSequence cs) {
int strLen;
if (cs == null || (strLen = cs.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
/**
* Check if strings are equal (consider blank strings equal to null)
*
* @param a a string
* @param b a string to be compared with {@code a}
* @return {@code true} if strings are equal
*/
public static boolean stringsEqualIgnoreSpaces(String a, String b) {
return Objects.equals(a, b) || (isBlank(a) && isBlank(b));
}
/**
* Get content of the file.
*
......
......@@ -10,10 +10,10 @@ package ${package};
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public enum ${className}<#if implements?has_content> implements <#list implements as interface>${interface}<#if interface_has_next>, </#if></#list></#if> {
......
......@@ -16,10 +16,10 @@ import ${import}.*;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public interface ${className} <#if implements?has_content>extends <#list implements as interface>${interface}<#if interface_has_next>, </#if></#list></#if>{
......
......@@ -14,10 +14,10 @@ import ${import}.*;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public interface ${className}<#if implements?has_content> extends <#list implements as interface>${interface}<#if interface_has_next>, </#if></#list></#if> {
......
......@@ -17,10 +17,10 @@ import java.util.Objects;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public class ${className} implements GraphQLParametrizedInput {
......
......@@ -18,10 +18,10 @@ import java.util.Objects;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public class ${className} implements GraphQLOperationRequest {
......
......@@ -13,10 +13,10 @@ import java.util.Map;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public class ${className} extends GraphQLResult<Map<String, ${returnTypeName}>> {
......
......@@ -16,10 +16,10 @@ import java.util.Objects;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public class ${className} extends GraphQLResponseProjection {
......
......@@ -25,10 +25,10 @@ import java.util.StringJoiner;
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public class ${className} implements java.io.Serializable<#if implements?has_content><#list implements as interface>, ${interface}<#if interface_has_next></#if></#list></#if> {
......
......@@ -11,10 +11,10 @@ package ${package};
*/
</#if>
<#if generatedInfo.getGeneratedType()?has_content>
@${generatedInfo.getGeneratedType()}{
@${generatedInfo.getGeneratedType()}(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "${generatedInfo.getDateTime()}"
}
)
</#if>
public interface ${className} {
......
package com.kobylynskyi.graphql.codegen;
import com.kobylynskyi.graphql.codegen.model.GeneratedInformation;
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class GraphQLCodegenModelsForRootTypesTest {
private final MappingConfig mappingConfig = new MappingConfig();
private final GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo();
private final File outputBuildDir = new File("build/generated");
private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/rootmodels");
public static final List<String> SCHEMAS = singletonList("src/test/resources/schemas/test.graphqls");
@BeforeEach
void init() {
mappingConfig.setGenerateModelsForRootTypes(true);
mappingConfig.setPackageName("com.kobylynskyi.graphql.rootmodels");
}
@AfterEach
void cleanup() {
Utils.deleteDir(new File("build/generated"));
}
@Test
void generate_sameModelSuffixes() {
mappingConfig.setApiNameSuffix("");
mappingConfig.setModelNameSuffix(null);
mappingConfig.setApiNamePrefix(null);
mappingConfig.setModelNamePrefix("");
IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
() -> new GraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo),
"Expected generate() to throw, but it didn't");
assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and model classes",
thrown.getMessage());
}
@Test
void generate_sameResolverSuffixes() {
// by default apiNamePrefix is same as typeResolverSuffix
IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
() -> new GraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo),
"Expected generate() to throw, but it didn't");
assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes",
thrown.getMessage());
}
@Test
void generate_CheckFiles_generateApisFalse() throws Exception {
mappingConfig.setGenerateApis(false);
new GraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo).generate();
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
assertEquals(Arrays.asList("Event.java", "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java",
"Mutation.java", "MutationResolver.java", "Query.java", "QueryResolver.java", "Subscription.java"),
generatedFileNames);
}
@Test
void generate_CheckFiles_generateApisTrue_CustomTypeResolverSuffix() throws Exception {
mappingConfig.setTypeResolverSuffix("TypeResolver");
new GraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo).generate();
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
assertEquals(Arrays.asList("CreateEventMutationResolver.java", "Event.java", "EventByIdQueryResolver.java",
"EventProperty.java", "EventPropertyTypeResolver.java", "EventStatus.java",
"EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java",
"EventsCreatedSubscriptionResolver.java", "Mutation.java", "MutationResolver.java",
"MutationTypeResolver.java", "Query.java", "QueryResolver.java", "QueryTypeResolver.java",
"Subscription.java", "SubscriptionResolver.java", "VersionQueryResolver.java"), generatedFileNames);
}
}
......@@ -13,7 +13,11 @@ import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.util.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
......@@ -21,7 +25,9 @@ import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class GraphQLCodegenTest {
......@@ -192,8 +198,7 @@ class GraphQLCodegenTest {
assertFileContainsElements(files, "Event.java", System.lineSeparator() +
"/**" + System.lineSeparator() +
" * An event that describes a thing that happens" + System.lineSeparator() +
" */" + System.lineSeparator() +
"@javax.annotation.Generated{");
" */" + System.lineSeparator());
}
@Test
......
......@@ -27,9 +27,24 @@ public class TestUtils {
public static void assertSameTrimmedContent(File expected, File file) throws IOException {
String expectedContent = Utils.getFileContent(expected.getPath()).trim();
String actualContent = Utils.getFileContent(file.getPath()).trim();
if (atLeastJava9()) {
// doing this hack in order to make the build work on all Java versions
actualContent = actualContent.replace(
"javax.annotation.processing.Generated",
"javax.annotation.Generated");
}
assertEquals(expectedContent, actualContent);
}
private static boolean atLeastJava9() {
try {
Class.forName("javax.annotation.processing.Generated");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
public static GeneratedInformation getStaticGeneratedInfo() {
GeneratedInformation generatedInformation = new GeneratedInformation();
generatedInformation.setDateTimeGenerator(new DateTimeGenerator() {
......
......@@ -62,6 +62,9 @@ class MappingConfigTest {
assertEquals("10", mappingConfig.getResponseSuffix());
assertEquals("7", mappingConfig.getResponseProjectionSuffix());
assertFalse(mappingConfig.getGenerateClient());
assertFalse(mappingConfig.getGenerateModelsForRootTypes());
assertEquals("11", mappingConfig.getTypeResolverPrefix());
assertEquals("12", mappingConfig.getTypeResolverSuffix());
}
@Test
......@@ -92,7 +95,10 @@ class MappingConfigTest {
assertEquals("10", mappingConfig.getResponseSuffix());
assertEquals("7", mappingConfig.getResponseProjectionSuffix());
assertFalse(mappingConfig.getGenerateClient());
assertFalse(mappingConfig.getGenerateModelsForRootTypes());
assertEquals("9", mappingConfig.getParametrizedInputSuffix());
assertEquals("11", mappingConfig.getTypeResolverPrefix());
assertEquals("12", mappingConfig.getTypeResolverSuffix());
}
@Test
......@@ -125,7 +131,10 @@ class MappingConfigTest {
assertEquals("1010", mappingConfig.getResponseSuffix());
assertEquals("77", mappingConfig.getResponseProjectionSuffix());
assertTrue(mappingConfig.getGenerateClient());
assertTrue(mappingConfig.getGenerateModelsForRootTypes());
assertEquals("99", mappingConfig.getParametrizedInputSuffix());
assertEquals("1111", mappingConfig.getTypeResolverPrefix());
assertEquals("1212", mappingConfig.getTypeResolverSuffix());
}
private static Map<String, String> hashMap(AbstractMap.SimpleEntry<String, String>... entries) {
......@@ -158,7 +167,10 @@ class MappingConfigTest {
config.setResponseSuffix("10");
config.setResponseProjectionSuffix("7");
config.setGenerateClient(false);
config.setGenerateModelsForRootTypes(false);
config.setParametrizedInputSuffix("9");
config.setTypeResolverPrefix("11");
config.setTypeResolverSuffix("12");
return config;
}
......@@ -187,7 +199,10 @@ class MappingConfigTest {
config.setResponseSuffix("1010");
config.setResponseProjectionSuffix("77");
config.setGenerateClient(true);
config.setGenerateModelsForRootTypes(true);
config.setParametrizedInputSuffix("99");
config.setTypeResolverPrefix("1111");
config.setTypeResolverSuffix("1212");
return config;
}
......
......@@ -4,10 +4,10 @@ package com.github.graphql;
/**
* Resolver for AcceptTopicSuggestionPayload
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface AcceptTopicSuggestionPayloadResolver {
GithubTopicTO topic(GithubAcceptTopicSuggestionPayloadTO githubAcceptTopicSuggestionPayloadTO, graphql.schema.DataFetchingEnvironment env) throws Exception;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class CommentDeletedEvent implements java.io.Serializable, IssueTimelineItems, PullRequestTimelineItems, Node {
@javax.validation.constraints.NotNull
......
......@@ -4,10 +4,10 @@ package com.github.graphql;
/**
* Resolver for CommentDeletedEvent
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CommentDeletedEventResolver {
Actor actor(CommentDeletedEvent commentDeletedEvent) throws Exception;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Commit implements java.io.Serializable, Closer, IssueTimelineItem, PullRequestTimelineItem, Subscribable, Node, GitObject, UniformResourceLocatable {
@javax.validation.constraints.NotNull
......
......@@ -4,10 +4,10 @@ package com.github.graphql;
/**
* Resolver for Commit
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CommitResolver {
PullRequestConnection associatedPullRequests(Commit commit, String after, String before, Integer first, Integer last, PullRequestOrder orderBy, graphql.schema.DataFetchingEnvironment env) throws Exception;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Commit implements java.io.Serializable, Closer, IssueTimelineItem, PullRequestTimelineItem, Subscribable, Node, GitObject, UniformResourceLocatable {
@javax.validation.constraints.NotNull
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Commit implements java.io.Serializable, Closer, IssueTimelineItem, PullRequestTimelineItem, Subscribable, Node, GitObject, UniformResourceLocatable {
private String abbreviatedOid;
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Create a new event.
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateEventMutationResolver {
/**
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface MutationResolver {
}
\ No newline at end of file
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface QueryResolver {
}
\ No newline at end of file
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* An event that describes a thing that happens
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Event implements java.io.Serializable {
private String id;
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Single event by ID.
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventByIdQueryResolver {
/**
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* An event property have all possible types
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class EventProperty implements java.io.Serializable {
private Double floatVal;
......
......@@ -5,10 +5,10 @@ import java.util.StringJoiner;
/**
* An event property have all possible types
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class EventPropertyTO implements java.io.Serializable {
private Double floatVal;
......
......@@ -5,10 +5,10 @@ import java.util.Objects;
/**
* An event property have all possible types
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class EventPropertyTO implements java.io.Serializable {
private Double floatVal;
......
......@@ -3,10 +3,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Possible statuses of the event
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum EventStatus {
/**
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* An event that describes a thing that happens
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Event implements java.io.Serializable {
private String id;
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* List of events of a specified category.
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventsByCategoryAndStatusQueryResolver {
/**
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Events by IDs.
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventsByIdsQueryResolver {
/**
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Subscribe to events
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventsCreatedSubscriptionResolver {
/**
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class GithubAcceptTopicSuggestionInputTO implements java.io.Serializable {
private String clientMutationId;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class GithubAcceptTopicSuggestionPayloadTO implements java.io.Serializable {
private String clientMutationId;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class GithubCommitTO implements java.io.Serializable, GithubCloserTO, GithubIssueTimelineItemTO, GithubPullRequestTimelineItemTO, GithubGitObjectTO, GithubNodeTO, GithubSubscribableTO, GithubUniformResourceLocatableTO {
@javax.validation.constraints.NotNull
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface MutationResolver {
/**
......
package com.kobylynskyi.graphql.multifiles;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface MyUnion {
}
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Person implements java.io.Serializable, NamedEntity {
private String name;
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Person implements java.io.Serializable, NamedEntity {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface ProductsByCategoryIdAndStatusQueryResolver {
java.util.List<Product> products(String categoryId, String status) throws Exception;
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface ProductsByIdsQueryResolver {
java.util.List<Product> products(java.util.List<String> ids) throws Exception;
......
package com.github.graphql;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface ProfileOwner {
@javax.validation.constraints.NotNull
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface QueryResolver {
/**
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface SubscriptionResolver {
/**
......
package com.kobylynskyi.graphql.multifiles;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class UnionMember1 implements java.io.Serializable, MyUnion {
private Integer someField;
......
package com.kobylynskyi.graphql.multifiles;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class UnionMember2 implements java.io.Serializable, MyUnion {
private String someField;
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.test1;
/**
* Version of the application.
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface VersionQueryResolver {
/**
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.testdefaults;
/**
* This input has all possible types
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class InputWithDefaults implements java.io.Serializable {
private Double floatVal = 1.23;
......
......@@ -4,10 +4,10 @@ package com.kobylynskyi.graphql.testdefaults;
/**
* This input has all possible types
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class InputWithDefaultsTO implements java.io.Serializable {
private Double floatVal = 1.23;
......
package com.kobylynskyi.graphql.testdefaults;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum MyEnum {
ONE,
......
package com.kobylynskyi.graphql.testdefaults;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum MyEnumTO {
ONE,
......
package com.kobylynskyi.graphql.testdefaults;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class SomeObject implements java.io.Serializable {
@javax.validation.constraints.NotNull
......
package com.kobylynskyi.graphql.testdefaults;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class SomeObjectTO implements java.io.Serializable {
@javax.validation.constraints.NotNull
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateEventMutationResolver {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Event implements java.io.Serializable, PinnableItem, Node {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class EventInput implements java.io.Serializable {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventsQueryResolver {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface MutationResolver {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface Node {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface PinnableItem {
}
\ No newline at end of file
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface QueryResolver {
@Deprecated
......
package com.kobylynskyi.graphql.test1;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum Status {
@Deprecated
......
package com.kobylynskyi.graphql.enumunion;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum EnumMember1 implements EnumUnion {
VALUE
......
package com.kobylynskyi.graphql.enumunion;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum EnumMember2 implements EnumUnion {
OTHER_VALUE
......
package com.kobylynskyi.graphql.enumunion;
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EnumUnion {
}
\ No newline at end of file
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Asset implements java.io.Serializable, PinnableItem, Node {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class AssetInput implements java.io.Serializable {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface AssetsQueryResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateAssetMutationResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateEventMutationResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Event implements java.io.Serializable, PinnableItem, Node {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class EventInput implements java.io.Serializable {
@javax.validation.constraints.NotNull
......
/**
* Resolver for Event
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventResolver {
/**
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface EventsQueryResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface MutationResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface Node {
@javax.validation.constraints.NotNull
......
/**
* Resolver for Node
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface NodeResolver {
String createdBy(Node node) throws Exception;
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface PinnableItem {
}
\ No newline at end of file
......@@ -2,10 +2,10 @@
* Queries related to events
* Queries related to assets
*/
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface QueryResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public enum Status {
CREATED,
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class Asset implements java.io.Serializable, PinnableItem, Node {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public class AssetInput implements java.io.Serializable {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface AssetsQueryResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateAssetMutationResolver {
@javax.validation.constraints.NotNull
......
@javax.annotation.Generated{
@javax.annotation.Generated(
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
date = "2020-12-31T23:59:59-0500"
}
)
public interface CreateEventMutationResolver {
@javax.validation.constraints.NotNull
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册