You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/09/17 16:13:53 UTC

svn commit: r816206 - in /cayenne/sandbox/cayenne-serialization/src/main/java/org/apache/cayenne/serialization/xstream: PersistentDeserializeConverter.java PersistentSerializeConverter.java XStreamDeserializer.java

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