org.apache.struts.tiles.definition.ComponentDefinitionsFactoryWrapper Maven / Gradle / Ivy
/*
* $Id: ComponentDefinitionsFactoryWrapper.java 471754 2006-11-06 14:55:09Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.struts.tiles.definition;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import org.apache.struts.tiles.ComponentDefinition;
import org.apache.struts.tiles.ComponentDefinitionsFactory;
import org.apache.struts.tiles.DefinitionsFactory;
import org.apache.struts.tiles.DefinitionsFactoryConfig;
import org.apache.struts.tiles.DefinitionsFactoryException;
import org.apache.struts.tiles.NoSuchDefinitionException;
import org.apache.struts.util.RequestUtils;
/**
* 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.
* @since 20020708
*/
public class ComponentDefinitionsFactoryWrapper implements DefinitionsFactory {
/**
* The underlying factory.
*/
private ComponentDefinitionsFactory factory = null;
/**
* Factory configuration,
*/
private DefinitionsFactoryConfig config = null;
/**
* Constructor.
* Create new wrapper for specified factory.
* @param factory The factory to create a wrapper for.
*/
public ComponentDefinitionsFactoryWrapper(ComponentDefinitionsFactory factory) {
this.factory = factory;
}
/**
* Constructor.
* Create new wrapper.
* The config object passed to init method should reference a factory implementing
* {@link ComponentDefinitionsFactory}.
*/
public ComponentDefinitionsFactoryWrapper() {
super();
}
/**
* Get requested definition.
* @param name Name of the definition.
* @param request The request we are processing.
* @param servletContext Our servlet context.
* @return ComponentDefition
*/
public ComponentDefinition getDefinition(
String name,
ServletRequest request,
ServletContext servletContext)
throws NoSuchDefinitionException, DefinitionsFactoryException {
return factory.getDefinition(name, request, servletContext);
}
/**
* Call underlying factory init method.
* @param config DefinitionsFactoryConfig.
* @param servletContext Our servlet context.
*/
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.
* @param config DefinitionsFactoryConfig to use.
* @param servletContext Our servlet context.
*
*/
public void setConfig(
DefinitionsFactoryConfig config,
ServletContext servletContext)
throws DefinitionsFactoryException {
ComponentDefinitionsFactory newFactory =
createFactoryInstance(config.getFactoryClassname());
newFactory.initFactory(servletContext, createConfigMap(config));
factory = newFactory;
}
/**
* Get underlying factory configuration.
* @return DefinitionsFactoryConfig.
*/
public DefinitionsFactoryConfig getConfig() {
return config;
}
/**
* Get internal factory.
* @return The internal ComponentDefitionsFactory.
*/
public ComponentDefinitionsFactory getInternalFactory() {
return factory;
}
/**
* Create Definition factory from provided classname which must implement {@link ComponentDefinitionsFactory}.
* Factory class must extend {@link DefinitionsFactory}.
* @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 = RequestUtils.applicationClass(classname);
Object factory = factoryClass.newInstance();
return (ComponentDefinitionsFactory) factory;
} catch (ClassCastException ex) { // Bad classname
throw new DefinitionsFactoryException(
"Error - createDefinitionsFactory : Factory class '"
+ classname
+ " must implement 'DefinitionsFactory'.",
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);
}
}
/**
* Return String representation.
* Calls toString() on underlying factory.
* @return String representation.
*/
public String toString() {
return getInternalFactory().toString();
}
/**
* Create map of configuration attributes from configuration object.
* Mapping is done between old names and new names.
* @param config The DefinitionsFactoryConfig to use.
* @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(
DefinitionsFactoryConfig.DEFINITIONS_CONFIG_PARAMETER_NAME,
config.getDefinitionConfigFiles());
map.put(
DefinitionsFactoryConfig.PARSER_VALIDATE_PARAMETER_NAME,
(config.getParserValidate() ? Boolean.TRUE.toString() : Boolean.FALSE.toString()));
if (!"org.apache.struts.tiles.xmlDefinition.I18nFactorySet"
.equals(config.getFactoryClassname())) {
map.put(
DefinitionsFactoryConfig.FACTORY_CLASSNAME_PARAMETER_NAME,
config.getFactoryClassname());
}
return map;
}
}