Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java Fri Jan 25 15:27:43 2019 @@ -41,6 +41,7 @@ import org.apache.bval.jsr.BootstrapConf import org.apache.bval.jsr.ConfigurationImpl; import org.apache.bval.jsr.metadata.XmlBuilder; import org.apache.bval.util.Exceptions; +import org.apache.bval.util.Validate; import org.apache.bval.util.reflection.Reflection; import org.apache.commons.weaver.privilizer.Privileged; import org.apache.commons.weaver.privilizer.Privilizing; @@ -65,11 +66,22 @@ public class ValidationParser { "META-INF/validation-configuration-2.0.xsd") .build(); - public static String getValidationXmlFile(String file) { + private static String getValidationXmlFile(String file) { return file == null ? DEFAULT_VALIDATION_XML_FILE : file; } - public static BootstrapConfiguration processValidationConfig(final String file, + private static Map<String, String> toMap(final List<PropertyType> property) { + return property == null || property.isEmpty() ? Collections.emptyMap() + : property.stream().collect(Collectors.toMap(PropertyType::getName, PropertyType::getValue)); + } + + private final ClassLoader loader; + + public ValidationParser(ClassLoader loader) { + this.loader = Validate.notNull(loader, null); + } + + public BootstrapConfiguration processValidationConfig(final String file, final ConfigurationImpl targetConfig) { final ValidationConfigType xmlConfig = parseXmlConfig(file); if (xmlConfig == null) { @@ -99,28 +111,7 @@ public class ValidationParser { xmlConfig.getClockProvider(), new HashSet<>(xmlConfig.getValueExtractor())); } - private static Map<String, String> toMap(final List<PropertyType> property) { - return property == null || property.isEmpty() ? Collections.emptyMap() - : property.stream().collect(Collectors.toMap(PropertyType::getName, PropertyType::getValue)); - } - - @Privileged - private static ValidationConfigType parseXmlConfig(final String validationXmlFile) { - try (InputStream inputStream = getInputStream(getValidationXmlFile(validationXmlFile))) { - if (inputStream == null) { - log.log(Level.FINEST, - String.format("No %s found. Using annotation based configuration only.", validationXmlFile)); - return null; - } - log.log(Level.FINEST, String.format("%s found.", validationXmlFile)); - - return SCHEMA_MANAGER.unmarshal(new InputSource(inputStream), ValidationConfigType.class); - } catch (Exception e) { - throw Exceptions.create(ValidationException::new, e, "Unable to parse %s", validationXmlFile); - } - } - - public static InputStream open(String mappingFileName) { + public InputStream open(String mappingFileName) { if (mappingFileName.charAt(0) == '/') { // Classloader needs a path without a starting / mappingFileName = mappingFileName.substring(1); @@ -136,14 +127,26 @@ public class ValidationParser { } } - static InputStream getInputStream(final String path) throws IOException { - final ClassLoader loader = Reflection.getClassLoader(ValidationParser.class); + InputStream getInputStream(final String path) throws IOException { final List<URL> urls = Collections.list(loader.getResources(path)); Exceptions.raiseIf(urls.stream().distinct().count() > 1, ValidationException::new, "More than one %s is found in the classpath", path); return urls.isEmpty() ? null : urls.get(0).openStream(); } - private ValidationParser() { + @Privileged + private ValidationConfigType parseXmlConfig(final String validationXmlFile) { + try (InputStream inputStream = getInputStream(getValidationXmlFile(validationXmlFile))) { + if (inputStream == null) { + log.log(Level.FINEST, + String.format("No %s found. Using annotation based configuration only.", validationXmlFile)); + return null; + } + log.log(Level.FINEST, String.format("%s found.", validationXmlFile)); + + return SCHEMA_MANAGER.unmarshal(new InputSource(inputStream), ValidationConfigType.class); + } catch (Exception e) { + throw Exceptions.create(ValidationException::new, e, "Unable to parse %s", validationXmlFile); + } } }
Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java Fri Jan 25 15:27:43 2019 @@ -83,7 +83,7 @@ public class Exceptions { public static <E extends Exception> void raiseIf(boolean condition, Function<? super String, ? extends E> fn, String format, Consumer<FormatArgs> argsProvider) throws E { if (condition) { - raise(fn, message(format,argsProvider)); + raise(fn, message(format, argsProvider)); } } Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/reflection/Reflection.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/reflection/Reflection.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/reflection/Reflection.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/reflection/Reflection.java Fri Jan 25 15:27:43 2019 @@ -35,6 +35,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; +import org.apache.bval.util.Validate; import org.apache.commons.weaver.privilizer.Privilizing; /** @@ -219,18 +220,32 @@ public class Reflection { } /** - * Get a usable {@link ClassLoader}: that of {@code clazz} if {@link Thread#getContextClassLoader()} returns {@code null}. + * Get a {@link ClassLoader} preferring that of {@code clazz} over + * {@link Thread#getContextClassLoader()} of current {@link Thread}. + * * @param clazz * @return {@link ClassLoader} */ - public static ClassLoader getClassLoader(final Class<?> clazz) { - final ClassLoader cl = Thread.currentThread().getContextClassLoader(); - return cl == null ? clazz.getClassLoader() : cl; + public static ClassLoader loaderFromClassOrThread(final Class<?> clazz) { + return Optional.of(clazz).map(Class::getClassLoader) + .orElseGet(() -> Thread.currentThread().getContextClassLoader()); + } + + /** + * Get a {@link ClassLoader} preferring + * {@link Thread#getContextClassLoader()} of current {@link Thread} over + * that of {@code fallbackClass}. + * + * @param fallbackClass + * @return {@link ClassLoader} + */ + public static ClassLoader loaderFromThreadOrClass(final Class<?> fallbackClass) { + return Optional.of(Thread.currentThread()).map(Thread::getContextClassLoader) + .orElseGet(() -> Validate.notNull(fallbackClass).getClassLoader()); } public static Class<?> toClass(String className) throws ClassNotFoundException { - ClassLoader cl = getClassLoader(Reflection.class); - return toClass(className, cl); + return toClass(className, loaderFromThreadOrClass(Reflection.class)); } /** @@ -251,10 +266,9 @@ public class Reflection { * * @throws RuntimeException on load error */ - public static Class<?> toClass(String className, boolean resolve, ClassLoader loader) throws ClassNotFoundException { - if (className == null) { - throw new NullPointerException("className == null"); - } + public static Class<?> toClass(String className, boolean resolve, ClassLoader loader) + throws ClassNotFoundException { + Validate.notNull(className, "className was null"); // array handling int dims = 0; @@ -276,7 +290,6 @@ public class Reflection { } } } - if (dims > 0) { StringBuilder buf = new StringBuilder(className.length() + dims + 2); for (int i = 0; i < dims; i++) { @@ -291,7 +304,6 @@ public class Reflection { } className = buf.toString(); } - if (loader == null) { loader = Thread.currentThread().getContextClassLoader(); } @@ -417,7 +429,7 @@ public class Reflection { try { return cls.getConstructor().newInstance(); } catch (final Exception ex) { - throw new RuntimeException("Cannot instantiate : " + cls, ex); + throw new IllegalArgumentException("Cannot instantiate : " + cls, ex); } } Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/resources/org/apache/bval/jsr/ValidationMessages.properties URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/resources/org/apache/bval/jsr/ValidationMessages.properties?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/main/resources/org/apache/bval/jsr/ValidationMessages.properties (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/main/resources/org/apache/bval/jsr/ValidationMessages.properties Fri Jan 25 15:27:43 2019 @@ -18,19 +18,28 @@ # The properties listed below are resolved by the default message resolver. # standard -javax.validation.constraints.Null.message=must be null -javax.validation.constraints.NotNull.message=may not be null javax.validation.constraints.AssertTrue.message=must be true javax.validation.constraints.AssertFalse.message=must be false -javax.validation.constraints.Min.message=must be greater than or equal to {value} +javax.validation.constraints.DecimalMax.message=must be less than ${inclusive == true ? 'or equal to ' : ''}{value} +javax.validation.constraints.DecimalMin.message=must be greater than ${inclusive == true ? 'or equal to ' : ''}{value} +javax.validation.constraints.Digits.message=numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected) +javax.validation.constraints.Email.message=must be a well-formed email address +javax.validation.constraints.Future.message=must be a future date +javax.validation.constraints.FutureOrPresent.message=must be a date in the present or in the future javax.validation.constraints.Max.message=must be less than or equal to {value} -javax.validation.constraints.Size.message=size must be between {min} and {max} -javax.validation.constraints.Digits.message=numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected) +javax.validation.constraints.Min.message=must be greater than or equal to {value} +javax.validation.constraints.Negative.message=must be less than 0 +javax.validation.constraints.NegativeOrZero.message=must be less than or equal to 0 +javax.validation.constraints.NotBlank.message=must not be blank +javax.validation.constraints.NotEmpty.message=must not be empty +javax.validation.constraints.NotNull.message=may not be null +javax.validation.constraints.Null.message=must be null javax.validation.constraints.Past.message=must be a past date -javax.validation.constraints.Future.message=must be a future date +javax.validation.constraints.PastOrPresent.message=must be a date in the past or in the present +javax.validation.constraints.Positive.message=must be greater than 0 +javax.validation.constraints.PositiveOrZero.message=must be greater than or equal to 0 javax.validation.constraints.Pattern.message=must match the following regular expression: {regexp} -javax.validation.constraints.DecimalMax.message=must be less than or equal to {value} -javax.validation.constraints.DecimalMin.message=must be greater than or equal to {value} +javax.validation.constraints.Size.message=size must be between {min} and {max} # additional built-ins org.apache.bval.constraints.NotEmpty.message=may not be empty Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/BeanDescriptorTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/BeanDescriptorTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/BeanDescriptorTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/BeanDescriptorTest.java Fri Jan 25 15:27:43 2019 @@ -23,6 +23,9 @@ import static java.lang.annotation.Eleme import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.lang.annotation.Documented; @@ -165,6 +168,19 @@ public class BeanDescriptorTest extends assertEquals("Incorrect number of descriptors", 1, constraints.size()); } + @Test + public void testDescriptorCaching() { + // constrained + final BeanDescriptor personDescriptor = validator.getConstraintsForClass(Person.class); + assertNotNull(personDescriptor); + assertSame(personDescriptor, validator.getConstraintsForClass(Person.class)); + + // unconstrained + final BeanDescriptor objectDescriptor = validator.getConstraintsForClass(Object.class); + assertNotNull(objectDescriptor); + assertNotSame(objectDescriptor, validator.getConstraintsForClass(Object.class)); + } + public static class Form { @NotNull public String name; Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/DefaultMessageInterpolatorTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/DefaultMessageInterpolatorTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/DefaultMessageInterpolatorTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/DefaultMessageInterpolatorTest.java Fri Jan 25 15:27:43 2019 @@ -16,82 +16,132 @@ */ package org.apache.bval.jsr; +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; - +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeThat; +import static org.junit.Assume.assumeTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.when; + +import java.lang.annotation.Annotation; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.List; import java.util.Locale; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.function.Supplier; +import javax.el.ExpressionFactory; import javax.validation.MessageInterpolator; import javax.validation.Validator; +import javax.validation.constraints.Digits; import javax.validation.constraints.Pattern; import javax.validation.metadata.ConstraintDescriptor; +import org.apache.bval.constraints.NotEmpty; +import org.apache.bval.jsr.ApacheValidatorConfiguration; import org.apache.bval.jsr.example.Author; import org.apache.bval.jsr.example.PreferredGuest; +import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.mockito.Mockito; /** * MessageResolverImpl Tester. */ +@RunWith(Parameterized.class) public class DefaultMessageInterpolatorTest { + @Parameters(name="{0}") + public static List<Object[]> generateParameters(){ + return Arrays.asList(new Object[] { "default", null }, + new Object[] { "ri", "com.sun.el.ExpressionFactoryImpl" }, + new Object[] { "tomcat", "org.apache.el.ExpressionFactoryImpl" }, + new Object[] { "juel", "de.odysseus.el.ExpressionFactoryImpl" }, + new Object[] { "invalid", "java.lang.Object" }); + } + + @AfterClass + public static void cleanup() { + System.clearProperty(ExpressionFactory.class.getName()); + } + private static Predicate<ConstraintDescriptor<?>> forConstraintType(Class<? extends Annotation> type) { + return d -> Objects.equals(type, d.getAnnotation().annotationType()); + } + + private String elImpl; + private String elFactory; private DefaultMessageInterpolator interpolator; + private Validator validator; + private boolean elAvailable; + private ClassLoader originalClassLoader; + + public DefaultMessageInterpolatorTest(String elImpl, String elFactory) { + this.elImpl = elImpl; + this.elFactory = elFactory; + } @Before public void setUp() throws Exception { + // store and replace CCL to sidestep EL factory caching + originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[] {}, originalClassLoader)); + + try { + Class<?> elFactoryClass; + if (elFactory == null) { + elFactoryClass = ExpressionFactory.class; + System.clearProperty(ExpressionFactory.class.getName()); + } else { + elFactoryClass = Class.forName(elFactory); + System.setProperty(ExpressionFactory.class.getName(), elFactory); + } + assertTrue(elFactoryClass.isInstance(ExpressionFactory.newInstance())); + elAvailable = true; + } catch (Exception e) { + elAvailable = false; + } interpolator = new DefaultMessageInterpolator(); interpolator.setLocale(Locale.ENGLISH); + validator = ApacheValidatorFactory.getDefault().getValidator(); } - @Test - public void testCreateResolver() { - - final Validator gvalidator = getValidator(); - - assertFalse(gvalidator.getConstraintsForClass(PreferredGuest.class) - .getConstraintsForProperty("guestCreditCardNumber").getConstraintDescriptors().isEmpty()); - - MessageInterpolator.Context ctx = new MessageInterpolator.Context() { - - @Override - public ConstraintDescriptor<?> getConstraintDescriptor() { - return gvalidator.getConstraintsForClass(PreferredGuest.class) - .getConstraintsForProperty("guestCreditCardNumber").getConstraintDescriptors().iterator().next(); - } + @After + public void tearDownEL() { + assumeTrue(originalClassLoader != null); + Thread.currentThread().setContextClassLoader(originalClassLoader); + } - @Override - public Object getValidatedValue() { - return "12345678"; - } + @Test + public void testInterpolateFromValidationResources() { + String msg = interpolator.interpolate("{validator.creditcard}", + context("12345678", + () -> validator.getConstraintsForClass(PreferredGuest.class) + .getConstraintsForProperty("guestCreditCardNumber").getConstraintDescriptors().stream() + .filter(forConstraintType(Digits.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing")))); - @Override - public <T> T unwrap(Class<T> type) { - return null; - } - }; - String msg = interpolator.interpolate("{validator.creditcard}", ctx); assertEquals("credit card is not valid", msg); + } - ctx = new MessageInterpolator.Context() { - @Override - public ConstraintDescriptor<?> getConstraintDescriptor() { - return gvalidator.getConstraintsForClass(Author.class).getConstraintsForProperty("lastName") - .getConstraintDescriptors().iterator().next(); - } - - @Override - public Object getValidatedValue() { - return ""; - } - - @Override - public <T> T unwrap(Class<T> type) { - return null; - } - }; + @Test + public void testInterpolateFromDefaultResources() { + String msg = interpolator.interpolate("{org.apache.bval.constraints.NotEmpty.message}", + context("", + () -> validator.getConstraintsForClass(Author.class).getConstraintsForProperty("lastName") + .getConstraintDescriptors().stream().filter(forConstraintType(NotEmpty.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing")))); - msg = interpolator.interpolate("{org.apache.bval.constraints.NotEmpty.message}", ctx); assertEquals("may not be empty", msg); } @@ -101,57 +151,178 @@ public class DefaultMessageInterpolatorT */ @Test public void testReplacementWithSpecialChars() { + // Try to interpolate an annotation attribute containing $ + String idNumberResult = this.interpolator.interpolate("Id number should match {regexp}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing")))); - final Validator validator = getValidator(); - MessageInterpolator.Context ctx; + assertEquals("Incorrect message interpolation when $ is in an attribute", "Id number should match ....$", + idNumberResult); - // Try to interpolate an annotation attribute containing $ - ctx = new MessageInterpolator.Context() { + // Try to interpolate an annotation attribute containing \ + String otherIdResult = this.interpolator.interpolate("Other id should match {regexp}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("otherId") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing")))); - @Override - public ConstraintDescriptor<?> getConstraintDescriptor() { - return validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") - .getConstraintDescriptors().iterator().next(); - } + assertEquals("Incorrect message interpolation when \\ is in an attribute value", "Other id should match .\\n", + otherIdResult); + } - @Override - public Object getValidatedValue() { - return "12345678"; - } + @Test + public void testRecursiveInterpolation() { + String msg = this.interpolator.interpolate("{recursive.interpolation.1}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing")))); - @Override - public <T> T unwrap(Class<T> type) { - return null; - } - }; + assertEquals("must match \"....$\"", msg); + } - String result = this.interpolator.interpolate("Id number should match {regexp}", ctx); - assertEquals("Incorrect message interpolation when $ is in an attribute", "Id number should match ....$", - result); + @Test + public void testNoELAvailable() { + assumeThat(elImpl, equalTo("invalid")); + assertFalse(elAvailable); + + ApacheMessageContext context = context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))); + + when(context + .getConfigurationProperty(ApacheValidatorConfiguration.Properties.CUSTOM_TEMPLATE_EXPRESSION_EVALUATION)) + .thenAnswer(invocation -> Boolean.toString(true)); - // Try to interpolate an annotation attribute containing \ - ctx = new MessageInterpolator.Context() { + assertEquals("${regexp.charAt(4)}", interpolator.interpolate("${regexp.charAt(4)}", + context)); + } - @Override - public ConstraintDescriptor<?> getConstraintDescriptor() { - return validator.getConstraintsForClass(Person.class).getConstraintsForProperty("otherId") - .getConstraintDescriptors().iterator().next(); - } + @Test + public void testDisallowCustomTemplateExpressionEvaluationByDefault() { + assumeTrue(elAvailable); - @Override - public Object getValidatedValue() { - return "12345678"; - } + assertEquals("${regexp.charAt(4)}", interpolator.interpolate("${regexp.charAt(4)}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))))); + } - @Override - public <T> T unwrap(Class<T> type) { - return null; - } - }; + @Test + public void testExpressionLanguageEvaluation() { + assumeTrue(elAvailable); + + final MessageInterpolator.Context context = context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("anotherValue") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))); + + assertEquals("Another value should match ....$", + interpolator.interpolate(context.getConstraintDescriptor().getMessageTemplate(), context)); + } - result = this.interpolator.interpolate("Other id should match {regexp}", ctx); - assertEquals("Incorrect message interpolation when \\ is in an attribute value", "Other id should match .\\n", - result); + @Test + public void testMixedEvaluation() { + assumeTrue(elAvailable); + + final MessageInterpolator.Context context = context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("mixedMessageValue") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))); + + assertEquals("Mixed message value of length 8 should match ....$", + interpolator.interpolate(context.getConstraintDescriptor().getMessageTemplate(), context)); + } + + @Test + public void testELEscapingTomcatJuel() { + assumeTrue(elAvailable); + assumeThat(elImpl, anyOf(equalTo("tomcat"), equalTo("juel"))); + + // not so much a test as an illustration that the specified EL implementations are seemingly confused by leading + // backslashes and treats the whole expression as literal. We could skip any literal text before the first + // non-escaped $, but that would only expose us to inconsistency for composite expressions containing more + // than one component EL expression + + ApacheMessageContext context = context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))); + + when(context + .getConfigurationProperty(ApacheValidatorConfiguration.Properties.CUSTOM_TEMPLATE_EXPRESSION_EVALUATION)) + .thenAnswer(invocation -> Boolean.toString(true)); + + assertEquals("${regexp.charAt(4)}", interpolator.interpolate("\\${regexp.charAt(4)}", + context)); + + assertEquals("${regexp.charAt(4)}", interpolator.interpolate("\\\\${regexp.charAt(4)}", + context)); + } + + @Test + public void testELEscapingRI() { + assumeTrue(elAvailable); + assumeThat(elImpl, equalTo("ri")); + + ApacheMessageContext context = context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))); + + when(context + .getConfigurationProperty(ApacheValidatorConfiguration.Properties.CUSTOM_TEMPLATE_EXPRESSION_EVALUATION)) + .thenAnswer(invocation -> Boolean.toString(true)); + + assertEquals("returns literal", "${regexp.charAt(4)}", + interpolator.interpolate("\\${regexp.charAt(4)}", + context)); + + assertEquals("returns literal \\ followed by $, later interpreted as an escape sequence", "$", + interpolator.interpolate("\\\\${regexp.charAt(4)}", + context)); + + assertEquals("returns literal \\ followed by .", "\\.", + interpolator.interpolate("\\\\${regexp.charAt(3)}", + context)); + } + + @Test + public void testEscapedELPattern() { + assertEquals("$must match \"....$\"", + interpolator.interpolate("\\${javax.validation.constraints.Pattern.message}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))))); + + assertEquals("$must match \"....$\"", + interpolator.interpolate("\\${javax.validation.constraints.Pattern.message}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))))); + + assertEquals("\\$must match \"....$\"", + interpolator.interpolate("\\\\\\${javax.validation.constraints.Pattern.message}", + context("12345678", + () -> validator.getConstraintsForClass(Person.class).getConstraintsForProperty("idNumber") + .getConstraintDescriptors().stream().filter(forConstraintType(Pattern.class)).findFirst() + .orElseThrow(() -> new AssertionError("expected constraint missing"))))); + } + + @SuppressWarnings("unchecked") + private ApacheMessageContext context(Object validatedValue, Supplier<ConstraintDescriptor<?>> descriptor) { + final ApacheMessageContext result = Mockito.mock(ApacheMessageContext.class); + when(result.unwrap(any(Class.class))) + .thenAnswer(invocation -> invocation.getArgumentAt(0, Class.class).cast(result)); + when(result.getValidatedValue()).thenReturn(validatedValue); + when(result.getConstraintDescriptor()).thenAnswer(invocation -> descriptor.get()); + return result; } public static class Person { @@ -162,9 +333,10 @@ public class DefaultMessageInterpolatorT @Pattern(message = "Other id should match {regexp}", regexp = ".\\n") public String otherId; - } - - private Validator getValidator() { - return ApacheValidatorFactory.getDefault().getValidator(); + @Pattern(message = "Another value should match ${regexp.intern()}", regexp = "....$") + public String anotherValue; + + @Pattern(message = "Mixed message value of length ${validatedValue.length()} should match {regexp}", regexp = "....$") + public String mixedMessageValue; } } Added: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/LiskovTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/LiskovTest.java?rev=1852142&view=auto ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/LiskovTest.java (added) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/LiskovTest.java Fri Jan 25 15:27:43 2019 @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.bval.jsr; + +import java.lang.reflect.Method; + +import javax.validation.Validation; +import javax.validation.ValidatorFactory; +import javax.validation.constraints.NotNull; +import javax.validation.executable.ExecutableValidator; + +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("requires some revisiting of Liskov impl - discuss in progress") +public class LiskovTest { + @Test // this test was throwing a Liskov exception, here to ensure it is not the case + public void validateParams() throws NoSuchMethodException { + final Api service = new Impl(); + try (final ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) { + final ExecutableValidator validator = factory.getValidator().forExecutables(); + final Method method = Api.class.getMethod("read", String.class); + validator.validateParameters(service, method, new Object[]{""}); + } + } + + public interface Api { + String read(@NotNull String key); + } + + public static abstract class Base { + public String read(final String key) { + return null; + } + } + + public static class Impl extends Base implements Api { + @Override + public String read(final String key) { + return super.read(key); + } + } +} Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/ValidationTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/ValidationTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/ValidationTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/ValidationTest.java Fri Jan 25 15:27:43 2019 @@ -38,6 +38,7 @@ import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.groups.Default; @@ -45,7 +46,7 @@ import javax.validation.metadata.BeanDes import javax.validation.metadata.ConstraintDescriptor; import javax.validation.metadata.PropertyDescriptor; -import org.apache.bval.constraints.NotNullValidator; +import org.apache.bval.constraints.NotEmptyValidatorForCharSequence; import org.apache.bval.jsr.example.AccessTestBusinessObject; import org.apache.bval.jsr.example.AccessTestBusinessObjectSub; import org.apache.bval.jsr.example.Address; @@ -252,6 +253,8 @@ public class ValidationTest extends Vali @Test public void testGroups() { final Author author = new Author(); + author.setFirstName("Wile"); + author.setLastName("Coyote"); author.setCompany("ACME"); final Book book = new Book(); book.setTitle(""); @@ -262,7 +265,7 @@ public class ValidationTest extends Vali // assuming an english locale, the interpolated message is returned for (ConstraintViolation<Book> constraintViolation : constraintViolations) { if (Book.class.equals(constraintViolation.getRootBean().getClass())) { - assertEquals("may not be empty", constraintViolation.getMessage()); + assertEquals("must not be empty", constraintViolation.getMessage()); assertSame(book, constraintViolation.getRootBean()); // the offending property @@ -649,21 +652,20 @@ public class ValidationTest extends Vali // property with no constraint assertNull(bookBeanDescriptor.getConstraintsForProperty("description")); PropertyDescriptor propertyDescriptor = bookBeanDescriptor.getConstraintsForProperty("title"); - assertEquals(2, propertyDescriptor.getConstraintDescriptors().size()); + assertEquals(1, propertyDescriptor.getConstraintDescriptors().size()); assertEquals("title", propertyDescriptor.getPropertyName()); // assuming the implementation returns the NotEmpty constraint first Iterator<ConstraintDescriptor<?>> iter = propertyDescriptor.getConstraintDescriptors().iterator(); ConstraintDescriptor<?> constraintDescriptor = null; while (iter.hasNext()) { constraintDescriptor = iter.next(); - if (constraintDescriptor.getAnnotation().annotationType().equals(NotNull.class)) { + if (constraintDescriptor.getAnnotation().annotationType().equals(NotEmpty.class)) { break; } - } assertNotNull(constraintDescriptor); assertEquals(1, constraintDescriptor.getGroups().size()); // "first" - assertEquals(NotNullValidator.class, constraintDescriptor.getConstraintValidatorClasses().get(0)); + assertTrue(constraintDescriptor.getConstraintValidatorClasses().contains(NotEmptyValidatorForCharSequence.class)); // assuming the implementation returns the Size constraint first propertyDescriptor = bookBeanDescriptor.getConstraintsForProperty("subtitle"); Iterator<ConstraintDescriptor<?>> iterator = propertyDescriptor.getConstraintDescriptors().iterator(); Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/example/Book.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/example/Book.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/example/Book.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/example/Book.java Fri Jan 25 15:27:43 2019 @@ -18,16 +18,14 @@ */ package org.apache.bval.jsr.example; -import org.apache.bval.constraints.NotEmpty; - import javax.validation.GroupSequence; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @GroupSequence({ First.class, Second.class, Book.class, Last.class }) public class Book { - @NotNull(groups = First.class) @NotEmpty(groups = First.class) private String title; @@ -87,4 +85,4 @@ public class Book { return 42; } -} \ No newline at end of file +} Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/extensions/MethodValidatorImplTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/extensions/MethodValidatorImplTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/extensions/MethodValidatorImplTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/extensions/MethodValidatorImplTest.java Fri Jan 25 15:27:43 2019 @@ -16,9 +16,16 @@ */ package org.apache.bval.jsr.extensions; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import java.util.List; +import javax.validation.Valid; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.constraints.NotNull; @@ -29,10 +36,7 @@ import org.apache.bval.jsr.ApacheValidat import org.apache.bval.jsr.ValidatorImpl; import org.apache.bval.jsr.extensions.ExampleMethodService.Person; import org.junit.Ignore; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; +import org.junit.Test; /** * MethodValidatorImpl Tester. @@ -42,15 +46,9 @@ import junit.framework.TestSuite; * @since <pre>11/11/2009</pre> */ @SuppressWarnings({ "unchecked", "rawtypes" }) -public class MethodValidatorImplTest extends TestCase { - public MethodValidatorImplTest(String name) { - super(name); - } - - public static Test suite() { - return new TestSuite(MethodValidatorImplTest.class); - } +public class MethodValidatorImplTest { + @Test public void testUnwrap() { Validator v = getValidator(); ValidatorImpl cv = v.unwrap(ValidatorImpl.class); @@ -59,6 +57,7 @@ public class MethodValidatorImplTest ext assertNotNull(v.forExecutables()); } + @Test public void testValidateMethodParameters() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -73,6 +72,7 @@ public class MethodValidatorImplTest ext assertEquals(2, mv.validateParameters(service, method, params).size()); } + @Test public void testValidateMoreMethodParameters() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); @@ -99,6 +99,7 @@ public class MethodValidatorImplTest ext assertEquals(1, mv.validateParameters(service, echoMethod, echoParams).size()); } + @Test public void testValidateConstructorParameters() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -114,6 +115,7 @@ public class MethodValidatorImplTest ext assertEquals(2, mv.validateConstructorParameters(constructor, params).size()); } + @Test public void testValidateReturnValue() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -124,6 +126,7 @@ public class MethodValidatorImplTest ext assertEquals(1, mv.validateReturnValue(service, method, "").size()); } + @Test public void testValidateMoreReturnValue() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -139,6 +142,7 @@ public class MethodValidatorImplTest ext assertTrue(mv.validateReturnValue(service, echoMethod, returnedValue).isEmpty()); } + @Test public void testValidateValidParam() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -158,6 +162,7 @@ public class MethodValidatorImplTest ext mv.validateParameters(service, personOp1, new Object[] { null }).isEmpty()); } + @Test public void testValidateNotNullValidParam() throws NoSuchMethodException { ExampleMethodService service = new ExampleMethodService(); ExecutableValidator mv = getValidator().unwrap(ExecutableValidator.class); @@ -187,6 +192,7 @@ public class MethodValidatorImplTest ext * <li>interface.class + impl.method</li> * </ul> */ + @Test @Ignore("violates Liskov principle, forbidden by the spec - 4.5.5") public void validateImplementedMethod() throws NoSuchMethodException { UserMethodsImpl um = new UserMethodsImpl(); @@ -199,6 +205,13 @@ public class MethodValidatorImplTest ext mv.validateParameters(um, classMethod, new Object[] { "", "valid", null }).size()); } + @Test + public void testBVal158() throws NoSuchMethodException { + TypeWithPseudoAccessor target = new TypeWithPseudoAccessor(); + Method m = TypeWithPseudoAccessor.class.getMethod("getAll"); + assertTrue(getValidator().forExecutables().validateParameters(target, m, new Object[] {}).isEmpty()); + } + public static interface UserMethods { void findUser(String param1, String param2, Integer param3); } @@ -210,6 +223,14 @@ public class MethodValidatorImplTest ext } } + public static class TypeWithPseudoAccessor { + @Valid + @NotNull + public List<Object> getAll() { + throw new IllegalStateException(); + } + } + private Validator getValidator() { return Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator(); } Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/CollectionValidationTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/CollectionValidationTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/CollectionValidationTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/CollectionValidationTest.java Fri Jan 25 15:27:43 2019 @@ -18,7 +18,19 @@ */ package org.apache.bval.jsr.groups; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Locale; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + import org.apache.bval.jsr.DefaultMessageInterpolator; import org.apache.bval.jsr.example.Address; import org.apache.bval.jsr.example.Author; @@ -29,19 +41,13 @@ import org.apache.bval.jsr.example.Emplo import org.apache.bval.jsr.example.Library; import org.apache.bval.jsr.example.Person; import org.apache.bval.jsr.util.TestUtils; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; -import java.util.ArrayList; -import java.util.Locale; -import java.util.Set; +import org.junit.Before; +import org.junit.Test; /** * Description: <br/> */ -public class CollectionValidationTest extends TestCase { +public class CollectionValidationTest { static ValidatorFactory factory; static { @@ -57,9 +63,8 @@ public class CollectionValidationTest ex /** * {@inheritDoc} */ - @Override + @Before public void setUp() throws Exception { - super.setUp(); validator = createValidator(); } @@ -72,6 +77,7 @@ public class CollectionValidationTest ex return factory.getValidator(); } + @Test public void testValidateList() { Author author = new Author(); author.setFirstName("Peter"); @@ -116,6 +122,7 @@ public class CollectionValidationTest ex assertNotNull(TestUtils.getViolation(violations, "addresses[2].addressline1")); } + @Test public void testValidateMapAndRedefinedDefaultGroupOnNonRootBean() { Library lib = new Library(); lib.setLibraryName("Leibnitz Bibliothek"); @@ -127,7 +134,7 @@ public class CollectionValidationTest ex book1.setSubtitle("How it really works"); Author hawking = new Author(); hawking.setFirstName("Stephen"); - hawking.setFirstName("Hawking"); + hawking.setLastName("Hawking"); hawking.setAddresses(new ArrayList<Address>(1)); Address adr = new Address(); adr.setAddressline1("Street 1"); @@ -174,6 +181,7 @@ public class CollectionValidationTest ex assertNotNull(TestUtils.getViolation(violations, "taggedBooks[science].author.addresses[0].city")); } + @Test public void testValidateArray() { Library lib = new Library(); lib.setLibraryName("Unibibliothek"); Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/DefaultGroupSequenceTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/DefaultGroupSequenceTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/DefaultGroupSequenceTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/DefaultGroupSequenceTest.java Fri Jan 25 15:27:43 2019 @@ -18,18 +18,22 @@ */ package org.apache.bval.jsr.groups; -import junit.framework.TestCase; +import static org.junit.Assert.fail; -import javax.validation.GroupDefinitionException; -import javax.validation.groups.Default; import java.util.ArrayList; import java.util.List; +import javax.validation.GroupDefinitionException; +import javax.validation.groups.Default; + +import org.junit.Test; + /** * @author Hardy Ferentschik * @author Roman Stumm */ -public class DefaultGroupSequenceTest extends TestCase { +public class DefaultGroupSequenceTest { + @Test public void testAssertDefaultGroupSequenceIsExpandableWithDefaultAtEndOfSequence() { // create a dummy sequence Group a = new Group(GroupA.class); @@ -82,6 +86,7 @@ public class DefaultGroupSequenceTest ex chain.assertDefaultGroupSequenceIsExpandable(defaultSequence); } + @Test public void testAssertDefaulGroupSequenceIsExpandableWithDefaultAtBeginningOfSequence() { // create a dummy sequence Group a = new Group(GroupA.class); Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/GroupSequenceTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/GroupSequenceTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/GroupSequenceTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/GroupSequenceTest.java Fri Jan 25 15:27:43 2019 @@ -115,7 +115,7 @@ public class GroupSequenceTest extends V constraintViolations = validator.validate(book, First.class, Second.class, Last.class); ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next(); assertEquals(1, constraintViolations.size()); - assertEquals("may not be empty", constraintViolation.getMessage()); + assertEquals("must not be empty", constraintViolation.getMessage()); assertEquals(book, constraintViolation.getRootBean()); assertEquals(book.getTitle(), constraintViolation.getInvalidValue()); assertEquals("title", constraintViolation.getPropertyPath().toString()); @@ -165,7 +165,7 @@ public class GroupSequenceTest extends V constraintViolations = validator.validate(book, Book.All.class); ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next(); assertEquals(1, constraintViolations.size()); - assertEquals("may not be null", constraintViolation.getMessage()); + assertEquals("must not be empty", constraintViolation.getMessage()); assertEquals(book, constraintViolation.getRootBean()); assertEquals(book.getTitle(), constraintViolation.getInvalidValue()); assertEquals("title", constraintViolation.getPropertyPath().toString()); Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/implicit/ImplicitGroupingTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/implicit/ImplicitGroupingTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/implicit/ImplicitGroupingTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/implicit/ImplicitGroupingTest.java Fri Jan 25 15:27:43 2019 @@ -18,25 +18,31 @@ */ package org.apache.bval.jsr.groups.implicit; -import junit.framework.TestCase; -import org.apache.bval.jsr.ApacheValidatorFactory; -import org.apache.bval.jsr.util.TestUtils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; -import java.util.Set; + +import org.apache.bval.jsr.ApacheValidatorFactory; +import org.apache.bval.jsr.util.TestUtils; +import org.junit.Before; +import org.junit.Test; /** * Description: test spec chapter 3.4.4. Implicit grouping<br/> */ -public class ImplicitGroupingTest extends TestCase { +public class ImplicitGroupingTest { private Validator validator; - @Override - protected void setUp() { + @Before + public void setUp() { validator = ApacheValidatorFactory.getDefault().getValidator(); } + @Test public void testValidateImplicitGrouping() { Order order = new Order(); // When an Order object is validated on the Default group, ... Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/inheritance/GroupInheritanceTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/inheritance/GroupInheritanceTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/inheritance/GroupInheritanceTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/inheritance/GroupInheritanceTest.java Fri Jan 25 15:27:43 2019 @@ -18,22 +18,27 @@ */ package org.apache.bval.jsr.groups.inheritance; -import junit.framework.TestCase; -import org.apache.bval.jsr.ApacheValidatorFactory; -import org.apache.bval.jsr.util.TestUtils; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; -import java.util.Set; + +import org.apache.bval.jsr.ApacheValidatorFactory; +import org.apache.bval.jsr.util.TestUtils; +import org.junit.Before; +import org.junit.Test; /** * Description: <br/> */ -public class GroupInheritanceTest extends TestCase { +public class GroupInheritanceTest { private Validator validator; - @Override - protected void setUp() { + @Before + public void setUp() { validator = ApacheValidatorFactory.getDefault().getValidator(); } @@ -44,6 +49,7 @@ public class GroupInheritanceTest extend * * @NotNull on defaultCreditCard</pre> * because Default and Billable are superinterfaces of BuyInOneClick. */ + @Test public void testValidGroupBuyInOneClick() { BillableUser user = new BillableUser(); Added: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/LookBehindRegexHolderTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/LookBehindRegexHolderTest.java?rev=1852142&view=auto ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/LookBehindRegexHolderTest.java (added) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/LookBehindRegexHolderTest.java Fri Jan 25 15:27:43 2019 @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.bval.jsr.util; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class LookBehindRegexHolderTest { + private static final String MESSAGE_PARAMETER_PATTERN = + "(?<!(?:^|[^\\\\])(?:\\\\\\\\){0,%1$d}\\\\)\\{((?:[\\w\\.]|\\\\[\\{\\$\\}\\\\])+)\\}"; + + private LookBehindRegexHolder messageParameter; + + @Before + public void setup() { + messageParameter = new LookBehindRegexHolder(MESSAGE_PARAMETER_PATTERN, 5, 5, this::computeInjectedRepetition); + } + + @Test + public void testLookBehind() { + assertFound("{foo}"); + assertFound("${foo}"); + assertNotFound("\\{foo}"); + assertNotFound("{foo\\}"); + assertFound("\\\\{foo}"); + assertFound("{foo\\\\}"); + assertNotFound("\\\\\\{foo}"); + assertNotFound("{foo\\\\\\}"); + assertFound("\\${foo}"); + assertFound("\\\\${foo}"); + assertFound("\\\\\\${foo}"); + assertFound("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\${foo}"); + assertFound("{foo\\\\\\\\\\\\\\\\}"); + } + + private void assertFound(String msg) { + assertTrue(messageParameter.matcher(msg).find()); + } + + private void assertNotFound(String msg) { + assertFalse(messageParameter.matcher(msg).find()); + } + + @Test + public void testGrowth() { + assertEquals(5, messageParameter.getMaximumLength()); + assertMessageSizeYieldsMaximumSize(5, 5); + assertMessageSizeYieldsMaximumSize(10, 6); + assertMessageSizeYieldsMaximumSize(10, 5); + assertMessageSizeYieldsMaximumSize(10, 9); + assertMessageSizeYieldsMaximumSize(35, 31); + } + + private void assertMessageSizeYieldsMaximumSize(int max, int msg) { + messageParameter.matcher(new String(new byte[msg])); + assertEquals(max, messageParameter.getMaximumLength()); + assertEquals(String.format(MESSAGE_PARAMETER_PATTERN, computeInjectedRepetition(max)), + messageParameter.getPattern()); + } + + private int computeInjectedRepetition(int maximumLength) { + return (maximumLength - 5) / 2; + } +} Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/TestUtils.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/TestUtils.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/TestUtils.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/TestUtils.java Fri Jan 25 15:27:43 2019 @@ -26,7 +26,6 @@ import java.lang.annotation.Annotation; import java.util.Collection; import java.util.Set; -import javax.enterprise.inject.Vetoed; import javax.validation.ConstraintViolation; import javax.validation.metadata.ConstraintDescriptor; import javax.validation.metadata.ElementDescriptor.ConstraintFinder; Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java Fri Jan 25 15:27:43 2019 @@ -43,29 +43,33 @@ import org.apache.bval.jsr.Configuration import org.apache.bval.jsr.example.XmlEntitySampleBean; import org.apache.bval.jsr.resolver.SimpleTraversableResolver; import org.apache.bval.util.reflection.Reflection; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; /** * ValidationParser Tester. - * - * @author <Authors name> - * @version 1.0 - * @since <pre>11/25/2009</pre> */ public class ValidationParserTest implements ApacheValidatorConfiguration.Properties { @Rule public ExpectedException thrown = ExpectedException.none(); + private ValidationParser validationParser; + + @Before + public void setup() { + validationParser = new ValidationParser(Reflection.loaderFromThreadOrClass(ValidationParserTest.class)); + } + @Test public void testGetInputStream() throws IOException { - assertNotNull(ValidationParser.getInputStream("sample-validation.xml")); + assertNotNull(validationParser.getInputStream("sample-validation.xml")); // make sure there are duplicate resources on the classpath before the next checks: final Enumeration<URL> resources = - Reflection.getClassLoader(ValidationParser.class).getResources("META-INF/MANIFEST.MF"); + Reflection.loaderFromClassOrThread(ValidationParser.class).getResources("META-INF/MANIFEST.MF"); assumeTrue(resources.hasMoreElements()); resources.nextElement(); @@ -76,25 +80,25 @@ public class ValidationParserTest implem public void testGetNonUniqueInputStream() throws IOException { thrown.expect(ValidationException.class); thrown.expectMessage("More than "); - ValidationParser.getInputStream("META-INF/MANIFEST.MF"); // this is available in multiple jars hopefully + validationParser.getInputStream("META-INF/MANIFEST.MF"); // this is available in multiple jars hopefully } @Test public void testParse() { ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider()); - ValidationParser.processValidationConfig("sample-validation.xml", config); + validationParser.processValidationConfig("sample-validation.xml", config); } @Test public void testParseV11() { ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider()); - ValidationParser.processValidationConfig("sample-validation11.xml", config); + validationParser.processValidationConfig("sample-validation11.xml", config); } @Test public void testParseV20() { ConfigurationImpl config = new ConfigurationImpl(null, new ApacheValidationProvider()); - ValidationParser.processValidationConfig("sample-validation2.xml", config); + validationParser.processValidationConfig("sample-validation2.xml", config); } @Test Modified: tomee/deps/branches/bval-2/bval-jsr/src/test/resources/ValidationMessages.properties URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/test/resources/ValidationMessages.properties?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-jsr/src/test/resources/ValidationMessages.properties (original) +++ tomee/deps/branches/bval-2/bval-jsr/src/test/resources/ValidationMessages.properties Fri Jan 25 15:27:43 2019 @@ -24,3 +24,5 @@ test.validator.creditcard=credit card is # custom messages (examples) for validation-api-1.0.CR1 validator.creditcard=credit card is not valid +recursive.interpolation.1={recursive.interpolation.2} +recursive.interpolation.2={javax.validation.constraints.Pattern.message} Modified: tomee/deps/branches/bval-2/bval-tck/pom.xml URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-tck/pom.xml?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-tck/pom.xml (original) +++ tomee/deps/branches/bval-2/bval-tck/pom.xml Fri Jan 25 15:27:43 2019 @@ -23,15 +23,15 @@ under the License. <parent> <artifactId>bval-parent</artifactId> <groupId>org.apache.tomee.patch</groupId> - <version>2.0.0-nonfinal-57301f3-S1-SNAPSHOT</version> + <version>2.0.1-83f28d8-SNAPSHOT</version> </parent> <artifactId>bval-tck-runner</artifactId> <name>Apache BVal :: bval-tck (TCK Runner)</name> - <description>Aggregates dependencies and runs the JSR-349 TCK</description> + <description>Aggregates dependencies and runs the JSR-380 TCK</description> <properties> - <tck.version>2.0.3.Final</tck.version> + <tck.version>2.0.4.Final</tck.version> <owb.version>2.0.4</owb.version> <arquillian.version>1.1.11.Final</arquillian.version> <validation.provider>org.apache.bval.jsr.ApacheValidationProvider</validation.provider> @@ -178,6 +178,14 @@ under the License. <name>validation.provider</name> <value>${validation.provider}</value> </property> + <property> + <name>includeJavaFXTests</name> + <value>true</value> + </property> + <property> + <name>java.util.logging.config.file</name> + <value>${project.basedir}/src/test/resources/logging.properties</value> + </property> </systemProperties> <parallel>methods</parallel> <threadCount>4</threadCount> @@ -203,6 +211,60 @@ under the License. </plugin> </plugins> </build> + </profile> + <profile> + <id>sigtest</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>extract-sigsfile</id> + <phase>generate-test-sources</phase> + <goals> + <goal>unpack</goal> + </goals> + <configuration> + <artifactItems> + <artifactItem> + <groupId>org.hibernate.beanvalidation.tck</groupId> + <artifactId>beanvalidation-tck-tests</artifactId> + <version>${tck.version}</version> + </artifactItem> + </artifactItems> + <includes>**/*.sig</includes> + <outputDirectory>${project.build.directory}/api-signature</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.netbeans.tools</groupId> + <artifactId>sigtest-maven-plugin</artifactId> + <executions> + <execution> + <id>sigtest</id> + <phase>test</phase> + <goals> + <goal>check</goal> + </goals> + <configuration> + <packages>javax.validation,javax.validation.bootstrap,javax.validation.constraints, + javax.validation.constraintvalidation,javax.validation.executable,javax.validation.groups, + javax.validation.metadata,javax.validation.spi,javax.validation.valueextraction + </packages> + <sigfile>${project.build.directory}/api-signature/validation-api-java8.sig</sigfile> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> </profile> </profiles> </project> Modified: tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/BValArquillianExtension.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/BValArquillianExtension.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/BValArquillianExtension.java (original) +++ tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/BValArquillianExtension.java Fri Jan 25 15:27:43 2019 @@ -18,11 +18,35 @@ */ package org.apache.bval.arquillian; +import java.util.logging.Logger; + +import org.jboss.arquillian.core.api.annotation.Observes; import org.jboss.arquillian.core.spi.LoadableExtension; +import org.jboss.arquillian.test.spi.TestClass; import org.jboss.arquillian.test.spi.TestEnricher; +import org.jboss.arquillian.test.spi.event.suite.AfterClass; +import org.jboss.arquillian.test.spi.event.suite.BeforeClass; public class BValArquillianExtension implements LoadableExtension { public void register(final ExtensionBuilder builder) { - builder.service(TestEnricher.class, EJBEnricher.class); + builder.service(TestEnricher.class, EJBEnricher.class).observer(TestLogger.class); + } + + public static class TestLogger { + private static final Logger LOGGER = Logger.getLogger(TestLogger.class.getName()); + + public void before(@Observes final BeforeClass beforeClass) { + LOGGER.info(() -> "Launching " + toName(beforeClass.getTestClass())); + } + + public void after(@Observes final AfterClass beforeClass) { + LOGGER.info(() -> "Executed " + toName(beforeClass.getTestClass())); + } + + private String toName(final TestClass testClass) { + return testClass.getJavaClass() + .getName() + .replace("org.hibernate.beanvalidation.tck.tests.", "o.h.b.t.t."); + } } } Modified: tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/EJBEnricher.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/EJBEnricher.java?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/EJBEnricher.java (original) +++ tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/EJBEnricher.java Fri Jan 25 15:27:43 2019 @@ -1,19 +1,21 @@ /* -* JBoss, Home of Professional Open Source -* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual contributors -* by the @authors tag. See the copyright.txt in the distribution for a -* full listing of individual contributors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* http://www.apache.org/licenses/LICENSE-2.0 -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.bval.arquillian; import org.jboss.arquillian.test.spi.TestEnricher; Added: tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/LogTckFormatter.java URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/LogTckFormatter.java?rev=1852142&view=auto ============================================================================== --- tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/LogTckFormatter.java (added) +++ tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/LogTckFormatter.java Fri Jan 25 15:27:43 2019 @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.bval.arquillian; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.logging.LogRecord; +import java.util.logging.SimpleFormatter; + +public class LogTckFormatter extends SimpleFormatter { + @Override + public String format(final LogRecord record) { + final String message = formatMessage(record); + String throwable = ""; + if (record.getThrown() != null) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + pw.println(); + record.getThrown().printStackTrace(pw); + pw.close(); + throwable = sw.toString(); + } + return String.format("[%s] %s%n%s", record.getLevel(), message, throwable); + } +} Added: tomee/deps/branches/bval-2/bval-tck/src/test/resources/logging.properties URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-tck/src/test/resources/logging.properties?rev=1852142&view=auto ============================================================================== --- tomee/deps/branches/bval-2/bval-tck/src/test/resources/logging.properties (added) +++ tomee/deps/branches/bval-2/bval-tck/src/test/resources/logging.properties Fri Jan 25 15:27:43 2019 @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +.level= INFO +handlers = java.util.logging.ConsoleHandler +java.util.logging.ConsoleHandler.level = INFO +java.util.logging.ConsoleHandler.formatter =org.apache.bval.arquillian.LogTckFormatter +org.apache.webbeans.arquillian.standalone.OwbArquillianScannerService.level = WARNING Modified: tomee/deps/branches/bval-2/pom.xml URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/pom.xml?rev=1852142&r1=1852141&r2=1852142&view=diff ============================================================================== --- tomee/deps/branches/bval-2/pom.xml (original) +++ tomee/deps/branches/bval-2/pom.xml Fri Jan 25 15:27:43 2019 @@ -35,14 +35,17 @@ <artifactId>bval-parent</artifactId> <name>Apache BVal :: bval-parent (Parent POM)</name> <packaging>pom</packaging> - <version>2.0.0-nonfinal-57301f3-S1-SNAPSHOT</version> + <version>2.0.1-83f28d8-SNAPSHOT</version> <description>Apache BVal parent pom</description> <properties> - <site.deploy.url>sftp://people.apache.org/home/${user.name}/public_html/bval/${project.version}/staging-site</site.deploy.url> <commons.weaver.version>2.0</commons.weaver.version> <privilizer.policy>DYNAMIC</privilizer.policy> + <site.checkout>${user.home}/apache-bval-site</site.checkout> + <site.url>scm:svn:https://svn.apache.org/repos/infra/websites/production/bval/content/mvnsite</site.url> + <site.server>bval.site</site.server> + <built.by>${user.name}</built.by> </properties> <inceptionYear>2010</inceptionYear> @@ -96,7 +99,7 @@ </developer> <developer> <id>carlosvara</id> - <name>Carlos Vara</name> + <name>Carlos Vara Callau</name> <email>carlosv...@apache.org</email> <roles> <role>PMC Member</role> @@ -144,7 +147,7 @@ <email>ke...@apache.org</email> <organization>IBM</organization> <roles> - <role>PMC Member</role> + <role>PMC Member (Emeritus)</role> </roles> </developer> <developer> @@ -234,17 +237,15 @@ <name>Jörg WaÃmer</name> </contributor> <contributor> - <name>Romain Manni-Bucau</name> - </contributor> - <contributor> <name>Sebastian Bazley</name> </contributor> </contributors> <distributionManagement> <site> - <id>people.apache.org</id> - <url>${site.deploy.url}</url> + <id>bval.site</id> + <name>Apache BVal Site SVN</name> + <url>scm:svn:${site.url}</url> </site> </distributionManagement> @@ -261,7 +262,6 @@ <source>1.8</source> <links> <link>http://docs.oracle.com/javase/8/docs/api</link> -<!-- <link>http://docs.oracle.com/javaee/7/api</link> --> </links> </configuration> <reportSets> @@ -274,6 +274,28 @@ </reportSets> </plugin> <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.0.1</version> + <inherited>false</inherited> + <configuration> + <doclint>none</doclint> + <show>package</show> + <quiet>true</quiet> + <source>1.8</source> + <links> + <link>http://docs.oracle.com/javase/8/docs/api</link> + </links> + </configuration> + <reportSets> + <reportSet> + <reports> + <report>aggregate</report> + </reports> + </reportSet> + </reportSets> + </plugin> + <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jdepend-maven-plugin</artifactId> <version>2.0-beta-2</version> @@ -401,9 +423,9 @@ <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> <manifestEntries> + <Built-By>${built.by}</Built-By> <Implementation-Build>${buildNumber}</Implementation-Build> - <Specification-Title>JSR-380 Bean Validation</Specification-Title> - <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> + <Specification-Title>Bean Validation</Specification-Title> <Specification-Version>2.0</Specification-Version> </manifestEntries> </archive> @@ -412,17 +434,16 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> + <version>3.0.1</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <additionalparam>${javadoc.additionalparam}</additionalparam> <aggregate>true</aggregate> <doclint>none</doclint> - <subpackages>org.apache</subpackages> <verbose>false</verbose> <maxmemory>512m</maxmemory> <links> <link>http://docs.oracle.com/javase/8/docs/api</link> -<!-- <link>http://docs.oracle.com/javaee/7/api</link> --> </links> </configuration> </plugin> @@ -604,6 +625,16 @@ </dependency> </dependencies> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>3.1.1</version> + </plugin> + <plugin> + <groupId>org.netbeans.tools</groupId> + <artifactId>sigtest-maven-plugin</artifactId> + <version>1.0</version> + </plugin> </plugins> </pluginManagement> @@ -671,6 +702,42 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-site-plugin</artifactId> + <configuration> + <skipDeploy>true</skipDeploy> + </configuration> + <executions> + <execution> + <id>site-stage</id> + <phase>post-site</phase> + <goals> + <goal>stage</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-scm-publish-plugin</artifactId> + <inherited>false</inherited> + <configuration> + <pubScmUrl>${site.url}</pubScmUrl> + <checkoutDirectory>${site.checkout}</checkoutDirectory> + <serverId>${site.server}</serverId> + <tryUpdate>true</tryUpdate> + </configuration> + <executions> + <execution> + <id>scm-publish</id> + <phase>site-deploy</phase><!-- deploy site with maven-scm-publish-plugin --> + <goals> + <goal>publish-scm</goal> + </goals> + </execution> + </executions> + </plugin> <!-- Don't include in all builds for now <plugin> <groupId>org.codehaus.mojo</groupId>