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
Cvs@lists.mmbase.org
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to