/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.server.dispatch;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import javax.el.ELContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import com.caucho.config.ConfigELContext;
import com.caucho.config.ConfigException;
import com.caucho.config.program.ContainerProgram;
import com.caucho.el.EL;
import com.caucho.el.MapVariableResolver;
import com.caucho.server.webapp.WebApp;
import com.caucho.util.L10N;
/**
* Configuration for a servlet.
*/
public class ServletMapping extends ServletConfigImpl {
private static final L10N L = new L10N(ServletMapping.class);
private ArrayList<Mapping> _mappingList
= new ArrayList<Mapping>();
private boolean _isStrictMapping;
private boolean _isRegexp;
private boolean _ifAbsent;
/**
* Creates a new servlet mapping object.
*/
public ServletMapping()
{
}
public void setIfAbsent(boolean ifAbsent)
{
_ifAbsent = ifAbsent;
}
/**
* Sets the url pattern
*/
public void addURLPattern(String pattern)
{
if (pattern.indexOf('\n') > -1) {
throw new ConfigException(L.l("'url-pattern' cannot contain newline"));
}
_mappingList.add(new Mapping(pattern, null));
// server/13f4
if (getServletNameDefault() == null)
setServletNameDefault(pattern);
}
/**
* Sets the url regexp
*/
public void addURLRegexp(String pattern)
{
_mappingList.add(new Mapping(null, pattern));
}
/**
* True if strict mapping should be enabled.
*/
public boolean isStrictMapping()
{
return _isStrictMapping;
}
/**
* Set if strict mapping should be enabled.
*/
public void setStrictMapping(boolean isStrictMapping)
{
_isStrictMapping = isStrictMapping;
}
/**
* initialize.
*/
public void init(ServletMapper mapper)
throws ServletException
{
boolean hasInit = false;
if (getServletName() == null)
setServletName(getServletNameDefault());
if (getServletName() != null && getServletName().indexOf("${") >= 0)
_isRegexp = true;
if (getServletClassName() != null && getServletClassName().indexOf("${") >= 0)
_isRegexp = true;
for (int i = 0; i < _mappingList.size(); i++) {
Mapping mapping = _mappingList.get(i);
String urlPattern = mapping.getUrlPattern();
String urlRegexp = mapping.getUrlRegexp();
if (getServletName() == null
&& getServletClassName() != null
&& urlPattern != null) {
setServletName(urlPattern);
}
if (urlPattern != null && ! hasInit) {
hasInit = true;
super.init();
if (getServletClassName() != null)
mapper.getServletManager().addServlet(this);
}
if (urlPattern != null)
mapper.addUrlMapping(urlPattern, getServletName(), this, _ifAbsent);
else
mapper.addUrlRegexp(urlRegexp, getServletName(), this);
}
/*
if (_urlRegexp == null) {
if (getServletName() == null && getServletClassName() != null) {
// server/13f4
}
}
*/
}
Class<?> getServletClass(ArrayList<String> vars)
{
if (vars.size() > 1 || _isRegexp) {
return initRegexpClass(vars);
}
else {
return getServletClass();
}
}
/**
* Initialize for a regexp.
*/
String initRegexpName(ArrayList<String> vars)
{
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("regexp", vars);
ELContext mapEnv = new ConfigELContext(new MapVariableResolver(map));
String rawName = getServletName();
String rawClassName = getServletClassName();
if (rawName == null)
rawName = rawClassName;
if (rawClassName == null)
rawClassName = rawName;
try {
return EL.evalString(rawName, mapEnv);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw ConfigException.create(e);
}
}
/**
* Initialize for a regexp.
*/
Class<?> initRegexpClass(ArrayList<String> vars)
{
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("regexp", vars);
ELContext mapEnv = new ConfigELContext(new MapVariableResolver(map));
String rawName = getServletName();
String rawClassName = getServletClassName();
if (rawName == null)
rawName = rawClassName;
if (rawClassName == null)
rawClassName = rawName;
try {
String className = EL.evalString(rawClassName, mapEnv);
try {
WebApp app = (WebApp) getServletContext();
return Class.forName(className, false, app.getClassLoader());
} catch (ClassNotFoundException e) {
log.log(Level.WARNING, e.toString(), e);
return null;
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw ConfigException.create(e);
}
}
/**
* Initialize for a regexp.
*/
ServletMapping initRegexpConfig(ArrayList<String> vars)
{
if (vars.size() == 0 || ! _isRegexp)
return null;
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("regexp", vars);
ELContext mapEnv = new ConfigELContext(new MapVariableResolver(map));
String rawName = getServletName();
String rawClassName = getServletClassName();
if (rawName == null)
rawName = rawClassName;
if (rawClassName == null)
rawClassName = rawName;
try {
String servletName = EL.evalString(rawName, mapEnv);
String className = EL.evalString(rawClassName, mapEnv);
ServletMapping config = new ServletMapping();
config.setServletContext(getServletContext());
config.setServletName(servletName);
config.setServletClass(className);
config.copyFrom(this);
config.init();
return config;
/*
try {
WebApp app = (WebApp) getServletContext();
return Class.forName(className, false, app.getClassLoader());
} catch (ClassNotFoundException e) {
log.log(Level.WARNING, e.toString(), e);
return null;
}
*/
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw ConfigException.create(e);
}
}
/**
* Returns a printable representation of the servlet config object.
*/
public String toString()
{
StringBuilder builder = new StringBuilder();
builder.append("ServletMapping[");
for (int i = 0; i < _mappingList.size(); i++) {
Mapping mapping = _mappingList.get(i);
if (mapping.getUrlPattern() != null) {
builder.append("url-pattern=");
builder.append(mapping.getUrlPattern());
builder.append(", ");
}
else if (mapping.getUrlRegexp() != null) {
builder.append("url-regexp=");
builder.append(mapping.getUrlRegexp());
builder.append(", ");
}
}
builder.append("name=");
builder.append(getServletName());
if (getServletClassName() != null) {
builder.append(", class=");
builder.append(getServletClassName());
}
builder.append("]");
return builder.toString();
}
static class Mapping {
private final String _urlPattern;
private final String _urlRegexp;
Mapping(String urlPattern, String urlRegexp)
{
_urlPattern = urlPattern;
_urlRegexp = urlRegexp;
}
String getUrlPattern()
{
return _urlPattern;
}
String getUrlRegexp()
{
return _urlRegexp;
}
public String toString()
{
return "ServletMapping[" + _urlPattern + ", " + _urlRegexp + "]";
}
}
}