package net.jhorstmann.i18n; import net.jhorstmann.i18n.impl.DefaultResourceBundleProviderFactory; import java.util.List; import java.util.ServiceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class ResourceBundleProviderFactory { private static final Logger log = LoggerFactory.getLogger(ResourceBundleProviderFactory.class); private static final ResourceBundleProviderFactory DEFAULT_INSTANCE = new DefaultResourceBundleProviderFactory(); private static List<ResourceBundleProviderFactory> instances; /** * Loads a {@link ResourceBundleProviderFactory} using Java's {@link java.util.ServiceLoader} infrastructure. * @return */ public static ResourceBundleProviderFactory newInstance() { if (instances == null) { instances = ServiceLoaderHelper.load(ResourceBundleProviderFactory.class.getClassLoader(), ResourceBundleProviderFactory.class); log.debug("Found {} ResourceBundleProviderFactories",instances.size()); } for (ResourceBundleProviderFactory factory : instances) { if (factory.isEnvironmentSupported()) { return factory; } } log.debug("no registered ResourceBundleProviderFactory found, returning default provider-factory"); return DEFAULT_INSTANCE; } /** * Return whether this {@link ResourceBundleProviderFactory} is usable in this environment. * This makes it possible to configure multiple implementations in a project where * one is used when run as a webapp and another one for scripts and tests. * @return */ public abstract ResourceBundleProvider newResourceBundleProvider(); public abstract boolean isEnvironmentSupported(); }