mirror of
https://github.com/jlengrand/quarkus.git
synced 2026-03-10 08:41:22 +00:00
Bean validation
This commit is contained in:
27
bean-validation/deployment/pom.xml
Normal file
27
bean-validation/deployment/pom.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>shamrock-bean-validation</artifactId>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<version>1.0.0.Alpha1-SNAPSHOT</version>
|
||||
<relativePath>../</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>shamrock-bean-validation-deployment</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-core-deployment</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-bean-validation-runtime</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,92 @@
|
||||
package org.jboss.shamrock.beanvalidation;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.validation.Constraint;
|
||||
import javax.validation.ConstraintValidator;
|
||||
|
||||
import org.jboss.jandex.AnnotationInstance;
|
||||
import org.jboss.jandex.AnnotationTarget;
|
||||
import org.jboss.jandex.ClassInfo;
|
||||
import org.jboss.jandex.DotName;
|
||||
import org.jboss.jandex.ParameterizedType;
|
||||
import org.jboss.jandex.Type;
|
||||
import org.jboss.shamrock.beanvalidation.runtime.ValidatorProvider;
|
||||
import org.jboss.shamrock.beanvalidation.runtime.ValidatorTemplate;
|
||||
import org.jboss.shamrock.deployment.ArchiveContext;
|
||||
import org.jboss.shamrock.deployment.BeanDeployment;
|
||||
import org.jboss.shamrock.deployment.ProcessorContext;
|
||||
import org.jboss.shamrock.deployment.ResourceProcessor;
|
||||
import org.jboss.shamrock.deployment.RuntimePriority;
|
||||
import org.jboss.shamrock.deployment.ShamrockConfig;
|
||||
import org.jboss.shamrock.deployment.codegen.BytecodeRecorder;
|
||||
import org.jboss.shamrock.runtime.InjectionInstance;
|
||||
|
||||
class BeanValidationProcessor implements ResourceProcessor {
|
||||
|
||||
private static final DotName CONSTRAINT_VALIDATOR = DotName.createSimple(ConstraintValidator.class.getName());
|
||||
@Inject
|
||||
private BeanDeployment beanDeployment;
|
||||
|
||||
@Inject
|
||||
private ShamrockConfig config;
|
||||
|
||||
@Override
|
||||
public void process(ArchiveContext archiveContext, ProcessorContext processorContext) throws Exception {
|
||||
beanDeployment.addAdditionalBean(ValidatorProvider.class);
|
||||
processorContext.addResourceBundle("org.hibernate.validator.ValidationMessages");
|
||||
//TODO: this should not rely on the index and implementation being indexed, this stuff should just be hard coded
|
||||
try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.BEAN_VALIDATION_DEPLOYMENT)) {
|
||||
ValidatorTemplate template = recorder.getRecordingProxy(ValidatorTemplate.class);
|
||||
template.forceInit((InjectionInstance<ValidatorProvider>) recorder.newInstanceFactory(ValidatorProvider.class.getName()));
|
||||
}
|
||||
processorContext.addReflectiveClass(true, false, Constraint.class.getName());
|
||||
Set<DotName> constraintAnnotations = new HashSet<>();
|
||||
for (AnnotationInstance annotation : archiveContext.getCombinedIndex().getAnnotations(DotName.createSimple(Constraint.class.getName()))) {
|
||||
constraintAnnotations.add(annotation.target().asClass().name());
|
||||
processorContext.addReflectiveClass(true, false, annotation.target().asClass().name().toString());
|
||||
}
|
||||
for (DotName constraint : constraintAnnotations) {
|
||||
for (AnnotationInstance annotation : archiveContext.getCombinedIndex().getAnnotations(constraint)) {
|
||||
if (annotation.target().kind() == AnnotationTarget.Kind.FIELD) {
|
||||
processorContext.addReflectiveField(annotation.target().asField());
|
||||
} else if (annotation.target().kind() == AnnotationTarget.Kind.METHOD) {
|
||||
processorContext.addReflectiveMethod(annotation.target().asMethod());
|
||||
} else if (annotation.target().kind() == AnnotationTarget.Kind.METHOD_PARAMETER) {
|
||||
processorContext.addReflectiveMethod(annotation.target().asMethodParameter().method());
|
||||
} else if (annotation.target().kind() == AnnotationTarget.Kind.CLASS) {
|
||||
processorContext.addReflectiveClass(true, true, annotation.target().asClass().name().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (ClassInfo classInfo : archiveContext.getCombinedIndex().getAllKnownImplementors(CONSTRAINT_VALIDATOR)) {
|
||||
boolean skip = false;
|
||||
for (Type iface : classInfo.interfaceTypes()) {
|
||||
if (iface.kind() == Type.Kind.PARAMETERIZED_TYPE) {
|
||||
ParameterizedType pt = iface.asParameterizedType();
|
||||
if (pt.name().equals(CONSTRAINT_VALIDATOR)) {
|
||||
if (pt.arguments().size() == 2) {
|
||||
String type = pt.arguments().get(1).name().toString();
|
||||
if (type.startsWith("javax.money") ||
|
||||
type.startsWith("org.joda")) {
|
||||
//TODO: what if joda is present?
|
||||
skip = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!skip) { //such hacks
|
||||
processorContext.addReflectiveClass(false, false, classInfo.name().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation;
|
||||
|
||||
import org.jboss.shamrock.deployment.SetupContext;
|
||||
import org.jboss.shamrock.deployment.ShamrockSetup;
|
||||
|
||||
public class BeanValidationSetup implements ShamrockSetup {
|
||||
@Override
|
||||
public void setup(SetupContext context) {
|
||||
context.addResourceProcessor(new BeanValidationProcessor());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
org.jboss.shamrock.beanvalidation.BeanValidationSetup
|
||||
@@ -0,0 +1,3 @@
|
||||
index-dependencies:
|
||||
- "javax.validation:validation-api"
|
||||
- "org.hibernate.validator:hibernate-validator"
|
||||
18
bean-validation/pom.xml
Normal file
18
bean-validation/pom.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>shamrock-parent</artifactId>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<version>1.0.0.Alpha1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>shamrock-bean-validation</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>deployment</module>
|
||||
<module>runtime</module>
|
||||
</modules>
|
||||
</project>
|
||||
41
bean-validation/runtime/pom.xml
Normal file
41
bean-validation/runtime/pom.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>shamrock-bean-validation</artifactId>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<version>1.0.0.Alpha1-SNAPSHOT</version>
|
||||
<relativePath>../</relativePath>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>shamrock-bean-validation-runtime</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-core-runtime</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.glassfish.web</groupId>
|
||||
<artifactId>el-impl</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.graalvm</groupId>
|
||||
<artifactId>graal-annotations</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,34 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.enterprise.context.ApplicationScoped;
|
||||
import javax.enterprise.inject.Produces;
|
||||
import javax.validation.Validation;
|
||||
import javax.validation.Validator;
|
||||
import javax.validation.ValidatorFactory;
|
||||
|
||||
@ApplicationScoped
|
||||
public class ValidatorProvider {
|
||||
|
||||
ValidatorFactory factory;
|
||||
|
||||
@PostConstruct
|
||||
public void setup() {
|
||||
factory = Validation.buildDefaultValidatorFactory();
|
||||
}
|
||||
|
||||
@Produces
|
||||
public ValidatorFactory factory() {
|
||||
return factory;
|
||||
}
|
||||
|
||||
@Produces
|
||||
public Validator validator() {
|
||||
return factory.getValidator();
|
||||
}
|
||||
|
||||
public void forceInit() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime;
|
||||
|
||||
import org.jboss.shamrock.runtime.InjectionInstance;
|
||||
|
||||
public class ValidatorTemplate {
|
||||
|
||||
/**
|
||||
* Force the validation factory to be created at static init time, so it is
|
||||
* bootstrapped in a JVM rather than in native-image
|
||||
*
|
||||
* TODO: we really only need to run in native-image
|
||||
*
|
||||
* @param provider
|
||||
*/
|
||||
public void forceInit(InjectionInstance<ValidatorProvider> provider) {
|
||||
provider.newInstance().forceInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,555 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.validation.ConstraintValidator;
|
||||
import javax.validation.constraints.AssertFalse;
|
||||
import javax.validation.constraints.AssertTrue;
|
||||
import javax.validation.constraints.DecimalMax;
|
||||
import javax.validation.constraints.DecimalMin;
|
||||
import javax.validation.constraints.Digits;
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.Future;
|
||||
import javax.validation.constraints.FutureOrPresent;
|
||||
import javax.validation.constraints.Max;
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.Negative;
|
||||
import javax.validation.constraints.NegativeOrZero;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Null;
|
||||
import javax.validation.constraints.Past;
|
||||
import javax.validation.constraints.PastOrPresent;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.validation.constraints.Positive;
|
||||
import javax.validation.constraints.PositiveOrZero;
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
import org.hibernate.validator.constraints.CodePointLength;
|
||||
import org.hibernate.validator.constraints.Currency;
|
||||
import org.hibernate.validator.constraints.EAN;
|
||||
import org.hibernate.validator.constraints.ISBN;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
import org.hibernate.validator.constraints.LuhnCheck;
|
||||
import org.hibernate.validator.constraints.Mod10Check;
|
||||
import org.hibernate.validator.constraints.Mod11Check;
|
||||
import org.hibernate.validator.constraints.ModCheck;
|
||||
import org.hibernate.validator.constraints.ParameterScriptAssert;
|
||||
import org.hibernate.validator.constraints.SafeHtml;
|
||||
import org.hibernate.validator.constraints.ScriptAssert;
|
||||
import org.hibernate.validator.constraints.URL;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
import org.hibernate.validator.constraints.br.CNPJ;
|
||||
import org.hibernate.validator.constraints.br.CPF;
|
||||
import org.hibernate.validator.constraints.pl.NIP;
|
||||
import org.hibernate.validator.constraints.pl.PESEL;
|
||||
import org.hibernate.validator.constraints.pl.REGON;
|
||||
import org.hibernate.validator.constraints.time.DurationMax;
|
||||
import org.hibernate.validator.constraints.time.DurationMin;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.AssertFalseValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.AssertTrueValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.DecimalMaxValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.DecimalMinValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.DigitsValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.DigitsValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.EmailValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.MaxValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.MinValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.NotNullValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.NullValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.PatternValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.CurrencyValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.DecimalMaxValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.DecimalMinValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.MaxValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.MinValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.NegativeOrZeroValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.NegativeValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.PositiveOrZeroValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.PositiveValidatorForMonetaryAmount;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArray;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfBoolean;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfChar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfInt;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForArraysOfShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForCollection;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.notempty.NotEmptyValidatorForMap;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MaxValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.MinValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMaxValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.bound.decimal.DecimalMinValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeOrZeroValidatorForShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.NegativeValidatorForShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveOrZeroValidatorForShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForBigDecimal;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForBigInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForInteger;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForNumber;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.number.sign.PositiveValidatorForShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArray;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfBoolean;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfByte;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfChar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfDouble;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfFloat;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfInt;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfLong;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForArraysOfShort;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForCharSequence;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForCollection;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.size.SizeValidatorForMap;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForCalendar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForHijrahDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForJapaneseDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForLocalDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForLocalDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForLocalTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForMinguoDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForMonthDay;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForOffsetDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForOffsetTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForReadableInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForReadablePartial;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForThaiBuddhistDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForYear;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForYearMonth;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.future.FutureValidatorForZonedDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForCalendar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForHijrahDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForJapaneseDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForLocalDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForLocalDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForLocalTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForMinguoDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForMonthDay;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForOffsetDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForOffsetTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForReadableInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForReadablePartial;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForThaiBuddhistDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForYear;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForYearMonth;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.futureorpresent.FutureOrPresentValidatorForZonedDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForCalendar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForHijrahDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForJapaneseDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForLocalDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForLocalDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForLocalTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForMinguoDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForMonthDay;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForOffsetDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForOffsetTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForReadableInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForReadablePartial;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForThaiBuddhistDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForYear;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForYearMonth;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.past.PastValidatorForZonedDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForCalendar;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForHijrahDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForJapaneseDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForLocalDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForLocalDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForLocalTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForMinguoDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForMonthDay;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForOffsetDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForOffsetTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForReadableInstant;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForReadablePartial;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForThaiBuddhistDate;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForYear;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForYearMonth;
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.time.pastorpresent.PastOrPresentValidatorForZonedDateTime;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.CodePointLengthValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.EANValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.ISBNValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.LengthValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.LuhnCheckValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.Mod10CheckValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.Mod11CheckValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.ModCheckValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.ParameterScriptAssertValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.SafeHtmlValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.ScriptAssertValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.URLValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.UniqueElementsValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.br.CNPJValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.br.CPFValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.pl.NIPValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.pl.PESELValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.pl.REGONValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.time.DurationMaxValidator;
|
||||
import org.hibernate.validator.internal.constraintvalidators.hv.time.DurationMinValidator;
|
||||
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor;
|
||||
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
|
||||
import org.hibernate.validator.internal.util.CollectionHelper;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(ConstraintHelper.class)
|
||||
final class ConstraintHelperSubstitution {
|
||||
|
||||
@Alias
|
||||
private final Map<Class<? extends Annotation>, List<? extends ConstraintValidatorDescriptor<?>>> builtinConstraints;
|
||||
|
||||
@Substitute
|
||||
public ConstraintHelperSubstitution () {
|
||||
Map<Class<? extends Annotation>, List<ConstraintValidatorDescriptor<?>>> tmpConstraints = new HashMap<>();
|
||||
|
||||
// Bean Validation constraints
|
||||
|
||||
putConstraint( tmpConstraints, AssertFalse.class, AssertFalseValidator.class );
|
||||
putConstraint( tmpConstraints, AssertTrue.class, AssertTrueValidator.class );
|
||||
|
||||
|
||||
putConstraints( tmpConstraints, DecimalMax.class, Arrays.asList(
|
||||
DecimalMaxValidatorForBigDecimal.class,
|
||||
DecimalMaxValidatorForBigInteger.class,
|
||||
DecimalMaxValidatorForDouble.class,
|
||||
DecimalMaxValidatorForFloat.class,
|
||||
DecimalMaxValidatorForLong.class,
|
||||
DecimalMaxValidatorForNumber.class,
|
||||
DecimalMaxValidatorForCharSequence.class
|
||||
) );
|
||||
putConstraints( tmpConstraints, DecimalMin.class, Arrays.asList(
|
||||
DecimalMinValidatorForBigDecimal.class,
|
||||
DecimalMinValidatorForBigInteger.class,
|
||||
DecimalMinValidatorForDouble.class,
|
||||
DecimalMinValidatorForFloat.class,
|
||||
DecimalMinValidatorForLong.class,
|
||||
DecimalMinValidatorForNumber.class,
|
||||
DecimalMinValidatorForCharSequence.class
|
||||
) );
|
||||
|
||||
putConstraints( tmpConstraints, Digits.class, DigitsValidatorForCharSequence.class, DigitsValidatorForNumber.class );
|
||||
putConstraint( tmpConstraints, Email.class, EmailValidator.class );
|
||||
|
||||
List<Class<? extends ConstraintValidator<Future, ?>>> futureValidators = new ArrayList<>( 18 );
|
||||
futureValidators.add( FutureValidatorForCalendar.class );
|
||||
futureValidators.add( FutureValidatorForDate.class );
|
||||
// Java 8 date/time API validators
|
||||
futureValidators.add( FutureValidatorForHijrahDate.class );
|
||||
futureValidators.add( FutureValidatorForInstant.class );
|
||||
futureValidators.add( FutureValidatorForJapaneseDate.class );
|
||||
futureValidators.add( FutureValidatorForLocalDate.class );
|
||||
futureValidators.add( FutureValidatorForLocalDateTime.class );
|
||||
futureValidators.add( FutureValidatorForLocalTime.class );
|
||||
futureValidators.add( FutureValidatorForMinguoDate.class );
|
||||
futureValidators.add( FutureValidatorForMonthDay.class );
|
||||
futureValidators.add( FutureValidatorForOffsetDateTime.class );
|
||||
futureValidators.add( FutureValidatorForOffsetTime.class );
|
||||
futureValidators.add( FutureValidatorForThaiBuddhistDate.class );
|
||||
futureValidators.add( FutureValidatorForYear.class );
|
||||
futureValidators.add( FutureValidatorForYearMonth.class );
|
||||
futureValidators.add( FutureValidatorForZonedDateTime.class );
|
||||
|
||||
putConstraints( tmpConstraints, Future.class, futureValidators );
|
||||
|
||||
List<Class<? extends ConstraintValidator<FutureOrPresent, ?>>> futureOrPresentValidators = new ArrayList<>( 18 );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForCalendar.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForDate.class );
|
||||
// Java 8 date/time API validators
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForHijrahDate.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForInstant.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForJapaneseDate.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForLocalDate.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForLocalDateTime.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForLocalTime.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForMinguoDate.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForMonthDay.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForOffsetDateTime.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForOffsetTime.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForThaiBuddhistDate.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForYear.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForYearMonth.class );
|
||||
futureOrPresentValidators.add( FutureOrPresentValidatorForZonedDateTime.class );
|
||||
|
||||
putConstraints( tmpConstraints, FutureOrPresent.class, futureOrPresentValidators );
|
||||
|
||||
putConstraint( tmpConstraints, ISBN.class, ISBNValidator.class );
|
||||
|
||||
putConstraints( tmpConstraints, Max.class, Arrays.asList(
|
||||
MaxValidatorForBigDecimal.class,
|
||||
MaxValidatorForBigInteger.class,
|
||||
MaxValidatorForDouble.class,
|
||||
MaxValidatorForFloat.class,
|
||||
MaxValidatorForLong.class,
|
||||
MaxValidatorForNumber.class,
|
||||
MaxValidatorForCharSequence.class
|
||||
) );
|
||||
putConstraints( tmpConstraints, Min.class, Arrays.asList(
|
||||
MinValidatorForBigDecimal.class,
|
||||
MinValidatorForBigInteger.class,
|
||||
MinValidatorForDouble.class,
|
||||
MinValidatorForFloat.class,
|
||||
MinValidatorForLong.class,
|
||||
MinValidatorForNumber.class,
|
||||
MinValidatorForCharSequence.class
|
||||
) );
|
||||
|
||||
putConstraints( tmpConstraints, Negative.class, Arrays.asList(
|
||||
NegativeValidatorForBigDecimal.class,
|
||||
NegativeValidatorForBigInteger.class,
|
||||
NegativeValidatorForDouble.class,
|
||||
NegativeValidatorForFloat.class,
|
||||
NegativeValidatorForLong.class,
|
||||
NegativeValidatorForInteger.class,
|
||||
NegativeValidatorForShort.class,
|
||||
NegativeValidatorForByte.class,
|
||||
NegativeValidatorForNumber.class
|
||||
) );
|
||||
|
||||
putConstraints( tmpConstraints, NegativeOrZero.class, Arrays.asList(
|
||||
NegativeOrZeroValidatorForBigDecimal.class,
|
||||
NegativeOrZeroValidatorForBigInteger.class,
|
||||
NegativeOrZeroValidatorForDouble.class,
|
||||
NegativeOrZeroValidatorForFloat.class,
|
||||
NegativeOrZeroValidatorForLong.class,
|
||||
NegativeOrZeroValidatorForInteger.class,
|
||||
NegativeOrZeroValidatorForShort.class,
|
||||
NegativeOrZeroValidatorForByte.class,
|
||||
NegativeOrZeroValidatorForNumber.class
|
||||
) );
|
||||
|
||||
putConstraint( tmpConstraints, NotBlank.class, NotBlankValidator.class );
|
||||
|
||||
List<Class<? extends ConstraintValidator<NotEmpty, ?>>> notEmptyValidators = new ArrayList<>( 11 );
|
||||
notEmptyValidators.add( NotEmptyValidatorForCharSequence.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForCollection.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArray.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForMap.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfBoolean.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfByte.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfChar.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfDouble.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfFloat.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfInt.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfLong.class );
|
||||
notEmptyValidators.add( NotEmptyValidatorForArraysOfShort.class );
|
||||
putConstraints( tmpConstraints, NotEmpty.class, notEmptyValidators );
|
||||
|
||||
putConstraint( tmpConstraints, NotNull.class, NotNullValidator.class );
|
||||
putConstraint( tmpConstraints, Null.class, NullValidator.class );
|
||||
|
||||
List<Class<? extends ConstraintValidator<Past, ?>>> pastValidators = new ArrayList<>( 18 );
|
||||
pastValidators.add( PastValidatorForCalendar.class );
|
||||
pastValidators.add( PastValidatorForDate.class );
|
||||
// Java 8 date/time API validators
|
||||
pastValidators.add( PastValidatorForHijrahDate.class );
|
||||
pastValidators.add( PastValidatorForInstant.class );
|
||||
pastValidators.add( PastValidatorForJapaneseDate.class );
|
||||
pastValidators.add( PastValidatorForLocalDate.class );
|
||||
pastValidators.add( PastValidatorForLocalDateTime.class );
|
||||
pastValidators.add( PastValidatorForLocalTime.class );
|
||||
pastValidators.add( PastValidatorForMinguoDate.class );
|
||||
pastValidators.add( PastValidatorForMonthDay.class );
|
||||
pastValidators.add( PastValidatorForOffsetDateTime.class );
|
||||
pastValidators.add( PastValidatorForOffsetTime.class );
|
||||
pastValidators.add( PastValidatorForThaiBuddhistDate.class );
|
||||
pastValidators.add( PastValidatorForYear.class );
|
||||
pastValidators.add( PastValidatorForYearMonth.class );
|
||||
pastValidators.add( PastValidatorForZonedDateTime.class );
|
||||
|
||||
putConstraints( tmpConstraints, Past.class, pastValidators );
|
||||
|
||||
List<Class<? extends ConstraintValidator<PastOrPresent, ?>>> pastOrPresentValidators = new ArrayList<>( 18 );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForCalendar.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForDate.class );
|
||||
// Java 8 date/time API validators
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForHijrahDate.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForInstant.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForJapaneseDate.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForLocalDate.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForLocalDateTime.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForLocalTime.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForMinguoDate.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForMonthDay.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForOffsetDateTime.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForOffsetTime.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForThaiBuddhistDate.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForYear.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForYearMonth.class );
|
||||
pastOrPresentValidators.add( PastOrPresentValidatorForZonedDateTime.class );
|
||||
|
||||
putConstraints( tmpConstraints, PastOrPresent.class, pastOrPresentValidators );
|
||||
|
||||
putConstraint( tmpConstraints, Pattern.class, PatternValidator.class );
|
||||
putConstraints( tmpConstraints, Positive.class, Arrays.asList(
|
||||
PositiveValidatorForBigDecimal.class,
|
||||
PositiveValidatorForBigInteger.class,
|
||||
PositiveValidatorForDouble.class,
|
||||
PositiveValidatorForFloat.class,
|
||||
PositiveValidatorForLong.class,
|
||||
PositiveValidatorForInteger.class,
|
||||
PositiveValidatorForShort.class,
|
||||
PositiveValidatorForByte.class,
|
||||
PositiveValidatorForNumber.class
|
||||
) );
|
||||
|
||||
putConstraints( tmpConstraints, PositiveOrZero.class, Arrays.asList(
|
||||
PositiveOrZeroValidatorForBigDecimal.class,
|
||||
PositiveOrZeroValidatorForBigInteger.class,
|
||||
PositiveOrZeroValidatorForDouble.class,
|
||||
PositiveOrZeroValidatorForFloat.class,
|
||||
PositiveOrZeroValidatorForLong.class,
|
||||
PositiveOrZeroValidatorForInteger.class,
|
||||
PositiveOrZeroValidatorForShort.class,
|
||||
PositiveOrZeroValidatorForByte.class,
|
||||
PositiveOrZeroValidatorForNumber.class
|
||||
) );
|
||||
|
||||
List<Class<? extends ConstraintValidator<Size, ?>>> sizeValidators = new ArrayList<>( 11 );
|
||||
sizeValidators.add( SizeValidatorForCharSequence.class );
|
||||
sizeValidators.add( SizeValidatorForCollection.class );
|
||||
sizeValidators.add( SizeValidatorForArray.class );
|
||||
sizeValidators.add( SizeValidatorForMap.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfBoolean.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfByte.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfChar.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfDouble.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfFloat.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfInt.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfLong.class );
|
||||
sizeValidators.add( SizeValidatorForArraysOfShort.class );
|
||||
putConstraints( tmpConstraints, Size.class, sizeValidators );
|
||||
|
||||
// Hibernate Validator specific constraints
|
||||
|
||||
putConstraint( tmpConstraints, CNPJ.class, CNPJValidator.class );
|
||||
putConstraint( tmpConstraints, CPF.class, CPFValidator.class );
|
||||
putConstraint( tmpConstraints, DurationMax.class, DurationMaxValidator.class );
|
||||
putConstraint( tmpConstraints, DurationMin.class, DurationMinValidator.class );
|
||||
putConstraint( tmpConstraints, EAN.class, EANValidator.class );
|
||||
putConstraint( tmpConstraints, org.hibernate.validator.constraints.Email.class, org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator.class );
|
||||
putConstraint( tmpConstraints, Length.class, LengthValidator.class );
|
||||
putConstraint( tmpConstraints, CodePointLength.class, CodePointLengthValidator.class );
|
||||
putConstraint( tmpConstraints, ModCheck.class, ModCheckValidator.class );
|
||||
putConstraint( tmpConstraints, LuhnCheck.class, LuhnCheckValidator.class );
|
||||
putConstraint( tmpConstraints, Mod10Check.class, Mod10CheckValidator.class );
|
||||
putConstraint( tmpConstraints, Mod11Check.class, Mod11CheckValidator.class );
|
||||
putConstraint( tmpConstraints, REGON.class, REGONValidator.class );
|
||||
putConstraint( tmpConstraints, NIP.class, NIPValidator.class );
|
||||
putConstraint( tmpConstraints, PESEL.class, PESELValidator.class );
|
||||
putConstraint( tmpConstraints, org.hibernate.validator.constraints.NotBlank.class, org.hibernate.validator.internal.constraintvalidators.hv.NotBlankValidator.class );
|
||||
putConstraint( tmpConstraints, ParameterScriptAssert.class, ParameterScriptAssertValidator.class );
|
||||
putConstraint( tmpConstraints, SafeHtml.class, SafeHtmlValidator.class );
|
||||
putConstraint( tmpConstraints, ScriptAssert.class, ScriptAssertValidator.class );
|
||||
putConstraint( tmpConstraints, UniqueElements.class, UniqueElementsValidator.class );
|
||||
putConstraint( tmpConstraints, URL.class, URLValidator.class );
|
||||
|
||||
this.builtinConstraints = Collections.unmodifiableMap( tmpConstraints );
|
||||
}
|
||||
|
||||
@Substitute
|
||||
private void assertValidationAppliesToParameterSetUpCorrectly(Class<? extends Annotation> annotationType) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Substitute
|
||||
private void assertPayloadParameterExists(Class<? extends Annotation> annotationType) {
|
||||
}
|
||||
|
||||
|
||||
@Substitute
|
||||
private void assertNoParameterStartsWithValid(Class<? extends Annotation> annotationType) {
|
||||
}
|
||||
|
||||
|
||||
@Substitute
|
||||
private void assertGroupsParameterExists(Class<? extends Annotation> annotationType) {
|
||||
}
|
||||
|
||||
@Substitute
|
||||
private void assertMessageParameterExists(Class<? extends Annotation> annotationType) {
|
||||
}
|
||||
|
||||
@Alias
|
||||
private static <A extends Annotation> void putConstraint(Map<Class<? extends Annotation>, List<ConstraintValidatorDescriptor<?>>> validators, Class<A> constraintType, Class<? extends ConstraintValidator<A, ?>> validatorType) {
|
||||
}
|
||||
|
||||
@Alias
|
||||
private static <A extends Annotation> void putConstraints(Map<Class<? extends Annotation>, List<ConstraintValidatorDescriptor<?>>> validators, Class<A> constraintType, Class<? extends ConstraintValidator<A, ?>> validatorType1, Class<? extends ConstraintValidator<A, ?>> validatorType2) {
|
||||
|
||||
}
|
||||
|
||||
@Alias
|
||||
private static <A extends Annotation> void putConstraints(Map<Class<? extends Annotation>, List<ConstraintValidatorDescriptor<?>>> validators, Class<A> constraintType, List<Class<? extends ConstraintValidator<A, ?>>> validatorDescriptors) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.CurrencyValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(CurrencyValidatorForMonetaryAmount.class)
|
||||
final class CurrencyValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.DecimalMaxValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(DecimalMaxValidatorForMonetaryAmount.class)
|
||||
final class DecimalMaxValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.DecimalMinValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(DecimalMinValidatorForMonetaryAmount.class)
|
||||
final class DecimalMinValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.MaxValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(MaxValidatorForMonetaryAmount.class)
|
||||
final class MaxValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.MinValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(MinValidatorForMonetaryAmount.class)
|
||||
final class MinValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.NegativeOrZeroValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(NegativeOrZeroValidatorForMonetaryAmount.class)
|
||||
final class NegativeOrZeroValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.NegativeValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(NegativeValidatorForMonetaryAmount.class)
|
||||
final class NegativeValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.validator.internal.util.privilegedactions.GetResources;
|
||||
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(PlatformResourceBundleLocator.class)
|
||||
final class PlatformResourceBundleLocatorSubstitution {
|
||||
@Alias
|
||||
private static final Logger log = null;
|
||||
@Alias
|
||||
private final String bundleName = null;
|
||||
@Alias
|
||||
private final ClassLoader classLoader = null;
|
||||
@Alias
|
||||
private final boolean aggregate = false;
|
||||
|
||||
@Substitute
|
||||
private ResourceBundle loadBundle(ClassLoader classLoader, Locale locale, String message) {
|
||||
ResourceBundle rb = null;
|
||||
try {
|
||||
if (aggregate) {
|
||||
rb = ResourceBundle.getBundle(
|
||||
bundleName,
|
||||
locale,
|
||||
classLoader,
|
||||
AggregateResourceBundle.CONTROL
|
||||
);
|
||||
} else {
|
||||
rb = ResourceBundle.getBundle(
|
||||
bundleName,
|
||||
locale,
|
||||
classLoader
|
||||
);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
log.trace(message);
|
||||
}
|
||||
return rb;
|
||||
}
|
||||
|
||||
|
||||
private static class AggregateResourceBundleControl extends ResourceBundle.Control {
|
||||
@Override
|
||||
public ResourceBundle newBundle(
|
||||
String baseName,
|
||||
Locale locale,
|
||||
String format,
|
||||
ClassLoader loader,
|
||||
boolean reload)
|
||||
throws IllegalAccessException, InstantiationException, IOException {
|
||||
// only *.properties files can be aggregated. Other formats are delegated to the default implementation
|
||||
if (!"java.properties".equals(format)) {
|
||||
return super.newBundle(baseName, locale, format, loader, reload);
|
||||
}
|
||||
|
||||
String resourceName = toBundleName(baseName, locale) + ".properties";
|
||||
Properties properties = load(resourceName, loader);
|
||||
return properties.size() == 0 ? null : new AggregateResourceBundle(properties);
|
||||
}
|
||||
|
||||
private Properties load(String resourceName, ClassLoader loader) throws IOException {
|
||||
Properties aggregatedProperties = new Properties();
|
||||
Enumeration<URL> urls = GetResources.action(loader, resourceName).run();
|
||||
while (urls.hasMoreElements()) {
|
||||
URL url = urls.nextElement();
|
||||
Properties properties = new Properties();
|
||||
properties.load(url.openStream());
|
||||
aggregatedProperties.putAll(properties);
|
||||
}
|
||||
return aggregatedProperties;
|
||||
}
|
||||
}
|
||||
|
||||
private static class AggregateResourceBundle extends ResourceBundle {
|
||||
|
||||
protected static final Control CONTROL = new AggregateResourceBundleControl();
|
||||
private final Properties properties;
|
||||
|
||||
protected AggregateResourceBundle(Properties properties) {
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object handleGetObject(String key) {
|
||||
return properties.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<String> getKeys() {
|
||||
Set<String> keySet = newHashSet();
|
||||
keySet.addAll(properties.stringPropertyNames());
|
||||
if (parent != null) {
|
||||
keySet.addAll(Collections.list(parent.getKeys()));
|
||||
}
|
||||
return Collections.enumeration(keySet);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.PositiveOrZeroValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(PositiveOrZeroValidatorForMonetaryAmount.class)
|
||||
final class PositiveOrZeroValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.jboss.shamrock.beanvalidation.runtime.graal;
|
||||
|
||||
import org.hibernate.validator.internal.constraintvalidators.bv.money.PositiveValidatorForMonetaryAmount;
|
||||
|
||||
import com.oracle.svm.core.annotate.Delete;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@Delete()
|
||||
@TargetClass(PositiveValidatorForMonetaryAmount.class)
|
||||
final class PositiveValidatorForMonetaryAmountDelete {
|
||||
}
|
||||
@@ -163,6 +163,7 @@ public class BuildTimeGenerator {
|
||||
private final List<DeploymentTaskHolder> staticInitTasks = new ArrayList<>();
|
||||
private final Map<String, ReflectionInfo> reflectiveClasses = new LinkedHashMap<>();
|
||||
private final Set<String> resources = new HashSet<>();
|
||||
private final Set<String> resourceBundles = new HashSet<>();
|
||||
|
||||
@Override
|
||||
public BytecodeRecorder addStaticInitTask(int priority) {
|
||||
@@ -240,6 +241,11 @@ public class BuildTimeGenerator {
|
||||
resources.add(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addResourceBundle(String bundle) {
|
||||
resourceBundles.add(bundle);
|
||||
}
|
||||
|
||||
void writeMainClass() throws IOException {
|
||||
|
||||
Collections.sort(tasks);
|
||||
@@ -300,6 +306,10 @@ public class BuildTimeGenerator {
|
||||
for (String i : resources) {
|
||||
beforeAn.invokeStaticMethod(ofMethod(ResourceHelper.class, "registerResources", void.class, String.class), beforeAn.load(i));
|
||||
}
|
||||
ResultHandle locSupport = beforeAn.invokeStaticMethod(MethodDescriptor.ofMethod("org.graalvm.nativeimage.ImageSingletons", "lookup", Object.class, Class.class), beforeAn.loadClass("com.oracle.svm.core.jdk.LocalizationSupport"));
|
||||
for (String i : resourceBundles) {
|
||||
beforeAn.invokeVirtualMethod(ofMethod("com.oracle.svm.core.jdk.LocalizationSupport", "addToCache", void.class, String.class), locSupport, beforeAn.load(i));
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
|
||||
@@ -310,15 +320,22 @@ public class BuildTimeGenerator {
|
||||
beforeAn.invokeStaticMethod(mv.getMethodDescriptor());
|
||||
|
||||
ExceptionTable exceptionTable = mv.addTryCatch();
|
||||
ResultHandle carray = mv.newArray(Class.class, mv.load(1));
|
||||
|
||||
|
||||
ResultHandle clazz = mv.invokeStaticMethod(ofMethod(Class.class, "forName", Class.class, String.class), mv.load(entry.getKey()));
|
||||
//we call these methods first, so if they are going to throw an exception it happens before anything has been registered
|
||||
ResultHandle constructors = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredConstructors", Constructor[].class), clazz);
|
||||
ResultHandle methods = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredMethods", Method[].class), clazz);
|
||||
ResultHandle fields = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredFields", Field[].class), clazz);
|
||||
|
||||
|
||||
ResultHandle carray = mv.newArray(Class.class, mv.load(1));
|
||||
mv.writeArrayValue(carray, mv.load(0), clazz);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Class[].class), carray);
|
||||
|
||||
|
||||
if (entry.getValue().constructors) {
|
||||
ResultHandle res = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredConstructors", Constructor[].class), clazz);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Executable[].class), res);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Executable[].class), constructors);
|
||||
} else if (!entry.getValue().ctorSet.isEmpty()) {
|
||||
ResultHandle farray = mv.newArray(Constructor.class, mv.load(1));
|
||||
for (MethodInfo ctor : entry.getValue().ctorSet) {
|
||||
@@ -333,8 +350,7 @@ public class BuildTimeGenerator {
|
||||
}
|
||||
}
|
||||
if (entry.getValue().methods) {
|
||||
ResultHandle res = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredMethods", Method[].class), clazz);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Executable[].class), res);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Executable[].class), methods);
|
||||
} else if (!entry.getValue().methodSet.isEmpty()) {
|
||||
ResultHandle farray = mv.newArray(Method.class, mv.load(1));
|
||||
for (MethodInfo method : entry.getValue().methodSet) {
|
||||
@@ -349,8 +365,7 @@ public class BuildTimeGenerator {
|
||||
}
|
||||
}
|
||||
if (entry.getValue().fields) {
|
||||
ResultHandle res = mv.invokeVirtualMethod(ofMethod(Class.class, "getDeclaredFields", Field[].class), clazz);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Field[].class), res);
|
||||
mv.invokeStaticMethod(ofMethod("org/graalvm/nativeimage/RuntimeReflection", "register", void.class, Field[].class), fields);
|
||||
} else if (!entry.getValue().fieldSet.isEmpty()) {
|
||||
ResultHandle farray = mv.newArray(Field.class, mv.load(1));
|
||||
for (FieldInfo field : entry.getValue().fieldSet) {
|
||||
|
||||
@@ -84,4 +84,7 @@ public interface ProcessorContext {
|
||||
* @param name The resource path
|
||||
*/
|
||||
void addResource(String name);
|
||||
|
||||
|
||||
void addResourceBundle(String bundle);
|
||||
}
|
||||
|
||||
@@ -15,5 +15,6 @@ public class RuntimePriority {
|
||||
public static final int ARC_DEPLOYMENT = 300;
|
||||
public static final int UNDERTOW_DEPLOY = 400;
|
||||
public static final int UNDERTOW_START = 500;
|
||||
public static final int BEAN_VALIDATION_DEPLOYMENT = 600;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package org.jboss.shamrock.runtime.graal;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedType;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(Constructor.class)
|
||||
final class ConstructorReplacement {
|
||||
|
||||
@Alias
|
||||
public Class<?> getDeclaringClass() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Substitute
|
||||
public AnnotatedType getAnnotatedReturnType() {
|
||||
return new AnnotatedType() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return getDeclaringClass();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return ConstructorReplacement.class.getAnnotation(annotationClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getAnnotations() {
|
||||
return ConstructorReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return ConstructorReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package org.jboss.shamrock.runtime.graal;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedType;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(Field.class)
|
||||
final class FieldReplacement {
|
||||
|
||||
@Alias
|
||||
public Type getGenericType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Substitute
|
||||
public AnnotatedType getAnnotatedType() {
|
||||
return new AnnotatedType() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return getGenericType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return FieldReplacement.class.getAnnotation(annotationClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getAnnotations() {
|
||||
return FieldReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return FieldReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package org.jboss.shamrock.runtime.graal;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedType;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(Method.class)
|
||||
final class MethodReplacement {
|
||||
|
||||
//https://github.com/oracle/graal/issues/649
|
||||
@Substitute
|
||||
public Object getDefaultValue() {
|
||||
return null;
|
||||
}
|
||||
@Alias
|
||||
public Type getGenericReturnType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Substitute
|
||||
public AnnotatedType getAnnotatedReturnType() {
|
||||
return new AnnotatedType() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return getGenericReturnType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return MethodReplacement.class.getAnnotation(annotationClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getAnnotations() {
|
||||
return MethodReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return MethodReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package org.jboss.shamrock.runtime.graal;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedType;
|
||||
import java.lang.reflect.Parameter;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.Substitute;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
@TargetClass(Parameter.class)
|
||||
final class ParameterReplacement {
|
||||
|
||||
@Alias
|
||||
public Type getParameterizedType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Alias
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Substitute
|
||||
public AnnotatedType getAnnotatedType() {
|
||||
return new AnnotatedType() {
|
||||
@Override
|
||||
public Type getType() {
|
||||
return getParameterizedType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
|
||||
return ParameterReplacement.class.getAnnotation(annotationClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getAnnotations() {
|
||||
return ParameterReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Annotation[] getDeclaredAnnotations() {
|
||||
return ParameterReplacement.class.getDeclaredAnnotations();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -43,7 +43,6 @@ public class OpenApiTestCase {
|
||||
Assert.assertEquals("1.0", obj.getJsonObject("info").getString("version"));
|
||||
|
||||
JsonObject paths = obj.getJsonObject("paths");
|
||||
Assert.assertEquals(2, paths.size());
|
||||
|
||||
JsonObject testObj = paths.getJsonObject("/rest/test");
|
||||
Assert.assertNotNull(testObj);
|
||||
|
||||
@@ -59,6 +59,11 @@
|
||||
<artifactId>shamrock-health-deployment</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-bean-validation-deployment</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- test dependencies -->
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package org.jboss.shamrock.example.validator;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.Validator;
|
||||
import javax.validation.constraints.Size;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
|
||||
@Path("/validator")
|
||||
public class TestValidatorEndpoint {
|
||||
|
||||
@Inject
|
||||
private Validator validator;
|
||||
|
||||
@POST
|
||||
@Path("/manual")
|
||||
@Consumes("application/json")
|
||||
public String manualValidation(MyData data) {
|
||||
Set<ConstraintViolation<MyData>> result = validator.validate(data);
|
||||
if(result.isEmpty()) {
|
||||
return "passed";
|
||||
}
|
||||
return "failed:" + result.iterator().next().getPropertyPath().toString();
|
||||
}
|
||||
|
||||
public static class MyData {
|
||||
private String name;
|
||||
@Size(min = 3)
|
||||
private String email;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package org.jboss.shamrock.example.test;
|
||||
|
||||
import org.jboss.shamrock.junit.GraalTest;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@RunWith(GraalTest.class)
|
||||
public class ValidatorITCase extends ValidatorTestCase {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package org.jboss.shamrock.example.test;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import javax.json.Json;
|
||||
|
||||
import org.jboss.shamrock.junit.ShamrockTest;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@RunWith(ShamrockTest.class)
|
||||
public class ValidatorTestCase {
|
||||
|
||||
@Test
|
||||
public void testManualValidationFailed() throws Exception {
|
||||
URL uri = new URL("http://localhost:8080/rest/validator/manual");
|
||||
URLConnection connection = uri.openConnection();
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestProperty("Content-Type", "application/json");
|
||||
|
||||
byte[] body = Json.createObjectBuilder()
|
||||
.add("name", "Stuart")
|
||||
.add("email", "aa")
|
||||
.build().toString().getBytes(StandardCharsets.UTF_8);
|
||||
try (OutputStream o = connection.getOutputStream()) {
|
||||
o.write(body);
|
||||
}
|
||||
|
||||
InputStream in = connection.getInputStream();
|
||||
byte[] buf = new byte[100];
|
||||
int r;
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
while ((r = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, r);
|
||||
}
|
||||
Assert.assertEquals("failed:email", new String(out.toByteArray()));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testManualValidationPassed() throws Exception {
|
||||
URL uri = new URL("http://localhost:8080/rest/validator/manual");
|
||||
URLConnection connection = uri.openConnection();
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestProperty("Content-Type", "application/json");
|
||||
|
||||
byte[] body = Json.createObjectBuilder()
|
||||
.add("name", "Stuart")
|
||||
.add("email", "test@test.com")
|
||||
.build().toString().getBytes(StandardCharsets.UTF_8);
|
||||
try (OutputStream o = connection.getOutputStream()) {
|
||||
o.write(body);
|
||||
}
|
||||
|
||||
InputStream in = connection.getInputStream();
|
||||
byte[] buf = new byte[100];
|
||||
int r;
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
while ((r = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, r);
|
||||
}
|
||||
Assert.assertEquals("passed", new String(out.toByteArray()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -143,6 +143,14 @@ public class JaxrsScanningProcessor implements ResourceProcessor {
|
||||
processorContext.addReflectiveClass(true, true, className);
|
||||
}
|
||||
}
|
||||
for(Type param : method.parameters()) {
|
||||
if(param.kind() != Type.Kind.PRIMITIVE) {
|
||||
String className = param.name().toString();
|
||||
if (!className.equals(String.class.getName())) {
|
||||
processorContext.addReflectiveClass(true, true, className);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
71
pom.xml
71
pom.xml
@@ -46,6 +46,11 @@
|
||||
<jackson.version>2.9.5</jackson.version>
|
||||
<commons-beanutils-core.version>1.8.3</commons-beanutils-core.version>
|
||||
<commons-logging.version>1.2</commons-logging.version>
|
||||
<validation-api.version>2.0.1.Final</validation-api.version>
|
||||
<classmate.version>1.3.4</classmate.version>
|
||||
<javax.el-impl.version>3.0.1.b08-redhat-1</javax.el-impl.version>
|
||||
<hibernate-validator.version>6.0.7.Final</hibernate-validator.version>
|
||||
<el-impl.version>2.2</el-impl.version>
|
||||
</properties>
|
||||
|
||||
<modules>
|
||||
@@ -63,6 +68,7 @@
|
||||
<module>arc</module>
|
||||
<module>ext/gizmo</module>
|
||||
<module>ext/arc</module>
|
||||
<module>bean-validation</module>
|
||||
</modules>
|
||||
<build>
|
||||
<pluginManagement>
|
||||
@@ -95,7 +101,8 @@
|
||||
|
||||
<bannedDependencies>
|
||||
<excludes>
|
||||
<exclude>org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec</exclude>
|
||||
<exclude>org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec
|
||||
</exclude>
|
||||
</excludes>
|
||||
</bannedDependencies>
|
||||
</rules>
|
||||
@@ -112,7 +119,16 @@
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-bean-validation-deployment</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-bean-validation-runtime</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-core-deployment</artifactId>
|
||||
@@ -143,7 +159,7 @@
|
||||
<artifactId>shamrock-health-runtime</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-metrics-deployment</artifactId>
|
||||
<version>${project.version}</version>
|
||||
@@ -154,14 +170,14 @@
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-openapi-deployment</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-openapi-deployment</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-openapi-runtime</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
<artifactId>shamrock-openapi-runtime</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jboss.shamrock</groupId>
|
||||
@@ -254,6 +270,11 @@
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml</groupId>
|
||||
<artifactId>classmate</artifactId>
|
||||
<version>${classmate.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
@@ -291,15 +312,20 @@
|
||||
<version>${smallrye-metrics.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.smallrye</groupId>
|
||||
<artifactId>smallrye-open-api</artifactId>
|
||||
<version>${smallrye-open-api.version}</version>
|
||||
<groupId>io.smallrye</groupId>
|
||||
<artifactId>smallrye-open-api</artifactId>
|
||||
<version>${smallrye-open-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.inject</groupId>
|
||||
<artifactId>javax.inject</artifactId>
|
||||
<version>${javax.inject.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.validation</groupId>
|
||||
<artifactId>validation-api</artifactId>
|
||||
<version>${validation-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
@@ -347,6 +373,17 @@
|
||||
<artifactId>fakereplace</artifactId>
|
||||
<version>${fakereplace.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.el-impl</artifactId>
|
||||
<version>${javax.el-impl.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.el-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.json</artifactId>
|
||||
@@ -486,6 +523,16 @@
|
||||
<artifactId>cdi-api</artifactId>
|
||||
<version>${cdi-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
<version>${hibernate-validator.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.glassfish.web</groupId>
|
||||
<artifactId>el-impl</artifactId>
|
||||
<version>${el-impl.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user