Adds methods handling 'filter' and 'limit' expressions
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / CommandParameter.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import java.io.Serializable;\r
4 import java.io.UnsupportedEncodingException;\r
5 import java.net.URLEncoder;\r
6 import java.util.ArrayList;\r
7 import java.util.Arrays;\r
8 import java.util.Iterator;\r
9 import java.util.List;\r
10 \r
11 import org.apache.log4j.Logger;\r
12 \r
13 public class CommandParameter implements Serializable {\r
14 \r
15   private static Logger logger = Logger.getLogger(CommandParameter.class);\r
16   \r
17   private static final long serialVersionUID = 625502285668766749L;  \r
18   String name = null;\r
19   String operator = null;\r
20   String value = null;\r
21   List<Expression> expressions = new ArrayList<Expression>();\r
22   private static List<String> nologparams = Arrays.asList("password");\r
23   \r
24   public CommandParameter (String name) {\r
25     logger.trace("Instantiating command parameter '" + name + "'");\r
26     this.name = name;\r
27   }\r
28   \r
29   public CommandParameter (String name, String operator, String value, Expression... expressions) {\r
30     logger.trace("Instantiating command parameter " + name + " with value [" + value + "] and expressions: [" + expressions + "]");\r
31     this.name = name;\r
32     this.operator = operator;\r
33     this.value = value;\r
34     for (Expression expr : expressions) {\r
35       this.expressions.add(expr);\r
36     }\r
37   }\r
38   \r
39   public CommandParameter (String name, String operator, Expression... expressions) {\r
40     logger.trace("Instantiating command parameter " + name + " with expressions: [" + expressions + "]");\r
41     this.name = name;\r
42     this.operator = operator;    \r
43     for (Expression expr : expressions) {\r
44       this.expressions.add(expr);\r
45     }\r
46   }\r
47 \r
48 \r
49   public CommandParameter (String name, String operator, String value) {\r
50     if (!nologparams.contains(name)) logger.trace("Instantiating command parameter '" + name + "' with String: [" + value + "]");    \r
51     this.name = name;\r
52     this.operator = operator;\r
53     this.value = value;    \r
54   }\r
55   \r
56   public CommandParameter (String name, String operator, int value) {\r
57     logger.trace("Instantiating command parameter '" + name + "' with int: [" + value + "]");\r
58     this.name = name;\r
59     this.operator = operator;\r
60     this.value = value+"";    \r
61   }\r
62 \r
63   \r
64   public String getName () {\r
65     return name;\r
66   }\r
67   \r
68   public List<Expression> getExpressions () {\r
69     return expressions;\r
70   }\r
71   \r
72   public List<Expression> getExpressions(String... expressionFields) {\r
73     List<String> requestedFields = Arrays.asList(expressionFields);\r
74     List<Expression> exprs = new ArrayList<Expression>();\r
75     for (Expression expr : expressions) {\r
76       if (requestedFields.contains(expr.getField())) {\r
77         exprs.add(expr);\r
78       }\r
79     }\r
80     return exprs;\r
81   }\r
82   \r
83   public void addExpression(Expression expression) {\r
84     logger.debug("Adding expression [" + expression + "] to '" + name + "'");\r
85     this.expressions.add(expression);\r
86   }\r
87   \r
88   public void removeExpression(Expression expression) {\r
89     for (Expression expr : expressions) {\r
90       if (expr.toString().equals(expression.toString())) {\r
91         expressions.remove(expr);\r
92         break;\r
93       }\r
94     }    \r
95   }\r
96   \r
97   public void removeExpressionsAfter (Expression expression, String... expressionFields) {\r
98     List<String> exprFieldsToRemove = Arrays.asList(expressionFields);\r
99     int fromIdx = 0;    \r
100     for (Expression expr : expressions) {      \r
101       fromIdx++;\r
102       if (expr.toString().equals(expression.toString())) {        \r
103         break;\r
104       }      \r
105     }\r
106     if (fromIdx<expressions.size()) {      \r
107       Iterator<Expression> candidatesForRemoval = expressions.subList(fromIdx, expressions.size()).iterator();\r
108       while (candidatesForRemoval.hasNext()) {\r
109         Expression exp = candidatesForRemoval.next();\r
110         if (exprFieldsToRemove.contains(exp.getField())) {\r
111           expressions.remove(exp);\r
112         }\r
113       }\r
114     }\r
115   }\r
116   \r
117   public void removeExpressions (String... expressionFields) {\r
118     List<String> fieldsToRemove = Arrays.asList(expressionFields);\r
119     Iterator<Expression> i = expressions.iterator();\r
120     while (i.hasNext()) {\r
121        Expression expr = i.next(); \r
122        if (fieldsToRemove.contains(expr.getField())) {\r
123          logger.trace("Removing expression: " + expr.toString());\r
124          i.remove();\r
125        }\r
126     }\r
127   }\r
128   \r
129   public boolean hasOperator() {\r
130     return operator != null;\r
131   }\r
132   \r
133   public boolean hasValue() {\r
134     return value != null && value.length()>0;\r
135   }\r
136   \r
137   public boolean hasExpressions() {\r
138     return expressions.size()>0;\r
139   }\r
140   \r
141   public boolean hasExpressions(String expressionField) {    \r
142     for (Expression expr : expressions) {\r
143       if (expr.getField().equals(expressionField)) {\r
144         return true;\r
145       }\r
146     }     \r
147     return false;    \r
148   }\r
149   \r
150   public String getEncodedQueryString () {\r
151     try {\r
152       return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8");\r
153     } catch (UnsupportedEncodingException e) {\r
154       e.printStackTrace();\r
155       return null;\r
156     }\r
157   }\r
158     \r
159   public String getSimpleValue() {    \r
160     return value; \r
161   }\r
162   \r
163   public String getValueWithExpressions () {\r
164     StringBuilder completeValue = new StringBuilder((value==null ? "" : value));    \r
165     for (Expression expr : expressions) {      \r
166       completeValue.append(" and " + expr.toString());\r
167     }\r
168     return completeValue.toString();    \r
169   }  \r
170   \r
171   @Override\r
172   public boolean equals (Object otherParameter) {\r
173     return\r
174         ((otherParameter instanceof CommandParameter)\r
175          && this.getValueWithExpressions().equals(((CommandParameter) otherParameter).getValueWithExpressions()));\r
176   }\r
177   \r
178   @Override\r
179   public int hashCode () {\r
180     return getValueWithExpressions().hashCode();\r
181   }\r
182   \r
183   public String toString() {\r
184     return getValueWithExpressions();\r
185   }\r
186   \r
187   public CommandParameter copy() {\r
188     logger.trace("Copying parameter '"+ name + "' for modification");\r
189     CommandParameter newParam = new CommandParameter(name);\r
190     newParam.value = this.value;\r
191     newParam.operator = this.operator;\r
192     for (Expression expr : expressions) {\r
193       newParam.addExpression(expr.copy());      \r
194     }\r
195     return newParam;\r
196   }\r
197   \r
198 }\r