You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2007/08/02 11:37:06 UTC
svn commit: r562054 - in /harmony/enhanced/classlib/trunk/modules/beans/src:
main/java/java/beans/ test/java/org/apache/harmony/beans/tests/java/beans/
test/support/java/org/apache/harmony/beans/tests/support/mock/
Author: tonywu
Date: Thu Aug 2 02:37:05 2007
New Revision: 562054
URL: http://svn.apache.org/viewvc?view=rev&rev=562054
Log:
Fix bugs:
1, Harmony throws StreamCorruptedException and exit while RI move on to create a new instance when encounter an corrupt ser file
2, Harmony throws IOException while RI throws ClassNotFoundException
Added:
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java (with props)
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/NotExistBean.ser (with props)
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java (with props)
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.ser (with props)
harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java (with props)
Modified:
harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Beans.java
harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/BeansTest.java
Modified: harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Beans.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Beans.java?view=diff&rev=562054&r1=562053&r2=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Beans.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/Beans.java Thu Aug 2 02:37:05 2007
@@ -161,34 +161,38 @@
ClassLoader loader = null;
- String beanResourceName = getBeanResourceName(beanName);
+ // First try to load it from a serialization file.
+ String beanResourceName = getBeanResourceName(beanName);
InputStream is = (cls == null) ? ClassLoader
.getSystemResourceAsStream(beanResourceName) : cls
.getResourceAsStream(beanResourceName);
- if (is != null) {
- ObjectInputStream ois = (cls == null) ? new ObjectInputStream(is)
- : new CustomizedObjectInputStream(is, cls);
- result = ois.readObject();
+ IOException serializationException = null;
+ if (is != null) {
+ try{
+ ObjectInputStream ois = (cls == null) ? new ObjectInputStream(is)
+ : new CustomizedObjectInputStream(is, cls);
+ result = ois.readObject();
+ }catch(IOException exception){
+ //Not loadable - remember this as we may throw it later.
+ serializationException = exception;
+ }
}
- if (result == null) {
+ //If that did not work, try to instantiate it from the given classloader.
+ if (result == null) {
deserialized = false;
try {
loader = cls == null ? ClassLoader.getSystemClassLoader() : cls;
Class<?> c = Class.forName(beanName, true, loader);
-
- try {
- result = c.newInstance();
-
- } catch (IllegalAccessException iae) {
- throw new ClassNotFoundException(iae.getClass() + ": " //$NON-NLS-1$
- + iae.getMessage());
- }
- } catch (InstantiationException ie) {
- throw new ClassNotFoundException(ie.getClass() + ": " //$NON-NLS-1$
- + ie.getMessage());
+ result = c.newInstance();
+ } catch (Exception e) {
+ if (serializationException != null) {
+ throw serializationException;
+ }
+ throw new ClassNotFoundException(e.getClass() + ": " //$NON-NLS-1$
+ + e.getMessage());
}
}
Modified: harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/BeansTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/BeansTest.java?view=diff&rev=562054&r1=562053&r2=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/BeansTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/BeansTest.java Thu Aug 2 02:37:05 2007
@@ -39,8 +39,10 @@
import junit.textui.TestRunner;
import org.apache.harmony.beans.tests.support.SampleBean;
+import org.apache.harmony.beans.tests.support.mock.CorruptedSerBean;
import org.apache.harmony.beans.tests.support.mock.MockAppletInitializer;
import org.apache.harmony.beans.tests.support.mock.MockJavaBean;
+import org.apache.harmony.beans.tests.support.mock.WrongSerBean;
/**
* Unit test for java.beans.Beans
@@ -345,7 +347,7 @@
try {
Beans.setDesignTime(true);
assertTrue(Beans.isDesignTime());
-
+
Beans.setDesignTime(false);
assertFalse(Beans.isDesignTime());
} finally {
@@ -358,16 +360,16 @@
try {
Beans.setGuiAvailable(true);
assertTrue(Beans.isGuiAvailable());
-
+
Beans.setGuiAvailable(false);
assertFalse(Beans.isGuiAvailable());
} finally {
Beans.setGuiAvailable(value);
}
}
-
+
public void testIsGuiAvailableDefault() {
- assertTrue("GUI is available by default", Beans.isGuiAvailable());
+ assertTrue("GUI is available by default", Beans.isGuiAvailable());
}
/**
@@ -427,7 +429,7 @@
targetType = null;
assertFalse(Beans.isInstanceOf(bean, targetType));
}
-
+
public void test_instantiate_with_corrupted_serialization_file()
throws Exception {
final String BEANS_NAME = "TestBean";
@@ -436,33 +438,86 @@
File file = new File(BEANS_NAME + ".ser");
file.deleteOnExit();
FileOutputStream fout = new FileOutputStream(file);
- fout.close();
+ fout.close();
try {
Beans.instantiate(null, BEANS_NAME);
- fail("should throw IOException.");
- } catch (IOException e) {
+ fail("should throw ClassNotFoundException.");
+ } catch (ClassNotFoundException e) {
// expected
}
}
-
- //Regression for HARMONY-3777
- public void test_instantiate_with_applet() throws Exception{
- Applet applet = (Applet) Beans.instantiate(null, "java.applet.Applet");
- assertNotNull(applet.getAppletContext());
- assertTrue(applet.isActive());
- }
- /**
- *
+ // Regression for HARMONY-3777
+ public void test_instantiate_with_applet() throws Exception {
+ Applet applet = (Applet) Beans.instantiate(null, "java.applet.Applet");
+ assertNotNull(applet.getAppletContext());
+ assertTrue(applet.isActive());
+ }
+
+ /*
+ * Test instantiate a bean with corrupted .ser file. First failed to create
+ * an instance by deserialize from a corrupted .ser file, then successfully
+ * load the class and create an instance of it.
+ */
+ public void test_instantiate_withCorruptedSer() throws IOException,
+ ClassNotFoundException {
+ Object bean = Beans.instantiate(null,
+ "org.apache.harmony.beans.tests.support.mock.CorruptedSerBean");
+ assertTrue(bean instanceof CorruptedSerBean);
+ }
+
+ /*
+ * Test instantiate a bean with wrong .ser file, which means the definition
+ * of the class changes after .ser file is created. First failed to create
+ * an instance by deserialize from a corrupted .ser file, which will cause a
+ * InvalidClassException, then successfully load the class and create an
+ * instance of it.
+ */
+ public void test_instantiate_withWrongSer() throws IOException,
+ ClassNotFoundException {
+ Object bean = Beans.instantiate(null,
+ "org.apache.harmony.beans.tests.support.mock.WrongSerBean");
+ assertTrue(bean instanceof WrongSerBean);
+ }
+
+ /*
+ * Test instantiate a bean with wrong but not corrupted .ser file First
+ * failed to create an instance by deserialize from a wrong .ser file, which
+ * will cause a ClassNotFoundException.
+ */
+ public void test_instantiate_ClassNotFoundExceptionThrowing()
+ throws IOException {
+ ClassLoader loader = new WrongSerClassLoader();
+ try {
+ Beans
+ .instantiate(loader,
+ "org.apache.harmony.beans.tests.support.mock.WrongSerBean2");
+ fail("Should throw a ClassNotFoundException");
+ } catch (ClassNotFoundException ex) {
+ // expected
+ }
+ }
+
+ /*
+ * Test instantiate bean with corrupted .ser file and wrong class name. This
+ * will cause an IOException.
*/
+ public void test_instantiate_IOExceptionThrowing()
+ throws ClassNotFoundException {
+ ClassLoader loader = new CorruptedSerClassLoader();
+ try {
+ Beans.instantiate(loader, "NotExistBean2");
+ fail("Should throw a IOException");
+ } catch (IOException ex) {
+ // expected
+ }
+ }
+
public static Test suite() {
return new TestSuite(BeansTest.class);
}
- /**
- *
- */
public static void main(String[] args) {
TestRunner.run(suite());
}
@@ -529,4 +584,26 @@
return getResource(MOCK_JAVA_BEAN2_SFILE);
}
}
+
+ /*
+ * A classloader for loading NotExistBean.ser, of which coresponding
+ * NotExistBean.java file is deleted.
+ */
+ private class WrongSerClassLoader extends ClassLoader {
+ @Override
+ protected URL findResource(String name) {
+ return getResource("org/apache/harmony/beans/tests/support/mock/NotExistBean.ser");
+ }
+ }
+
+ /*
+ * A classloader for loading corrupted .ser file.
+ */
+ private class CorruptedSerClassLoader extends ClassLoader {
+ @Override
+ protected URL findResource(String name) {
+ return getResource("org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser");
+ }
+ }
+
}
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java?view=auto&rev=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java (added)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java Thu Aug 2 02:37:05 2007
@@ -0,0 +1,5 @@
+package org.apache.harmony.beans.tests.support.mock;
+
+public class CorruptedSerBean {
+
+}
Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser?view=auto&rev=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser (added)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/CorruptedSerBean.ser Thu Aug 2 02:37:05 2007
@@ -0,0 +1 @@
+bad data.
\ No newline at end of file
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/NotExistBean.ser
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/NotExistBean.ser?view=auto&rev=562054
==============================================================================
Binary file - no diff available.
Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/NotExistBean.ser
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java?view=auto&rev=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java (added)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java Thu Aug 2 02:37:05 2007
@@ -0,0 +1,41 @@
+package org.apache.harmony.beans.tests.support.mock;
+
+import java.io.Serializable;
+
+/**
+ * A bean class which .ser file is wrong.
+ * Used for BeansTest.test_instantiate_withWrongSer()
+ */
+public class WrongSerBean implements Serializable{
+ private int intField;
+ private char charField;
+ private String str;
+
+ public WrongSerBean(){
+ super();
+ }
+
+ public WrongSerBean(int intField, char charField){
+ this.intField = intField;
+ this.charField = charField;
+ this.str = "test";
+ }
+
+ public char getCharField() {
+ return charField;
+ }
+
+ public void setCharField(char charField) {
+ this.charField = charField;
+ }
+
+ public int getIntField() {
+ return intField;
+ }
+
+ public void setIntField(int intField) {
+ this.intField = intField;
+ }
+
+
+}
Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.ser
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.ser?view=auto&rev=562054
==============================================================================
Binary file - no diff available.
Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean.ser
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java?view=auto&rev=562054
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java (added)
+++ harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java Thu Aug 2 02:37:05 2007
@@ -0,0 +1,5 @@
+package org.apache.harmony.beans.tests.support.mock;
+
+public class WrongSerBean2 {
+
+}
Propchange: harmony/enhanced/classlib/trunk/modules/beans/src/test/support/java/org/apache/harmony/beans/tests/support/mock/WrongSerBean2.java
------------------------------------------------------------------------------
svn:eol-style = native