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