Author: michiel
Date: 2010-08-12 15:27:26 +0200 (Thu, 12 Aug 2010)
New Revision: 43084
Modified:
mmbase/trunk/bridge/src/main/java/org/mmbase/datatypes/processors/Related.java
Log:
Small new feature 'relateDefaultIfNull. MMB-1974
Modified:
mmbase/trunk/bridge/src/main/java/org/mmbase/datatypes/processors/Related.java
===================================================================
---
mmbase/trunk/bridge/src/main/java/org/mmbase/datatypes/processors/Related.java
2010-08-12 13:26:50 UTC (rev 43083)
+++
mmbase/trunk/bridge/src/main/java/org/mmbase/datatypes/processors/Related.java
2010-08-12 13:27:26 UTC (rev 43084)
@@ -28,7 +28,6 @@
*/
public class Related {
-
private static final Logger log = Logging.getLoggerInstance(Related.class);
public abstract static class AbstractProcessor implements Processor {
@@ -39,6 +38,9 @@
private String createType = null;
private String createTypeProperty = null;
protected String searchDir = "destination";
+ protected boolean relateDefaultIfNull = false;
+
+
protected final Map<String, String> relationConstraints = new
HashMap<String, String>();
public void setRole(String r) {
role = r;
@@ -64,6 +66,11 @@
relationConstraints.putAll(map);
}
+ public void setRelateDefaultIfNull(boolean b) {
+ relateDefaultIfNull = b;
+ }
+
+
protected NodeManager getRelatedType(Node node) {
Cloud cloud = node.getCloud();
if(typeProperty != null) {
@@ -156,16 +163,67 @@
}
}
+ protected void createRelation(final Node node, final Node dest, final
NodeList rl) {
+ boolean related = false;
+ if (rl.size() == 1) {
+ Relation r = rl.getNode(0).toRelation();
+ try {
+ if (r.getDestination().getNumber() == dest.getNumber() ||
+ r.getSource().getNumber() == dest.getNumber()) {
+ related = true;
+ }
+ } catch (NotFoundException nfe) {
+ log.warn(nfe.getMessage(), nfe);
+ log.warn("Inconsistent db?, Deleting this relation");
+ r.delete();
+ }
+ } else if (rl.size() > 1) {
+ log.warn("More than one correct relations between " + node + "
and " + getRelatedType(node) + " " + rl + ". Will fix this now");
+ }
+ if (related) {
+ log.debug("" + dest + " already correctly related");
+ // nothing changed
+ } else {
+ log.debug("" + dest + " not correctly related");
+ RelationManager rel = getRelationManager(node);
+ if (node.isNew()) {
+ log.debug("Cannot make relations to new nodes");
+ node.commit(); // Silly, but you cannot make relations to
new nodes.
+ } else {
+ log.debug("Deleting " + rl.size() + " existing relations");
+ for (Node r : rl) {
+ log.debug("Deleting " + r);
+ r.delete();
+ }
+ }
+ log.debug("Creating new relation ");
+ Relation newrel = node.createRelation(dest, rel);
+ try {
+ for (Map.Entry<String, String> entry :
relationConstraints.entrySet()) {
+ log.debug("Setting " + entry);
+ String key = entry.getKey();
+ int dot = key.indexOf(".");
+ if (dot >= 0) {
+ key = key.substring(dot + 1, key.length());
+ }
+ newrel.setStringValue(key, entry.getValue());
+ }
+ } catch (Throwable e) {
+ log.warn(e.getMessage(), e);
+ }
+ log.debug("Created " + newrel);
+ newrel.commit();
+ }
+
+ }
}
-
/**
* This get-processor can be used to implicitly create the wanted related
node too.
*/
public static class Creator extends AbstractProcessor {
private static final long serialVersionUID = 1L;
- @Override
public Object process(final Node node, final Field field, final Object
value) {
Node relatedNode = getRelatedNode(node, field);
if (relatedNode == null) {
@@ -195,7 +253,8 @@
public static class Setter extends AbstractProcessor {
private static final long serialVersionUID = 1L;
- @Override
+
+
public Object process(final Node node, final Field field, final Object
value) {
if (log.isDebugEnabled()) {
log.debug("Setting " + value);
@@ -206,59 +265,8 @@
log.debug("Found " + rl.size() + " existing relations");
if (value != null) {
Cloud cloud = node.getCloud();
- Node dest = BridgeCaster.toNode(value, cloud);
-
- boolean related = false;
- if (rl.size() == 1) {
- Relation r = rl.getNode(0).toRelation();
- try {
- if (r.getDestination().getNumber() == dest.getNumber()
||
- r.getSource().getNumber() == dest.getNumber()) {
- related = true;
- }
- } catch (NotFoundException nfe) {
- log.warn(nfe.getMessage(), nfe);
- log.warn("Inconsistent db?, Deleting this relation");
- r.delete();
- }
- } else if (rl.size() > 1) {
- log.warn("More than one correct relations between " + node
+ " and " + getRelatedType(node) + " " + rl + ". Will fix this now");
- }
- if (related) {
- log.debug("" + dest + " already correctly related");
- // nothing changed
- } else {
- log.debug("" + dest + " not correctly related");
- RelationManager rel = getRelationManager(node);
- if (node.isNew()) {
- log.debug("Cannot make relations to new nodes");
- node.commit(); // Silly, but you cannot make relations
to new nodes.
- } else {
- log.debug("Deleting " + rl.size() + " existing
relations");
- for (Node r : rl) {
- log.debug("Deleting " + r);
- r.delete();
- }
- }
- log.debug("Creating new relation ");
- Relation newrel = node.createRelation(dest, rel);
-
- try {
- for (Map.Entry<String, String> entry :
relationConstraints.entrySet()) {
- log.debug("Setting " + entry);
- String key = entry.getKey();
- int dot = key.indexOf(".");
- if (dot >= 0) {
- key = key.substring(dot + 1, key.length());
- }
- newrel.setStringValue(key, entry.getValue());
- }
- } catch (Throwable e) {
- log.warn(e.getMessage(), e);
- }
- log.debug("Created " + newrel);
- newrel.commit();
- }
+ Node dest = Casting.toNode(value, cloud);
+ createRelation(node, dest, rl);
return dest;
} else {
log.debug("value is null, deleting existing relations");
@@ -274,7 +282,7 @@
public static class Getter extends AbstractProcessor {
private static final long serialVersionUID = 1L;
- @Override
+
public Object process(final Node node, final Field field, final Object
value) {
if (log.isDebugEnabled()) {
log.debug("getting " + node);
@@ -283,7 +291,15 @@
// null cannot be related to anything
return null;
}
- return getRelatedNode(node, field);
+ Node result = getRelatedNode(node, field);
+ if (relateDefaultIfNull && result == null && field != null) {
+ Object defaultValue =
field.getDataType().getDefaultValue(node.getCloud().getLocale(),
node.getCloud(), field);
+ if (defaultValue != null) {
+ Node defaultNode = Casting.toNode(defaultValue,
node.getCloud());
+ createRelation(node, defaultNode,
BridgeCollections.EMPTY_NODELIST);
+ }
+ }
+ return result;
}
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs