Adds methods handling 'filter' and 'limit' expressions
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / Pazpar2Command.java
index 73fd075..7c0ec74 100644 (file)
@@ -3,35 +3,82 @@ package com.indexdata.mkjsf.pazpar2.commands;
 import java.io.Serializable;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
+import java.util.StringTokenizer;\r
 \r
 import org.apache.log4j.Logger;\r
 \r
+import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;\r
+import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;\r
+import com.indexdata.mkjsf.pazpar2.Pz2Service;\r
+import com.indexdata.mkjsf.pazpar2.SearchClient;\r
 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
-import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
+import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
+import com.indexdata.mkjsf.pazpar2.data.ResponseParser;\r
+import com.indexdata.mkjsf.pazpar2.data.Responses;\r
 \r
 public abstract class Pazpar2Command implements Serializable  {\r
   \r
   private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
   private static final long serialVersionUID = -6825491856480675917L;   \r
   protected String name = "";\r
-  protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();\r
+  protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();  \r
   \r
-  protected StateManager stateMgr;\r
-    \r
-  public Pazpar2Command (String name, StateManager stateMgr) {\r
+  public Pazpar2Command () {    \r
+  }\r
+  \r
+  public void setCommandName(String name) {\r
     this.name = name;\r
-    this.stateMgr = stateMgr;\r
+  }\r
+          \r
+  public Pazpar2Command (String name) {\r
+    this.name = name;    \r
   }\r
       \r
   public abstract Pazpar2Command copy ();\r
-  \r
+          \r
   public String getCommandName() {\r
     return name;\r
   }\r
+  \r
+  public ResponseDataObject run() {    \r
+    return run(Pz2Service.get().getSearchClient(),\r
+               Pz2Service.get().getPzresp());\r
+  }\r
+  \r
+  public ResponseDataObject runWith(String... parameters) {\r
+    for (String parameter : parameters) {\r
+      StringTokenizer tokenizer = new StringTokenizer(parameter,"=");\r
+      String name = (String) tokenizer.nextElement();\r
+      String value = (String) tokenizer.nextElement();\r
+      CommandParameter commandParameter = new CommandParameter(name,"=",value);\r
+      setParameterInState(commandParameter);\r
+    }\r
+    return run();\r
+  }\r
+  \r
+  /**\r
+   * For running the command in a thread. Client and Responses must be \r
+   * provided because at this point the CDI bean cannot be retrieved \r
+   * from within a thread.\r
+   * \r
+   * @param client\r
+   * @param pzresp\r
+   * @return\r
+   */\r
+  public ResponseDataObject run(SearchClient client,Responses pzresp) {\r
+    logger.debug("Running " + getCommandName() + " using " + client);    \r
+    HttpResponseWrapper httpResponse = client.executeCommand(this);\r
+    logger.debug("Parsing response for " + getCommandName());\r
+    ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse);\r
+    logger.trace("Storing response for " + getCommandName());\r
+    pzresp.put(getCommandName(), responseObject);\r
+    return responseObject;    \r
+  }\r
+  \r
     \r
   public void setParameter (CommandParameter parameter) {\r
     Pazpar2Command copy = this.copy();\r
-    logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
+    logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
     copy.parameters.put(parameter.getName(),parameter);\r
     checkInState(copy);\r
   }\r
@@ -39,7 +86,7 @@ public abstract class Pazpar2Command implements Serializable  {
   public void setParameters (CommandParameter... params) {\r
     Pazpar2Command copy = this.copy();\r
     for (CommandParameter param : params) {\r
-      logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
+      logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
       copy.parameters.put(param.getName(),param);\r
     }\r
     checkInState(copy);\r
@@ -47,13 +94,13 @@ public abstract class Pazpar2Command implements Serializable  {
   \r
   public void setParametersInState (CommandParameter... params) {    \r
     for (CommandParameter param : params) {\r
-      logger.debug(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
+      logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
       parameters.put(param.getName(),param);\r
     }    \r
   }\r
     \r
   public void setParameterInState (CommandParameter parameter) {\r
-    logger.debug(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
+    logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
     parameters.put(parameter.getName(),parameter);    \r
   }\r
   \r
@@ -77,20 +124,46 @@ public abstract class Pazpar2Command implements Serializable  {
   public void removeParametersInState() {\r
     parameters = new HashMap<String,CommandParameter>();    \r
   }\r
-\r
+  \r
+  public void addExpression(String parameterName, Expression expression) {\r
+    Pazpar2Command copy = this.copy();\r
+    copy.getParameter(parameterName).addExpression(expression);\r
+    checkInState(copy);\r
+  }\r
+  \r
+  public void removeExpression(String parameterName, Expression expression) {\r
+    Pazpar2Command copy = this.copy();\r
+    copy.getParameter(parameterName).removeExpression(expression);\r
+    checkInState(copy);    \r
+  }\r
+  \r
+  public void removeExpressionsAfter(String parameterName, Expression expression,String... expressionFields) {\r
+    Pazpar2Command copy = this.copy();\r
+    copy.getParameter(parameterName).removeExpressionsAfter(expression,expressionFields);\r
+    checkInState(copy);    \r
+  }\r
+  \r
+  public void removeExpressions(String parameterName, String... expressionFields) {\r
+    Pazpar2Command copy = this.copy();    \r
+    copy.getParameter(parameterName).removeExpressions(expressionFields);    \r
+    if (!getParameter(parameterName).hasValue() && !getParameter(parameterName).hasExpressions()) {\r
+      copy.parameters.remove(parameterName);\r
+    }\r
+    checkInState(copy);    \r
+  }\r
   \r
   public boolean hasParameters () {\r
     return (parameters.keySet().size()>0);\r
   }\r
   \r
   public boolean hasParameterValue(String parameterName) {\r
-    return (parameters.get(parameterName) != null && parameters.get(parameterName).hasValue());\r
+    return (parameters.get(parameterName) != null && (parameters.get(parameterName).hasValue()));\r
   }\r
-  \r
+    \r
   public String getEncodedQueryString () {\r
     StringBuilder queryString = new StringBuilder("command="+name);\r
     for (CommandParameter parameter : parameters.values()) {\r
-      if (parameter.hasValue()) {\r
+      if (parameter.hasValue() || parameter.hasExpressions()) {\r
         queryString.append("&"+parameter.getEncodedQueryString());\r
       }\r
     }\r
@@ -100,7 +173,7 @@ public abstract class Pazpar2Command implements Serializable  {
   public String getValueWithExpressions() {    \r
     StringBuilder value = new StringBuilder("");\r
     for (CommandParameter parameter : parameters.values()) {\r
-      if (parameter.hasValue()) {\r
+      if (parameter.hasValue() || parameter.hasExpressions()) {\r
         value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions());\r
       }\r
    }\r
@@ -109,6 +182,7 @@ public abstract class Pazpar2Command implements Serializable  {
   \r
   @Override\r
   public boolean equals (Object otherCommand) {\r
+    logger.trace("Comparing commands ["+this.toString()+"] and ["+otherCommand.toString() +"]");\r
     return\r
         ((otherCommand instanceof Pazpar2Command)\r
          && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
@@ -124,8 +198,7 @@ public abstract class Pazpar2Command implements Serializable  {
   }\r
 \r
   public String getParameterValue(String parameterName) {\r
-    return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions();\r
-    \r
+    return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions();    \r
   }\r
 \r
   public String getUrlEncodedParameterValue(String parameterName) {\r
@@ -141,13 +214,14 @@ public abstract class Pazpar2Command implements Serializable  {
   } \r
   \r
   private void checkInState(Pazpar2Command command) {\r
-    if (stateMgr != null) {\r
-      stateMgr.checkIn(command);\r
-    } else {\r
-      logger.info("Command '" + command.getCommandName() + "' not affecting state (history) as no state manager was defined for this command.");\r
-    }\r
+    Pz2Service.get().getStateMgr().checkIn(command);\r
   }\r
   \r
-  public abstract ServiceProxyCommand getSp();\r
+  public String navigateTo (String target) {\r
+    return target;\r
+  }\r
   \r
+  public abstract ServiceProxyCommand getSp();\r
+   \r
+  public abstract boolean spOnly();  \r
 }\r