You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by ge...@apache.org on 2005/01/03 03:28:57 UTC

svn commit: r123922 - in struts/core/trunk: conf/share src/share/org/apache/struts/chain/commands src/share/org/apache/struts/config

Author: germuska
Date: Sun Jan  2 18:28:56 2005
New Revision: 123922

URL: http://svn.apache.org/viewcvs?view=rev&rev=123922
Log:
Add support for executing chain commands associated with ActionMappings, instead 
of or in addition to normal action/forward/include processing.

Also correct reference to TilesPreProcessor in chain-config.xml reflecting the 
factoring of tiles out of core.

Added:
   struts/core/trunk/src/share/org/apache/struts/chain/commands/ExecuteCommand.java
Modified:
   struts/core/trunk/conf/share/chain-config.xml
   struts/core/trunk/conf/share/struts-config_1_3.dtd
   struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java
   struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java

Modified: struts/core/trunk/conf/share/chain-config.xml
Url: http://svn.apache.org/viewcvs/struts/core/trunk/conf/share/chain-config.xml?view=diff&rev=123922&p1=struts/core/trunk/conf/share/chain-config.xml&r1=123921&p2=struts/core/trunk/conf/share/chain-config.xml&r2=123922
==============================================================================
--- struts/core/trunk/conf/share/chain-config.xml	(original)
+++ struts/core/trunk/conf/share/chain-config.xml	Sun Jan  2 18:28:56 2005
@@ -182,6 +182,12 @@
           className="org.apache.struts.chain.commands.servlet.SelectInput"/>
        
        
+      <!-- Lookup and execute a chain command if the current ActionConfig is 
+           so-configured. -->
+      <command
+          className="org.apache.struts.chain.commands.ExecuteCommand"/>
+       
+       
       <!-- Select the appropriate ForwardConfig for action mappings that only
            have an ActionForward -->
       <command
@@ -209,15 +215,8 @@
 
 
       <!--
-      If you want to use Tiles, uncomment this command, and modify your 
-      Struts Configuration to use this PlugIn:
-      "org.apache.struts.chain.legacy.TilesPlugin"
-      
-      This PlugIn is required because the basic TilesPlugIn tests at initialization
-      time to make sure that you are specific using the TilesRequestProcessor 
-      (or a subclass), and the struts-chain ComposableRequestProcessor fails that test.  
-      In every other respect, the struts-chain TilesPlugin is identical to the normal 
-      TilesPlugIn, and is configured in the same way.
+      If you want to use Tiles, uncomment this command and make sure you have 
+      the struts-tiles JAR included in your web application.
 
       <command
           className="org.apache.struts.chain.commands.servlet.TilesPreProcessor"/>

Modified: struts/core/trunk/conf/share/struts-config_1_3.dtd
Url: http://svn.apache.org/viewcvs/struts/core/trunk/conf/share/struts-config_1_3.dtd?view=diff&rev=123922&p1=struts/core/trunk/conf/share/struts-config_1_3.dtd&r1=123921&p2=struts/core/trunk/conf/share/struts-config_1_3.dtd&r2=123922
==============================================================================
--- struts/core/trunk/conf/share/struts-config_1_3.dtd	(original)
+++ struts/core/trunk/conf/share/struts-config_1_3.dtd	Sun Jan  2 18:28:56 2005
@@ -361,6 +361,10 @@
                      the bean's specified "name". Optional if "name" is specified,
                      else not valid.
 
+     catalog         The name of a commons-chain catalog in which to look up
+                     a command to be executed as part of servicing this request.
+                     Only meaningful if "command" is also specified.
+
      className       The fully qualified Java class name of the ActionMapping
                      subclass to use for this action mapping object. Defaults to
                      the type specified by the enclosing <action-mappings>
@@ -368,6 +372,9 @@
                      not specified.
                      ["org.apache.struts.action.ActionMapping"]
 
+     command         The name of a commons-chain command which should be looked up
+                     and executed as part of servicing this request.  
+
      forward         Module-relative path of the servlet or other resource that
                      will process this request, instead of the Action class
                      specified by "type".  The path WILL NOT be processed
@@ -443,7 +450,9 @@
 <!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>
 <!ATTLIST action         id             ID              #IMPLIED>
 <!ATTLIST action         attribute      %BeanName;      #IMPLIED>
+<!ATTLIST action         catalog        CDATA           #IMPLIED>
 <!ATTLIST action         className      %ClassName;     #IMPLIED>
