Ammends some fringe scenarios with state keys and states
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / Pz2Bean.java
index 9864e06..97f0880 100644 (file)
@@ -34,13 +34,14 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
 \r
   private static final long serialVersionUID = 3440277287081557861L;\r
   private static Logger logger = Logger.getLogger(Pz2Bean.class);\r
+  private static Logger responseLogger = Logger.getLogger("com.indexdata.pz2utils4jsf.pazpar2.responses");\r
   \r
   protected SearchClient searchClient = null;\r
   \r
   @Inject ConfigurationReader configurator;\r
   @Inject StateManager stateMgr;\r
-  @Inject Pazpar2Commands req;\r
-  @Inject Pazpar2Responses data;\r
+  @Inject Pazpar2Commands pzreq;\r
+  @Inject Pazpar2Responses pzresp;\r
   \r
   protected ResultsPager pager = null; \r
 \r
@@ -82,22 +83,23 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
       configurationErrors.add(new ConfigurationError("Search Client","Configuration",e.getMessage(),new ErrorHelper(configReader)));          \r
     } \r
     logger.info(configReader.document());\r
-    data.reset();    \r
+    pzresp.reset();    \r
   }\r
 \r
     \r
   public void doSearch(String query) {\r
-    req.getSearch().setParameter(new CommandParameter("query","=",query));     \r
+    pzreq.getSearch().setParameter(new CommandParameter("query","=",query));     \r
     doSearch();\r
   }\r
 \r
   public void doSearch() { \r
     stateMgr.hasPendingStateChange("search",false);\r
-    data.reset();\r
-    // TODO: avoid state proliferation here:\r
-    req.getRecord().removeParameters();\r
-    req.getShow().setParameter(new CommandParameter("start","=",0));    \r
-    logger.debug(Utils.objectId(this) + " is searching using "+req.getCommandReadOnly("search").getUrlEncodedParameterValue("query"));\r
+    pzresp.reset();\r
+    // resets some record and show command parameters without \r
+    // changing state or creating state change feedback\r
+    pzreq.getRecordInState().removeParametersSilently();        \r
+    pzreq.getShowInState().setParameterSilently(new CommandParameter("start","=",0));    \r
+    logger.debug(Utils.objectId(this) + " is searching using "+pzreq.getCommandReadOnly("search").getUrlEncodedParameterValue("query"));\r
     doCommand("search");    \r
   }\r
       \r
@@ -119,63 +121,78 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
    */\r
   public String update (String commands) {\r
     if (! hasConfigurationErrors()) {\r
-      if (hasQuery()) {\r
-        handleQueryStateChanges(commands);\r
-        logger.debug("Processing request for " + commands); \r
-        List<CommandThread> threadList = new ArrayList<CommandThread>();\r
-        StringTokenizer tokens = new StringTokenizer(commands,",");\r
-        while (tokens.hasMoreElements()) {          \r
-          threadList.add(new CommandThread(req.getCommandReadOnly(tokens.nextToken()),searchClient));            \r
-        }\r
-        for (CommandThread thread : threadList) {\r
-          thread.start();\r
-        }\r
-        for (CommandThread thread : threadList) {\r
-          try {\r
-            thread.join();\r
-          } catch (InterruptedException e) {\r
-            e.printStackTrace();\r
+      if (commandsAreValid(commands)) {\r
+        if (hasQuery()) {\r
+          handleQueryStateChanges(commands);\r
+          logger.debug("Processing request for " + commands); \r
+          List<CommandThread> threadList = new ArrayList<CommandThread>();\r
+          StringTokenizer tokens = new StringTokenizer(commands,",");\r
+          while (tokens.hasMoreElements()) {          \r
+            threadList.add(new CommandThread(pzreq.getCommandReadOnly(tokens.nextToken()),searchClient));            \r
           }\r
-        }\r
-        for (CommandThread thread : threadList) {\r
-           String commandName = thread.getCommand().getName();\r
-           String response = thread.getResponse();\r
-           logger.debug("Response was: " + response);\r
-           Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response);\r
-           data.put(commandName, responseObject);        \r
-        }\r
-        if (commands.equals("record")) {\r
-          logger.debug("Record: Active clients: "+data.getRecord().getActiveClients());\r
-          return data.getRecord().getActiveClients();\r
+          for (CommandThread thread : threadList) {\r
+            thread.start();\r
+          }\r
+          for (CommandThread thread : threadList) {\r
+            try {\r
+              thread.join();\r
+            } catch (InterruptedException e) {\r
+              e.printStackTrace();\r
+            }\r
+          }\r
+          for (CommandThread thread : threadList) {\r
+             String commandName = thread.getCommand().getName();\r
+             String response = thread.getResponse();\r
+             responseLogger.debug("Response was: " + response);\r
+             Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response);\r
+             pzresp.put(commandName, responseObject);        \r
+          }\r
+          if (commands.equals("record")) {\r
+            logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients());\r
+            return pzresp.getRecord().getActiveClients();\r
+          } else {\r
+            return pzresp.getActiveClients();\r
+          }  \r
         } else {\r
-          return data.getActiveClients();\r
-        }  \r
+          logger.debug("Skipped requests for " + commands + " as there's not yet a query."); \r
+          pzresp.reset();\r
+          return "0";\r
+        }\r
       } else {\r
-        logger.debug("Skipped requests for " + commands + " as there's not yet a query."); \r
-        data.reset();\r
+        logger.error("Did not attemt to run command(s) due to a validation error.");\r
         return "0";\r
       }\r
-    } else {\r
+    } else {      \r
       logger.error("Did not attempt to execute query since there are configuration errors.");\r
       return "0";\r
     }\r
     \r
   }\r
