Refactors commands and injection
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / Pazpar2Command.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import java.io.Serializable;\r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 \r
7 import org.apache.log4j.Logger;\r
8 \r
9 import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;\r
10 import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;\r
11 import com.indexdata.mkjsf.pazpar2.Pz2Bean;\r
12 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
13 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
14 import com.indexdata.mkjsf.pazpar2.data.ResponseParser;\r
15 \r
16 public abstract class Pazpar2Command implements Serializable  {\r
17   \r
18   private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
19   private static final long serialVersionUID = -6825491856480675917L;   \r
20   protected String name = "";\r
21   protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();  \r
22   \r
23   public Pazpar2Command () {\r
24     \r
25   }\r
26   \r
27   public void setCommandName(String name) {\r
28     this.name = name;\r
29   }\r
30           \r
31   public Pazpar2Command (String name) {\r
32     this.name = name;    \r
33   }\r
34       \r
35   public abstract Pazpar2Command copy ();\r
36           \r
37   public String getCommandName() {\r
38     return name;\r
39   }\r
40   \r
41   public ResponseDataObject run() {\r
42     logger.info("Running " + getCommandName() + " using " + Pz2Bean.get().getSearchClient());    \r
43     HttpResponseWrapper httpResponse = Pz2Bean.get().getSearchClient().executeCommand(this);\r
44     logger.info("Parsing response for " + getCommandName());\r
45     ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse);\r
46     logger.info("Storing response for " + getCommandName());\r
47     Pz2Bean.get().getPzresp().put(getCommandName(), responseObject);\r
48     return responseObject;\r
49   }\r
50     \r
51   public void setParameter (CommandParameter parameter) {\r
52     Pazpar2Command copy = this.copy();\r
53     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
54     copy.parameters.put(parameter.getName(),parameter);\r
55     checkInState(copy);\r
56   }\r
57   \r
58   public void setParameters (CommandParameter... params) {\r
59     Pazpar2Command copy = this.copy();\r
60     for (CommandParameter param : params) {\r
61       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
62       copy.parameters.put(param.getName(),param);\r
63     }\r
64     checkInState(copy);\r
65   }\r
66   \r
67   public void setParametersInState (CommandParameter... params) {    \r
68     for (CommandParameter param : params) {\r
69       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
70       parameters.put(param.getName(),param);\r
71     }    \r
72   }\r
73     \r
74   public void setParameterInState (CommandParameter parameter) {\r
75     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
76     parameters.put(parameter.getName(),parameter);    \r
77   }\r
78   \r
79   \r
80   public CommandParameter getParameter (String name) {\r
81     return parameters.get(name);\r
82   }\r
83   \r
84   public void removeParameter (String name) {\r
85     Pazpar2Command copy = this.copy();\r
86     copy.parameters.remove(name);\r
87     checkInState(copy);\r
88   }\r
89   \r
90   public void removeParameters() {\r
91     Pazpar2Command copy = this.copy();\r
92     copy.parameters = new HashMap<String,CommandParameter>();\r
93     checkInState(copy);\r
94   }\r
95   \r
96   public void removeParametersInState() {\r
97     parameters = new HashMap<String,CommandParameter>();    \r
98   }\r
99 \r
100   \r
101   public boolean hasParameters () {\r
102     return (parameters.keySet().size()>0);\r
103   }\r
104   \r
105   public boolean hasParameterValue(String parameterName) {\r
106     return (parameters.get(parameterName) != null && parameters.get(parameterName).hasValue());\r
107   }\r
108   \r
109   public String getEncodedQueryString () {\r
110     StringBuilder queryString = new StringBuilder("command="+name);\r
111     for (CommandParameter parameter : parameters.values()) {\r
112       if (parameter.hasValue()) {\r
113         queryString.append("&"+parameter.getEncodedQueryString());\r
114       }\r
115     }\r
116     return queryString.toString();\r
117   } \r
118     \r
119   public String getValueWithExpressions() {    \r
120     StringBuilder value = new StringBuilder("");\r
121     for (CommandParameter parameter : parameters.values()) {\r
122       if (parameter.hasValue()) {\r
123         value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions());\r
124       }\r
125    }\r
126     return value.toString();\r
127   }\r
128   \r
129   @Override\r
130   public boolean equals (Object otherCommand) {\r
131     return\r
132         ((otherCommand instanceof Pazpar2Command)\r
133          && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
134   }\r
135   \r
136   @Override\r
137   public int hashCode () {\r
138     return getValueWithExpressions().hashCode();\r
139   }\r
140   \r
141   public String toString () {\r
142     return parameters.toString();\r
143   }\r
144 \r
145   public String getParameterValue(String parameterName) {\r
146     return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions();\r
147     \r
148   }\r
149 \r
150   public String getUrlEncodedParameterValue(String parameterName) {\r
151     return getParameter(parameterName).getEncodedQueryString();\r
152   }\r
153   \r
154   public void setSession (String sessionId) {\r
155     setParameter(new CommandParameter("session","=",sessionId));\r
156   }\r
157   \r
158   public String getSession() {\r
159     return getParameterValue("session");\r
160   } \r
161   \r
162   private void checkInState(Pazpar2Command command) {\r
163     Pz2Bean.get().getStateMgr().checkIn(command);\r
164     // if (stateMgr() != null) {\r
165     //   stateMgr().checkIn(command);\r
166     // } else {\r
167     //   logger.info("Command '" + command.getCommandName() + "' not affecting state (history) as no state manager was defined for this command.");\r
168     // }\r
169   }\r
170   \r
171   public abstract ServiceProxyCommand getSp();\r
172    \r
173   public abstract boolean spOnly();  \r
174 }\r