Adds methods handling 'filter' and 'limit' expressions
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / CommandParameter.java
index 69c224a..d08cde1 100644 (file)
@@ -3,47 +3,58 @@ package com.indexdata.mkjsf.pazpar2.commands;
 import java.io.Serializable;\r
 import java.io.UnsupportedEncodingException;\r
 import java.net.URLEncoder;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Iterator;\r
+import java.util.List;\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
   \r
-  private static final long serialVersionUID = 625502285668766749L;\r
+  private static final long serialVersionUID = 625502285668766749L;  \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
-    logger.debug("Instantiating command parameter '" + name + "'");\r
+    logger.trace("Instantiating command parameter '" + name + "'");\r
     this.name = name;\r
   }\r
   \r
   public CommandParameter (String name, String operator, String value, Expression... expressions) {\r
-    logger.debug("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
-    logger.debug("Instantiating command parameter '" + name + "' with String: [" + value + "]");\r
+    if (!nologparams.contains(name)) logger.trace("Instantiating command parameter '" + name + "' with String: [" + value + "]");    \r
     this.name = name;\r
     this.operator = operator;\r
     this.value = value;    \r
   }\r
   \r
   public CommandParameter (String name, String operator, int value) {\r
-    logger.debug("Instantiating command parameter '" + name + "' with int: [" + value + "]");\r
+    logger.trace("Instantiating command parameter '" + name + "' with int: [" + value + "]");\r
     this.name = name;\r
     this.operator = operator;\r
     this.value = value+"";    \r
@@ -54,24 +65,88 @@ public class CommandParameter implements Serializable {
     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
   }\r
   \r
+  public boolean hasValue() {\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
@@ -87,12 +162,11 @@ public class CommandParameter implements Serializable {
   \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
+    for (Expression expr : expressions) {      \r
+      completeValue.append(" and " + expr.toString());\r
     }\r
-    return completeValue.toString();\r
-    \r
-  }\r
+    return completeValue.toString();    \r
+  }  \r
   \r
   @Override\r
   public boolean equals (Object otherParameter) {\r
@@ -111,12 +185,12 @@ public class CommandParameter implements Serializable {
   }\r
   \r
   public CommandParameter copy() {\r
-    logger.debug("Copying parameter '"+ name + "' for modification");\r
+    logger.trace("Copying parameter '"+ name + "' for modification");\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