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 2017/11/21 11:06:08 UTC

svn commit: r1815909 - in /felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal: ./ manager/ tracker/

Author: cziegeler
Date: Tue Nov 21 11:06:07 2017
New Revision: 1815909

URL: http://svn.apache.org/viewvc?rev=1815909&view=rev
Log:
FELIX-5747 : Implement proprietary whiteboard based on R7 whiteboard

Added:
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java   (with props)
Modified:
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/WhiteboardActivator.java
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ExtenderManager.java
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/AbstractTracker.java
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/FilterTracker.java
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/HttpContextTracker.java
    felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ServletTracker.java

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/WhiteboardActivator.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/WhiteboardActivator.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/WhiteboardActivator.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/WhiteboardActivator.java Tue Nov 21 11:06:07 2017
@@ -23,6 +23,7 @@ import org.apache.felix.http.base.intern
 import org.apache.felix.http.whiteboard.internal.manager.ExtenderManager;
 import org.apache.felix.http.whiteboard.internal.tracker.FilterTracker;
 import org.apache.felix.http.whiteboard.internal.tracker.HttpContextTracker;
+import org.apache.felix.http.whiteboard.internal.tracker.ListenersTracker;
 import org.apache.felix.http.whiteboard.internal.tracker.ServletTracker;
 import org.osgi.util.tracker.ServiceTracker;
 
@@ -39,6 +40,7 @@ public final class WhiteboardActivator
         addTracker(new HttpContextTracker(getBundleContext(), manager));
         addTracker(new FilterTracker(getBundleContext(), manager));
         addTracker(new ServletTracker(getBundleContext(), manager));
+        addTracker(new ListenersTracker(getBundleContext(), manager));
 
         SystemLogger.info("Apachde Felix Http Whiteboard Service started");
     }

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ExtenderManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ExtenderManager.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ExtenderManager.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/manager/ExtenderManager.java Tue Nov 21 11:06:07 2017
@@ -18,15 +18,23 @@ package org.apache.felix.http.whiteboard
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Dictionary;
+import java.util.EventListener;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.Filter;
 import javax.servlet.Servlet;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionListener;
 
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.apache.felix.http.whiteboard.HttpWhiteboardConstants;
@@ -36,6 +44,7 @@ import org.osgi.framework.ServiceRegistr
 import org.osgi.service.http.HttpContext;
 import org.osgi.service.http.context.ServletContextHelper;
 
+@SuppressWarnings("deprecation")
 public final class ExtenderManager
 {
     private static final String MARKER = "org.apache.felix.http.whiteboard";
@@ -43,7 +52,8 @@ public final class ExtenderManager
     public enum Type {
         CONTEXT,
         FILTER,
-        SERVLET
+        SERVLET,
+        LISTENERS
     }
 
     private final Map<String, ServiceRegistration<?>> registrations = new ConcurrentHashMap<>();
@@ -112,28 +122,7 @@ public final class ExtenderManager
         return false;
     }
 
-    /**
-     * Get the boolean property.
-     * @param ref The service reference
-     * @param key The name of the property
-     * @param int default value
-     * @return The value of the int property. Returns the default value as default
-     */
-    private int getIntProperty(final ServiceReference<?> ref, final String key, final int defValue)
-    {
-        final Object value = ref.getProperty(key);
-        if (value == null) {
-            return defValue;
-        }
-
-        try {
-            return Integer.parseInt(value.toString());
-        } catch (final Exception e) {
-            return defValue;
-        }
-    }
-
-    /**
+   /**
      * Add the init parameters
      * @param ref The service reference
      * @param prefix The prefix to use
@@ -191,6 +180,12 @@ public final class ExtenderManager
             select.append("))");
             props.put(org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, select.toString());
         }
+        else
+        {
+            props.put(org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
+                    "(" + org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME
+                    + "=org.osgi.service.http)");
+        }
     }
 
     /**
@@ -224,7 +219,7 @@ public final class ExtenderManager
      * @param service The HttpContext
      * @param ref The service reference
      */
