8991dde1e6dae6f3b7b50119d08906e50de19ad2
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / RecordCommand.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import org.apache.log4j.Logger;\r
4 \r
5 import com.indexdata.mkjsf.pazpar2.ClientCommandResponse;\r
6 import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper;\r
7 import com.indexdata.mkjsf.pazpar2.Pz2Service;\r
8 import com.indexdata.mkjsf.pazpar2.commands.sp.RecordCommandSp;\r
9 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
10 import com.indexdata.mkjsf.pazpar2.data.RecordResponse;\r
11 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
12 import com.indexdata.mkjsf.pazpar2.data.ResponseParser;\r
13 \r
14 /**\r
15  * Represents a Pazpar2 <code>record</code> command, can be accessed by <code>pzreq.record</code>\r
16  * \r
17  * @author Niels Erik\r
18  *\r
19  */\r
20 public class RecordCommand extends Pazpar2Command implements ServiceProxyCommand {\r
21 \r
22   private static final long serialVersionUID = 2817539422114569506L;\r
23   private static Logger logger = Logger.getLogger(RecordCommand.class);\r
24   private RecordCommandSp spCommand = null;\r
25 \r
26   public RecordCommand() {\r
27     super("record");\r
28   }\r
29   \r
30   /**\r
31    * Special handling of record responses since they come in three distinctly different ways\r
32    * <ol>\r
33    *  <li>As a regular &lt;record&gt; document</li>\r
34    *  <li>In arbitrary XML format, in case of an offset request to get the native format</li>\r
35    *  <li>In binary (non XML) format</li>\r
36    * </ol> \r
37    */\r
38   @Override\r
39   public ResponseDataObject run() {\r
40     ResponseDataObject responseObject = null;\r
41     if (hasParameterValue("id")) {\r
42       HttpResponseWrapper commandResponse = Pz2Service.get().getSearchClient().executeCommand(this);\r
43       \r
44       if (commandResponse.getContentType().contains("xml")) {\r
45         responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse)commandResponse);\r
46         if (ResponseParser.docTypes.contains(responseObject.getType())) {\r
47           logger.debug("Storing " + responseObject.getType() + " in pzresp. ");\r
48         } else {\r
49           logger.debug("Command was 'record' but response not '<record>' - assuming raw record response.");\r
50           ResponseDataObject recordResponse = new RecordResponse();\r
51           recordResponse.setType("record");\r
52           recordResponse.setXml(responseObject.getXml());\r
53           recordResponse.setAttribute("activeclients", "0");\r
54           responseObject = recordResponse;\r
55         }\r
56       } else if (commandResponse.isBinary()) {\r
57         responseObject = new RecordResponse();\r
58         responseObject.setType(getCommandName());\r
59         logger.info("Binary response");\r
60         responseObject.setAttribute("activeclients", "0");\r
61         responseObject.setXml("<record>binary response</record>");\r
62         responseObject.setBinary(commandResponse.getBytes());\r
63       } else {\r
64         logger.error("Response was not found to be XML or binary. The response was not handled.");\r
65       }\r
66       Pz2Service.get().getPzresp().put(getCommandName(), responseObject);\r
67     } else {\r
68       logger.debug("No record id parameter on this command. Ignoring request but clearing any previous record result.");\r
69       Pz2Service.get().getPzresp().put(getCommandName(), new RecordResponse());\r
70     }\r
71     return responseObject;\r
72   }\r
73   \r
74   /**\r
75    * Sets the <code>id</code> parameter. See Pazpar2 documentation for details.\r
76    * \r
77    * @param recId record ID\r
78    */\r
79   public void setId(String recId) {\r
80     setParameter(new CommandParameter("id","=",recId));\r
81   }\r
82 \r
83   /** \r
84    * Returns the <code>id</code> parameter value.\r
85    */\r
86   public String getId () {\r
87     return getParameterValue("id");\r
88   }\r
89 \r
90   /**\r
91    * Sets the <code>offset</code> parameter. See Pazpar2 documentation for details.\r
92    */  \r
93   public void setOffset (String offset) {\r
94     setParameter(new CommandParameter("offset","=",offset));\r
95   }\r
96 \r
97   /** \r
98    * Returns the <code>offset</code> parameter value.\r
99    */\r
100   public String getOffset () {\r
101     return getParameterValue("offset");\r
102   }\r
103   \r
104   /**\r
105    * Sets the <code>checksum</code> parameter. See Pazpar2 documentation for details.\r
106    */  \r
107   public void setChecksum (String checksum) {\r
108     setParameter(new CommandParameter("checksum","=",checksum));\r
109   }\r
110   \r
111   /** \r
112    * Returns the <code>checksum</code> parameter value.\r
113    */\r
114   public String getChecksum () {\r
115     return getParameterValue("checksum");\r
116   }\r
117   \r
118   /**\r
119    * Sets the <code>nativesyntax</code> parameter. See Pazpar2 documentation for details.\r
120    */    \r
121   public void setNativesyntax (String nativesyntax) {\r
122     setParameterInState(new CommandParameter("nativesyntax","=",nativesyntax));\r
123   }\r
124   \r
125   /** \r
126    * Returns the <code>nativesyntax</code> parameter value.\r
127    */\r
128   public String getNativesyntax () {\r
129     return getParameterValue("nativesyntax");\r
130   }\r
131   \r
132   /**\r
133    * Sets the <code>syntax</code> parameter. See Pazpar2 documentation for details.\r
134    */  \r
135   public void setSyntax (String syntax) {\r
136     setParameterInState(new CommandParameter("syntax","=",syntax));    \r
137   }\r
138   \r
139   /** \r
140    * Returns the <code>syntax</code> parameter value.\r
141    */\r
142   public String getSyntax () {\r
143     return getParameterValue("syntax");\r
144   }\r
145   \r
146   /**\r
147    * Sets the <code>esn</code> parameter. See Pazpar2 documentation for details.\r
148    */  \r
149   public void setEsn (String esn) {\r
150     setParameter(new CommandParameter("esn","=",esn));\r
151   }\r
152   \r
153   /** \r
154    * Returns the <code>esn</code> parameter value.\r
155    */\r
156   public String getEsn () {\r
157     return getParameterValue("esn");\r
158   }\r
159   \r
160   /**\r
161    * Sets the <code>binary</code> parameter. See Pazpar2 documentation for details.\r
162    */  \r
163   public void setBinary (String binary) {\r
164     setParameter(new CommandParameter("binary","=",binary));\r
165   }\r
166   \r
167   /** \r
168    * Returns the <code>binary</code> parameter value.\r
169    */\r
170   public String getBinary () {\r
171     return getParameterValue("binary");\r
172   }\r
173 \r
174   @Override\r
175   public RecordCommand copy () {\r
176     RecordCommand newCommand = new RecordCommand();\r
177     for (String parameterName : parameters.keySet()) {\r
178       newCommand.setParameterInState(parameters.get(parameterName).copy());      \r
179     }    \r
180     newCommand.spCommand = new RecordCommandSp(newCommand);\r
181     return newCommand;\r
182   }\r
183   \r
184   \r
185   /**\r
186    * Returns a record command object with Service Proxy extension parameters \r
187    * \r
188    */\r
189   public RecordCommandSp getSp () {\r
190     if (spCommand==null) {\r
191       spCommand = new RecordCommandSp(this);\r
192     } \r
193     return spCommand;\r
194   }\r
195 \r
196   @Override\r
197   public boolean spOnly() {    \r
198     return false;\r
199   }\r
200 }\r