Program: 60547
Project: 60547
Buggy source:
/** 
 * Copy the property values of the given source bean into the given target bean. <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.
 * @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("String_Node_Str") private static void copyProperties(final Object source,final Object target,final Class<?> editable,final String... ignoreProperties) throws BeansException {
  Assert.notNull(source,"String_Node_Str");
  Assert.notNull(target,"String_Node_Str");
  Class<?> actualEditable=target.getClass();
  if (editable != null) {
    if (!editable.isInstance(target)) {
      throw new IllegalArgumentException("String_Node_Str" + target.getClass().getName() + "String_Node_Str"+ editable.getName()+ "String_Node_Str");
    }
    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();
          try {
            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);
                }
              }
            }
 else             if (ClassUtils.isAssignable(writeMethod.getParameterTypes()[0],readMethod.getReturnType())) {
              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);
            }
          }
 catch (          Throwable ex) {
            throw new FatalBeanException("String_Node_Str" + targetPd.getName() + "String_Node_Str",ex);
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Copy the property values of the given source bean into the given target bean. <p> 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. </p>
 * @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("String_Node_Str") private static void copyProperties(final Object source,final Object target,final Class<?> editable,final String... ignoreProperties) throws BeansException {
  Assert.notNull(source,"String_Node_Str");
  Assert.notNull(target,"String_Node_Str");
  Class<?> actualEditable=target.getClass();
  if (editable != null) {
    if (!editable.isInstance(target)) {
      throw new IllegalArgumentException("String_Node_Str" + target.getClass().getName() + "String_Node_Str"+ editable.getName()+ "String_Node_Str");
    }
    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();
          try {
            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);
                }
              }
            }
 else             if (ClassUtils.isAssignable(writeMethod.getParameterTypes()[0],readMethod.getReturnType())) {
              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);
            }
          }
 catch (          Throwable ex) {
            throw new FatalBeanException("String_Node_Str" + targetPd.getName() + "String_Node_Str",ex);
          }
        }
      }
    }
  }
}