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>
+ <mm:cloud rank="administrator">
+ <div>
+ <mm:import id="key">test</mm:import>
+ <mm:import id="value"><mm:time time="now"
/></mm:import>
+ <mm:listnodes type="news" max="1">
+ <p>TEST: <mm:function nodemanager="properties" name="get"
referids="[EMAIL PROTECTED],key" /></p>
+ <p>TEST: <mm:function nodemanager="properties" name="set"
referids="[EMAIL PROTECTED],key,value" /></p>
+ <p>TEST: <mm:function nodemanager="properties" name="get"
referids="[EMAIL PROTECTED],key" /></p>
+ </mm:listnodes>
+ </div>
+ </mm:cloud>
+ </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