FELIX-4545 : Implement Servlet Context Helper
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1655988 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/AbstractHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/AbstractHandler.java
index ad68e2a..883e44a 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/AbstractHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/AbstractHandler.java
@@ -45,6 +45,18 @@
this.initParams = new HashMap<String, String>();
}
+ public AbstractHandler(ExtServletContext context, final Map<String, String> initParams, String baseName)
+ {
+ this.context = context;
+ this.baseName = baseName;
+ this.id = ID.incrementAndGet();
+ this.initParams = new HashMap<String, String>();
+ if ( initParams != null)
+ {
+ this.initParams.putAll(initParams);
+ }
+ }
+
public abstract void destroy();
public final Map<String, String> getInitParams()
@@ -89,17 +101,6 @@
}
}
- public final void setInitParams(Map<String, String> map)
- {
- this.initParams.clear();
- if (map == null)
- {
- return;
- }
-
- this.initParams.putAll(map);
- }
-
protected final ExtServletContext getContext()
{
return this.context;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
index 71045e9..7f028d8 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
@@ -38,7 +38,7 @@
public FilterHandler(ExtServletContext context, Filter filter, FilterInfo filterInfo)
{
- super(context, filterInfo.name);
+ super(context, filterInfo.initParams, filterInfo.name);
this.filter = filter;
this.filterInfo = filterInfo;
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
index 5a1efbc..e88cfc4 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
@@ -235,24 +235,29 @@
}
}
- private final String alias;
private final Servlet servlet;
- private final Pattern pattern;
+ private final Pattern[] patterns;
+
+ private final String alias;
public ServletHandler(final ExtServletContext context,
- final Servlet servlet,
- final ServletInfo servletInfo,
- final String alias)
+ final ServletInfo servletInfo)
{
- super(context, servletInfo.name);
- this.servlet = servlet;
- this.alias = alias;
- this.pattern = Pattern.compile(alias.replace(".", "\\.").replace("*", ".*"));
+ super(context, servletInfo.getInitParams(), servletInfo.getName());
+ this.servlet = servletInfo.getServlet();
+ this.patterns = new Pattern[servletInfo.getPatterns().length];
+ for(int i=0; i<servletInfo.getPatterns().length;i++)
+ {
+ this.patterns[i] = Pattern.compile(servletInfo.getPatterns()[i].replace(".", "\\.").replace("*", ".*"));
+ }
+ // TODO - currently we just provide one
+ this.alias = servletInfo.getPatterns()[0];
}
@Override
public int compareTo(ServletHandler other)
{
+ // TODO - currently we just compare based on the first one
int result = other.alias.length() - this.alias.length();
if ( result == 0 )
{
@@ -337,7 +342,8 @@
{
return true;
}
- return this.pattern.matcher(uri).matches();
+ // TODO only first pattern is used
+ return this.patterns[0].matcher(uri).matches();
}
final void doHandle(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java
index 85e8bcc..0bb738a 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/AbstractInfo.java
@@ -18,6 +18,9 @@
*/
package org.apache.felix.http.base.internal.runtime;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import org.osgi.framework.Constants;
@@ -94,12 +97,85 @@
return value == null || value.length() == 0;
}
- protected String getStringProperty(final ServiceReference<?> ref, final String key)
+ protected boolean isEmpty(final String[] value)
+ {
+ return value == null || value.length == 0;
+ }
+
+ protected String getStringProperty(final ServiceReference<T> ref, final String key)
{
final Object value = ref.getProperty(key);
return (value instanceof String) ? (String) value : null;
}
+ protected String[] getStringArrayProperty(ServiceReference<T> ref, String key)
+ {
+ Object value = ref.getProperty(key);
+
+ if (value instanceof String)
+ {
+ return new String[] { (String) value };
+ }
+ else if (value instanceof String[])
+ {
+ return (String[]) value;
+ }
+ else if (value instanceof Collection<?>)
+ {
+ Collection<?> collectionValues = (Collection<?>) value;
+ String[] values = new String[collectionValues.size()];
+
+ int i = 0;
+ for (Object current : collectionValues)
+ {
+ values[i++] = current != null ? String.valueOf(current) : null;
+ }
+
+ return values;
+ }
+
+ return null;
+ }
+
+ protected boolean getBooleanProperty(ServiceReference<T> ref, String key)
+ {
+ Object value = ref.getProperty(key);
+ if (value instanceof String)
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ return false;
+ }
+
+ /**
+ * Get the init parameters.
+ */
+ protected Map<String, String> getInitParams(final ServiceReference<T> ref, final String prefix)
+ {
+ Map<String, String> result = null;
+ for (final String key : ref.getPropertyKeys())
+ {
+ if ( key.startsWith(prefix))
+ {
+ final String paramKey = key.substring(prefix.length());
+ final String paramValue = getStringProperty(ref, key);
+
+ if (paramValue != null)
+ {
+ if ( result == null )
+ {
+ result = new HashMap<String, String>();
+ }
+ result.put(paramKey, paramValue);
+ }
+ }
+ }
+ return result;
+ }
public int getRanking()
{
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
index ab1ef3a..fbb8ddb 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
@@ -23,10 +23,10 @@
import javax.servlet.Servlet;
import org.osgi.dto.DTO;
+import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.runtime.dto.ServletDTO;
-
-import aQute.bnd.annotation.ConsumerType;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
/**
* Provides registration information for a {@link Servlet}, and is used to programmatically register {@link Servlet}s.
@@ -36,13 +36,18 @@
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-@ConsumerType
-public final class ServletInfo
+public final class ServletInfo extends AbstractInfo<Servlet>
{
/**
+ * Properties starting with this prefix are passed as servlet init parameters to the
+ * {@code init()} method of the servlet.
+ */
+ private static final String SERVLET_INIT_PREFIX = "servlet.init.";
+
+ /**
* The name of the servlet.
*/
- public String name;
+ private final String name;
/**
* The request mappings for the servlet.
@@ -50,28 +55,96 @@
* The specified patterns are used to determine whether a request is mapped to the servlet.
* </p>
*/
- public String[] patterns;
+ private final String[] patterns;
/**
* The error pages and/or codes.
*/
- public String[] errorPage;
+ private final String[] errorPage;
/**
* Specifies whether the servlet supports asynchronous processing.
*/
- public boolean asyncSupported = false;
+ private final boolean asyncSupported;
/**
* The servlet initialization parameters as provided during registration of the servlet.
*/
- public Map<String, String> initParams;
+ private final Map<String, String> initParams;
+
+ private final HttpContext context;
+
+ private final Servlet servlet;
+
+ public ServletInfo(final ServiceReference<Servlet> ref, final Servlet servlet)
+ {
+ super(ref);
+ this.name = getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME);
+ this.errorPage = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ERROR_PAGE);
+ this.patterns = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN);
+ this.asyncSupported = getBooleanProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED);
+ this.initParams = getInitParams(ref, SERVLET_INIT_PREFIX);
+ this.context = null;
+ this.servlet = servlet;
+ }
/**
- * The {@link HttpContext} for the servlet.
+ * Constructor for Http Service
*/
- public HttpContext context;
+ public ServletInfo(final String name,
+ final String pattern,
+ final int serviceRanking,
+ final Map<String, String> initParams,
+ final Servlet servlet,
+ final HttpContext context)
+ {
+ super(serviceRanking);
+ this.name = name;
+ this.patterns = new String[] {pattern};
+ this.initParams = initParams;
+ this.asyncSupported = false;
+ this.errorPage = null;
+ this.servlet = servlet;
+ this.context = context;
+ }
- public int ranking = 0;
- public long serviceId;
+ public boolean isValid()
+ {
+ return !isEmpty(this.patterns);
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public String[] getPatterns()
+ {
+ return patterns;
+ }
+
+ public String[] getErrorPage()
+ {
+ return errorPage;
+ }
+
+ public boolean isAsyncSupported()
+ {
+ return asyncSupported;
+ }
+
+ public Map<String, String> getInitParams()
+ {
+ return initParams;
+ }
+
+ public HttpContext getContext()
+ {
+ return this.context;
+ }
+
+ public Servlet getServlet()
+ {
+ return this.servlet;
+ }
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
index 82b1eae..8c98d51 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
@@ -124,7 +124,6 @@
}
FilterHandler handler = new FilterHandler(getServletContext(filterInfo.context), filter, filterInfo);
- handler.setInitParams(filterInfo.initParams);
try {
this.handlerRegistry.addFilter(handler);
} catch (ServletException e) {
@@ -197,37 +196,26 @@
* @throws ServletException
* @throws NamespaceException
*/
- public void registerServlet(Servlet servlet, ServletInfo servletInfo)
+ public void registerServlet(final ServletInfo servletInfo)
{
- if (servlet == null)
- {
- throw new IllegalArgumentException("Servlet must not be null");
- }
if (servletInfo == null)
{
throw new IllegalArgumentException("ServletInfo cannot be null!");
}
- if (isEmpty(servletInfo.patterns) && isEmpty(servletInfo.errorPage))
+ if (isEmpty(servletInfo.getPatterns()) && isEmpty(servletInfo.getErrorPage()))
{
throw new IllegalArgumentException("ServletInfo must at least have one pattern or error page!");
}
- if (isEmpty(servletInfo.name))
- {
- servletInfo.name = servlet.getClass().getName();
- }
- for(final String pattern : servletInfo.patterns) {
- final ServletHandler handler = new ServletHandler(getServletContext(servletInfo.context), servlet, servletInfo, pattern);
- handler.setInitParams(servletInfo.initParams);
- try {
- this.handlerRegistry.addServlet(handler);
- } catch (ServletException e) {
- // TODO create failure DTO
- } catch (NamespaceException e) {
- // TODO create failure DTO
- }
- this.localServlets.add(servlet);
+ final ServletHandler handler = new ServletHandler(getServletContext(servletInfo.getContext()), servletInfo);
+ try {
+ this.handlerRegistry.addServlet(handler);
+ } catch (ServletException e) {
+ // TODO create failure DTO
+ } catch (NamespaceException e) {
+ // TODO create failure DTO
}
+ this.localServlets.add(servletInfo.getServlet());
}
public void unregisterServlet(final Servlet servlet, final ServletInfo servletInfo)
@@ -236,7 +224,7 @@
{
throw new IllegalArgumentException("ServletInfo cannot be null!");
}
- if ( servletInfo.patterns != null )
+ if ( servletInfo.getPatterns() != null )
{
this.handlerRegistry.removeServlet(servlet, true);
this.localServlets.remove(servlet);
@@ -259,15 +247,18 @@
@Override
public void registerServlet(String alias, Servlet servlet, Dictionary initParams, HttpContext context) throws ServletException, NamespaceException
{
+ if (servlet == null)
+ {
+ throw new IllegalArgumentException("Servlet must not be null");
+ }
if (!isAliasValid(alias))
{
throw new IllegalArgumentException("Malformed servlet alias [" + alias + "]");
}
- final ServletInfo info = new ServletInfo();
+ final Map<String, String> paramMap = new HashMap<String, String>();
if ( initParams != null && initParams.size() > 0 )
{
- info.initParams = new HashMap<String, String>();
Enumeration e = initParams.keys();
while (e.hasMoreElements())
{
@@ -276,16 +267,14 @@
if ((key instanceof String) && (value instanceof String))
{
- info.initParams.put((String) key, (String) value);
+ paramMap.put((String) key, (String) value);
}
}
}
- info.ranking = 0;
- info.serviceId = serviceIdCounter.getAndDecrement();
- info.patterns = new String[] {alias};
- info.context = context;
- this.registerServlet(servlet, info);
+ final ServletInfo info = new ServletInfo(null, alias, 0, paramMap, servlet, context);
+
+ this.registerServlet(info);
}
@Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java
index b5b6e24..0cd0dc9 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java
@@ -272,34 +272,16 @@
return filterInfo;
}
- private ServletInfo createServletInfo(final ServiceReference<?> servletRef, final boolean log)
+ public void addServlet(final Servlet service, final ServiceReference<Servlet> ref)
{
- final ServletInfo servletInfo = new ServletInfo();
- servletInfo.name = getStringProperty(servletRef, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME);
- servletInfo.errorPage = getStringArrayProperty(servletRef, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ERROR_PAGE);
- servletInfo.patterns = getStringArrayProperty(servletRef, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN);
- servletInfo.asyncSupported = getBooleanProperty(servletRef, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED);
- servletInfo.initParams = getInitParams(servletRef, SERVLET_INIT_PREFIX);
- servletInfo.ranking = getIntProperty(servletRef, Constants.SERVICE_RANKING, 0);
- servletInfo.serviceId = (Long)servletRef.getProperty(Constants.SERVICE_ID);
-
- if (isEmpty(servletInfo.patterns))
+ final ServletInfo servletInfo = new ServletInfo(ref, service);
+ if ( servletInfo.isValid() )
{
- if ( log ) {
- SystemLogger.debug("Ignoring Servlet Service " + servletRef + ", " + HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN +
- "is missing or empty");
- }
- return null;
+ ((HttpServiceImpl)this.httpService).registerServlet(servletInfo);
}
- return servletInfo;
- }
-
- public void add(Servlet service, ServiceReference<Servlet> ref)
- {
- final ServletInfo servletInfo = createServletInfo(ref, true);
- if ( servletInfo != null )
+ else
{
- ((HttpServiceImpl)this.httpService).registerServlet(service, servletInfo);
+ SystemLogger.debug("Ignoring Servlet Service " + ref);
}
}
@@ -312,10 +294,10 @@
}
}
- public void removeServlet(Servlet service, ServiceReference<Servlet> ref)
+ public void removeServlet(final Servlet service, final ServiceReference<Servlet> ref)
{
- final ServletInfo servletInfo = createServletInfo(ref, false);
- if ( servletInfo != null )
+ final ServletInfo servletInfo = new ServletInfo(ref, null);
+ if ( servletInfo.isValid() )
{
((HttpServiceImpl)this.httpService).unregisterServlet(service, servletInfo);
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
index ff57dc4..de944db 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
@@ -52,7 +52,7 @@
@Override
protected void added(Servlet service, ServiceReference ref)
{
- this.manager.add(service, ref);
+ this.manager.addServlet(service, ref);
}
@Override
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/HandlerRegistryTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/HandlerRegistryTest.java
index 033af49..d1492ba 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/HandlerRegistryTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/HandlerRegistryTest.java
@@ -43,18 +43,16 @@
HandlerRegistry hr = new HandlerRegistry();
Servlet servlet = Mockito.mock(Servlet.class);
- final ServletInfo info = new ServletInfo();
- info.name = "foo";
- ServletHandler handler = new ServletHandler(null, servlet, info, "/foo");
+ final ServletInfo info = new ServletInfo("foo", "/foo", 0, null, servlet, null);
+ ServletHandler handler = new ServletHandler(null, info);
assertEquals("Precondition", 0, hr.getServlets().length);
hr.addServlet(handler);
Mockito.verify(servlet, Mockito.times(1)).init(Mockito.any(ServletConfig.class));
assertEquals(1, hr.getServlets().length);
assertSame(handler, hr.getServlets()[0]);
- final ServletInfo info2 = new ServletInfo();
- info2.name = "bar";
- ServletHandler handler2 = new ServletHandler(null, servlet, info2, "/bar");
+ final ServletInfo info2 = new ServletInfo("bar", "/bar", 0, null, servlet, null);
+ ServletHandler handler2 = new ServletHandler(null, info2);
try
{
hr.addServlet(handler2);
@@ -67,10 +65,9 @@
}
assertArrayEquals(new ServletHandler[] {handler2, handler}, hr.getServlets());
- final ServletInfo info3 = new ServletInfo();
- info3.name = "zar";
- ServletHandler handler3 = new ServletHandler(null, Mockito.mock(Servlet.class), info3,
- "/foo");
+ final ServletInfo info3 = new ServletInfo("zar", "/foo", 0, null, Mockito.mock(Servlet.class), null);
+ ServletHandler handler3 = new ServletHandler(null,info3);
+
try
{
hr.addServlet(handler3);
@@ -95,9 +92,8 @@
final HandlerRegistry hr = new HandlerRegistry();
Servlet servlet = Mockito.mock(Servlet.class);
- final ServletInfo info = new ServletInfo();
- info.name = "bar";
- final ServletHandler otherHandler = new ServletHandler(null, servlet, info, "/bar");
+ final ServletInfo info = new ServletInfo("bar", "/bar", 0, null, servlet, null);
+ final ServletHandler otherHandler = new ServletHandler(null, info);
Mockito.doAnswer(new Answer<Void>()
{
@@ -116,9 +112,8 @@
}
}).when(servlet).init(Mockito.any(ServletConfig.class));
- final ServletInfo info2 = new ServletInfo();
- info2.name = "foo";
- ServletHandler handler = new ServletHandler(null, servlet, info2, "/foo");
+ final ServletInfo info2 = new ServletInfo("foo", "/foo", 0, null, servlet, null);
+ ServletHandler handler = new ServletHandler(null, info2);
try
{
hr.addServlet(handler);
@@ -141,9 +136,8 @@
final HandlerRegistry hr = new HandlerRegistry();
Servlet otherServlet = Mockito.mock(Servlet.class);
- final ServletInfo info = new ServletInfo();
- info.name = "bar";
- final ServletHandler otherHandler = new ServletHandler(null, otherServlet, info, "/foo");
+ final ServletInfo info = new ServletInfo("bar", "/foo", 0, null, otherServlet, null);
+ final ServletHandler otherHandler = new ServletHandler(null, info);
Servlet servlet = Mockito.mock(Servlet.class);
Mockito.doAnswer(new Answer<Void>()
@@ -157,9 +151,8 @@
}
}).when(servlet).init(Mockito.any(ServletConfig.class));
- final ServletInfo info2 = new ServletInfo();
- info2.name = "foo";
- ServletHandler handler = new ServletHandler(null, servlet, info2, "/foo");
+ final ServletInfo info2 = new ServletInfo("foo", "/foo", 0, null, servlet, null);
+ ServletHandler handler = new ServletHandler(null, info2);
try
{
@@ -270,14 +263,12 @@
HandlerRegistry hr = new HandlerRegistry();
Servlet servlet = Mockito.mock(Servlet.class);
- final ServletInfo info = new ServletInfo();
- info.name = "f";
- ServletHandler servletHandler = new ServletHandler(null, servlet, info, "/f");
+ final ServletInfo info = new ServletInfo("f", "/f", 0, null, servlet, null);
+ ServletHandler servletHandler = new ServletHandler(null, info);
hr.addServlet(servletHandler);
Servlet servlet2 = Mockito.mock(Servlet.class);
- final ServletInfo info2 = new ServletInfo();
- info2.name = "ff";
- ServletHandler servletHandler2 = new ServletHandler(null, servlet2, info2, "/ff");
+ final ServletInfo info2 = new ServletInfo("ff", "/ff", 0, null, servlet2, null);
+ ServletHandler servletHandler2 = new ServletHandler(null, info2);
hr.addServlet(servletHandler2);
Filter filter = Mockito.mock(Filter.class);
final FilterInfo fi = new FilterInfo();
diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java
index 561496f..efabc00 100644
--- a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java
+++ b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java
@@ -230,7 +230,7 @@
private ServletHandler createHandler(String alias)
{
- final ServletInfo info = new ServletInfo();
- return new ServletHandler(this.context, this.servlet, info, alias);
+ final ServletInfo info = new ServletInfo(null, alias, 0, null, this.servlet, null);
+ return new ServletHandler(this.context, info);
}
}