package org.springframework.roo.converters; import java.util.List; import org.apache.felix.bundlerepository.Repository; import org.apache.felix.bundlerepository.RepositoryAdmin; import org.apache.felix.bundlerepository.Resource; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.osgi.framework.Bundle; import org.osgi.service.component.ComponentContext; import org.springframework.roo.felix.BundleSymbolicName; import org.springframework.roo.felix.HttpPgpUrlStreamHandlerService; import org.springframework.roo.shell.Completion; import org.springframework.roo.shell.Converter; import org.springframework.roo.shell.MethodTarget; /** * {@link Converter} for {@link BundleSymbolicName}. * * @author Ben Alex * @since 1.0 */ @Component @Service public class BundleSymbolicNameConverter implements Converter<BundleSymbolicName> { private ComponentContext context; // Handler service field is solely to ensure it starts before // BundleSymbolicNameConverter @Reference protected HttpPgpUrlStreamHandlerService handlerService; @Reference private RepositoryAdmin repositoryAdmin; protected void activate(final ComponentContext context) { this.context = context; } public BundleSymbolicName convertFromText(final String value, final Class<?> requiredType, final String optionContext) { return new BundleSymbolicName(value.trim()); } protected void deactivate(final ComponentContext context) { this.context = null; } public boolean getAllPossibleValues(final List<Completion> completions, final Class<?> requiredType, final String originalUserInput, final String optionContext, final MethodTarget target) { boolean local = false; boolean obr = false; if ("".equals(optionContext)) { local = true; } if (optionContext.contains("local")) { local = true; } if (optionContext.contains("obr")) { obr = true; } if (local) { final Bundle[] bundles = context.getBundleContext().getBundles(); if (bundles != null) { for (final Bundle bundle : bundles) { final String bsn = bundle.getSymbolicName(); if (bsn != null && bsn.startsWith(originalUserInput)) { completions.add(new Completion(bsn)); } } } } if (obr) { final Repository[] repositories = repositoryAdmin.listRepositories(); if (repositories != null) { for (final Repository repository : repositories) { final Resource[] resources = repository.getResources(); if (resources != null) { for (final Resource resource : resources) { if (resource.getSymbolicName().startsWith(originalUserInput)) { completions.add(new Completion(resource.getSymbolicName())); } } } } } } return false; } public boolean supports(final Class<?> requiredType, final String optionContext) { return BundleSymbolicName.class.isAssignableFrom(requiredType); } }