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
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
\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
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
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
\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
}\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
} \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