You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by st...@apache.org on 2016/10/24 21:02:02 UTC

svn commit: r1766445 [1/3] - in /bval/trunk: ./ bundle/ bval-core/ bval-core/src/main/java/org/apache/bval/ bval-core/src/main/java/org/apache/bval/model/ bval-core/src/main/java/org/apache/bval/util/ bval-core/src/main/java/org/apache/bval/util/reflec...

Author: struberg
Date: Mon Oct 24 21:02:02 2016
New Revision: 1766445

URL: http://svn.apache.org/viewvc?rev=1766445&view=rev
Log:
BVAL-151 trim down external dependencies

Added:
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java   (with props)
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java   (with props)
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java   (with props)
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/TypeUtils.java   (with props)
    bval/trunk/bval-core/src/test/java/org/apache/bval/util/
    bval/trunk/bval-core/src/test/java/org/apache/bval/util/StringUtilsTest.java   (with props)
Modified:
    bval/trunk/bundle/pom.xml
    bval/trunk/bval-core/pom.xml
    bval/trunk/bval-core/src/main/java/org/apache/bval/MetaBeanBuilder.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/model/DynaTypeEnum.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/model/FeaturesCapable.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaAnnotated.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaBean.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/IndexedAccess.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/KeyedAccess.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/PropertyAccess.java
    bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
    bval/trunk/bval-jsr/pom.xml
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/AnnotationConstraintBuilder.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/AnnotationProcessor.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidationProvider.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ApacheValidatorFactory.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/BeanDescriptorImpl.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ClassValidator.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDefaults.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintDescriptorImpl.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintValidation.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/DefaultMessageInterpolator.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/groups/Group.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/resolver/DefaultTraversableResolver.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/util/PathNavigation.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/util/ValidationContextTraversal.java
    bval/trunk/bval-jsr/src/main/java/org/apache/bval/jsr/xml/ValidationMappingParser.java
    bval/trunk/bval-jsr/src/test/java/org/apache/bval/constraints/HasStringValidator.java
    bval/trunk/bval-tck11/work-tests-suite.xml
    bval/trunk/bval-xstream/src/main/java/org/apache/bval/xml/XMLMetaBeanInfos.java
    bval/trunk/bval-xstream/src/main/java/org/apache/bval/xml/XMLMetaElement.java
    bval/trunk/pom.xml

Modified: bval/trunk/bundle/pom.xml
URL: http://svn.apache.org/viewvc/bval/trunk/bundle/pom.xml?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bundle/pom.xml (original)
+++ bval/trunk/bundle/pom.xml Mon Oct 24 21:02:02 2016
@@ -74,7 +74,7 @@
                         <Private-Package />
                         <Export-Package>org.apache.bval.*</Export-Package>
                         <Import-Package>
-                            org.apache.commons.lang3.*;resolution:=optional,javax.annotation.*;resolution:=optional,javax.interceptor.*;resolution:=optional,
+                            javax.annotation.*;resolution:=optional,javax.interceptor.*;resolution:=optional,
                             javax.inject.*;resolution:=optional,javax.enterprise.*;resolution:=optional,javax.persistence.*;resolution:=optional,
                             org.apache.bval.xml.*;resolution:=optional,javax.validation.*;resolution:=optional,
                             !org.apache.commons.weaver.*,

Modified: bval/trunk/bval-core/pom.xml
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/pom.xml?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/pom.xml (original)
+++ bval/trunk/bval-core/pom.xml Mon Oct 24 21:02:02 2016
@@ -127,81 +127,44 @@ build.timestamp=${timestamp}
                 </executions>
             </plugin>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <configuration>
