Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTracker.java Sat Jul 18 18:12:45 2015 @@ -27,13 +27,11 @@ import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; -import org.osgi.framework.AllServiceListener; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.Filter; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; -import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; /** @@ -72,7 +70,7 @@ import org.osgi.framework.ServiceReferen * @param <S> * @param <T> */ -public class ServiceTracker<S, T> { +public class ServiceTracker<S, T, U extends ServiceEvent> { /* set this to true to compile in debug messages */ static final boolean DEBUG = false; /** @@ -85,27 +83,18 @@ public class ServiceTracker<S, T> { * * @since 1.1 */ - protected final Filter filter; + protected final Filter eventFilter; /** * The {@code ServiceTrackerCustomizer} for this tracker. */ - final ServiceTrackerCustomizer<S, T> customizer; + final ServiceTrackerCustomizer<S, T, U> customizer; /** * Filter string for use when adding the ServiceListener. If this field is * set, then certain optimizations can be taken since we don't have a user * supplied filter. */ - final String listenerFilter; - /** - * Class name to be tracked. If this field is set, then we are tracking by - * class name. - */ - private final String trackClass; - /** - * Reference to be tracked. If this field is set, then we are tracking a - * single ServiceReference. - */ - private final ServiceReference<S> trackReference; + final String initialReferenceFilterString; + /** * Tracked services: {@code ServiceReference} -> customized Object and * {@code ServiceListener} object @@ -129,93 +118,9 @@ public class ServiceTracker<S, T> { return tracked; } - /** - * Cached ServiceReference for getServiceReference. - * - * This field is volatile since it is accessed by multiple threads. - */ - private volatile ServiceReference<S> cachedReference; - /** - * Cached service object for getService. - * - * This field is volatile since it is accessed by multiple threads. - */ - private volatile T cachedService; + private ExtendedServiceListenerContext<U> extendedServiceListenerContext; + private String classFilterString; - /** - * Create a {@code ServiceTracker} on the specified {@code ServiceReference} - * . - * - * <p> - * The service referenced by the specified {@code ServiceReference} will be - * tracked by this {@code ServiceTracker}. - * - * @param context The {@code BundleContext} against which the tracking is - * done. - * @param reference The {@code ServiceReference} for the service to be - * tracked. - * @param customizer The customizer object to call when services are added, - * modified, or removed in this {@code ServiceTracker}. If customizer - * is {@code null}, then this {@code ServiceTracker} will be used as - * the {@code ServiceTrackerCustomizer} and this - * {@code ServiceTracker} will call the - * {@code ServiceTrackerCustomizer} methods on itself. - */ - public ServiceTracker(final BundleContext context, final ServiceReference<S> reference, final ServiceTrackerCustomizer<S, T> customizer) { - this.context = context; - this.trackReference = reference; - this.trackClass = null; - this.customizer = customizer; - this.listenerFilter = "(" + Constants.SERVICE_ID + "=" + reference.getProperty(Constants.SERVICE_ID).toString() + ")"; - try { - this.filter = context.createFilter(listenerFilter); - } catch (InvalidSyntaxException e) { - /* - * we could only get this exception if the ServiceReference was - * invalid - */ - IllegalArgumentException iae = new IllegalArgumentException("unexpected InvalidSyntaxException: " + e.getMessage()); - iae.initCause(e); - throw iae; - } - } - - /** - * Create a {@code ServiceTracker} on the specified class name. - * - * <p> - * Services registered under the specified class name will be tracked by - * this {@code ServiceTracker}. - * - * @param context The {@code BundleContext} against which the tracking is - * done. - * @param clazz The class name of the services to be tracked. - * @param customizer The customizer object to call when services are added, - * modified, or removed in this {@code ServiceTracker}. If customizer - * is {@code null}, then this {@code ServiceTracker} will be used as - * the {@code ServiceTrackerCustomizer} and this - * {@code ServiceTracker} will call the - * {@code ServiceTrackerCustomizer} methods on itself. - */ - public ServiceTracker(final BundleContext context, final String clazz, final ServiceTrackerCustomizer<S, T> customizer) { - this.context = context; - this.trackReference = null; - this.trackClass = clazz; - this.customizer = customizer; - // we call clazz.toString to verify clazz is non-null! - this.listenerFilter = "(" + Constants.OBJECTCLASS + "=" + clazz + ")"; - try { - this.filter = context.createFilter(listenerFilter); - } catch (InvalidSyntaxException e) { - /* - * we could only get this exception if the clazz argument was - * malformed - */ - IllegalArgumentException iae = new IllegalArgumentException("unexpected InvalidSyntaxException: " + e.getMessage()); - iae.initCause(e); - throw iae; - } - } /** * Create a {@code ServiceTracker} on the specified {@code Filter} object. @@ -226,51 +131,38 @@ public class ServiceTracker<S, T> { * * @param context The {@code BundleContext} against which the tracking is * done. - * @param filter The {@code Filter} to select the services to be tracked. * @param customizer The customizer object to call when services are added, * modified, or removed in this {@code ServiceTracker}. If customizer * is null, then this {@code ServiceTracker} will be used as the * {@code ServiceTrackerCustomizer} and this {@code ServiceTracker} * will call the {@code ServiceTrackerCustomizer} methods on itself. * @param initialActive Initial active state of the tracker. + * @param bundleComponentActivator TODO + * @param eventFilter The {@code Filter} to select the services to be tracked. + * @param classFilterString TODO + * @param initialReferenceFilterString TODO * @since 1.1 */ - public ServiceTracker(final BundleContext context, final Filter filter, final ServiceTrackerCustomizer<S, T> customizer, boolean initialActive) { + public ServiceTracker(final BundleContext context, + final ServiceTrackerCustomizer<S, T, U> customizer, + boolean initialActive, + ExtendedServiceListenerContext<U> bundleComponentActivator, + final Filter eventFilter, + final String classFilterString, + final String initialReferenceFilterString) { + if ((context == null)) { + /* + * we throw a NPE here to be consistent with the other constructors + */ + throw new NullPointerException( "BundleContext"); + } this.context = context; - this.trackReference = null; - this.trackClass = null; - this.listenerFilter = filter.toString(); - this.filter = filter; + this.initialReferenceFilterString = initialReferenceFilterString; + this.eventFilter = eventFilter; this.customizer = customizer; this.active = initialActive; - if ((context == null)) { - /* - * we throw a NPE here to be consistent with the other constructors - */ - throw new NullPointerException( "BundleContext"); - } - } - - /** - * Create a {@code ServiceTracker} on the specified class. - * - * <p> - * Services registered under the name of the specified class will be tracked - * by this {@code ServiceTracker}. - * - * @param context The {@code BundleContext} against which the tracking is - * done. - * @param clazz The class of the services to be tracked. - * @param customizer The customizer object to call when services are added, - * modified, or removed in this {@code ServiceTracker}. If customizer - * is {@code null}, then this {@code ServiceTracker} will be used as - * the {@code ServiceTrackerCustomizer} and this - * {@code ServiceTracker} will call the - * {@code ServiceTrackerCustomizer} methods on itself. - * @since 1.5 - */ - public ServiceTracker(final BundleContext context, final Class<S> clazz, final ServiceTrackerCustomizer<S, T> customizer) { - this(context, clazz.getName(), customizer); + this.extendedServiceListenerContext = bundleComponentActivator; + this.classFilterString = classFilterString; } /** @@ -315,25 +207,13 @@ public class ServiceTracker<S, T> { return; } if (DEBUG) { - System.out.println("ServiceTracker.open: " + filter); + System.out.println("ServiceTracker.open: " + eventFilter); } - t = trackAllServices ? new AllTracked( trackingCount ) : new Tracked( trackingCount ); + t = new Tracked( trackingCount ); synchronized (t) { try { - context.addServiceListener(t, listenerFilter); - ServiceReference<S>[] references = null; - if (trackClass != null) { - references = getInitialReferences(trackAllServices, trackClass, null); - } else { - if (trackReference != null) { - if (trackReference.getBundle() != null) { - ServiceReference<S>[] single = new ServiceReference[] {trackReference}; - references = single; - } - } else { /* user supplied filter */ - references = getInitialReferences(trackAllServices, null, listenerFilter); - } - } + extendedServiceListenerContext.addServiceListener(classFilterString, eventFilter, t); + ServiceReference<S>[] references = getInitialReferences(null, initialReferenceFilterString); /* set tracked with the initial references */ t.setInitial(references); } catch (InvalidSyntaxException e) { @@ -349,18 +229,16 @@ public class ServiceTracker<S, T> { /** * Returns the list of initial {@code ServiceReference}s that will be * tracked by this {@code ServiceTracker}. - * - * @param trackAllServices If {@code true}, use - * {@code getAllServiceReferences}. * @param className The class name with which the service was registered, or * {@code null} for all services. * @param filterString The filter criteria or {@code null} for all services. + * * @return The list of initial {@code ServiceReference}s. * @throws InvalidSyntaxException If the specified filterString has an * invalid syntax. */ - private ServiceReference<S>[] getInitialReferences(boolean trackAllServices, String className, String filterString) throws InvalidSyntaxException { - ServiceReference<S>[] result = (ServiceReference<S>[]) ((trackAllServices) ? context.getAllServiceReferences(className, filterString) : context.getServiceReferences(className, filterString)); + private ServiceReference<S>[] getInitialReferences(String className, String filterString) throws InvalidSyntaxException { + ServiceReference<S>[] result = (ServiceReference<S>[]) context.getServiceReferences(className, filterString); return result; } @@ -386,7 +264,7 @@ public class ServiceTracker<S, T> { return map; } if (DEBUG) { - System.out.println("ServiceTracker.close: " + filter); + System.out.println("ServiceTracker.close: " + eventFilter); } outgoing.close(); synchronized ( outgoing ) @@ -397,7 +275,7 @@ public class ServiceTracker<S, T> { // references = getServiceReferences(); // tracked = null; try { - context.removeServiceListener(outgoing); + extendedServiceListenerContext.removeServiceListener(classFilterString, eventFilter, outgoing); } catch (IllegalStateException e) { /* In case the context was stopped. */ } @@ -412,9 +290,7 @@ public class ServiceTracker<S, T> { // } // } if (DEBUG) { - if ((cachedReference == null) && (cachedService == null)) { - System.out.println("ServiceTracker.close[cached cleared]: " + filter); - } + System.out.println("ServiceTracker.close[cached cleared]: " + eventFilter); } return map; } @@ -427,7 +303,7 @@ public class ServiceTracker<S, T> { return; } if (DEBUG) { - System.out.println("ServiceTracker.close: " + filter); + System.out.println("ServiceTracker.close: " + eventFilter); } } for (ServiceReference<S> ref: toUntrack.keySet()) { @@ -479,7 +355,7 @@ public class ServiceTracker<S, T> { * * @param reference The reference to modified service. * @param service The service object for the modified service. - * @see ServiceTrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, Object, int) + * @see ServiceTrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, Object, int, ServiceEvent) */ public void modifiedService(ServiceReference<S> reference, T service, int trackingCount) { /* do nothing */ @@ -504,67 +380,13 @@ public class ServiceTracker<S, T> { * * @param reference The reference to removed service. * @param service The service object for the removed service. - * @see ServiceTrackerCustomizer#removedService(org.osgi.framework.ServiceReference, Object, int) + * @see ServiceTrackerCustomizer#removedService(org.osgi.framework.ServiceReference, Object, int, ServiceEvent) */ public void removedService(ServiceReference<S> reference, T service, int trackingCount) { context.ungetService(reference); } /** - * Wait for at least one service to be tracked by this - * {@code ServiceTracker}. This method will also return when this - * {@code ServiceTracker} is closed. - * - * <p> - * It is strongly recommended that {@code waitForService} is not used during - * the calling of the {@code BundleActivator} methods. - * {@code BundleActivator} methods are expected to complete in a short - * period of time. - * - * <p> - * This implementation calls {@link #getService()} to determine if a service - * is being tracked. - * - * @param timeout The time interval in milliseconds to wait. If zero, the - * method will wait indefinitely. - * @return Returns the result of {@link #getService()}. - * @throws InterruptedException If another thread has interrupted the - * current thread. - * @throws IllegalArgumentException If the value of timeout is negative. - */ - public T waitForService(long timeout) throws InterruptedException { - if (timeout < 0) { - throw new IllegalArgumentException("timeout value is negative"); - } - - T object = getService(); - if (object != null) { - return object; - } - - final long endTime = (timeout == 0) ? 0 : (System.currentTimeMillis() + timeout); - do { - final Tracked t = tracked(); - if (t == null) { /* if ServiceTracker is not open */ - return null; - } - synchronized (t) { - if (t.size() == 0) { - t.wait(timeout); - } - } - object = getService(); - if (endTime > 0) { // if we have a timeout - timeout = endTime - System.currentTimeMillis(); - if (timeout <= 0) { // that has expired - break; - } - } - } while (object == null); - return object; - } - - /** * Return an array of {@code ServiceReference}s for all services being * tracked by this {@code ServiceTracker}. * @@ -586,76 +408,6 @@ public class ServiceTracker<S, T> { } } - /** - * Returns a {@code ServiceReference} for one of the services being tracked - * by this {@code ServiceTracker}. - * - * <p> - * If multiple services are being tracked, the service with the highest - * ranking (as specified in its {@code service.ranking} property) is - * returned. If there is a tie in ranking, the service with the lowest - * service ID (as specified in its {@code service.id} property); that is, - * the service that was registered first is returned. This is the same - * algorithm used by {@code BundleContext.getServiceReference}. - * - * <p> - * This implementation calls {@link #getServiceReferences()} to get the list - * of references for the tracked services. - * - * @return A {@code ServiceReference} or {@code null} if no services are - * being tracked. - * @since 1.1 - */ - public ServiceReference<S> getServiceReference() { - ServiceReference<S> reference = cachedReference; - if (reference != null) { - if (DEBUG) { - System.out.println("ServiceTracker.getServiceReference[cached]: " + filter); - } - return reference; - } - if (DEBUG) { - System.out.println("ServiceTracker.getServiceReference: " + filter); - } - ServiceReference<S>[] references = getServiceReferences(); - int length = (references == null) ? 0 : references.length; - if (length == 0) { /* if no service is being tracked */ - return null; - } - int index = 0; - if (length > 1) { /* if more than one service, select highest ranking */ - int rankings[] = new int[length]; - int count = 0; - int maxRanking = Integer.MIN_VALUE; - for (int i = 0; i < length; i++) { - Object property = references[i].getProperty(Constants.SERVICE_RANKING); - int ranking = (property instanceof Integer) ? ((Integer) property).intValue() : 0; - rankings[i] = ranking; - if (ranking > maxRanking) { - index = i; - maxRanking = ranking; - count = 1; - } else { - if (ranking == maxRanking) { - count++; - } - } - } - if (count > 1) { /* if still more than one service, select lowest id */ - long minId = Long.MAX_VALUE; - for (int i = 0; i < length; i++) { - if (rankings[i] == maxRanking) { - long id = ((Long) (references[i].getProperty(Constants.SERVICE_ID))).longValue(); - if (id < minId) { - index = i; - minId = id; - } - } - } - } - } - return cachedReference = references[index]; - } /** * Returns the service object for the specified {@code ServiceReference} if @@ -708,34 +460,6 @@ public class ServiceTracker<S, T> { } } - /** - * Returns a service object for one of the services being tracked by this - * {@code ServiceTracker}. - * - * <p> - * If any services are being tracked, this implementation returns the result - * of calling {@code getService(getServiceReference())}. - * - * @return A service object or {@code null} if no services are being - * tracked. - */ - public T getService() { - T service = cachedService; - if (service != null) { - if (DEBUG) { - System.out.println("ServiceTracker.getService[cached]: " + filter); - } - return service; - } - if (DEBUG) { - System.out.println("ServiceTracker.getService: " + filter); - } - ServiceReference<S> reference = getServiceReference(); - if (reference == null) { - return null; - } - return cachedService = getService(reference); - } /** * Remove a service from this {@code ServiceTracker}. @@ -810,10 +534,8 @@ public class ServiceTracker<S, T> { * between the listener thread and the user thread. */ void modified() { - cachedReference = null; /* clear cached value */ - cachedService = null; /* clear cached value */ if (DEBUG) { - System.out.println("ServiceTracker.modified: " + filter); + System.out.println("ServiceTracker.modified: " + eventFilter); } } @@ -1106,11 +828,12 @@ public class ServiceTracker<S, T> { if (DEBUG) { System.out.println("AbstractTracked.trackInitial: " + item); //$NON-NLS-1$ } - trackAdding(item, null); /* - * Begin tracking it. We call trackAdding - * since we have already put the item in the - * adding list. - */ + /* + * Begin tracking it. We call trackAdding + * since we have already put the item in the + * adding list. + */ + trackAdding(item, null); } } @@ -1410,7 +1133,7 @@ public class ServiceTracker<S, T> { * * @ThreadSafe */ - private class Tracked extends AbstractTracked<ServiceReference<S>, T, ServiceEvent> implements ServiceListener { + private class Tracked extends AbstractTracked<ServiceReference<S>, T, U> implements ExtendedServiceListener<U> { /** * Tracked constructor. * @param trackingCount @@ -1425,7 +1148,7 @@ public class ServiceTracker<S, T> { * * @param event {@code ServiceEvent} object from the framework. */ - final public void serviceChanged(final ServiceEvent event) { + final public void serviceChanged(final U event) { /* * Check if we had a delayed call (which could happen when we * close). @@ -1484,12 +1207,12 @@ public class ServiceTracker<S, T> { * @return Customized object for the tracked item or {@code null} if the * item is not to be tracked. */ - final T customizerAdding( final ServiceReference<S> item, final ServiceEvent related ) { + final T customizerAdding( final ServiceReference<S> item, final U related ) { return customizer.addingService( item ); } - final void customizerAdded( final ServiceReference<S> item, final ServiceEvent related, final T object, int trackingCount, int serviceCount ) { - customizer.addedService( item, object, trackingCount, serviceCount ); + final void customizerAdded( final ServiceReference<S> item, final U related, final T object, int trackingCount, int serviceCount ) { + customizer.addedService( item, object, trackingCount, serviceCount, related ); } /** @@ -1501,8 +1224,8 @@ public class ServiceTracker<S, T> { * @param object Customized object for the tracked item. * @param trackingCount */ - final void customizerModified( final ServiceReference<S> item, final ServiceEvent related, final T object, int trackingCount ) { - customizer.modifiedService( item, object, trackingCount ); + final void customizerModified( final ServiceReference<S> item, final U related, final T object, int trackingCount ) { + customizer.modifiedService( item, object, trackingCount, related ); } /** @@ -1514,8 +1237,8 @@ public class ServiceTracker<S, T> { * @param object Customized object for the tracked item. * @param trackingCount */ - final void customizerRemoved( final ServiceReference<S> item, final ServiceEvent related, final T object, int trackingCount ) { - customizer.removedService(item, object, trackingCount ); + final void customizerRemoved( final ServiceReference<S> item, final U related, final T object, int trackingCount ) { + customizer.removedService(item, object, trackingCount, related ); } } @@ -1526,13 +1249,13 @@ public class ServiceTracker<S, T> { * @since 1.3 * @ThreadSafe */ - private class AllTracked extends Tracked implements AllServiceListener { - /** - * AllTracked constructor. - * @param trackingCount - */ - AllTracked( AtomicInteger trackingCount ) { - super( trackingCount ); - } - } +// private class AllTracked extends Tracked<U> implements AllServiceListener { +// /** +// * AllTracked constructor. +// * @param trackingCount +// */ +// AllTracked( AtomicInteger trackingCount ) { +// super( trackingCount ); +// } +// } }
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTrackerCustomizer.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTrackerCustomizer.java?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTrackerCustomizer.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceTrackerCustomizer.java Sat Jul 18 18:12:45 2015 @@ -16,6 +16,7 @@ package org.apache.felix.scr.impl.manager; +import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceReference; /** @@ -47,7 +48,7 @@ import org.osgi.framework.ServiceReferen * @ThreadSafe * @version $Id: c14b8d47026b6bd4ba1f2db7bf7e755d00fc6f6a $ */ -public interface ServiceTrackerCustomizer<S, T> { +public interface ServiceTrackerCustomizer<S, T, U extends ServiceEvent> { /** * A service is being added to the {@code ServiceTracker}. * @@ -69,7 +70,7 @@ public interface ServiceTrackerCustomize */ public T addingService( ServiceReference<S> reference ); - public void addedService( ServiceReference<S> reference, T service, int trackingCount, int serviceCount ); + public void addedService( ServiceReference<S> reference, T service, int trackingCount, int serviceCount, U event ); /** * A service tracked by the {@code ServiceTracker} has been modified. @@ -79,10 +80,11 @@ public interface ServiceTrackerCustomize * {@code ServiceTracker} has had it properties modified. * * @param reference The reference to the service that has been modified. - * @param service The service object for the specified referenced service. - * @param trackingCount + * @param service The service object for the specified referenced service. + * @param trackingCount + * @param event TODO */ - public void modifiedService( ServiceReference<S> reference, T service, int trackingCount ); + public void modifiedService( ServiceReference<S> reference, T service, int trackingCount, U event ); /** * A service tracked by the {@code ServiceTracker} has been removed. @@ -94,7 +96,8 @@ public interface ServiceTrackerCustomize * @param reference The reference to the service that has been removed. * @param service The service object for the specified referenced service. * @param trackingCount + * @param event TODO */ - public void removedService( ServiceReference<S> reference, T service, int trackingCount ); + public void removedService( ServiceReference<S> reference, T service, int trackingCount, U event ); } Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java Sat Jul 18 18:12:45 2015 @@ -374,7 +374,7 @@ public abstract class ComponentTestBase Collection<ServiceReference<S>> srs; try { srs = bundleContext.getServiceReferences(clazz, filter); - Assert.assertEquals(1, srs.size()); + Assert.assertEquals("Nothing for filter: " + filter, 1, srs.size()); ServiceReference<S> sr = srs.iterator().next(); S s = bundleContext.getService(sr); Assert.assertNotNull(s); Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocateTest.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocateTest.java?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocateTest.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocateTest.java Sat Jul 18 18:12:45 2015 @@ -46,18 +46,20 @@ public class LocateTest extends Componen { bundleContext.registerService( Object.class, new Object(), null ); - findComponentConfigurationByName( "AsyncLocate", ComponentConfigurationDTO.ACTIVE ); + findComponentConfigurationByName( "Consumer", ComponentConfigurationDTO.ACTIVE ); - final String pid = "SimpleComponent"; + final String pid = "TestComponent"; Configuration config = getConfigurationAdmin().getConfiguration( pid, null ); final Hashtable props = new Hashtable(); + //wrong target property, will not bind props.put( "target", "bar" ); config.update(props); delay(); //when deadlock is present the state is actually unsatisfied. - ComponentConfigurationDTO cc = findComponentConfigurationByName( pid, ComponentConfigurationDTO.ACTIVE ); - delay(); + ComponentConfigurationDTO cc = findComponentConfigurationByName( pid, ComponentConfigurationDTO.SATISFIED ); +// delay(); + //correct target property: will bind as new properties are propagated. props.put( "target", "foo" ); config.update(props); delay(); Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/deadlock/Consumer.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/deadlock/Consumer.java?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/deadlock/Consumer.java (original) +++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/components/deadlock/Consumer.java Sat Jul 18 18:12:45 2015 @@ -31,12 +31,12 @@ public class Consumer this.cc = cc; } - protected void setSimpleComponent(TestComponent sc) + protected void setTestComponent(TestComponent tc) { - sc.doIt( ); + tc.doIt( ); } - protected void unsetSimpleComponent(ServiceReference<TestComponent> sr) + protected void unsetTestComponent(ServiceReference<TestComponent> sr) { } Modified: felix/trunk/scr/src/test/resources/integration_test_locate.xml URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/resources/integration_test_locate.xml?rev=1691760&r1=1691759&r2=1691760&view=diff ============================================================================== --- felix/trunk/scr/src/test/resources/integration_test_locate.xml (original) +++ felix/trunk/scr/src/test/resources/integration_test_locate.xml Sat Jul 18 18:12:45 2015 @@ -11,7 +11,7 @@ language governing permissions and limitations under the License. --> <components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> - <scr:component name="SimpleComponent" + <scr:component name="TestComponent" configuration-policy="require"> <implementation class="org.apache.felix.scr.integration.components.deadlock.TestComponent" /> <service> @@ -28,17 +28,17 @@ </scr:component> - <scr:component name="AsyncLocate" + <scr:component name="Consumer" immediate="true"> <implementation class="org.apache.felix.scr.integration.components.deadlock.Consumer" /> <reference - name="SimpleComponent" + name="TestComponent" interface="org.apache.felix.scr.integration.components.deadlock.TestComponent" cardinality="0..1" policy="dynamic" - bind="setSimpleComponent" - unbind="unsetSimpleComponent" - target='target="foo"' + bind="setTestComponent" + unbind="unsetTestComponent" + target='(target=foo)' /> </scr:component>
