package org.springframework.roo.uaa; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.springframework.roo.shell.ParseResult; import org.springframework.roo.shell.Shell; import org.springframework.roo.shell.event.ShellStatus; import org.springframework.roo.shell.event.ShellStatusListener; import org.springframework.roo.support.osgi.BundleFindingUtils; import org.springframework.uaa.client.UaaService; /** * A {@link ShellStatusListener} which determines the bundle symbolic name an * executed shell command was provided by and registers the use of that feature * in UAA. * * @author Ben Alex * @since 1.1.1 */ @Component(immediate = true) public class ShellListeningUaaRegistrationFacility implements ShellStatusListener { private BundleContext bundleContext; @Reference private Shell shell; @Reference private UaaRegistrationService uaaRegistrationService; @Reference UaaService uaaService; protected void activate(final ComponentContext context) { bundleContext = context.getBundleContext(); shell.addShellStatusListener(this); } protected void deactivate(final ComponentContext context) { shell.removeShellStatusListener(this); } public void onShellStatusChange(final ShellStatus oldStatus, final ShellStatus newStatus) { // Handle registering use of a BSN final ParseResult parseResult = newStatus.getParseResult(); if (parseResult == null) { return; } // We use the target instance as opposed to the declaring method as we // don't want // the fact an add-on type inherited from another type to prevent using // of that add-on // from being detected final String typeName = parseResult.getInstance().getClass().getName(); final String bundleSymbolicName = BundleFindingUtils .findFirstBundleForTypeName(bundleContext, typeName); if (bundleSymbolicName == null) { return; } // UaaRegistrationService deals with determining if the BSN is public // (non-public BSNs are not registered) uaaRegistrationService.registerBundleSymbolicNameUse( bundleSymbolicName, null); } }