+<!ATTLIST action         command        CDATA           #IMPLIED>
 <!ATTLIST action         forward        %RequestPath;   #IMPLIED>
 <!ATTLIST action         include        %RequestPath;   #IMPLIED>
 <!ATTLIST action         input          %RequestPath;   #IMPLIED>

Added: struts/core/trunk/src/share/org/apache/struts/chain/commands/ExecuteCommand.java
Url: http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/chain/commands/ExecuteCommand.java?view=auto&rev=123922
==============================================================================
--- (empty file)
+++ struts/core/trunk/src/share/org/apache/struts/chain/commands/ExecuteCommand.java	Sun Jan  2 18:28:56 2005
@@ -0,0 +1,176 @@
+package org.apache.struts.chain.commands;
+
+import org.apache.struts.chain.Constants;
+import org.apache.struts.config.ActionConfig;
+
+import org.apache.commons.chain.Catalog;
+import org.apache.commons.chain.CatalogFactory;
+import org.apache.commons.chain.Command;
+import org.apache.commons.chain.Context;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * <p>Invoke the appropriate <code>Command</code> for this request.  If the context's 
+ * <code>ActionConfig</code> has no <code>command</code> property defined, no action 
+ * will be taken.  If the specified command cannot be found, a warning will be logged,
+ * but processing will continue.  Depending on how the chain is configured, this can 
+ * be used in place of an <code>Action</code> or as a method of performing pre-processing.
+ * </p>
+ * <p>If used instead of an action, the command which is looked up should put an ActionForward
+ * into the context, unless it has already dealt with the response.</p>
+ * @version $Id$
+ */
+public class ExecuteCommand implements Command {
+
+
+    // ------------------------------------------------------ Instance Variables
+
+
+    private String actionConfigKey = Constants.ACTION_CONFIG_KEY;
+    private String validKey = Constants.VALID_KEY;
+
+    private static final Log log =
+        LogFactory.getLog(ExecuteCommand.class);
+
+
+    // -------------------------------------------------------------- Properties
+
+
+    /**
+     * <p>Return the context attribute key under which the
+     * <code>ActionConfig</code> for the currently selected application
+     * action is stored.</p>
+     */
+    public String getActionConfigKey() {
+
+        return (this.actionConfigKey);
+
+    }
+
+
+    /**
+     * <p>Set the context attribute key under which the
+     * <code>ActionConfig</code> for the currently selected application
+     * action is stored.</p>
+     *
+     * @param actionConfigKey The new context attribute key
+     */
+    public void setActionConfigKey(String actionConfigKey) {
+
+        this.actionConfigKey = actionConfigKey;
+
+    }
+
+
+    /**
+     * <p>Return the context attribute key under which the
+     * validity flag for this request is stored.</p>
+     */
+    public String getValidKey() {
+
+        return (this.validKey);
+
+    }
+
+
+    /**
+     * <p>Set the context attribute key under which the
+     * validity flag for this request is stored.</p>
+     *
+     * @param validKey The new context attribute key
+     */
+    public void setValidKey(String validKey) {
+
+        this.validKey = validKey;
+
+    }
+
+
+    // ---------------------------------------------------------- Public Methods
+
+
+    /**
+     * <p>If the <code>context</code> is "valid", lookup a command and execute it.</p>
+     *
+     * @param context The <code>Context</code> for the current request
+     *
+     * @return the result of the lookup command's <code>execute</code> method, if executed,
+     * or <code>false</code> if it was not executed.
+     */
+    public boolean execute(Context context) throws Exception {
+
+        if (shouldProcess(context)) {
+
+            Command command = getCommand(context);
+
+            if (command != null) {
+                return (command.execute(context));
+            } 
+
+        }
+
+        return (false) ;
+
+    }
+
+    /**
+     * Evaluate the current context to see if a command should even be 
+     * executed.  
+     * @param context
+     * @return
+     */
+    protected boolean shouldProcess(Context context) {
+        // Skip processing if the current request is not valid
+        Boolean valid = (Boolean) context.get(getValidKey());
+        return ((valid != null) && valid.booleanValue());
+        
+    }
+
+    /**
+     * Find the <code>ActionConfig</code> in the current context and, if it is 
+     * properly configured, lookup the appropriate <code>commons-chain</code> command.
+     * @param context
+     * @return a <code>Command</code> to execute, or null if none is specified
+     * or if the specified command cannot be found.
+     */
+    protected Command getCommand(Context context) {
+
+        ActionConfig actionConfig = (ActionConfig)
+                                    context.get(getActionConfigKey());
+
+        String commandName = actionConfig.getCommand();
+
+        if (commandName == null) {
+            return null;
+        }
+
+        String catalogName = actionConfig.getCatalog();
+
+        Command command = null;
+        Catalog catalog = null;
+
+        if (catalogName != null) {
+            catalog = CatalogFactory.getInstance().getCatalog(catalogName);
+            if (catalog == null) {
+                log.warn("No catalog found under " + catalogName);
+                return null;
+            }
+
+        } else {
+            catalogName = "the default catalog";
+            catalog = CatalogFactory.getInstance().getCatalog();
+            if (catalog == null) {
+                log.warn("No default catalog found.");
+                return null;
+            }
+        }
+
+        log.debug("looking up command " + commandName + " in " + catalogName);
+        return catalog.getCommand(commandName);
+
+    }
+
+
+}
\ No newline at end of file

