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);


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

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

	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);

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

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


package test;

public enum NumbersEnum2 {
	static {

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

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.

View raw message