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);
}
}