-    public void add(final HttpContext service, final ServiceReference<HttpContext> ref)
+    public void addHttpContext(final HttpContext service, final ServiceReference<HttpContext> ref)
     {
         final String contextId = getStringProperty(ref, HttpWhiteboardConstants.CONTEXT_ID);
         if (contextId != null && !contextId.isEmpty())
@@ -273,7 +268,7 @@ public final class ExtenderManager
      * Remove a HttpContext
      * @param ref The service reference
      */
-    public void remove(final ServiceReference<HttpContext> ref)
+    public void removeHttpContext(final ServiceReference<HttpContext> ref)
     {
         this.removeServiceRegistration(Type.CONTEXT, ref);
     }
@@ -283,7 +278,7 @@ public final class ExtenderManager
      * @param service The filter
      * @param ref The filter reference
      */
-    public void add(final Filter service, final ServiceReference<Filter> ref)
+    public void addFilter(final Filter service, final ServiceReference<Filter> ref)
     {
         final String pattern = getStringProperty(ref, HttpWhiteboardConstants.PATTERN);
 
@@ -312,7 +307,7 @@ public final class ExtenderManager
      * @param service The servlet
      * @param ref The service reference
      */
-    public void add(final Servlet service, final ServiceReference<Servlet> ref)
+    public void addServlet(final Servlet service, final ServiceReference<Servlet> ref)
     {
         final String alias = getStringProperty(ref, HttpWhiteboardConstants.ALIAS);
         if (alias == null || alias.isEmpty() || !alias.startsWith("/"))
@@ -337,6 +332,49 @@ public final class ExtenderManager
     }
 
     /**
+     * Add listeners
+     * @param service The service
+     * @param ref The service reference
+     */
+    public void addListeners(final EventListener service, ServiceReference<EventListener> ref)
+    {
+        final Dictionary<String, Object> props = new Hashtable<>();
+        final List<String> names = new ArrayList<>();
+        if ( service instanceof HttpSessionAttributeListener)
+        {
+            names.add(HttpSessionAttributeListener.class.getName());
+        }
+        if ( service instanceof HttpSessionListener)
+        {
+            names.add(HttpSessionListener.class.getName());
+        }
+        if ( service instanceof ServletContextAttributeListener)
+        {
+            names.add(ServletContextAttributeListener.class.getName());
+        }
+        if ( service instanceof ServletRequestAttributeListener)
+        {
+            names.add(ServletRequestAttributeListener.class.getName());
+        }
+        if ( service instanceof ServletRequestListener)
+        {
+            names.add(ServletRequestListener.class.getName());
+        }
+
+        props.put(MARKER, "true");
+        props.put(org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER, "true");
+        this.addHttpContextSelect(ref, props);
+        this.addServiceRanking(ref, props);
+
+        final ServiceRegistration<?> reg = ref.getBundle().getBundleContext().registerService(
+                names.toArray(new String[names.size()]),
+                service,
+                props);
+        this.putServiceRegistration(Type.LISTENERS, ref, reg);
+    }
+
+
+    /**
      * Remove a filter
      * @param ref The filter reference
      */
@@ -353,4 +391,13 @@ public final class ExtenderManager
     {
         this.removeServiceRegistration(Type.SERVLET, ref);
     }
+
+    /**
+     * Remove a listener
+     * @param ref The service reference
+     */
+    public void removeListeners(final ServiceReference<EventListener> ref)
+    {
+        this.removeServiceRegistration(Type.LISTENERS, ref);
+    }
 }

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/AbstractTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/AbstractTracker.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/AbstractTracker.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/AbstractTracker.java Tue Nov 21 11:06:07 2017
@@ -62,7 +62,8 @@ public abstract class AbstractTracker<T>
     @Override
     public final void modifiedService(final ServiceReference<T> ref, T service)
     {
-        modified( service, ref);
+        removed(service, ref);
+        added(service, ref);
     }
 
     @Override
@@ -72,8 +73,6 @@ public abstract class AbstractTracker<T>
         removed(service, ref);
     }
 
