Author: tchemit Date: 2011-01-24 13:51:41 +0100 (Mon, 24 Jan 2011) New Revision: 2037 Url: http://nuiton.org/repositories/revision/nuiton-utils/2037 Log: Evolution #1228: Add more usefull methods in BeanUtil + test the BeanUtil class Added: trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanUtilTest.java Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/beans/BeanUtil.java trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanA.java Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/beans/BeanUtil.java =================================================================== --- trunk/nuiton-utils/src/main/java/org/nuiton/util/beans/BeanUtil.java 2011-01-24 11:39:23 UTC (rev 2036) +++ trunk/nuiton-utils/src/main/java/org/nuiton/util/beans/BeanUtil.java 2011-01-24 12:51:41 UTC (rev 2037) @@ -49,6 +49,38 @@ } /** + * Test if the given type is JavaBean compiliant, says that it has two + * public methods : + * <ul> + * <li>{@code addPropertyChangeListener}</li> + * <li>{@code removePropertyChangeListener}</li> + * </ul> + * + * @param type type to test + * @return {@code true} if type is Javabean compiliant, {@code false} + * otherwise + * @since 2.0 + */ + public static boolean isJavaBeanCompiliant(Class<?> type) { + + try { + type.getMethod(ADD_PROPERTY_CHANGE_LISTENER, PropertyChangeListener.class); + } catch (NoSuchMethodException e) { + // no add method + return false; + } + + try { + type.getMethod(REMOVE_PROPERTY_CHANGE_LISTENER, PropertyChangeListener.class); + } catch (NoSuchMethodException e) { + // no add method + return false; + } + + return true; + } + + /** * Add the given {@code listener} to the given {@code bean} using the * normalized method named {@code addPropertyChangeListener}. * @@ -110,6 +142,9 @@ // get properties for the class getReadableProperties(beanType, result, exploredTypes); + // the special getClass will never be a Javabean property... + result.remove("class"); + return result; } Modified: trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanA.java =================================================================== --- trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanA.java 2011-01-24 11:39:23 UTC (rev 2036) +++ trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanA.java 2011-01-24 12:51:41 UTC (rev 2037) @@ -31,6 +31,7 @@ public class BeanA { public static final String PROPERTY_AA = "aa"; + public static final String PROPERTY_A = "a"; public static final String PROPERTY_B = "b"; @@ -135,4 +136,8 @@ Object newValue) { pcs.firePropertyChange(propertyName, oldValue, newValue); } + + protected PropertyChangeListener[] getPropertyChangeListeners() { + return pcs.getPropertyChangeListeners(); + } } Added: trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanUtilTest.java =================================================================== --- trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanUtilTest.java (rev 0) +++ trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanUtilTest.java 2011-01-24 12:51:41 UTC (rev 2037) @@ -0,0 +1,155 @@ +package org.nuiton.util.beans; + +import org.junit.Assert; +import org.junit.Test; + +import java.beans.PropertyChangeListener; +import java.beans.beancontext.BeanContextSupport; +import java.lang.reflect.InvocationTargetException; +import java.util.Set; + +/** + * To test the {@link BeanUtil} class. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.0 + */ +public class BeanUtilTest { + + @Test + public void isJavaBeanCompiliant() { + + boolean javaBeanCompiliant; + + javaBeanCompiliant = BeanUtil.isJavaBeanCompiliant(BeanA.class); + Assert.assertTrue(javaBeanCompiliant); + + javaBeanCompiliant = BeanUtil.isJavaBeanCompiliant(BeanB.class); + Assert.assertTrue(javaBeanCompiliant); + + javaBeanCompiliant = BeanUtil.isJavaBeanCompiliant(getClass()); + Assert.assertFalse(javaBeanCompiliant); + } + + @Test + public void getReadableProperties() { + + assertFoundReadableProperties(BeanA.class, + BeanA.PROPERTY_A, + BeanA.PROPERTY_B, + BeanA.PROPERTY_C, + BeanA.PROPERTY_D, + BeanA.PROPERTY_E, + BeanA.PROPERTY_F); + + assertFoundReadableProperties(BeanB.class, + BeanA.PROPERTY_A, + BeanA.PROPERTY_B, + BeanA.PROPERTY_C, + BeanA.PROPERTY_D, + BeanA.PROPERTY_E, + BeanA.PROPERTY_F, + BeanB.PROPERTY_BB, + BeanB.PROPERTY_A2, + BeanB.PROPERTY_B2, + BeanB.PROPERTY_C2, + BeanB.PROPERTY_D2, + BeanB.PROPERTY_E2, + BeanB.PROPERTY_F2 + ); + + assertFoundReadableProperties(getClass()); + } + + @Test + public void getWriteableProperties() { + + assertFoundWriteableProperties(BeanA.class, + BeanA.PROPERTY_A, + BeanA.PROPERTY_B, + BeanA.PROPERTY_C, + BeanA.PROPERTY_D, + BeanA.PROPERTY_E, + BeanA.PROPERTY_F); + + assertFoundWriteableProperties(BeanB.class, + BeanA.PROPERTY_A, + BeanA.PROPERTY_B, + BeanA.PROPERTY_C, + BeanA.PROPERTY_D, + BeanA.PROPERTY_E, + BeanA.PROPERTY_F, + BeanB.PROPERTY_BB, + BeanB.PROPERTY_A2, + BeanB.PROPERTY_B2, + BeanB.PROPERTY_C2, + BeanB.PROPERTY_D2, + BeanB.PROPERTY_E2, + BeanB.PROPERTY_F2 + ); + + assertFoundWriteableProperties(getClass()); + } + + @Test + public void addPropertyChangeListener() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException { + + PropertyChangeListener l = new BeanContextSupport(); + + BeanA beanA = new BeanA(); + + BeanUtil.addPropertyChangeListener(l, beanA); + + PropertyChangeListener[] listeners; + listeners = beanA.getPropertyChangeListeners(); + + Assert.assertEquals(1, listeners.length); + Assert.assertEquals(l, listeners[0]); + + + BeanUtil.addPropertyChangeListener(l, beanA); + + listeners = beanA.getPropertyChangeListeners(); + + Assert.assertEquals(2, listeners.length); + Assert.assertEquals(l, listeners[0]); + Assert.assertEquals(l, listeners[1]); + } + + @Test + public void removePropertyChangeListener() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException { + + PropertyChangeListener[] listeners; + + PropertyChangeListener l = new BeanContextSupport(); + + BeanA beanA = new BeanA(); + beanA.addPropertyChangeListener(l); + + listeners = beanA.getPropertyChangeListeners(); + Assert.assertEquals(1, listeners.length); + Assert.assertEquals(l, listeners[0]); + + BeanUtil.removePropertyChangeListener(l, beanA); + + listeners = beanA.getPropertyChangeListeners(); + + Assert.assertEquals(0, listeners.length); + } + + protected void assertFoundReadableProperties(Class<?> type, String... expectedproperties) { + Set<String> readableProperties = BeanUtil.getReadableProperties(type); + Assert.assertEquals(expectedproperties.length, readableProperties.size()); + for (String expectedproperty : expectedproperties) { + Assert.assertTrue("Did not found property " + expectedproperty, readableProperties.contains(expectedproperty)); + } + } + + protected void assertFoundWriteableProperties(Class<?> type, String... expectedproperties) { + Set<String> readableProperties = BeanUtil.getReadableProperties(type); + Assert.assertEquals(expectedproperties.length, readableProperties.size()); + for (String expectedproperty : expectedproperties) { + Assert.assertTrue(readableProperties.contains(expectedproperty)); + } + } +} Property changes on: trunk/nuiton-utils/src/test/java/org/nuiton/util/beans/BeanUtilTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native