Fwd: [beanlib - Help] HibernateReplicator deepCopy issue

70 views
Skip to first unread message

Hanson Char

unread,
Sep 20, 2008, 12:21:07 AM9/20/08
to beanlib


---------- Forwarded message ----------
From: SourceForge.net <nor...@sourceforge.net>
Date: Fri, Sep 19, 2008 at 2:07 PM
Subject: [beanlib - Help] HibernateReplicator deepCopy issue
To: nor...@sourceforge.net



Read and respond to this message at:
https://sourceforge.net/forum/message.php?msg_id=5294653
By: valysivec27

Hello, I'm using some third party legacy classes and I'm having problems using
the deepCopy method of the HibernateReplicator class.


Basically here is a simple case:

public class MainClass {

    public static void main(String[] args) {

       MainClass m = new MainClass();
       m.test();

    }

    public void test(){

       A from = new A();
       from.setAction(EnumAction.UNKNOWN);

        HibernateBeanReplicator replicator = new Hibernate3BeanReplicator();

        A copy = replicator.deepCopy(from);

        System.out.println("Copy is:" + copy);

    }

}

It fails instantiating EnumAction (class definition below), with the following
exception:

/**********************************************************************

Exception in thread "main" net.sf.beanlib.BeanlibException:
java.lang.NoSuchMethodException: test.enumeration.EnumAction.<init>()
       at net.sf.beanlib.provider.replicator.BeanReplicator.replicateBean(BeanReplicat
or.java:134)
       at net.sf.beanlib.hibernate3.Hibernate3JavaBeanReplicator.replicateBean(Hiberna
te3JavaBeanReplicator.java:71)
-
       Caused by: java.lang.NoSuchMethodException:
test.enumeration.EnumAction.<init>()

***************END EXCEPTION STACK *************************/


package test.enumeration;

import java.io.Serializable;

public abstract class Enum implements Serializable{

           private static final long serialVersionUID = 1L;

               /**
            * Description of this Enum instance
            */
           protected final String description;

           /**
            * Natural ordering number for the Enum
            */
           protected int ordinal;

               /**
                * Protected constructor with no description.
                *
                * @param ordinal       the natural ordering number
                */
               protected Enum( int ordinal ) {

                       this( ordinal, null );
               }

           /**
            * Protected constructor.
            *
            * @param ordinal   the natural ordering number
            * @param description informative description string
            */
           protected Enum( int ordinal, String description ) {

                       this.description = ( description == null ?
                                                                               getClass().getName() + ordinal :
                                                                               description );

               this.ordinal = ordinal;
           }

}

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

public class EnumAction extends Enum
{
               private static final long serialVersionUID = 1;

               private static final Map stringMap = new HashMap();
               private static final Map ordMap = new HashMap();

               public static final int UNKNOWN_ORD = -1;
               public static final String UNKNOWN_STR = "UNKNOWN";

               public static final EnumAction UNKNOWN = new EnumAction(UNKNOWN_ORD,
UNKNOWN_STR);

               public static final EnumAction FASTACTION = new EnumAction(1, "FASTACTION");


               protected EnumAction(int ordinal, String description)
               {
                       super(ordinal, description);

                       if (stringMap.containsKey(description)) {
                               throw new RuntimeException("Duplicate string in EnumAction enum: "
+ description);
                       }
                       Integer intOrdinal = new Integer(ordinal);
                       if (ordMap.containsKey(intOrdinal)) {
                               throw new RuntimeException("Duplicate ordinal in EnumAction enum: "
+ ordinal);
                       }
                       stringMap.put(description,this);
                       ordMap.put(intOrdinal,this);
               }

}

public class A {

       private EnumAction action = EnumAction.UNKNOWN;


       public String toString(){

               System.out.println("Object A: => action is:" + action);

               return action.toString();

       }

       public EnumAction getAction() {
               return action;
       }

       public void setAction(EnumAction action) {
               this.action = action;
       }

}



______________________________________________________________________
You are receiving this email because you elected to monitor this forum.
To stop monitoring this forum, login to SourceForge.net and visit:
https://sourceforge.net/forum/unmonitor.php?forum_id=470286

hanso...@gmail.com

unread,
Sep 20, 2008, 12:27:27 AM9/20/08
to beanlib
Hi valysivec27,

1) Since EnumAction has no default constructor, you need to plug in
your own custom transformer for transforming EnumAction.
2) If the object graph you are cloning has no Hibernate related
classes, you can actually use the BeanReplicator instead of
HibernateBeanReplicator.

See examples below.

Cheers,
Hanson

A from = new A();
from.setAction(EnumAction.UNKNOWN);

{ // Plugin a custom transformer to HibernateBeanReplicator
HibernateBeanReplicator replicator = new
Hibernate3BeanReplicator()
.initCustomTransformer(new
MyCustomBeanTransformer.Factory());
A copy = replicator.deepCopy(from);
System.out.println("Copy is:" + copy);
}

{ // Plugin a custom transformer to BeanReplicator
BeanReplicator replicator =
BeanReplicator.newBeanReplicatable(

BeanTransformer.newBeanTransformer()
.initCustomTransformer(new
MyCustomBeanTransformer.Factory()));
A copy = replicator.replicateBean(from);
System.out.println("Copy is:" + copy);
}

// Custom Transformer
static class MyCustomBeanTransformer implements
CustomBeanTransformerSpi {
static class Factory implements
CustomBeanTransformerSpi.Factory {
public CustomBeanTransformerSpi
newCustomBeanTransformer(BeanTransformerSpi beanTransformer) {
return new MyCustomBeanTransformer();
}
}
public <T> boolean isTransformable(Object from, Class<T>
toClass, PropertyInfo propertyInfo) {
return from != null && toClass == EnumAction.class;
}
public <T> T transform(Object in, Class<T> toClass,
PropertyInfo propertyInfo) { return (T)in; }
}
Reply all
Reply to author
Forward
0 new messages