diff --git a/docs/codegen-options.md b/docs/codegen-options.md index f42e47dec..b6b58222c 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -68,6 +68,8 @@ | `supportUnknownFields` | Boolean | False | Specifies whether api classes should support unknown fields during serialization or deserialization. If `true`, classes will include a property of type [`java.util.Map`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. | | `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization | | `skip` | Boolean | False | If true, then code generation will not happen | +| `skipSchemaSizeLimit` | Boolean | True | When set to true, the GraphQL schema will be processed with token, character, line and rule depth limits. Set to false to process the schema regardless of its size. +| ### Option `graphqlSchemas` diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index 89eb7f255..523876857 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -15,6 +15,7 @@ import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier; import com.kobylynskyi.graphql.codegen.supplier.MergeableMappingConfigSupplier; import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; +import graphql.parser.ParserOptions; import org.gradle.api.Action; import org.gradle.api.DefaultTask; import org.gradle.api.plugins.JavaPluginExtension; @@ -121,6 +122,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode private String unknownFieldsPropertyName = MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME; private Boolean skip = false; + private Boolean skipSchemaSizeLimit = MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT; public GraphQLCodegenGradleTask() { setGroup("codegen"); @@ -228,6 +230,15 @@ private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IO GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) .map(MappingConfig::getGeneratedLanguage) .orElse(generatedLanguage); + + if (skipSchemaSizeLimit) { + ParserOptions.Builder parserOptionBuilder = ParserOptions.newParserOptions() + .maxTokens(Integer.MAX_VALUE) + .maxCharacters(Integer.MAX_VALUE) + .maxWhitespaceTokens(Integer.MAX_VALUE) + .maxRuleDepth(Integer.MAX_VALUE); + ParserOptions.setDefaultParserOptions(parserOptionBuilder.build()); + } switch (language) { case JAVA: return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index 25eac92e4..4d501eabe 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -16,6 +16,7 @@ import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier; import com.kobylynskyi.graphql.codegen.supplier.MergeableMappingConfigSupplier; import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; +import graphql.parser.ParserOptions; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -248,6 +249,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo @Parameter(defaultValue = "false") private boolean skip; + @Parameter(defaultValue = MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT_STRING) + private boolean skipSchemaSizeLimit; + @Override public void execute() throws MojoExecutionException { addCompileSourceRootIfConfigured(); @@ -338,6 +342,16 @@ private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IO GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) .map(MappingConfig::getGeneratedLanguage) .orElse(generatedLanguage); + + if (skipSchemaSizeLimit) { + ParserOptions.Builder parserOptionBuilder = ParserOptions.newParserOptions() + .maxTokens(Integer.MAX_VALUE) + .maxCharacters(Integer.MAX_VALUE) + .maxWhitespaceTokens(Integer.MAX_VALUE) + .maxRuleDepth(Integer.MAX_VALUE); + ParserOptions.setDefaultParserOptions(parserOptionBuilder.build()); + } + switch (language) { case JAVA: return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt index d29927dc3..631539f3c 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt @@ -33,7 +33,7 @@ lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin libraryDependencies ++= Seq( "io.github.kobylynskyi" % "graphql-java-codegen" % (ThisBuild / version).value, "org.freemarker" % "freemarker" % "2.3.31", - "com.graphql-java" % "graphql-java" % "20.1", + "com.graphql-java" % "graphql-java" % "20.2", "com.fasterxml.jackson.core" % "jackson-databind" % "2.12.1", "com.typesafe" % "config" % "1.4.2" ), diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala index a41e4121d..58b488341 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala @@ -178,5 +178,6 @@ trait GraphQLCodegenKeys { val supportUnknownFields = settingKey[Boolean]("supportUnknownFields") val unknownFieldsPropertyName = settingKey[String]("unknownFieldsPropertyName") + val skipSchemaSizeLimit = settingKey[Boolean]("Skip schema size limit checks.") } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 06c352dde..b4657856a 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -1,5 +1,6 @@ package io.github.dreamylost.graphql.codegen +import graphql.parser.ParserOptions import com.kobylynskyi.graphql.codegen.GraphQLCodegenValidate import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen import com.kobylynskyi.graphql.codegen.model._ @@ -131,7 +132,8 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME, generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY, generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS, - skip := false + skip := false, + skipSchemaSizeLimit := MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT ) private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting { @@ -247,6 +249,16 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co graphqlCodegen := { sLog.value.info(s"Generating files: ${BuildInfo.toString}") val mappingConfigSupplier = buildJsonSupplier(configurationFiles.value) + + if (skipSchemaSizeLimit.value) { + val parserOptionBuilder = ParserOptions + .newParserOptions() + .maxTokens(Integer.MAX_VALUE) + .maxCharacters(Integer.MAX_VALUE) + .maxWhitespaceTokens(Integer.MAX_VALUE) + .maxRuleDepth(Integer.MAX_VALUE); + ParserOptions.setDefaultParserOptions(parserOptionBuilder.build()); + } val language = mappingConfigSupplier.map(_.get()).map(_.getGeneratedLanguage).getOrElse(generatedLanguage.value) var result = Seq.empty[File] try { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java index 8a0ef020e..f60e35be0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -105,6 +105,9 @@ public class MappingConfigConstants { public static final boolean DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS = false; public static final String DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS_STRING = "false"; + public static final boolean DEFAULT_SKIP_SCHEMA_SIZE_LIMIT = true; + public static final String DEFAULT_SKIP_SCHEMA_SIZE_LIMIT_STRING = "true"; + private MappingConfigConstants() { } }