Author: curtisr7
Date: Fri Mar  5 16:32:37 2010
New Revision: 919475

URL: http://svn.apache.org/viewvc?rev=919475&view=rev
Log:
OPENJPA-1545: Refactored detach code out of BrokerImpl.

Added:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?rev=919475&r1=919474&r2=919475&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
 Fri Mar  5 16:32:37 2010
@@ -68,6 +68,7 @@
 import org.apache.openjpa.lib.util.ReferenceMap;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
+import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.meta.MetaDataRepository;
 import org.apache.openjpa.meta.SequenceMetaData;
 import org.apache.openjpa.meta.ValueMetaData;
@@ -85,6 +86,7 @@
 import org.apache.openjpa.util.ObjectNotFoundException;
 import org.apache.openjpa.util.OpenJPAException;
 import org.apache.openjpa.util.OptimisticException;
+import org.apache.openjpa.util.Proxy;
 import org.apache.openjpa.util.RuntimeExceptionTranslator;
 import org.apache.openjpa.util.StoreException;
 import org.apache.openjpa.util.UnsupportedException;
@@ -245,6 +247,8 @@
     private LifecycleEventManager _lifeEventManager = null;
     private int _lifeCallbackMode = 0;
 
+    private DetachManagerLite _dmLite = new DetachManagerLite();
+    
     private transient boolean _initializeWasInvoked = false;
     private transient boolean _fromWriteBehindCallback = false;
     private LinkedList<FetchConfiguration> _fcs;
@@ -3316,7 +3320,7 @@
             if (!sm.isPersistent())
                 itr.remove();
             else if (!sm.getMetaData().isDetachable()) {
-                sm.release(true);
+                sm.release(true); 
                 itr.remove();
             }
         }
@@ -3349,23 +3353,7 @@
         if (_transAdditions != null) {
             _transAdditions.clear();
         }
-
-        // Detach all.
-        TransferFieldManager fm = new TransferFieldManager();
-        for (StateManagerImpl s : states) {
-            ClassMetaData cmd = s.getMetaData();
-            if (s.isPersistent() && cmd.isDetachable()) {
-                //Clean up an fields that are LargeResultSets.
-                for (FieldMetaData fmd : cmd.getLrsFields()) {
-                    int index = fmd.getIndex();
-                    fm.storeObjectField(index, null);
-                    s.replaceField(s.getPersistenceCapable(), fm, index);
-                    fm.clear();
-                }
-                s.unproxyFields();
-                s.getPersistenceCapable().pcReplaceStateManager(null);
-            }
-        }
+        _dmLite.detachAll(states);
     }
     public Object attach(Object obj, boolean copyNew, OpCallbacks call) {
         if (obj == null)

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java?rev=919475&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java
 Fri Mar  5 16:32:37 2010
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.kernel;
+
+import java.util.Collection;
+
+import org.apache.openjpa.enhance.PersistenceCapable;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
+import org.apache.openjpa.util.Proxy;
+
+/**
+ * 
+ *
+ */
+public class DetachManagerLite {
+    final TransferFieldManager _fm;
+
+    public DetachManagerLite() {
+        _fm = new TransferFieldManager();
+    }
+
+    /**
+     * This method will detach all provided StateManagers in place.
+     * 
+     * @param states
+     *            The StateManagers to be detached.
+     */
+    public void detachAll(Collection<StateManagerImpl> states) {
+        for (StateManagerImpl sm : states) {
+            ClassMetaData cmd = sm.getMetaData();
+            if (sm.isPersistent() && cmd.isDetachable()) {
+                PersistenceCapable pc = sm.getPersistenceCapable();
+                // Detach proxy fields.
+                for (FieldMetaData fmd : cmd.getProxyFields()) {
+                    detachProxyField(fmd, pc, sm);
+                }
+                pc.pcReplaceStateManager(null);
+            }
+        }
+    }
+
+    /**
+     * Detach the provided proxy field.
+     * 
+     * @param fmd
+     *            The field to be detached.
+     * @param pc
+     *            The PersistenceCapable that the field belongs to.
+     * @param sm
+     *            The StateManagerImpl that the PersistenceCapable belongs to.
+     */
+    private void detachProxyField(FieldMetaData fmd, PersistenceCapable pc, 
StateManagerImpl sm) {
+        int fieldIndex = fmd.getIndex();
+        if (fmd.isLRS() == true) {
+            // need to null out LRS fields.
+            nullField(fieldIndex, pc, sm);
+        } else {
+            Object o = sm.fetchObject(fieldIndex);
+            if (o instanceof Proxy) {
+                // Get unproxied object and replace
+                Proxy proxy = (Proxy) o;
+                Object unproxied = proxy.copy(proxy);
+                _fm.storeObjectField(fieldIndex, unproxied);
+                sm.replaceField(pc, _fm, fieldIndex);
+                _fm.clear();
+                // clean up old proxy
+                proxy.setOwner(null, -1);
+                if (proxy.getChangeTracker() != null) {
+                    proxy.getChangeTracker().stopTracking();
+                }
+            }
+        }
+    }
+
+    /**
+     * Private worker method that replaces the value at fieldIndex in sm with 
null.
+     * 
+     * @param fieldIndex
+     *            The index of the field to be nulled out.
+     * @param pc
+     *            The PersistenceCapable that the field belongs to.
+     * @param sm
+     *            The StateManagerImpl that the PersistenceCapable belongs to.
+     */
+    private void nullField(int fieldIndex, PersistenceCapable pc, 
StateManagerImpl sm) {
+        _fm.storeObjectField(fieldIndex, null);
+        sm.replaceField(pc, _fm, fieldIndex);
+        _fm.clear();
+    }
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManagerLite.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to