You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/01/31 16:21:10 UTC

svn commit: r1656203 - in /felix/trunk/http/base: ./ src/main/java/org/apache/felix/http/base/internal/ src/main/java/org/apache/felix/http/base/internal/runtime/ src/main/java/org/apache/felix/http/base/internal/service/ src/main/java/org/apache/felix...

Author: cziegeler
Date: Sat Jan 31 15:21:09 2015
New Revision: 1656203

URL: http://svn.apache.org/r1656203
Log:
[RFC189] Refactoring - keep old http service as is and move new whiteboard handling into a new component

Added:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java   (with props)
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java   (with props)
Modified:
    felix/trunk/http/base/pom.xml
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
    felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java

Modified: felix/trunk/http/base/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/pom.xml?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/pom.xml (original)
+++ felix/trunk/http/base/pom.xml Sat Jan 31 15:21:09 2015
@@ -78,7 +78,12 @@
             <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
             <version>3.0.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+            <version>3.0.0</version>
         </dependency>
     </dependencies>
-
 </project>

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/HttpServiceController.java Sat Jan 31 15:21:09 2015
@@ -30,8 +30,8 @@ import org.apache.felix.http.base.intern
 import org.apache.felix.http.base.internal.listener.ServletRequestAttributeListenerManager;
 import org.apache.felix.http.base.internal.listener.ServletRequestListenerManager;
 import org.apache.felix.http.base.internal.service.HttpServiceFactory;
-import org.apache.felix.http.base.internal.service.HttpServiceImpl;
 import org.apache.felix.http.base.internal.service.HttpServiceRuntimeImpl;
+import org.apache.felix.http.base.internal.service.InternalHttpService;
 import org.apache.felix.http.base.internal.whiteboard.ExtenderManager;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
@@ -144,7 +144,7 @@ public final class HttpServiceController
         HttpServiceFactory factory = new HttpServiceFactory(servletContext, this.registry, this.contextAttributeListener, this.sharedContextAttributes);
 
         this.serviceReg = this.bundleContext.registerService(ifaces, factory, this.serviceProps);
-        this.manager = new ExtenderManager((HttpServiceImpl)factory.getService(this.bundleContext.getBundle(), this.serviceReg), this.bundleContext);
+        this.manager = new ExtenderManager(new InternalHttpService(this.bundleContext, servletContext, this.registry), this.bundleContext);
 
         this.runtimeReg = this.bundleContext.registerService(HttpServiceRuntime.class, new HttpServiceRuntimeImpl(), null);
     }

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java Sat Jan 31 15:21:09 2015
@@ -24,7 +24,6 @@ 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 org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
 
@@ -72,10 +71,6 @@ public final class ServletInfo extends A
      */
     private final Map<String, String> initParams;
 
-    private final HttpContext context;
-
-    private final Servlet servlet;
-
     public ServletInfo(final ServiceReference<Servlet> ref)
     {
         super(ref);
@@ -84,8 +79,6 @@ public final class ServletInfo extends A
         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 = null;
     }
 
     @SuppressWarnings("unchecked")
@@ -97,8 +90,6 @@ public final class ServletInfo extends A
         this.errorPage = null;
         this.asyncSupported = false;
         this.initParams = null;
-        this.context = null;
-        this.servlet = servlet;
     }
 
     private static ServiceReference getRef(final ServiceReference ref)
@@ -112,9 +103,7 @@ public final class ServletInfo extends A
     public ServletInfo(final String name,
             final String pattern,
             final int serviceRanking,
-            final Map<String, String> initParams,
-            final Servlet servlet,
-            final HttpContext context)
+            final Map<String, String> initParams)
     {
         super(serviceRanking);
         this.name = name;
@@ -122,8 +111,6 @@ public final class ServletInfo extends A
         this.initParams = initParams;
         this.asyncSupported = false;
         this.errorPage = null;
-        this.servlet = servlet;
-        this.context = context;
     }
 
     @Override
@@ -156,14 +143,4 @@ public final class ServletInfo extends A
     {
         return initParams;
     }
-
-    public HttpContext getContext()
-    {
-        return this.context;
-    }
-
-    public Servlet getServlet()
-    {
-        return this.servlet;
-    }
 }

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceImpl.java Sat Jan 31 15:21:09 2015
@@ -35,15 +35,11 @@ import org.apache.felix.http.base.intern
 import org.apache.felix.http.base.internal.handler.HandlerRegistry;
 import org.apache.felix.http.base.internal.handler.ServletHandler;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
-import org.apache.felix.http.base.internal.runtime.ResourceInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.whiteboard.HttpContextBridge;
 import org.osgi.framework.Bundle;
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.http.NamespaceException;
-import org.osgi.service.http.context.ServletContextHelper;
 
 public final class HttpServiceImpl implements ExtHttpService
 {
@@ -62,32 +58,6 @@ public final class HttpServiceImpl imple
         this.contextManager = new ServletContextManager(this.bundle, context, servletAttributeListener, sharedContextAttributes);
     }
 
