You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ra...@apache.org on 2019/01/25 15:27:44 UTC

svn commit: r1852142 [1/3] - in /tomee/deps/branches/bval-2: ./ bundle/ bundle/src/main/appended-resources/META-INF/ bval-extras/ bval-jsr/ bval-jsr/src/main/appended-resources/META-INF/ bval-jsr/src/main/java/org/apache/bval/constraints/ bval-jsr/src/...

Author: radcortez
Date: Fri Jan 25 15:27:43 2019
New Revision: 1852142

URL: http://svn.apache.org/viewvc?rev=1852142&view=rev
Log:
Update bval tomee path with latest changes from official bval repo until git hash 83f28d8.

Added:
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheMessageContext.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxy.java
      - copied, changed from r1852141, tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxyBuilder.java
      - copied, changed from r1852141, tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/LookBehindRegexHolder.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/LiskovTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/LookBehindRegexHolderTest.java
    tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/LogTckFormatter.java
    tomee/deps/branches/bval-2/bval-tck/src/test/resources/logging.properties
    tomee/deps/branches/bval-2/src/
    tomee/deps/branches/bval-2/src/site/
    tomee/deps/branches/bval-2/src/site/resources/
    tomee/deps/branches/bval-2/src/site/resources/images/
    tomee/deps/branches/bval-2/src/site/resources/images/bval-bean-small.png
    tomee/deps/branches/bval-2/src/site/site.xml
Removed:
    tomee/deps/branches/bval-2/bundle/src/main/appended-resources/META-INF/NOTICE.vm
    tomee/deps/branches/bval-2/bval-jsr/src/main/appended-resources/META-INF/NOTICE.vm
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/XmlUtils.java
Modified:
    tomee/deps/branches/bval-2/CHANGES.txt
    tomee/deps/branches/bval-2/NOTICE
    tomee/deps/branches/bval-2/README.txt
    tomee/deps/branches/bval-2/bundle/pom.xml
    tomee/deps/branches/bval-2/bval-extras/pom.xml
    tomee/deps/branches/bval-2/bval-jsr/pom.xml
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/el/ELFacade.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheFactoryContext.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorConfiguration.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ParticipantFactory.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Groups.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationParser.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/util/reflection/Reflection.java
    tomee/deps/branches/bval-2/bval-jsr/src/main/resources/org/apache/bval/jsr/ValidationMessages.properties
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/BeanDescriptorTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/DefaultMessageInterpolatorTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/ValidationTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/example/Book.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/extensions/MethodValidatorImplTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/CollectionValidationTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/DefaultGroupSequenceTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/GroupSequenceTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/implicit/ImplicitGroupingTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/groups/inheritance/GroupInheritanceTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/util/TestUtils.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/java/org/apache/bval/jsr/xml/ValidationParserTest.java
    tomee/deps/branches/bval-2/bval-jsr/src/test/resources/ValidationMessages.properties
    tomee/deps/branches/bval-2/bval-tck/pom.xml
    tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/BValArquillianExtension.java
    tomee/deps/branches/bval-2/bval-tck/src/main/java/org/apache/bval/arquillian/EJBEnricher.java
    tomee/deps/branches/bval-2/pom.xml

Modified: tomee/deps/branches/bval-2/CHANGES.txt
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/CHANGES.txt?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/CHANGES.txt (original)
+++ tomee/deps/branches/bval-2/CHANGES.txt Fri Jan 25 15:27:43 2019
@@ -14,19 +14,16 @@ Content
 
 Overview
 ========
-This is an implementation of the Java Bean Validation (JSRs 303, 349)
+This is an implementation of the Java Bean Validation (JSRs 303, 349, 380)
 specification for Java EE and Java SE.
 The technical objective is to provide a class level constraint declaration and
 validation facility for the Java application developer, as well as a constraint
 metadata repository and query API.
 
-This implementation is based on the validation framework of Agimatec GmbH,
-which was contributed to the ASF under a software grant.
-
 
 Prerequisites
 =============
-You need a platform that supports Java SE 6 or later.
+You need a platform that supports Java SE 8 or later.
 
 
 Documentation
@@ -53,6 +50,27 @@ How do I Contribute?
   * Bugs and other issues can be posted on the project JIRA.
 
 
+Release Notes - BVal - Version 2.0.0
+==========================================
+
+** Bug
+    * [BVAL-108] - Prefer Thread context classloader or framework-relative as appropriate to task - addresses resource loading complaints with OSGI
+    * [BVAL-154] - avoid storing metamodel for unconstrained types using "negative cache"
+    * [BVAL-157] - method named get() blows up with illegal param name
+    * [BVAL-158] - ExecutableValidator invokes method if it looks like a getter
+
+** Improvement
+    * [BVAL-118] - improve efficiency by associating bean metadata with the factory rather than the context
+    * [BVAL-159] - Drop commons dependencies
+    * [BVAL-160] - Implement Bean Validation 2.0 (JSR 380)
+
+** Task
+    * [BVAL-161] - Redesign bean metadata model
+    * [BVAL-162] - Convert remaining JUnit 3 tests to JUnit 4
+    * [BVAL-163] - Remove Agimatech extensions
+    * [BVAL-164] - Merge core code into jsr module
+
+
 Release Notes - BVal - Version 1.1.2
 ==========================================
 

Modified: tomee/deps/branches/bval-2/NOTICE
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/NOTICE?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/NOTICE (original)
+++ tomee/deps/branches/bval-2/NOTICE Fri Jan 25 15:27:43 2019
@@ -1,6 +1,6 @@
 
 Apache BVal project
