Skip to content

Commit 1f99631

Browse files
authored
New option to disable GraphQL schema token limit validation #1265 (#1384)
1 parent d72681a commit 1f99631

File tree

7 files changed

+45
-2
lines changed

7 files changed

+45
-2
lines changed

docs/codegen-options.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
| `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<String,Object>`](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html) that will store unknown fields. |
7070
| `unknownFieldsPropertyName` | String | userDefinedFields | Specifies the name of the property to be included in api classes to support unknown fields during serialization or deserialization |
7171
| `skip` | Boolean | False | If true, then code generation will not happen |
72+
| `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.
73+
|
7274

7375

7476
### Option `graphqlSchemas`

plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier;
1616
import com.kobylynskyi.graphql.codegen.supplier.MergeableMappingConfigSupplier;
1717
import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder;
18+
import graphql.parser.ParserOptions;
1819
import org.gradle.api.Action;
1920
import org.gradle.api.DefaultTask;
2021
import org.gradle.api.plugins.JavaPluginExtension;
@@ -123,6 +124,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
123124
private String unknownFieldsPropertyName = MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME;
124125

125126
private Boolean skip = false;
127+
private Boolean skipSchemaSizeLimit = MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT;
126128

127129
public GraphQLCodegenGradleTask() {
128130
setGroup("codegen");
@@ -231,6 +233,15 @@ private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IO
231233
GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get)
232234
.map(MappingConfig::getGeneratedLanguage)
233235
.orElse(generatedLanguage);
236+
237+
if (skipSchemaSizeLimit) {
238+
ParserOptions.Builder parserOptionBuilder = ParserOptions.newParserOptions()
239+
.maxTokens(Integer.MAX_VALUE)
240+
.maxCharacters(Integer.MAX_VALUE)
241+
.maxWhitespaceTokens(Integer.MAX_VALUE)
242+
.maxRuleDepth(Integer.MAX_VALUE);
243+
ParserOptions.setDefaultParserOptions(parserOptionBuilder.build());
244+
}
234245
switch (language) {
235246
case JAVA:
236247
return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath,

plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier;
1717
import com.kobylynskyi.graphql.codegen.supplier.MergeableMappingConfigSupplier;
1818
import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder;
19+
import graphql.parser.ParserOptions;
1920
import org.apache.maven.model.Resource;
2021
import org.apache.maven.plugin.AbstractMojo;
2122
import org.apache.maven.plugin.MojoExecutionException;
@@ -251,6 +252,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
251252
@Parameter(defaultValue = "false")
252253
private boolean skip;
253254

255+
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT_STRING)
256+
private boolean skipSchemaSizeLimit;
257+
254258
@Override
255259
public void execute() throws MojoExecutionException {
256260
addCompileSourceRootIfConfigured();
@@ -342,6 +346,16 @@ private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IO
342346
GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get)
343347
.map(MappingConfig::getGeneratedLanguage)
344348
.orElse(generatedLanguage);
349+
350+
if (skipSchemaSizeLimit) {
351+
ParserOptions.Builder parserOptionBuilder = ParserOptions.newParserOptions()
352+
.maxTokens(Integer.MAX_VALUE)
353+
.maxCharacters(Integer.MAX_VALUE)
354+
.maxWhitespaceTokens(Integer.MAX_VALUE)
355+
.maxRuleDepth(Integer.MAX_VALUE);
356+
ParserOptions.setDefaultParserOptions(parserOptionBuilder.build());
357+
}
358+
345359
switch (language) {
346360
case JAVA:
347361
return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath,

plugins/sbt/graphql-java-codegen-sbt-plugin/build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ lazy val `graphql-codegen-sbt-plugin` = Project(id = "graphql-codegen-sbt-plugin
3333
libraryDependencies ++= Seq(
3434
"io.github.kobylynskyi" % "graphql-java-codegen" % (ThisBuild / version).value,
3535
"org.freemarker" % "freemarker" % "2.3.31",
36-
"com.graphql-java" % "graphql-java" % "20.1",
36+
"com.graphql-java" % "graphql-java" % "20.2",
3737
"com.fasterxml.jackson.core" % "jackson-databind" % "2.12.1",
3838
"com.typesafe" % "config" % "1.4.2"
3939
),

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,5 +178,6 @@ trait GraphQLCodegenKeys {
178178

179179
val supportUnknownFields = settingKey[Boolean]("supportUnknownFields")
180180
val unknownFieldsPropertyName = settingKey[String]("unknownFieldsPropertyName")
181+
val skipSchemaSizeLimit = settingKey[Boolean]("Skip schema size limit checks.")
181182

182183
}

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.dreamylost.graphql.codegen
22

3+
import graphql.parser.ParserOptions
34
import com.kobylynskyi.graphql.codegen.GraphQLCodegenValidate
45
import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen
56
import com.kobylynskyi.graphql.codegen.model._
@@ -131,7 +132,8 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
131132
unknownFieldsPropertyName := MappingConfigConstants.DEFAULT_UNKNOWN_FIELDS_PROPERTY_NAME,
132133
generateNoArgsConstructorOnly := MappingConfigConstants.DEFAULT_GENERATE_NOARGS_CONSTRUCTOR_ONLY,
133134
generateModelsWithPublicFields := MappingConfigConstants.DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS,
134-
skip := false
135+
skip := false,
136+
skipSchemaSizeLimit := MappingConfigConstants.DEFAULT_SKIP_SCHEMA_SIZE_LIMIT
135137
)
136138

137139
private def getMappingConfig(): Def.Initialize[MappingConfig] = Def.setting {
@@ -247,6 +249,16 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
247249
graphqlCodegen := {
248250
sLog.value.info(s"Generating files: ${BuildInfo.toString}")
249251
val mappingConfigSupplier = buildJsonSupplier(configurationFiles.value)
252+
253+
if (skipSchemaSizeLimit.value) {
254+
val parserOptionBuilder = ParserOptions
255+
.newParserOptions()
256+
.maxTokens(Integer.MAX_VALUE)
257+
.maxCharacters(Integer.MAX_VALUE)
258+
.maxWhitespaceTokens(Integer.MAX_VALUE)
259+
.maxRuleDepth(Integer.MAX_VALUE);
260+
ParserOptions.setDefaultParserOptions(parserOptionBuilder.build());
261+
}
250262
val language = mappingConfigSupplier.map(_.get()).map(_.getGeneratedLanguage).getOrElse(generatedLanguage.value)
251263
var result = Seq.empty[File]
252264
try {

src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ public class MappingConfigConstants {
108108
public static final boolean DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS = false;
109109
public static final String DEFAULT_GENERATE_MODELS_WITH_PUBLIC_FIELDS_STRING = "false";
110110

111+
public static final boolean DEFAULT_SKIP_SCHEMA_SIZE_LIMIT = true;
112+
public static final String DEFAULT_SKIP_SCHEMA_SIZE_LIMIT_STRING = "true";
113+
111114
private MappingConfigConstants() {
112115
}
113116
}

0 commit comments

Comments
 (0)