import java.io.Serializable;\r
import java.io.UnsupportedEncodingException;\r
import java.net.URLEncoder;\r
+import java.util.ArrayList;\r
import java.util.Arrays;\r
-import java.util.HashMap;\r
+import java.util.Iterator;\r
import java.util.List;\r
-import java.util.Map;\r
\r
import org.apache.log4j.Logger;\r
\r
-import com.indexdata.mkjsf.pazpar2.commands.CommandParameter;\r
-\r
public class CommandParameter implements Serializable {\r
\r
private static Logger logger = Logger.getLogger(CommandParameter.class);\r
String name = null;\r
String operator = null;\r
String value = null;\r
- Map<String,Expression> expressions = new HashMap<String,Expression>();\r
+ List<Expression> expressions = new ArrayList<Expression>();\r
private static List<String> nologparams = Arrays.asList("password");\r
\r
public CommandParameter (String name) {\r
}\r
\r
public CommandParameter (String name, String operator, String value, Expression... expressions) {\r
- logger.trace("Instantiating command parameter " + name + " with expressions: [" + expressions + "]");\r
+ logger.trace("Instantiating command parameter " + name + " with value [" + value + "] and expressions: [" + expressions + "]");\r
this.name = name;\r
this.operator = operator;\r
this.value = value;\r
for (Expression expr : expressions) {\r
- this.expressions.put(expr.toString(), expr);\r
+ this.expressions.add(expr);\r
}\r
}\r
+ \r
+ public CommandParameter (String name, String operator, Expression... expressions) {\r
+ logger.trace("Instantiating command parameter " + name + " with expressions: [" + expressions + "]");\r
+ this.name = name;\r
+ this.operator = operator; \r
+ for (Expression expr : expressions) {\r
+ this.expressions.add(expr);\r
+ }\r
+ }\r
+\r
\r
public CommandParameter (String name, String operator, String value) {\r
if (!nologparams.contains(name)) logger.trace("Instantiating command parameter '" + name + "' with String: [" + value + "]"); \r
return name;\r
}\r
\r
- public Map<String,Expression> getExpressions () {\r
+ public List<Expression> getExpressions () {\r
return expressions;\r
}\r
\r
+ public List<Expression> getExpressions(String... expressionFields) {\r
+ List<String> requestedFields = Arrays.asList(expressionFields);\r
+ List<Expression> exprs = new ArrayList<Expression>();\r
+ for (Expression expr : expressions) {\r
+ if (requestedFields.contains(expr.getField())) {\r
+ exprs.add(expr);\r
+ }\r
+ }\r
+ return exprs;\r
+ }\r
+ \r
public void addExpression(Expression expression) {\r
logger.debug("Adding expression [" + expression + "] to '" + name + "'");\r
- this.expressions.put(expression.toString(),expression);\r
+ this.expressions.add(expression);\r
}\r
\r
public void removeExpression(Expression expression) {\r
- this.expressions.remove(expression.toString());\r
+ for (Expression expr : expressions) {\r
+ if (expr.toString().equals(expression.toString())) {\r
+ expressions.remove(expr);\r
+ break;\r
+ }\r
+ } \r
+ }\r
+ \r
+ public void removeExpressionsAfter (Expression expression, String... expressionFields) {\r
+ List<String> exprFieldsToRemove = Arrays.asList(expressionFields);\r
+ int fromIdx = 0; \r
+ for (Expression expr : expressions) { \r
+ fromIdx++;\r
+ if (expr.toString().equals(expression.toString())) { \r
+ break;\r
+ } \r
+ }\r
+ if (fromIdx<expressions.size()) { \r
+ Iterator<Expression> candidatesForRemoval = expressions.subList(fromIdx, expressions.size()).iterator();\r
+ while (candidatesForRemoval.hasNext()) {\r
+ Expression exp = candidatesForRemoval.next();\r
+ if (exprFieldsToRemove.contains(exp.getField())) {\r
+ expressions.remove(exp);\r
+ }\r
+ }\r
+ }\r
}\r
\r
+ public void removeExpressions (String... expressionFields) {\r
+ List<String> fieldsToRemove = Arrays.asList(expressionFields);\r
+ Iterator<Expression> i = expressions.iterator();\r
+ while (i.hasNext()) {\r
+ Expression expr = i.next(); \r
+ if (fieldsToRemove.contains(expr.getField())) {\r
+ logger.trace("Removing expression: " + expr.toString());\r
+ i.remove();\r
+ }\r
+ }\r
+ }\r
\r
public boolean hasOperator() {\r
return operator != null;\r
return value != null && value.length()>0;\r
}\r
\r
+ public boolean hasExpressions() {\r
+ return expressions.size()>0;\r
+ }\r
+ \r
+ public boolean hasExpressions(String expressionField) { \r
+ for (Expression expr : expressions) {\r
+ if (expr.getField().equals(expressionField)) {\r
+ return true;\r
+ }\r
+ } \r
+ return false; \r
+ }\r
+ \r
public String getEncodedQueryString () {\r
try {\r
return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8");\r
}\r
\r
public String getValueWithExpressions () {\r
- StringBuilder completeValue = new StringBuilder((value==null ? "" : value)); \r
- for (String key : expressions.keySet()) { \r
- completeValue.append(" and " + expressions.get(key));\r
+ StringBuilder completeValue = new StringBuilder((value==null ? "" : value));\r
+ boolean first=true;\r
+ for (Expression expr : expressions) { \r
+ if (value == null && first) {\r
+ first = false;\r
+ completeValue.append(expr.toString());\r
+ } else {\r
+ completeValue.append(" AND " + expr.toString());\r
+ }\r
}\r
- return completeValue.toString();\r
- \r
- }\r
+ return completeValue.toString(); \r
+ } \r
\r
@Override\r
public boolean equals (Object otherParameter) {\r
CommandParameter newParam = new CommandParameter(name);\r
newParam.value = this.value;\r
newParam.operator = this.operator;\r
- for (String key : expressions.keySet()) {\r
- newParam.addExpression(expressions.get(key).copy()); \r
+ for (Expression expr : expressions) {\r
+ newParam.addExpression(expr.copy()); \r
}\r
return newParam;\r
}\r