package org.springframework.roo.classpath.itd; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import org.springframework.roo.model.JavaType; /** * {@link ServiceTracker} to obtain an ItdTriggerBasedMetadataProvider from * the service registry. * * @author Enrique Ruiz at DISID Corporation S.L. */ public class ItdTriggerBasedMetadataProviderTracker extends ServiceTracker<ItdTriggerBasedMetadataProvider, ItdTriggerBasedMetadataProvider> { private final JavaType javaType; /** * Create new ServiceTracker to obtain any ItdTriggerBasedMetadataProvider. * * @param bc Bundle execution context * @param javaType the type-level annotation to detect that will cause * metadata creation (required) */ public ItdTriggerBasedMetadataProviderTracker(BundleContext bc, JavaType javaType) { this(bc, ItdTriggerBasedMetadataProvider.class, javaType); } /** * Create new ServiceTracker to obtain the service subclass of * ItdTriggerBasedMetadataProvider. * * @param bc Bundle execution context * @param clazz the class name of the * {@link ItdTriggerBasedMetadataProvider} to be tracked. * @param javaType the type-level annotation to detect that will cause * metadata creation (required) */ public ItdTriggerBasedMetadataProviderTracker(BundleContext bc, Class<? extends ItdTriggerBasedMetadataProvider> clazz, JavaType javaType) { super(bc, clazz.getName(), null); this.javaType = javaType; } /** * Register a trigger that causes the given service provider will generate * metadata if the {@link #javaType} annotation is present. * * @param ref service provider reference */ @Override public ItdTriggerBasedMetadataProvider addingService( ServiceReference<ItdTriggerBasedMetadataProvider> ref) { ItdTriggerBasedMetadataProvider metadataProvider = super.addingService(ref); metadataProvider.addMetadataTrigger(this.javaType); return metadataProvider; } /** * The {@link ItdTriggerBasedMetadataProvider} service has been removed, so * unregister the trigger of the {@link #javaType}. */ @Override public void removedService(ServiceReference<ItdTriggerBasedMetadataProvider> ref, ItdTriggerBasedMetadataProvider metadataProvider) { metadataProvider.removeMetadataTrigger(this.javaType); super.removedService(ref, metadataProvider); } }