FELIX-4060 : Implement HTTP Service Update (RFC-189)

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1656479 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
index a2f4138..a08b1ba 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/PerContextHandlerRegistry.java
@@ -49,8 +49,8 @@
     private final String prefixPath;
 
     public PerContextHandlerRegistry() {
-        this.serviceId = -1;
-        this.ranking = Integer.MIN_VALUE;
+        this.serviceId = 0;
+        this.ranking = Integer.MAX_VALUE;
         this.prefixPath = "/";
     }
 
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/FilterInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/FilterInfo.java
index 9545d4c..f8c7edf 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/FilterInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/FilterInfo.java
@@ -143,31 +143,38 @@
         return super.isValid() && (!isEmpty(this.patterns) || !isEmpty(this.regexs) || !isEmpty(this.servletNames));
     }
 
-    public String getName() {
+    public String getName()
+    {
         return name;
     }
 
-    public String[] getPatterns() {
+    public String[] getPatterns()
+    {
         return patterns;
     }
 
-    public String[] getServletNames() {
+    public String[] getServletNames()
+    {
         return servletNames;
     }
 
-    public String[] getRegexs() {
+    public String[] getRegexs()
+    {
         return regexs;
     }
 
-    public boolean isAsyncSupported() {
+    public boolean isAsyncSupported()
+    {
         return asyncSupported;
     }
 
-    public DispatcherType[] getDispatcher() {
+    public DispatcherType[] getDispatcher()
+    {
         return dispatcher;
     }
 
-    public Map<String, String> getInitParams() {
+    public Map<String, String> getInitParams()
+    {
         return initParams;
     }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
index a6929e8..38a064c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
@@ -18,6 +18,8 @@
  */
 package org.apache.felix.http.base.internal.runtime;
 
+import java.util.Map;
+
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.http.context.ServletContextHelper;
 import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
@@ -25,7 +27,13 @@
 /**
  * Provides registration information for a {@link ServletContextHelper}
  */
-public final class ServletContextHelperInfo extends AbstractInfo<ServletContextHelper> {
+public final class ServletContextHelperInfo extends AbstractInfo<ServletContextHelper>
+{
+
+    /**
+     * Properties starting with this prefix are passed as context init parameters.
+     */
+    private static final String CONTEXT_INIT_PREFIX = "context.init.";
 
     private final String name;
 
@@ -33,6 +41,11 @@
 
     private final String prefix;
 
+    /**
+     * The filter initialization parameters as provided during registration of the filter.
+     */
+    private final Map<String, String> initParams;
+
     public ServletContextHelperInfo(final ServiceReference<ServletContextHelper> ref) {
         super(ref);
         this.name = this.getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME);
@@ -46,6 +59,7 @@
             }
         }
         this.prefix = prefix;
+        this.initParams = getInitParams(ref, CONTEXT_INIT_PREFIX);
     }
 
     private boolean isValidPath()
@@ -91,4 +105,9 @@
         }
         return this.prefix.concat(path);
     }
+
+    public Map<String, String> getInitParams()
+    {
+        return initParams;
+    }
 }
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
index de67424..2090bcc 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ContextHandler.java
@@ -69,6 +69,7 @@
         this.sharedContext = new SharedServletContextImpl(webContext,
                 info.getPrefix(),
                 info.getName(),
+                info.getInitParams(),
                 new ServletContextAttributeListener() {
 
                     @Override
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
index e052ae2..c7cf81b 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/SharedServletContextImpl.java
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.EventListener;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -55,10 +56,12 @@
     private final String contextPath;
     private final String name;
     private final ServletContextAttributeListener attributeListener;
+    private final Map<String, String> initParameters = new HashMap<String, String>();
 
     public SharedServletContextImpl(final ServletContext webContext,
             final String name,
             final String prefix,
+            final Map<String, String> initParameters,
             final ServletContextAttributeListener servletContextAttributeListener)
     {
         this.context = webContext;
@@ -71,6 +74,10 @@
             this.contextPath = webContext.getContextPath() + prefix;
         }
         this.name = name;
+        if ( initParameters != null )
+        {
+            this.initParameters.putAll(initParameters);
+        }
         this.attributeListener = servletContextAttributeListener;
     }
 
@@ -258,15 +265,13 @@
     @Override
     public String getInitParameter(final String name)
     {
-        // TODO
-        return this.context.getInitParameter(name);
+        return this.initParameters.get(name);
     }
 
     @Override
     public Enumeration getInitParameterNames()
     {
-        // TODO
-        return this.context.getInitParameterNames();
+        return Collections.enumeration(this.initParameters.keySet());
     }
 
     @Override