package com.cadrlife.devsearch.agent.action; import com.cadrlife.devsearch.agent.Agent; import com.cadrlife.devsearch.agent.AgentModule; import com.cadrlife.devsearch.agent.UpdateScope; import com.google.common.base.Throwables; import com.google.common.collect.Sets; import com.google.inject.Guice; import com.google.inject.Injector; import joptsimple.ArgumentAcceptingOptionSpec; import joptsimple.OptionParser; import joptsimple.OptionSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.PrintStream; import java.util.Set; public abstract class AgentAction { protected OptionParser optionParser = new OptionParser(); protected ArgumentAcceptingOptionSpec<String> configFileOption = optionParser.accepts("config-file").withRequiredArg().ofType(String.class); protected ArgumentAcceptingOptionSpec<String> checkoutPathOption = optionParser.accepts("checkout-path").withRequiredArg().ofType(String.class); protected ArgumentAcceptingOptionSpec<String> repoNameOption = optionParser.accepts("repo-name").withRequiredArg().ofType(String.class); protected ArgumentAcceptingOptionSpec<String> projectNameOption = optionParser.accepts("project-name").withOptionalArg().defaultsTo(UpdateScope.ALL_PROJECTS).ofType(String.class); protected ArgumentAcceptingOptionSpec<String> excludeOption = optionParser.accepts("exclude").withOptionalArg().ofType(String.class).defaultsTo(""); protected ArgumentAcceptingOptionSpec<Integer> threadCountOption = optionParser.accepts("thread-count").withOptionalArg().ofType(Integer.class).defaultsTo(6); protected UpdateScope updateScope; protected OptionSet options; protected Logger LOG = LoggerFactory.getLogger(getClass()); public AgentAction() { optionParser.accepts("clean"); } private boolean clean; public abstract String getName(); public boolean isClean() { return clean; } public void setClean(boolean clean) { this.clean = clean; } public abstract void localExecute(Agent agent) throws Exception; public final void execute(String[] args, AgentModule agentModule) { // optionParser. options = optionParser.parse(args); // options. String repoName = options.valueOf(repoNameOption); String projectName = options.valueOf(projectNameOption); Set<String> excluded = Sets.newHashSet(options.valueOf(excludeOption).split(",")); excluded.remove(""); updateScope = new UpdateScope(repoName, projectName, excluded); agentModule.setConfigFile(options.valueOf(configFileOption)); agentModule.setCheckoutPath(options.valueOf(checkoutPathOption)); // if (options.has(threadCountOption)) { agentModule.setThreadCount(options.valueOf(threadCountOption)); // } Injector injector = Guice.createInjector(agentModule); setClean(options.has("exclude") || options.has("clean")); try (Agent agent = injector.getInstance(Agent.class)) { localExecute(agent); } catch (Exception e) { Throwables.propagate(e); } } public void printHelpOn(PrintStream out) throws IOException { optionParser.printHelpOn(out); } }