X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcom%2Findexdata%2Fmkjsf%2Fpazpar2%2Fcommands%2FCommandParameter.java;h=6c6df868ee2219489ab4c360b5e79e104ee0841f;hb=969f879c807d127cbf47c5656771fcf5adc27a02;hp=b22962e46283a780f37962b06cb2ace8795ab35d;hpb=d739ecb22a85d8f982add6d429e069edf7e0dde2;p=mkjsf-moved-to-github.git diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java index b22962e..6c6df86 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java @@ -3,15 +3,25 @@ package com.indexdata.mkjsf.pazpar2.commands; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.Iterator; import java.util.List; -import java.util.Map; import org.apache.log4j.Logger; -import com.indexdata.mkjsf.pazpar2.commands.CommandParameter; - +/** + * Represents a Pazpar2 command parameter with a name, an operator, + * a simple value and/or one or more complex values (expressions). + *

Examples:

+ * + * @author Niels Erik + * + */ public class CommandParameter implements Serializable { private static Logger logger = Logger.getLogger(CommandParameter.class); @@ -20,7 +30,7 @@ public class CommandParameter implements Serializable { String name = null; String operator = null; String value = null; - Map expressions = new HashMap(); + List expressions = new ArrayList(); private static List nologparams = Arrays.asList("password"); public CommandParameter (String name) { @@ -28,16 +38,46 @@ public class CommandParameter implements Serializable { this.name = name; } + /** + * Instantiates a parameter with a simple value and one or more expressions + * + * @param name + * @param operator + * @param value + * @param expressions + */ public CommandParameter (String name, String operator, String value, Expression... expressions) { - logger.trace("Instantiating command parameter " + name + " with expressions: [" + expressions + "]"); + logger.trace("Instantiating command parameter " + name + " with value [" + value + "] and expressions: [" + expressions + "]"); this.name = name; this.operator = operator; this.value = value; for (Expression expr : expressions) { - this.expressions.put(expr.toString(), expr); + this.expressions.add(expr); + } + } + + /** + * Instantiates a parameter with one or more expressions + * @param name + * @param operator + * @param expressions + */ + public CommandParameter (String name, String operator, Expression... expressions) { + logger.trace("Instantiating command parameter " + name + " with expressions: [" + expressions + "]"); + this.name = name; + this.operator = operator; + for (Expression expr : expressions) { + this.expressions.add(expr); } } + + /** + * Instantiates a parameter with a simple value + * @param name + * @param operator + * @param value + */ public CommandParameter (String name, String operator, String value) { if (!nologparams.contains(name)) logger.trace("Instantiating command parameter '" + name + "' with String: [" + value + "]"); this.name = name; @@ -45,6 +85,12 @@ public class CommandParameter implements Serializable { this.value = value; } + /** + * Instantiates a parameter with a numeric value + * @param name + * @param operator + * @param value + */ public CommandParameter (String name, String operator, int value) { logger.trace("Instantiating command parameter '" + name + "' with int: [" + value + "]"); this.name = name; @@ -52,33 +98,168 @@ public class CommandParameter implements Serializable { this.value = value+""; } - + /** + * Returns the name (left of operator) of this parameter + * + * @return name (left of operator) of this parameter + */ public String getName () { return name; } - public Map getExpressions () { + /** + * Returns a list of all current expressions + * + * @return a list of all current expressions + */ + public List getExpressions () { return expressions; } + + /** + * Returns expressions selected by their left-hand keys - as in 'expressionField=value'. + *

+ * If the parameter has expressions expr1=x,expr2=y,expr3=z,expr1=u then invoking this method + * with {"expr1","expr3"} would return expr1=x,expr3=z,expr1=u but not expr2=y. + *

+ * @param expressionFields The expression types to return + * @return a list of expressions with the given keys to the left of the operator + * + */ + public List getExpressions(String... expressionFields) { + List requestedFields = Arrays.asList(expressionFields); + List exprs = new ArrayList(); + for (Expression expr : expressions) { + if (requestedFields.contains(expr.getField())) { + exprs.add(expr); + } + } + return exprs; + } + /** + * Adds an expression to the end of the list of current expressions (if any) + * + * @param expression to add + */ public void addExpression(Expression expression) { logger.debug("Adding expression [" + expression + "] to '" + name + "'"); - this.expressions.put(expression.toString(),expression); + this.expressions.add(expression); } + /** + * Removes a single expression identified by all its characteristics + * + * @param expression to remove + */ public void removeExpression(Expression expression) { - this.expressions.remove(expression.toString()); + for (Expression expr : expressions) { + if (expr.toString().equals(expression.toString())) { + expressions.remove(expr); + break; + } + } } + /** + * Removes all expressions that appear after the provided expression and that + * have the given keys to the left of their operators - as in 'expressionField=value'. + *

+ * This method is intended for bread crumb-like UI controls + *

+ * @param expression The expression to use a starting point for removal (not inclusive) + * @param expressionFields The expression fields to remove + */ + public void removeExpressionsAfter (Expression expression, String... expressionFields) { + List exprFieldsToRemove = Arrays.asList(expressionFields); + int fromIdx = 0; + for (Expression expr : expressions) { + fromIdx++; + if (expr.toString().equals(expression.toString())) { + break; + } + } + if (fromIdx candidatesForRemoval = expressions.subList(fromIdx, expressions.size()).iterator(); + while (candidatesForRemoval.hasNext()) { + Expression exp = candidatesForRemoval.next(); + if (exprFieldsToRemove.contains(exp.getField())) { + expressions.remove(exp); + } + } + } + } + /** + * Removes expressions selected by their left-of-operator fields/keys - as in 'expressionField=value'. + *

+ * If the parameter has expressions expr1=x,expr2=y,expr3=z,expr1=u then invoking this method + * with {"expr1","expr3"} would remove expr1=x,expr3=z and expr1=u but leave expr2=y. + *

+ * @param expressionFields The expression types (by field) to remove + * @return a list of expressions with the given left-of-operator keys + * + */ + public void removeExpressions (String... expressionFields) { + List fieldsToRemove = Arrays.asList(expressionFields); + Iterator i = expressions.iterator(); + while (i.hasNext()) { + Expression expr = i.next(); + if (fieldsToRemove.contains(expr.getField())) { + logger.trace("Removing expression: " + expr.toString()); + i.remove(); + } + } + } + + /** + * + * @return true if an operator was defined for this parameter yet + */ public boolean hasOperator() { return operator != null; } + /** + * Returns true if this parameter has a simple value + * + * @return true if this parameter has a simple value + */ public boolean hasValue() { return value != null && value.length()>0; } + /** + * Returns true if this parameter has expressions (complex values) + * + * @return true if this parameter has expressions (complex values) + */ + public boolean hasExpressions() { + return expressions.size()>0; + } + + /** + * Returns true if this parameter has expressions of the given type, + * that is, expressions where the left-of-operator key equals 'expressionField' + * + * @param expressionField the type of expression to look for + * @return true if this parameter has expressions of the given type, + * that is, expressions where the left-of-operator key equals 'expressionField' + */ + public boolean hasExpressions(String expressionField) { + for (Expression expr : expressions) { + if (expr.getField().equals(expressionField)) { + return true; + } + } + return false; + } + + /** + * Returns a URL encoded string of this parameter with name, operator, simple value and/or expressions + * + * @return URL encoded string of this parameter with name, operator, simple value and/or expressions + */ public String getEncodedQueryString () { try { return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8"); @@ -88,18 +269,33 @@ public class CommandParameter implements Serializable { } } + /** + * Returns the simple parameter value or null if no simple value was set for this parameter + * + * @return the simple parameter value, null if no simple value was set for this parameter + */ public String getSimpleValue() { return value; } + /** + * Returns the simple parameter value and/or any expressions, separated by 'AND' + * + * @return the simple parameter value and/or any expressions separated by 'AND' + */ public String getValueWithExpressions () { - StringBuilder completeValue = new StringBuilder((value==null ? "" : value)); - for (String key : expressions.keySet()) { - completeValue.append(" and " + expressions.get(key)); + StringBuilder completeValue = new StringBuilder((value==null ? "" : value)); + boolean first=true; + for (Expression expr : expressions) { + if (value == null && first) { + first = false; + completeValue.append(expr.toString()); + } else { + completeValue.append(" AND " + expr.toString()); + } } - return completeValue.toString(); - - } + return completeValue.toString(); + } @Override public boolean equals (Object otherParameter) { @@ -117,13 +313,19 @@ public class CommandParameter implements Serializable { return getValueWithExpressions(); } + /** + * Clones the CommandParameter + * + * @return a deep, detached clone of this command parameter, for copying + * a parameter to a new state. + */ public CommandParameter copy() { logger.trace("Copying parameter '"+ name + "' for modification"); CommandParameter newParam = new CommandParameter(name); newParam.value = this.value; newParam.operator = this.operator; - for (String key : expressions.keySet()) { - newParam.addExpression(expressions.get(key).copy()); + for (Expression expr : expressions) { + newParam.addExpression(expr.copy()); } return newParam; }