Index: main/java/java/beans/DefaultPersistenceDelegate.java =================================================================== --- main/java/java/beans/DefaultPersistenceDelegate.java (revision 464929) +++ main/java/java/beans/DefaultPersistenceDelegate.java (working copy) @@ -53,6 +53,13 @@ @Override protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { + + if (newInstance == null) { + out.getExceptionListener().exceptionThrown( + new NullPointerException(Messages.getString("beans.4A"))); //$NON-NLS-1$ + return; + } + try { PropertyDescriptor[] pds = Introspector.getBeanInfo(type) .getPropertyDescriptors(); Index: test/java/org/apache/harmony/beans/tests/java/beans/DefaultPersistenceDelegateTest.java =================================================================== --- test/java/org/apache/harmony/beans/tests/java/beans/DefaultPersistenceDelegateTest.java (revision 464929) +++ test/java/org/apache/harmony/beans/tests/java/beans/DefaultPersistenceDelegateTest.java (working copy) @@ -27,6 +27,9 @@ import java.beans.SimpleBeanInfo; import java.beans.Statement; +import java.util.Vector; +import java.util.Iterator; + import junit.framework.TestCase; import org.apache.harmony.beans.tests.support.mock.MockFoo; @@ -355,6 +358,7 @@ assertEquals(1, e.getArguments().length); assertEquals(new Integer(2), e.getArguments()[0]); } + /* * Tests mutatesTo() under normal conditions without any properties. @@ -436,6 +440,8 @@ public void testMutatesTo_Null() { MockPersistenceDelegate pd = new MockPersistenceDelegate(); + assertFalse(pd.mutatesTo("test", null)); + assertFalse(pd.mutatesTo(null, null)); assertFalse(pd.mutatesTo(null, "test")); } @@ -444,47 +450,38 @@ * bean info class. */ public void testInitialize_Normal() throws Exception { - MockEncoder enc = new MockEncoder(); + CollectingEncoder enc = new CollectingEncoder(); MockPersistenceDelegate pd = new MockPersistenceDelegate(); - MockFoo b = new MockFoo(); - b.setName("myName"); - // b.setLabel("myLabel"); + MockFoo oldBean = new MockFoo(); + Iterator iter; + boolean found1 = false; + boolean found2 = false; - enc.writeObject(b); - CallVerificationStack.getInstance().clear(); - MockFoo b2 = (MockFoo) enc.get(b); - b2.setName("YourName"); + oldBean.setName("myName"); + oldBean.setLabel("myLabel"); + pd.initialize(MockFoo.class, oldBean, new MockFoo(), enc); + iter = enc.statements(); - pd.initialize(MockFoo.class, b, b2, enc); - - // should have called writeStatement() - Statement stm = (Statement) CallVerificationStack.getInstance().pop(); - assertSame(b, stm.getTarget()); - assertEquals("setName", stm.getMethodName()); - assertEquals(1, stm.getArguments().length); - assertEquals("myName", stm.getArguments()[0]); - - // should have called get() - assertEquals("myName", CallVerificationStack.getInstance().pop()); - - // should have called writeExpression() - Expression exp = (Expression) CallVerificationStack.getInstance().pop(); - assertSame(b.getName(), exp.getValue()); - assertSame(b, exp.getTarget()); - assertEquals("getName", exp.getMethodName()); - assertEquals(0, exp.getArguments().length); - - // should have called get() - assertNull(CallVerificationStack.getInstance().pop()); - - // should have called writeExpression() - exp = (Expression) CallVerificationStack.getInstance().pop(); - assertSame(b.getLabel(), exp.getValue()); - assertSame(b, exp.getTarget()); - assertEquals("getLabel", exp.getMethodName()); - assertEquals(0, exp.getArguments().length); - - assertTrue(CallVerificationStack.getInstance().empty()); + while (iter.hasNext()) { + Statement stmt = iter.next(); + + if (stmt.getMethodName().equals("setName") || + stmt.getMethodName().equals("setLabel")) { + assertSame(oldBean, stmt.getTarget()); + assertNotNull(stmt.getArguments()); + assertEquals(1, stmt.getArguments().length); + + if (stmt.getMethodName().equals("setName")) { + assertEquals(oldBean.getName(), stmt.getArguments()[0]); + found1 = true; + } else { + assertEquals(oldBean.getLabel(), stmt.getArguments()[0]); + found2 = true; + } + } + } + assertTrue("Required statement was not found", found1); + assertTrue("Required statement was not found", found2); } /* @@ -984,4 +981,26 @@ } } + public static class CollectingEncoder extends Encoder { + private Vector expressions = new Vector(); + private Vector statements = new Vector(); + + public void writeExpression(Expression exp) { + expressions.add(exp); + super.writeExpression(exp); + } + + public void writeStatement(Statement stm) { + statements.add(stm); + super.writeStatement(stm); + } + + public Iterator expressions() { + return expressions.iterator(); + } + + public Iterator statements() { + return statements.iterator(); + } + } }