New tracker for filter targeting singleton services

The current impl will not make any distinction between a filter, an
interceptor or any other @Provider registered. It has a naive matching
of startWith().


Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/ccba1224
Tree: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/ccba1224
Diff: 
http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/ccba1224

Branch: refs/heads/master
Commit: ccba12244fab1c16e168d5d026e8bdfc9248a8bb
Parents: f50f916
Author: Carlos Sierra <[email protected]>
Authored: Tue Oct 11 19:02:25 2016 +0200
Committer: Carlos Sierra <[email protected]>
Committed: Tue Oct 11 19:02:25 2016 +0200

----------------------------------------------------------------------
 .../internal/BusServiceTrackerCustomizer.java   |  11 ++
 ...AndInterceptorsServiceTrackerCustomizer.java | 123 +++++++++++++++++++
 2 files changed, 134 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/ccba1224/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/BusServiceTrackerCustomizer.java
----------------------------------------------------------------------
diff --git 
a/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/BusServiceTrackerCustomizer.java
 
b/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/BusServiceTrackerCustomizer.java
index 0281efe..8440196 100644
--- 
a/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/BusServiceTrackerCustomizer.java
+++ 
b/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/BusServiceTrackerCustomizer.java
@@ -58,6 +58,13 @@ public class BusServiceTrackerCustomizer
 
                        singletonsServiceTracker.open();
 
+                       ServiceTracker<Object, ?> 
filtersAndInterceptorsServiceTracker =
+                               new ServiceTracker<>(_bundleContext, 
getFiltersFilter(),
+                                       new 
FiltersAndInterceptorsServiceTrackerCustomizer(
+                                               _bundleContext));
+
+                       filtersAndInterceptorsServiceTracker.open();
+
                        return Arrays.asList(applicationTracker, 
singletonsServiceTracker);
                }
                catch (InvalidSyntaxException ise) {
@@ -70,6 +77,10 @@ public class BusServiceTrackerCustomizer
                }
        }
 
+       private Filter getFiltersFilter() throws InvalidSyntaxException {
+               return 
_bundleContext.createFilter("(osgi.jaxrs.filter.base=*)");
+       }
+
        private Filter getApplicationFilter() throws InvalidSyntaxException {
                return _bundleContext.createFilter(
                        "(&(objectClass=" + Application.class.getName() + ")" +

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/ccba1224/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
----------------------------------------------------------------------
diff --git 
a/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
 
b/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
new file mode 100644
index 0000000..07e8c7a
--- /dev/null
+++ 
b/portal-remote-rest-extender/src/main/java/com/liferay/portal/remote/rest/extender/internal/FiltersAndInterceptorsServiceTrackerCustomizer.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
+ * <p>
+ * This library is free software; you can redistribute it and/or modify it 
under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ * <p>
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ */
+
+package com.liferay.portal.remote.rest.extender.internal;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Carlos Sierra Andrés
+ */
+public class FiltersAndInterceptorsServiceTrackerCustomizer
+       implements ServiceTrackerCustomizer<Object, ServiceTracker<?, ?>> {
+
+       private BundleContext _bundleContext;
+
+       public FiltersAndInterceptorsServiceTrackerCustomizer(
+               BundleContext bundleContext) {
+
+               _bundleContext = bundleContext;
+       }
+
+       @Override
+       public ServiceTracker<?, ?> addingService(final 
ServiceReference<Object> reference) {
+               final String filterBase =
+                       
reference.getProperty("osgi.jaxrs.filter.base").toString();
+
+               final Object service = _bundleContext.getService(reference);
+
+               ServiceTracker<CXFJaxRsServiceRegistrator, 
CXFJaxRsServiceRegistrator> serviceTracker = new ServiceTracker<>(
+                       _bundleContext, CXFJaxRsServiceRegistrator.class,
+                       new ServiceTrackerCustomizer
+                               <CXFJaxRsServiceRegistrator, 
CXFJaxRsServiceRegistrator>() {
+
+                               @Override
+                               public CXFJaxRsServiceRegistrator addingService(
+                                       
ServiceReference<CXFJaxRsServiceRegistrator> cxfReference) {
+
+                                       Object resourceBaseObject =
+                                               
cxfReference.getProperty("CXF_ENDPOINT_ADDRESS");
+
+                                       if (resourceBaseObject == null) {
+                                               return null;
+                                       }
+
+                                       String resourceBase = 
resourceBaseObject.toString();
+
+                                       if 
(resourceBase.startsWith(filterBase)) {
+                                               CXFJaxRsServiceRegistrator 
serviceRegistrator =
+                                                       
_bundleContext.getService(cxfReference);
+                                               try {
+                                                       
serviceRegistrator.addProvider(service);
+
+                                                       return 
serviceRegistrator;
+                                               }
+                                               finally {
+                                                       
_bundleContext.ungetService(reference);
+                                               }
+                                       }
+
+                                       return null;
+                               }
+
+                               @Override
+                               public void modifiedService(
+                                       
ServiceReference<CXFJaxRsServiceRegistrator> reference,
+                                       CXFJaxRsServiceRegistrator service) {
+
+                                       removedService(reference, service);
+                                       addingService(reference);
+                               }
+
+                               @Override
+                               public void removedService(
+                                       
ServiceReference<CXFJaxRsServiceRegistrator> reference,
+                                       CXFJaxRsServiceRegistrator service) {
+
+                                       CXFJaxRsServiceRegistrator 
serviceRegistrator =
+                                               
_bundleContext.getService(reference);
+                                       try {
+                                               
serviceRegistrator.removeProvider(service);
+                                       }
+                                       finally {
+                                               
_bundleContext.ungetService(reference);
+                                       }
+                               }
+                       });
+
+               serviceTracker.open();
+
+               return serviceTracker;
+       }
+
+       @Override
+       public void modifiedService(
+               ServiceReference<Object> reference, ServiceTracker<?, ?> 
serviceTracker) {
+
+               removedService(reference, serviceTracker);
+               addingService(reference);
+       }
+
+       @Override
+       public void removedService(
+               ServiceReference<Object> reference, ServiceTracker<?, ?> 
serviceTracker) {
+
+               _bundleContext.ungetService(reference);
+
+               serviceTracker.close();
+       }
+}

Reply via email to