craigmcc    02/02/23 14:54:18

  Modified:    conf/share struts-config_1_1.dtd
               src/share/org/apache/struts/action ActionServlet.java
               src/share/org/apache/struts/config ApplicationConfig.java
                        ConfigRuleSet.java
               web/example/WEB-INF struts-config.xml web.xml
  Added:       src/example/org/apache/struts/webapp/example
                        DatabasePlugIn.java
               src/share/org/apache/struts/action PlugIn.java
  Removed:     src/example/org/apache/struts/webapp/example
                        DatabaseServlet.java
  Log:
  Add a new lightweight API (org.apache.struts.action.PlugIn) for declaring
  and configuring user application modules that need startup and shutdown
  lifecycle notification.
  
  Modify the canonical /struts-example application to do its pseudo database
  setup in a PlugIn instead of in a separate servlet.
  
  Revision  Changes    Path
  1.12      +38 -25    jakarta-struts/conf/share/struts-config_1_1.dtd
  
  Index: struts-config_1_1.dtd
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/conf/share/struts-config_1_1.dtd,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- struts-config_1_1.dtd     20 Jan 2002 05:34:08 -0000      1.11
  +++ struts-config_1_1.dtd     23 Feb 2002 22:54:17 -0000      1.12
  @@ -11,7 +11,7 @@
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd";>
   
  -     $Id: struts-config_1_1.dtd,v 1.11 2002/01/20 05:34:08 craigmcc Exp $
  +     $Id: struts-config_1_1.dtd,v 1.12 2002/02/23 22:54:17 craigmcc Exp $
   -->
   
   
  @@ -85,7 +85,7 @@
        hierarchy, and contains nested elements for all of the other
        configuration settings.
   -->
  -<!ELEMENT struts-config (data-sources?, form-beans?, global-exceptions?, 
global-forwards?, action-mappings?, controller?, message-resources*)>
  +<!ELEMENT struts-config (data-sources?, form-beans?, global-exceptions?, 
global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>
   <!ATTLIST struts-config  id             ID              #IMPLIED>
   
   
  @@ -496,24 +496,19 @@
   <!ATTLIST message-resources parameter   CDATA           #REQUIRED>
   
   
  -<!-- The "set-property" element specifies the name and value of an additional
  -     JavaBeans configuration property whose setter method will be called
  -     on the object that represents our surrounding element.  This is especially
  -     useful when an extended implementation class (with additional properties)
  -     is configured on the <global-forwards> or <action-mappings> elements.
  -     The following attributes are defined:
  -
  -     property        Name of the JavaBeans property whose setter method
  -                     will be called.
  -
  -     value           String representation of the value to which this
  -                     property will be set, after suitable type conversion
  --->
  -<!ELEMENT set-property EMPTY>
  -<!ATTLIST set-property   id             ID              #IMPLIED>
  -<!ATTLIST set-property   property       %PropName;      #REQUIRED>
  -<!ATTLIST set-property   value          CDATA           #REQUIRED>
  -
  +<!-- The "plug-in" element specifies the fully qualified class name of a
  +     general purpose application plug-in module that receives notification
  +     of application startup and shutdown events.  An instance of the
  +     specified class is created for each element, and can be configured
  +     with nested "set-property" elements.  The following attributes
  +     are supported:
  +
  +     className       Fully qualified Java class name of the plug-in class
  +                     (must implement org.apache.struts.PlugIn).
  +-->
  +<!ELEMENT plug-in           (set-property*)>
  +<!ATTLIST plug-in           id          ID              #IMPLIED>
  +<!ATTLIST plug-in           className   %ClassName;     #REQUIRED>
   
   
   <!-- ========== Subordinate Elements ====================================== -->
  @@ -522,11 +517,10 @@
   <!-- The "description" element contains descriptive (paragraph length) text
        about the surrounding element, suitable for use in GUI tools.
   -->
  -<!ELEMENT description (#PCDATA)>
  +<!ELEMENT description    (#PCDATA)>
   <!ATTLIST description    id             ID              #IMPLIED>
   
   
  -
   <!-- The "display-name" element contains a short (one line) description of
        the surrounding element, suitable for use in GUI tools.
   -->
  @@ -538,7 +532,7 @@
        specify the location, relative to the Struts configuration file, for small
        and large images used to represent the surrounding element in GUI tools.
   -->
  -<!ELEMENT icon (small-icon?, large-icon?)>
  +<!ELEMENT icon           (small-icon?, large-icon?)>
   <!ATTLIST icon           id             ID              #IMPLIED>
   
   
  @@ -546,14 +540,33 @@
        configuration file, of a resource containing a large (32x32 pixel)
        icon image.
   -->
  -<!ELEMENT large-icon (%Location;)>
  +<!ELEMENT large-icon     (%Location;)>
   <!ATTLIST large-icon     id             ID              #IMPLIED>
   
   
  +<!-- The "set-property" element specifies the name and value of an additional
  +     JavaBeans configuration property whose setter method will be called
  +     on the object that represents our surrounding element.  This is especially
  +     useful when an extended implementation class (with additional properties)
  +     is configured on the <global-forwards> or <action-mappings> elements.
  +     The following attributes are defined:
  +
  +     property        Name of the JavaBeans property whose setter method
  +                     will be called.
  +
  +     value           String representation of the value to which this
  +                     property will be set, after suitable type conversion
  +-->
  +<!ELEMENT set-property   EMPTY>
  +<!ATTLIST set-property   id             ID              #IMPLIED>
  +<!ATTLIST set-property   property       %PropName;      #REQUIRED>
  +<!ATTLIST set-property   value          CDATA           #REQUIRED>
  +
  +
   <!-- The "small-icon" element specifies the location, relative to the Struts
        configuration file, of a resource containing a small (16x16 pixel)
        icon image.
   -->
  -<!ELEMENT small-icon (%Location;)>
  +<!ELEMENT small-icon     (%Location;)>
   <!ATTLIST small-icon     id             ID              #IMPLIED>
   
  
  
  
  1.1                  
jakarta-struts/src/example/org/apache/struts/webapp/example/DatabasePlugIn.java
  
  Index: DatabasePlugIn.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-struts/src/example/org/apache/struts/webapp/example/DatabasePlugIn.java,v
 1.1 2002/02/23 22:54:17 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2002/02/23 22:54:17 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Struts", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  
  package org.apache.struts.webapp.example;
  
  
  import java.io.BufferedInputStream;
  import java.io.BufferedWriter;
  import java.io.InputStream;
  import java.io.IOException;
  import java.io.FileWriter;
  import java.io.PrintWriter;
  import java.net.MalformedURLException;
  import java.util.Enumeration;
  import java.util.Hashtable;
  import java.util.MissingResourceException;
  import javax.servlet.ServletException;
  import javax.servlet.UnavailableException;
  import org.apache.commons.beanutils.BeanUtils;
  import org.apache.commons.digester.Digester;
  import org.apache.struts.action.ActionServlet;
  import org.apache.struts.action.PlugIn;
  import org.apache.struts.config.ApplicationConfig;
  import org.apache.struts.util.MessageResources;
  
  
  /**
   * <p><strong>DatabasePlugIn</strong> initializes and finalizes the
   * persistent storage of User and Subscription information for the Struts
   * Demonstration Application.</p>
   *
   * @author Craig R. McClanahan
   * @version $Revision: 1.1 $ $Date: 2002/02/23 22:54:17 $
   */
  
  public final class DatabasePlugIn implements PlugIn {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The application configuration for our owning sub-application.
       */
      private ApplicationConfig config = null;
  
  
      /**
       * The database of Users and their associated Subscriptions, keyed by
       * username.
       */
      private Hashtable database = null;
  
  
      /**
       * The {@link ActionServlet} owning this application.
       */
      private ActionServlet servlet = null;
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * The debugging detail level for this servlet.
       */
      private int debug = 0;
  
      public int getDebug() {
          return (this.debug);
      }
  
      public void setDebug(int debug) {
          this.debug = debug;
      }
  
  
      /**
       * The resource path of our persistent database storage file.
       */
      private String pathname = "/WEB-INF/database.xml";
  
      public String getPathname() {
          return (this.pathname);
      }
  
      public void setPathname(String pathname) {
          this.pathname = pathname;
      }
  
  
      // --------------------------------------------------------- PlugIn Methods
  
  
      /**
       * Gracefully shut down this database, releasing any resources
       * that were allocated at initialization.
       */
      public void destroy() {
  
        if (debug >= 1)
            servlet.log("Finalizing database plug in");
  
          // NOTE:  We do not attempt to unload the database because there
          // is no portable way to do so.  Real applications will have used
          // a real database, with no need to unload it
  
        // Remove the database from our application attributes
        servlet.getServletContext().removeAttribute(Constants.DATABASE_KEY);
          servlet = null;
          config = null;
  
      }
  
  
      /**
       * Initialize and load our initial database from persistent storage.
       *
       * @param config The ApplicationConfig for our owning sub-application
       *
       * @exception ServletException if we cannot configure ourselves correctly
       */
      public void init(ApplicationConfig config) throws ServletException {
  
          // Remember our associated configuration and servlet
          this.config = config;
          this.servlet = config.getServlet();
  
        // Load our database from persistent storage
        try {
            load();
            servlet.getServletContext().setAttribute(Constants.DATABASE_KEY,
                                                       database);
        } catch (Exception e) {
            servlet.log("Database load exception", e);
            throw new UnavailableException
                ("Cannot load database from '" + pathname + "'");
        }
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Add a new User to our database.
       *
       * @param user The user to be added
       */
      public void addUser(User user) {
  
        database.put(user.getUsername(), user);
  
      }
  
  
      // ------------------------------------------------------ Private Methods
  
  
  
      /**
       * Load our database from its persistent storage version.
       *
       * @exception Exception if any problem occurs while loading
       */
      private synchronized void load() throws Exception {
  
        // Initialize our database
        database = new Hashtable();
  
        // Acquire an input stream to our database file
        if (debug >= 1)
            servlet.log("Loading database from '" + pathname + "'");
          InputStream is =
              servlet.getServletContext().getResourceAsStream(pathname);
          if (is == null) {
              servlet.log("No such resource available - loading empty database");
              return;
          }
        BufferedInputStream bis = new BufferedInputStream(is);
  
        // Construct a digester to use for parsing
        Digester digester = new Digester();
        digester.push(this);
        digester.setDebug(debug);
          digester.setNamespaceAware(true);
        digester.setValidating(false);
        digester.addObjectCreate("database/user",
                                 "org.apache.struts.webapp.example.User");
        digester.addSetProperties("database/user");
        digester.addSetNext("database/user", "addUser");
        digester.addObjectCreate("database/user/subscription",
                                 "org.apache.struts.webapp.example.Subscription");
        digester.addSetProperties("database/user/subscription");
        digester.addSetTop("database/user/subscription", "setUser");
  
        // Parse the input stream to initialize our database
        digester.parse(bis);
        bis.close();
  
      }
  
  
  }
  
  
  
  1.92      +45 -8     
jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java
  
  Index: ActionServlet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v
  retrieving revision 1.91
  retrieving revision 1.92
  diff -u -r1.91 -r1.92
  --- ActionServlet.java        23 Jan 2002 18:59:12 -0000      1.91
  +++ ActionServlet.java        23 Feb 2002 22:54:17 -0000      1.92
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.91 
2002/01/23 18:59:12 craigmcc Exp $
  - * $Revision: 1.91 $
  - * $Date: 2002/01/23 18:59:12 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.92 
2002/02/23 22:54:17 craigmcc Exp $
  + * $Revision: 1.92 $
  + * $Date: 2002/02/23 22:54:17 $
    *
    * ====================================================================
    *
  @@ -267,7 +267,7 @@
    *
    * @author Craig R. McClanahan
    * @author Ted Husted
  - * @version $Revision: 1.91 $ $Date: 2002/01/23 18:59:12 $
  + * @version $Revision: 1.92 $ $Date: 2002/02/23 22:54:17 $
    */
   
   public class ActionServlet
  @@ -381,8 +381,8 @@
               log(internal.getMessage("finalizing"));
           }
   
  -        destroyDataSources();
           destroyApplications();
  +        destroyDataSources();
           destroyInternal();
           getServletContext().removeAttribute(Action.ACTION_SERVLET_KEY);
   
  @@ -405,9 +405,11 @@
           initServlet();
   
           // Initialize sub-applications as needed
  +        getServletContext().setAttribute(Action.ACTION_SERVLET_KEY, this);
           ApplicationConfig ac = initApplicationConfig("", config);
           initApplicationMessageResources(ac);
           initApplicationDataSources(ac);
  +        initApplicationPlugIns(ac);
           Enumeration names = getServletConfig().getInitParameterNames();
           while (names.hasMoreElements()) {
               String name = (String) names.nextElement();
  @@ -419,9 +421,9 @@
                   (prefix, getServletConfig().getInitParameter(name));
               initApplicationMessageResources(ac);
               initApplicationDataSources(ac);
  +            initApplicationPlugIns(ac);
           }
           destroyConfigDigester();
  -        getServletContext().setAttribute(Action.ACTION_SERVLET_KEY, this);
   
       }
   
  @@ -625,16 +627,27 @@
        */
       protected void destroyApplications() {
   
  +        ArrayList values = new ArrayList();
           Enumeration names = getServletContext().getAttributeNames();
           while (names.hasMoreElements()) {
  -            String name = (String) names.nextElement();
  +            values.add(names.nextElement());
  +        }
  +        Iterator keys = values.iterator();
  +        while (keys.hasNext()) {
  +            String name = (String) keys.next();
               Object value = getServletContext().getAttribute(name);
               if (value instanceof ApplicationConfig) {
  +                ApplicationConfig config = (ApplicationConfig) value;
                   try {
  -                    ((ApplicationConfig) value).getProcessor().destroy();
  +                    config.getProcessor().destroy();
                   } catch (Throwable t) {
                       ;
                   }
  +                PlugIn plugIns[] = config.findPlugIns();
  +                for (int i = 0; i < plugIns.length; i++) {
  +                    int j = plugIns.length - (i + 1);
  +                    plugIns[j].destroy();
  +                }
               }
           }
   
  @@ -827,6 +840,30 @@
           if ("".equals(config.getPrefix())) {
               initDataSources();
           }
  +
  +    }
  +
  +
  +    /**
  +     * <p>Initialize the plug ins for the specified sub-application.</p>
  +     *
  +     * @param config ApplicationConfig information for this application
  +     *
  +     * @exception ServletException if initialization cannot be performed
  +     */
  +    protected void initApplicationPlugIns
  +        (ApplicationConfig config) throws ServletException {
  +
  +        if (debug >= 1) {
  +            log("Initializing application path '" + config.getPrefix() +
  +                "' plug ins");
  +        }
  +
  +        PlugIn plugIns[] = config.findPlugIns();
  +        for (int i = 0; i < plugIns.length; i++) {
  +            plugIns[i].init(config);
  +        }
  +
   
       }
   
  
  
  
  1.1                  jakarta-struts/src/share/org/apache/struts/action/PlugIn.java
  
  Index: PlugIn.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/PlugIn.java,v 1.1 
2002/02/23 22:54:17 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2002/02/23 22:54:17 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Struts", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  
  package org.apache.struts.action;
  
  
  import javax.servlet.ServletException;
  import org.apache.struts.config.ApplicationConfig;
  
  
  /**
   * <p>A <strong>PlugIn</strong> is a configuration wrapper for an application
   * specific module or service that needs to be notified about application
   * startup and application shutdown events (i.e. corresponding to when the
   * container calls <code>init()</code> and <code>destroy()</code> on the
   * corresponding {@link ActionServlet} instance).  PlugIn modules can be
   * configured in the <code>struts-config.xml</code> file, without the need
   * to subclass {@link ActionServlet} simply to perform application lifecycle
   * activities.</p>
   *
   * <p>Implementations of this interface must supply a zero-argument constructor
   * for use by {@link ActionServlet}.  Configuration can be accomplished by
   * providing standard JavaBeans property setter methods, which will all have
   * been called before the <code>init()</code> method is invoked.</p>
   *
   * @author Craig R. McClanahan
   * @version $Revision: 1.1 $ $Date: 2002/02/23 22:54:17 $
   */
  
  public interface PlugIn {
  
  
      /**
       * <p>Receive notification that our owning sub-application is being
       * shut down.</p>
       */
      public void destroy();
  
  
      /**
       * <p>Receive notification that the specified sub-applicaiton is being
       * started up.</p>
       *
       * @param config ApplicationConfig for the sub-application with which
       *  this plug in is associated
       *
       * @exception ServletException if this <code>PlugIn</code> cannot
       *  be successfully initialized
       */
      public void init(ApplicationConfig config) throws ServletException;
  
  
  }
  
  
  
  1.9       +40 -4     
jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java
  
  Index: ApplicationConfig.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ApplicationConfig.java    20 Jan 2002 05:34:08 -0000      1.8
  +++ ApplicationConfig.java    23 Feb 2002 22:54:18 -0000      1.9
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v 
1.8 2002/01/20 05:34:08 craigmcc Exp $
  - * $Revision: 1.8 $
  - * $Date: 2002/01/20 05:34:08 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ApplicationConfig.java,v 
1.9 2002/02/23 22:54:18 craigmcc Exp $
  + * $Revision: 1.9 $
  + * $Date: 2002/02/23 22:54:18 $
    *
    * ====================================================================
    *
  @@ -64,10 +64,12 @@
   
   
   import java.io.Serializable;
  +import java.util.ArrayList;
   import javax.servlet.ServletException;
   import javax.servlet.UnavailableException;
   import org.apache.commons.collections.FastHashMap;
   import org.apache.struts.action.ActionServlet;
  +import org.apache.struts.action.PlugIn;
   import org.apache.struts.action.RequestProcessor;
    
   
  @@ -82,7 +84,7 @@
    * previous Struts behavior that only supported one application.</p>
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.8 $ $Date: 2002/01/20 05:34:08 $
  + * @version $Revision: 1.9 $ $Date: 2002/02/23 22:54:18 $
    * @since Struts 1.1
    */
   
  @@ -153,6 +155,13 @@
       protected FastHashMap messageResources = new FastHashMap();
   
   
  +    /**
  +     * The set of configured plug in modules for this application,
  +     * if any, in the order they were declared and configured.
  +     */
  +    protected ArrayList plugIns = new ArrayList();
  +
  +
       // ------------------------------------------------------------- Properties
   
   
  @@ -349,6 +358,21 @@
   
   
       /**
  +     * Add a newly configured {@link PlugIn} instance to the set of
  +     * plug in modules for this application.
  +     *
  +     * @param plugIn The new configured plugIn module
  +     */
  +    public void addPlugIn(PlugIn plugIn) {
  +
  +        if (configured)
  +            throw new IllegalStateException("Configuration is frozen");
  +        plugIns.add(plugIn);
  +
  +    }
  +
  +
  +    /**
        * Return the action configuration for the specified path, if any;
        * otherwise return <code>null</code>.
        *
  @@ -496,6 +520,18 @@
               new MessageResourcesConfig[messageResources.size()];
           return ((MessageResourcesConfig[])
                   messageResources.values().toArray(results));
  +
  +    }
  +
  +
  +    /**
  +     * Return the configured plug in modules for this application.  If there
  +     * are none, a zero-length array is returned.
  +     */
  +    public PlugIn[] findPlugIns() {
  +
  +        PlugIn results[] = new PlugIn[plugIns.size()];
  +        return ((PlugIn[]) plugIns.toArray(results));
   
       }
   
  
  
  
  1.7       +19 -4     
jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java
  
  Index: ConfigRuleSet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ConfigRuleSet.java        17 Jan 2002 00:15:05 -0000      1.6
  +++ ConfigRuleSet.java        23 Feb 2002 22:54:18 -0000      1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v 1.6 
2002/01/17 00:15:05 craigmcc Exp $
  - * $Revision: 1.6 $
  - * $Date: 2002/01/17 00:15:05 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ConfigRuleSet.java,v 1.7 
2002/02/23 22:54:18 craigmcc Exp $
  + * $Revision: 1.7 $
  + * $Date: 2002/02/23 22:54:18 $
    *
    * ====================================================================
    *
  @@ -74,7 +74,7 @@
    * configuration file (<code>struts-config.xml</code>).</p>
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.6 $ $Date: 2002/01/17 00:15:05 $
  + * @version $Revision: 1.7 $ $Date: 2002/02/23 22:54:18 $
    * @since Struts 1.1
    */
   
  @@ -249,6 +249,21 @@
   
           digester.addSetProperty
               ("struts-config/message-resources/set-property",
  +             "property", "value");
  +
  +        digester.addObjectCreate
  +            ("struts-config/plug-in",
  +             null, // Class name MUST be specified in the element
  +             "className");
  +        digester.addSetProperties
  +            ("struts-config/plug-in");
  +        digester.addSetNext
  +            ("struts-config/plug-in",
  +             "addPlugIn",
  +             "org.apache.struts.action.PlugIn");
  +
  +        digester.addSetProperty
  +            ("struts-config/plug-in/set-property",
                "property", "value");
   
       }
  
  
  
  1.16      +9 -1      jakarta-struts/web/example/WEB-INF/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/example/WEB-INF/struts-config.xml,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- struts-config.xml 17 Jan 2002 00:15:05 -0000      1.15
  +++ struts-config.xml 23 Feb 2002 22:54:18 -0000      1.16
  @@ -156,7 +156,15 @@
       <action    path="/admin/removeMapping"
                  type="org.apache.struts.actions.RemoveMappingAction"/>
   
  -
     </action-mappings>
  +
  +
  +  <!-- ========== Plug Ins Configuration ================================== -->
  +
  +  <plug-in className="org.apache.struts.webapp.example.DatabasePlugIn">
  +      <set-property property="debug"    value="9"/>
  +      <set-property property="pathname" value="/WEB-INF/database.xml"/>
  +  </plug-in>
  +
   
   </struts-config>
  
  
  
  1.14      +0 -12     jakarta-struts/web/example/WEB-INF/web.xml
  
  Index: web.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/example/WEB-INF/web.xml,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- web.xml   16 Jul 2001 00:44:59 -0000      1.13
  +++ web.xml   23 Feb 2002 22:54:18 -0000      1.14
  @@ -7,18 +7,6 @@
   <web-app>
   
   
  -  <!-- Database Initialization Servlet Configuration -->
  -  <servlet>
  -    <servlet-name>database</servlet-name>
  -    <servlet-class>org.apache.struts.webapp.example.DatabaseServlet</servlet-class>
  -    <init-param>
  -      <param-name>debug</param-name>
  -      <param-value>2</param-value>
  -    </init-param>
  -    <load-on-startup>1</load-on-startup>
  -  </servlet>
  -
  -
     <!-- Action Servlet Configuration -->
     <servlet>
       <servlet-name>action</servlet-name>
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to