-                    <artifactSet>
-                        <includes>
-                            <include>org.apache.commons:commons-lang3</include>
-                            <include>org.apache.commons:commons-lang3</include>
-                        </includes>
-                    </artifactSet>
-                    <filters>
-                        <filter>
-                            <artifact>org.apache.commons:commons-lang3</artifact>
-                            <excludes>
-                                <exclude>META-INF/maven/**</exclude>
-                            </excludes>
-                        </filter>
-                    </filters>
-                    <relocations>
-                        <relocation>
-                            <pattern>org.apache.commons</pattern>
-                            <shadedPattern>org.apache.bval.core._oac</shadedPattern>
-                        </relocation>
-                    </relocations>
-                    <minimizeJar>true</minimizeJar>
-                    <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-                    <createSourcesJar>true</createSourcesJar>
-                    <shadeSourcesContent>true</shadeSourcesContent>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-            	<groupId>org.apache.commons</groupId>
-            	<artifactId>commons-weaver-maven-plugin</artifactId>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-weaver-maven-plugin</artifactId>
             </plugin>
         </plugins>
         <pluginManagement>
-        	<plugins>
-        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-        		<plugin>
-        			<groupId>org.eclipse.m2e</groupId>
-        			<artifactId>lifecycle-mapping</artifactId>
-        			<version>1.0.0</version>
-        			<configuration>
-        				<lifecycleMappingMetadata>
-        					<pluginExecutions>
-        						<pluginExecution>
-        							<pluginExecutionFilter>
-        								<groupId>
-        									org.apache.maven.plugins
-        								</groupId>
-        								<artifactId>
-        									maven-antrun-plugin
-        								</artifactId>
-        								<versionRange>
-        									[1.3,)
-        								</versionRange>
-        								<goals>
-        									<goal>run</goal>
-        								</goals>
-        							</pluginExecutionFilter>
-        							<action>
-        								<ignore />
-        							</action>
-        						</pluginExecution>
-        					</pluginExecutions>
-        				</lifecycleMappingMetadata>
-        			</configuration>
-        		</plugin>
-        	</plugins>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            org.apache.maven.plugins
+                                        </groupId>
+                                        <artifactId>
+                                            maven-antrun-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [1.3,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>run</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
         </pluginManagement>
     </build>
 </project>

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/MetaBeanBuilder.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/MetaBeanBuilder.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/MetaBeanBuilder.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/MetaBeanBuilder.java Mon Oct 24 21:02:02 2016
@@ -17,8 +17,7 @@
 package org.apache.bval;
 
 import org.apache.bval.model.MetaBean;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.ClassUtils;
+import org.apache.bval.util.reflection.Reflection;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -61,7 +60,7 @@ public class MetaBeanBuilder {
      * @return {@link MetaBeanFactory} array
      */
     public MetaBeanFactory[] getFactories() {
-        return ArrayUtils.clone(factories);
+        return factories != null ? factories.clone() : null;
     }
 
     /**
@@ -71,7 +70,7 @@ public class MetaBeanBuilder {
      * @param factories
      */
     public void setFactories(MetaBeanFactory[] factories) {
-        this.factories = ArrayUtils.clone(factories);
+        this.factories = factories != null ? factories.clone() : null;
     }
 
     /**
@@ -105,9 +104,9 @@ public class MetaBeanBuilder {
     protected Class<?> findLocalClass(String className) {
         if (className != null) {
             try {
-                return ClassUtils.getClass(className);
+                return Reflection.toClass(className);
             } catch (ClassNotFoundException e) {
-            	log.log(Level.FINE, String.format("Class not found: %s", className), e);
+                log.log(Level.FINE, String.format("Class not found: %s", className), e);
             }
         }
         return null;

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/model/DynaTypeEnum.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/model/DynaTypeEnum.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/model/DynaTypeEnum.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/model/DynaTypeEnum.java Mon Oct 24 21:02:02 2016
@@ -16,7 +16,6 @@
  */
 package org.apache.bval.model;
 
-import org.apache.commons.lang3.ArrayUtils;
 
 /**
  * Description: ("artificial" enum with custom values).<br/>
@@ -85,7 +84,7 @@ public class DynaTypeEnum implements Dyn
      * @return Value[]
      */
     public Value[] getEnumConstants() {
-        return ArrayUtils.clone(enumConstants);
+        return enumConstants != null ? enumConstants.clone() : null;
     }
 
     /**

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/model/FeaturesCapable.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/model/FeaturesCapable.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/model/FeaturesCapable.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/model/FeaturesCapable.java Mon Oct 24 21:02:02 2016
@@ -16,8 +16,6 @@
  */
 package org.apache.bval.model;
 
