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
index 5764777..95dcf1e 100644 (file)
@@ -5,12 +5,11 @@ 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.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
@@ -18,13 +17,23 @@ public class CommandThread extends Thread {
   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
@@ -32,25 +41,39 @@ public class CommandThread extends Thread {
     }\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