Modified: struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java
Url: http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java?view=diff&rev=123922&p1=struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java&r1=123921&p2=struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java&r2=123922
==============================================================================
--- struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java	(original)
+++ struts/core/trunk/src/share/org/apache/struts/config/ActionConfig.java	Sun Jan  2 18:28:56 2005
@@ -533,6 +533,78 @@
         this.validate = validate;
     }
 
+    /**
+     * The name of a <code>commons-chain</code> command which should 
+     * be executed as part of the processing of this action.
+     * @since Struts 1.3.0
+     */
+    protected String command = null;
+
+    /**
+     * The name of a <code>commons-chain</code> catalog in which <code>command</code> 
+     * should be sought.  If a <code>command</code> is defined and this property is undefined,
+     * the "default" catalog will be used.
+     * This is likely to be infrequently
+     * used after a future release of <code>commons-chain</code> supports
+     * a one-string expression of a catalog/chain combination.
+     * @since Struts 1.3.0
+     */
+    protected String catalog = null;
+
+    /**
+     * Get the name of a <code>commons-chain</code> command which should 
+     * be executed as part of the processing of this action.
+     * @return name of a <code>commons-chain</code> command which should 
+     * be executed as part of the processing of this action.
+     * @since Struts 1.3.0
+     */
+    public String getCommand() {
+        return (this.command);
+    }
+
+    /**
+     * Get the name of a <code>commons-chain</code> catalog in which
+     * a specified command should be sought.  This is likely to be infrequently
+     * used after a future release of <code>commons-chain</code> supports
+     * a one-string expression of a catalog/chain combination.
+     * @return name of a <code>commons-chain</code> catalog in which
+     * a specified command should be sought.
+     * @since Struts 1.3.0
+     */
+    public String getCatalog() {
+        return (this.catalog);
+    }
+
+    /**
+     * Set the name of a <code>commons-chain</code> command which should 
+     * be executed as part of the processing of this action.
+     * @param command name of a <code>commons-chain</code> command which should 
+     * be executed as part of the processing of this action.
+     * @since Struts 1.3.0
+     */
+    public void setCommand(String command) {
+        if (configured) {
+            throw new IllegalStateException("Configuration is frozen");
+        }
+        this.command = command;
+    }
+
+    /**
+     * Set the name of a <code>commons-chain</code> catalog in which
+     * a specified command should be sought. This is likely to be infrequently
+     * used after a future release of <code>commons-chain</code> supports
+     * a one-string expression of a catalog/chain combination.
+     * @param catalog name of a <code>commons-chain</code> catalog in which
+     * a specified command should be sought. 
+     * @since Struts 1.3.0
+     */
+    public void setCatalog(String catalog) {
+        if (configured) {
+            throw new IllegalStateException("Configuration is frozen");
+        }
+        this.catalog = catalog;
+    }
+
 
     // --------------------------------------------------------- Public Methods
 

Modified: struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java
Url: http://svn.apache.org/viewcvs/struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java?view=diff&rev=123922&p1=struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java&r1=123921&p2=struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java&r2=123922
==============================================================================
--- struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java	(original)
+++ struts/core/trunk/src/share/org/apache/struts/config/ActionConfigMatcher.java	Sun Jan  2 18:28:56 2005
@@ -154,6 +154,8 @@
         config.setForward(convertParam(orig.getForward(), vars));
         config.setInclude(convertParam(orig.getInclude(), vars));
         config.setInput(convertParam(orig.getInput(), vars));
+        config.setCatalog(convertParam(orig.getCatalog(), vars));
+        config.setCommand(convertParam(orig.getCommand(), vars));
 
         ForwardConfig[] fConfigs = orig.findForwardConfigs();
         ForwardConfig cfg;

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org