Refactors commands and injection
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / Pz2Bean.java
index 1c825a8..05744cd 100644 (file)
@@ -1,6 +1,8 @@
 package com.indexdata.mkjsf.pazpar2;\r
 \r
 import java.io.Serializable;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.HashMap;\r
@@ -10,8 +12,11 @@ import java.util.StringTokenizer;
 \r
 import javax.annotation.PostConstruct;\r
 import javax.enterprise.context.SessionScoped;\r
+import javax.enterprise.inject.Produces;\r
+import javax.faces.context.FacesContext;\r
 import javax.inject.Inject;\r
 import javax.inject.Named;\r
+import javax.inject.Qualifier;\r
 \r
 import org.apache.log4j.Logger;\r
 \r
@@ -56,10 +61,11 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
   protected SearchClient searchClient = null;  \r
     \r
   @Inject ConfigurationReader configurator;\r
-  @Inject StateManager stateMgr;\r
-  @Inject Pazpar2Commands pzreq;\r
-  @Inject Responses pzresp;\r
-  @Inject ErrorCentral errors;  \r
+  \r
+  private StateManager stateMgr = null;\r
+  private Pazpar2Commands pzreq = null;\r
+  private Responses pzresp = null;\r
+  private ErrorCentral errors = null;  \r
   \r
   protected ResultsPager pager = null; \r
   \r
@@ -69,9 +75,21 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
     logger.info("Instantiating pz2 bean [" + Utils.objectId(this) + "]");    \r
   }\r
   \r
+  public static Pz2Bean get() {\r
+    FacesContext context = FacesContext.getCurrentInstance();\r
+    return (Pz2Bean) context.getApplication().evaluateExpressionGet(context, "#{pz2}", Object.class); \r
+  }\r
+  \r
   @PostConstruct\r
