diff --git a/README.md b/README.md index 39adb61..465d37e 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,13 @@ This library provides extended validation of fields and field arguments for [gra com.graphql-java graphql-java-extended-validation - 16.0.0 + 17.0.0 pom ``` ```groovy -compile 'com.graphql-java:graphql-java-extended-validation:16.0.0' +compile 'com.graphql-java:graphql-java-extended-validation:17.0.0' ``` > Note: @@ -36,8 +36,10 @@ compile 'com.graphql-java:graphql-java-extended-validation:16.0.0' > use 15.0.1 or above for graphql-java 15.x and above > > use 16.0.0 or above for graphql-java 16.x and above +> +> use 17.0.0 or above for graphql-java 17.x and above -Its currently available from JCenter repo and Maven central. +It's currently available from Maven central. # SDL @Directive constraints diff --git a/build.gradle b/build.gradle index 8cd0cca..79ddf05 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ import java.text.SimpleDateFormat plugins { id 'java' + id 'groovy' id 'java-library' id 'maven' id 'maven-publish' @@ -39,8 +40,9 @@ repositories { dependencies { - compile "com.graphql-java:graphql-java:16.2" - compile "org.hibernate.validator:hibernate-validator:6.2.0.Final" + compile "com.graphql-java:graphql-java:17.0-beta1" + compile "com.graphql-java:graphql-java-extended-scalars:17.0-beta1" + compile "org.hibernate.validator:hibernate-validator:7.0.1.Final" compile "org.glassfish:jakarta.el:4.0.0" testCompile 'org.slf4j:slf4j-simple:1.7.31' diff --git a/src/main/java/graphql/validation/constraints/AbstractDirectiveConstraint.java b/src/main/java/graphql/validation/constraints/AbstractDirectiveConstraint.java index d268689..4b0138d 100644 --- a/src/main/java/graphql/validation/constraints/AbstractDirectiveConstraint.java +++ b/src/main/java/graphql/validation/constraints/AbstractDirectiveConstraint.java @@ -193,9 +193,10 @@ protected int getIntArg(GraphQLDirective directive, String argName) { if (argument == null) { return assertExpectedArgType(argName, "Int"); } - Number value = (Number) argument.getValue(); + + Number value = GraphQLArgument.getArgumentValue(argument); if (value == null) { - value = (Number) argument.getDefaultValue(); + value = GraphQLArgument.getArgumentDefaultValue(argument); if (value == null) { return assertExpectedArgType(argName, "Int"); } @@ -216,9 +217,9 @@ protected String getStrArg(GraphQLDirective directive, String argName) { if (argument == null) { return assertExpectedArgType(argName, "String"); } - String value = (String) argument.getValue(); + String value = GraphQLArgument.getArgumentValue(argument); if (value == null) { - value = (String) argument.getDefaultValue(); + value = GraphQLArgument.getArgumentDefaultValue(argument); if (value == null) { return assertExpectedArgType(argName, "String"); } @@ -239,9 +240,9 @@ protected boolean getBoolArg(GraphQLDirective directive, String argName) { if (argument == null) { return assertExpectedArgType(argName, "Boolean"); } - Object value = argument.getValue(); + Object value = GraphQLArgument.getArgumentValue(argument); if (value == null) { - value = argument.getDefaultValue(); + value = GraphQLArgument.getArgumentDefaultValue(argument); if (value == null) { return assertExpectedArgType(argName, "Boolean"); } @@ -261,9 +262,9 @@ protected String getMessageTemplate(GraphQLDirective directive) { String msg = null; GraphQLArgument arg = directive.getArgument("message"); if (arg != null) { - msg = (String) arg.getValue(); + msg = GraphQLArgument.getArgumentValue(arg); if (msg == null) { - msg = (String) arg.getDefaultValue(); + msg = GraphQLArgument.getArgumentDefaultValue(arg); } } if (msg == null) { @@ -316,7 +317,7 @@ protected List mkError(ValidationEnvironment validationEnvironment */ protected boolean isStringOrIDOrList(GraphQLInputType inputType) { return isStringOrID(inputType) || - isList(inputType); + isList(inputType); } /** diff --git a/src/main/java/graphql/validation/constraints/standard/AbstractDecimalMinMaxConstraint.java b/src/main/java/graphql/validation/constraints/standard/AbstractDecimalMinMaxConstraint.java index f02688d..1fb9119 100644 --- a/src/main/java/graphql/validation/constraints/standard/AbstractDecimalMinMaxConstraint.java +++ b/src/main/java/graphql/validation/constraints/standard/AbstractDecimalMinMaxConstraint.java @@ -2,6 +2,7 @@ import graphql.GraphQLError; import graphql.Scalars; +import graphql.scalars.ExtendedScalars; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLInputType; import graphql.schema.GraphQLScalarType; @@ -24,24 +25,24 @@ public AbstractDecimalMinMaxConstraint(String name) { public boolean appliesToType(GraphQLInputType inputType) { return isOneOfTheseTypes(inputType, Scalars.GraphQLString, // note we allow strings - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat ); } public List getApplicableTypeNames() { return Stream.of(Scalars.GraphQLString, // note we allow strings - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat) .map(GraphQLScalarType::getName) .collect(Collectors.toList()); diff --git a/src/main/java/graphql/validation/constraints/standard/AbstractMinMaxConstraint.java b/src/main/java/graphql/validation/constraints/standard/AbstractMinMaxConstraint.java index 1463e1c..52efb2e 100644 --- a/src/main/java/graphql/validation/constraints/standard/AbstractMinMaxConstraint.java +++ b/src/main/java/graphql/validation/constraints/standard/AbstractMinMaxConstraint.java @@ -2,6 +2,7 @@ import graphql.GraphQLError; import graphql.Scalars; +import graphql.scalars.ExtendedScalars; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLInputType; import graphql.schema.GraphQLScalarType; @@ -24,23 +25,23 @@ public AbstractMinMaxConstraint(String name) { @Override public boolean appliesToType(GraphQLInputType inputType) { return isOneOfTheseTypes(inputType, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat ); } public List getApplicableTypeNames() { - return Stream.of(Scalars.GraphQLByte, - Scalars.GraphQLShort, + return Stream.of(ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat) .map(GraphQLScalarType::getName) .collect(toList()); diff --git a/src/main/java/graphql/validation/constraints/standard/AbstractPositiveNegativeConstraint.java b/src/main/java/graphql/validation/constraints/standard/AbstractPositiveNegativeConstraint.java index b2a89e3..916875d 100644 --- a/src/main/java/graphql/validation/constraints/standard/AbstractPositiveNegativeConstraint.java +++ b/src/main/java/graphql/validation/constraints/standard/AbstractPositiveNegativeConstraint.java @@ -2,6 +2,7 @@ import graphql.GraphQLError; import graphql.Scalars; +import graphql.scalars.ExtendedScalars; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLInputType; import graphql.schema.GraphQLScalarType; @@ -24,23 +25,23 @@ public AbstractPositiveNegativeConstraint(String name) { @Override public boolean appliesToType(GraphQLInputType inputType) { return isOneOfTheseTypes(inputType, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat ); } public List getApplicableTypeNames() { - return Stream.of(Scalars.GraphQLByte, - Scalars.GraphQLShort, + return Stream.of(ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat) .map(GraphQLScalarType::getName) .collect(toList()); diff --git a/src/main/java/graphql/validation/constraints/standard/DigitsConstraint.java b/src/main/java/graphql/validation/constraints/standard/DigitsConstraint.java index 11da22b..c162c36 100644 --- a/src/main/java/graphql/validation/constraints/standard/DigitsConstraint.java +++ b/src/main/java/graphql/validation/constraints/standard/DigitsConstraint.java @@ -2,6 +2,7 @@ import graphql.GraphQLError; import graphql.Scalars; +import graphql.scalars.ExtendedScalars; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLInputType; import graphql.schema.GraphQLScalarType; @@ -32,12 +33,12 @@ public Documentation getDocumentation() { .example("buyCar( carCost : Float @Digits(integer : 5, fraction : 2) : DriverDetails") .applicableTypeNames(Stream.of(Scalars.GraphQLString, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat) .map(GraphQLScalarType::getName) .collect(toList())) @@ -52,12 +53,12 @@ public Documentation getDocumentation() { public boolean appliesToType(GraphQLInputType inputType) { return isOneOfTheseTypes(inputType, Scalars.GraphQLString, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat ); } diff --git a/src/main/java/graphql/validation/constraints/standard/RangeConstraint.java b/src/main/java/graphql/validation/constraints/standard/RangeConstraint.java index 292320b..17c28a8 100644 --- a/src/main/java/graphql/validation/constraints/standard/RangeConstraint.java +++ b/src/main/java/graphql/validation/constraints/standard/RangeConstraint.java @@ -2,6 +2,7 @@ import graphql.GraphQLError; import graphql.Scalars; +import graphql.scalars.ExtendedScalars; import graphql.schema.GraphQLDirective; import graphql.schema.GraphQLInputType; import graphql.schema.GraphQLScalarType; @@ -35,12 +36,12 @@ public Documentation getDocumentation() { .example("driver( milesTravelled : Int @Range( min : 1000, max : 100000)) : DriverDetails") .applicableTypeNames(Stream.of(GraphQLString, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat) .map(GraphQLScalarType::getName) .collect(toList())) @@ -55,12 +56,12 @@ Integer.MAX_VALUE, getMessageTemplate()) public boolean appliesToType(GraphQLInputType inputType) { return isOneOfTheseTypes(inputType, GraphQLString, - Scalars.GraphQLByte, - Scalars.GraphQLShort, + ExtendedScalars.GraphQLByte, + ExtendedScalars.GraphQLShort, Scalars.GraphQLInt, - Scalars.GraphQLLong, - Scalars.GraphQLBigDecimal, - Scalars.GraphQLBigInteger, + ExtendedScalars.GraphQLLong, + ExtendedScalars.GraphQLBigDecimal, + ExtendedScalars.GraphQLBigInteger, Scalars.GraphQLFloat ); } diff --git a/src/main/java/graphql/validation/interpolation/ResourceBundleMessageInterpolator.java b/src/main/java/graphql/validation/interpolation/ResourceBundleMessageInterpolator.java index 8a1ac8a..0896a8b 100644 --- a/src/main/java/graphql/validation/interpolation/ResourceBundleMessageInterpolator.java +++ b/src/main/java/graphql/validation/interpolation/ResourceBundleMessageInterpolator.java @@ -15,9 +15,9 @@ import java.util.MissingResourceException; import java.util.Optional; import java.util.ResourceBundle; -import javax.validation.Constraint; -import javax.validation.Path; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Path; +import jakarta.validation.Payload; import org.hibernate.validator.internal.engine.MessageInterpolatorContext; import org.hibernate.validator.internal.metadata.core.ConstraintHelper; import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl; @@ -160,7 +160,7 @@ private MessageInterpolatorContext buildHibernateContext(Map mes return new MessageInterpolatorContext( constraintDescriptor, validatedValue, rootBeanType, - propertyPath, messageParams, expressionVariables, ExpressionLanguageFeatureLevel.DEFAULT, true); + propertyPath, messageParams, expressionVariables, ExpressionLanguageFeatureLevel.BEAN_PROPERTIES, true); } private org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator hibernateInterpolator() { diff --git a/src/main/java/graphql/validation/rules/TargetedValidationRules.java b/src/main/java/graphql/validation/rules/TargetedValidationRules.java index 2ef7207..b12a8aa 100644 --- a/src/main/java/graphql/validation/rules/TargetedValidationRules.java +++ b/src/main/java/graphql/validation/rules/TargetedValidationRules.java @@ -69,7 +69,7 @@ public List runValidationRules(DataFetchingEnvironment env, Messag List errors = new ArrayList<>(); - GraphQLObjectType fieldContainer = env.getExecutionStepInfo().getFieldContainer(); + GraphQLObjectType fieldContainer = env.getExecutionStepInfo().getObjectType(); GraphQLFieldDefinition fieldDefinition = env.getFieldDefinition(); ResultPath fieldPath = env.getExecutionStepInfo().getPath(); // @@ -162,8 +162,7 @@ private List walkObjectArg(ValidationRule rule, ValidationEnvironm for (GraphQLInputObjectField inputField : fieldDefinitions) { GraphQLInputType fieldType = inputField.getType(); - List directives = inputField.getDirectives(); - Object validatedValue = objectMap.getOrDefault(inputField.getName(), inputField.getDefaultValue()); + Object validatedValue = objectMap.getOrDefault(inputField.getName(), GraphQLInputObjectField.getInputFieldDefaultValue(inputField)); if (validatedValue == null) { continue; } diff --git a/src/test/groovy/ELDiscover.java b/src/test/groovy/ELDiscover.java index b03459d..e09e511 100644 --- a/src/test/groovy/ELDiscover.java +++ b/src/test/groovy/ELDiscover.java @@ -1,3 +1,11 @@ +import jakarta.el.ELContext; +import jakarta.el.ELManager; +import jakarta.el.ExpressionFactory; +import jakarta.el.StandardELContext; +import jakarta.el.ValueExpression; +import jakarta.validation.MessageInterpolator; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; import org.hibernate.validator.constraints.Range; import org.hibernate.validator.internal.engine.MessageInterpolatorContext; import org.hibernate.validator.internal.engine.path.PathImpl; @@ -6,16 +14,9 @@ import org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl.ConstraintType; import org.hibernate.validator.internal.metadata.location.ConstraintLocation.ConstraintLocationKind; import org.hibernate.validator.internal.util.annotation.ConstraintAnnotationDescriptor; +import org.hibernate.validator.messageinterpolation.ExpressionLanguageFeatureLevel; import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; -import javax.el.ELContext; -import javax.el.ELManager; -import javax.el.ExpressionFactory; -import javax.el.StandardELContext; -import javax.el.ValueExpression; -import javax.validation.MessageInterpolator; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; @@ -104,8 +105,13 @@ public static void main(String[] args) throws Exception { PathImpl rootPath = PathImpl.createRootPath(); + ExpressionLanguageFeatureLevel level = ExpressionLanguageFeatureLevel.BEAN_METHODS; MessageInterpolator.Context context = new MessageInterpolatorContext( - constraintDescriptor, user, null, rootPath, Collections.emptyMap(), Collections.emptyMap()); + constraintDescriptor, user, null, rootPath, + Collections.emptyMap(), Collections.emptyMap(), + level, + true); + print("${validatedValue.age}", messageInterpolator, context); print("${validatedValue}", messageInterpolator, context);