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