cedric      2002/07/11 09:40:34

  Modified:    src/share/org/apache/struts/tiles DefinitionsUtil.java
  Log:
  Change methods implementations, and some signatures ;-( to reflect the
  new definition factory interface.
  Users having used some methods from this class will need to recompile their
  classes.
  
  Revision  Changes    Path
  1.2       +183 -46   
jakarta-struts/src/share/org/apache/struts/tiles/DefinitionsUtil.java
  
  Index: DefinitionsUtil.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/tiles/DefinitionsUtil.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefinitionsUtil.java      25 Jun 2002 03:14:49 -0000      1.1
  +++ DefinitionsUtil.java      11 Jul 2002 16:40:34 -0000      1.2
  @@ -76,9 +76,13 @@
   import java.io.IOException;
   
   import org.apache.struts.tiles.definition.ReloadableDefinitionsFactory;
  +import org.apache.struts.tiles.definition.ConfigurableDefinitionsFactory;
  +import org.apache.struts.tiles.definition.ComponentDefinitionsFactoryWrapper;
   import org.apache.struts.tiles.xmlDefinition.I18nFactorySet;
   import org.apache.struts.taglib.tiles.ComponentConstants;
   
  +import org.apache.commons.beanutils.BeanUtils;
  +
   /**
    * Utilities class for definitions factory.
    * Also define userDebugLevel property (to be moved from this class ?).
  @@ -125,7 +129,7 @@
      * @param servletContext
      * @return newly created MapperCollection.
      * @throws DefinitionsFactoryException If an error occur while initializing 
factory
  -   * @deprecated Use createDefinitionFactory instead.
  +   * @deprecated Use createDefinitionsFactory instead.
      */
     public static void initUserDebugLevel(ServletConfig servletConfig)
     {
  @@ -155,73 +159,132 @@
      * Create Definition factory.
      * If a factory class name is provided, a factory of this class is created. 
Otherwise,
      * default factory is created.
  -   * Factory must have a constructor taking ServletContext and Map as parameter.
      * @param classname Class name of the factory to create.
      * @param servletContext Servlet Context passed to newly created factory.
  -   * @param properties Map of name/property passed to newly created factory.
  +   * @param properties Map of name/property used to initialize factory 
configuration object.
      * @return newly created factory.
      * @throws DefinitionsFactoryException If an error occur while initializing 
factory
  -   * @deprecated Use createDefinitionsFactory(ServletContext servletContext, Map 
properties)
  +   * @deprecated Use createDefinitionsFactory(ServletContext servletContext, 
ServletConfig servletConfig)
      */
  -  public static ComponentDefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, Map properties, String classname)
  +  public static DefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, Map properties, String classname)
       throws DefinitionsFactoryException
     {
  -  properties.put( ReloadableDefinitionsFactory.DEFINITIONS_FACTORY_CLASSNAME, 
classname );
  -  return createDefinitionsFactory(servletContext, properties);
  +    // Create config object
  +  DefinitionsFactoryConfig factoryConfig = new DefinitionsFactoryConfig();
  +    // populate it from map.
  +  try
  +    {
  +    factoryConfig.populate( properties );
  +    }
  +   catch(Exception ex )
  +    {
  +    throw new DefinitionsFactoryException( "Error - createDefinitionsFactory : 
Can't populate config object from properties map", ex );
  +    }
  +    // Add classname
  +  if( classname != null )
  +    factoryConfig.setFactoryClassname(classname);
  +    // Create factory using config object
  +  return  createDefinitionsFactory( servletContext, factoryConfig );
     }
   
      /**
      * Create default Definition factory.
  -   * Factory must have a constructor taking ServletContext and Map as parameter.
      * @param servletContext Servlet Context passed to newly created factory.
  -   * @param properties Map of name/property passed to newly created factory.
  -   * @return newly created factory.
  +   * @param properties Map of name/property used to initialize factory 
configuration object.
  +   * @return newly created factory of type ConfigurableDefinitionsFactory.
      * @throws DefinitionsFactoryException If an error occur while initializing 
factory
      */
  -  public static ComponentDefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, Map properties)
  +  public static DefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, Map properties)
       throws DefinitionsFactoryException
     {
  -  ComponentDefinitionsFactory factory = new 
ReloadableDefinitionsFactory(servletContext, properties); ;
  -  DefinitionsUtil.setDefinitionsFactory(factory, servletContext  );
  -  return factory;
  +  return createDefinitionsFactory( servletContext, properties, null );
     }
   
      /**
      * Create Definition factory.
  -   * Convenience method. ServletConfig is wrapped into a Map allowing retrieval
  -   * of init parameters. Factory classname is also retrieved, as well as debug 
level.
  -   * Finally, approriate createDefinitionsFactory() is called.
  +   * Create configuration object from servlet web.xml file, then create
  +   * ConfigurableDefinitionsFactory and initialized it with object.
  +   * <p>
  +   * Convenience method. Calls createDefinitionsFactory(ServletContext 
servletContext, DefinitionsFactoryConfig factoryConfig)
  +   *
      * @param servletContext Servlet Context passed to newly created factory.
  -   * @param servletConfig Servlet config containing parameters to be passed to 
newly created factory.
  +   * @param servletConfig Servlet config containing parameters to be passed to 
factory configuration object.
  +   * @return newly created factory of type ConfigurableDefinitionsFactory.
  +   * @throws DefinitionsFactoryException If an error occur while initializing 
factory
      */
  -  public static ComponentDefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, ServletConfig servletConfig)
  +  public static DefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, ServletConfig servletConfig)
       throws DefinitionsFactoryException
     {
  -    // Check if already exist in context
  -  ComponentDefinitionsFactory factory = getDefinitionsFactory( servletContext);
  -  if( factory != null )
  -    return factory;
  -    // Doesn' exist, create it and save it in context
  -    // Ensure that only one is created by synchronizing section. This imply a
  -    // second checking.
  -    // Todo : check that servletContext is unique for this servlet !
  -  synchronized (servletContext) {
  -      // Check if someone has created it while we had wait for synchonized section
  -    factory = getDefinitionsFactory( servletContext);
  +    // Read factory config
  +  DefinitionsFactoryConfig factoryConfig = readFactoryConfig(servletConfig);
  +    // Create factory using config object
  +  return createDefinitionsFactory( servletContext, factoryConfig );
  +  }
  +
  +   /**
  +   * Create Definition factory.
  +   * Create configuration object from servlet web.xml file, then create
  +   * ConfigurableDefinitionsFactory and initialized it with object.
  +   * <p>
  +   * If checkIfExist is true, start by checking if factory already exist. If yes,
  +   * return it. If no, create a new one.
  +   * <p>
  +   * If checkIfExist is false, factory is always created.
  +   * <p>
  +   * Convenience method. Calls createDefinitionsFactory(ServletContext 
servletContext, DefinitionsFactoryConfig factoryConfig)
  +   *
  +   * @param servletContext Servlet Context passed to newly created factory.
  +   * @param servletConfig Servlet config containing parameters to be passed to 
factory configuration object.
  +   * @param checkIfExist Check if factory already exist. If true and factory exist, 
return it.
  +   * If true and factory doesn't exist, create it. If false, create it in all cases.
  +   * @return newly created factory of type ConfigurableDefinitionsFactory.
  +   * @throws DefinitionsFactoryException If an error occur while initializing 
factory
  +   */
  +  public static DefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, ServletConfig servletConfig, boolean checkIfExist)
  +    throws DefinitionsFactoryException
  +  {
  +  if( checkIfExist )
  +    {
  +      // Check if already exist in context
  +    DefinitionsFactory factory = getDefinitionsFactory( servletContext);
       if( factory != null )
         return factory;
  -      // Now really create it
  -    initUserDebugLevel(servletConfig);
  -    factory = new ReloadableDefinitionsFactory(servletContext, servletConfig); ;
  -    setDefinitionsFactory(factory, servletContext  );
  +    }
  +    // creation
  +  return createDefinitionsFactory( servletContext, servletConfig);
  +  }
  +
  +    /**
  +     * Create Definition factory from specified configuration object.
  +     * Create a ConfigurableDefinitionsFactory and initialize it with the 
configuration
  +     * object. This later can contains the factory classname to use.
  +     * Factory is made accessible from tags.
  +     * <p>
  +     * Fallback of several factory creation methods.
  +     *
  +     * @param servletContext Servlet Context passed to newly created factory.
  +     * @param factoryConfig Configuration object passed to factory.
  +     * @return newly created factory of type ConfigurableDefinitionsFactory.
  +     * @throws DefinitionsFactoryException If an error occur while initializing 
factory
  +     */
  +  public static DefinitionsFactory createDefinitionsFactory(ServletContext 
servletContext, DefinitionsFactoryConfig factoryConfig)
  +    throws DefinitionsFactoryException
  +  {
  +      // Set user debug level
  +    setUserDebugLevel( factoryConfig.getDebugLevel() );
  +      // Create configurable factory
  +    DefinitionsFactory factory = new ConfigurableDefinitionsFactory( );
  +    factory.init( factoryConfig, servletContext );
  +      // Make factory accessible from jsp tags
  +    DefinitionsUtil.makeDefinitionsFactoryAccessible(factory, servletContext );
       return factory;
  -    } // synchronized
     }
   
     /**
      * Set definition factory in appropriate servlet context.
      * @param factory Factory to store.
      * @param servletContext Servlet context that will hold factory.
  +   * @deprecated since 20020708. Replaced by makeFactoryAccessible()
      */
     static protected void setDefinitionsFactory(ComponentDefinitionsFactory factory, 
ServletContext servletContext)
     {
  @@ -274,22 +337,25 @@
     }
   
     /**
  -   * Get instances factory from appropriate servlet context.
  +   * Get definition factory from appropriate servlet context.
      * @return Definitions factory or null if not found.
  +   * @since 20020708
      */
  - static  public ComponentDefinitionsFactory getDefinitionsFactory(ServletContext 
servletContext)
  + static  public DefinitionsFactory getDefinitionsFactory(ServletContext 
servletContext)
     {
  -  return 
(ComponentDefinitionsFactory)servletContext.getAttribute(DEFINITIONS_FACTORY);
  +  return (DefinitionsFactory)servletContext.getAttribute(DEFINITIONS_FACTORY);
     }
   
     /**
  -   * Get instances factory from appropriate servlet context.
  -   * @return Definitions factory or null if not found.
  -   * @deprecated since 020207, use 
getDefinitionsFactory(pageContext.getServletContext()) instead
  +   * Make definition factory accessible to Tags.
  +   * Factory is stored in servlet context.
  +   * @param factory Factory to make accessible
  +   * @param servletContext Current servlet context
  +   * @since 20020708
      */
  - static  public ComponentDefinitionsFactory getDefinitionsFactory(PageContext 
pageContext)
  + static  public void makeDefinitionsFactoryAccessible(DefinitionsFactory factory, 
ServletContext servletContext)
     {
  -  return getDefinitionsFactory( pageContext.getServletContext());
  +  servletContext.setAttribute(DEFINITIONS_FACTORY, factory);
     }
   
     /**
  @@ -318,5 +384,76 @@
     {
     request.removeAttribute(ACTION_DEFINITION);
     }
  +
  +  /**
  +   * Populate Definition Factory Config from web.xml properties.
  +   * @param config Definition Factory Config to populate.
  +   * @param servletContext Current servlet context containing web.xml properties.
  +   * @exception IllegalAccessException if the caller does not have
  +   *  access to the property accessor method
  +   * @exception InvocationTargetException if the property accessor method
  +   *  throws an exception
  +   * @see org.apache.commons.beanutils.BeanUtil
  +   * @since tiles 20020708
  +   */
  +  static public void populateDefinitionsFactoryConfig( DefinitionsFactoryConfig 
factoryConfig, ServletConfig servletConfig)
  +    throws 
