Author: ilgrosso
Date: Thu Jan 30 12:59:20 2014
New Revision: 1562803

URL: http://svn.apache.org/r1562803
Log:
[SYNCOPE-462] Update to Spring 3.2.7, Spring Security 3.2.0 + updating local 
BeanUtils

Modified:
    syncope/trunk/   (props changed)
    
syncope/trunk/common/src/main/java/org/apache/syncope/common/util/BeanUtils.java
    syncope/trunk/pom.xml

Propchange: syncope/trunk/
------------------------------------------------------------------------------
  Merged /syncope/branches/1_1_X:r1558004-1562787

Modified: 
syncope/trunk/common/src/main/java/org/apache/syncope/common/util/BeanUtils.java
URL: 
http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/util/BeanUtils.java?rev=1562803&r1=1562802&r2=1562803&view=diff
==============================================================================
--- 
syncope/trunk/common/src/main/java/org/apache/syncope/common/util/BeanUtils.java
 (original)
+++ 
syncope/trunk/common/src/main/java/org/apache/syncope/common/util/BeanUtils.java
 Thu Jan 30 12:59:20 2014
@@ -24,12 +24,15 @@ import static org.springframework.beans.
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
-import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.FatalBeanException;
 import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
 
 /**
  * Overrides Spring's BeanUtils not using collection setters but instead 
getters + addAll() / putAll(),
@@ -52,7 +55,8 @@ public final class BeanUtils {
      * from each other, as long as the properties match. Any bean properties 
that the
      * source bean exposes but the target bean does not will silently be 
ignored.
      * <br/>
-     * This is just a convenience method. For more complex transfer needs, 
consider using a full BeanWrapper.
+     * This is just a convenience method. For more complex transfer needs,
+     * consider using a full BeanWrapper.
      *
      * @param source the source bean
      * @param target the target bean
@@ -60,7 +64,53 @@ public final class BeanUtils {
      * @see org.springframework.beans.BeanWrapper
      */
     public static void copyProperties(final Object source, final Object 
target) throws BeansException {
-        copyProperties(source, target, null);
+        copyProperties(source, target, null, (String[]) null);
+    }
+
+    /**
+     * Copy the property values of the given source bean into the given target 
bean,
+     * only setting properties defined in the given "editable" class (or 
interface).
+     * <br/>
+     * Note: The source and target classes do not have to match or even be 
derived
+     * from each other, as long as the properties match. Any bean properties 
that the
+     * source bean exposes but the target bean does not will silently be 
ignored.
+     * <br/>
+     * This is just a convenience method. For more complex transfer needs,
+     * consider using a full BeanWrapper.
+     *
+     * @param source the source bean
+     * @param target the target bean
+     * @param editable the class (or interface) to restrict property setting to
+     * @throws BeansException if the copying failed
+     * @see org.springframework.beans.BeanWrapper
+     */
+    public static void copyProperties(final Object source, final Object 
target, final Class<?> editable)
+            throws BeansException {
+
+        copyProperties(source, target, editable, (String[]) null);
+    }
+
+    /**
+     * Copy the property values of the given source bean into the given target 
bean,
+     * ignoring the given "ignoreProperties".
+     * <br/>
+     * Note: The source and target classes do not have to match or even be 
derived
+     * from each other, as long as the properties match. Any bean properties 
that the
+     * source bean exposes but the target bean does not will silently be 
ignored.
+     * <br/>
+     * This is just a convenience method. For more complex transfer needs,
+     * consider using a full BeanWrapper.
+     *
+     * @param source the source bean
+     * @param target the target bean
+     * @param ignoreProperties array of property names to ignore
+     * @throws BeansException if the copying failed
+     * @see org.springframework.beans.BeanWrapper
+     */
+    public static void copyProperties(final Object source, final Object 
target, final String... ignoreProperties)
+            throws BeansException {
+
+        copyProperties(source, target, null, ignoreProperties);
     }
 
     /**
@@ -72,55 +122,74 @@ public final class BeanUtils {
      *
      * @param source the source bean
      * @param target the target bean
+     * @param editable the class (or interface) to restrict property setting to
      * @param ignoreProperties array of property names to ignore
      * @throws BeansException if the copying failed
      * @see org.springframework.beans.BeanWrapper
      */
     @SuppressWarnings("unchecked")
