Author: dwoods
Date: Mon Mar 22 13:44:04 2010
New Revision: 926075
URL: http://svn.apache.org/viewvc?rev=926075&view=rev
Log:
OPENJPA-1097 Merge in latest updates from trunk, which uses DetachedStateField
to help determine whether to remove wrappers during serialization
Modified:
openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/util/Proxies.java
Modified:
openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/util/Proxies.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/util/Proxies.java?rev=926075&r1=926074&r2=926075&view=diff
==============================================================================
---
openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/util/Proxies.java
(original)
+++
openjpa/branches/1.3.x/openjpa-kernel/src/main/java/org/apache/openjpa/util/Proxies.java
Mon Mar 22 13:44:04 2010
@@ -23,6 +23,7 @@ import java.security.AccessController;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.ClassMetaData;
/**
* Utility methods for managing proxies.
@@ -80,15 +81,44 @@ public class Proxies {
* Used by proxy types to serialize non-proxy versions.
*/
public static Object writeReplace(Proxy proxy, boolean detachable) {
- /* OPENJPA-1097 Always remove $proxy classes during serialization if
detachable
- if (detachable && (proxy == null || proxy.getOwner() == null
- || proxy.getOwner().isDetached()))
- return proxy;
- */
- if (!detachable || proxy == null || proxy.getOwner() == null) {
+ /* OPENJPA-1097 Remove $proxy classes during serialization based on:
+ * 1) No Proxy, then return as-is
+ * 2) Runtime created proxy, then unproxy
+ * 3) No StateManager (DetachedStateField==false), then return as-is
+ * 4) If detached, then unproxy
+ * 5) If ClassMetaData exists and DetachedStateField != TRUE
+ * (default of DetachedStateField==transient), then unproxy
+ * 6) Else, return as-is
+ *
+ * Original code -
+ *
+ * if (detachable && (proxy == null || proxy.getOwner() == null
+ * || proxy.getOwner().isDetached()))
+ * return proxy;
+ *
+ */
+ if (proxy == null) {
return proxy;
- } else {
+ } else if (!detachable) {
+ // OPENJPA-1571 - using our runtime generated proxies, so remove
any $proxy
+ return proxy.copy(proxy);
+ } else if (proxy.getOwner() == null) {
+ // no StateManager (DetachedStateField==false), so no $proxy to
remove
+ return proxy;
+ } else if (proxy.getOwner().isDetached()) {
+ // already detached, so remove any $proxy
return proxy.copy(proxy);
+ } else {
+ // using a StateManager, so determine what DetachedState is being
used
+ OpenJPAStateManager sm = proxy.getOwner(); // !null checked for
above
+ ClassMetaData meta = sm.getMetaData(); // if null, no proxies?
+ if ((meta != null) &&
(!Boolean.TRUE.equals(meta.usesDetachedState()))) {
+ // configured to use transient (null) or no (FALSE)
StateManger, so remove any $proxy
+ return proxy.copy(proxy);
+ } else {
+ // DetachedStateField==true, which means to keep the SM and
$proxy in the serialized objects
+ return proxy;
+ }
}
}
}