You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by sk...@apache.org on 2006/09/30 07:29:12 UTC

svn commit: r451543 - in /incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel: PCState.java PNewProvisionalState.java SingleFieldManager.java StateManagerImpl.java

Author: skim
Date: Fri Sep 29 22:29:10 2006
New Revision: 451543

URL: http://svn.apache.org/viewvc?view=rev&rev=451543
Log:
fixed duplicate preFlush and bug wrt persist vs nonprovisional in 
singlefieldmanager

Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PCState.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PNewProvisionalState.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PCState.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PCState.java?view=diff&rev=451543&r1=451542&r2=451543
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PCState.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PCState.java Fri Sep 29 22:29:10 2006
@@ -235,10 +235,10 @@
 
     /**
      * Return the state to transition to after making no longer provisional. 
-     * The context is not given because no actions should be taken.
+     * Returns the <code>this</code> pointer by default.
      */
-    PCState nonprovisional(StateManagerImpl context, boolean flush, 
-        boolean logical, OpCallbacks call) {
+    PCState nonprovisional(StateManagerImpl context, boolean logical, 
+        OpCallbacks call) {
         return this;
     }
 

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PNewProvisionalState.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PNewProvisionalState.java?view=diff&rev=451543&r1=451542&r2=451543
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PNewProvisionalState.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/PNewProvisionalState.java Fri Sep 29 22:29:10 2006
@@ -24,17 +24,21 @@
  * @author: Abe White
  */
 class PNewProvisionalState
-    extends PNewState {
+    extends PCState {
+
+    void initialize(StateManagerImpl context) {
+        context.setLoaded(true);
+        context.setDirty(true);
+        context.saveFields(false);
+    }
 
     PCState persist(StateManagerImpl context) {
         return PNEW;
     }
 
-    PCState nonprovisional(StateManagerImpl context, boolean flush, 
-        boolean logical, OpCallbacks call) {
-        if (flush)
-            beforeFlush(context, logical, call);
-
+    PCState nonprovisional(StateManagerImpl context, boolean logical, 
+        OpCallbacks call) {
+        context.preFlush(logical, call);
         return PNEW;
     }
 
@@ -44,6 +48,35 @@
 
     PCState commitRetain(StateManagerImpl context) {
         return TRANSIENT;
+    }
+
+    PCState rollback(StateManagerImpl context) {
+        return TRANSIENT;
+    }
+
+    PCState rollbackRestore(StateManagerImpl context) {
+        context.restoreFields();
+        return TRANSIENT;
+    }
+
+    PCState release(StateManagerImpl context) {
+        return TRANSIENT;
+    }
+
+    boolean isTransactional() {
+        return true;
+    }
+
+    boolean isPersistent() {
+        return true;
+    }
+
+    boolean isNew() {
+        return true;
+    }
+
+    boolean isDirty() {
+        return true;
     }
 
     boolean isProvisional() {

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java?view=diff&rev=451543&r1=451542&r2=451543
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java Fri Sep 29 22:29:10 2006
@@ -748,8 +748,13 @@
                         Exceptions.toString(obj), vmd,
                         Exceptions.toString(_sm.getManagedInstance()))).
                     setFailedObject(obj);
-        } else
-            sm = _broker.persist(obj, null, true, call);
+        } else {
+            sm = _broker.getStateManager(obj);
+            if (sm != null && sm.isProvisional())
+                ((StateManagerImpl) sm).nonprovisional(logical, call);
+            else
+                sm = _broker.persist(obj, null, true, call);
+        }
 
         if (sm != null) {
             // if deleted and not managed inverse, die
@@ -759,7 +764,6 @@
                     Exceptions.toString(obj), vmd,
                     Exceptions.toString(_sm.getManagedInstance()))).
                     setFailedObject(obj);
-            ((StateManagerImpl) sm).nonprovisional(true, logical, call);
             ((StateManagerImpl) sm).setDereferencedDependent(false, true);
         }
     }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?view=diff&rev=451543&r1=451542&r2=451543
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java Fri Sep 29 22:29:10 2006
@@ -486,7 +486,8 @@
      * @param recache whether to recache ourself on the new oid
      */
     private void assertObjectIdAssigned(boolean recache) {
-        if (!isNew() || isDeleted() || (_flags & FLAG_OID_ASSIGNED) > 0)
+        if (!isNew() || isDeleted() || isProvisional() || 
+            (_flags & FLAG_OID_ASSIGNED) > 0)
             return;
         if (_oid == null) {
             if (_meta.getIdentityType() == ClassMetaData.ID_DATASTORE)
@@ -905,7 +906,7 @@
         Object orig = _id;
         assertObjectIdAssigned(false);
 
-        boolean wasNew = isNew() && !isDeleted();
+        boolean wasNew = isNew() && !isDeleted() && !isProvisional();
         if (_broker.getRetainState())
             setPCState(_state.commitRetain(this));
         else
@@ -997,10 +998,9 @@
      * Delegates to the current state.
      *
      * @see PCState#nonprovisional
-     * @see Broker#nonprovisional
      */
-    void nonprovisional(boolean flush, boolean logical, OpCallbacks call) {
-        setPCState(_state.nonprovisional(this, flush, logical, call));
+    void nonprovisional(boolean logical, OpCallbacks call) {
+        setPCState(_state.nonprovisional(this, logical, call));
     }
 
     /**
@@ -2633,9 +2633,10 @@
      * for all strategies that don't require flushing.
      */
     void preFlush(boolean logical, OpCallbacks call) {
-        boolean second = (_flags & FLAG_PRE_FLUSHED) != 0;
+        if ((_flags & FLAG_PRE_FLUSHED) != 0)
+            return;
 
-        if (isPersistent() && !second) {
+        if (isPersistent()) {
             fireLifecycleEvent(LifecycleEvent.BEFORE_STORE);
             _flags |= FLAG_PRE_FLUSHED;
         }