-Copyright 2010-2016 The Apache Software Foundation.
+Copyright 2010-2018 The Apache Software Foundation.
 
 This product includes software developed by
 The Apache Software Foundation (http://www.apache.org/).

Modified: tomee/deps/branches/bval-2/README.txt
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/README.txt?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/README.txt (original)
+++ tomee/deps/branches/bval-2/README.txt Fri Jan 25 15:27:43 2019
@@ -4,7 +4,7 @@ Licensed under Apache License 2.0 - http
 
 About
 =====
-This is an implementation of the Java Bean Validation (JSRs 303, 349)
+This is an implementation of the Java Bean Validation (JSRs 303, 349, 380)
 specification for Java EE and Java SE.
 The technical objective is to provide a class level constraint declaration and
 validation facility for the Java application developer, as well as a constraint
@@ -28,14 +28,14 @@ Along with the developer mailing list ar
 
 System Requirements
 ===================
-You need a platform that supports Java SE 6 or later.
-Most testing has been done with Java SE 7 on Mac OS X, Windows and Linux.
+You need a platform that supports Java SE 8 or later.
+Most testing has been done with Java SE 8 on Mac OS X, Windows and Linux.
 
 
 Building
 ==========================
 To build from source code:
-  - Sources require Java SE 6 or higher. 
+  - Sources require Java SE 8 or higher. 
   - The project is built with Apache Maven (suggested is at least 3.2.1).
     You need to download and install Maven from: http://maven.apache.org/
   - Invoke maven in the root directory or a module subdirectory:

Modified: tomee/deps/branches/bval-2/bundle/pom.xml
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bundle/pom.xml?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bundle/pom.xml (original)
+++ tomee/deps/branches/bval-2/bundle/pom.xml Fri Jan 25 15:27:43 2019
@@ -27,7 +27,7 @@
     <parent>
         <groupId>org.apache.tomee.patch</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>2.0.0-nonfinal-57301f3-S1-SNAPSHOT</version>
+        <version>2.0.1-83f28d8-SNAPSHOT</version>
     </parent>
 
     <!-- use fully qualified naming for OSGi bundles -->
@@ -36,7 +36,7 @@
 
     <packaging>bundle</packaging>
 
-    <description>Apache BVal - Aggregate OSGi Bundle (bval-core + bval-jsr)</description>
+    <description>Apache BVal - OSGi Packaging of bval-jsr</description>
 
     <dependencies>
         <!-- JARs to include in aggregate JAR via maven-shade-plugin -->
@@ -63,7 +63,7 @@
                         <Implementation-Vendor>org.apache</Implementation-Vendor>
                         <Specification-Title>Java Bean Validation</Specification-Title>
                         <Specification-Vendor>Java Community Process</Specification-Vendor>
-                        <Specification-Version>1.1</Specification-Version>
+                        <Specification-Version>2.0</Specification-Version>
                         <Bundle-DocURL>${project.url}</Bundle-DocURL>
                         <Embed-Dependency>*;inline=true</Embed-Dependency>
                         <Private-Package />
@@ -113,6 +113,4 @@
             </build>
         </profile>
     </profiles>
-
 </project>
-

Modified: tomee/deps/branches/bval-2/bval-extras/pom.xml
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-extras/pom.xml?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-extras/pom.xml (original)
+++ tomee/deps/branches/bval-2/bval-extras/pom.xml Fri Jan 25 15:27:43 2019
@@ -27,14 +27,14 @@
     <parent>
         <groupId>org.apache.tomee.patch</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>2.0.0-nonfinal-57301f3-S1-SNAPSHOT</version>
+        <version>2.0.1-83f28d8-SNAPSHOT</version>
     </parent>
 
     <artifactId>bval-extras</artifactId>
     <name>Apache BVal :: bval-extras (optional)</name>
     <packaging>bundle</packaging>
 
-    <description>BVal - non-JSR303 routines and constraints</description>
+    <description>BVal - non-JSR380 routines and constraints</description>
 
     <dependencies>
         <dependency>

Modified: tomee/deps/branches/bval-2/bval-jsr/pom.xml
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/pom.xml?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/pom.xml (original)
+++ tomee/deps/branches/bval-2/bval-jsr/pom.xml Fri Jan 25 15:27:43 2019
@@ -24,14 +24,14 @@
     <parent>
         <groupId>org.apache.tomee.patch</groupId>
         <artifactId>bval-parent</artifactId>
-        <version>2.0.0-nonfinal-57301f3-S1-SNAPSHOT</version>
+        <version>2.0.1-83f28d8-SNAPSHOT</version>
     </parent>
 
     <artifactId>bval-jsr</artifactId>
     <name>Apache BVal :: bval-jsr</name>
     <packaging>jar</packaging>
 
-    <description>Implementation specific classes for JSR 349 Bean Validation 1.1</description>
+    <description>Implementation specific classes for JSR 380 Bean Validation 2.0</description>
 
     <properties>
         <jaxb.version>2.2.6</jaxb.version>
@@ -211,6 +211,30 @@
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat</groupId>
+            <artifactId>tomcat-jasper-el</artifactId>
+            <version>9.0.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>3.0.1-b10</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>de.odysseus.juel</groupId>
+            <artifactId>juel-api</artifactId>
+            <version>2.2.7</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>de.odysseus.juel</groupId>
+            <artifactId>juel-impl</artifactId>
+            <version>2.2.7</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -266,9 +290,6 @@
                                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                    <mainClass>org.apache.bval.util.BValVersion</mainClass>
                                 </manifest>
-                                <manifestEntries>
-                                    <Implementation-Build>${buildNumber}</Implementation-Build>
-                                </manifestEntries>
                             </archive>
                         </configuration>
                     </execution>

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidator.java Fri Jan 25 15:27:43 2019
@@ -20,20 +20,23 @@ package org.apache.bval.constraints;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
+import javax.validation.constraints.NotEmpty;
+
 import java.lang.reflect.Array;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
- * Description:  Check the non emptiness of an
- * any object that has a public isEmpty():boolean or a valid toString() method
+ * {@link ConstraintValidator} implementation for {@link NotEmpty}.
+ * Additionally, check the non-emptiness of an
+ * any object that has a public isEmpty():boolean or a valid toString() method.
  */
 public class NotEmptyValidator implements ConstraintValidator<javax.validation.constraints.NotEmpty, Object> {
 
     @Override
     public boolean isValid(Object value, ConstraintValidatorContext context) {
         if (value == null) {
-            return true;
+            return false;
         }
         if (value.getClass().isArray()) {
             return Array.getLength(value) > 0;

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCharSequence.java Fri Jan 25 15:27:43 2019
@@ -29,6 +29,6 @@ public class NotEmptyValidatorForCharSeq
 
     @Override
     public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
-        return value == null || value.length() > 0;
+        return value != null && value.length() > 0;
     }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForCollection.java Fri Jan 25 15:27:43 2019
@@ -30,6 +30,6 @@ public class NotEmptyValidatorForCollect
 
     @Override
     public boolean isValid(Collection<?> value, ConstraintValidatorContext context) {
-        return value == null || !value.isEmpty();
+        return !(value == null || value.isEmpty());
     }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/constraints/NotEmptyValidatorForMap.java Fri Jan 25 15:27:43 2019
@@ -29,6 +29,6 @@ public class NotEmptyValidatorForMap imp
 
     @Override
     public boolean isValid(Map<?, ?> value, ConstraintValidatorContext context) {
-        return value == null || !value.isEmpty();
+        return !(value == null || value.isEmpty());
     }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/el/ELFacade.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/el/ELFacade.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/el/ELFacade.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/el/ELFacade.java Fri Jan 25 15:27:43 2019
@@ -16,6 +16,11 @@
  */
 package org.apache.bval.el;
 
+import java.lang.reflect.Method;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.el.ArrayELResolver;
 import javax.el.BeanELResolver;
 import javax.el.CompositeELResolver;
@@ -28,41 +33,48 @@ import javax.el.MapELResolver;
 import javax.el.ResourceBundleELResolver;
 import javax.el.ValueExpression;
 import javax.el.VariableMapper;
-import java.lang.reflect.Method;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.Map;
+
+import org.apache.bval.jsr.util.LookBehindRegexHolder;
 
 // ELProcessor or JavaEE 7 would be perfect too but this impl can be used in javaee 6
 public final class ELFacade implements MessageEvaluator {
-    private static final ExpressionFactory EXPRESSION_FACTORY;
-    static {
-        ExpressionFactory ef;
-        try {
-            ef = ExpressionFactory.newInstance();
-        } catch (final Exception e) {
-            ef = null;
+    private enum EvaluationType {
+        IMMEDIATE("\\$"), DEFERRED("#");
+
+        /**
+         * {@link LookBehindRegexHolder} to recognize a non-escaped EL
+         * expression of this evaluation type, hallmarked by a trigger
+         * character.
+         */
+        private final LookBehindRegexHolder regex;
+
+        private EvaluationType(String trigger) {
+            this.regex = new LookBehindRegexHolder(
+                String.format("(?<!(?:^|[^\\\\])(?:\\\\\\\\){0,%%d}\\\\)%s\\{", trigger), n -> (n - 3) / 2);
         }
-        EXPRESSION_FACTORY = ef;
     }
+
     private static final ELResolver RESOLVER = initResolver();
 
+    private final ExpressionFactory expressionFactory = ExpressionFactory.newInstance();
+
     @Override
     public String interpolate(final String message, final Map<String, Object> annotationParameters,
         final Object validatedValue) {
         try {
-            if (EXPRESSION_FACTORY != null) {
+            if (EvaluationType.IMMEDIATE.regex.matcher(message).find()) {
                 final BValELContext context = new BValELContext();
                 final VariableMapper variables = context.getVariableMapper();
                 annotationParameters.forEach(
-                    (k, v) -> variables.setVariable(k, EXPRESSION_FACTORY.createValueExpression(v, Object.class)));
+                    (k, v) -> variables.setVariable(k, expressionFactory.createValueExpression(v, Object.class)));
 
                 variables.setVariable("validatedValue",
-                    EXPRESSION_FACTORY.createValueExpression(validatedValue, Object.class));
+                    expressionFactory.createValueExpression(validatedValue, Object.class));
 
-                // #{xxx} shouldn't be evaluated
-                return EXPRESSION_FACTORY.createValueExpression(context, message.replace("#{", "\\#{"), String.class)
-                    .getValue(context).toString();
+                // Java Bean Validation does not support EL expressions that look like JSP "deferred" expressions
+                return expressionFactory.createValueExpression(context,
+                    EvaluationType.DEFERRED.regex.matcher(message).replaceAll("\\$0"), String.class).getValue(context)
+                    .toString();
             }
         } catch (final Exception e) {
             // no-op
@@ -81,7 +93,7 @@ public final class ELFacade implements M
         return resolver;
     }
 
-    private static class BValELContext extends ELContext {
+    private class BValELContext extends ELContext {
         private final FunctionMapper functions = new BValFunctionMapper();
         private final VariableMapper variables = new BValVariableMapper();
 
@@ -108,13 +120,13 @@ public final class ELFacade implements M
         }
     }
 
-    private static class BValVariableMapper extends VariableMapper {
+    private class BValVariableMapper extends VariableMapper {
         private final Map<String, ValueExpression> variables = new HashMap<String, ValueExpression>();
 
         @Override
         public ValueExpression resolveVariable(final String variable) {
             if ("formatter".equals(variable)) {
-                return EXPRESSION_FACTORY.createValueExpression(new BValFormatter(), Object.class);
+                return expressionFactory.createValueExpression(new BValFormatter(), Object.class);
             }
             return variables.get(variable);
         }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheFactoryContext.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheFactoryContext.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheFactoryContext.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheFactoryContext.java Fri Jan 25 15:27:43 2019
@@ -181,4 +181,8 @@ public class ApacheFactoryContext implem
     public ConstraintCached getConstraintsCache() {
         return factory.getConstraintsCache();
     }
+
+    public ApacheValidatorFactory getFactory() {
+        return factory;
+    }
 }

Added: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheMessageContext.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheMessageContext.java?rev=1852142&view=auto
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheMessageContext.java (added)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheMessageContext.java Fri Jan 25 15:27:43 2019
@@ -0,0 +1,36 @@
+/*
+ * 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 javax.validation.MessageInterpolator;
+import javax.validation.MessageInterpolator.Context;
+
+/**
+ * Vendor-specific {@link MessageInterpolator.Context} interface extension to
+ * provide access to validator configuration properties.
+ */
+public interface ApacheMessageContext extends Context {
+
+    /**
+     * Get the configuration property value specified by {@code propertyKey}, if available.
+     * @param propertyKey
+     * @return {@link String} or {@code null}
+     */
+    String getConfigurationProperty(String propertyKey);
+}

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorConfiguration.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorConfiguration.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorConfiguration.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorConfiguration.java Fri Jan 25 15:27:43 2019
@@ -49,5 +49,15 @@ public interface ApacheValidatorConfigur
          * Size to use for caching of constraint-related information. Default is {@code 50}.
          */
         String CONSTRAINTS_CACHE_SIZE = "apache.bval.constraints-cache-size";
+
+        /**
+         * Specifies whether EL evaluation is permitted in non-default message
+         * templates. By default this feature is disabled; if you enable it you
+         * should ensure that no constraint validator builds violations using
+         * message templates containing unchecked text (e.g. the validated
+         * value). To do otherwise is to expose your system to potential
+         * injection attacks.
+         */
+        String CUSTOM_TEMPLATE_EXPRESSION_EVALUATION = "apache.bval.custom-template-expression-evaluation";
     }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java Fri Jan 25 15:27:43 2019
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.function.BiConsumer;
 
 import javax.validation.ClockProvider;
@@ -368,6 +369,9 @@ public class ApacheValidatorFactory impl
             getMetadataBuilders().registerCustomBuilder((Class) t, (MetadataBuilder.ForBean) b);
         };
         participantFactory.loadServices(MetadataSource.class)
-            .forEach(ms -> ms.process(configuration, getConstraintsCache()::add, addBuilder));
+            .forEach(ms -> {
+                ms.initialize(this);
+                ms.process(configuration, getConstraintsCache()::add, addBuilder);
+            });
     }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConfigurationImpl.java Fri Jan 25 15:27:43 2019
@@ -52,6 +52,7 @@ import org.apache.bval.jsr.xml.Validatio
 import org.apache.bval.util.CloseableAble;
 import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.Lazy;
+import org.apache.bval.util.reflection.Reflection;
 import org.apache.commons.weaver.privilizer.Privileged;
 
 /**
@@ -156,6 +157,7 @@ public class ConfigurationImpl implement
     private boolean ignoreXmlConfiguration = false;
 
     private ParticipantFactory participantFactory;
+    private ValidationParser validationParser;
 
     /**
      * Create a new ConfigurationImpl instance.
@@ -411,20 +413,17 @@ public class ConfigurationImpl implement
     private BootstrapConfiguration createBootstrapConfiguration() {
         try {
             if (!ignoreXmlConfiguration) {
-                loader = Thread.currentThread().getContextClassLoader();
-                if (loader == null) {
-                    loader = ValidationParser.class.getClassLoader();
-                }
+                loader = Reflection.loaderFromThreadOrClass(ValidationParser.class);
+                validationParser = new ValidationParser(loader);
                 final BootstrapConfiguration xmlBootstrap =
-                    ValidationParser.processValidationConfig(getProperties().get(Properties.VALIDATION_XML_PATH), this);
+                    validationParser.processValidationConfig(getProperties().get(Properties.VALIDATION_XML_PATH), this);
                 if (xmlBootstrap != null) {
                     return xmlBootstrap;
                 }
             }
-            loader = Thread.currentThread().getContextClassLoader();
-            if (loader == null) {
-                loader = ApacheValidatorFactory.class.getClassLoader();
-            }
+            validationParser =
+                new ValidationParser(loader = Reflection.loaderFromThreadOrClass(ApacheValidatorFactory.class));
+
             return BootstrapConfigurationImpl.DEFAULT;
         } finally {
             participantFactory = new ParticipantFactory(loader);
@@ -438,7 +437,7 @@ public class ConfigurationImpl implement
             this.providerClass = loadClass(bootstrapConfig.getDefaultProviderClassName());
         }
         bootstrapConfig.getProperties().forEach(this::addProperty);
-        bootstrapConfig.getConstraintMappingResourcePaths().stream().map(ValidationParser::open)
+        bootstrapConfig.getConstraintMappingResourcePaths().stream().map(validationParser::open)
             .forEach(this::addMapping);
 
         if (!beforeCdi) {

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java Fri Jan 25 15:27:43 2019
@@ -62,7 +62,9 @@ public class ConstraintDefaults extends
         final ClassLoader classloader = getClassLoader();
         try (final InputStream stream = classloader.getResourceAsStream(resource)) {
             if (stream == null) {
-                log.log(Level.WARNING, String.format("Cannot find %s", resource));
+                if (log.isLoggable(Level.WARNING)) {
+                    log.log(Level.WARNING, String.format("Cannot find %s", resource));
+                }
             } else {
                 result.load(stream);
             }
@@ -87,4 +89,9 @@ public class ConstraintDefaults extends
                 e -> log.log(Level.SEVERE, "exception loading default constraint validators", e))
                     .collect(Collectors.toList()));
     }
+
+    @Override
+    protected ClassLoader getClassLoader() {
+        return Reflection.loaderFromClassOrThread(ConstraintDefaults.class);
+    }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java Fri Jan 25 15:27:43 2019
@@ -16,23 +16,26 @@
  */
 package org.apache.bval.jsr;
 
-import org.apache.bval.el.MessageEvaluator;
-import org.apache.bval.util.reflection.Reflection;
-import org.apache.commons.weaver.privilizer.Privilizing;
-import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
-
-import javax.validation.MessageInterpolator;
-
+import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.Locale;
 import java.util.Map;
 import java.util.MissingResourceException;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.ResourceBundle;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
+import javax.validation.MessageInterpolator;
+
+import org.apache.bval.el.MessageEvaluator;
+import org.apache.bval.jsr.util.LookBehindRegexHolder;
+import org.apache.bval.util.reflection.Reflection;
+import org.apache.commons.weaver.privilizer.Privilizing;
+import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
 
 /**
  * Description: Resource bundle backed message interpolator.
@@ -47,8 +50,11 @@ public class DefaultMessageInterpolator
     private static final String DEFAULT_VALIDATION_MESSAGES = "org.apache.bval.jsr.ValidationMessages";
     private static final String USER_VALIDATION_MESSAGES = "ValidationMessages";
 
-    /** Regular expression used to do message interpolation. */
-    private static final Pattern messageParameterPattern = Pattern.compile("(\\{[\\w\\.]+\\})");
+    /**
+     * {@link LookBehindRegexHolder} to match Bean Validation attribute patterns, considering character escaping.
+     */
+    private static final LookBehindRegexHolder MESSAGE_PARAMETER = new LookBehindRegexHolder(
+        "(?<!(?:^|[^\\\\])(?:\\\\\\\\){0,%1$d}\\\\)\\{((?:[\\w\\.]|\\\\[\\{\\$\\}\\\\])+)\\}", n -> (n - 4) / 2);
 
     /** The default locale for the current user. */
     private Locale defaultLocale;
@@ -96,7 +102,7 @@ public class DefaultMessageInterpolator
 
     /** {@inheritDoc} */
     @Override
-    public String interpolate(String message, Context context) {
+    public String interpolate(final String message, final Context context) {
         // probably no need for caching, but it could be done by parameters since the map
         // is immutable and uniquely built per Validation definition, the comparison has to be based on == and not equals though
         return interpolate(message, context, defaultLocale);
@@ -104,28 +110,11 @@ public class DefaultMessageInterpolator
 
     /** {@inheritDoc} */
     @Override
-    public String interpolate(String message, Context context, Locale locale) {
-        return interpolateMessage(message, context.getConstraintDescriptor().getAttributes(), locale,
-            context.getValidatedValue());
-    }
-
-    /**
-     * Runs the message interpolation according to algorithm specified in JSR 303.
-     * <br/>
-     * Note:
-     * <br/>
-     * Lookups in user bundles are recursive whereas lookups in default bundle are not!
-     *
-     * @param message              the message to interpolate
-     * @param annotationParameters the parameters of the annotation for which to interpolate this message
-     * @param locale               the <code>Locale</code> to use for the resource bundle.
-     * @return the interpolated message.
-     */
-    private String interpolateMessage(String message, Map<String, Object> annotationParameters, Locale locale,
-        Object validatedValue) {
-        ResourceBundle userResourceBundle = findUserResourceBundle(locale);
-        ResourceBundle defaultResourceBundle = findDefaultResourceBundle(locale);
+    public String interpolate(final String message, final Context context, final Locale locale) {
+        final ResourceBundle userResourceBundle = findUserResourceBundle(locale);
+        final ResourceBundle defaultResourceBundle = findDefaultResourceBundle(locale);
 
+        final Map<String, Object> annotationParameters = context.getConstraintDescriptor().getAttributes();
         String userBundleResolvedMessage;
         String resolvedMessage = message;
         boolean evaluatedDefaultBundleOnce = false;
@@ -138,10 +127,8 @@ public class DefaultMessageInterpolator
             if (evaluatedDefaultBundleOnce && !hasReplacementTakenPlace(userBundleResolvedMessage, resolvedMessage)) {
                 break;
             }
-
             // search the default bundle non recursive (step2)
             resolvedMessage = replaceVariables(userBundleResolvedMessage, defaultResourceBundle, locale, false);
-
             evaluatedDefaultBundleOnce = true;
         } while (true);
 
@@ -149,15 +136,55 @@ public class DefaultMessageInterpolator
         resolvedMessage = replaceAnnotationAttributes(resolvedMessage, annotationParameters);
 
         // EL handling
-        if (evaluator != null) {
-            resolvedMessage = evaluator.interpolate(resolvedMessage, annotationParameters, validatedValue);
+        if (evaluateExpressionLanguage(message, context)) {
+            resolvedMessage = evaluator.interpolate(resolvedMessage, annotationParameters, context.getValidatedValue());
         }
+        return resolveEscapeSequences(resolvedMessage);
+    }
 
-        // curly braces need to be scaped in the original msg, so unescape them now
-        resolvedMessage =
-            resolvedMessage.replace("\\{", "{").replace("\\}", "}").replace("\\\\", "\\").replace("\\$", "$");
+    private boolean evaluateExpressionLanguage(String template, Context context) {
+        if (evaluator != null) {
+            if (Objects.equals(template, context.getConstraintDescriptor().getMessageTemplate())) {
+                return true;
+            }
+            final Optional<ApacheMessageContext> apacheMessageContext = Optional.of(context).map(ctx -> {
+                try {
+                    return ctx.unwrap(ApacheMessageContext.class);
+                } catch (Exception e) {
+                    return null;
+                }
+            });
+            return !apacheMessageContext.isPresent() || apacheMessageContext
+                .map(amc -> amc.getConfigurationProperty(
+                    ApacheValidatorConfiguration.Properties.CUSTOM_TEMPLATE_EXPRESSION_EVALUATION))
+                .filter(Boolean::parseBoolean).isPresent();
+        }
+        return false;
+    }
+
+    private String resolveEscapeSequences(String s) {
+        int pos = s.indexOf('\\');
+        if (pos < 0) {
+            return s;
+        }
+        StringBuilder result = new StringBuilder(s.length());
+ 
+        int prev = 0;
+        do {
+            if (pos + 1 >= s.length()) {
+                break;
+            }
+            if ("\\{}$".indexOf(s.charAt(pos + 1)) >= 0) {
+                result.append(s, prev, pos);
+                prev = pos + 1;
+            }
+            pos = s.indexOf('\\', pos + 2);
+        } while (pos > 0);
 
-        return resolvedMessage;
+        if (prev < s.length()) {
+            result.append(s, prev, s.length());
+        }
+        return result.toString();
     }
 
     private boolean hasReplacementTakenPlace(String origMessage, String newMessage) {
@@ -171,16 +198,8 @@ public class DefaultMessageInterpolator
      * @return the resource bundle or <code>null</code> if none is found.
      */
     private ResourceBundle getFileBasedResourceBundle(Locale locale) {
-        ResourceBundle rb;
-        final ClassLoader classLoader = Reflection.getClassLoader(DefaultMessageInterpolator.class);
-        if (classLoader != null) {
-            rb = loadBundle(classLoader, locale, USER_VALIDATION_MESSAGES + " not found by thread local classloader");
-        } else {
-        // 2011-03-27 jw: No privileged action required.
-        // A class can always access the classloader of itself and of subclasses.
-            rb = loadBundle(getClass().getClassLoader(), locale,
-                USER_VALIDATION_MESSAGES + " not found by validator classloader");
-        }
+        final ClassLoader classLoader = Reflection.loaderFromThreadOrClass(DefaultMessageInterpolator.class);
+        ResourceBundle rb = loadBundle(classLoader, locale, USER_VALIDATION_MESSAGES);
         if (LOG_FINEST) {
             if (rb == null) {
                 log.log(Level.FINEST, String.format("%s not found. Delegating to %s", USER_VALIDATION_MESSAGES,
@@ -197,85 +216,81 @@ public class DefaultMessageInterpolator
             return ResourceBundle.getBundle(USER_VALIDATION_MESSAGES, locale, classLoader);
         } catch (final MissingResourceException e) {
             log.fine(message);
+            return null;
         }
-        return null;
     }
 
     private String replaceVariables(String message, ResourceBundle bundle, Locale locale, boolean recurse) {
-        final Matcher matcher = messageParameterPattern.matcher(message);
-        final StringBuffer sb = new StringBuffer(64);
+        final Matcher matcher = MESSAGE_PARAMETER.matcher(message);
+        final StringBuilder sb = new StringBuilder(64);
+        int prev = 0;
         while (matcher.find()) {
-            final String parameter = matcher.group(1);
-            String resolvedParameterValue = resolveParameter(parameter, bundle, locale, recurse);
-            matcher.appendReplacement(sb, sanitizeForAppendReplacement(resolvedParameterValue));
+            int start = matcher.start();
+            if (start > prev) {
+                sb.append(message, prev, start);
+            }
+            sb.append(resolveParameter(matcher.group(1), bundle, locale, recurse).orElseGet(matcher::group));
+            prev = matcher.end();
+        }
+        if (prev < message.length()) {
+            sb.append(message, prev, message.length());
         }
-        matcher.appendTail(sb);
         return sb.toString();
     }
 
     private String replaceAnnotationAttributes(final String message, final Map<String, Object> annotationParameters) {
-        Matcher matcher = messageParameterPattern.matcher(message);
-        StringBuffer sb = new StringBuffer(64);
+        final Matcher matcher = MESSAGE_PARAMETER.matcher(message);
+        final StringBuilder sb = new StringBuilder(64);
+        int prev = 0;
         while (matcher.find()) {
+            int start = matcher.start();
             String resolvedParameterValue;
             String parameter = matcher.group(1);
-            Object variable = annotationParameters.get(removeCurlyBrace(parameter));
-            if (variable != null) {
-                if (variable.getClass().isArray()) {
-                    resolvedParameterValue = Arrays.toString((Object[]) variable);
-                } else {
-                    resolvedParameterValue = variable.toString();
+            Object variable = annotationParameters.get(parameter);
+            if (variable == null) {
+                resolvedParameterValue = matcher.group();
+            } else if (Object[].class.isInstance(variable)) {
+                resolvedParameterValue = Arrays.toString((Object[]) variable);
+            } else if (variable.getClass().isArray()) {
+                try {
+                    resolvedParameterValue = (String) Reflection
+                        .getDeclaredMethod(Arrays.class, "toString", variable.getClass()).invoke(null, variable);
+                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+                    throw new IllegalStateException("Could not expand array " + variable);
                 }
             } else {
-                resolvedParameterValue = parameter;
+                resolvedParameterValue = variable.toString();
             }
-            matcher.appendReplacement(sb, sanitizeForAppendReplacement(resolvedParameterValue));
+            if (start > prev) {
+                sb.append(message, prev, start);
+            }
+            sb.append(resolvedParameterValue);
+            prev = matcher.end();
+        }
+        if (prev < message.length()) {
+            sb.append(message, prev, message.length());
         }
-        matcher.appendTail(sb);
         return sb.toString();
     }
 
-    private String resolveParameter(String parameterName, ResourceBundle bundle, Locale locale, boolean recurse) {
-        String parameterValue;
-        try {
-            if (bundle == null) {
-                parameterValue = parameterName;
-            } else {
-                parameterValue = bundle.getString(removeCurlyBrace(parameterName));
-                if (recurse) {
-                    parameterValue = replaceVariables(parameterValue, bundle, locale, recurse);
-                }
+    private Optional<String> resolveParameter(String parameterName, ResourceBundle bundle, Locale locale,
+        boolean recurse) {
+        return Optional.ofNullable(bundle).map(b -> {
+            try {
+                return b.getString(parameterName);
+            } catch (final MissingResourceException e) {
+                return null;
             }
-        } catch (final MissingResourceException e) {
-            // return parameter itself
-            parameterValue = parameterName;
-        }
-
-        return parameterValue;
-    }
-
-    private String removeCurlyBrace(String parameter) {
-        return parameter.substring(1, parameter.length() - 1);
+        }).map(v -> recurse ? replaceVariables(v, bundle, locale, recurse) : v);
     }
 
     private ResourceBundle findDefaultResourceBundle(Locale locale) {
-        ResourceBundle bundle = defaultBundlesMap.get(locale);
-        if (bundle == null) {
-            bundle = ResourceBundle.getBundle(DEFAULT_VALIDATION_MESSAGES, locale);
-            defaultBundlesMap.put(locale, bundle);
-        }
-        return bundle;
+        return defaultBundlesMap.computeIfAbsent(locale,
+            k -> ResourceBundle.getBundle(DEFAULT_VALIDATION_MESSAGES, locale));
     }
 
     private ResourceBundle findUserResourceBundle(Locale locale) {
-        ResourceBundle bundle = userBundlesMap.get(locale);
-        if (bundle == null) {
-            bundle = getFileBasedResourceBundle(locale);
-            if (bundle != null) {
-                userBundlesMap.put(locale, bundle);
-            }
-        }
-        return bundle;
+        return userBundlesMap.computeIfAbsent(locale, this::getFileBasedResourceBundle);
     }
 
     /**
@@ -285,16 +300,4 @@ public class DefaultMessageInterpolator
     public void setLocale(Locale locale) {
         defaultLocale = locale;
     }
-
-    /**
-     * Escapes the string to comply with
-     * {@link Matcher#appendReplacement(StringBuffer, String)} requirements.
-     *
-     * @param src
-     *            The original string.
-     * @return The sanitized string.
-     */
-    private String sanitizeForAppendReplacement(String src) {
-        return src.replace("\\", "\\\\").replace("$", "\\$");
-    }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ParticipantFactory.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ParticipantFactory.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ParticipantFactory.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/ParticipantFactory.java Fri Jan 25 15:27:43 2019
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.logging.Level;
@@ -55,8 +56,8 @@ class ParticipantFactory implements Clos
 
     ParticipantFactory(ClassLoader... loaders) {
         super();
-        this.loaders = Collections.unmodifiableList(Arrays.asList(Validate
-            .noNullElements(loaders, "null %s specified at index %d", ClassLoader.class.getSimpleName()).clone()));
+        this.loaders = Arrays.asList(loaders).stream().filter(Objects::nonNull).collect(ToUnmodifiable.list());
+        Validate.validState(!this.loaders.isEmpty(), "no classloaders available");
     }
 
     @Override

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/DescriptorManager.java Fri Jan 25 15:27:43 2019
@@ -16,8 +16,10 @@
  */
 package org.apache.bval.jsr.descriptor;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -26,11 +28,13 @@ import javax.validation.metadata.Cascada
 import javax.validation.metadata.ContainerDescriptor;
 import javax.validation.metadata.ElementDescriptor;
 import javax.validation.metadata.ExecutableDescriptor;
+import javax.validation.metadata.MethodType;
 
 import org.apache.bval.jsr.ApacheValidatorFactory;
 import org.apache.bval.jsr.metadata.AnnotationBehaviorMergeStrategy;
 import org.apache.bval.jsr.metadata.CompositeBuilder;
 import org.apache.bval.jsr.metadata.DualBuilder;
+import org.apache.bval.jsr.metadata.EmptyBuilder;
 import org.apache.bval.jsr.metadata.HierarchyBuilder;
 import org.apache.bval.jsr.metadata.MetadataBuilder;
 import org.apache.bval.jsr.metadata.ReflectionBuilder;
@@ -55,6 +59,8 @@ public class DescriptorManager {
 
     private final ApacheValidatorFactory validatorFactory;
     private final ConcurrentMap<Class<?>, BeanD<?>> beanDescriptors = new ConcurrentHashMap<>();
+    // synchronization unnecessary
+    private final Set<Class<?>> knownUnconstrainedTypes = new HashSet<>();
     private final ReflectionBuilder reflectionBuilder;
 
     public DescriptorManager(ApacheValidatorFactory validatorFactory) {
@@ -70,13 +76,22 @@ public class DescriptorManager {
         if (beanDescriptors.containsKey(beanClass)) {
             return beanDescriptors.get(beanClass);
         }
-        final MetadataReader.ForBean<T> reader =
-            new MetadataReader(validatorFactory, beanClass).forBean(builder(beanClass));
-        final BeanD<T> beanD = new BeanD<>(reader);
-        @SuppressWarnings("unchecked")
-        final BeanD<T> result =
-            Optional.ofNullable((BeanD<T>) beanDescriptors.putIfAbsent(beanClass, beanD)).orElse(beanD);
-        return result;
+        final boolean constrained = !knownUnconstrainedTypes.contains(beanClass);
+        final MetadataBuilder.ForBean<T> builder = constrained ? builder(beanClass) : EmptyBuilder.instance().forBean();
+        final BeanD<T> beanD = new BeanD<>(new MetadataReader(validatorFactory, beanClass).forBean(builder));
+
+        if (constrained) {
+            // if not previously known to be unconstrained, check:
+            if (beanD.isBeanConstrained() || !(beanD.getConstrainedConstructors().isEmpty()
+                    && beanD.getConstrainedMethods(MethodType.GETTER, MethodType.NON_GETTER).isEmpty())) {
+                @SuppressWarnings("unchecked")
+                final BeanD<T> result =
+                Optional.ofNullable((BeanD<T>) beanDescriptors.putIfAbsent(beanClass, beanD)).orElse(beanD);
+                return result;
+            }
+        }
+        knownUnconstrainedTypes.add(beanClass);
+        return beanD;
     }
 
     public void clear() {

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java Fri Jan 25 15:27:43 2019
@@ -65,10 +65,10 @@ import org.apache.bval.jsr.metadata.Empt
 import org.apache.bval.jsr.metadata.Meta;
 import org.apache.bval.jsr.metadata.MetadataBuilder;
 import org.apache.bval.jsr.metadata.Signature;
+import org.apache.bval.jsr.util.AnnotationProxyBuilder;
 import org.apache.bval.jsr.util.AnnotationsManager;
 import org.apache.bval.jsr.util.Methods;
 import org.apache.bval.jsr.util.ToUnmodifiable;
-import org.apache.bval.jsr.xml.AnnotationProxyBuilder;
 import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.ObjectUtils;
 import org.apache.bval.util.Validate;
@@ -123,7 +123,8 @@ class MetadataReader {
                 }
             }
             if (mustRewrite) {
-                final AnnotationProxyBuilder<A> builder = new AnnotationProxyBuilder<A>(constraint);
+                final AnnotationProxyBuilder<A> builder =
+                    validatorFactory.getAnnotationsManager().buildProxyFor(constraint);
                 builder.setGroups(groups);
                 return builder.createAnnotation();
             }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Groups.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Groups.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Groups.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Groups.java Fri Jan 25 15:27:43 2019
@@ -81,11 +81,11 @@ public class Groups {
 
     /**
      * Assert that the default group can be expanded to <code>defaultGroups</code>.
+     * Package-private method intended for unit tests.
      * 
      * @param defaultGroups
      */
-    @Deprecated
-    public void assertDefaultGroupSequenceIsExpandable(List<Group> defaultGroups) {
+    void assertDefaultGroupSequenceIsExpandable(List<Group> defaultGroups) {
         Consumer<List<Group>> action = (groupList) -> {
             final int idx = groupList.indexOf(Group.DEFAULT);
             if (idx >= 0) {
@@ -125,4 +125,4 @@ public class Groups {
         components.addAll(sequences);
         return GroupStrategy.composite(components);
     }
-}
\ No newline at end of file
+}

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java Fri Jan 25 15:27:43 2019
@@ -25,11 +25,11 @@ import javax.validation.ClockProvider;
 import javax.validation.ConstraintValidatorContext;
 import javax.validation.ConstraintViolation;
 import javax.validation.ElementKind;
-import javax.validation.MessageInterpolator;
 import javax.validation.ValidationException;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.CrossParameterDescriptor;
 
+import org.apache.bval.jsr.ApacheMessageContext;
 import org.apache.bval.jsr.descriptor.ComposedD;
 import org.apache.bval.jsr.descriptor.ConstraintD;
 import org.apache.bval.jsr.descriptor.CrossParameterD;
@@ -43,7 +43,7 @@ import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.Lazy;
 import org.apache.bval.util.Validate;
 
-public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorContext, MessageInterpolator.Context {
+public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorContext, ApacheMessageContext {
     public class ConstraintViolationBuilderImpl implements ConstraintValidatorContext.ConstraintViolationBuilder {
         private final String template;
         private final PathImpl path;
@@ -201,4 +201,9 @@ public class ConstraintValidatorContextI
     private void addError(String messageTemplate, PathImpl propertyPath) {
         violations.get().add(((ValidationJob) frame.getJob()).createViolation(messageTemplate, this, propertyPath));
     }
+
+    @Override
+    public String getConfigurationProperty(String propertyKey) {
+        return frame.context.getValidatorContext().getFactory().getProperties().get(propertyKey);
+    }
 }

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/MetadataSource.java Fri Jan 25 15:27:43 2019
@@ -22,10 +22,18 @@ import java.util.function.Consumer;
 import javax.validation.ConstraintValidator;
 import javax.validation.spi.ConfigurationState;
 
+import org.apache.bval.jsr.ApacheValidatorFactory;
+
 /**
  * Service interface for user metadata customizations.
  */
 public interface MetadataSource {
+    /**
+     * Initialize the {@link MetadataSource}.
+     * @param validatorFactory
+     */
+    default void initialize(ApacheValidatorFactory validatorFactory) {
+    }
 
     /**
      * Add {@link ConstraintValidator} mappings and/or metadata builders.

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java Fri Jan 25 15:27:43 2019
@@ -45,10 +45,11 @@ import javax.validation.ValidationExcept
 import javax.validation.groups.Default;
 import javax.xml.bind.JAXBElement;
 
+import org.apache.bval.jsr.ApacheValidatorFactory;
 import org.apache.bval.jsr.ConstraintAnnotationAttributes;
 import org.apache.bval.jsr.groups.GroupConversion;
+import org.apache.bval.jsr.util.AnnotationProxyBuilder;
 import org.apache.bval.jsr.util.ToUnmodifiable;
-import org.apache.bval.jsr.xml.AnnotationProxyBuilder;
 import org.apache.bval.jsr.xml.AnnotationType;
 import org.apache.bval.jsr.xml.BeanType;
 import org.apache.bval.jsr.xml.ClassType;
@@ -475,13 +476,14 @@ public class XmlBuilder {
         return lazy.get();
     }
 
+    private final ApacheValidatorFactory validatorFactory;
     private final ConstraintMappingsType constraintMappings;
     private final Version version;
 
-    public XmlBuilder(ConstraintMappingsType constraintMappings) {
+    public XmlBuilder(ApacheValidatorFactory validatorFactory, ConstraintMappingsType constraintMappings) {
         super();
-        this.constraintMappings = constraintMappings;
-        Validate.notNull(constraintMappings, "constraintMappings");
+        this.validatorFactory = Validate.notNull(validatorFactory, "validatorFactory");
+        this.constraintMappings = Validate.notNull(constraintMappings, "constraintMappings");
         this.version = Version.of(constraintMappings);
         new MappingValidator(constraintMappings, this::resolveClass).validateMappings();
     }
@@ -519,7 +521,7 @@ public class XmlBuilder {
 
     @SuppressWarnings("unchecked")
     private <T> Class<T> loadClass(final String fqn) {
-        ClassLoader loader = Reflection.getClassLoader(XmlBuilder.class);
+        ClassLoader loader = Reflection.loaderFromThreadOrClass(XmlBuilder.class);
         if (loader == null) {
             loader = getClass().getClassLoader();
         }
@@ -544,7 +546,8 @@ public class XmlBuilder {
 
     private <A extends Annotation, T> A createConstraint(final ConstraintType constraint, ConstraintTarget target) {
         final Class<A> annotationClass = this.<A> loadClass(toQualifiedClassName(constraint.getAnnotation()));
-        final AnnotationProxyBuilder<A> annoBuilder = new AnnotationProxyBuilder<A>(annotationClass);
+        final AnnotationProxyBuilder<A> annoBuilder =
+            validatorFactory.getAnnotationsManager().buildProxyFor(annotationClass);
 
         if (constraint.getMessage() != null) {
             annoBuilder.setMessage(constraint.getMessage());
@@ -676,7 +679,8 @@ public class XmlBuilder {
     }
 
     private <A extends Annotation> Annotation createAnnotation(AnnotationType annotationType, Class<A> returnType) {
-        final AnnotationProxyBuilder<A> metaAnnotation = new AnnotationProxyBuilder<>(returnType);
+        final AnnotationProxyBuilder<A> metaAnnotation =
+            validatorFactory.getAnnotationsManager().buildProxyFor(returnType);
         for (ElementType elementType : annotationType.getElement()) {
             final String name = elementType.getName();
             metaAnnotation.setValue(name, getElementValue(elementType, getAnnotationParameterType(returnType, name)));

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java Fri Jan 25 15:27:43 2019
@@ -72,7 +72,7 @@ public class DefaultTraversableResolver
     /** Tries to load detect and load JPA. */
     @SuppressWarnings("unchecked")
     private void initJpa() {
-        final ClassLoader classLoader = Reflection.getClassLoader(DefaultTraversableResolver.class);
+        final ClassLoader classLoader = Reflection.loaderFromClassOrThread(DefaultTraversableResolver.class);
         try {
             Reflection.toClass(PERSISTENCE_UTIL_CLASSNAME, classLoader);
             if (LOG_FINEST) {

Copied: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxy.java (from r1852141, tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java)
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxy.java?p2=tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxy.java&p1=tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java&r1=1852141&r2=1852142&rev=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxy.java Fri Jan 25 15:27:43 2019
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.bval.jsr.xml;
+package org.apache.bval.jsr.util;
 
 import java.io.Serializable;
 import java.lang.annotation.Annotation;

Copied: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxyBuilder.java (from r1852141, tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java)
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxyBuilder.java?p2=tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxyBuilder.java&p1=tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java&r1=1852141&r2=1852142&rev=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxyBuilder.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationProxyBuilder.java Fri Jan 25 15:27:43 2019
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.bval.jsr.xml;
+package org.apache.bval.jsr.util;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
@@ -24,8 +24,6 @@ import java.lang.reflect.Proxy;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 import javax.enterprise.util.AnnotationLiteral;
 import javax.validation.ConstraintTarget;
@@ -36,7 +34,7 @@ import javax.validation.groups.ConvertGr
 
 import org.apache.bval.cdi.EmptyAnnotationLiteral;
 import org.apache.bval.jsr.ConstraintAnnotationAttributes;
-import org.apache.bval.jsr.util.AnnotationsManager;
+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;
@@ -48,17 +46,6 @@ import org.apache.commons.weaver.privili
  */
 @Privilizing(@CallTo(Reflection.class))
 public final class AnnotationProxyBuilder<A extends Annotation> {
-    private static final ConcurrentMap<Class<?>, Method[]> METHODS_CACHE = new ConcurrentHashMap<>();
-
-    public static <A> Method[] findMethods(final Class<A> annotationType) {
-        // cache only built-in constraints to avoid memory leaks:
-        // TODO use configurable cache size property?
-        if (annotationType.getName().startsWith("javax.validation.constraints.")) {
-            return METHODS_CACHE.computeIfAbsent(annotationType, Reflection::getDeclaredMethods);
-        }
-        return Reflection.getDeclaredMethods(annotationType);
-    }
-
     private final Class<A> type;
     private final Map<String, Object> elements = new HashMap<>();
     private final Method[] methods;
@@ -68,21 +55,11 @@ public final class AnnotationProxyBuilde
      * Create a new AnnotationProxyBuilder instance.
      *
      * @param annotationType
+     * @param cache
      */
-    public AnnotationProxyBuilder(final Class<A> annotationType) {
-        this.type = annotationType;
-        this.methods = findMethods(annotationType);
-    }
-
-    /**
-     * Create a new AnnotationProxyBuilder instance.
-     *
-     * @param annotationType
-     * @param elements
-     */
-    public AnnotationProxyBuilder(Class<A> annotationType, Map<String, Object> elements) {
-        this(annotationType);
-        elements.forEach(this.elements::put);
+    AnnotationProxyBuilder(final Class<A> annotationType, Map<Class<?>, Method[]> cache) {
+        this.type = Validate.notNull(annotationType, "annotationType");
+        this.methods = Validate.notNull(cache, "cache").computeIfAbsent(annotationType, Reflection::getDeclaredMethods);
     }
 
     /**
@@ -91,10 +68,11 @@ public final class AnnotationProxyBuilde
      * 
      * @param annot
      *            Annotation to be replicated.
+     * @param cache
      */
     @SuppressWarnings("unchecked")
-    public AnnotationProxyBuilder(A annot) {
-        this((Class<A>) annot.annotationType());
+    AnnotationProxyBuilder(A annot, Map<Class<?>, Method[]> cache) {
+        this((Class<A>) annot.annotationType(), cache);
         elements.putAll(AnnotationsManager.readAttributes(annot));
     }
 
@@ -107,17 +85,6 @@ public final class AnnotationProxyBuilde
      *
      * @param elementName
      * @param value
-     */
-    @Deprecated
-    public Object putValue(String elementName, Object value) {
-        return elements.put(elementName, value);
-    }
-
-    /**
-     * Add an element to the configuration.
-     *
-     * @param elementName
-     * @param value
      * @return whether any change occurred
      */
     public boolean setValue(String elementName, Object value) {
@@ -214,7 +181,7 @@ public final class AnnotationProxyBuilde
      * @return {@link Annotation}
      */
     public A createAnnotation() {
-        final ClassLoader classLoader = Reflection.getClassLoader(getType());
+        final ClassLoader classLoader = Reflection.loaderFromClassOrThread(getType());
         @SuppressWarnings("unchecked")
         final Class<A> proxyClass = (Class<A>) Proxy.getProxyClass(classLoader, getType());
         return doCreateAnnotation(proxyClass, new AnnotationProxy(this));

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java Fri Jan 25 15:27:43 2019
@@ -56,7 +56,6 @@ import org.apache.bval.jsr.ConstraintAnn
 import org.apache.bval.jsr.ConstraintAnnotationAttributes.Worker;
 import org.apache.bval.jsr.ConstraintCached.ConstraintValidatorInfo;
 import org.apache.bval.jsr.metadata.Meta;
-import org.apache.bval.jsr.xml.AnnotationProxyBuilder;
 import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.Lazy;
 import org.apache.bval.util.ObjectUtils;
@@ -107,8 +106,8 @@ public class AnnotationsManager {
         }
     }
 
-    private static class Composition {
-        static <A extends Annotation> Optional<ConstraintAnnotationAttributes.Worker<A>> validWorker(
+    private class Composition {
+        <A extends Annotation> Optional<ConstraintAnnotationAttributes.Worker<A>> validWorker(
             ConstraintAnnotationAttributes attr, Class<A> type) {
             return Optional.of(type).map(attr::analyze).filter(Worker::isValid);
         }
@@ -179,7 +178,7 @@ public class AnnotationsManager {
                 final int index =
                     constraintCounts.computeIfAbsent(c.annotationType(), k -> new AtomicInteger()).getAndIncrement();
 
-                final AnnotationProxyBuilder<Annotation> proxyBuilder = new AnnotationProxyBuilder<>(c);
+                final AnnotationProxyBuilder<Annotation> proxyBuilder = buildProxyFor(c);
 
                 proxyBuilder.setGroups(groups);
                 proxyBuilder.setPayload(payload);
@@ -281,7 +280,6 @@ public class AnnotationsManager {
         }
         return constraints.toArray(Annotation[]::new);
     }
-    
 
     private static Optional<AnnotatedElement> substitute(AnnotatedElement e) {
         if (e instanceof Parameter) {
@@ -310,19 +308,23 @@ public class AnnotationsManager {
 
     private final ApacheValidatorFactory validatorFactory;
     private final LRUCache<Class<? extends Annotation>, Composition> compositions;
+    private final LRUCache<Class<? extends Annotation>, Method[]> constraintAttributes;
 
     public AnnotationsManager(ApacheValidatorFactory validatorFactory) {
         super();
         this.validatorFactory = Validate.notNull(validatorFactory);
         final String cacheSize =
             validatorFactory.getProperties().get(ConfigurationImpl.Properties.CONSTRAINTS_CACHE_SIZE);
+        final int sz;
         try {
-            compositions = new LRUCache<>(Integer.parseInt(cacheSize));
+            sz = Integer.parseInt(cacheSize);
         } catch (NumberFormatException e) {
             throw Exceptions.create(IllegalStateException::new, e,
                 "Cannot parse value %s for configuration property %s", cacheSize,
                 ConfigurationImpl.Properties.CONSTRAINTS_CACHE_SIZE);
         }
+        compositions = new LRUCache<>(sz);
+        constraintAttributes = new LRUCache<>(sz);
     }
 
     public void validateConstraintDefinition(Class<? extends Annotation> type) {
@@ -414,6 +416,16 @@ public class AnnotationsManager {
             .collect(Collectors.toCollection(() -> EnumSet.noneOf(ValidationTarget.class)));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public <A extends Annotation> AnnotationProxyBuilder<A> buildProxyFor(Class<A> type) {
+        return new AnnotationProxyBuilder<>(type, (Map) constraintAttributes);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public <A extends Annotation> AnnotationProxyBuilder<A> buildProxyFor(A instance) {
+        return new AnnotationProxyBuilder<>(instance, (Map) constraintAttributes);
+    }
+
     private Composition getComposition(Class<? extends Annotation> annotationType) {
         return compositions.computeIfAbsent(annotationType, ct -> {
             final Set<ValidationTarget> composedTargets = supportedTargets(annotationType);

Added: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/LookBehindRegexHolder.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/LookBehindRegexHolder.java?rev=1852142&view=auto
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/LookBehindRegexHolder.java (added)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/util/LookBehindRegexHolder.java Fri Jan 25 15:27:43 2019
@@ -0,0 +1,117 @@
+/*
+ * 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 java.util.function.IntUnaryOperator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.bval.util.Validate;
+
+/**
+ * Utility class to manage regular expressions that require simulated infinite
+ * lookbehind, e.g. to determine whether a sequence of escape characters is
+ * complete unto itself.
+ */
+public class LookBehindRegexHolder {
+    public static final int DEFAULT_INITIAL_MAXIMUM_LENGTH = 256;
+    public static final int DEFAULT_EXPANSION_BLOCK_SIZE = 128;
+
+    private final String regex;
+    private final int expansionBlockSize;
+    private final IntUnaryOperator computeInjectedRepetition;
+
+    private volatile int maximumLength;
+    private Pattern pattern;
+
+    /**
+     * Create a new {@link LookBehindRegexHolder} instance with the default
+     * initial maximum length and expansion block size.
+     * 
+     * @param regex
+     *            assumed to contain a {@code %d} Java format sequence
+     * @param computeInjectedRepetition
+     *            function to compute the injected number of repetitions to
+     *            inject at {@code %d} in {@code regex}
+     */
+    public LookBehindRegexHolder(String regex, IntUnaryOperator computeInjectedRepetition) {
+        this(regex, DEFAULT_INITIAL_MAXIMUM_LENGTH, DEFAULT_EXPANSION_BLOCK_SIZE, computeInjectedRepetition);
+    }
+
+    /**
+     * Create a new {@link LookBehindRegexHolder} instance.
+     * 
+     * @param regex
+     *            assumed to contain a {@code %d} Java format sequence
+     * @param initialMaximumLength
+     *            initial guess
+     * @param expansionBlockSize
+     *            number of bytes by which to increase the maximum length when a
+     *            {@link Matcher} is requested for a larger message size
+     * @param computeInjectedRepetition
+     *            function to compute the injected number of repetitions to
+     *            inject at {@code %d} in {@code regex}
+     */
+    public LookBehindRegexHolder(String regex, int initialMaximumLength, int expansionBlockSize,
+        IntUnaryOperator computeInjectedRepetition) {
+        super();
+        Validate.isTrue(regex != null && !regex.trim().isEmpty(), "empty regex");
+        Validate.isTrue(initialMaximumLength > 0, "invalid initial maximum length %d", initialMaximumLength);
+        Validate.isTrue(expansionBlockSize > 0, "Invalid expansion block size %d", expansionBlockSize);
+        Validate.notNull(computeInjectedRepetition, "missing %s to compute injected repetition",
+            IntUnaryOperator.class.getSimpleName());
+        this.regex = regex;
+        this.expansionBlockSize = expansionBlockSize;
+        this.computeInjectedRepetition = computeInjectedRepetition;
+        accommodate(initialMaximumLength);
+    }
+
+    /**
+     * Get a {@link Matcher} against the specified {@link CharSequence}.
+     * 
+     * @param s
+     * @return {@link Matcher}
+     */
+    public Matcher matcher(CharSequence s) {
+        if (s.length() > maximumLength) {
+            accommodate(s.length());
+        }
+        return pattern.matcher(s);
+    }
+
+    int getMaximumLength() {
+        return this.maximumLength;
+    }
+
+    String getPattern() {
+        return pattern.pattern();
+    }
+
+    private synchronized void accommodate(int maximumLength) {
+        if (this.maximumLength < maximumLength) {
+            if (this.maximumLength == 0) {
+                this.maximumLength = maximumLength;
+            } else {
+                int difference = maximumLength - this.maximumLength;
+                int addBlocks = difference / expansionBlockSize + 1;
+                this.maximumLength += addBlocks * expansionBlockSize;
+            }
+            this.pattern =
+                Pattern.compile(String.format(regex, computeInjectedRepetition.applyAsInt(this.maximumLength)));
+        }
+    }
+}

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/SchemaManager.java Fri Jan 25 15:27:43 2019
@@ -229,7 +229,7 @@ public class SchemaManager {
     }
 
     static Schema loadSchema(String resource) {
-        final URL schemaUrl = Reflection.getClassLoader(XmlUtils.class).getResource(resource);
+        final URL schemaUrl = Reflection.loaderFromClassOrThread(SchemaManager.class).getResource(resource);
         try {
             return SCHEMA_FACTORY.newSchema(schemaUrl);
         } catch (SAXException e) {

Modified: tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
URL: http://svn.apache.org/viewvc/tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java?rev=1852142&r1=1852141&r2=1852142&view=diff
==============================================================================
--- tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java (original)
+++ tomee/deps/branches/bval-2/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java Fri Jan 25 15:27:43 2019
@@ -30,8 +30,10 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 import javax.validation.ValidationException;
+import javax.validation.ValidatorFactory;
 import javax.validation.spi.ConfigurationState;
 
+import org.apache.bval.jsr.ApacheValidatorFactory;
 import org.apache.bval.jsr.metadata.MetadataBuilder;
 import org.apache.bval.jsr.metadata.MetadataBuilder.ForBean;
 import org.apache.bval.jsr.metadata.MetadataSource;
@@ -39,6 +41,7 @@ import org.apache.bval.jsr.metadata.Vali
 import org.apache.bval.jsr.metadata.XmlBuilder;
 import org.apache.bval.jsr.metadata.XmlValidationMappingProvider;
 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.Privilizing;
 import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
@@ -58,9 +61,18 @@ public class ValidationMappingParser imp
             "META-INF/validation-mapping-2.0.xsd")
         .build();
 
+    private ApacheValidatorFactory validatorFactory;
+
+    @Override
+    public void initialize(ApacheValidatorFactory validatorFactory) {
+        this.validatorFactory = Validate.notNull(validatorFactory);
+    }
+
     @Override
     public void process(ConfigurationState configurationState,
         Consumer<ValidatorMappingProvider> addValidatorMappingProvider, BiConsumer<Class<?>, ForBean<?>> addBuilder) {
+        Validate.validState(validatorFactory != null, "validatorFactory unknown");
+
         if (configurationState.isIgnoreXmlConfiguration()) {
             return;
         }
@@ -70,7 +82,8 @@ public class ValidationMappingParser imp
 
             Optional.of(mapping).map(this::toMappingProvider).ifPresent(addValidatorMappingProvider);
 
-            final Map<Class<?>, MetadataBuilder.ForBean<?>> builders = new XmlBuilder(mapping).forBeans();
+            final Map<Class<?>, MetadataBuilder.ForBean<?>> builders =
+                new XmlBuilder(validatorFactory, mapping).forBeans();
             if (Collections.disjoint(beanTypes, builders.keySet())) {
                 builders.forEach(addBuilder::accept);
                 beanTypes.addAll(builders.keySet());
@@ -127,7 +140,12 @@ public class ValidationMappingParser imp
     }
 
     private Class<?> loadClass(String className, String defaultPackage) {
-        return loadClass(toQualifiedClassName(className, defaultPackage));
+        final String fqn = toQualifiedClassName(className, defaultPackage);
+        try {
+            return Reflection.toClass(fqn, Reflection.loaderFromThreadOrClass(ValidationMappingParser.class));
+        } catch (ClassNotFoundException ex) {
+            throw Exceptions.create(ValidationException::new, ex, "Unable to load class: %s", fqn);
+        }
     }
 
     private String toQualifiedClassName(String className, String defaultPackage) {
@@ -144,16 +162,4 @@ public class ValidationMappingParser imp
     private boolean isQualifiedClass(String clazz) {
         return clazz.indexOf('.') >= 0;
     }
-
-    private Class<?> loadClass(final String className) {
-        ClassLoader loader = Reflection.getClassLoader(ValidationMappingParser.class);
-        if (loader == null) {
-            loader = getClass().getClassLoader();
-        }
-        try {
-            return Reflection.toClass(className, loader);
-        } catch (ClassNotFoundException ex) {
-            throw Exceptions.create(ValidationException::new, ex, "Unable to load class: %s", className);
-        }
-    }
 }