/** * */ package org.jboss.test.faces.staging; import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * This class represens Servlet in the web application. * @author asmirnov * */ public class ServletContainer implements RequestChain { private static final Logger log = ServerLogger.SERVER.getLogger(); private final Servlet servlet; private final boolean prefixMapped; private final String mapping; private final Map<String, String> initParameters; private String name = "Default"; private boolean initialized = false; /** * @param mapping Servlet mapping pattern, as defined in the <servlet-mapping> element. * @param servlet servlet instance. Can't be null. * @throws NullPointerException if servlet parameter is null. */ public ServletContainer(String mapping, Servlet servlet) { if(null == servlet){ throw new NullPointerException(); } if (null == mapping) { this.prefixMapped = true; this.mapping = ""; } else if (mapping.startsWith("*")) { this.prefixMapped = false; this.mapping = mapping.substring(1); } else if (mapping.endsWith("*")) { this.prefixMapped = true; this.mapping = mapping.substring(0, mapping.length() - 1); } else { throw new IllegalArgumentException("Invalid mapping " + mapping); } this.servlet = servlet; this.initParameters = new HashMap<String, String>(); } /** * Append filter initialization parameter. Name and value are same as * defined in the web.xml * * <code> * <init-param> * <param-name>foo</param-name> * <param-value>bar</param-value> * </init-param> * </code> * * @param name * @param value * @throws IllegalStateException if servlet was already initialized. */ public void addInitParameter(String name, String value) { if (initialized) { throw new IllegalStateException( "Servlet have already been initialized, init parameters can't be changed"); } initParameters.put(name, value); } /** * @return the name of servlet */ public String getName() { return name; } /** * @param name * the name to set * @throws IllegalStateException if servlet was already initialized. */ public void setName(String name) { if (initialized) { throw new IllegalStateException( "Servlet have already been initialized, name can't be changed"); } this.name = name; } /* * (non-Javadoc) * * @see * org.jboss.test.faces.staging.RequestChain#isApplicable(java.lang.String) */ public boolean isApplicable(String path) { if (prefixMapped && path.startsWith(mapping)) { return true; } else if (!prefixMapped && path.endsWith(mapping)) { return true; } else { return false; } } /* (non-Javadoc) * @see org.jboss.test.faces.staging.RequestChain#getServletPath(java.lang.String) */ public String getServletPath(String path) { if (!isApplicable(path)) { return null; } if (prefixMapped) { return mapping; } else { return path; } } /* (non-Javadoc) * @see org.jboss.test.faces.staging.RequestChain#getPathInfo(java.lang.String) */ public String getPathInfo(String path) { if (!isApplicable(path)) { return null; } if (prefixMapped) { return path.substring(mapping.length()); } else { return null; } } /* (non-Javadoc) * @see org.jboss.test.faces.staging.RequestChain#init(org.jboss.test.faces.staging.StagingServletContext) */ public void init(final ServletContext context) throws ServletException { if (!initialized) { log.finest("Initialize servlet "+getName()); servlet.init(new ServletConfig() { public String getInitParameter(String name) { return initParameters.get(name); } @SuppressWarnings("unchecked") public Enumeration getInitParameterNames() { return Collections.enumeration(initParameters.keySet()); } public ServletContext getServletContext() { return context; } public String getServletName() { return name; } }); initialized = true; } } /* * (non-Javadoc) * * @see * org.jboss.test.faces.staging.RequestChain#execute(javax.servlet.ServletRequest * , javax.servlet.ServletResponse) */ public void execute(ServletRequest request, ServletResponse response) throws ServletException, IOException { if (!initialized) { throw new IllegalStateException( "Servlet "+getName()+" have not been initialized, could'n execute request"); } log.finest("Request '"+request+"' executes by the '"+getName()+"' servlet"); this.servlet.service(request, response); } /* (non-Javadoc) * @see org.jboss.test.faces.staging.RequestChain#destroy() */ public void destroy() { if (initialized) { this.servlet.destroy(); initialized = false; } } }