From 25aba9758e592b557ab4d9288b58d919e7608468 Mon Sep 17 00:00:00 2001 From: Patrick Gotthard Date: Fri, 15 Nov 2013 22:24:57 +0100 Subject: [PATCH] Refactored CloneableBean Added slf4j-simple for tests --- pom.xml | 6 ++ .../syndication/feed/impl/CloneableBean.java | 74 +++++++++---------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index b75f02b..0632fef 100644 --- a/pom.xml +++ b/pom.xml @@ -203,6 +203,12 @@ slf4j-api 1.7.5 + + org.slf4j + slf4j-simple + 1.7.5 + test + junit junit diff --git a/src/main/java/com/sun/syndication/feed/impl/CloneableBean.java b/src/main/java/com/sun/syndication/feed/impl/CloneableBean.java index 9d21bb4..3c4aa4d 100644 --- a/src/main/java/com/sun/syndication/feed/impl/CloneableBean.java +++ b/src/main/java/com/sun/syndication/feed/impl/CloneableBean.java @@ -155,55 +155,53 @@ public class CloneableBean implements Serializable, Cloneable { * */ public Object beanClone() throws CloneNotSupportedException { - Object clonedBean; + + final Class clazz = obj.getClass(); + try { - clonedBean = obj.getClass().newInstance(); - final PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(obj.getClass()); - if (pds != null) { - for (int i = 0; i < pds.length; i++) { - final Method pReadMethod = pds[i].getReadMethod(); - final Method pWriteMethod = pds[i].getWriteMethod(); - if (pReadMethod != null && pWriteMethod != null && // ensure - // it has - // getter - // and - // setter - // methods - !ignoreProperties.contains(pds[i].getName()) && // is - // not - // in - // the - // list - // of - // properties - // to - // ignore - pReadMethod.getDeclaringClass() != Object.class && // filter - // Object.class - // getter - // methods - pReadMethod.getParameterTypes().length == 0) { // filter - // getter - // methods - // that - // take - // parameters - Object value = pReadMethod.invoke(obj, NO_PARAMS); - if (value != null) { - value = doClone(value); - pWriteMethod.invoke(clonedBean, new Object[] { value }); + + final Object clonedBean = clazz.newInstance(); + + final PropertyDescriptor[] propertyDescriptors = BeanIntrospector.getPropertyDescriptors(clazz); + if (propertyDescriptors != null) { + for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) { + + final Method getter = propertyDescriptor.getReadMethod(); + final Method setter = propertyDescriptor.getWriteMethod(); + final String propertyName = propertyDescriptor.getName(); + + final boolean getterExists = getter != null; + final boolean setterExists = setter != null; + final boolean ignoredProperty = ignoreProperties.contains(propertyName); + + if (getterExists && setterExists && !ignoredProperty) { + + final boolean getterFromObject = getter.getDeclaringClass() == Object.class; + final boolean getterWithoutParams = getter.getParameterTypes().length == 0; + + if (!getterFromObject && getterWithoutParams) { + Object value = getter.invoke(obj, NO_PARAMS); + if (value != null) { + value = doClone(value); + setter.invoke(clonedBean, new Object[] { value }); + } } + } + } } + + return clonedBean; + } catch (final CloneNotSupportedException e) { LOG.error("Error while cloning bean", e); throw e; } catch (final Exception e) { LOG.error("Error while cloning bean", e); - throw new CloneNotSupportedException("Cannot clone a " + obj.getClass() + " object"); + throw new CloneNotSupportedException("Cannot clone a " + clazz + " object"); } - return clonedBean; + } @SuppressWarnings("unchecked")