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);
     }
 }