java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
  +  {
  +  Map properties = new DefinitionsUtil.ServletPropertiesMap( servletConfig );
  +  factoryConfig.populate( properties);
  +  }
  +
  +  /**
  +   * Create FactoryConfig and initialize it from web.xml.
  +   *
  +   * @param servlet ActionServlet that is managing all the sub-applications
  +   *  in this web application
  +   * @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
  +   */
  +  static protected DefinitionsFactoryConfig readFactoryConfig(ServletConfig 
servletConfig)
  +      throws DefinitionsFactoryException
  +  {
  +    // Create tiles definitions config object
  +  DefinitionsFactoryConfig factoryConfig = new DefinitionsFactoryConfig();
  +    // Get init parameters from web.xml files
  +  try
  +    {
  +    DefinitionsUtil.populateDefinitionsFactoryConfig(factoryConfig, servletConfig);
  +    }
  +   catch(Exception ex)
  +    {
  +    ex.printStackTrace();
  +    throw new DefinitionsFactoryException( "Can't populate DefinitionsFactoryConfig 
class from 'web.xml'.", ex );
  +    }
  +  return factoryConfig;
  +  }
  +
  +  /**
  +   * Inner class.
  +   * Wrapper for ServletContext init parameters.
  +   * Object of this class is an hashmap containing parameters and values
  +   * defined in the servlet config file (web.xml).
  +   */
  + static class ServletPropertiesMap extends HashMap {
  +    /**
  +     * Constructor.
  +     */
  +  ServletPropertiesMap( ServletConfig config )
  +    {
  +      // This implementation is very simple.
  +      // It is possible to avoid creation of a new structure, but this need
  +      // imply writing all Map interface.
  +    Enumeration enum = config.getInitParameterNames();
  +    while( enum.hasMoreElements() )
  +      {
  +      String key = (String)enum.nextElement();
  +      put( key, config.getInitParameter( key ) );
  +      }
  +    }
  +}  // end inner class
  +
   }
   
  
  
  

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

Reply via email to