\r
import org.apache.log4j.Logger;\r
\r
-import com.indexdata.pz2utils4jsf.pazpar2.CommandThread;\r
-import com.indexdata.pz2utils4jsf.pazpar2.Pazpar2Command;\r
-import com.indexdata.utils.XmlUtils;\r
import com.indexdata.masterkey.pazpar2.client.ClientCommand;\r
import com.indexdata.masterkey.pazpar2.client.Pazpar2Client;\r
+import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError;\r
\r
public class CommandThread extends Thread {\r
\r
Pazpar2Command command;\r
Pazpar2Client client;\r
private ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
- private StringBuilder response = new StringBuilder("");\r
+ private StringBuilder response = new StringBuilder(""); \r
\r
public CommandThread (Pazpar2Command command, Pazpar2Client client) {\r
this.command = command;\r
this.client = client;\r
}\r
\r
+ /**\r
+ * Runs the specified command using the specified Pazpar2 client\r
+ * Sets the Pazpar2 response as an XML response string to be retrieved by\r
+ * getResponse().\r
+ * \r
+ * In case of an exception, an error response is generated, the document\r
+ * element being the same as it would have been if successful (named after\r
+ * the command, that is). \r
+ * \r
+ */\r
public void run() {\r
ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
if (command.getName().equals("search")) {\r
}\r
try {\r
long start = System.currentTimeMillis();\r
- client.executeCommand(clientCommand, baos);\r
- response.append(baos.toString("UTF-8"));\r
+ Pazpar2HttpResponse httpResponse = client.executeCommand(clientCommand, baos);\r
+ if (httpResponse.getStatusCode()==200) {\r
+ response.append(baos.toString("UTF-8")); \r
+ } else if (httpResponse.getStatusCode()==417) {\r
+ logger.error("Pazpar2 status code 417: " + baos.toString("UTF-8"));\r
+ response.append(CommandError.insertPazpar2ErrorXml(command.getName(), "Expectation failed (417)", baos.toString("UTF-8"))); \r
+ } else {\r
+ String resp = baos.toString("UTF-8");\r
+ logger.error("Pazpar2 status code was " + httpResponse.getStatusCode() + ": " + resp);\r
+ throw new Pazpar2ErrorException(resp,httpResponse.getStatusCode(),resp,null);\r
+ } \r
long end = System.currentTimeMillis(); \r
logger.debug("Executed " + command.getName() + " in " + (end-start) + " ms." );\r
} catch (IOException e) {\r
- logger.error("Message: " + e.getMessage()); \r
- response = new StringBuilder("<"+command.getName()+"><error exception=\"io\">"+XmlUtils.escape(e.getMessage())+"</error></"+command.getName()+">");\r
+ response.append(CommandError.createErrorXml(command.getName(), "io", e.getMessage())); \r
logger.error(response.toString());\r
} catch (Pazpar2ErrorException e) {\r
- logger.error(e.getMessage());\r
- response = new StringBuilder("<"+command.getName()+"><error exception=\"pazpar2error\">"+XmlUtils.escape(e.getMessage())+"</error></"+command.getName()+">"); \r
+ response.append(CommandError.createErrorXml(command.getName(), "pazpar2error", e.getMessage())); \r
logger.error(response.toString());\r
+ } catch (Exception e) {\r
+ response.append(CommandError.createErrorXml(command.getName(), "general", e.getMessage())); \r
+ logger.error(response.toString()); \r
}\r
}\r
\r
+ /**\r
+ * \r
+ * @return Pazpar2 response as an XML string, possibly a generated error XML\r
+ */\r
public String getResponse () {\r
return response.toString();\r
}\r
- \r
+ \r
public Pazpar2Command getCommand() {\r
return command;\r
}\r