-    protected abstract void modified(T service, ServiceReference<T> ref);
-
     protected abstract void added(T service, ServiceReference<T> ref);
 
     protected abstract void removed(T service, ServiceReference<T> ref);

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/FilterTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/FilterTracker.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/FilterTracker.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/FilterTracker.java Tue Nov 21 11:06:07 2017
@@ -24,6 +24,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
+@SuppressWarnings("deprecation")
 public final class FilterTracker
     extends AbstractTracker<Filter>
 {
@@ -54,14 +55,7 @@ public final class FilterTracker
     protected void added(final Filter service, final ServiceReference<Filter> ref)
     {
         logDeprecationWarning("Filter", service, ref);
-        this.manager.add(service, ref);
-    }
-
-    @Override
-    protected void modified(final Filter service, final ServiceReference<Filter> ref)
-    {
-        removed(service, ref);
-        added(service, ref);
+        this.manager.addFilter(service, ref);
     }
 
     @Override

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/HttpContextTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/HttpContextTracker.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/HttpContextTracker.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/HttpContextTracker.java Tue Nov 21 11:06:07 2017
@@ -36,19 +36,12 @@ public final class HttpContextTracker
     protected void added(final HttpContext service, final ServiceReference<HttpContext> ref)
     {
         this.logDeprecationWarning("HttpContext", service, ref);
-        this.manager.add(service, ref);
-    }
-
-    @Override
-    protected void modified(final HttpContext service, final ServiceReference<HttpContext> ref)
-    {
-        removed(service, ref);
-        added(service, ref);
+        this.manager.addHttpContext(service, ref);
     }
 
     @Override
     protected void removed(final HttpContext service, final ServiceReference<HttpContext> ref)
     {
-        this.manager.remove(ref);
+        this.manager.removeHttpContext(ref);
     }
 }

Added: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java?rev=1815909&view=auto
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java (added)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java Tue Nov 21 11:06:07 2017
@@ -0,0 +1,84 @@
+/*
+ * 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.whiteboard.internal.tracker;
+
+import java.util.EventListener;
+
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.felix.http.whiteboard.internal.manager.ExtenderManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+
+/**
+ * Implementation of the Apache Felix proprietary whiteboard for listeners
+ */
+public class ListenersTracker extends AbstractTracker<EventListener>
+{
+
+    private final ExtenderManager manager;
+
+    private static org.osgi.framework.Filter createFilter(final BundleContext btx)
+    {
+        try
+        {
+            return btx.createFilter(String.format("(&" +
+                                                   "(!(%s=*))" +
+                                                   "(|(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s)(objectClass=%s))" +
+                                                   ")",
+                    HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER,
+                    HttpSessionAttributeListener.class.getName(),
+                    HttpSessionListener.class.getName(),
+                    ServletContextAttributeListener.class.getName(),
+                    ServletRequestAttributeListener.class.getName(),
+                    ServletRequestListener.class.getName()));
+        }
+        catch ( final InvalidSyntaxException ise)
+        {
+            // we can safely ignore it as the above filter is a constant
+        }
+        return null; // we never get here - and if, we get an NPE which is fine
+    }
+
+    public ListenersTracker(final BundleContext context,
+            final ExtenderManager manager)
+    {
+        super(context, createFilter(context));
+        this.manager = manager;
+    }
+
+    @Override
+    protected void added(final EventListener service, final ServiceReference<EventListener> ref)
+    {
+        logDeprecationWarning("Listener", service, ref);
+        this.manager.addListeners(service, ref);
+    }
+
+    @Override
+    protected void removed(final EventListener service, final ServiceReference<EventListener> ref)
+    {
+        this.manager.removeListeners(ref);
+    }
+}

Propchange: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ListenersTracker.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ServletTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ServletTracker.java?rev=1815909&r1=1815908&r2=1815909&view=diff
==============================================================================
--- felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ServletTracker.java (original)
+++ felix/trunk/http/whiteboard/src/main/java/org/apache/felix/http/whiteboard/internal/tracker/ServletTracker.java Tue Nov 21 11:06:07 2017
@@ -24,6 +24,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
+@SuppressWarnings("deprecation")
 public final class ServletTracker
     extends AbstractTracker<Servlet>
 {
@@ -54,17 +55,10 @@ public final class ServletTracker
     protected void added(final Servlet service, final ServiceReference<Servlet> ref)
     {
         logDeprecationWarning("Servlet", service, ref);
-        this.manager.add(service, ref);
+        this.manager.addServlet(service, ref);
     }
 
-    @Override
-    protected void modified(final Servlet service, final ServiceReference<Servlet> ref)
-    {
-        removed(service, ref);
-        added(service, ref);
-    }
-
-    @Override
+   @Override
     protected void removed(final Servlet service, final ServiceReference<Servlet> ref)
     {
         this.manager.removeServlet(ref);