Fixes authentication issues
authorNiels Erik G. Nielsen <nielserik@indexdata.com>
Tue, 4 Jun 2013 17:20:42 +0000 (13:20 -0400)
committerNiels Erik G. Nielsen <nielserik@indexdata.com>
Tue, 4 Jun 2013 17:20:42 +0000 (13:20 -0400)
- avoids Weld injection exception when (authentication) servlet filter is
  run before a Faces context has been established
  (MissingConfigurationContextException) The mkjsf core itself has no
  such filter, but mk2jsf-demo has.
- avoids redirect to given app page on auth failure

src/main/java/com/indexdata/mkjsf/config/Mk2ConfigReader.java
src/main/java/com/indexdata/mkjsf/config/WebXmlConfigReader.java
src/main/java/com/indexdata/mkjsf/errors/MissingConfigurationContextException.java [new file with mode: 0644]
src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Service.java
src/main/java/com/indexdata/mkjsf/pazpar2/ServiceProxyClient.java
src/main/java/com/indexdata/mkjsf/pazpar2/data/sp/AuthResponse.java

index 5cd0566..8679458 100644 (file)
@@ -19,6 +19,7 @@ import org.apache.log4j.Logger;
 import com.indexdata.masterkey.config.MasterkeyConfiguration;\r
 import com.indexdata.masterkey.config.ModuleConfiguration;\r
 import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.errors.MissingConfigurationContextException;\r
 import com.indexdata.mkjsf.utils.Utils;\r
 \r
 import static com.indexdata.mkjsf.utils.Utils.nl;\r