+  \r
+  public boolean commandsAreValid(String commands) {\r
+    if (commands.equals("record")) {\r
+      if (!pzreq.getCommandReadOnly("record").hasParameterSet("id")) {\r
+        logger.error("Attempt to send record command without the id parameter");\r
+        return false;\r
+      }\r
+    }\r
+    return true;\r
+  }\r
                                 \r
   public String toggleRecord (String recId) {\r
     if (hasRecord(recId)) {\r
-      req.getRecord().removeParameters();  \r
-      data.put("record", new RecordResponse());\r
+      pzreq.getRecord().removeParameters();  \r
+      pzresp.put("record", new RecordResponse());\r
       return "";\r
     } else {\r
-      req.getRecord().setRecordId(recId);\r
+      pzreq.getRecord().setId(recId);\r
       return doCommand("record");\r
     }\r
   }\r
   \r
   @Override\r
   public boolean hasRecord (String recId) {\r
-    return req.getCommandReadOnly("record").hasParameters() && data.getRecord().getRecId().equals(recId);\r
+    return pzreq.getCommandReadOnly("record").hasParameters() && pzresp.getRecord().getRecId().equals(recId);\r
   }\r
         \r
   public String getCurrentStateKey () {    \r
@@ -191,7 +208,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
   }\r
   \r
   public boolean hasCommandErrors () {\r
-    return data.hasApplicationError();\r
+    return pzresp.hasApplicationError();\r
   }\r
   \r
   /**\r
@@ -206,20 +223,20 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
   }\r
   \r
   \r
-  protected boolean hasQuery() {    \r
-    return req.getSearch().getParameter("query") != null && req.getSearch().getParameter("query").getValueWithExpressions().length()>0;\r
+  protected boolean hasQuery() {        \r
+    return pzreq.getCommandReadOnly("search").hasParameterSet("query"); \r
   }\r
     \r
     \r
   public ResultsPager getPager () {\r
     if (pager == null) {\r
-      pager = new ResultsPager(data);      \r
+      pager = new ResultsPager(pzresp);      \r
     } \r
     return pager;      \r
   }\r
   \r
   public ResultsPager setPager (int pageRange) {\r
-    pager =  new ResultsPager(data,pageRange,req);\r
+    pager =  new ResultsPager(pzresp,pageRange,pzreq);\r
     return pager;\r
   }\r
   \r
@@ -235,16 +252,16 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable {
     if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) {        \r
       logger.debug("Found pending record ID change. Doing record before updating " + commands);\r
       stateMgr.hasPendingStateChange("record",false);\r
-      if (req.getCommandReadOnly("record").hasParameters()) {\r
+      if (pzreq.getCommandReadOnly("record").hasParameterSet("id")) {\r
         update("record");\r
       } else {         \r
-        data.put("record", new RecordResponse());\r
+        pzresp.put("record", new RecordResponse());\r
       }\r
     }\r
   }\r
   \r
   protected String doCommand(String commandName) {             \r
-    logger.debug(req.getCommandReadOnly(commandName).getEncodedQueryString() + ": Results for "+ req.getCommandReadOnly("search").getEncodedQueryString());\r
+    logger.debug(pzreq.getCommandReadOnly(commandName).getEncodedQueryString() + ": Results for "+ pzreq.getCommandReadOnly("search").getEncodedQueryString());\r
     return update(commandName);\r
   }\r
   \r