Author: aadamchik
Date: Thu Sep 17 14:13:52 2009
New Revision: 816206

URL: http://svn.apache.org/viewvc?rev=816206&view=rev
Log:
prototyping (de)serializer based on XStream

cleaner transaction handling

Modified:
    
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentDeserializeConverter.java
    
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentSerializeConverter.java
    
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/XStreamDeserializer.java

Modified: 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentDeserializeConverter.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentDeserializeConverter.java?rev=816206&r1=816205&r2=816206&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentDeserializeConverter.java
 (original)
+++ 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentDeserializeConverter.java
 Thu Sep 17 14:13:52 2009
@@ -53,6 +53,7 @@
                this.commitCountThreshold = commitCountThreshold;
        }
 
+       @SuppressWarnings("all")
        public boolean canConvert(Class objectClass) {
                return Persistent.class.isAssignableFrom(objectClass);
        }

Modified: 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentSerializeConverter.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentSerializeConverter.java?rev=816206&r1=816205&r2=816206&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentSerializeConverter.java
 (original)
+++ 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/PersistentSerializeConverter.java
 Thu Sep 17 14:13:52 2009
@@ -143,7 +143,6 @@
                        context.convertAnother(byReference ? 
value.getObjectId() : value);
                        writer.endNode();
                }
-
        }
 
        private void marshalToMany(Object object, ArcProperty arc,

Modified: 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/XStreamDeserializer.java
URL: 
http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/XStreamDeserializer.java?rev=816206&r1=816205&r2=816206&view=diff
==============================================================================
--- 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/XStreamDeserializer.java
 (original)
+++ 
cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream/XStreamDeserializer.java
 Thu Sep 17 14:13:52 2009
@@ -20,42 +20,91 @@
 
 import java.io.InputStream;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.access.Transaction;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.serialization.BaseDeserializer;
 import org.apache.cayenne.serialization.Subgraph;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.xml.XppDriver;
 
 public class XStreamDeserializer extends BaseDeserializer {
 
+       static final Log logger = LogFactory.getLog(XStreamDeserializer.class);
+
+       @SuppressWarnings("all")
        @Override
        public <T> T deserialize(ObjectContext context, Subgraph<T> subgraph,
                        InputStream in) {
 
-               // TODO: make sure all the converters are stateless... then we 
can cache
-               // xstream instances by subgraph and reuse them
+               long t0 = System.currentTimeMillis();
+
                XStream xstream = createXStream(subgraph.getRootNode()
                                .getClassDescriptor());
 
                int commitCountThreshold = isCommitting() ? 
getCommitCountThreshold()
                                : 0;
 
-               xstream.registerConverter(new PersistentDeserializeConverter(
-                               subgraph.getRootNode(), context, 
commitCountThreshold));
+               xstream.registerConverter(new 
PersistentDeserializeConverter(subgraph
+                               .getRootNode(), context, commitCountThreshold));
                xstream.registerConverter(new ObjectIdConverter(context
                                .getEntityResolver()));
 
-               T object = (T) xstream.fromXML(in);
+               T object;
 
                if (isCommitting()) {
-                       context.commitChanges();
+                       object = (T) deserilaizeInTransaction(context, xstream, 
in);
+               } else {
+                       object = (T) deserialize(xstream, in);
                }
 
+               long t1 = System.currentTimeMillis();
+               logger.info("Deserialized in " + (t1 - t0) + " ms.");
+
                return object;
        }
 
+       protected Object deserilaizeInTransaction(ObjectContext context,
+                       XStream xstream, InputStream in) {
+
+               // since multiple intermediate context commits are possible, 
wrap them
+               // in a manual transaction to allow for atomic rollback
+
+               Transaction tx = ((DataContext) context).getParentDataDomain()
+                               .createTransaction();
+
+               Transaction.bindThreadTransaction(tx);
+
+               try {
+                       Object result = deserialize(xstream, in);
+                       context.commitChanges();
+                       tx.commit();
+                       return result;
+
+               } catch (Exception ex) {
+                       tx.setRollbackOnly();
+                       throw new CayenneRuntimeException("Error 
deserializing", ex);
+               } finally {
+                       Transaction.bindThreadTransaction(null);
+
+                       if (tx.getStatus() == 
Transaction.STATUS_MARKED_ROLLEDBACK) {
+                               try {
+                                       tx.rollback();
+                               } catch (Exception rollbackEx) {
+                               }
+                       }
+               }
+       }
+
+       protected Object deserialize(XStream xstream, InputStream in) {
+               return xstream.fromXML(in);
+       }
+
        protected XStream createXStream(ClassDescriptor rootDescriptor) {
                XStream xstream = new XStream(new XppDriver());
 


Reply via email to