-    public static void copyProperties(final Object source, final Object 
target, final String[] ignoreProperties)
-            throws BeansException {
+    private static void copyProperties(final Object source, final Object 
target, final Class<?> editable,
+            final String... ignoreProperties) throws BeansException {
 
         Assert.notNull(source, "Source must not be null");
         Assert.notNull(target, "Target must not be null");
 
-        for (PropertyDescriptor targetPd : 
getPropertyDescriptors(target.getClass())) {
-            if (!ArrayUtils.contains(ignoreProperties, targetPd.getName())) {
-                PropertyDescriptor sourcePd = 
getPropertyDescriptor(source.getClass(), targetPd.getName());
-                if (sourcePd != null && sourcePd.getReadMethod() != null) {
-                    try {
-                        Method readMethod = sourcePd.getReadMethod();
-                        if 
(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
-                            readMethod.setAccessible(true);
-                        }
-                        Object value = readMethod.invoke(source);
+        Class<?> actualEditable = target.getClass();
+        if (editable != null) {
+            if (!editable.isInstance(target)) {
+                throw new IllegalArgumentException("Target class [" + 
target.getClass().getName()
+                        + "] not assignable to Editable class [" + 
editable.getName() + "]");
+            }
+            actualEditable = editable;
+        }
+        PropertyDescriptor[] targetPds = 
getPropertyDescriptors(actualEditable);
+        List<String> ignoreList = (ignoreProperties == null)
+                ? Collections.<String>emptyList() : 
Arrays.asList(ignoreProperties);
 
+        for (PropertyDescriptor targetPd : targetPds) {
+            if (ignoreProperties == null || 
(!ignoreList.contains(targetPd.getName()))) {
+                PropertyDescriptor sourcePd = 
getPropertyDescriptor(source.getClass(), targetPd.getName());
+                if (sourcePd != null) {
+                    Method readMethod = sourcePd.getReadMethod();
+                    if (readMethod != null) {
                         Method writeMethod = targetPd.getWriteMethod();
-                        // Diverts from Spring's BeanUtils: if no write method 
is found and property is collection,
-                        // try to use addAll() / putAll().
-                        if (writeMethod == null) {
-                            Method targetReadMethod = targetPd.getReadMethod();
-                            if (targetReadMethod != null) {
-                                if 
(!Modifier.isPublic(targetReadMethod.getDeclaringClass().getModifiers())) {
-                                    targetReadMethod.setAccessible(true);
+
+                        try {
+                            // Diverts from Spring's BeanUtils: if no write 
method is found and property is collection,
+                            // try to use addAll() / putAll().
+                            if (writeMethod == null) {
+                                Object value = readMethod.invoke(source);
+                                Method targetReadMethod = 
targetPd.getReadMethod();
+                                if (targetReadMethod != null) {
+                                    if 
(!Modifier.isPublic(targetReadMethod.getDeclaringClass().getModifiers())) {
+                                        targetReadMethod.setAccessible(true);
+                                    }
+                                    Object destValue = 
targetReadMethod.invoke(target);
+
+                                    if (value instanceof Collection && 
destValue instanceof Collection) {
+                                        ((Collection) destValue).clear();
+                                        ((Collection) 
destValue).addAll((Collection) value);
+                                    } else if (value instanceof Map && 
destValue instanceof Map) {
+                                        ((Map) destValue).clear();
+                                        ((Map) destValue).putAll((Map) value);
+                                    }
                                 }
-                                Object destValue = 
targetReadMethod.invoke(target);
+                            } else if (ClassUtils.isAssignable(
+                                    writeMethod.getParameterTypes()[0], 
readMethod.getReturnType())) {
 
-                                if (value instanceof Collection && destValue 
instanceof Collection) {
-                                    ((Collection) destValue).clear();
-                                    ((Collection) 
destValue).addAll((Collection) value);
-                                } else if (value instanceof Map && destValue 
instanceof Map) {
-                                    ((Map) destValue).clear();
-                                    ((Map) destValue).putAll((Map) value);
+                                if 
(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
+                                    readMethod.setAccessible(true);
                                 }
+                                Object value = readMethod.invoke(source);
+                                if 
(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
+                                    writeMethod.setAccessible(true);
+                                }
+                                writeMethod.invoke(target, value);
                             }
-                        } else {
-                            if 
(!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {
-                                writeMethod.setAccessible(true);
-                            }
-                            writeMethod.invoke(target, value);
+                        } catch (Throwable ex) {
+                            throw new FatalBeanException(
+                                    "Could not copy property '" + 
targetPd.getName() + "' from source to target", ex);
                         }
-                    } catch (Throwable ex) {
-                        throw new FatalBeanException("Could not copy 
properties from source to target", ex);
                     }
                 }
             }

Modified: syncope/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/syncope/trunk/pom.xml?rev=1562803&r1=1562802&r2=1562803&view=diff
==============================================================================
--- syncope/trunk/pom.xml (original)
+++ syncope/trunk/pom.xml Thu Jan 30 12:59:20 2014
@@ -317,8 +317,8 @@ under the License.
     <aspectj.version>1.7.4</aspectj.version>
 
     <cxf.version>3.0.0-SNAPSHOT</cxf.version>  
-    <spring.version>3.2.6.RELEASE</spring.version>
-    <spring-security.version>3.1.4.RELEASE</spring-security.version>
+    <spring.version>3.2.7.RELEASE</spring.version>
+    <spring-security.version>3.2.0.RELEASE</spring-security.version>
     <jackson.version>2.3.1</jackson.version>
     <xstream.version>1.4.6</xstream.version>
     <velocity.version>1.7</velocity.version>


Reply via email to