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

Modified Files:
      Tag: MMBase-1_8
        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.1.2.2
retrieving revision 1.1.2.3
diff -u -b -r1.1.2.2 -r1.1.2.3
--- Related.java        11 Nov 2008 18:32:26 -0000      1.1.2.2
+++ Related.java        7 Apr 2009 16:09:23 -0000       1.1.2.3
@@ -10,18 +10,22 @@
 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.*;
 
 /**
  * The set- and get- processors implemented in this file can be used to make a 
virtual field which
- * act as 'related'.
+ * act as a a node field, but actually is a related node.
+ *
+ * In case just one related node is desired, this makes it easy to just create 
a drop-down for it.
  *
  * @author Michiel Meeuwissen
  * @since MMBase-1.8.7
- * @version $Id: Related.java,v 1.1.2.2 2008/11/11 18:32:26 michiel Exp $
+ * @version $Id: Related.java,v 1.1.2.3 2009/04/07 16:09:23 michiel Exp $
  */
 
 public class Related {
@@ -33,6 +37,7 @@
         protected String role = "related";
         protected String type = "object";
         protected String searchDir = "destination";
+        protected final Map relationConstraints = new HashMap();
         public void setRole(String r) {
             role = r;
         }
@@ -42,6 +47,20 @@
         public void setSearchDir(String d) {
             searchDir = d;
         }
+        public void setRelationConstraints(Map map) {
+            relationConstraints.putAll(map);
+        }
+
+        protected NodeQuery getRelationsQuery(Node node) {
+            Cloud cloud = node.getCloud();
+            NodeQuery nq = Queries.createRelationNodesQuery(node, 
cloud.getNodeManager(type), role, searchDir);
+            Iterator i =  relationConstraints.entrySet().iterator();
+            while (i.hasNext()) {
+                Map.Entry entry = (Map.Entry) i.next();
+                Queries.addConstraint(nq, Queries.createConstraint(nq, 
(String) entry.getKey(), FieldCompareConstraint.EQUAL, entry.getValue()));
+            }
+            return nq;
+        }
     }
 
     public static class Setter extends AbstractProcessor {
@@ -51,32 +70,51 @@
             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 {
-
-                    RelationIterator ni = rl.relationIterator();
+                    NodeIterator ni = rl.nodeIterator();
                     while (ni.hasNext()) {
-                        Relation r = ni.nextRelation();
+                        Node r = ni.nextNode();
+                        log.debug("Deleting " + r);
                         r.delete();
                     }
                     RelationManager rel = 
cloud.getRelationManager(node.getNodeManager(),
                                                                    
cloud.getNodeManager(type),
                                                                role);
+                    if (node.isNew()) node.commit(); // Silly, but you cannot 
make relations to new nodes.
                     Relation newrel = node.createRelation(dest, rel);
+                    Iterator i =  relationConstraints.entrySet().iterator();
+                    while (i.hasNext()) {
+                        Map.Entry entry = (Map.Entry) i.next();
+                        newrel.setStringValue((String) entry.getKey(), 
(String) entry.getValue());
+                    }
+                    log.debug("Created " + newrel);
                     newrel.commit();
                 }
                 return dest;
             } else {
-                RelationIterator ni = rl.relationIterator();
+                NodeIterator ni = rl.nodeIterator();
                 while (ni.hasNext()) {
-                    Relation r = ni.nextRelation();
+                    Node r = ni.nextNode();
                     r.delete();
                 }
                 return null;
@@ -92,11 +130,21 @@
             if (log.isDebugEnabled()) {
                 log.debug("getting "  + node);
             }
-            NodeList nl = node.getRelatedNodes(type, role, searchDir);
-            if (nl.size() == 0) {
+            if (node.isNew()) {
+                log.debug("The node is new, returning " + 
field.getDataType().getDefaultValue());
+                return field.getDataType().getDefaultValue();
+            }
+            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