Author: michiel
Date: 2009-05-17 11:33:55 +0200 (Sun, 17 May 2009)
New Revision: 35204

Modified:
   mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryConfigurer.java
   mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryDefinition.java
   mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryReader.java
Log:
Introduces 'variables to solve   MMB-1821

Modified: mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryConfigurer.java
===================================================================
--- mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryConfigurer.java      
2009-05-17 08:25:26 UTC (rev 35203)
+++ mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryConfigurer.java      
2009-05-17 09:33:55 UTC (rev 35204)
@@ -9,6 +9,7 @@
 */
 package org.mmbase.bridge.util.xml.query;
 
+import java.util.*;
 
 /**
  * A QueryConfigurer has the task to instantiate {...@link QueryDefinition}s 
(wrappers around Query's)
@@ -21,10 +22,15 @@
  **/
 public class QueryConfigurer {
 
-    private static final QueryConfigurer DEFAULT_CONFIGURER = new 
QueryConfigurer();
+    /**
+     * @since MMBase-1.9.1
+     */
+    public final Map<String, Object> variables = new HashMap<String, Object>();
 
     public QueryDefinition getQueryDefinition() {
-        return new QueryDefinition();
+        QueryDefinition qd = new QueryDefinition();
+        qd.setVariables(variables);
+        return qd;
     }
 
     public FieldDefinition getFieldDefinition() {
@@ -32,7 +38,7 @@
     }
 
     public static QueryConfigurer getDefaultConfigurer() {
-        return DEFAULT_CONFIGURER;
+        return new QueryConfigurer();
     }
 
 }

Modified: mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryDefinition.java
===================================================================
--- mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryDefinition.java      
2009-05-17 08:25:26 UTC (rev 35203)
+++ mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryDefinition.java      
2009-05-17 09:33:55 UTC (rev 35204)
@@ -9,7 +9,7 @@
 */
 package org.mmbase.bridge.util.xml.query;
 
-import java.util.Collection;
+import java.util.*;
 import org.w3c.dom.*;
 
 import org.mmbase.bridge.*;
@@ -56,6 +56,7 @@
      */
     public Collection<FieldDefinition> fields = null;
 
+    private Map<String, Object> variables = null;
 
     public QueryDefinition() {
     }
@@ -68,8 +69,20 @@
         this.elementManager = queryDefinition.elementManager;
         this.elementStep = queryDefinition.elementStep;
         this.fields = queryDefinition.fields;
+        this.variables = queryDefinition.variables;
     }
 
+    public Map<String, Object> getVariables() {
+        if (variables == null) {
+            return Collections.emptyMap();
+        } else {
+            return variables;
+        }
+    }
+    public void setVariables(Map<String, Object> vars) {
+        variables = Collections.unmodifiableMap(vars);
+    }
+
     /**
      * Configures the query definition, using data from a DOM element
      */

Modified: mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryReader.java
===================================================================
--- mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryReader.java  
2009-05-17 08:25:26 UTC (rev 35203)
+++ mmbase/trunk/src/org/mmbase/bridge/util/xml/query/QueryReader.java  
2009-05-17 09:33:55 UTC (rev 35204)
@@ -18,6 +18,7 @@
 import org.mmbase.storage.search.*;
 import org.mmbase.storage.search.implementation.BasicCompositeConstraint;
 import org.mmbase.util.*;
+import org.mmbase.util.logging.*;
 
 /**
  * This class contains static methods related to creating a Query object using 
a (fragment of an) XML.
@@ -28,6 +29,8 @@
  **/
 public abstract class QueryReader {
 
+    private static final Logger log = 
Logging.getLoggerInstance(QueryReader.class);
+
     public static final String XSD_SEARCHQUERY_1_0 = "searchquery.xsd";
     public static final String NAMESPACE_SEARCHQUERY_1_0 = 
"http://www.mmbase.org/xmlns/searchquery";;
 
@@ -101,10 +104,21 @@
                 }
             }
         } else {
-             throw new IllegalArgumentException("field tag has no 'name' 
attribute");
+            throw new IllegalArgumentException("field tag has no 'name' 
attribute");
         }
     }
 
+    /**
+     * @since MMBase-1.9.1
+    protected static Object resolveVariables(String s, QueryDefinition 
queryDefinition) {
+        // TODO this is perhaps a too simply implementation (no escaping, no 
nesting etc..)
+        for (Map.Entry<String, Object> var : 
queryDefinition.getVariables().entrySet()) {
+            s = s.replace("${" + var.getKey() + "}", "" + var.getValue());
+        }
+        return s;
+
+    }
+
     protected static Constraint getConstraint(Element constraintElement, 
QueryDefinition queryDefinition) {
         if (!hasAttribute(constraintElement,"field")) {
             throw new IllegalArgumentException("A constraint tag must have a 
'field' attribute");
@@ -115,9 +129,13 @@
             if (hasAttribute(constraintElement,"field2")) {
                 throw new IllegalArgumentException("A constraint tag can only 
have one of 'value' or 'field2'");
             }
-            value = getAttribute(constraintElement,"value");
-        } else if (hasAttribute(constraintElement,"field2")) {
-            value = 
queryDefinition.query.createStepField(getFullFieldName(queryDefinition,getAttribute(constraintElement,"field2")));
+            if (log.isDebugEnabled()) {
+                log.debug("Using " + queryDefinition.getVariables());
+            }
+            value = resolveVariables(getAttribute(constraintElement, "value"), 
queryDefinition);
+
+        } else if (hasAttribute(constraintElement, "field2")) {
+            value = 
queryDefinition.query.createStepField(getFullFieldName(queryDefinition,getAttribute(constraintElement,
 "field2")));
         }
         int operator = FieldCompareConstraint.EQUAL;
         if (hasAttribute(constraintElement,"operator")) {
@@ -134,7 +152,7 @@
             if (operator != Queries.OPERATOR_BETWEEN) {
                 throw new IllegalArgumentException("A constraint tag can only 
use 'value2' attribute with operator BETWEEN");
             }
-            value2 = getAttribute(constraintElement,"value2");
+            value2 = resolveVariables(getAttribute(constraintElement, 
"value2"), queryDefinition);
         }
         if (operator == Queries.OPERATOR_BETWEEN && value2 == null) {
             throw new IllegalArgumentException("Operator BETWEEN in a 
constraint tag requires attribute 'value2'");

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to