Author: michiel
Date: 2010-02-02 15:02:06 +0100 (Tue, 02 Feb 2010)
New Revision: 40797

Modified:
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicCloud.java
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicNode.java
   
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicTransaction.java
Log:
MMB-1921

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicCloud.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicCloud.java
      2010-02-02 14:00:41 UTC (rev 40796)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicCloud.java
      2010-02-02 14:02:06 UTC (rev 40797)
@@ -176,18 +176,13 @@
     }
 
     public Node getNode(String nodeNumber) throws NotFoundException {
-        MMObjectNode node;
-        try {
-            node = BasicCloudContext.tmpObjectManager.getNode(getAccount(), 
nodeNumber);
-        } catch (RuntimeException e) {
-            throw new NotFoundException("Something went wrong while getting 
node with number '" + nodeNumber + "': " + e.getMessage() + " by cloud with 
account " + getAccount(), e);
-        }
-
+        MMObjectBuilder bul = BasicCloudContext.mmb.getBuilder("object");
+        MMObjectNode node = bul.getNode(nodeNumber);
         if (node == null) {
             throw new NotFoundException("Node with number '" + nodeNumber + "' 
does not exist.");
         } else {
+            BasicCloudContext.tmpObjectManager.deleteTmpNode(getAccount(), "" 
+ node.getNumber());
             BasicNode n = makeNode(node, nodeNumber);
-            add(n);
             return n;
         }
     }
@@ -1023,10 +1018,24 @@
     }
 
     /**
-     * Ignored by basic cloud. See {...@link BasicTransaction#add(String)}.
+     * Marks the given node as 'being edited'. This means that a copy
+     * must be made which is going to contain the changes until the
+     * node (or the transaction) is committed.
      */
     int  add(BasicNode node) {
-        return node.getNumber();
+        int number = node.getNumber();
+        if (node.temporaryNodeId == -1) {
+
+            String currentObjectContext = 
BasicCloudContext.tmpObjectManager.getObject(getAccount(), "" + number, "" + 
number);
+            MMObjectNode newNodeRef = 
BasicCloudContext.tmpObjectManager.getNode(getAccount(), "" + number);
+            node.setNode(newNodeRef);
+            //System.out.println("Creating temporary object for cloud :" + 
newNodeRef);
+            node.temporaryNodeId = number;
+            if (node.noderef != newNodeRef) {
+                log.info("Created new noderef for " + node + " " + newNodeRef);
+            }
+        }
+        return number;
     }
 
 
@@ -1066,7 +1075,7 @@
     /**
      */
     void deleteNewNode(int temporaryNodeId, MMObjectNode node) {
-        BasicCloudContext.tmpObjectManager.deleteTmpNode(account, "" + 
temporaryNodeId);
+        BasicCloudContext.tmpObjectManager.deleteTmpNode(getAccount(), "" + 
temporaryNodeId);
     }
 
     /**
@@ -1075,7 +1084,7 @@
     void deleteNode(int temporaryNodeId, MMObjectNode node) {
         // remove the node
         if (temporaryNodeId != -1) {
-            BasicCloudContext.tmpObjectManager.deleteTmpNode(account, "" + 
temporaryNodeId);
+            BasicCloudContext.tmpObjectManager.deleteTmpNode(getAccount(), "" 
+ temporaryNodeId);
         }
         remove(node);
     }
@@ -1193,8 +1202,11 @@
     }
 
     /**
-     * This method is called after a commit of a certain node is ready. It 
calls notifyAll now.
-     * This makes it easy to wait for a node to really exist (finished 
committing)
+     * This method is called after a {...@basicnode#commit} of a certain
+     * node.  If we are not in a transaction this
+     * performing the actual commit procedure (using the temporary object
+     * manager), and calls {...@link #notifyAll()}.
+     * This last thing makes it easy to wait for a node to really exist 
(finished committing)
      * <pre>
                 synchronized(ntCloud) {
                     while (! ntCloud.hasNode(node)) {
@@ -1202,10 +1214,38 @@
                     }
                 }
      </pre>
+     * Committing in a transaction goes a bit different, because the
+     * actual committing only happens in the
+     * {...@basictransaction#commit}, this method will be mostly empty
+     * for BasicTransaction.
      *
      * @since MMBase-1.9.2
      */
