package denominator; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import feign.Logger; import static feign.Util.emptyToNull; public final class DNSApiManagerFactory { public static DNSApiManager create(denominator.Provider provider) { List<Object> modules = new ArrayList<Object>(2); modules.add(credentialsModule(provider)); for (Class<?> inner : provider.getClass().getDeclaredClasses()) { if (inner.getSimpleName().equals("FeignModule")) { modules.add(new HttpLog()); } } return Denominator.create(provider, modules.toArray()); } /** * Looks for {@link denominator.Provider#credentialTypeToParameterNames() credential parameters} * in system properties as {@code ${provider.name}.${parameter}. */ static Object credentialsModule(denominator.Provider provider) { Map<String, String> credentials = new LinkedHashMap<String, String>(3); for (Collection<String> parameters : provider.credentialTypeToParameterNames().values()) { for (String parameter : parameters) { String systemProperty = provider.name() + "." + parameter; String value = emptyToNull(System.getProperty(systemProperty)); if (value != null) { credentials.put(parameter, value); } } } return CredentialsConfiguration.credentials(Credentials.MapCredentials.from(credentials)); } @Module(overrides = true, library = true) public static final class HttpLog { @Provides @Singleton Logger.Level provideLevel() { return Logger.Level.FULL; } @Provides @Singleton Logger provideLogger() { new File(System.getProperty("user.dir"), "build").mkdirs(); return new Logger.JavaLogger().appendToFile("build/http-wire.log"); } } }