Update of /var/cvs/src/org/mmbase/module/builders
In directory james.mmbase.org:/tmp/cvs-serv11851/src/org/mmbase/module/builders
Modified Files:
Properties.java
Removed Files:
PropertiesProbe.java
Log Message:
added a bridge implemention and some documentation about 'properties' See also
MMB-1656
See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/module/builders
See also: http://www.mmbase.org/jira/browse/MMB-1656
Index: Properties.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/module/builders/Properties.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- Properties.java 25 Feb 2007 17:56:59 -0000 1.16
+++ Properties.java 12 Jun 2008 11:23:50 -0000 1.17
@@ -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.16 2007/02/25 17:56:59 nklasens 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.17 2008/06/12 11:23:50 michiel Exp $
*/
public class Properties extends MMObjectBuilder {
@@ -33,6 +56,94 @@
}
}
+ protected final static Parameter<Node> NODE = new
Parameter<Node>("node", Node.class, true);
+ protected final static Parameter<String> KEY = new
Parameter<String>("key", String.class, true);
+ protected final static Parameter<Object> VALUE = new
Parameter<Object>("value", Object.class);
+ protected final static Parameter[] GET_PARAMETERS = { NODE, KEY };
+ protected final static Parameter[] SET_PARAMETERS = {
+ new Parameter.Wrapper(GET_PARAMETERS),
+ new Parameter<Object>("value", Object.class)
+ };
+
+
+ protected List<Node> 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<Node> prop) {
+ if (prop.size() == 0) {
+ return null;
+ } else if (prop.size() == 1) {
+ return prop.get(0).getValue("value");
+ } else {
+ List<Object> result = new ArrayList<Object>();
+ for (Node p : prop) {
+ result.add(p.getValue("value"));
+ }
+ return result;
+ }
+ }
+ protected Object getValue(Node node, String key) {
+ return getValue(getValueNode(node, key));
+
+ }
+
+ {
+ addFunction(new AbstractFunction<Object>("get", GET_PARAMETERS) {
+ public Object getFunctionValue(Parameters parameters) {
+ return Properties.this.getValue(parameters.get(NODE),
parameters.get(KEY));
+ }
+ });
+ addFunction(new AbstractFunction<Object>("set", SET_PARAMETERS) {
+ public Object getFunctionValue(Parameters parameters) {
+ Node node = parameters.get(NODE);
+ String key = parameters.get(KEY);
+ List<Node> list = new
ArrayList<Node>(Properties.this.getValueNode(node, key));
+ Object orgValue = getValue(list);
+ Object newValue = parameters.get(VALUE);
+ if (newValue == null) {
+ for (Node n : list) {
+ n.delete(true);
+ }
+ } else if (newValue instanceof Collection) {
+ Collection c = (Collection) newValue;
+ while (list.size() > c.size()) {
+ 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 (Object v : c) {
+ Node n = list.get(i++);
+ n.setValue("value", v);
+ n.commit();
+ }
+
+ } else {
+ while (list.size() > 1) {
+ 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 = 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