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