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