-import org.apache.commons.lang3.ArrayUtils;
-
 import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -122,7 +120,7 @@ public abstract class FeaturesCapable im
     protected void copyInto(FeaturesCapable target) {
         target.features = target.createFeaturesMap();
         target.features.putAll(features);
-        target.validations = ArrayUtils.clone(validations);
+        target.validations = validations != null ? validations.clone() : null;
     }
 
     /**
@@ -131,7 +129,7 @@ public abstract class FeaturesCapable im
      * @return Validation array
      */
     public Validation[] getValidations() {
-        return ArrayUtils.clone(validations);
+        return validations != null ? validations.clone() : null;
     }
 
     /**
@@ -140,7 +138,7 @@ public abstract class FeaturesCapable im
      * @param validations
      */
     public void setValidations(Validation[] validations) {
-        this.validations = ArrayUtils.clone(validations);
+        this.validations = validations != null ? validations.clone() : null;
     }
 
     /**

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaAnnotated.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaAnnotated.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaAnnotated.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaAnnotated.java Mon Oct 24 21:02:02 2016
@@ -17,20 +17,28 @@
 package org.apache.bval.model;
 
 import java.lang.annotation.Annotation;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.bval.util.ObjectUtils;
 
-import org.apache.commons.lang3.ArrayUtils;
 
 public abstract class MetaAnnotated extends Meta {
     private static final long serialVersionUID = 1L;
 
-    private Annotation[] annotations = new Annotation[0];
+    private Set<Annotation> annotations = new HashSet<Annotation>();
+    private Annotation[] annArray = null;
 
     public Annotation[] getAnnotations() {
-        return annotations;
+        if (annArray == null) {
+            annArray = annotations.isEmpty() ? ObjectUtils.EMPTY_ANNOTATION_ARRAY : annotations.toArray(new Annotation[annotations.size()]);
+        }
+        return annArray;
     }
 
     public void addAnnotation(final Annotation annotation) {
-        this.annotations = ArrayUtils.add(annotations, annotation);
+        this.annotations.add(annotation);
+        annArray = null;
     }
 
 }

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaBean.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaBean.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaBean.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaBean.java Mon Oct 24 21:02:02 2016
@@ -27,7 +27,6 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.bval.util.reflection.Reflection;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.weaver.privilizer.Privilizing;
 import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
 
@@ -287,7 +286,7 @@ public class MetaBean extends FeaturesCa
                 }
                 for (final Method m : clazz.getDeclaredMethods()) {
                     final String name = getPropertyName(m);
-                    if (StringUtils.isNotEmpty(name)) {
+                    if (name != null && !name.isEmpty()) {
                         if (!fields.containsKey(name)) {
                             fields.put(name, Integer.valueOf(++i));
                         }
@@ -320,7 +319,8 @@ public class MetaBean extends FeaturesCa
                 if (i2 == null) {
                     // java.util.TreeMap requires that the comparator be consistent with #equals(),
                     // therefore we must not incorrectly report 0 comparison for different property names
-                    return StringUtils.compare(o1, o2);
+                    // Both o1 and o2 cannot be null as they would have blown up with a NPE in fields.get already
+                    return o1.compareTo(o2);
                 }
                 return -1;
             }

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java Mon Oct 24 21:02:02 2016
@@ -16,10 +16,10 @@
  */
 package org.apache.bval.model;
 
-import org.apache.commons.lang3.reflect.TypeUtils;
-
 import java.lang.reflect.Type;
 
+import org.apache.bval.util.reflection.TypeUtils;
+
 /**
  * Description: the meta description of a property of a bean. It supports a map
  * of features and multiple validations.<br/>

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/util/BValVersion.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/BValVersion.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/BValVersion.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/BValVersion.java Mon Oct 24 21:02:02 2016
@@ -24,7 +24,6 @@ import java.util.Properties;
 import java.util.StringTokenizer;
 
 import org.apache.bval.util.reflection.Reflection;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.weaver.privilizer.Privilizing;
 import org.apache.commons.weaver.privilizer.Privilizing.CallTo;
 

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/util/IndexedAccess.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/IndexedAccess.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/IndexedAccess.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/IndexedAccess.java Mon Oct 24 21:02:02 2016
@@ -16,8 +16,6 @@
  */
 package org.apache.bval.util;
 
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.reflect.TypeUtils;
 
 import java.lang.annotation.ElementType;
 import java.lang.reflect.Array;
