blob: 69fc3b8426a0b81536e4b34bf01efd815c553369 [file] [log] [blame]
package org.apache.turbine.util;
/*
* 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.
*/
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.EventListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.turbine.Turbine;
import org.apache.turbine.TurbineConstants;
import org.apache.turbine.annotation.TurbineConfiguration;
/**
* A class used for initialization of Turbine without a servlet container.
* <p>
* If you need to use Turbine outside of a servlet container, you can
* use this class for initialization of the Turbine servlet.
* </p>
*
* <pre>
* TurbineConfig config = new TurbineConfig(".", "conf/TurbineResources.properties");
* </pre>
*
* <p>
* All paths referenced in TurbineResources.properties and the path to
* the properties file itself (the second argument) will be resolved
* relative to the directory given as the first argument of the constructor,
* here - the directory where application was started. Don't worry about
* discarding the references to objects created above. They are not needed,
* once everything is initialized.
* </p>
*
* <p>
* In order to initialize the Services Framework outside of the Turbine Servlet,
* you need to call the <code>init()</code> method. By default, this will
* initialize the Resource and Logging Services and any other services you
* have defined in your TurbineResources.properties file.
* </p>
*
* TODO Make this class enforce the lifecycle contracts
*
* @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
* @author <a href="mailto:krzewski@e-point.pl">Rafal Krzewski</a>
* @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
* @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
* @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
* @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
* @version $Id$
*/
public class TurbineConfig
implements ServletConfig, ServletContext, Initializable, Disposable
{
@TurbineConfiguration( TurbineConstants.SESSION_TIMEOUT_KEY )
protected int timeout = TurbineConstants.SESSION_TIMEOUT_DEFAULT;
/**
* Servlet initialization parameter name for the path to
* TurbineConfiguration.xml file used by Turbine
*/
public static final String CONFIGURATION_PATH_KEY = "configuration";
/**
* Servlet initialization parameter name for the path to
* Turbine.properties file used by Turbine
*/
public static final String PROPERTIES_PATH_KEY = "properties";
/**
* Default value of TurbineResources.properties file path
* (<code>/WEB-INF/conf/TurbineResources.properties</code>).
*/
public static final String PROPERTIES_PATH_DEFAULT =
"/WEB-INF/conf/TurbineResources.properties";
/** Filenames are looked up in this directory. */
protected File root;
/** Servlet container (or emulator) attributes. */
protected Map<String, Object> attributes;
/** Turbine servlet initialization parameters. */
protected Map<String, String> initParams;
/** The Turbine servlet instance used for initialization. */
private Turbine turbine;
/** Logging */
private final Logger log = LogManager.getLogger(this.getClass());
/**
* Constructs a new TurbineConfig.
*
* This is the general form of the constructor. You can provide
* a path to search for files, and a name-value map of init
* parameters.
*
* <p> For the list of recognized init parameters, see
* {@link org.apache.turbine.Turbine} class.
*
* @param path The web application root (i.e. the path for file lookup).
* @param attributes Servlet container (or emulator) attributes.
* @param initParams initialization parameters.
*/
public TurbineConfig(String path, Map<String, Object> attributes,
Map<String, String> initParams)
{
root = new File(path);
this.attributes = attributes;
this.initParams = initParams;
}
/**
* Constructs a new TurbineConfig.
*
* This is the general form of the constructor. You can provide
* a path to search for files, and a name-value map of init
* parameters.
*
* <p> For the list of recognized init parameters, see
* {@link org.apache.turbine.Turbine} class.
*
* @param path The web application root (i.e. the path for file lookup).
* @param initParams initialization parameters.
*/
public TurbineConfig(String path, Map<String, String> initParams)
{
this(path, new HashMap<String, Object>(0), initParams);
}
/**
* Constructs a TurbineConfig.
*
* This is a specialized constructor that allows to configure
* Turbine easily in the common setups.
*
* Check also {@link TurbineXmlConfig} to load a {@link #CONFIGURATION_PATH_KEY}.
*
* @param path The web application root (i.e. the path for file lookup).
* @param properties the relative path to TurbineResources.properties file
*/
public TurbineConfig(String path, String properties)
{
this(path, new HashMap<String, String>(1));
initParams.put(PROPERTIES_PATH_KEY, properties);
}
/**
* Causes this class to initialize itself which in turn initializes
* all of the Turbine Services that need to be initialized.
*/
@Override
public void initialize()
{
try
{
turbine = new Turbine();
turbine.init(this);
}
catch (Exception e)
{
log.error("TurbineConfig: Initialization failed", e);
}
}
/**
* Initialization requiring a HTTP <code>GET</code> request.
* @param data the Turbine request
*/
public void init(RunData data)
{
if (turbine != null)
{
turbine.init(data);
}
}
/**
* Shutdown the Turbine System, lifecycle style
*
*/
@Override
public void dispose()
{
if (turbine != null)
{
turbine.destroy();
}
}
/**
* Returns a reference to the Turbine servlet that was initialized.
*
* @return a ServletContext reference
*/
public Turbine getTurbine()
{
return turbine;
}
/**
* Returns a reference to the object cast onto ServletContext type.
*
* @return a ServletContext reference
*/
@Override
public ServletContext getServletContext()
{
return this;
}
/**
* Translates a path relative to the web application root into an
* absolute path.
*
* @param path A path relative to the web application root.
* @return An absolute version of the supplied path, or <code>null</code>
* if the translated path doesn't map to a file or directory.
*/
@Override
public String getRealPath(String path)
{
String result = null;
File f = new File(root, path);
if (log.isDebugEnabled())
{
log.debug("TurbineConfig.getRealPath: path '{}' translated to '{}' {}found",
path, f.getPath(), f.exists() ? "" : "not ");
}
if (f.exists())
{
result = f.getPath();
}
else
{
log.error("getRealPath(\"{}\") is undefined, returning null", path);
}
return result;
}
/**
* Retrieves an initialization parameter.
*
* @param name the name of the parameter.
* @return the value of the parameter.
*/
@Override
public String getInitParameter(String name)
{
return initParams.get(name);
}
/**
* Retrieves an Enumeration of initialization parameter names.
*
* @return an Enumeration of initialization parameter names.
*/
@Override
public Enumeration<String> getInitParameterNames()
{
return new Vector<>(initParams.keySet()).elements();
}
/**
* Returns the servlet name.
*
* Fixed value "Turbine" is returned.
*
* @return the servlet name.
*/
@Override
public String getServletName()
{
return "Turbine";
}
/**
* Returns the context name.
*
* Fixed value "Turbine" is returned
*
* @return the context name
*/
@Override
public String getServletContextName()
{
return "Turbine";
}
/**
* Returns the context path.
*
* Fixed value "/turbine" is returned
*
* @return the context path
*/
@Override
public String getContextPath()
{
return "/turbine";
}
/**
* Returns a URL to the resource that is mapped to a specified
* path. The path must begin with a "/" and is interpreted
* as relative to the current context root.
*
* @param s the path to the resource
* @return a URL pointing to the resource
* @throws MalformedURLException if unable to parse path
*/
@Override
public URL getResource(String s)
throws MalformedURLException
{
return new URL("file://" + getRealPath(s));
}
/**
* Returns the resource located at the named path as
* an <code>InputStream</code> object.
*
* @param s the path to the resource
* @return an InputStream object from which the resource can be read
*/
@Override
public InputStream getResourceAsStream(String s)
{
try
{
FileInputStream fis = new FileInputStream(getRealPath(s));
return new BufferedInputStream(fis);
}
catch (FileNotFoundException e)
{
return null;
}
}
/**
* Logs an error message.
*
* @param e an Exception.
* @param m a message.
* @deprecated use log(String,Throwable) instead
*/
@Override
@Deprecated
public void log(Exception e, String m)
{
log.info(m, e);
}
/**
* Logs a message.
*
* @param m a message.
*/
@Override
public void log(String m)
{
log.info(m);
}
/**
* Logs an error message.
*
* @param t a Throwable object.
* @param m a message.
*/
@Override
public void log(String m, Throwable t)
{
log.info(m, t);
}
/**
* Returns the servlet container attribute with the given name, or
* null if there is no attribute by that name.
*/
@Override
public Object getAttribute(String s)
{
return attributes.get(s);
}
/**
* Returns an Enumeration containing the attribute names available
* within this servlet context.
*/
@Override
public Enumeration<String> getAttributeNames()
{
return new Vector<>(attributes.keySet()).elements();
}
// Unimplemented methods follow
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public ServletContext getContext(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public int getMajorVersion()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public String getMimeType(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public int getMinorVersion()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public RequestDispatcher getNamedDispatcher(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletConfig or ServletContext interface that is not
* implemented and will throw <code>UnsuportedOperationException</code>
* upon invocation
*/
@Override
public RequestDispatcher getRequestDispatcher(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext (2.3) interface that is not implemented and
* will throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Set<String> getResourcePaths(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext (2.3) interface that is not implemented and
* will throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public String getServerInfo()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
* @deprecated As of Java Servlet API 2.1, with no direct replacement.
*/
@Override
@Deprecated
public Servlet getServlet(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
* @deprecated As of Java Servlet API 2.1, with no replacement.
*/
@Override
@Deprecated
public Enumeration<String> getServletNames()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
* @deprecated As of Java Servlet API 2.0, with no replacement.
*/
@Override
@Deprecated
public Enumeration<Servlet> getServlets()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void removeAttribute(String s)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void setAttribute(String s, Object o)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public int getEffectiveMajorVersion()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public int getEffectiveMinorVersion()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public boolean setInitParameter(String name, String value)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Dynamic addServlet(String servletName, String className)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Dynamic addServlet(String servletName, Servlet servlet)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public ServletRegistration getServletRegistration(String servletName)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Map<String, ? extends ServletRegistration> getServletRegistrations()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public FilterRegistration getFilterRegistration(String filterName)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Map<String, ? extends FilterRegistration> getFilterRegistrations()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public SessionCookieConfig getSessionCookieConfig()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void addListener(String className)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public <T extends EventListener> void addListener(T t)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void addListener(Class<? extends EventListener> listenerClass)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public JspConfigDescriptor getJspConfigDescriptor()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public ClassLoader getClassLoader()
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public void declareRoles(String... roleNames)
{
throw new UnsupportedOperationException();
}
/**
* Not implemented.
*
* A method in ServletContext interface that is not implemented and will
* throw <code>UnsuportedOperationException</code> upon invocation
*/
@Override
public String getVirtualServerName()
{
throw new UnsupportedOperationException();
}
}