package com.liferay.cli.shell.osgi; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.Validate; 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; /** * The {@link ExternalConsoleProviderRegistry} implementation. * * @author Gregory Amerson */ @Component @Service @Reference( name = "externalShellProvider", strategy = ReferenceStrategy.EVENT, policy = ReferencePolicy.DYNAMIC, referenceInterface = ExternalConsoleProvider.class, cardinality = ReferenceCardinality.MANDATORY_MULTIPLE ) public class ExternalConsoleProviderRegistryImpl implements ExternalConsoleProviderRegistry { private final Object mutex = new Object(); // Using a map avoids each ExternalShellProvider having to implement equals() // properly (when removing) private final Map<String, ExternalConsoleProvider> externalShellProviders = new HashMap<String, ExternalConsoleProvider>(); protected void bindExternalShellProvider( final ExternalConsoleProvider externalShellProvider ) { synchronized( mutex ) { final ExternalConsoleProvider previousExternalShellProvider = externalShellProviders.put( externalShellProvider.getId(), externalShellProvider ); Validate.isTrue( previousExternalShellProvider == null, "More than one ExternalShellProvider with ID = '%s'", externalShellProvider.getId() ); } } public ExternalConsoleProvider getExternalShellProvider() { ExternalConsoleProvider retval = null; for( final ExternalConsoleProvider externalShellProvider : externalShellProviders.values() ) { if( externalShellProvider.isValid() ) { retval = externalShellProvider; break; } } Validate.validState( retval != null, "Should have found a valid ExternalShellProvider" ); return retval; } public ExternalConsoleProvider getExternalShellProvider( final String id ) { for( final ExternalConsoleProvider externalShellProvider : externalShellProviders.values() ) { if( externalShellProvider.getId().equalsIgnoreCase( id ) ) { return externalShellProvider; } } return null; } protected void unbindExternalShellProvider( final ExternalConsoleProvider externalShellProvider ) { synchronized( mutex ) { externalShellProviders.remove( externalShellProvider.getId() ); } } }