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(); + } +}