@@ -26,6 +24,8 @@ import java.lang.reflect.TypeVariable;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.bval.util.reflection.TypeUtils;
+
 /**
  * {@link AccessStrategy} to get an indexed member of an {@link Iterable} or
  * array object.
@@ -46,7 +46,8 @@ public class IndexedAccess extends Acces
         }
         if (TypeUtils.isAssignable(containerType, Iterable.class)) {
             Map<TypeVariable<?>, Type> typeArguments = TypeUtils.getTypeArguments(containerType, Iterable.class);
-            return ObjectUtils.defaultIfNull(TypeUtils.unrollVariables(typeArguments, ITERABLE_TYPE), Object.class);
+            Type type = TypeUtils.unrollVariables(typeArguments, ITERABLE_TYPE);
+            return type != null ? type : Object.class;
         }
         return null;
     }

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/util/KeyedAccess.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/KeyedAccess.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/KeyedAccess.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/KeyedAccess.java Mon Oct 24 21:02:02 2016
@@ -16,8 +16,7 @@
  */
 package org.apache.bval.util;
 
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.reflect.TypeUtils;
+import org.apache.bval.util.reflection.TypeUtils;
 
 import java.lang.annotation.ElementType;
 import java.lang.reflect.Type;

Added: bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java?rev=1766445&view=auto
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java (added)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java Mon Oct 24 21:02:02 2016
@@ -0,0 +1,96 @@
+/*
+ * 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.util;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Array;
+
+public final class ObjectUtils {
+    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
+    public static final String[] EMPTY_STRING_ARRAY = new String[0];
+    public static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
+
+    private ObjectUtils() {
+    }
+
+    /**
+     * <p>Returns a default value if the object passed is {@code null}.</p>
+     *
+     * <pre>
+     * ObjectUtils.defaultIfNull(null, null)      = null
+     * ObjectUtils.defaultIfNull(null, "")        = ""
+     * ObjectUtils.defaultIfNull(null, "zz")      = "zz"
+     * ObjectUtils.defaultIfNull("abc", *)        = "abc"
+     * ObjectUtils.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
+     * </pre>
+     *
+     * @param <T> the type of the object
+     * @param object  the {@code Object} to test, may be {@code null}
+     * @param defaultValue  the default value to return, may be {@code null}
+     * @return {@code object} if it is not {@code null}, defaultValue otherwise
+     */
+    public static <T> T defaultIfNull(final T object, final T defaultValue) {
+        return object != null ? object : defaultValue;
+    }
+
+    public static <T> boolean isNotEmpty(final T[] array) {
+        return !isEmpty(array);
+    }
+
+    public static boolean isEmpty(final Object[] array) {
+        return array == null || array.length == 0;
+    }
+
+    /**
+     * <p>Checks if the object is in the given array.
+     *
+     * <p>The method returns {@code false} if a {@code null} array is passed in.
+     *
+     * @param array  the array to search through
+     * @param objectToFind  the object to find
+     * @return {@code true} if the array contains the object
+     */
+    public static boolean arrayContains(final Object[] array, final Object objectToFind) {
+        if (array == null) {
+            return false;
+        }
+        for (Object o : array) {
+            if (o.equals(objectToFind)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static <T> T[] arrayAdd(T[] array, T objectToAdd) {
+        Class<?> type;
+        if (array != null) {
+            type = array.getClass().getComponentType();
+        } else if (objectToAdd != null) {
+            type = objectToAdd.getClass();
+        } else {
+            throw new IllegalArgumentException("Arguments cannot both be null");
+        }
+        final int arrayLength = Array.getLength(array);
+        T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
+        System.arraycopy(array, 0, newArray, 0, arrayLength);
+        newArray[newArray.length - 1] = objectToAdd;
+
+        return newArray;
+
+    }
+}

Propchange: bval/trunk/bval-core/src/main/java/org/apache/bval/util/ObjectUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/util/PropertyAccess.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/PropertyAccess.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/PropertyAccess.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/PropertyAccess.java Mon Oct 24 21:02:02 2016
@@ -59,7 +59,7 @@ public class PropertyAccess extends Acce
         final ClassLoader cl = Reflection.getClassLoader(PropertyAccess.class);
         boolean useBeanUtils;
         try {
-            Reflection.getClass(cl, BEANUTILS);
+            Reflection.toClass(BEANUTILS, cl);
             useBeanUtils = true;
         } catch (Exception e) {
             useBeanUtils = false;
@@ -68,7 +68,7 @@ public class PropertyAccess extends Acce
         if (useBeanUtils) {
             try {
                 final Class<?> beanUtilsPropertyAccess =
-                    Reflection.getClass(cl, BEANUTILS_PROPERTY_ACCESS);
+                    Reflection.toClass(BEANUTILS_PROPERTY_ACCESS, cl);
 
                 ctor = Reflection.getDeclaredConstructor(
                     beanUtilsPropertyAccess.asSubclass(PropertyAccess.class),

Added: bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java?rev=1766445&view=auto
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java (added)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java Mon Oct 24 21:02:02 2016
@@ -0,0 +1,177 @@
+/*
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+public final class StringUtils {
+    private StringUtils() {
+    }
+
+    /**
+     * Taken from commons-lang3.
+     * <p>
+     * <p>Capitalizes a String changing the first character to title case as
+     * per {@link Character#toTitleCase(char)}. No other characters are changed.</p>
+     * <p>
+     * <p>For a word based algorithm, see {@link org.apache.commons.lang3.text.WordUtils#capitalize(String)}.
+     * A {@code null} input String returns {@code null}.</p>
+     * <p>
+     * <pre>
+     * StringUtils.capitalize(null)  = null
+     * StringUtils.capitalize("")    = ""
+     * StringUtils.capitalize("cat") = "Cat"
+     * StringUtils.capitalize("cAt") = "CAt"
+     * StringUtils.capitalize("'cat'") = "'cat'"
+     * </pre>
+     *
+     * @param str the String to capitalize, may be null
+     * @return the capitalized String, {@code null} if null String input
+     * @see org.apache.commons.lang3.text.WordUtils#capitalize(String)
+     */
+    public static String capitalize(final String str) {
+        int strLen;
+        if (str == null || (strLen = str.length()) == 0) {
+            return str;
+        }
+
+        final char firstChar = str.charAt(0);
+        final char newChar = Character.toTitleCase(firstChar);
+        if (firstChar == newChar) {
+            // already capitalized
+            return str;
+        }
+
+        char[] newChars = new char[strLen];
+        newChars[0] = newChar;
+        str.getChars(1, strLen, newChars, 1);
+        return String.valueOf(newChars);
+    }
+
+    /**
+     * Taken from commons-lang3.
+     * <p>Checks if a CharSequence is whitespace, empty ("") or null.</p>
+     * <p>
+     * <pre>
+     * StringUtils.isBlank(null)      = true
+     * StringUtils.isBlank("")        = true
+     * StringUtils.isBlank(" ")       = true
+     * StringUtils.isBlank("bob")     = false
+     * StringUtils.isBlank("  bob  ") = false
+     * </pre>
+     *
+     * @param cs the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence is null, empty or whitespace
+     */
+    public static boolean isBlank(final CharSequence cs) {
+        int strLen;
+        if (cs == null || (strLen = cs.length()) == 0) {
+            return true;
+        }
+        for (int i = 0; i < strLen; i++) {
+            if (Character.isWhitespace(cs.charAt(i)) == false) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static String join(Collection<?> values, String joinToken) {
+        if (values == null) {
+            return null;
+        }
+        if (values.size() == 0) {
+            return "";
+        }
+        if (values.size() == 1) {
+            return values.iterator().next().toString();
+        }
+        if (joinToken == null) {
+            joinToken = "null"; // backward compat with commons-lang StringUtils...
+        }
+
+        StringBuilder sb = new StringBuilder(values.size() * (16 + joinToken.length()));
+        Iterator<?> it = values.iterator();
+        sb.append(it.next());
+        while (it.hasNext()) {
+            sb.append(joinToken).append(it.next());
+        }
+        return sb.toString();
+    }
+
+    public static String joinArray(Object[] values, String joinToken) {
+        if (values == null) {
+            return null;
+        }
+        if (values.length == 0) {
+            return "";
+        }
+        if (values.length == 1) {
+            return values[0].toString();
+        }
+        if (joinToken == null) {
+            joinToken = "null"; // backward compat with commons-lang StringUtils...
+        }
+
+        StringBuilder sb = new StringBuilder(values.length * (16 + joinToken.length()));
+        sb.append(values[0]);
+        for (int i = 1; i < values.length; i++) {
+            sb.append(joinToken).append(values[i]);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * <p>Splits the provided text into an array, separator is whitespace.
+     */
+    public static String[] split(String str) {
+        return split(str, null);
+    }
+
+    /**
+     * <p>Splits the provided text into an array, separator is whitespace.
+     */
+    public static String[] split(String str, Character token) {
+        if (str == null || str.length() == 0) {
+            return ObjectUtils.EMPTY_STRING_ARRAY;
+        }
+
+        // split on token
+        List<String> ret = new ArrayList<String>();
+        StringBuilder sb = new StringBuilder(str.length());
+        for (int pos = 0; pos < str.length(); pos++) {
+            char c = str.charAt(pos);
+            if ((token == null && Character.isWhitespace(c)) || (token != null && token.equals(c))) {
+                if (sb.length() > 0) {
+                    ret.add(sb.toString());
+                    sb.setLength(0); // reset the string
+                }
+            }
+            else {
+                sb.append(c);
+            }
+        }
+        if (sb.length() > 0) {
+            ret.add(sb.toString());
+        }
+        return ret.toArray(new String[ret.size()]);
+    }
+
+}
\ No newline at end of file

Propchange: bval/trunk/bval-core/src/main/java/org/apache/bval/util/StringUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java?rev=1766445&view=auto
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java (added)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java Mon Oct 24 21:02:02 2016
@@ -0,0 +1,46 @@
+/*
+ * 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.util;
+
+
+/**
+ * Some used Validate from commons.
+ *
+ */
+public final class Validate {
+    private Validate() {
+    }
+
+    public static <T> T notNull(final T object) {
+        return notNull(object, "The validated object is null");
+    }
+
+    public static <T> T notNull(final T object, final String message, final Object... values) {
+        if (object == null) {
+            throw new NullPointerException(String.format(message, values));
+        }
+        return object;
+    }
+
+
+    public static void isTrue(final boolean expression, final String message, final Object... values) {
+        if (expression == false) {
+            throw new IllegalArgumentException(String.format(message, values));
+        }
+    }
+
+}

Propchange: bval/trunk/bval-core/src/main/java/org/apache/bval/util/Validate.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java
URL: http://svn.apache.org/viewvc/bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java?rev=1766445&r1=1766444&r2=1766445&view=diff
==============================================================================
--- bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java (original)
+++ bval/trunk/bval-core/src/main/java/org/apache/bval/util/reflection/Reflection.java Mon Oct 24 21:02:02 2016
@@ -24,23 +24,72 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
 
-import org.apache.commons.lang3.ClassUtils;
 import org.apache.commons.weaver.privilizer.Privilizing;
 
 /**
  * Security-agnostic "blueprint" class for reflection-related operations. Intended for use by Apache BVal code.
  */
 public class Reflection {
+    private static final Object[][] NATIVE_CODES = new Object[][]{
+            {byte.class, "byte", "B"},
+            {char.class, "char", "C"},
+            {double.class, "double", "D"},
+            {float.class, "float", "F"},
+            {int.class, "int", "I"},
+            {long.class, "long", "J"},
+            {short.class, "short", "S"},
+            {boolean.class, "boolean", "Z"},
+            {void.class, "void", "V"}
+    };
+
+    /**
+     * Maps primitive {@code Class}es to their corresponding wrapper {@code Class}.
+     */
+    private static final Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_MAP = new HashMap<Class<?>, Class<?>>();
+    static {
+        PRIMITIVE_WRAPPER_MAP.put(Boolean.TYPE, Boolean.class);
+        PRIMITIVE_WRAPPER_MAP.put(Byte.TYPE, Byte.class);
+        PRIMITIVE_WRAPPER_MAP.put(Character.TYPE, Character.class);
+        PRIMITIVE_WRAPPER_MAP.put(Short.TYPE, Short.class);
+        PRIMITIVE_WRAPPER_MAP.put(Integer.TYPE, Integer.class);
+        PRIMITIVE_WRAPPER_MAP.put(Long.TYPE, Long.class);
+        PRIMITIVE_WRAPPER_MAP.put(Double.TYPE, Double.class);
+        PRIMITIVE_WRAPPER_MAP.put(Float.TYPE, Float.class);
+        PRIMITIVE_WRAPPER_MAP.put(Void.TYPE, Void.TYPE);
+    }
+
+
+
     /**
-     * Get the named {@link Class} from the specified {@link ClassLoader}.
-     * @param classLoader
-     * @param className
-     * @return Class
-     * @throws Exception
-     */
-    public static Class<?> getClass(final ClassLoader classLoader, final String className) throws Exception {
-        return ClassUtils.getClass(classLoader, className, true);
+     * <p>Converts the specified primitive Class object to its corresponding
+     * wrapper Class object.</p>
+     *
+     * <p>NOTE: From v2.2, this method handles {@code Void.TYPE},
+     * returning {@code Void.TYPE}.</p>
+     *
+     * @param cls  the class to convert, may be null
+     * @return the wrapper class for {@code cls} or {@code cls} if
+     * {@code cls} is not a primitive. {@code null} if null input.
+     * @since 2.1
+     */
+    public static Class<?> primitiveToWrapper(final Class<?> cls) {
+        Class<?> convertedClass = cls;
+        if (cls != null && cls.isPrimitive()) {
+            convertedClass = PRIMITIVE_WRAPPER_MAP.get(cls);
+        }
+        return convertedClass;
+    }
+
+    public static Class<?> wrapperToPrimitive(final Class<?> cls) {
+        for (Map.Entry<Class<?>, Class<?>> primitiveEntry : PRIMITIVE_WRAPPER_MAP.entrySet()) {
+            if (primitiveEntry.getValue().equals(cls)) {
+                return primitiveEntry.getKey();
+            }
+        }
+        return null;
     }
 
     /**
@@ -80,6 +129,79 @@ public class Reflection {
         return cl == null ? clazz.getClassLoader() : cl;
     }
 
+    public static Class<?> toClass(String className) throws ClassNotFoundException
+    {
+        ClassLoader cl = getClassLoader(Reflection.class);
+        return toClass(className, cl);
+    }
+
+    /**
+     * Return the class for the given string, correctly handling
+     * primitive types. If the given class loader is null, the context
+     * loader of the current thread will be used.
+     *
+     * @throws RuntimeException on load error
+     */
+    public static Class toClass(String className, ClassLoader loader) throws ClassNotFoundException {
+        return toClass(className, false, loader);
+    }
+
+    /**
+     * Return the class for the given string, correctly handling
+     * primitive types. If the given class loader is null, the context
+     * loader of the current thread will be used.
+     *
+     * @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");
+        }
+
+        // array handling
+        int dims = 0;
+        while (className.endsWith("[]")) {
+            dims++;
+            className = className.substring(0, className.length() - 2);
+        }
+
+        // check against primitive types
+        boolean primitive = false;
+        if (className.indexOf('.') == -1) {
+            for (int i = 0; !primitive && (i < NATIVE_CODES.length); i++) {
+                if (NATIVE_CODES[i][1].equals(className)) {
+                    if (dims == 0) {
+                        return (Class) NATIVE_CODES[i][0];
+                    }
+                    className = (String) NATIVE_CODES[i][2];
+                    primitive = true;
+                }
+            }
+        }
+
+        if (dims > 0) {
+            StringBuilder buf = new StringBuilder(className.length() + dims + 2);
+            for (int i = 0; i < dims; i++) {
+                buf.append('[');
+            }
+            if (!primitive) {
+                buf.append('L');
+            }
+            buf.append(className);
+            if (!primitive) {
+                buf.append(';');
+            }
+            className = buf.toString();
+        }
+
+        if (loader == null) {
+            loader = Thread.currentThread().getContextClassLoader();
+        }
+
+        return Class.forName(className, resolve, loader);
+    }
+
+
     /**
      * Convenient point for {@link Privilizing} {@link System#getProperty(String)}.
      * @param name
@@ -114,7 +236,6 @@ public class Reflection {
 
     /**
      * Get the declared constructor from {@code clazz}.
-     * @param T generic type
      * @param clazz
      * @param parameters
      * @return {@link Constructor} or {@code null}