package sk.stuba.fiit.perconik.core.services.resources; import javax.annotation.Nullable; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import sk.stuba.fiit.perconik.core.Listener; import sk.stuba.fiit.perconik.core.Resource; import sk.stuba.fiit.perconik.core.services.resources.ResourceProvider.Builder; import static java.util.Arrays.asList; /** * Static utility methods pertaining to {@link ResourceProvider} instances. * Also see this class's counterparts {@link ResourceServices} * and {@link ResourceManagers}. * * @author Pavol Zbell * @since 1.0 */ public final class ResourceProviders { // TODO add javadocs private ResourceProviders() {} public static ResourceProvider superResourceProvider() { return SuperResourceProvider.getInstance(); } public static Builder builder() { return StandardResourceProvider.builder(); } public static Builder builder(@Nullable final ResourceProvider parent) { Builder builder = builder(); if (parent != null) { builder.parent(parent); } return builder; } public static ResourceNamesSupplier supplier(final ResourceProvider provider) { return new ResourceNamesSupplier() { public SetMultimap<Class<? extends Listener>, String> get() { return toResourceNamesMultimap(provider); } }; } public static ResourceNamesSupplier merge(final ResourceNamesSupplier ... suppliers) { return merge(asList(suppliers)); } public static ResourceNamesSupplier merge(final Iterable<ResourceNamesSupplier> suppliers) { return new ResourceNamesSupplier() { public SetMultimap<Class<? extends Listener>, String> get() { SetMultimap<Class<? extends Listener>, String> names = HashMultimap.create(); for (ResourceNamesSupplier supplier: suppliers) { names.putAll(supplier.get()); } return names; } }; } public static SetMultimap<Class<? extends Listener>, String> toResourceNamesMultimap(final ResourceProvider provider) { SetMultimap<Class<? extends Listener>, String> names = HashMultimap.create(); for (Class<? extends Listener> type: provider.types()) { for (Resource<?> resource: provider.forType(type)) { names.put(type, resource.getName()); } } return names; } }