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