cedric      2002/07/11 09:25:43

  Added:       src/share/org/apache/struts/tiles/definition
                        ComponentDefinitionsFactoryWrapper.java
  Log:
  Wrapper class providing new definition factory interface around the old
  ComponentDefinitionFactory.
  This wrapper is automatically used by the plugin when user try to use an
  old factory interface. This maintain backward compatibility.
  
  Revision  Changes    Path
  1.1                  
jakarta-struts/src/share/org/apache/struts/tiles/definition/ComponentDefinitionsFactoryWrapper.java
  
  Index: ComponentDefinitionsFactoryWrapper.java
  ===================================================================
  package org.apache.struts.tiles.definition;
  
  import org.apache.struts.tiles.DefinitionsFactory;
  import org.apache.struts.tiles.ComponentDefinition;
  import org.apache.struts.tiles.ComponentDefinitionsFactory;
  import org.apache.struts.tiles.DefinitionsFactoryConfig;
  import org.apache.struts.tiles.DefinitionsFactoryException;
  import org.apache.struts.tiles.NoSuchDefinitionException;
  
  import javax.servlet.ServletRequest;
  import javax.servlet.ServletContext;
  
  import java.util.Map;
  import java.util.HashMap;
  
  /**
   * Wrapper from new definition factory interface to old interface.
   * This class provides mapping from the old interface's life cycle to the new life 
cycle.
   * @author Cedric Dumoulin
   * @since 20020708
   */
  
  public class ComponentDefinitionsFactoryWrapper implements DefinitionsFactory
  {
  
      /** The underlying factory */
    private ComponentDefinitionsFactory factory;
      /** Factory configuration*/
    private DefinitionsFactoryConfig config;
  
      /**
       * Constructor.
       * Create new wrapper for specified factory.
       */
    public ComponentDefinitionsFactoryWrapper( ComponentDefinitionsFactory factory )
    {
    this.factory = factory;
    }
  
      /**
       * Constructor.
       * Create new wrapper.
       * The config object passed to init method should reference a factory 
implementing
       * ComponentDefinitionsFactory.
       */
    public ComponentDefinitionsFactoryWrapper()
    {
    }
  
      /**
       * Get requested definition.
       */
    public ComponentDefinition getDefinition(String name, ServletRequest request, 
ServletContext servletContext)
      throws NoSuchDefinitionException, DefinitionsFactoryException
    {
    return factory.getDefinition(name, request, servletContext);
    }
  
      /**
       * Call underlying factory init method.
       */
    public void init(DefinitionsFactoryConfig config, ServletContext servletContext)
      throws DefinitionsFactoryException
    {
    this.config = config;
      // create factory and initialize it
    if( factory == null)
      factory = createFactoryInstance( config.getFactoryClassname());
    factory.initFactory(servletContext, createConfigMap(config));
    }
  
      /**
       * Do nothing because old life cycle has no equivalent.
       */
    public void destroy()
    {
    factory = null;
    }
  
      /**
       * Set underlying factory configuration.
       *
       */
    public void setConfig(DefinitionsFactoryConfig config, ServletContext 
servletContext)
      throws DefinitionsFactoryException
    {
      // create a new factory and initialize it
    ComponentDefinitionsFactory newFactory = createFactoryInstance( 
config.getFactoryClassname());
    newFactory.initFactory(servletContext, createConfigMap(config));
    factory = newFactory;
    }
  
      /**
       * Get underlying factory configuration.
       */
    public DefinitionsFactoryConfig getConfig()
    {
    return config;
    }
  
     /**
      * Get internal factory
      */
    public ComponentDefinitionsFactory getInternalFactory()
    {
    return factory;
    }
  
    /**
     * Create Definition factory from provided classname which must implements 
ComponentDefinitionsFactory.
     * Factory class must extends TilesDefinitionsFactory.
     * @param classname Class name of the factory to create.
     * @return newly created factory.
     * @throws DefinitionsFactoryException If an error occur while initializing factory
     */
    protected ComponentDefinitionsFactory createFactoryInstance(String classname)
      throws DefinitionsFactoryException
    {
    try
      {
      Class factoryClass = Class.forName(classname);
      Object factory = factoryClass.newInstance();
      return (ComponentDefinitionsFactory)factory;
      }
     catch( ClassCastException ex )
      { // Bad classname
      throw new DefinitionsFactoryException( "Error - createDefinitionsFactory : 
Factory class '"
                                             + classname +" must implements 
'TilesDefinitionsFactory'.", ex );
      }
     catch( ClassNotFoundException ex )
      { // Bad classname
      throw new DefinitionsFactoryException( "Error - createDefinitionsFactory : Bad 
class name '"
                                             + classname +"'.", ex );
      }
     catch( InstantiationException ex )
      { // Bad constructor or error
      throw new DefinitionsFactoryException( ex );
      }
     catch( IllegalAccessException ex )
      { //
      throw new DefinitionsFactoryException( ex );
      }
  
    }
  
      /**
       * ToString method.
       * Call toString on underlying factory.
       */
    public String toString()
    {
    return getInternalFactory().toString();
    }
  
      /**
       * Create map of configuration attributes from configuration object.
       * Mapping is done between old names and new names.
       * @return Map Map of name/value pairs.
       */
    public static Map createConfigMap( DefinitionsFactoryConfig config )
    {
     Map map = new HashMap(config.getAttributes());
       // Add property attributes using old names
     map.put(config.DEFINITIONS_CONFIG_PARAMETER_NAME, 
config.getDefinitionConfigFiles());
     map.put(config.TILES_DETAILS_PARAMETER_NAME, 
Integer.toString(config.getDebugLevel()) );
     map.put(config.PARSER_DETAILS_PARAMETER_NAME, 
Integer.toString(config.getParserDebugLevel()) );
     map.put(config.PARSER_VALIDATE_PARAMETER_NAME, new 
Boolean(config.getParserValidate()).toString() );
  
     if( ! 
"org.apache.struts.tiles.xmlDefinition.I18nFactorySet".equals(config.getFactoryClassname())
 )
       map.put(config.FACTORY_CLASSNAME_PARAMETER_NAME, config.getFactoryClassname());
  
    return map;
    }
  }
  
  
  

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

Reply via email to