FELIX-4060 : Implement HTTP Service Update (RFC-189)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1656399 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
index 4662ca9..a6f73ef 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/FilterHandler.java
@@ -31,7 +31,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.http.base.internal.context.ExtServletContext;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.runtime.FilterInfo;
import org.apache.felix.http.base.internal.util.PatternUtil;
@@ -43,7 +43,7 @@
private final long contextServiceId;
- public FilterHandler(final ContextInfo contextInfo, ExtServletContext context, Filter filter, FilterInfo filterInfo)
+ public FilterHandler(final ServletContextHelperInfo contextInfo, ExtServletContext context, Filter filter, FilterInfo filterInfo)
{
super(context, filterInfo.getInitParams(), filterInfo.getName());
this.filter = filter;
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
index c75f679..96b5627 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/HandlerRegistry.java
@@ -28,7 +28,7 @@
import javax.servlet.Servlet;
import javax.servlet.ServletException;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.runtime.FilterInfo;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
import org.osgi.service.http.NamespaceException;
@@ -58,7 +58,7 @@
/**
* Add a new servlet.
*/
- public synchronized void addServlet(ContextInfo contextInfo, ServletHandler handler) throws ServletException, NamespaceException
+ public synchronized void addServlet(ServletContextHelperInfo contextInfo, ServletHandler handler) throws ServletException, NamespaceException
{
if (this.servletMap.containsKey(handler.getServlet()))
{
@@ -210,7 +210,7 @@
return null;
}
- public synchronized Servlet removeServlet(final ContextInfo contextInfo, ServletInfo servletInfo, final boolean destroy)
+ public synchronized Servlet removeServlet(final ServletContextHelperInfo contextInfo, ServletInfo servletInfo, final boolean destroy)
{
for(final ServletHandler handler : this.servletMap.values())
{
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
index 8564d3e..9be2c36 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/ServletHandler.java
@@ -29,7 +29,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.http.base.internal.context.ExtServletContext;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
import org.apache.felix.http.base.internal.util.PatternUtil;
@@ -46,7 +46,7 @@
private final long contextServiceId;
- public ServletHandler(final ContextInfo contextInfo,
+ public ServletHandler(final ServletContextHelperInfo contextInfo,
final ExtServletContext context,
final ServletInfo servletInfo,
final Servlet servlet)
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ContextInfo.java b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
similarity index 93%
rename from http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ContextInfo.java
rename to http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
index 62d0ee5..a6929e8 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ContextInfo.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletContextHelperInfo.java
@@ -25,7 +25,7 @@
/**
* Provides registration information for a {@link ServletContextHelper}
*/
-public final class ContextInfo extends AbstractInfo<ServletContextHelper> {
+public final class ServletContextHelperInfo extends AbstractInfo<ServletContextHelper> {
private final String name;
@@ -33,7 +33,7 @@
private final String prefix;
- public ContextInfo(final ServiceReference<ServletContextHelper> ref) {
+ public ServletContextHelperInfo(final ServiceReference<ServletContextHelper> ref) {
super(ref);
this.name = this.getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME);
this.path = this.getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH);
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 4ba0741..de67424 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
@@ -28,16 +28,17 @@
import javax.servlet.ServletContextListener;
import org.apache.felix.http.base.internal.context.ExtServletContext;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceObjects;
import org.osgi.service.http.context.ServletContextHelper;
public final class ContextHandler implements Comparable<ContextHandler>
{
/** The info object for the context. */
- private final ContextInfo info;
+ private final ServletContextHelperInfo info;
/** A map of all created servlet contexts. */
private final Map<Long, ContextHolder> contextMap = new HashMap<Long, ContextHolder>();
@@ -51,14 +52,20 @@
/** Servlet context attribute listeners. */
private final Map<Long, ServletContextAttributeListener> contextAttributeListeners = new ConcurrentHashMap<Long, ServletContextAttributeListener>();
+ /** The http bundle. */
+ private final Bundle bundle;
+
/**
* Create new handler.
* @param info
* @param webContext
*/
- public ContextHandler(final ContextInfo info, final ServletContext webContext)
+ public ContextHandler(final ServletContextHelperInfo info,
+ final ServletContext webContext,
+ final Bundle bundle)
{
this.info = info;
+ this.bundle = bundle;
this.sharedContext = new SharedServletContextImpl(webContext,
info.getPrefix(),
info.getName(),
@@ -93,7 +100,7 @@
/**
* Get the context info
*/
- public ContextInfo getContextInfo()
+ public ServletContextHelperInfo getContextInfo()
{
return this.info;
}
@@ -104,31 +111,35 @@
return this.info.compareTo(o.info);
}
- public void activate(final Bundle bundle)
+ public void activate()
{
getServletContext(bundle);
}
- public void deactivate(final Bundle bundle)
+ public void deactivate()
{
this.ungetServletContext(bundle);
}
- public void initialized(final Bundle bundle, final ServletContextListenerInfo listenerInfo)
+ public void initialized(@Nonnull final ServletContextListenerInfo listenerInfo)
{
- final ServletContextListener listener = bundle.getBundleContext().getServiceObjects(listenerInfo.getServiceReference()).getService();
- if ( listener != null)
+ final ServiceObjects<ServletContextListener> so = bundle.getBundleContext().getServiceObjects(listenerInfo.getServiceReference());
+ if ( so != null )
{
- // no need to sync map - initialized is called in sync
- this.listeners.put(listenerInfo.getServiceId(), listener);
+ final ServletContextListener listener = so.getService();
+ if ( listener != null)
+ {
+ // no need to sync map - initialized is called in sync
+ this.listeners.put(listenerInfo.getServiceId(), listener);
- final ServletContext context = this.getServletContext(listenerInfo.getServiceReference().getBundle());
+ final ServletContext context = this.getServletContext(listenerInfo.getServiceReference().getBundle());
- listener.contextInitialized(new ServletContextEvent(context));
+ listener.contextInitialized(new ServletContextEvent(context));
+ }
}
}
- public void destroyed(final ServletContextListenerInfo listenerInfo)
+ public void destroyed(@Nonnull final ServletContextListenerInfo listenerInfo)
{
// no need to sync map - destroyed is called in sync
final ServletContextListener listener = this.listeners.remove(listenerInfo.getServiceId());
@@ -136,7 +147,14 @@
{
final ServletContext context = this.getServletContext(listenerInfo.getServiceReference().getBundle());
listener.contextDestroyed(new ServletContextEvent(context));
+ // call unget twice, once for the call in initialized and once for the call in this method(!)
this.ungetServletContext(listenerInfo.getServiceReference().getBundle());
+ this.ungetServletContext(listenerInfo.getServiceReference().getBundle());
+ final ServiceObjects<ServletContextListener> so = bundle.getBundleContext().getServiceObjects(listenerInfo.getServiceReference());
+ if ( so != null )
+ {
+ so.ungetService(listener);
+ }
}
}
@@ -148,12 +166,17 @@
ContextHolder holder = this.contextMap.get(key);
if ( holder == null )
{
- holder = new ContextHolder();
- // TODO check for null
- holder.servletContextHelper = bundle.getBundleContext().getServiceObjects(this.info.getServiceReference()).getService();
- holder.servletContext = new PerBundleServletContextImpl(bundle,
- this.sharedContext,
- holder.servletContextHelper);
+ final ServiceObjects<ServletContextHelper> so = bundle.getBundleContext().getServiceObjects(this.info.getServiceReference());
+ if ( so != null )
+ {
+ holder = new ContextHolder();
+ // TODO check for null
+ holder.servletContextHelper = so.getService();
+ holder.servletContext = new PerBundleServletContextImpl(bundle,
+ this.sharedContext,
+ holder.servletContextHelper);
+ this.contextMap.put(key, holder);
+ }
}
holder.counter++;
@@ -173,27 +196,46 @@
if ( holder.counter <= 0 )
{
this.contextMap.remove(key);
- bundle.getBundleContext().getServiceObjects(this.info.getServiceReference()).ungetService(holder.servletContextHelper);
+ final ServiceObjects<ServletContextHelper> so = bundle.getBundleContext().getServiceObjects(this.info.getServiceReference());
+ if ( so != null )
+ {
+ so.ungetService(holder.servletContextHelper);
+ }
}
}
}
}
- public void addListener(@Nonnull final Bundle bundle, @Nonnull final ServletContextAttributeListenerInfo info)
+ /**
+ * Add servlet context attribute listener
+ * @param info
+ */
+ public void addListener(@Nonnull final ServletContextAttributeListenerInfo info)
{
- final ServletContextAttributeListener service = bundle.getBundleContext().getServiceObjects(info.getServiceReference()).getService();
- if ( service != null )
+ final ServiceObjects<ServletContextAttributeListener> so = bundle.getBundleContext().getServiceObjects(info.getServiceReference());
+ if ( so != null )
{
- this.contextAttributeListeners.put(info.getServiceId(), service);
+ final ServletContextAttributeListener service = bundle.getBundleContext().getServiceObjects(info.getServiceReference()).getService();
+ if ( service != null )
+ {
+ this.contextAttributeListeners.put(info.getServiceId(), service);
+ }
}
}
- public void removeListener(@Nonnull final Bundle bundle, @Nonnull final ServletContextAttributeListenerInfo info)
+ /**
+ * Remove servlet context attribute listener
+ * @param info
+ */
+ public void removeListener(@Nonnull final ServletContextAttributeListenerInfo info)
{
final ServletContextAttributeListener service = this.contextAttributeListeners.remove(info.getServiceId());
if ( service != null )
{
- bundle.getBundleContext().getServiceObjects(info.getServiceReference()).ungetService(service);
+ final ServiceObjects<ServletContextAttributeListener> so = bundle.getBundleContext().getServiceObjects(info.getServiceReference());
+ if ( so != null ) {
+ so.ungetService(service);
+ }
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
index 935d8e2..2b77de2 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/ServletContextHelperManager.java
@@ -25,12 +25,14 @@
import java.util.List;
import java.util.Map;
+import javax.annotation.Nonnull;
import javax.servlet.ServletContext;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import org.apache.felix.http.base.internal.logger.SystemLogger;
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.ServletContextAttributeListenerInfo;
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
@@ -117,7 +119,7 @@
*/
private void activate(final ContextHandler handler)
{
- handler.activate(this.bundle);
+ handler.activate();
// context listeners first
final List<WhiteboardServiceInfo<?>> services = new ArrayList<WhiteboardServiceInfo<?>>();
for(final Map.Entry<WhiteboardServiceInfo<?>, List<ContextHandler>> entry : this.servicesMap.entrySet())
@@ -127,7 +129,7 @@
entry.getValue().add(handler);
if ( entry.getKey() instanceof ServletContextListenerInfo )
{
- handler.initialized(this.bundle, (ServletContextListenerInfo)entry.getKey());
+ handler.initialized((ServletContextListenerInfo)entry.getKey());
}
else
{
@@ -173,42 +175,51 @@
{
handler.destroyed(info);
}
- handler.deactivate(this.bundle);
+ handler.deactivate();
}
/**
* Add a servlet context helper.
*/
- public void addContextHelper(final ContextInfo info)
+ public void addContextHelper(final ServletContextHelperInfo info)
{
- final ContextHandler handler = new ContextHandler(info, this.webContext);
- synchronized ( this.contextMap )
+ if ( info.isValid() )
{
- List<ContextHandler> handlerList = this.contextMap.get(info.getName());
- if ( handlerList == null )
+ final ContextHandler handler = new ContextHandler(info, this.webContext, this.bundle);
+ synchronized ( this.contextMap )
{
- handlerList = new ArrayList<ContextHandler>();
- this.contextMap.put(info.getName(), handlerList);
- }
- handlerList.add(handler);
- Collections.sort(handlerList);
- // check for activate/deactivate
- if ( handlerList.get(0) == handler )
- {
- // check for deactivate
- if ( handlerList.size() > 1 )
+ List<ContextHandler> handlerList = this.contextMap.get(info.getName());
+ if ( handlerList == null )
{
- this.deactivate(handlerList.get(1));
+ handlerList = new ArrayList<ContextHandler>();
+ this.contextMap.put(info.getName(), handlerList);
}
- this.activate(handler);
+ handlerList.add(handler);
+ Collections.sort(handlerList);
+ // check for activate/deactivate
+ if ( handlerList.get(0) == handler )
+ {
+ // check for deactivate
+ if ( handlerList.size() > 1 )
+ {
+ this.deactivate(handlerList.get(1));
+ }
+ this.activate(handler);
+ }
}
}
+ else
+ {
+ // TODO - failure DTO
+ final String type = info.getClass().getSimpleName().substring(0, info.getClass().getSimpleName().length() - 4);
+ SystemLogger.debug("Ignoring " + type + " service " + info.getServiceReference());
+ }
}
/**
* Remove a servlet context helper
*/
- public void removeContextHelper(final ContextInfo info)
+ public void removeContextHelper(final ServletContextHelperInfo info)
{
synchronized ( this.contextMap )
{
@@ -266,24 +277,33 @@
* Add new whiteboard service to the registry
* @param info Whiteboard service info
*/
- public void addWhiteboardService(final WhiteboardServiceInfo<?> info)
+ public void addWhiteboardService(@Nonnull final WhiteboardServiceInfo<?> info)
{
- synchronized ( this.contextMap )
+ if ( info.isValid() )
{
- final List<ContextHandler> handlerList = this.getMatchingContexts(info);
- this.servicesMap.put(info, handlerList);
- for(final ContextHandler h : handlerList)
+ synchronized ( this.contextMap )
{
- this.registerWhiteboardService(h, info);
+ final List<ContextHandler> handlerList = this.getMatchingContexts(info);
+ this.servicesMap.put(info, handlerList);
+ for(final ContextHandler h : handlerList)
+ {
+ this.registerWhiteboardService(h, info);
+ }
}
}
+ else
+ {
+ // TODO - failure DTO
+ final String type = info.getClass().getSimpleName().substring(0, info.getClass().getSimpleName().length() - 4);
+ SystemLogger.debug("Ignoring " + type + " service " + info.getServiceReference());
+ }
}
/**
* Remove whiteboard service from the registry
* @param info Whiteboard service info
*/
- public void removeWhiteboardService(final WhiteboardServiceInfo<?> info)
+ public void removeWhiteboardService(@Nonnull final WhiteboardServiceInfo<?> info)
{
synchronized ( this.contextMap )
{
@@ -319,7 +339,7 @@
}
else if ( info instanceof ServletContextAttributeListenerInfo )
{
- handler.addListener(this.bundle, (ServletContextAttributeListenerInfo)info );
+ handler.addListener((ServletContextAttributeListenerInfo)info );
}
}
@@ -344,7 +364,7 @@
}
else if ( info instanceof ServletContextAttributeListenerInfo )
{
- handler.removeListener(this.bundle, (ServletContextAttributeListenerInfo)info );
+ handler.removeListener((ServletContextAttributeListenerInfo)info );
}
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/AbstractReferenceTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/AbstractReferenceTracker.java
index acf6e31..8519bad 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/AbstractReferenceTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/AbstractReferenceTracker.java
@@ -16,6 +16,8 @@
*/
package org.apache.felix.http.base.internal.whiteboard.tracker;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
+import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
import org.osgi.framework.ServiceReference;
@@ -27,9 +29,13 @@
*/
public abstract class AbstractReferenceTracker<T> extends ServiceTracker<T, ServiceReference<T>>
{
- public AbstractReferenceTracker(final BundleContext context, final Filter filter)
+ private final ServletContextHelperManager contextManager;
+
+ public AbstractReferenceTracker(final ServletContextHelperManager contextManager,
+ final BundleContext context, final Filter filter)
{
super(context, filter, null);
+ this.contextManager = contextManager;
}
@Override
@@ -51,12 +57,23 @@
this.removed(ref);
}
- private void modified(final ServiceReference<T> ref) {
+ protected void modified(final ServiceReference<T> ref)
+ {
removed(ref);
added(ref);
}
- protected abstract void added(final ServiceReference<T> ref);
+ protected void added(final ServiceReference<T> ref)
+ {
+ final WhiteboardServiceInfo<T> info = this.getServiceInfo(ref);
+ this.contextManager.addWhiteboardService(info);
+ }
- protected abstract void removed(final ServiceReference<T> ref);
+ protected void removed(final ServiceReference<T> ref)
+ {
+ final WhiteboardServiceInfo<T> info = this.getServiceInfo(ref);
+ this.contextManager.removeWhiteboardService(info);
+ }
+
+ protected abstract WhiteboardServiceInfo<T> getServiceInfo(final ServiceReference<T> ref);
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/FilterTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/FilterTracker.java
index c7997ef..83201bf 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/FilterTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/FilterTracker.java
@@ -18,8 +18,8 @@
import javax.servlet.Filter;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.FilterInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
@@ -28,7 +28,6 @@
public final class FilterTracker extends AbstractReferenceTracker<Filter>
{
- private final ServletContextHelperManager contextManager;
private static org.osgi.framework.Filter createFilter(final BundleContext btx)
{
@@ -49,33 +48,11 @@
public FilterTracker(final BundleContext context, final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
- this.contextManager = manager;
+ super(manager, context, createFilter(context));
}
@Override
- protected void added(final ServiceReference<Filter> ref)
- {
- final FilterInfo info = new FilterInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addWhiteboardService(info);
- }
- else
- {
- SystemLogger.debug("Ignoring Filter service " + ref);
- }
- }
-
- @Override
- protected void removed(final ServiceReference<Filter> ref)
- {
- final FilterInfo info = new FilterInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.removeWhiteboardService(info);
- }
+ protected WhiteboardServiceInfo<Filter> getServiceInfo(final ServiceReference<Filter> ref) {
+ return new FilterInfo(ref);
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ResourceTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ResourceTracker.java
index b4ce026..1e9c590 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ResourceTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ResourceTracker.java
@@ -16,8 +16,8 @@
*/
package org.apache.felix.http.base.internal.whiteboard.tracker;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.ResourceInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
@@ -27,7 +27,6 @@
public final class ResourceTracker extends AbstractReferenceTracker<Object>
{
- private final ServletContextHelperManager contextManager;
private static Filter createFilter(final BundleContext btx)
{
@@ -46,32 +45,11 @@
public ResourceTracker(final BundleContext context, final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
- this.contextManager = manager;
+ super(manager, context, createFilter(context));
}
@Override
- protected void added(final ServiceReference<Object> ref)
- {
- final ResourceInfo info = new ResourceInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addWhiteboardService(info);
- }
- else
- {
- SystemLogger.debug("Ignoring Resource service " + ref);
- }
+ protected WhiteboardServiceInfo<Object> getServiceInfo(final ServiceReference<Object> ref) {
+ return new ResourceInfo(ref);
}
-
- @Override
- protected void removed(final ServiceReference<Object> ref)
- {
- final ResourceInfo info = new ResourceInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.removeWhiteboardService(info);
- }
- }}
+}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java
index 9df9831..eb82557 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextAttributeListenerTracker.java
@@ -18,8 +18,8 @@
import javax.servlet.ServletContextAttributeListener;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.ServletContextAttributeListenerInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
@@ -27,7 +27,6 @@
public final class ServletContextAttributeListenerTracker extends AbstractReferenceTracker<ServletContextAttributeListener>
{
- private final ServletContextHelperManager contextManager;
/** TODO Currently under discussion. */
private static final String OPT_IN_PROP = "osgi.http.whiteboard.listener";
@@ -49,33 +48,11 @@
public ServletContextAttributeListenerTracker(final BundleContext context, final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
- this.contextManager = manager;
+ super(manager, context, createFilter(context));
}
@Override
- protected void added(final ServiceReference<ServletContextAttributeListener> ref)
- {
- final ServletContextAttributeListenerInfo info = new ServletContextAttributeListenerInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addWhiteboardService(info);
- }
- else
- {
- SystemLogger.debug("Ignoring ServletContextAttributeListenerInfo service " + ref);
- }
- }
-
- @Override
- protected void removed(final ServiceReference<ServletContextAttributeListener> ref)
- {
- final ServletContextAttributeListenerInfo info = new ServletContextAttributeListenerInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.removeWhiteboardService(info);
- }
+ protected WhiteboardServiceInfo<ServletContextAttributeListener> getServiceInfo(final ServiceReference<ServletContextAttributeListener> ref) {
+ return new ServletContextAttributeListenerInfo(ref);
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextHelperTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextHelperTracker.java
index f73ca2d..62219e0 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextHelperTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextHelperTracker.java
@@ -16,21 +16,23 @@
*/
package org.apache.felix.http.base.internal.whiteboard.tracker;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
-import org.apache.felix.http.base.internal.runtime.ContextInfo;
+import javax.annotation.Nonnull;
+
+import org.apache.felix.http.base.internal.runtime.ServletContextHelperInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.context.ServletContextHelper;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+import org.osgi.util.tracker.ServiceTracker;
/**
* Tracks all {@link ServletContextHelper} services.
* Only services with the required properties are tracker, services missing these
* properties are ignored.
*/
-public final class ServletContextHelperTracker extends AbstractReferenceTracker<ServletContextHelper>
+public final class ServletContextHelperTracker extends ServiceTracker<ServletContextHelper, ServiceReference<ServletContextHelper>>
{
private final ServletContextHelperManager contextManager;
@@ -50,34 +52,41 @@
return null; // we never get here - and if we get an NPE which is fine
}
- public ServletContextHelperTracker(final BundleContext context, final ServletContextHelperManager manager)
+ public ServletContextHelperTracker(@Nonnull final BundleContext context, @Nonnull final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
+ super(context, createFilter(context), null);
this.contextManager = manager;
}
@Override
- protected void added(final ServiceReference<ServletContextHelper> ref)
+ public final ServiceReference<ServletContextHelper> addingService(@Nonnull final ServiceReference<ServletContextHelper> ref)
{
- final ContextInfo info = new ContextInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addContextHelper(info);
- }
- else
- {
- SystemLogger.debug("Ignoring ServletContextHelper service " + ref);
- }
+ this.added(ref);
+ return ref;
}
@Override
- protected void removed(final ServiceReference<ServletContextHelper> ref)
+ public final void modifiedService(@Nonnull final ServiceReference<ServletContextHelper> ref, @Nonnull final ServiceReference<ServletContextHelper> service)
{
- final ContextInfo info = new ContextInfo(ref);
- if ( info.isValid() )
- {
- this.contextManager.removeContextHelper(info);
- }
+ this.removed(ref);
+ this.added(ref);
+ }
+
+ @Override
+ public final void removedService(@Nonnull final ServiceReference<ServletContextHelper> ref, @Nonnull final ServiceReference<ServletContextHelper> service)
+ {
+ this.removed(ref);
+ }
+
+ private void added(@Nonnull final ServiceReference<ServletContextHelper> ref)
+ {
+ final ServletContextHelperInfo info = new ServletContextHelperInfo(ref);
+ this.contextManager.addContextHelper(info);
+ }
+
+ private void removed(@Nonnull final ServiceReference<ServletContextHelper> ref)
+ {
+ final ServletContextHelperInfo info = new ServletContextHelperInfo(ref);
+ this.contextManager.removeContextHelper(info);
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java
index 37306ef..fe0028c 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletContextListenerTracker.java
@@ -18,8 +18,8 @@
import javax.servlet.ServletContextListener;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.ServletContextListenerInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
@@ -27,7 +27,6 @@
public final class ServletContextListenerTracker extends AbstractReferenceTracker<ServletContextListener>
{
- private final ServletContextHelperManager contextManager;
/** TODO Currently under discussion. */
private static final String OPT_IN_PROP = "osgi.http.whiteboard.listener";
@@ -49,33 +48,11 @@
public ServletContextListenerTracker(final BundleContext context, final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
- this.contextManager = manager;
+ super(manager, context, createFilter(context));
}
@Override
- protected void added(final ServiceReference<ServletContextListener> ref)
- {
- final ServletContextListenerInfo info = new ServletContextListenerInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addWhiteboardService(info);
- }
- else
- {
- SystemLogger.debug("Ignoring ServletContextListenerInfo service " + ref);
- }
- }
-
- @Override
- protected void removed(final ServiceReference<ServletContextListener> ref)
- {
- final ServletContextListenerInfo info = new ServletContextListenerInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.removeWhiteboardService(info);
- }
+ protected WhiteboardServiceInfo<ServletContextListener> getServiceInfo(final ServiceReference<ServletContextListener> ref) {
+ return new ServletContextListenerInfo(ref);
}
}
diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
index 7497517..0a8f237 100644
--- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
+++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/tracker/ServletTracker.java
@@ -18,8 +18,8 @@
import javax.servlet.Servlet;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.apache.felix.http.base.internal.runtime.WhiteboardServiceInfo;
import org.apache.felix.http.base.internal.whiteboard.ServletContextHelperManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
@@ -28,7 +28,6 @@
public final class ServletTracker extends AbstractReferenceTracker<Servlet>
{
- private final ServletContextHelperManager contextManager;
private static org.osgi.framework.Filter createFilter(final BundleContext btx)
{
@@ -48,33 +47,11 @@
public ServletTracker(final BundleContext context, final ServletContextHelperManager manager)
{
- super(context, createFilter(context));
- this.contextManager = manager;
+ super(manager, context, createFilter(context));
}
@Override
- protected void added(final ServiceReference<Servlet> ref)
- {
- final ServletInfo info = new ServletInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.addWhiteboardService(info);
- }
- else
- {
- SystemLogger.debug("Ignoring Servlet service " + ref);
- }
- }
-
- @Override
- protected void removed(final ServiceReference<Servlet> ref)
- {
- final ServletInfo info = new ServletInfo(ref);
-
- if ( info.isValid() )
- {
- this.contextManager.removeWhiteboardService(info);
- }
+ protected WhiteboardServiceInfo<Servlet> getServiceInfo(final ServiceReference<Servlet> ref) {
+ return new ServletInfo(ref);
}
}