@@ -54,9 +55,14 @@ public class Mk2ConfigReader implements ConfigurationReader  {
     \r
   private Configuration readConfig (Configurable configurable) throws ConfigurationException {\r
     Configuration config = new Configuration();\r
-    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
-    ServletContext servletContext = (ServletContext) externalContext.getContext();  \r
-    MasterkeyConfiguration mkConfigContext;\r
+    MasterkeyConfiguration mkConfigContext = null;\r
+    ExternalContext externalContext = null;\r
+    try {\r
+      externalContext = FacesContext.getCurrentInstance().getExternalContext();      \r
+    } catch (NullPointerException npe){\r
+      throw new MissingConfigurationContextException("No FacesContext available to get configuration context from: " + npe.getMessage());\r
+    }\r
+    ServletContext servletContext = (ServletContext) externalContext.getContext();\r
     try {\r
       mkConfigContext = MasterkeyConfiguration.getInstance(servletContext,\r
       "mkjsf", ((HttpServletRequest) externalContext.getRequest()).getServerName());\r
index 7be0261..6772ccc 100644 (file)
@@ -18,6 +18,7 @@ import javax.servlet.ServletContext;
 import org.apache.log4j.Logger;\r
 \r
 import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.errors.MissingConfigurationContextException;\r
 \r
 /**\r
  * Reads a configuration from the context parameters of the deployment descriptor (web.xml)\r
@@ -48,7 +49,12 @@ public class WebXmlConfigReader implements ConfigurationReader {
       \r
   private Map<String,String> readConfig () throws ConfigurationException {\r
     Map<String,String> map = new HashMap<String,String>();\r
-    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
+    ExternalContext externalContext = null;\r
+    try {\r
+      externalContext = FacesContext.getCurrentInstance().getExternalContext();\r
+    } catch (NullPointerException e) {\r
+      throw new MissingConfigurationContextException("WebXmlConfig: Configuration failed due to missing FacesContext.");\r
+    }\r
     ServletContext servletContext = (ServletContext) externalContext.getContext();        \r
     Enumeration<String> enumer = servletContext.getInitParameterNames();\r
     while (enumer.hasMoreElements()) {\r
diff --git a/src/main/java/com/indexdata/mkjsf/errors/MissingConfigurationContextException.java b/src/main/java/com/indexdata/mkjsf/errors/MissingConfigurationContextException.java
new file mode 100644 (file)
index 0000000..4264900
--- /dev/null
@@ -0,0 +1,26 @@
+package com.indexdata.mkjsf.errors;\r
+\r
+public class MissingConfigurationContextException extends ConfigurationException {\r
+\r
+  private static final long serialVersionUID = 1957059481668826430L;\r
+\r
+  public MissingConfigurationContextException() {\r
+    // TODO Auto-generated constructor stub\r
+  }\r
+\r
+  public MissingConfigurationContextException(String message) {\r
+    super(message);\r
+    // TODO Auto-generated constructor stub\r
+  }\r
+\r
+  public MissingConfigurationContextException(Throwable cause) {\r
+    super(cause);\r
+    // TODO Auto-generated constructor stub\r
+  }\r
+\r
+  public MissingConfigurationContextException(String message, Throwable cause) {\r
+    super(message, cause);\r
+    // TODO Auto-generated constructor stub\r
+  }\r
+\r
+}\r
index 9304475..44cb05b 100644 (file)
@@ -28,6 +28,7 @@ import com.indexdata.mkjsf.errors.ConfigurationError;
 import com.indexdata.mkjsf.errors.ConfigurationException;\r
 import com.indexdata.mkjsf.errors.ErrorCentral;\r
 import com.indexdata.mkjsf.errors.ErrorHelper;\r
+import com.indexdata.mkjsf.errors.MissingConfigurationContextException;\r
 import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Commands;\r
 import com.indexdata.mkjsf.pazpar2.data.RecordResponse;\r
 import com.indexdata.mkjsf.pazpar2.data.Responses;\r
@@ -48,9 +49,8 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
   private List<String> pazpar2Urls = new ArrayList<String>();\r
   public static final String PAZPAR2_URL_LIST = "PAZPAR2_URL_LIST";\r
 \r
-\r
   private static final long serialVersionUID = 3440277287081557861L;\r
-  private static Logger logger = Logger.getLogger(Pz2Service.class);     \r
+  private static Logger logger = Logger.getLogger(Pz2Service.class);  \r
   protected Pz2Client pz2Client = null;\r
   protected ServiceProxyClient spClient = null;\r
   protected SearchClient searchClient = null;  \r
@@ -74,9 +74,9 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
     FacesContext context = FacesContext.getCurrentInstance();\r
     return (Pz2Service) context.getApplication().evaluateExpressionGet(context, "#{pz2}", Object.class); \r
   }\r
-  \r
+    \r
   @PostConstruct\r
-  public void postConstruct() {\r
+  public void postConstruct() throws MissingConfigurationContextException {    \r
     logger.info("Pz2Service PostConstruct of " + this);\r
     stateMgr = new StateManager();\r
     pzreq = new Pazpar2Commands();\r
@@ -85,18 +85,22 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
     pzresp.setErrorHelper(errors.getHelper());\r
     \r
     logger.debug("Pz2Service PostConstruct: Configurator is " + configurator);\r
-    logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");\r
+    logger.debug(Utils.objectId(this) + " will instantiate a Pz2Client next.");    \r
     pz2Client = new Pz2Client();\r
-    configureClient(pz2Client,configurator);\r
     spClient = new ServiceProxyClient();\r
-    configureClient(spClient,configurator);\r
+    stateMgr.addStateListener(this);\r
     try {\r
+      configureClient(pz2Client,configurator);      \r
+      configureClient(spClient,configurator);\r
       this.configure(configurator);\r
+    } catch (MissingConfigurationContextException mcc) {\r
+      logger.info("No configuration context available at this point");\r
+      logger.debug("Configuration invoked from a Servlet filter before application start?");\r
+      throw mcc;\r
     } catch (ConfigurationException e) {\r
-      logger.error("There was a problem configuring the Pz2Service (\"pz2\")");\r
+      logger.warn("There was a problem configuring the Pz2Service and/or clients (\"pz2\")");\r
       e.printStackTrace();\r
-    }    \r
-    stateMgr.addStateListener(this);    \r
+    }     \r
   }\r
   \r
   @Qualifier\r
@@ -127,14 +131,17 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
     return stateMgr;\r
   }\r
   \r
-  public void configureClient(SearchClient client, ConfigurationReader configReader) {\r
+  public void configureClient(SearchClient client, ConfigurationReader configReader)  throws MissingConfigurationContextException {\r
     logger.debug(Utils.objectId(this) + " will configure search client for the session");\r
     try {\r
-      client.configure(configReader);            \r
+      client.configure(configReader);\r
+    } catch (MissingConfigurationContextException mcce) {\r
+      logger.info("No Faces context is available to the configurator at this time of invocation");\r
+      throw mcce;\r
     } catch (ConfigurationException e) {\r
       logger.debug("Pz2Service adding configuration error");\r
       errors.addConfigurationError(new ConfigurationError("Search Client","Configuration",e.getMessage()));                \r
-    } \r
+    }\r
     logger.info(configReader.document());\r
     pzresp.getSp().resetAuthAndBeyond(true);    \r
   }\r
@@ -236,6 +243,40 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
     }\r
     \r
   }\r
+  \r
+  /**\r
+   * This methods main purpose is to support browser history.\r
+   *  \r
+   * When the browsers back or forward buttons are pressed, a  \r
+   * re-search /might/ be required - namely if the query changes.\r
+   * So, as the UI requests updates of the page (show,facets,\r
+   * etc) this method checks if a search must be executed\r
+   * before those updates are performed.\r
+   *  \r
+   * @see {@link com.indexdata.mkjsf.pazpar2.state.StateManager#setCurrentStateKey} \r
+   * @param commands\r
+   */\r
+  protected void handleQueryStateChanges (String commands) {\r
+    if (stateMgr.hasPendingStateChange("search") && hasQuery()) { \r
+      logger.info("Triggered search: Found pending search change [" + pzreq.getCommand("search").toString() + "], doing search before updating " + commands);      \r
+      pzreq.getSearch().run();\r
+    } \r
+    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
+      pzreq.getRecord().run();\r
+    }\r
+  }\r
+      \r
+  @Override\r
+  public void stateUpdated(String commandName) {\r
+    logger.debug("State change reported for [" + commandName + "]");\r
+    if (commandName.equals("show")) {\r
+      logger.debug("Updating show");\r
+      update(commandName);\r
+    } \r
+  }\r
+\r
       \r
   /**\r
    * Will retrieve -- or alternatively remove -- the record with the given \r
@@ -318,64 +359,7 @@ public class Pz2Service implements StateListener, Configurable, Serializable {
     pager =  new ResultsPager(pzresp,pageRange,pzreq);\r
     return pager;\r
   }\r
-   \r
-  /**\r
-   * This methods main purpose is to support browser history.\r
-   *  \r
-   * When the browsers back or forward buttons are pressed, a  \r
-   * re-search /might/ be required - namely if the query changes.\r
-   * So, as the UI requests updates of the page (show,facets,\r
-   * etc) this method checks if a search must be executed\r
-   * before those updates are performed.\r
-   *  \r
-   * @see {@link com.indexdata.mkjsf.pazpar2.state.StateManager#setCurrentStateKey} \r
-   * @param commands\r
-   */\r
-  protected void handleQueryStateChanges (String commands) {\r
-    if (stateMgr.hasPendingStateChange("search") && hasQuery()) { \r
-      logger.info("Triggered search: Found pending search change [" + pzreq.getCommand("search").toString() + "], doing search before updating " + commands);      \r
-      pzreq.getSearch().run();\r
-    } \r
-    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
-      pzreq.getRecord().run();\r
-    }\r
-  }\r
-  \r
-  /**\r
-   * Executes the command and parses the response to create data objects.\r
-   * If the parsed response is of a known type it will be cached in 'pzresp'\r
-   * \r
-   * @param commandName The command to be executed\r
-   * @return An XML response parsed to form a response data object\r
-   */\r
-  /*\r
-  protected ResponseDataObject doCommand(String commandName) {\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
-      logger.info("Request "+commandName + ". Search command is: "+ pzreq.getCommand("search").toString());      \r
-      long start = System.currentTimeMillis();\r
-      ResponseDataObject responseObject = command.run();      \r
-      long end = System.currentTimeMillis();\r
-      logger.debug("Executed " + command.getCommandName() + " in " + (end-start) + " ms." );\r
-      return responseObject;\r
-    }\r
-  }\r
-  */\r
-    \r
-  @Override\r
-  public void stateUpdated(String commandName) {\r
-    logger.debug("State change reported for [" + commandName + "]");\r
-    if (commandName.equals("show")) {\r
-      logger.debug("Updating show");\r
-      update(commandName);\r
-    } \r
-  }\r
-  \r
+     \r
   public void setServiceProxyUrl(String url) {\r
     searchClient = spClient;\r
     setServiceType(SERVICE_TYPE_SP);\r
index aa54403..2956afc 100644 (file)
@@ -34,6 +34,7 @@ import org.apache.log4j.Logger;
 import com.indexdata.mkjsf.config.Configuration;\r
 import com.indexdata.mkjsf.config.ConfigurationReader;\r
 import com.indexdata.mkjsf.errors.ConfigurationException;\r
+import com.indexdata.mkjsf.errors.MissingConfigurationContextException;\r
 import com.indexdata.mkjsf.pazpar2.commands.CommandParameter;\r
 import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command;\r
 import com.indexdata.mkjsf.pazpar2.commands.sp.AuthCommand;\r
@@ -65,7 +66,7 @@ public class ServiceProxyClient implements SearchClient {
   }\r
     \r
   @Override\r
-  public void configure (ConfigurationReader configReader) {\r
+  public void configure (ConfigurationReader configReader) throws MissingConfigurationContextException {\r
     logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader));\r
     try {\r
       config = configReader.getConfiguration(this);      \r
@@ -75,10 +76,12 @@ public class ServiceProxyClient implements SearchClient {
       checkAuth.setParameterInState(new CommandParameter("action","=","check"));\r
       ipAuth = new AuthCommand();\r
       ipAuth.setParameterInState(new CommandParameter("action","=","ipauth"));\r
-    } catch (ConfigurationException c) {\r
-      // TODO: \r
-      c.printStackTrace();\r
-    }    \r
+    } catch (MissingConfigurationContextException mcce) {\r
+      throw mcce;\r
+    } catch (ConfigurationException ce) {\r
+      logger.error("Failed to configure Service Proxy client");\r
+      ce.printStackTrace();\r
+    }\r
   }\r
     \r
   public boolean isAuthenticatingClient () {\r
index 243d949..334bd15 100644 (file)
@@ -21,8 +21,14 @@ public class AuthResponse extends SpResponseDataObject  {
   }\r
   \r
   public String onSuccess(String navigateTo) {\r
-    return navigateTo;\r
+    if (isAuthenticationOk()) {\r
+      return navigateTo;\r
+    } else {\r
+      return null;\r
+    }\r
   }\r
   \r
-  \r
+  public boolean isAuthenticationOk () {\r
+    return getStatus().equalsIgnoreCase("OK");\r
+  }    \r
 }\r