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