package denominator; import java.util.ArrayList; import java.util.List; import dagger.ObjectGraph; /** * Entry-point to create instances of {@link DNSApiManager} * * ex. * * <pre> * import static denominator.CredentialsConfiguration.credentials; * * ... * * ultraDns = Denominator.create(new UltraDNSProvider(), credentials(username, password)); * </pre> * * <br> <br> <b>Alternative</b><br> * * This class implies use of reflection to lookup the dagger module associated with the provider. * You can alternatively not use this class and instead use dagger directly. * * ex. * * <pre> * import static denominator.CredentialsConfiguration.credentials; * import static denominator.Providers.provide; * * ... * * ultraDns = ObjectGraph.create(provider(new UltraDNSProvider()), * new UltraDNSProvider.Module(), * credentials(username, password)).get(DNSApiManager.class); * </pre> */ public final class Denominator { /** * @deprecated use {@link Providers#list()}. to be removed in denominator 4. */ @Deprecated public static Iterable<Provider> providers() { return Providers.list(); } /** * Creates a new manager for a provider using its type, such as {@link * denominator.mock.MockProvider}. * * ex. * * <pre> * ultraDns = Denominator.create(new UltraDNSProvider(), credentials(username, password)); * </pre> * * @throws IllegalArgumentException if the input provider is misconfigured or expects * credentials. * @see CredentialsConfiguration * @see #providers */ public static DNSApiManager create(Provider in, Object... modules) { Object[] modulesForGraph = modulesForGraph(in, modules).toArray(); try { return ObjectGraph.create(modulesForGraph).get(DNSApiManager.class); } catch (IllegalStateException e) { // much simpler to special-case when a credential module is needed, // but not supplied, than do too much magic. if (e.getMessage().contains("denominator.Credentials could not be bound") && !in.credentialTypeToParameterNames().isEmpty()) { throw new IllegalArgumentException(CredentialsConfiguration.exceptionMessage(null, in)); } throw e; } } private static List<Object> modulesForGraph(Provider in, Object... modules) { List<Object> modulesForGraph = new ArrayList<Object>(3); modulesForGraph.add(Providers.provide(in)); modulesForGraph.add(Providers.instantiateModule(in)); if (modules != null) { for (Object module : modules) { modulesForGraph.add(module); } } return modulesForGraph; } /** * Creates a new manager for a provider, based on key look up from {@link #providers()}. * * Ex. {@code mock} * * <pre> * route53 = Denominator.create("route53", credentials(accesskey, secretkey)); * </pre> * * @throws IllegalArgumentException if the providerName is not configured, or its corresponding * {@link Provider} is misconfigured or expects credentials. * @see Provider#name() * @see CredentialsConfiguration */ public static DNSApiManager create(String providerName, Object... modules) throws IllegalArgumentException { Provider matchedProvider = Providers.getByName(providerName); return create(matchedProvider, modules); } /** * @deprecated use {@link Providers#provide}. to be removed in denominator 4. */ public static Object provider(denominator.Provider provider) { return Providers.provide(provider); } public static enum Version { INSTANCE; private final String version; private Version() { this.version = Version.class.getPackage().getSpecificationVersion(); } @Override public String toString() { return version; } } }