Embeds pz2 error XML, if any, in the app error XML
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / CommandThread.java
1 package com.indexdata.pz2utils4jsf.pazpar2;\r
2 \r
3 import java.io.ByteArrayOutputStream;\r
4 import java.io.IOException;\r
5 \r
6 import org.apache.log4j.Logger;\r
7 \r
8 import com.indexdata.masterkey.pazpar2.client.ClientCommand;\r
9 import com.indexdata.masterkey.pazpar2.client.Pazpar2Client;\r
10 import com.indexdata.masterkey.pazpar2.client.Pazpar2HttpResponse;\r
11 import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException;\r
12 import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError;\r
13 \r
14 public class CommandThread extends Thread {\r
15 \r
16   private static Logger logger = Logger.getLogger(CommandThread.class);\r
17   Pazpar2Command command;\r
18   Pazpar2Client client;\r
19   private ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
20   private StringBuilder response = new StringBuilder("");  \r
21   \r
22   public CommandThread (Pazpar2Command command, Pazpar2Client client) {\r
23     this.command = command;\r
24     this.client = client;\r
25   }\r
26   \r
27   /**\r
28    * Runs the specified command using the specified Pazpar2 client\r
29    * Sets the Pazpar2 response as an XML response string to be retrieved by\r
30    * getResponse().\r
31    * \r
32    * In case of an exception, an error response is generated, the document\r
33    * element being the same as it would have been if successful (named after\r
34    * the command, that is).  \r
35    *  \r
36    */\r
37   public void run() {\r
38     ClientCommand clientCommand = new ClientCommand(command.getName(), command.getEncodedQueryString());\r
39     if (command.getName().equals("search")) {\r
40       client.setSearchCommand(clientCommand);\r
41     }\r
42     try {\r
43       long start = System.currentTimeMillis();\r
44       Pazpar2HttpResponse httpResponse = client.executeCommand(clientCommand, baos);\r
45       if (httpResponse.getStatusCode()==200) {\r
46         response.append(baos.toString("UTF-8"));  \r
47       } else if (httpResponse.getStatusCode()==417) {\r
48         logger.error("Pazpar2 status code 417: " + baos.toString("UTF-8"));\r
49         response.append(CommandError.insertPazpar2ErrorXml(command.getName(), "Expectation failed (417)", baos.toString("UTF-8")));        \r
50       } else {\r
51         String resp = baos.toString("UTF-8");\r
52         logger.error("Pazpar2 status code was " + httpResponse.getStatusCode() + ": " + resp);\r
53         throw new Pazpar2ErrorException(resp,httpResponse.getStatusCode(),resp,null);\r
54       }       \r
55       long end = System.currentTimeMillis();      \r
56       logger.debug("Executed " + command.getName() + " in " + (end-start) + " ms." );\r
57     } catch (IOException e) {\r
58       response.append(CommandError.createErrorXml(command.getName(), "io", e.getMessage())); \r
59       logger.error(response.toString());\r
60     } catch (Pazpar2ErrorException e) {\r
61       response.append(CommandError.createErrorXml(command.getName(), "pazpar2error", e.getMessage())); \r
62       logger.error(response.toString());\r
63     } catch (Exception e) {\r
64       response.append(CommandError.createErrorXml(command.getName(), "general", e.getMessage())); \r
65       logger.error(response.toString());      \r
66     }\r
67   }\r
68   \r
69   /**\r
70    * \r
71    * @return Pazpar2 response as an XML string, possibly a generated error XML\r
72    */\r
73   public String getResponse () {\r
74     return response.toString();\r
75   }\r
76     \r
77   public Pazpar2Command getCommand() {\r
78     return command;\r
79   }\r
80 \r
81 }\r