More work on commands, statemgmt, EL references
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / CommandThread.java
index 5764777..323ef78 100644 (file)
@@ -5,52 +5,73 @@ import java.io.IOException;
 \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.exceptions.Pazpar2ErrorException;\r
+import com.indexdata.pz2utils4jsf.pazpar2.commands.Pazpar2Command;\r
+import com.indexdata.pz2utils4jsf.pazpar2.data.CommandError;\r
 \r
 public class CommandThread extends Thread {\r
 \r
   private static Logger logger = Logger.getLogger(CommandThread.class);\r
   Pazpar2Command command;\r
-  Pazpar2Client client;\r
+  SearchClient 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
+  public CommandThread (Pazpar2Command command, SearchClient 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
+    \r
     if (command.getName().equals("search")) {\r
-      client.setSearchCommand(clientCommand);\r
+      client.setSearchCommand(command);\r
     }\r
     try {\r
       long start = System.currentTimeMillis();\r
-      client.executeCommand(clientCommand, baos);\r
-      response.append(baos.toString("UTF-8"));\r
+      CommandResponse commandResponse = client.executeCommand(command, baos);\r
+      if (commandResponse.getStatusCode()==200) {\r
+        response.append(commandResponse.getResponseString());  \r
+      } else if (commandResponse.getStatusCode()==417) {        \r
+        logger.error("Pazpar2 status code 417: " + baos.toString("UTF-8"));\r
+        response.append(CommandError.insertPazpar2ErrorXml(command.getName(), "Expectation failed (417)", commandResponse.getResponseString()));        \r
+      } else {\r
+        String resp = baos.toString("UTF-8");\r
+        logger.error("Pazpar2 status code was " + commandResponse.getStatusCode() + ": " + resp);\r
+        throw new Pazpar2ErrorException(resp,commandResponse.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