package denominator.denominatord; import com.squareup.okhttp.mockwebserver.MockWebServer; import java.io.IOException; import java.util.logging.ConsoleHandler; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import dagger.Module; import dagger.Provides; import denominator.DNSApiManager; import denominator.Denominator; import denominator.Provider; import denominator.Providers; import feign.Feign; import static denominator.CredentialsConfiguration.anonymous; import static denominator.CredentialsConfiguration.credentials; import static denominator.common.Preconditions.checkArgument; import static java.lang.System.currentTimeMillis; public class DenominatorD { private static final String SYNTAX = "syntax: provider credentialArg1 credentialArg2 ..."; private static final Logger log = Logger.getLogger(DenominatorD.class.getName()); private final MockWebServer server; public DenominatorD(DNSApiManager mgr) { this.server = new MockWebServer(); server.setDispatcher(new DenominatorDispatcher(mgr, new JsonCodec())); } public int start() throws IOException { server.start(); return server.getPort(); } public void start(int port) throws IOException { server.start(port); } public void shutdown() throws IOException { server.shutdown(); } /** * Presents a {@link DenominatorDApi REST api} to users, by default listening on port 8080. */ public static void main(final String... args) throws IOException { checkArgument(args.length > 0, SYNTAX); setupLogging(); String portOverride = System.getenv("DENOMINATORD_PORT"); int port = portOverride != null ? Integer.parseInt(portOverride) : 8080; Provider provider = Providers.getByName(args[0]); log.info("proxying " + provider); Object credentials = credentialsFromArgs(args); DNSApiManager mgr = Denominator.create(provider, credentials, new JavaLogger()); new DenominatorD(mgr).start(port); } static Object credentialsFromArgs(String[] args) { switch (args.length) { case 4: return credentials(args[1], args[2], args[3]); case 3: return credentials(args[1], args[2]); case 1: return anonymous(); default: throw new IllegalArgumentException(SYNTAX); } } @Module(library = true, overrides = true) static class JavaLogger { @Provides feign.Logger.Level provideLevel() { return feign.Logger.Level.BASIC; } @Provides feign.Logger logger() { return new feign.Logger.JavaLogger(); } } static void setupLogging() { final long start = currentTimeMillis(); ConsoleHandler handler = new ConsoleHandler(); handler.setLevel(Level.FINE); handler.setFormatter(new Formatter() { @Override public String format(LogRecord record) { return String.format("%7d - %s%n", record.getMillis() - start, record.getMessage()); } }); Logger[] loggers = { Logger.getLogger(DenominatorD.class.getPackage().getName()), Logger.getLogger(feign.Logger.class.getName()), Logger.getLogger(MockWebServer.class.getName()) }; for (Logger logger : loggers) { logger.setLevel(Level.FINE); logger.setUseParentHandlers(false); logger.addHandler(handler); } } }