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