Author: michiel
Date: 2009-06-05 15:02:10 +0200 (Fri, 05 Jun 2009)
New Revision: 35770

Modified:
   
mmbase/trunk/core/src/main/java/org/mmbase/datatypes/processors/RelatedField.java
Log:
Made it work better in a Transaction

Modified: 
mmbase/trunk/core/src/main/java/org/mmbase/datatypes/processors/RelatedField.java
===================================================================
--- 
mmbase/trunk/core/src/main/java/org/mmbase/datatypes/processors/RelatedField.java
   2009-06-05 12:36:30 UTC (rev 35769)
+++ 
mmbase/trunk/core/src/main/java/org/mmbase/datatypes/processors/RelatedField.java
   2009-06-05 13:02:10 UTC (rev 35770)
@@ -31,6 +31,7 @@
 
     private static final Logger log = 
Logging.getLoggerInstance(RelatedField.class);
 
+
     public abstract static class  AbstractProcessor extends 
Related.AbstractProcessor {
 
         protected NodeQuery getRelatedQuery(Node node) {
@@ -47,23 +48,47 @@
         public void setField(String f) {
             otherField  = f;
         }
+
+        protected String getKey(Node node, Field field) {
+            return RelatedField.class.getName() + node.getValue("_number") + 
"." + role + "." + getRelatedType(node) + "." + searchDir;
+        }
+
+        protected Node getRelatedNode(final Node node, final Field field) {
+            String key = getKey(node, field);
+            Node relatedNode = (Node) node.getCloud().getProperty(key);
+            if (relatedNode != null) {
+                log.debug("Found node in  in " + key);
+                return relatedNode;
+            } else {
+                NodeQuery related = getRelatedQuery(node);
+                NodeList rl = related.getNodeManager().getList(related);
+                if (rl.size() > 0) {
+                    relatedNode = rl.getNode(0);
+                    if (node.getCloud() instanceof Transaction) {
+                        node.getCloud().setProperty(key,  relatedNode);
+                    }
+                    log.debug("Found relatedNode " + relatedNode);
+                } else {
+                    log.debug("Not related");
+                }
+                return relatedNode;
+
+            }
+        }
     }
 
 
+
     /**
      * This get-processor can be used to implictely create the wanted related 
node too.
      */
     public static class Creator extends AbstractProcessor {
         private static final long serialVersionUID = 1L;
         public Object process(final Node node, final Field field, final Object 
value) {
-            NodeQuery related = getRelatedQuery(node);
-            NodeList rl = related.getNodeManager().getList(related);
-            if (rl.size() == 0) {
+            Node relatedNode = getRelatedNode(node, field);
+            if (relatedNode == null) {
+                NodeQuery related = getRelatedQuery(node);
                 log.service("No related node of type " + getRelatedType(node) 
+ " for node " + node.getNumber() + ". Implicitely creating now.");
-                if (node.isNew() && node.getNumber() < 0) {
-                    node.commit(); // Silly, but you cannot make relations to 
new nodes.
-
-                }
                 Cloud cloud = node.getCloud();
                 Node newNode = getRelatedType(node).createNode();
                 newNode.commit();
@@ -72,8 +97,12 @@
                 for (Map.Entry<String, String> entry : 
relationConstraints.entrySet()) {
                     newrel.setStringValue(entry.getKey(), entry.getValue());
                 }
-                log.debug("Created " + newrel);
+                log.service("Created " + newrel);
                 newrel.commit();
+                if (node.getCloud() instanceof Transaction) {
+                    node.getCloud().setProperty(getKey(node, field),  newNode);
+                }
+                log.info("" + node.getCloud().getProperties());
             }
             return value;
         }
@@ -88,10 +117,8 @@
                 log.debug("Setting "  + value);
             }
 
-            NodeQuery related = getRelatedQuery(node);
-            NodeList rl = related.getNodeManager().getList(related);
-            if (rl.size() > 0) {
-                Node otherNode = rl.getNode(0);
+            Node otherNode = getRelatedNode(node, field);
+            if (otherNode != null) {
                 String fieldName = otherField == null ? field.getName() : 
otherField;
                 otherNode.setValue(fieldName, value);
                 otherNode.commit();
@@ -111,14 +138,8 @@
             if (log.isDebugEnabled()) {
                 log.debug("getting "  + node);
             }
-            if (node.isNew()) {
-                log.debug("The node is new, returning " + 
field.getDataType().getDefaultValue());
-                return field.getDataType().getDefaultValue();
-            }
-            NodeQuery related = getRelatedQuery(node);
-            NodeList rl = related.getNodeManager().getList(related);
-            if (rl.size() > 0) {
-                Node otherNode = rl.getNode(0);
+            Node otherNode = getRelatedNode(node, field);
+            if (otherNode != null) {
                 String fieldName = otherField == null ? field.getName() : 
otherField;
                 return otherNode.getValue(fieldName);
             } else {

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

Reply via email to