Hello,

I was searching the archives on what would be the best way to move 
objects between data contexts. Beside 
http://cwiki.apache.org/CAYDOC/moving-objects-between-contexts.html I 
found this thread and as I don't have much experience in moving objects, 
I wonder what the current recommendation is? Are there different 
approaches for some scenarios (web application, standalone application) 
or is there one best way of doing it?

Thanks!
Borut


On 30.12.2005 7:20, Andrus Adamchik wrote:
Hi Marcin,

I was on vacation and didn't read the mailing list for a while. During that time I came up with a solution that is closer to what DataContext does. It is somewhat similar to what you suggest, but relies on ClassDescriptor.copyProperties. It does not involve serialization or class generation. I just checked in this code to CVS, it will be in the 12/30/2005 nightly build. Let me know how this worked.

Andrus


On Dec 23, 2005, at 5:57 AM, Marcin Skladaniec wrote:

Hi Andrus !

On 19/12/2005, at 8:21 PM, Andrus Adamchik wrote:



This is another omission in the API. I'll make sure this is added in the next milestone. For now you can do something like that (untested!) -

Persistent clone = (Persistent) Util.cloneViaSerialization(object);
clone.setObjectContext(otherContext);
otherContext.getGraphManager().registerNode(clone.getObjectId(), clone);


I investigated this bit of code and found that PersistentObjects are not Serializable...
I made an ugly, but working approach to make them serializable. Added few lines to client-superclass.vm:
(You can see that two first methods are only modified methods from CayenneDataObject)

private void writeObject(ObjectOutputStream out) throws IOException {
       out.writeInt(getPersistenceState());

       switch (getPersistenceState()) {
           // New, modified or transient or deleted - write the whole shebang
           // The other states (committed, hollow) all need just ObjectId
           case PersistenceState.TRANSIENT:
           case PersistenceState.NEW:
           case PersistenceState.MODIFIED:
           case PersistenceState.DELETED:

               out.writeObject(getPropertyHashtable());
               break;
       }

       out.writeObject(getObjectId());
   }

   private void readObject(ObjectInputStream in) throws IOException,
           ClassNotFoundException {
       this.setPersistenceState(in.readInt());

       switch (getPersistenceState()) {
           case PersistenceState.TRANSIENT:
           case PersistenceState.NEW:
           case PersistenceState.MODIFIED:
           case PersistenceState.DELETED:

               setPropertyMap((Map)in.readObject());
               break;
           case PersistenceState.COMMITTED:
           case PersistenceState.HOLLOW:
                  this.setPersistenceState(PersistenceState.HOLLOW);
               // props will be populated when required (readProperty called)
               setPropertyMap(new HashMap());
               break;
       }

       this.setObjectId((ObjectId) in.readObject());

       // DataContext will be set *IF* the DataContext it came from is also
       // deserialized. Setting of DataContext is handled by the DataContext
       // itself
   }



    public Map getPropertyMap() {
        Hashtable t=new Hashtable() ;
#foreach( $attr in ${objEntity.DeclaredAttributes} )
        if (get${stringUtils.capitalized($attr.Name)}() != null) {
            t.put(${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY, get${stringUtils.capitalized($attr.Name)}());
        }
#end
#foreach( $rel in ${objEntity.DeclaredRelationships} )
        if (get${stringUtils.capitalized($rel.Name)}() != null) {
            t.put(${stringUtils.capitalizedAsConstant($rel.Name)}_PROPERTY, get${stringUtils.capitalized($rel.Name)}());
        }
#end
        return t;
    }
    
    public void setPropertyMap(Map map) {
    #foreach( $attr in ${objEntity.DeclaredAttributes} )
        if (map.containsKey(${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY)) {
            set${stringUtils.capitalized($attr.Name)}( ($importUtils.formatJavaType(${attr.Type}))  map.get(${stringUtils.capitalizedAsConstant($attr.Name)}_PROPERTY));
        }
    #end
    }


My idea :
- add get/setPropertyMap() methods with empty bodies to PersistentObject
- add get/setPropertyMap() methods to client-superclass.vm
- add read/writeObject() to PersistentObject
and voila, serialization, and (and therefore localObjects()) works for 3t
What do you think ? Is there a better solution ?

Cheers
Marcin Skladaniec




--
bLOG
--
Naključna izjava tedna iz tednika Mladina:

Reply via email to