org.apache.struts.tiles.TilesUtil Maven / Gradle / Ivy
/*
* $Id: TilesUtil.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;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Class containing utility methods for Tiles.
* Methods of this class are static and thereby accessible from anywhere.
* The underlying implementation can be changed with
* {@link #setTilesUtil(TilesUtilImpl)}.
*
* Real implementation classes should derive from the {@link TilesUtilImpl} class.
*
* Some methods are specified to throw the UnsupportedOperationException
* if the underlying implementation doesn't support the operation.
*/
public class TilesUtil {
/** Commons Logging instance.*/
protected static Log log = LogFactory.getLog(TilesUtil.class);
/** The implementation of tilesUtilImpl */
protected static TilesUtilImpl tilesUtilImpl = new TilesUtilImpl();
/**
* Get the real implementation.
* @return The underlying implementation object.
*/
static public TilesUtilImpl getTilesUtil() {
return tilesUtilImpl;
}
/**
* Set the real implementation.
* This method should be called only once.
* Successive calls have no effect.
* @param tilesUtil The implementaion.
*/
static public void setTilesUtil(TilesUtilImpl tilesUtil) {
if (implAlreadySet) {
return;
}
tilesUtilImpl = tilesUtil;
implAlreadySet = true;
}
/**
* Getter to know if the underlying implementation is already set to another
* value than the default value.
* @return true
if {@link #setTilesUtil} has already been called.
*/
static boolean isTilesUtilImplSet() {
return implAlreadySet;
}
/** Flag to know if internal implementation has been set by the setter method */
private static boolean implAlreadySet = false;
/**
* Do a forward using request dispatcher.
*
* This method is used by the Tiles package anytime a forward is required.
* @param uri Uri or Definition name to forward.
* @param request Current page request.
* @param response Current page response.
* @param servletContext Current servlet context.
*/
public static void doForward(
String uri,
HttpServletRequest request,
HttpServletResponse response,
ServletContext servletContext)
throws IOException, ServletException {
tilesUtilImpl.doForward(uri, request, response, servletContext);
}
/**
* Do an include using request dispatcher.
*
* This method is used by the Tiles package when an include is required.
* The Tiles package can use indifferently any form of this method.
* @param uri Uri or Definition name to forward.
* @param request Current page request.
* @param response Current page response.
* @param servletContext Current servlet context.
*/
public static void doInclude(
String uri,
HttpServletRequest request,
HttpServletResponse response,
ServletContext servletContext)
throws IOException, ServletException {
tilesUtilImpl.doInclude(uri, request, response, servletContext);
}
/**
* Do an include using PageContext.include().
*
* This method is used by the Tiles package when an include is required.
* The Tiles package can use indifferently any form of this method.
* @param uri Uri or Definition name to forward.
* @param pageContext Current page context.
*/
public static void doInclude(String uri, PageContext pageContext)
throws IOException, ServletException {
doInclude(uri, pageContext, true);
}
/**
* Do an include using PageContext.include().
*
* This method is used by the Tiles package when an include is required.
* The Tiles package can use indifferently any form of this method.
* @param uri Uri or Definition name to forward.
* @param flush If the writer should be flushed before the include
* @param pageContext Current page context.
*/
public static void doInclude(String uri, PageContext pageContext, boolean flush)
throws IOException, ServletException {
tilesUtilImpl.doInclude(uri, pageContext, flush);
}
/**
* Get definition factory from appropriate servlet context.
* @return Definitions factory or null
if not found.
*/
public static DefinitionsFactory getDefinitionsFactory(
ServletRequest request,
ServletContext servletContext) {
return tilesUtilImpl.getDefinitionsFactory(request, servletContext);
}
/**
* Create Definition factory from specified configuration object.
* Create a ConfigurableDefinitionsFactory and initialize it with the configuration
* object. This later can contain the factory classname to use.
* Factory is made accessible from tags.
*
* 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 {
return tilesUtilImpl.createDefinitionsFactory(servletContext, factoryConfig);
}
/**
* Get a definition by its name.
* First, retrieve definition factory and then get requested definition.
* Throw appropriate exception if definition or definition factory is not found.
* @param definitionName Name of requested definition.
* @param request Current servelet request.
* @param servletContext current servlet context.
* @throws FactoryNotFoundException Can't find definition factory.
* @throws DefinitionsFactoryException General error in factory while getting definition.
* @throws NoSuchDefinitionException No definition found for specified name
*/
public static ComponentDefinition getDefinition(
String definitionName,
ServletRequest request,
ServletContext servletContext)
throws FactoryNotFoundException, DefinitionsFactoryException {
try {
return getDefinitionsFactory(request, servletContext).getDefinition(
definitionName,
(HttpServletRequest) request,
servletContext);
} catch (NullPointerException ex) { // Factory not found in context
throw new FactoryNotFoundException("Can't get definitions factory from context.");
}
}
/**
* Reset internal state.
* This method is used by test suites to reset the class to its original state.
*/
protected static void testReset() {
implAlreadySet = false;
tilesUtilImpl = new TilesUtilImpl();
}
}