Adds check for SP only commands.
[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.commands.sp.ServiceProxyCommand;\r
10 import com.indexdata.mkjsf.pazpar2.state.StateManager;\r
11 \r
12 public abstract class Pazpar2Command implements Serializable  {\r
13   \r
14   private static Logger logger = Logger.getLogger(Pazpar2Command.class);\r
15   private static final long serialVersionUID = -6825491856480675917L;   \r
16   protected String name = "";\r
17   protected Map<String,CommandParameter> parameters = new HashMap<String,CommandParameter>();\r
18   \r
19   protected StateManager stateMgr;\r
20     \r
21   public Pazpar2Command (String name, StateManager stateMgr) {\r
22     this.name = name;\r
23     this.stateMgr = stateMgr;\r
24   }\r
25       \r
26   public abstract Pazpar2Command copy ();\r
27   \r
28   public String getCommandName() {\r
29     return name;\r
30   }\r
31     \r
32   public void setParameter (CommandParameter parameter) {\r
33     Pazpar2Command copy = this.copy();\r
34     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "]");\r
35     copy.parameters.put(parameter.getName(),parameter);\r
36     checkInState(copy);\r
37   }\r
38   \r
39   public void setParameters (CommandParameter... params) {\r
40     Pazpar2Command copy = this.copy();\r
41     for (CommandParameter param : params) {\r
42       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "]");\r
43       copy.parameters.put(param.getName(),param);\r
44     }\r
45     checkInState(copy);\r
46   }\r
47   \r
48   public void setParametersInState (CommandParameter... params) {    \r
49     for (CommandParameter param : params) {\r
50       logger.trace(name + " command: setting parameter [" + param.getName() + "=" + param.getValueWithExpressions() + "] silently");\r
51       parameters.put(param.getName(),param);\r
52     }    \r
53   }\r
54     \r
55   public void setParameterInState (CommandParameter parameter) {\r
56     logger.trace(name + " command: setting parameter [" + parameter.getName() + "=" + parameter.getValueWithExpressions() + "] silently");\r
57     parameters.put(parameter.getName(),parameter);    \r
58   }\r
59   \r
60   \r
61   public CommandParameter getParameter (String name) {\r
62     return parameters.get(name);\r
63   }\r
64   \r
65   public void removeParameter (String name) {\r
66     Pazpar2Command copy = this.copy();\r
67     copy.parameters.remove(name);\r
68     checkInState(copy);\r
69   }\r
70   \r
71   public void removeParameters() {\r
72     Pazpar2Command copy = this.copy();\r
73     copy.parameters = new HashMap<String,CommandParameter>();\r
74     checkInState(copy);\r
75   }\r
76   \r
77   public void removeParametersInState() {\r
78     parameters = new HashMap<String,CommandParameter>();    \r
79   }\r
80 \r
81   \r
82   public boolean hasParameters () {\r
83     return (parameters.keySet().size()>0);\r
84   }\r
85   \r
86   public boolean hasParameterValue(String parameterName) {\r
87     return (parameters.get(parameterName) != null && parameters.get(parameterName).hasValue());\r
88   }\r
89   \r
90   public String getEncodedQueryString () {\r
91     StringBuilder queryString = new StringBuilder("command="+name);\r
92     for (CommandParameter parameter : parameters.values()) {\r
93       if (parameter.hasValue()) {\r
94         queryString.append("&"+parameter.getEncodedQueryString());\r
95       }\r
96     }\r
97     return queryString.toString();\r
98   } \r
99     \r
100   public String getValueWithExpressions() {    \r
101     StringBuilder value = new StringBuilder("");\r
102     for (CommandParameter parameter : parameters.values()) {\r
103       if (parameter.hasValue()) {\r
104         value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions());\r
105       }\r
106    }\r
107     return value.toString();\r
108   }\r
109   \r
110   @Override\r
111   public boolean equals (Object otherCommand) {\r
112     return\r
113         ((otherCommand instanceof Pazpar2Command)\r
114          && this.getValueWithExpressions().equals(((Pazpar2Command) otherCommand).getValueWithExpressions()));\r
115   }\r
116   \r
117   @Override\r
118   public int hashCode () {\r
119     return getValueWithExpressions().hashCode();\r
120   }\r
121   \r
122   public String toString () {\r
123     return parameters.toString();\r
124   }\r
125 \r
126   public String getParameterValue(String parameterName) {\r
127     return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions();\r
128     \r
129   }\r
130 \r
131   public String getUrlEncodedParameterValue(String parameterName) {\r
132     return getParameter(parameterName).getEncodedQueryString();\r
133   }\r
134   \r
135   public void setSession (String sessionId) {\r
136     setParameter(new CommandParameter("session","=",sessionId));\r
137   }\r
138   \r
139   public String getSession() {\r
140     return getParameterValue("session");\r
141   } \r
142   \r
143   private void checkInState(Pazpar2Command command) {\r
144     if (stateMgr != null) {\r
145       stateMgr.checkIn(command);\r
146     } else {\r
147       logger.info("Command '" + command.getCommandName() + "' not affecting state (history) as no state manager was defined for this command.");\r
148     }\r
149   }\r
150   \r
151   public abstract ServiceProxyCommand getSp();\r
152    \r
153   public abstract boolean spOnly();  \r
154 }\r