Update of /var/cvs/src/org/mmbase/datatypes/processors
In directory james.mmbase.org:/tmp/cvs-serv12943

Modified Files:
        Related.java 
Log Message:
added also an 'relationsConstraints' parameter to the Setter and Getter


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/datatypes/processors


Index: Related.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/datatypes/processors/Related.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- Related.java        4 Mar 2009 11:32:09 -0000       1.6
+++ Related.java        7 Apr 2009 16:03:13 -0000       1.7
@@ -10,8 +10,10 @@
 package org.mmbase.datatypes.processors;
 
 import org.mmbase.bridge.*;
+import org.mmbase.bridge.util.*;
 import org.mmbase.datatypes.*;
 import org.mmbase.util.*;
+import org.mmbase.storage.search.*;
 import java.util.*;
 import org.mmbase.util.logging.*;
 
@@ -23,7 +25,7 @@
  *
  * @author Michiel Meeuwissen
  * @since MMBase-1.8.7
- * @version $Id: Related.java,v 1.6 2009/03/04 11:32:09 michiel Exp $
+ * @version $Id: Related.java,v 1.7 2009/04/07 16:03:13 michiel Exp $
  */
 
 public class Related {
@@ -35,6 +37,7 @@
         protected String role = "related";
         protected String type = "object";
         protected String searchDir = "destination";
+        protected final Map<String, String> relationConstraints = new 
HashMap<String, String>();
         public void setRole(String r) {
             role = r;
         }
@@ -44,6 +47,18 @@
         public void setSearchDir(String d) {
             searchDir = d;
         }
+        public void setRelationConstraints(Map<String, String> map) {
+            relationConstraints.putAll(map);
+        }
+
+        protected NodeQuery getRelationsQuery(Node node) {
+            Cloud cloud = node.getCloud();
+            NodeQuery nq = Queries.createRelationNodesQuery(node, 
cloud.getNodeManager(type), role, searchDir);
+            for (Map.Entry<String, String> entry : 
relationConstraints.entrySet()) {
+                Queries.addConstraint(nq, Queries.createConstraint(nq, 
entry.getKey(), FieldCompareConstraint.EQUAL, entry.getValue()));
+            }
+            return nq;
+        }
     }
 
     public static class Setter extends AbstractProcessor {
@@ -53,16 +68,29 @@
             if (log.isDebugEnabled()) {
                 log.debug("Setting "  + value);
             }
-            RelationList rl = node.getRelations(role, 
node.getCloud().getNodeManager(type), searchDir);
 
+            NodeQuery relations = getRelationsQuery(node);
+            NodeList rl = relations.getNodeManager().getList(relations);
             if (value != null) {
                 Cloud cloud = node.getCloud();
                 Node dest = Casting.toNode(value, cloud);
-                NodeList nl = node.getRelatedNodes(type, role, searchDir);
-                if (nl.contains(dest)) {
+
+                boolean related = false;
+                if (rl.size() == 1) {
+                    Relation r = rl.getNode(0).toRelation();
+                    if (r.getDestination().getNumber() == dest.getNumber() ||
+                        r.getSource().getNumber() == dest.getNumber()) {
+                        related = true;
+                    }
+                } else if (rl.size() > 1) {
+                    log.warn("More than one correct relations between " + node 
+ " and " + type + " " + rl + ". Will fix this now");
+                }
+                if (related) {
+                    log.debug("" + dest + " already correctly related");
                     // nothing changed
                 } else {
-                    for (Relation r : rl) {
+                    for (Node r : rl) {
+                        log.debug("Deleting " + r);
                         r.delete();
                     }
                     RelationManager rel = 
cloud.getRelationManager(node.getNodeManager(),
@@ -70,11 +98,15 @@
                                                                    role);
                     if (node.isNew()) node.commit(); // Silly, but you cannot 
make relations to new nodes.
                     Relation newrel = node.createRelation(dest, rel);
+                    for (Map.Entry<String, String> entry : 
relationConstraints.entrySet()) {
+                        newrel.setStringValue(entry.getKey(), 
entry.getValue());
+                    }
+                    log.debug("Created " + newrel);
                     newrel.commit();
                 }
                 return dest;
             } else {
-                for (Relation r : rl) {
+                for (Node r : rl) {
                     r.delete();
                 }
                 return null;
@@ -91,14 +123,20 @@
                 log.debug("getting "  + node);
             }
             if (node.isNew()) {
-                log.info("The node is new, returning " + 
field.getDataType().getDefaultValue());
+                log.debug("The node is new, returning " + 
field.getDataType().getDefaultValue());
                 return field.getDataType().getDefaultValue();
             }
-            NodeList nl = node.getRelatedNodes(type, role, searchDir);
-            if (nl.size() == 0) {
+            NodeQuery relations = getRelationsQuery(node);
+            NodeList rl = relations.getNodeManager().getList(relations);
+            if (rl.size() == 0) {
                 return null;
             } else {
-                return nl.getNode(0);
+                Relation relation = rl.getNode(0).toRelation();
+                if (relation.getSource().getNumber() == node.getNumber()) {
+                    return relation.getDestination();
+                } else {
+                    return relation.getSource();
+                }
             }
         }
     }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to