harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jingkei Ly (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HARMONY-6355) Unable to set persistenceDelegate for a class via BeanInfo
Date Thu, 15 Oct 2009 11:06:31 GMT

    [ https://issues.apache.org/jira/browse/HARMONY-6355?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12766012#action_12766012
] 

Jingkei Ly commented on HARMONY-6355:
-------------------------------------

package test;

import java.beans.BeanInfo;
import java.beans.DefaultPersistenceDelegate;
import java.beans.Encoder;
import java.beans.Expression;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.XMLEncoder;
import java.io.FileOutputStream;

public class TestStaticDelegate {

	public static void main(String[] args) throws Exception {
		FileOutputStream os = new FileOutputStream("test1.xml");

		XMLEncoder encoder = new XMLEncoder(os);
		encoder.writeObject(NumbersEnum2.ONE);
		encoder.flush();
		encoder.close();

	}
}

class EnumPersistenceDelegate extends DefaultPersistenceDelegate {
	private static EnumPersistenceDelegate INSTANCE = new EnumPersistenceDelegate();

	@SuppressWarnings("unchecked")
	public static void installFor(Enum<?>[] values) {
		Class<? extends Enum> declaringClass = values[0].getDeclaringClass();
		installFor(declaringClass);
		for (Enum<?> e : values) {
			if (e.getClass() != declaringClass) {
				installFor(e.getClass());
			}
		}
	}

	@SuppressWarnings("unchecked")
	private static void installFor(Class<? extends Enum> enumClass) {
		try {
			BeanInfo info = Introspector.getBeanInfo(enumClass);
			info.getBeanDescriptor().setValue("persistenceDelegate", INSTANCE);
		} catch (IntrospectionException exception) {
			throw new RuntimeException("Unable to persist enumerated type "
					+ enumClass, exception);
		}
	}

	@Override
	protected Expression instantiate(Object oldInstance, Encoder out) {
		Enum<?> e = (Enum<?>) oldInstance;
		return new Expression(Enum.class, "valueOf", new Object[] {
				e.getDeclaringClass(), e.name() });
	}

	@Override
	protected boolean mutatesTo(Object oldInstance, Object newInstance) {
		return oldInstance == newInstance;
	}
}

==================================================================

package test;

public enum NumbersEnum2 {
	ONE, TWO;
	
	static {
		EnumPersistenceDelegate.installFor(NumbersEnum2.values());
	}
}

Running this prints this message to stderr:
Exception during encoding:java.lang.Exception: failed to write expression: NumbersEnum2=Class.new();
Continue...

Whereas it runs without problem in the RI.

> Unable to set persistenceDelegate for a class via BeanInfo
> ----------------------------------------------------------
>
>                 Key: HARMONY-6355
>                 URL: https://issues.apache.org/jira/browse/HARMONY-6355
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>    Affects Versions: 5.0M11
>            Reporter: Jingkei Ly
>
> As mentioned in HARMONY-6354, XMLEncoder is unable to encode an enum. One workaround
(described in the comments of this bug report for the RI: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5015403)
is to create a custom persistence delegate and set the persistenceDelegate for the enum via
the BeanInfo's bean descriptor, i.e.:
> BeanInfo info = Introspector.getBeanInfo(MyEnum.class);
> info.getBeanDescriptor().setValue("persistenceDelegate", new MyCustonPersistenceDelegate());
> When you use XMLEncoder.encode(), it should use the persistenceDelegate specified in
the BeanDescriptor - this works in the RI, but not in Harmony.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message