-  public void postConstruct() {    \r
-    logger.debug("Pz2Bean post-construct: Configurator is " + configurator);\r
+  public void postConstruct() {\r
+    logger.info("Pz2Bean PostConstruct of " + this);\r
+    stateMgr = new StateManager();\r
+    pzreq = new Pazpar2Commands();\r
+    pzresp = new Responses();    \r
+    errors = new ErrorCentral(); \r
+    pzresp.setErrorHelper(errors.getHelper());\r
+    \r
+    logger.debug("Pz2Bean PostConstruct: Configurator is " + configurator);\r
     logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");\r
     pz2Client = new Pz2Client();\r
     configureClient(pz2Client,configurator);\r
@@ -84,7 +102,36 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
       e.printStackTrace();\r
     }    \r
     stateMgr.addStateListener(this);    \r
-  }  \r
+  }\r
+  \r
+  @Qualifier\r
+  @Target({java.lang.annotation.ElementType.TYPE,\r
+           java.lang.annotation.ElementType.METHOD,\r
+           java.lang.annotation.ElementType.PARAMETER,\r
+           java.lang.annotation.ElementType.FIELD})\r
+  @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\r
+  public  @interface Preferred{}\r
+  \r
+  @Produces @Preferred @SessionScoped @Named("pzresp") public Responses getPzresp () {\r
+    logger.info("Producing pzresp");\r
+    return pzresp;\r
+  }\r
+  \r
+  @Produces @Preferred @SessionScoped @Named("pzreq") public Pazpar2Commands getPzreq () {\r
+    logger.info("Producing pzreq");\r
+    return pzreq;\r
+  }\r
+  \r
+  @Produces @Preferred @SessionScoped @Named("errors") public ErrorCentral getErrors() {\r
+    logger.info("Producing errors");\r
+    return errors;\r
+  }\r
+  \r
+  @Produces @Preferred @SessionScoped @Named("stateMgr") public StateManager getStateMgr() {\r
+    logger.info("Produces stateMgr");\r
+    return stateMgr;\r
+  }\r
+\r
   \r
   public void configureClient(SearchClient client, ConfigurationReader configReader) {\r
     logger.debug(Utils.objectId(this) + " will configure search client for the session");\r
@@ -109,6 +156,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
   }\r
 \r
   public void doSearch() {\r
+    try {\r
     if (errors.hasConfigurationErrors()) {\r
       logger.error("Ignoring search request due to configuration errors.");\r
     } else if (searchClient == null){\r
@@ -123,6 +171,9 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
       searchClient.setSearchCommand(pzreq.getCommand("search"));\r
       doCommand("search");\r
     }\r
+    } catch (NullPointerException npe) {\r
+      npe.printStackTrace();      \r
+    }\r
   }\r
   \r
   public String doRecord() {\r
@@ -315,44 +366,16 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
    * @return An XML response parsed to form a response data object\r
    */\r
   protected ResponseDataObject doCommand(String commandName) {\r
-    if (pzreq.getCommand(commandName).spOnly() && isPazpar2Service()) {\r
-      logger.warn("Skipping " + commandName + " - SP-only command, un-supported by Pazpar2");\r
+    Pazpar2Command command = pzreq.getCommand(commandName);\r
+    if (command.spOnly() && isPazpar2Service()) {\r
+      logger.warn("Skipping " + commandName + " - SP-only command, not supported by Pazpar2");\r
       return new ResponseDataObject();\r
     } else {\r
-      ResponseDataObject responseObject = null;     \r
-      logger.info("Request "+commandName + ": "+ pzreq.getCommand("search").toString());\r
-      Pazpar2Command command = pzreq.getCommand(commandName);\r
+      logger.info("Request "+commandName + ". Search command is: "+ pzreq.getCommand("search").toString());      \r
       long start = System.currentTimeMillis();\r
-      HttpResponseWrapper commandResponse = searchClient.executeCommand(command);\r
+      ResponseDataObject responseObject = command.run();      \r
       long end = System.currentTimeMillis();\r
       logger.debug("Executed " + command.getCommandName() + " in " + (end-start) + " ms." );\r
-      responseLogger.debug("Response was: " + commandResponse.getResponseString());\r
-      if (commandResponse.getContentType().contains("xml")) {\r
-        responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse)commandResponse);\r
-        if (ResponseParser.docTypes.contains(responseObject.getType())) {\r
-          logger.debug("Storing " + responseObject.getType() + " in pzresp. ");\r
-          pzresp.put(commandName, responseObject);\r
-        } else {\r
-          if (commandName.equals("record")) {\r
-            logger.debug("Command was 'record' but response not '<record>' - assuming raw record response.");\r
-            ResponseDataObject recordResponse = new RecordResponse(); \r
-            recordResponse.setType("record");\r
-            recordResponse.setXml(responseObject.getXml());          \r
-            recordResponse.setAttribute("activeclients", "0");\r
-            pzresp.put("record", recordResponse); \r
-          }        \r
-        }\r
-      } else if (commandResponse.isBinary()) {\r
-        responseObject = new RecordResponse(); \r
-        responseObject.setType(commandName);\r
-        logger.info("Binary response");\r
-        responseObject.setAttribute("activeclients", "0");\r
-        responseObject.setXml("<record>binary response</record>");\r
-        responseObject.setBinary(commandResponse.getBytes());\r
-        pzresp.put("record", responseObject);\r
-      } else {\r
-        logger.error("Response was not found to be XML or binary. The response was not handled.");\r
-      }\r
       return responseObject;\r
     }\r
   }\r
@@ -402,6 +425,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
       pzreq.getSearch().removeParametersInState();\r
       pzresp.getSp().resetAuthAndBeyond(true);      \r
       searchClient.setServiceUrl(url);\r
+      // pzreq.setService(this);\r
     }    \r
   }\r
   \r
@@ -551,4 +575,8 @@ public class Pz2Bean implements Pz2Interface, StateListener, Configurable, Seria
     }\r
   }\r
   \r
+  public SearchClient getSearchClient() {\r
+    return searchClient;\r
+  }\r
+  \r
 }\r