Author: zhoukevin
Date: Mon Sep 20 02:32:29 2010
New Revision: 998763
URL: http://svn.apache.org/viewvc?rev=998763&view=rev
Log:
When encoding a Enum property in a bean class, if it doesn't set a customized
persistence delegate for Enum class thru java.beans.Encoder.setPersistenceDe
legate(Class, PersistenceDelegate), RI6 encodes this property successfully wh
ile HARMONY6 fails to encode this property with some exception messages:
Exception during encoding:java.lang.Exception: failed to write expression: XM
LEncoderTest$Element=Class.new();
Continue...
Exception during encoding:java.lang.Exception: failed to write expression: XM
LEncoderTest$Element=Class.new();
Continue...
By comparison, RI5 performs the same as HARMONY5, which fails to encode this
property with the above exceptions. That's why this patch is only committed t
o HARMONY6 branch to follow the behavior of RI6.
Added:
harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/LangEnumPersistenceDelegate.java
harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/reso
urces/xml/MockEnumObject.xml
Modified:
harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/Encoder.java
harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/java
/org/apache/harmony/beans/tests/java/beans/XMLEncoderTest.java
Modified: harmony/enhanced/java/branches/java6/classlib/modules/beans/src/mai
n/java/java/beans/Encoder.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/java6/classl
ib/modules/beans/src/main/java/java/beans/Encoder.java?rev=998763&r1=998762&r
2=998763&view=diff
=============================================================================
=
--- harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/Encoder.java (original)
+++ harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/Encoder.java Mon Sep 20 02:32:29 2010
@@ -64,7 +64,6 @@ import javax.swing.ToolTipManager;
*</p>
*
*/
-...@suppresswarnings("unchecked")
public class Encoder {
private static final Hashtable<Class<?>, PersistenceDelegate> delegates
= new Hashtable<Class<?>, PersistenceDelegate>();
@@ -105,6 +104,7 @@ public class Encoder {
delegates.put(String.class, new StringPersistenceDelegate());
delegates.put(Proxy.class, new ProxyPersistenceDelegate());
delegates.put(Date.class, new UtilDatePersistenceDelegate());
+ delegates.put(Enum.class, new LangEnumPersistenceDelegate());
}
private ExceptionListener listener = defaultExListener;
@@ -199,9 +199,10 @@ public class Encoder {
registerSwingPDs();
isInitilizedSwing = true;
}
-
+
// registered delegate
- PersistenceDelegate registeredPD = delegates.get(type);
+ PersistenceDelegate registeredPD = Enum.class.isAssignableFrom(type)
? delegates
+ .get(Enum.class) : delegates.get(type);
if (registeredPD != null) {
return registeredPD;
}
@@ -423,7 +424,7 @@ public class Encoder {
if (o == null) {
return;
}
- Class type = o.getClass();
+ Class<?> type = o.getClass();
getPersistenceDelegate(type).writeObject(o, this);
}
Added: harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/j
ava/java/beans/LangEnumPersistenceDelegate.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/java6/classl
ib/modules/beans/src/main/java/java/beans/LangEnumPersistenceDelegate.java?re
v=998763&view=auto
=============================================================================
=
--- harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/LangEnumPersistenceDelegate.java (added)
+++ harmony/enhanced/java/branches/java6/classlib/modules/beans/src/main/java
/java/beans/LangEnumPersistenceDelegate.java Mon Sep 20 02:32:29 2010
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package java.beans;
+
+class LangEnumPersistenceDelegate extends PersistenceDelegate {
+
+ @Override
+ protected Expression instantiate(Object oldInstance, Encoder enc) {
+ Enum<?> oldEnum = (Enum<?>) oldInstance;
+ return new Expression(oldEnum, oldEnum.getClass(), "valueOf",
+ new Object[] { oldEnum.name() });
+ }
+
+}
Modified: harmony/enhanced/java/branches/java6/classlib/modules/beans/src/tes
t/java/org/apache/harmony/beans/tests/java/beans/XMLEncoderTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/java6/classl
ib/modules/beans/src/test/java/org/apache/harmony/beans/tests/java/beans/XMLE
ncoderTest.java?rev=998763&r1=998762&r2=998763&view=diff
=============================================================================
=
--- harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/java
/org/apache/harmony/beans/tests/java/beans/XMLEncoderTest.java (original)
+++ harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/java
/org/apache/harmony/beans/tests/java/beans/XMLEncoderTest.java Mon Sep 20 02:
32:29 2010
@@ -59,20 +59,6 @@ import org.xml.sax.helpers.XMLReaderFact
*/
public class XMLEncoderTest extends TestCase {
- public static void main(String[] args) {
-
- // VerboseEncoder enc = new VerboseEncoder();
- //
- // MockBean4Codec b = new MockBean4Codec();
- // b.getBornFriend().getZarr()[0] = 888;
- // b.setNill(b.getBornFriend());
- //
- // enc.writeObject(b);
- // enc.flush();
-
- junit.textui.TestRunner.run(XMLEncoderTest.class);
- }
-
public static class DependencyBean {
private int ints[] = new int[] { 1 };
@@ -120,9 +106,8 @@ public class XMLEncoderTest extends Test
return result;
}
- @SuppressWarnings("unchecked")
@Override
- public PersistenceDelegate getPersistenceDelegate(Class type) {
+ public PersistenceDelegate getPersistenceDelegate(Class<?> type) {
PersistenceDelegate result = super.getPersistenceDelegate(type);
return result;
}
@@ -328,6 +313,7 @@ public class XMLEncoderTest extends Test
}
*/
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public void testWriteObject_MockTreeMap() throws Exception {
Map<String, TreeMap<String, String>> innerTreeMap = new MockTreeMapC
lass();
TreeMap resultTreeMap = innerTreeMap.get("outKey");
@@ -340,6 +326,29 @@ public class XMLEncoderTest extends Test
assertEquals(1, innerTreeMap.size());
}
+ public static enum Element {
+ ELEMENTA, ELEMENTB, ELEMENTC
+ }
+
+ public static class MockEnumObject {
+
+ Element element;
+
+ public Element getElement() {
+ return element;
+ }
+
+ public void setElement(Element element) {
+ this.element = element;
+ }
+ }
+
+ public void testWriteObject_EnumObject() throws Exception {
+ MockEnumObject mockEnumObject = new MockEnumObject();
+ mockEnumObject.setElement(Element.ELEMENTA);
+ assertCodedXML(mockEnumObject, "/xml/MockEnumObject.xml");
+ }
+
public void testClose() {
ByteArrayOutputStream out = new ByteArrayOutputStream() {
boolean closeCalled = false;
@@ -783,9 +792,8 @@ public class XMLEncoderTest extends Test
final Object object = new Object();
e.setPersistenceDelegate(AType.class,
new DefaultPersistenceDelegate() {
- @SuppressWarnings("unchecked")
@Override
- protected void initialize(Class type,
+ protected void initialize(Class<?> type,
Object oldInstance, Object newInstance,
Encoder out) {
out.writeExpression(new Expression(object,
Added: harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/r
esources/xml/MockEnumObject.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/java6/classl
ib/modules/beans/src/test/resources/xml/MockEnumObject.xml?rev=998763&view=au
to
=============================================================================
=
--- harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/reso
urces/xml/MockEnumObject.xml (added)
+++ harmony/enhanced/java/branches/java6/classlib/modules/beans/src/test/reso
urces/xml/MockEnumObject.xml Mon Sep 20 02:32:29 2010
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<java version="${version}" class="java.beans.XMLDecoder">
+<object class="${classname}">
+<void property="element">
+<object class="org.apache.harmony.beans.tests.java.beans.XMLEncoderTest$E
lement" method="valueOf">
+<string>ELEMENTA</string>
+</object>
+</void>
+</object>
+</java>
\ No newline at end of file