-    static Map<String, String> convertToMap(Dictionary dict)
-    {
-        Map<String, String> result = new HashMap<String, String>();
-        if (dict != null)
-        {
-            Enumeration keyEnum = dict.keys();
-            while (keyEnum.hasMoreElements())
-            {
-                String key = String.valueOf(keyEnum.nextElement());
-                Object value = dict.get(key);
-                result.put(key, value == null ? null : String.valueOf(value));
-            }
-        }
-        return result;
-    }
-
-    static <T> boolean isEmpty(T[] array)
-    {
-        return array == null || array.length < 1;
-    }
-
-    static boolean isEmpty(String str)
-    {
-        return str == null || "".equals(str.trim());
-    }
-
     @Override
     public HttpContext createDefaultHttpContext()
     {
@@ -95,38 +65,6 @@ public final class HttpServiceImpl imple
     }
 
     /**
-     * Register a filter
-     */
-    public void registerFilter(final ServletContextHelper context,
-            final ContextInfo contextInfo,
-            final FilterInfo filterInfo)
-    {
-        final ExtServletContext httpContext;
-        if ( context != null )
-        {
-            httpContext = getServletContext(new HttpContextBridge(context));
-        }
-        else
-        {
-            httpContext = getServletContext(filterInfo.getContext());
-        }
-        Filter filter = filterInfo.getFilter();
-        if ( filter == null )
-        {
-            filter = this.bundle.getBundleContext().getServiceObjects(filterInfo.getServiceReference()).getService();
-            // TODO create failure DTO if null
-        }
-
-        FilterHandler handler = new FilterHandler(contextInfo, httpContext, filter, filterInfo);
-        try {
-            this.handlerRegistry.addFilter(handler);
-        } catch (ServletException e) {
-            // TODO create failure DTO
-        }
-        this.localFilters.add(filter);
-    }
-
-    /**
      * @see org.apache.felix.http.api.ExtHttpService#registerFilter(javax.servlet.Filter, java.lang.String, java.util.Dictionary, int, org.osgi.service.http.HttpContext)
      */
     @Override
@@ -153,12 +91,21 @@ public final class HttpServiceImpl imple
             }
         }
 
-        final FilterInfo info = new FilterInfo(null, pattern, ranking, paramMap, filter, context);
-        if ( !info.isValid() )
+        final FilterInfo filterInfo = new FilterInfo(null, pattern, ranking, paramMap, filter, context);
+        if ( !filterInfo.isValid() )
         {
             throw new ServletException("Invalid registration information for filter.");
         }
-        this.registerFilter(null, null, info);
+
+        final ExtServletContext httpContext = getServletContext(context);
+
+        FilterHandler handler = new FilterHandler(null, httpContext, filter, filterInfo);
+        try {
+            this.handlerRegistry.addFilter(handler);
+        } catch (ServletException e) {
+            // TODO create failure DTO
+        }
+        this.localFilters.add(filter);
     }
 
     @Override
@@ -181,80 +128,6 @@ public final class HttpServiceImpl imple
     }
 
     /**
-     * Register a servlet with a {@link ServletContextHelper}.
-     * The prefix is the path where the servlet context helper is mounted.
-     */
-    public void registerServlet(final ServletContextHelper context,
-    		final ContextInfo contextInfo,
-    		final ServletInfo servletInfo)
-    {
-        if (servletInfo == null)
-        {
-            throw new IllegalArgumentException("ServletInfo cannot be null!");
-        }
-        if (isEmpty(servletInfo.getPatterns()) && isEmpty(servletInfo.getErrorPage()))
-        {
-            throw new IllegalArgumentException("ServletInfo must at least have one pattern or error page!");
-        }
-
-        final ExtServletContext httpContext;
-        if ( context != null )
-        {
-        	httpContext = getServletContext(new HttpContextBridge(context));
-        }
-        else
-        {
-        	httpContext = getServletContext(servletInfo.getContext());
-        }
-        Servlet servlet = servletInfo.getServlet();
-        if ( servlet == null )
-        {
-            servlet = this.bundle.getBundleContext().getServiceObjects(servletInfo.getServiceReference()).getService();
-            // TODO create failure DTO if null
-        }
-
-        final ServletHandler handler = new ServletHandler(contextInfo,
-                httpContext,
-                servletInfo,
-                servlet);
-        try {
-            this.handlerRegistry.addServlet(contextInfo, handler);
-        } catch (ServletException e) {
-            // TODO create failure DTO
-        } catch (NamespaceException e) {
-            // TODO create failure DTO
-        }
-
-        this.localServlets.add(servlet);
-    }
-
-    public void unregisterServlet(final ContextInfo contextInfo, final ServletInfo servletInfo)
-    {
-        if (servletInfo == null)
-        {
-            throw new IllegalArgumentException("ServletInfo cannot be null!");
-        }
-        final Servlet servlet = this.handlerRegistry.removeServlet(contextInfo, servletInfo, true);
-        if ( servlet != null )
-        {
-            this.localServlets.remove(servlet);
-        }
-    }
-
-    public void unregisterFilter(final ContextInfo contextInfo, final FilterInfo filterInfo)
-    {
-        if (filterInfo == null)
-        {
-            throw new IllegalArgumentException("FilterInfo cannot be null!");
-        }
-        final Filter instance = this.handlerRegistry.removeFilter(filterInfo, true);
-        if ( instance != null )
-        {
-            this.localFilters.remove(instance);
-        }
-    }
-
-    /**
      * @see org.osgi.service.http.HttpService#registerServlet(java.lang.String, javax.servlet.Servlet, java.util.Dictionary, org.osgi.service.http.HttpContext)
      */
     @Override
