Bean validation

This commit is contained in:
Stuart Douglas
2018-09-03 14:41:53 +10:00
parent 9db2a5d87d
commit 19a45155f5
34 changed files with 1469 additions and 20 deletions

View 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>

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -0,0 +1 @@
org.jboss.shamrock.beanvalidation.BeanValidationSetup

View File

@@ -0,0 +1,3 @@
index-dependencies:
- "javax.validation:validation-api"
- "org.hibernate.validator:hibernate-validator"

18
bean-validation/pom.xml Normal file
View 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>

View 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>

View File

@@ -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() {
}
}

View File

@@ -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();
}
}

View File

@@ -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) {
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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);
}
}
}

View File

@@ -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 {
}

View File

@@ -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 {
}

View File

@@ -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) {

View File

@@ -84,4 +84,7 @@ public interface ProcessorContext {
* @param name The resource path
*/
void addResource(String name);
void addResourceBundle(String bundle);
}

View File

@@ -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;
}

View File

@@ -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();
}
};
}
}

View File

@@ -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();
}
};
}
}

View File

@@ -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();
}
};
}
}

View File

@@ -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();
}
};
}
}

View File

@@ -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);

View File

@@ -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 -->

View File

@@ -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;
}
}
}

View File

@@ -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 {
}

View File

@@ -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()));
}
}

View File

@@ -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
View File

@@ -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>