-    protected synchronized void afterCommit(BasicNode node) {
+    protected synchronized void afterCommit(BasicNode n) {
+        log.debug("not in a transaction so actually committing now");
+        MMObjectNode node = n.getNode();
+        //assert isNew() == node.getNumber() < 0 : "" + isNew() + " " + 
node.getNumber() + " " + node;
+        if (n.isNew()) {
+            log.debug("new");
+            node.insert(getUser());
+            // cloud.createSecurityInfo(getNumber());
+        } else {
+            log.debug("not new");
+            node.commit(getUser());
+            //cloud.updateSecurityInfo(getNumber());
+        }
+        // remove the temporary node
+        BasicCloudContext.tmpObjectManager.deleteTmpNode(account, "" + 
n.temporaryNodeId);
+        n.temporaryNodeId = -1;
+        if (n.originalNoderef != null) {
+            for (Map.Entry<String, Object> e : 
n.noderef.getValues().entrySet()) {
+                n.originalNoderef.storeValue(e.getKey(), e.getValue());
+            }
+            n.noderef = n.originalNoderef;
+            n.originalNoderef = null;
+        }
+
+        log.debug("Notifying");
         notifyAll();
     }
 

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicNode.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicNode.java
       2010-02-02 14:00:41 UTC (rev 40796)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicNode.java
       2010-02-02 14:02:06 UTC (rev 40797)
@@ -58,6 +58,10 @@
     protected MMObjectNode noderef;
 
     /**
+     */
+    protected MMObjectNode originalNoderef;
+
+    /**
      * Temporary node ID.
      * This is necessary since there is otherwise no sure (and quick) way to 
determine
      * whether a node is in 'edit' mode (i.e. has a temporary node).
@@ -188,6 +192,9 @@
         if (n == null) {
             throw new IllegalArgumentException("Passed Node is null");
         }
+        if (originalNoderef != null) {
+            originalNoderef = noderef;
+        }
         noderef = n;
     }
 
@@ -489,7 +496,12 @@
     }
 
 
-
+    /**
+     * {...@inheritdoc}
+     *
+     * This implementation checks  create rights, then validates the values, 
then
+     * processes the 'commit processors' and then calls {...@link 
BasicCloud#afterCommit(BasicNode)}
+     */
     @Override
     public void commit() {
         if (isNew()) {
@@ -516,24 +528,6 @@
         if (log.isDebugEnabled()) {
             log.debug("committing " + noderef.getChanged() + " " + 
noderef.getValues());
         }
-        // ignore commit in transaction (transaction commits)
-        if (!(cloud instanceof Transaction)) { // sigh sigh sigh.
-            log.debug("not in a transaction so actually committing now");
-            MMObjectNode node = getNode();
-            //assert isNew() == node.getNumber() < 0 : "" + isNew() + " " + 
node.getNumber() + " " + node;
-            if (isNew()) {
-                log.debug("new");
-                node.insert(cloud.getUser());
-                // cloud.createSecurityInfo(getNumber());
-            } else {
-                log.debug("not new");
-                node.commit(cloud.getUser());
-                //cloud.updateSecurityInfo(getNumber());
-            }
-            // remove the temporary node
-            BasicCloudContext.tmpObjectManager.deleteTmpNode(account, "" + 
temporaryNodeId);
-            temporaryNodeId = -1;
-        }
         cloud.afterCommit(this);
     }
 
@@ -1043,6 +1037,7 @@
             if (!(cloud instanceof Transaction)) {
                 // cancel the modifications...
                 cancel();
+                // TODO: WE NEED A DECENT locking, change-tracking mechanism.
             }
         }
     }

Modified: 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicTransaction.java
===================================================================
--- 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicTransaction.java
        2010-02-02 14:00:41 UTC (rev 40796)
+++ 
mmbase/branches/MMBase-1_9/core/src/main/java/org/mmbase/bridge/implementation/BasicTransaction.java
        2010-02-02 14:02:06 UTC (rev 40797)
@@ -195,10 +195,10 @@
                     log.debug("Commit transaction '" + transactionName + "' 
with " + getCoreNodes().size() + " nodes");
                 }
 
-
                 BasicCloudContext.transactionManager.commit(userContext, 
transactionName);
 
 
+
             } catch (TransactionManagerException e) {
                 // do we drop the transaction here or delete the trans context?
                 // return false;
@@ -207,6 +207,7 @@
         }
 
         committed = true;
+        notifyAll();
         return true;
     }
 
@@ -249,8 +250,10 @@
             String currentObjectContext = 
BasicCloudContext.tmpObjectManager.getObject(getAccount(), id);
             // store new temporary node in transaction
             add(currentObjectContext);
-            
node.setNode(BasicCloudContext.tmpObjectManager.getNode(getAccount(), id));
+            MMObjectNode newNodeRef = 
BasicCloudContext.tmpObjectManager.getNode(getAccount(), id);
+            node.setNode(newNodeRef);
             //  check nodetype afterwards?
+            node.temporaryNodeId = node.getNumber();
 
             if (! nodes.containsKey(node.getStringValue("_number"))) {
                 nodes.put(node.getStringValue("_number"), node);
@@ -422,7 +425,7 @@
     @Override
     public String toString() {
         UserContext uc = getUser();
-        return  "BasicTransaction " + count +  "'" + getName() + "' of " + (uc 
!= null ? uc.getIdentifier() : "NO USER YET") + " @" + 
Integer.toHexString(hashCode());
+        return  "BasicTransaction " + count +  "'" + getName() + "' " + " @" + 
Integer.toHexString(hashCode()) + " of " + parentCloud;
     }
 
     @Override
@@ -476,15 +479,29 @@
     @Override
     public Node getNode(String nodeNumber) throws NotFoundException {
         if (nodeNumber == null) {
-            return super.getNode(nodeNumber);
+            throw new NotFoundException();
         }
         String[] na  = nodeNumber.split("_");
         if (na.length > 1) {
             if (super.hasNode(na[na.length -1])) {
-                return super.getNode(na[na.length - 1]);
+                nodeNumber = na[na.length - 1];
             }
         }
-        return super.getNode(nodeNumber);
+
+        MMObjectNode node;
+        try {
+            node = BasicCloudContext.tmpObjectManager.getNode(getAccount(), 
nodeNumber);
+        } catch (RuntimeException e) {
+            throw new NotFoundException("Something went wrong while getting 
node with number '" + nodeNumber + "': " + e.getMessage() + " by cloud with 
account " + getAccount(), e);
+        }
+
+        BasicNode n = makeNode(node, nodeNumber);
+        add(n);
+        return n;
     }
+
+    @Override
+    protected synchronized void afterCommit(BasicNode n) {
+    }
 }
 

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to