package org.springframework.roo.addon.web.mvc.embedded; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferencePolicy; import org.apache.felix.scr.annotations.ReferenceStrategy; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.project.FeatureNames; import org.springframework.roo.project.ProjectOperations; import org.springframework.roo.support.logging.HandlerUtils; /** * Implementation of {@link EmbeddedOperations). * * @author Stefan Schmidt * @since 1.1 */ @Service @Component @Reference(name = "embeddedProvider", strategy = ReferenceStrategy.EVENT, policy = ReferencePolicy.DYNAMIC, referenceInterface = EmbeddedProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE) public class EmbeddedOperationsImpl implements EmbeddedOperations { private static final Logger LOGGER = HandlerUtils.getLogger(EmbeddedOperationsImpl.class); private final Object mutex = new Object(); @Reference private ProjectOperations projectOperations; private final Set<EmbeddedProvider> providers = new HashSet<EmbeddedProvider>(); protected void bindEmbeddedProvider(final EmbeddedProvider provider) { synchronized (mutex) { providers.add(provider); } } public boolean embed(final String url, final String viewName) { for (final EmbeddedProvider provider : getEmbeddedProviders()) { if (provider.embed(url, viewName)) { return true; } } LOGGER.warning("Could not find a matching provider for this URL"); return false; } private Set<EmbeddedProvider> getEmbeddedProviders() { synchronized (mutex) { return Collections.unmodifiableSet(providers); } } public boolean install(final String viewName, final Map<String, String> options) { for (final EmbeddedProvider provider : getEmbeddedProviders()) { if (provider.install(viewName, options)) { return true; } } LOGGER.warning("Could not find a matching implementation for this 'web mvc embed' type"); return false; } public boolean isEmbeddedInstallationPossible() { return projectOperations.isFocusedProjectAvailable() && !projectOperations.isFeatureInstalled(FeatureNames.JSF); } protected void unbindEmbeddedProvider(final EmbeddedProvider provider) { synchronized (mutex) { if (providers.contains(provider)) { providers.remove(provider); } } } }