package org.springframework.roo.project.packaging;
import java.util.ArrayList;
import java.util.Collection;
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 PackagingProviderRegistry} implementation.
*
* @author Andrew Swan
* @since 1.2.0
*/
@Component
@Service
@Reference(name = "packagingProvider", strategy = ReferenceStrategy.EVENT,
policy = ReferencePolicy.DYNAMIC, referenceInterface = PackagingProvider.class,
cardinality = ReferenceCardinality.MANDATORY_MULTIPLE)
public class PackagingProviderRegistryImpl implements PackagingProviderRegistry {
private final Object mutex = new Object();
// Using a map avoids each PackagingProvider having to implement equals()
// properly (when removing)
private final Map<String, PackagingProvider> packagingProviders =
new HashMap<String, PackagingProvider>();
protected void bindPackagingProvider(final PackagingProvider packagingProvider) {
synchronized (mutex) {
final PackagingProvider previousPackagingProvider =
packagingProviders.put(packagingProvider.getId(), packagingProvider);
Validate.isTrue(previousPackagingProvider == null,
"More than one PackagingProvider with ID = '%s'", packagingProvider.getId());
}
}
public Collection<PackagingProvider> getAllPackagingProviders() {
return new ArrayList<PackagingProvider>(packagingProviders.values());
}
public PackagingProvider getDefaultPackagingProvider() {
PackagingProvider defaultCoreProvider = null;
for (final PackagingProvider packagingProvider : packagingProviders.values()) {
if (packagingProvider.isDefault()) {
if (packagingProvider instanceof CorePackagingProvider) {
defaultCoreProvider = packagingProvider;
} else {
return packagingProvider;
}
}
}
Validate.validState(defaultCoreProvider != null,
"Should have found a default core PackagingProvider");
return defaultCoreProvider;
}
public PackagingProvider getPackagingProvider(final String id) {
for (final PackagingProvider packagingProvider : packagingProviders.values()) {
if (packagingProvider.getId().equalsIgnoreCase(id)) {
return packagingProvider;
}
}
return null;
}
protected void unbindPackagingProvider(final PackagingProvider packagingProvider) {
synchronized (mutex) {
packagingProviders.remove(packagingProvider.getId());
}
}
}