Work in progress on error detect,report,troubleshoot
[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 {\r
48         String resp = baos.toString("UTF-8");\r
49         throw new Pazpar2ErrorException(resp,httpResponse.getStatusCode(),resp,null);\r
50       }       \r
51       long end = System.currentTimeMillis();      \r
52       logger.debug("Executed " + command.getName() + " in " + (end-start) + " ms." );\r
53     } catch (IOException e) {\r
54       response.append(CommandError.createErrorXml(command.getName(), "io", e.getMessage())); \r
55       logger.error(response.toString());\r
56     } catch (Pazpar2ErrorException e) {\r
57       response.append(CommandError.createErrorXml(command.getName(), "pazpar2error", e.getMessage())); \r
58       logger.error(response.toString());\r
59     } catch (Exception e) {\r
60       response.append(CommandError.createErrorXml(command.getName(), "general", e.getMessage())); \r
61       logger.error(response.toString());      \r
62     }\r
63   }\r
64   \r
65   /**\r
66    * \r
67    * @return Pazpar2 response as an XML string, possibly a generated error XML\r
68    */\r
69   public String getResponse () {\r
70     return response.toString();\r
71   }\r
72     \r
73   public Pazpar2Command getCommand() {\r
74     return command;\r
75   }\r
76 \r
77 }\r