@@ -286,11 +159,28 @@ public final class HttpServiceImpl imple
             }
         }
 
-        final ServletInfo info = new ServletInfo(null, alias, 0, paramMap, servlet, context);
+        final ServletInfo servletInfo = new ServletInfo(null, alias, 0, paramMap);
 
-        this.registerServlet(null, null, info);
+        final ExtServletContext httpContext = getServletContext(context);
+
+        final ServletHandler handler = new ServletHandler(null,
+                httpContext,
+                servletInfo,
+                servlet);
+        try {
+            this.handlerRegistry.addServlet(null, handler);
+        } catch (ServletException e) {
+            // TODO create failure DTO
+        } catch (NamespaceException e) {
+            // TODO create failure DTO
+        }
+
+        this.localServlets.add(servlet);
     }
 
+    /**
+     * @see org.osgi.service.http.HttpService#unregister(java.lang.String)
+     */
     @Override
     public void unregister(String alias)
     {
@@ -310,32 +200,6 @@ public final class HttpServiceImpl imple
         unregisterServlet(servlet);
     }
 
-    /**
-     * Register a resource with a {@link ServletContextHelper}.
-     */
-    public void registerResource(final ServletContextHelper context,
-            final ContextInfo contextInfo,
-            final ResourceInfo resourceInfo)
-    {
-        if (resourceInfo == null)
-        {
-            throw new IllegalArgumentException("ResourceInfo cannot be null!");
-        }
-        final ServletInfo servletInfo = new ServletInfo(resourceInfo, new ResourceServlet(resourceInfo.getPrefix()));
-
-        this.registerServlet(context, contextInfo, servletInfo);
-    }
-
-    public void unregisterResource(final ContextInfo contextInfo, final ResourceInfo resourceInfo)
-    {
-        if (resourceInfo == null)
-        {
-            throw new IllegalArgumentException("ResourceInfo cannot be null!");
-        }
-        final ServletInfo servletInfo = new ServletInfo(resourceInfo, null);
-        this.unregisterServlet(contextInfo, servletInfo);
-    }
-
     public void unregisterAll()
     {
         HashSet<Servlet> servlets = new HashSet<Servlet>(this.localServlets);

Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java?rev=1656203&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java Sat Jan 31 15:21:09 2015
@@ -0,0 +1,211 @@
+/*
+ * 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.
+ */
+package org.apache.felix.http.base.internal.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+import org.apache.felix.http.base.internal.context.ExtServletContext;
+import org.apache.felix.http.base.internal.handler.FilterHandler;
+import org.apache.felix.http.base.internal.handler.HandlerRegistry;
+import org.apache.felix.http.base.internal.handler.ServletHandler;
+import org.apache.felix.http.base.internal.runtime.AbstractInfo;
+import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import org.apache.felix.http.base.internal.runtime.FilterInfo;
+import org.apache.felix.http.base.internal.runtime.ResourceInfo;
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.http.NamespaceException;
+import org.osgi.service.http.context.ServletContextHelper;
+
+public final class InternalHttpService
+{
+
+    private final HandlerRegistry handlerRegistry;
+
+    private final BundleContext bundleContext;
+
+    private final ServletContext webContext;
+
+    private static final class ContextHolder
+    {
+        public long counter;
+        public ExtServletContext servletContext;
+        public ServletContextHelper servletContextHelper;
+    }
+
+    private final Map<Long, ContextHolder> contextMap = new HashMap<Long, ContextHolder>();
+
+    public InternalHttpService(final BundleContext bundleContext,
+            final ServletContext context,
+            final HandlerRegistry handlerRegistry)
+    {
+        this.handlerRegistry = handlerRegistry;
+        this.bundleContext = bundleContext;
+        this.webContext = context;
+    }
+
+    private ExtServletContext getServletContext(@Nonnull final ContextInfo contextInfo,
+            @Nonnull final AbstractInfo<?> serviceInfo)
+    {
+        final Long key = contextInfo.getServiceId();
+        synchronized ( this.contextMap )
+        {
+            ContextHolder holder = this.contextMap.get(key);
+            if ( holder == null )
+            {
+                holder = new ContextHolder();
+                // TODO check for null
+                holder.servletContextHelper = serviceInfo.getServiceReference().getBundle().getBundleContext()
+                        .getServiceObjects(contextInfo.getServiceReference()).getService();
+                holder.servletContext = new ServletContextImpl(serviceInfo.getServiceReference().getBundle(),
+                        this.webContext,
+                        holder.servletContextHelper);
+            }
+            holder.counter++;
+
+            return holder.servletContext;
+        }
+    }
+
+    private void ungetServletContext(@Nonnull final ContextInfo contextInfo)
+    {
+        final Long key = contextInfo.getServiceId();
+        synchronized ( this.contextMap )
+        {
+            ContextHolder holder = this.contextMap.get(key);
+            if ( holder != null )
+            {
+                holder.counter--;
+                if ( holder.counter <= 0 )
+                {
+                    this.contextMap.remove(key);
+                }
+            }
+        }
+    }
+
+    /**
+     * Register a servlet.
+     * @param contextInfo The servlet context helper info
+     * @param servletInfo The servlet info
+     */
+    public void registerServlet(@Nonnull final ContextInfo contextInfo,
+            @Nonnull final ServletInfo servletInfo)
+    {
+        final Servlet servlet = this.bundleContext.getServiceObjects(servletInfo.getServiceReference()).getService();
+        // TODO create failure DTO if null
+        if ( servlet != null )
+        {
+            final ServletHandler handler = new ServletHandler(contextInfo,
+                    getServletContext(contextInfo, servletInfo),
+                    servletInfo,
+                    servlet);
+            try {
+                this.handlerRegistry.addServlet(contextInfo, handler);
+            } catch (ServletException e) {
+                // TODO create failure DTO
+            } catch (NamespaceException e) {
+                // TODO create failure DTO
+            }
+        }
+    }
+
+    /**
+     * Unregister a servlet
+     * @param contextInfo The servlet context helper info
+     * @param servletInfo The servlet info
+     */
+    public void unregisterServlet(@Nonnull final ContextInfo contextInfo, @Nonnull final ServletInfo servletInfo)
+    {
+        final Servlet instance = this.handlerRegistry.removeServlet(contextInfo, servletInfo, true);
+        if ( instance != null )
+        {
+            this.bundleContext.getServiceObjects(servletInfo.getServiceReference()).ungetService(instance);
+            this.ungetServletContext(contextInfo);
+        }
+    }
+
+    /**
+     * Register a filter
+     * @param contextInfo The servlet context helper info
+     * @param filterInfo The filter info
+     */
+    public void registerFilter(@Nonnull  final ContextInfo contextInfo,
+            @Nonnull final FilterInfo filterInfo)
+    {
+        final Filter filter = this.bundleContext.getServiceObjects(filterInfo.getServiceReference()).getService();
+        // TODO create failure DTO if null
+        if ( filter != null )
+        {
+            final FilterHandler handler = new FilterHandler(contextInfo,
+                    getServletContext(contextInfo, filterInfo),
+                    filter,
+                    filterInfo);
+            try {
+                this.handlerRegistry.addFilter(handler);
+            } catch (final ServletException e) {
+                // TODO create failure DTO
+            }
+        }
+    }
+
+    /**
+     * Unregister a filter
+     * @param contextInfo The servlet context helper info
+     * @param filterInfo The filter info
+     */
+    public void unregisterFilter(@Nonnull final ContextInfo contextInfo, @Nonnull final FilterInfo filterInfo)
+    {
+        final Filter instance = this.handlerRegistry.removeFilter(filterInfo, true);
+        if ( instance != null )
+        {
+            this.bundleContext.getServiceObjects(filterInfo.getServiceReference()).ungetService(instance);
+            this.ungetServletContext(contextInfo);
+        }
+    }
+
+    /**
+     * Register a resource.
+     * @param contextInfo The servlet context helper info
+     * @param resourceInfo The resource info
+     */
+    public void registerResource(@Nonnull final ContextInfo contextInfo,
+            @Nonnull final ResourceInfo resourceInfo)
+    {
+        final ServletInfo servletInfo = new ServletInfo(resourceInfo, new ResourceServlet(resourceInfo.getPrefix()));
+
+        this.registerServlet(contextInfo, servletInfo);
+    }
+
+    /**
+     * Unregister a resource.
+     * @param contextInfo The servlet context helper info
+     * @param resourceInfo The resource info
+     */
+    public void unregisterResource(@Nonnull final ContextInfo contextInfo, @Nonnull final ResourceInfo resourceInfo)
+    {
+        final ServletInfo servletInfo = new ServletInfo(resourceInfo, null);
+        this.unregisterServlet(contextInfo, servletInfo);
+    }
+}

Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/InternalHttpService.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java?rev=1656203&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java Sat Jan 31 15:21:09 2015
@@ -0,0 +1,477 @@
+/*
+ * 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.
+ */
+package org.apache.felix.http.base.internal.service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterRegistration;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+import javax.servlet.SessionCookieConfig;
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspConfigDescriptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.http.base.internal.context.ExtServletContext;
+import org.apache.felix.http.base.internal.logger.SystemLogger;
+import org.apache.felix.http.base.internal.util.MimeTypes;
+import org.osgi.framework.Bundle;
+import org.osgi.service.http.context.ServletContextHelper;
+
+public class ServletContextImpl implements ExtServletContext {
+
+    private final ServletContextHelper delegatee;
+
+    private final Bundle bundle;
+    private final ServletContext context;
+    private final Map<String, Object> attributes;
+
+    public ServletContextImpl(final Bundle bundle,
+            final ServletContext context,
+            final ServletContextHelper delegatee)
+    {
+        this.bundle = bundle;
+        this.context = context;
+        this.delegatee = delegatee;
+        this.attributes = new ConcurrentHashMap<String, Object>();
+    }
+
+    @Override
+    public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException
+    {
+        return delegatee.handleSecurity(request, response);
+    }
+
+    @Override
+    public URL getResource(String path)
+    {
+        return delegatee.getResource(normalizeResourcePath(path));
+    }
+
+    @Override
+    public String getMimeType(String file)
+    {
+        String type = delegatee.getMimeType(file);
+        if (type != null)
+        {
+            return type;
+        }
+
+        return MimeTypes.get().getByFile(file);
+    }
+
+    public ServletContextHelper getDelegatee()
+    {
+        return delegatee;
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> type)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public FilterRegistration.Dynamic addFilter(String filterName, String className)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void addListener(Class<? extends EventListener> type)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void addListener(String className)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T extends EventListener> void addListener(T listener)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ServletRegistration.Dynamic addServlet(String servletName, Class<? extends Servlet> type)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ServletRegistration.Dynamic addServlet(String servletName, String className)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T extends Filter> T createFilter(Class<T> type) throws ServletException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T extends EventListener> T createListener(Class<T> type) throws ServletException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T extends Servlet> T createServlet(Class<T> type) throws ServletException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void declareRoles(String... roleNames)
+    {
+        this.context.declareRoles(roleNames);
+    }
+
+    @Override
+    public String getVirtualServerName() {
+        return context.getVirtualServerName();
+    }
+
+    @Override
+    public Object getAttribute(String name)
+    {
+        return (this.attributes != null) ? this.attributes.get(name) : this.context.getAttribute(name);
+    }
+
+    @Override
+    public Enumeration getAttributeNames()
+    {
+        return (this.attributes != null) ? Collections.enumeration(this.attributes.keySet()) : this.context.getAttributeNames();
+    }
+
+    @Override
+    public ClassLoader getClassLoader()
+    {
+        return bundle.getClass().getClassLoader();
+    }
+
+    @Override
+    public ServletContext getContext(String uri)
+    {
+        return this.context.getContext(uri);
+    }
+
+    @Override
+    public String getContextPath()
+    {
+        return this.context.getContextPath();
+    }
+
+    @Override
+    public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
+    {
+        return this.context.getDefaultSessionTrackingModes();
+    }
+
+    @Override
+    public int getEffectiveMajorVersion()
+    {
+        return this.context.getEffectiveMajorVersion();
+    }
+
+    @Override
+    public int getEffectiveMinorVersion()
+    {
+        return this.context.getEffectiveMinorVersion();
+    }
+
+    @Override
+    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
+    {
+        return this.context.getEffectiveSessionTrackingModes();
+    }
+
+    @Override
+    public FilterRegistration getFilterRegistration(String filterName)
+    {
+        return this.context.getFilterRegistration(filterName);
+    }
+
+    @Override
+    public Map<String, ? extends FilterRegistration> getFilterRegistrations()
+    {
+        return this.context.getFilterRegistrations();
+    }
+
+    @Override
+    public String getInitParameter(String name)
+    {
+        return this.context.getInitParameter(name);
+    }
+
+    @Override
+    public Enumeration getInitParameterNames()
+    {
+        return this.context.getInitParameterNames();
+    }
+
+    @Override
+    public JspConfigDescriptor getJspConfigDescriptor()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int getMajorVersion()
+    {
+        return this.context.getMajorVersion();
+    }
+
+    @Override
+    public int getMinorVersion()
+    {
+        return this.context.getMinorVersion();
+    }
+
+    @Override
+    public RequestDispatcher getNamedDispatcher(String name)
+    {
+        return this.context.getNamedDispatcher(name);
+    }
+
+    @Override
+    public String getRealPath(String name)
+    {
+        URL url = getResource(name);
+        if (url == null)
+        {
+            return null;
+        }
+        return url.toExternalForm();
+    }
+
+    @Override
+    public RequestDispatcher getRequestDispatcher(String uri)
+    {
+        return this.context.getRequestDispatcher(uri);
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String path)
+    {
+        URL res = getResource(path);
+        if (res != null)
+        {
+            try
+            {
+                return res.openStream();
+            }
+            catch (IOException e)
+            {
+                // Do nothing
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Set getResourcePaths(String path)
+    {
+        // TODO
+        return null;
+    }
+
+    @Override
+    public String getServerInfo()
+    {
+        return this.context.getServerInfo();
+    }
+
+    @Override
+    public Servlet getServlet(String name) throws ServletException
+    {
+        return this.context.getServlet(name);
+    }
+
+    @Override
+    public String getServletContextName()
+    {
+        return this.context.getServletContextName();
+    }
+
+    @Override
+    public Enumeration getServletNames()
+    {
+        return this.context.getServletNames();
+    }
+
+    @Override
+    public ServletRegistration getServletRegistration(String servletName)
+    {
+        return this.context.getServletRegistration(servletName);
+    }
+
+    @Override
+    public Map<String, ? extends ServletRegistration> getServletRegistrations()
+    {
+        return this.context.getServletRegistrations();
+    }
+
+    @Override
+    public Enumeration getServlets()
+    {
+        return this.context.getServlets();
+    }
+
+    @Override
+    public SessionCookieConfig getSessionCookieConfig()
+    {
+        return this.context.getSessionCookieConfig();
+    }
+
+    @Override
+    public void log(Exception cause, String message)
+    {
+        SystemLogger.error(message, cause);
+    }
+
+    @Override
+    public void log(String message)
+    {
+        SystemLogger.info(message);
+    }
+
+    @Override
+    public void log(String message, Throwable cause)
+    {
+        SystemLogger.error(message, cause);
+    }
+
+    @Override
+    public void removeAttribute(String name)
+    {
+        Object oldValue;
+        if (this.attributes != null)
+        {
+            oldValue = this.attributes.remove(name);
+        }
+        else
+        {
+            oldValue = this.context.getAttribute(name);
+            this.context.removeAttribute(name);
+        }
+
+        if (oldValue != null)
+        {
+            //this.attributeListener.attributeRemoved(new ServletContextAttributeEvent(this, name, oldValue));
+        }
+    }
+
+    @Override
+    public void setAttribute(String name, Object value)
+    {
+        if (value == null)
+        {
+            this.removeAttribute(name);
+        }
+        else if (name != null)
+        {
+            Object oldValue;
+            if (this.attributes != null)
+            {
+                oldValue = this.attributes.put(name, value);
+            }
+            else
+            {
+                oldValue = this.context.getAttribute(name);
+                this.context.setAttribute(name, value);
+            }
+
+            if (oldValue == null)
+            {
+                //this.attributeListener.attributeAdded(new ServletContextAttributeEvent(this, name, value));
+            }
+            else
+            {
+                //this.attributeListener.attributeReplaced(new ServletContextAttributeEvent(this, name, oldValue));
+            }
+        }
+    }
+
+    @Override
+    public boolean setInitParameter(String name, String value)
+    {
+        return this.context.setInitParameter(name, value);
+    }
+
+    @Override
+    public void setSessionTrackingModes(Set<SessionTrackingMode> modes)
+    {
+        this.context.setSessionTrackingModes(modes);
+    }
+
+    private String normalizePath(String path)
+    {
+        if (path == null)
+        {
+            return null;
+        }
+
+        String normalizedPath = normalizeResourcePath(path);
+        if (normalizedPath.startsWith("/") && (normalizedPath.length() > 1))
+        {
+            normalizedPath = normalizedPath.substring(1);
+        }
+
+        return normalizedPath;
+    }
+
+    private String normalizeResourcePath(String path)
+    {
+        if ( path == null)
+        {
+            return null;
+        }
+        String normalizedPath = path.trim().replaceAll("/+", "/");
+
+        return normalizedPath;
+    }
+}

Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/service/ServletContextImpl.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ExtenderManager.java Sat Jan 31 15:21:09 2015
@@ -18,7 +18,7 @@ package org.apache.felix.http.base.inter
 
 import java.util.ArrayList;
 
-import org.apache.felix.http.base.internal.service.HttpServiceImpl;
+import org.apache.felix.http.base.internal.service.InternalHttpService;
 import org.apache.felix.http.base.internal.whiteboard.tracker.FilterTracker;
 import org.apache.felix.http.base.internal.whiteboard.tracker.ResourceTracker;
 import org.apache.felix.http.base.internal.whiteboard.tracker.ServletContextHelperTracker;
@@ -35,7 +35,7 @@ public final class ExtenderManager
 
     private final ArrayList<ServiceTracker<?, ?>> trackers = new ArrayList<ServiceTracker<?, ?>>();
 
-    public ExtenderManager(final HttpServiceImpl httpService, final BundleContext bundleContext)
+    public ExtenderManager(final InternalHttpService httpService, final BundleContext bundleContext)
     {
         this.contextManager = new ServletContextHelperManager(bundleContext, httpService);
         addTracker(new FilterTracker(bundleContext, contextManager));

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java Sat Jan 31 15:21:09 2015
@@ -30,9 +30,10 @@ import org.apache.felix.http.base.intern
 import org.apache.felix.http.base.internal.runtime.FilterInfo;
 import org.apache.felix.http.base.internal.runtime.ResourceInfo;
 import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.apache.felix.http.base.internal.service.HttpServiceImpl;
+import org.apache.felix.http.base.internal.service.InternalHttpService;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.http.context.ServletContextHelper;
@@ -41,12 +42,12 @@ import org.osgi.service.http.whiteboard.
 public final class ServletContextHelperManager
 {
     /** A map containing all servlet context registrations. Mapped by context name */
-    private final Map<String, List<ContextHolder>> contextMap = new HashMap<String, List<ContextHolder>>();
+    private final Map<String, List<ContextInfo>> contextMap = new HashMap<String, List<ContextInfo>>();
 
     /** A map with all servlet/filter registrations, mapped by abstract info. */
-    private final Map<AbstractInfo<?>, List<ContextHolder>> servicesMap = new HashMap<AbstractInfo<?>, List<ContextHolder>>();
+    private final Map<AbstractInfo<?>, List<ContextInfo>> servicesMap = new HashMap<AbstractInfo<?>, List<ContextInfo>>();
 
-    private final HttpServiceImpl httpService;
+    private final InternalHttpService httpService;
 
     private final ServiceRegistration<ServletContextHelper> defaultContextRegistration;
 
@@ -54,13 +55,14 @@ public final class ServletContextHelperM
      * Create a new servlet context helper manager
      * and the default context
      */
-    public ServletContextHelperManager(final BundleContext bundleContext, final HttpServiceImpl httpService)
+    public ServletContextHelperManager(final BundleContext bundleContext, final InternalHttpService httpService)
     {
         this.httpService = httpService;
 
         final Dictionary<String, Object> props = new Hashtable<String, Object>();
         props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, HttpWhiteboardConstants.HTTP_WHITEBOARD_DEFAULT_CONTEXT_NAME);
         props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/");
+        props.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
 
         this.defaultContextRegistration = bundleContext.registerService(ServletContextHelper.class,
                 new ServiceFactory<ServletContextHelper>() {
@@ -91,11 +93,11 @@ public final class ServletContextHelperM
         this.defaultContextRegistration.unregister();
     }
 
-    private void activate(final ContextHolder holder)
+    private void activate(final ContextInfo holder)
     {
-        for(final Map.Entry<AbstractInfo<?>, List<ContextHolder>> entry : this.servicesMap.entrySet())
+        for(final Map.Entry<AbstractInfo<?>, List<ContextInfo>> entry : this.servicesMap.entrySet())
         {
-            if ( entry.getKey().getContextSelectionFilter().match(holder.getInfo().getServiceReference()) )
+            if ( entry.getKey().getContextSelectionFilter().match(holder.getServiceReference()) )
             {
                 entry.getValue().add(holder);
                 if ( entry.getKey() instanceof ServletInfo )
@@ -114,12 +116,12 @@ public final class ServletContextHelperM
         }
     }
 
-    private void deactivate(final ContextHolder holder)
+    private void deactivate(final ContextInfo holder)
     {
-        final Iterator<Map.Entry<AbstractInfo<?>, List<ContextHolder>>> i = this.servicesMap.entrySet().iterator();
+        final Iterator<Map.Entry<AbstractInfo<?>, List<ContextInfo>>> i = this.servicesMap.entrySet().iterator();
         while ( i.hasNext() )
         {
-            final Map.Entry<AbstractInfo<?>, List<ContextHolder>> entry = i.next();
+            final Map.Entry<AbstractInfo<?>, List<ContextInfo>> entry = i.next();
             if ( entry.getValue().remove(holder) )
             {
                 if ( entry.getKey() instanceof ServletInfo )
@@ -146,26 +148,25 @@ public final class ServletContextHelperM
      */
     public void addContextHelper(final ContextInfo info)
     {
-        final ContextHolder holder = new ContextHolder(info);
         synchronized ( this.contextMap )
         {
-            List<ContextHolder> holderList = this.contextMap.get(info.getName());
+            List<ContextInfo> holderList = this.contextMap.get(info.getName());
             if ( holderList == null )
             {
-                holderList = new ArrayList<ContextHolder>();
+                holderList = new ArrayList<ContextInfo>();
                 this.contextMap.put(info.getName(), holderList);
             }
-            holderList.add(holder);
+            holderList.add(info);
             Collections.sort(holderList);
             // check for activate/deactivate
-            if ( holderList.get(0) == holder )
+            if ( holderList.get(0) == info )
             {
                 // check for deactivate
                 if ( holderList.size() > 1 )
                 {
                     this.deactivate(holderList.get(1));
                 }
-                this.activate(holder);
+                this.activate(info);
             }
         }
     }
@@ -177,16 +178,16 @@ public final class ServletContextHelperM
     {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.contextMap.get(info.getName());
+            final List<ContextInfo> holderList = this.contextMap.get(info.getName());
             if ( holderList != null )
             {
-                final Iterator<ContextHolder> i = holderList.iterator();
+                final Iterator<ContextInfo> i = holderList.iterator();
                 boolean first = true;
                 boolean activateNext = false;
                 while ( i.hasNext() )
                 {
-                    final ContextHolder holder = i.next();
-                    if ( holder.getInfo().compareTo(info) == 0 )
+                    final ContextInfo holder = i.next();
+                    if ( holder.compareTo(info) == 0 )
                     {
                         i.remove();
                         // check for deactivate
@@ -211,12 +212,12 @@ public final class ServletContextHelperM
         }
     }
 
-    private List<ContextHolder> getMatchingContexts(final AbstractInfo<?> info)
+    private List<ContextInfo> getMatchingContexts(final AbstractInfo<?> info)
     {
-        final List<ContextHolder> result = new ArrayList<ContextHolder>();
-        for(final List<ContextHolder> holders : this.contextMap.values()) {
-            final ContextHolder h = holders.get(0);
-            if ( info.getContextSelectionFilter().match(h.getInfo().getServiceReference()) )
+        final List<ContextInfo> result = new ArrayList<ContextInfo>();
+        for(final List<ContextInfo> holders : this.contextMap.values()) {
+            final ContextInfo h = holders.get(0);
+            if ( info.getContextSelectionFilter().match(h.getServiceReference()) )
             {
                 result.add(h);
             }
@@ -224,37 +225,34 @@ public final class ServletContextHelperM
         return result;
     }
 
-    private void registerServlet(final ServletInfo servletInfo, final ContextHolder holder)
+    private void registerServlet(final ServletInfo servletInfo, final ContextInfo holder)
     {
-    	final ServletContextHelper helper = holder.getContext(servletInfo.getServiceReference().getBundle());
-        this.httpService.registerServlet(helper, holder.getInfo(), servletInfo);
+        this.httpService.registerServlet(holder, servletInfo);
     }
 
-    private void unregisterServlet(final ServletInfo servletInfo, final ContextHolder holder)
+    private void unregisterServlet(final ServletInfo servletInfo, final ContextInfo holder)
     {
-        this.httpService.unregisterServlet(holder.getInfo(), servletInfo);
+        this.httpService.unregisterServlet(holder, servletInfo);
     }
 
-    private void registerFilter(final FilterInfo filterInfo, final ContextHolder holder)
+    private void registerFilter(final FilterInfo filterInfo, final ContextInfo holder)
     {
-        final ServletContextHelper helper = holder.getContext(filterInfo.getServiceReference().getBundle());
-        this.httpService.registerFilter(helper, holder.getInfo(), filterInfo);
+        this.httpService.registerFilter(holder, filterInfo);
     }
 
-    private void unregisterFilter(final FilterInfo filterInfo, final ContextHolder holder)
+    private void unregisterFilter(final FilterInfo filterInfo, final ContextInfo holder)
     {
-        this.httpService.unregisterFilter(holder.getInfo(), filterInfo);
+        this.httpService.unregisterFilter(holder, filterInfo);
     }
 
-    private void registerResource(final ResourceInfo resourceInfo, final ContextHolder holder)
+    private void registerResource(final ResourceInfo resourceInfo, final ContextInfo holder)
     {
-        final ServletContextHelper helper = holder.getContext(resourceInfo.getServiceReference().getBundle());
-        this.httpService.registerResource(helper, holder.getInfo(), resourceInfo);
+        this.httpService.registerResource(holder, resourceInfo);
     }
 
-    private void unregisterResource(final ResourceInfo resourceInfo, final ContextHolder holder)
+    private void unregisterResource(final ResourceInfo resourceInfo, final ContextInfo holder)
     {
-        this.httpService.unregisterResource(holder.getInfo(), resourceInfo);
+        this.httpService.unregisterResource(holder, resourceInfo);
     }
 
     /**
@@ -265,9 +263,9 @@ public final class ServletContextHelperM
     {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.getMatchingContexts(servletInfo);
+            final List<ContextInfo> holderList = this.getMatchingContexts(servletInfo);
             this.servicesMap.put(servletInfo, holderList);
-            for(final ContextHolder h : holderList)
+            for(final ContextInfo h : holderList)
             {
             	this.registerServlet(servletInfo, h);
             }
@@ -282,10 +280,10 @@ public final class ServletContextHelperM
     {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.servicesMap.remove(servletInfo);
+            final List<ContextInfo> holderList = this.servicesMap.remove(servletInfo);
             if ( holderList != null )
             {
-                for(final ContextHolder h : holderList)
+                for(final ContextInfo h : holderList)
                 {
                     this.unregisterServlet(servletInfo, h);
                 }
@@ -293,42 +291,12 @@ public final class ServletContextHelperM
         }
     }
 
-    /**
-     * Hold information about a context.
-     */
-    private final static class ContextHolder implements Comparable<ContextHolder>
-    {
-        private final ContextInfo info;
-
-        public ContextHolder(final ContextInfo info)
-        {
-            this.info = info;
-        }
-
-        public ContextInfo getInfo()
-        {
-            return this.info;
-        }
-
-        @Override
-        public int compareTo(final ContextHolder o)
-        {
-            return this.info.compareTo(o.info);
-        }
-
-        public ServletContextHelper getContext(final Bundle b)
-        {
-        	// TODO - we should somehow keep track of these objects to later on dispose them
-        	return b.getBundleContext().getServiceObjects(this.info.getServiceReference()).getService();
-        }
-    }
-
     public void addFilter(final FilterInfo info) {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.getMatchingContexts(info);
+            final List<ContextInfo> holderList = this.getMatchingContexts(info);
             this.servicesMap.put(info, holderList);
-            for(final ContextHolder h : holderList)
+            for(final ContextInfo h : holderList)
             {
                 this.registerFilter(info, h);
             }
@@ -338,10 +306,10 @@ public final class ServletContextHelperM
     public void removeFilter(final FilterInfo info) {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.servicesMap.remove(info);
+            final List<ContextInfo> holderList = this.servicesMap.remove(info);
             if ( holderList != null )
             {
-                for(final ContextHolder h : holderList)
+                for(final ContextInfo h : holderList)
                 {
                     this.unregisterFilter(info, h);
                 }
@@ -352,9 +320,9 @@ public final class ServletContextHelperM
     public void addResource(final ResourceInfo info) {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.getMatchingContexts(info);
+            final List<ContextInfo> holderList = this.getMatchingContexts(info);
             this.servicesMap.put(info, holderList);
-            for(final ContextHolder h : holderList)
+            for(final ContextInfo h : holderList)
             {
                 this.registerResource(info, h);
             }
@@ -364,10 +332,10 @@ public final class ServletContextHelperM
     public void removeResource(final ResourceInfo info) {
         synchronized ( this.contextMap )
         {
-            final List<ContextHolder> holderList = this.servicesMap.remove(info);
+            final List<ContextInfo> holderList = this.servicesMap.remove(info);
             if ( holderList != null )
             {
-                for(final ContextHolder h : holderList)
+                for(final ContextInfo h : holderList)
                 {
                     this.unregisterResource(info, h);
                 }

Modified: felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java?rev=1656203&r1=1656202&r2=1656203&view=diff
==============================================================================
--- felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java (original)
+++ felix/trunk/http/base/src/test/java/org/apache/felix/http/base/internal/handler/ServletHandlerTest.java Sat Jan 31 15:21:09 2015
@@ -219,7 +219,7 @@ public class ServletHandlerTest extends
 
     private ServletHandler createHandler(String alias, Map<String, String> map)
     {
-        final ServletInfo info = new ServletInfo(null, alias, 0, map, this.servlet, null);
-        return new ServletHandler(null, this.context, info, info.getServlet());
+        final ServletInfo info = new ServletInfo(null, alias, 0, map);
+        return new ServletHandler(null, this.context, info, this.servlet);
     }
 }