| /* |
| * Copyright 2004-2005 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.tiles; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.Enumeration; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import javax.servlet.ServletConfig; |
| import javax.servlet.ServletContext; |
| import javax.servlet.ServletRequest; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.taglib.tiles.ComponentConstants; |
| |
| /** |
| * Utilities class for definitions factory. |
| * Also define userDebugLevel property (TODO to be moved from this class ?). |
| * @deprecated Use {@link TilesUtil#createDefinitionsFactory(ServletContext, DefinitionsFactoryConfig)} |
| */ |
| public class DefinitionsUtil extends TilesUtil implements ComponentConstants { |
| |
| /** |
| * Commons Logging instance. |
| */ |
| protected static Log log = LogFactory.getLog(DefinitionsUtil.class); |
| |
| /** |
| * Global user defined debug level. |
| * @deprecated This will be removed in a release after Struts 1.2. |
| */ |
| public static int userDebugLevel = 0; |
| |
| /** |
| * User Debug level. |
| * @deprecated This will be removed in a release after Struts 1.2. |
| */ |
| public static final int NO_DEBUG = 0; |
| |
| /** |
| * Name of init property carrying debug level. |
| */ |
| public static final String DEFINITIONS_CONFIG_USER_DEBUG_LEVEL = |
| "definitions-debug"; |
| |
| /** |
| * Name of init property carrying factory class name. |
| */ |
| public static final String DEFINITIONS_FACTORY_CLASSNAME = |
| "definitions-factory-class"; |
| |
| /** |
| * Constant name used to store factory in context. |
| */ |
| public static final String DEFINITIONS_FACTORY = |
| "org.apache.tiles.DEFINITIONS_FACTORY"; |
| |
| /** |
| * Constant name used to store definition in jsp context. |
| * Used to pass definition from a Struts action to servlet forward. |
| */ |
| public static final String ACTION_DEFINITION = |
| "org.apache.tiles.ACTION_DEFINITION"; |
| |
| /** |
| * Create Definition factory. |
| * If a factory class name is provided, a factory of this class is created. Otherwise, |
| * default factory is created. |
| * @param classname Class name of the factory to create. |
| * @param servletContext Servlet Context 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, ServletConfig servletConfig) |
| */ |
| public static DefinitionsFactory createDefinitionsFactory( |
| ServletContext servletContext, |
| Map properties, |
| String classname) |
| throws DefinitionsFactoryException { |
| |
| // 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. |
| * @param servletContext Servlet Context passed to 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 DefinitionsFactory createDefinitionsFactory( |
| ServletContext servletContext, |
| Map properties) |
| throws DefinitionsFactoryException { |
| |
| return createDefinitionsFactory(servletContext, properties, null); |
| } |
| |
| /** |
| * Create Definition factory. |
| * 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 factory configuration object. |
| * @return newly created factory of type ConfigurableDefinitionsFactory. |
| * @throws DefinitionsFactoryException If an error occur while initializing factory |
| */ |
| public static DefinitionsFactory createDefinitionsFactory( |
| ServletContext servletContext, |
| ServletConfig servletConfig) |
| throws DefinitionsFactoryException { |
| |
| DefinitionsFactoryConfig factoryConfig = readFactoryConfig(servletConfig); |
| |
| 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; |
| } |
| |
| return createDefinitionsFactory(servletContext, servletConfig); |
| } |
| |
| /** |
| * Get definition factory from appropriate servlet context. |
| * @return Definitions factory or null if not found. |
| * @deprecated Use {@link TilesUtil#getDefinitionsFactory(ServletRequest, ServletContext)} |
| * @since 20020708 |
| */ |
| public static DefinitionsFactory getDefinitionsFactory(ServletContext servletContext) { |
| return (DefinitionsFactory) servletContext.getAttribute(DEFINITIONS_FACTORY); |
| } |
| |
| /** |
| * Get Definition stored in jsp context by an action. |
| * @return ComponentDefinition or null if not found. |
| */ |
| public static ComponentDefinition getActionDefinition(ServletRequest request) { |
| return (ComponentDefinition) request.getAttribute(ACTION_DEFINITION); |
| } |
| |
| /** |
| * Store definition in jsp context. |
| * Mainly used by Struts to pass a definition defined in an Action to the forward. |
| */ |
| public static void setActionDefinition( |
| ServletRequest request, |
| ComponentDefinition definition) { |
| |
| request.setAttribute(ACTION_DEFINITION, definition); |
| } |
| |
| /** |
| * Remove Definition stored in jsp context. |
| * Mainly used by Struts to pass a definition defined in an Action to the forward. |
| */ |
| public static void removeActionDefinition( |
| ServletRequest request, |
| ComponentDefinition definition) { |
| |
| request.removeAttribute(ACTION_DEFINITION); |
| } |
| |
| /** |
| * Populate Definition Factory Config from web.xml properties. |
| * @param factoryConfig Definition Factory Config to populate. |
| * @param servletConfig Current servlet config containing web.xml properties. |
| * @exception IllegalAccessException if the caller does not have |
| * access to the property accessor method |
| * @exception java.lang.reflect.InvocationTargetException if the property accessor method |
| * throws an exception |
| * @see org.apache.commons.beanutils.BeanUtils |
| * @since tiles 20020708 |
| */ |
| public static void populateDefinitionsFactoryConfig( |
| DefinitionsFactoryConfig factoryConfig, |
| ServletConfig servletConfig) |
| throws IllegalAccessException, InvocationTargetException { |
| |
| Map properties = new DefinitionsUtil.ServletPropertiesMap(servletConfig); |
| System.out.println("Populating factory config with these properties: " + properties); |
| factoryConfig.populate(properties); |
| System.out.println("Done populating factory config"); |
| } |
| |
| /** |
| * Create FactoryConfig and initialize it from web.xml. |
| * |
| * @param servletConfig ServletConfig for the module with which |
| * this plug in is associated |
| * @exception DefinitionsFactoryException if this <code>PlugIn</code> cannot |
| * be successfully initialized |
| */ |
| protected static 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. |
| System.out.println("Iterating over servlet parameters"); |
| Enumeration names = config.getInitParameterNames(); |
| while (names.hasMoreElements()) { |
| String key = (String) names.nextElement(); |
| put(key, config.getInitParameter(key)); |
| System.out.println("Storing key " + key); |
| } |
| } |
| } // end inner class |
| |
| } |