Update of /var/cvs/src/org/mmbase/module/builders
In directory james.mmbase.org:/tmp/cvs-serv12295

Modified Files:
      Tag: MMBase-1_8
        Properties.java 
Log Message:
ported set/get functions from HEAD


See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/module/builders


Index: Properties.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/module/builders/Properties.java,v
retrieving revision 1.15
retrieving revision 1.15.2.1
diff -u -b -r1.15 -r1.15.2.1
--- Properties.java     18 Apr 2006 13:05:36 -0000      1.15
+++ Properties.java     12 Jun 2008 11:42:20 -0000      1.15.2.1
@@ -12,13 +12,36 @@
 import org.mmbase.core.event.NodeEvent;
 import org.mmbase.module.core.*;
 import org.mmbase.util.logging.*;
+import org.mmbase.util.functions.*;
+import java.util.*;
+import org.mmbase.bridge.*;
+import org.mmbase.storage.search.*;
+import org.mmbase.bridge.util.Queries;
 
 /**
- * Probably your builder must extend this if 'properties' on its nodes must 
work decently?
+ * The properties builder can contain key/value pairs for any other node in 
MMBase.
  *
- * @javadoc
+ * When using bridge, properties can be set and get using the 'nodemanager' 
function 'get' and 'set'
+ * on this builder.
  *
- * @version $Id: Properties.java,v 1.15 2006/04/18 13:05:36 michiel Exp $
+ * In core, the (legacy?) methods on MMObjectNode should still work.
+ *
+ * Example code for bridge:
+ <pre>
+      &lt;mm:cloud rank="administrator"&gt;
+        &lt;div&gt;
+          &lt;mm:import id="key"&gt;test&lt;/mm:import&gt;
+          &lt;mm:import id="value"&gt;&lt;mm:time time="now" 
/&gt;&lt;/mm:import&gt;
+          &lt;mm:listnodes type="news" max="1"&gt;
+            &lt;p&gt;TEST: &lt;mm:function nodemanager="properties" name="get" 
referids="[EMAIL PROTECTED],key" /&gt;&lt;/p&gt;
+            &lt;p&gt;TEST: &lt;mm:function nodemanager="properties" name="set" 
referids="[EMAIL PROTECTED],key,value" /&gt;&lt;/p&gt;
+            &lt;p&gt;TEST: &lt;mm:function nodemanager="properties" name="get" 
referids="[EMAIL PROTECTED],key" /&gt;&lt;/p&gt;
+          &lt;/mm:listnodes&gt;
+        &lt;/div&gt;
+      &lt;/mm:cloud&gt;
+  </pre>
+ *
+ * @version $Id: Properties.java,v 1.15.2.1 2008/06/12 11:42:20 michiel Exp $
  */
 public class Properties extends MMObjectBuilder {
 
@@ -33,6 +56,93 @@
         }
     }
 
+    protected final static Parameter NODE  = new Parameter("node", Node.class, 
true);
+    protected final static Parameter KEY   = new Parameter("key", 
String.class, true);
+    protected final static Parameter VALUE = new Parameter("value", 
Object.class);
+    protected final static Parameter[] GET_PARAMETERS = { NODE, KEY };
+    protected final static Parameter[] SET_PARAMETERS = { new 
Parameter.Wrapper(GET_PARAMETERS), VALUE };
+
+    protected List getValueNode(Node node, String key) {
+        NodeQuery q = 
node.getCloud().getNodeManager(Properties.this.getTableName()).createQuery();
+        Queries.addConstraint(q, Queries.createConstraint(q, "parent", 
FieldCompareConstraint.EQUAL, node));
+        Queries.addConstraint(q, Queries.createConstraint(q, "key", 
FieldCompareConstraint.EQUAL, key));
+        return q.getNodeManager().getList(q);
+    }
+    protected Object getValue(List prop) {
+        if (prop.size() == 0) {
+            return null;
+        } else if (prop.size() == 1) {
+            return ((Node) prop.get(0)).getValue("value");
+        } else {
+            List result = new ArrayList();
+            for (Iterator i = prop.iterator(); i.hasNext();) {
+                Node p = (Node) i.next();
+                result.add(p.getValue("value"));
+            }
+            return result;
+        }
+    }
+    protected Object getValue(Node node, String key) {
+        return getValue(getValueNode(node, key));
+
+    }
+
+    {
+        addFunction(new AbstractFunction("get", GET_PARAMETERS, 
ReturnType.UNKNOWN) {
+                public Object getFunctionValue(Parameters parameters) {
+                    return Properties.this.getValue((Node) 
parameters.get(NODE), (String) parameters.get(KEY));
+                }
+            });
+        addFunction(new AbstractFunction("set", SET_PARAMETERS, 
ReturnType.UNKNOWN) {
+                public Object getFunctionValue(Parameters parameters) {
+                    Node node =  (Node) parameters.get(NODE);
+                    String key = (String) parameters.get(KEY);
+                    List list = new 
ArrayList(Properties.this.getValueNode(node, key));
+                    Object orgValue = getValue(list);
+                    Object newValue = parameters.get(VALUE);
+                    if (newValue == null) {
+                        for (Iterator i = list.iterator(); i.hasNext();) {
+                            Node n = (Node) i.next();
+                            n.delete(true);
+                        }
+                    } else if (newValue instanceof Collection) {
+                        Collection c = (Collection) newValue;
+                        while (list.size() > c.size()) {
+                            ((Node) list.remove(0)).delete(true);
+                        }
+                        while (list.size() < c.size()) {
+                            Node p = 
node.getCloud().getNodeManager(Properties.this.getTableName()).createNode();
+                            p.setStringValue("key", key);
+                            p.setNodeValue("parent", node);
+                            list.add(p);
+                        }
+                        int i = 0;
+                        for (Iterator j = c.iterator(); j.hasNext();) {
+                            Object v = j.next();
+                            Node n = (Node) list.get(i++);
+                            n.setValue("value", v);
+                            n.commit();
+                        }
+
+                    } else {
+                        while (list.size() > 1) {
+                            ((Node) list.remove(0)).delete(true);
+                        }
+                        while (list.size() < 1) {
+                            Node p = 
node.getCloud().getNodeManager(Properties.this.getTableName()).createNode();
+                            p.setStringValue("key", key);
+                            p.setNodeValue("parent", node);
+                            list.add(p);
+                        }
+                        Node n = (Node) list.get(0);
+                        n.setValue("value", newValue);
+                        n.commit();
+                    }
+                    return orgValue;
+                }
+            });
+    }
+
     /* (non-Javadoc)
      * @see 
org.mmbase.module.core.MMObjectBuilder#notify(org.mmbase.core.event.NodeEvent)
      */
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to