package net.pterodactylus.rhynodge.engine;
-import java.io.FileInputStream;
import java.io.IOException;
+import java.util.Arrays;
import net.pterodactylus.rhynodge.actions.EmailAction;
import net.pterodactylus.rhynodge.loader.ChainWatcher;
-import net.pterodactylus.rhynodge.states.StateManager;
+import net.pterodactylus.rhynodge.loader.ChainWatcher.ChainDirectory;
+import net.pterodactylus.rhynodge.states.StateManager.StateDirectory;
+import net.pterodactylus.util.envopt.Parser;
+import net.pterodactylus.util.inject.ObjectBinding;
-import com.lexicalscope.jewel.cli.CliFactory;
-import com.lexicalscope.jewel.cli.Option;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
/**
* Rhynodge main starter class.
* Command-line arguments
*/
public static void main(String... arguments) throws IOException {
+ Options options = Parser.fromSystemEnvironment().parseEnvironment(Options::new);
+ EmailAction errorEmailAction =
+ createErrorEmailAction(options.smtpHostname, options.errorEmailSender, options.errorEmailRecipient);
- /* parse command line. */
- Parameters parameters = CliFactory.parseArguments(Parameters.class, arguments);
- Configuration configuration = loadConfiguration(parameters.getConfigurationFile());
-
- /* create the state manager. */
- StateManager stateManager = new StateManager(parameters.getStateDirectory());
-
- /* create the engine. */
- Engine engine = new Engine(stateManager, createErrorEmailAction(configuration));
+ Injector injector = Guice.createInjector(Arrays.asList(
+ ObjectBinding.forClass(StateDirectory.class).is(StateDirectory.of(options.stateDirectory)),
+ ObjectBinding.forClass(ChainDirectory.class).is(ChainDirectory.of(options.chainDirectory)),
+ ObjectBinding.forClass(EmailAction.class).is(errorEmailAction)
+ ));
/* start a watcher. */
- ChainWatcher chainWatcher = new ChainWatcher(engine, parameters.getChainDirectory());
- chainWatcher.start();
- }
-
- private static Configuration loadConfiguration(String configurationFile) throws IOException {
- try (FileInputStream configInputStream = new FileInputStream(configurationFile)) {
- return Configuration.from(configInputStream);
- }
+ ChainWatcher chainWatcher = injector.getInstance(ChainWatcher.class);
+ chainWatcher.startAsync().awaitTerminated();
}
- private static EmailAction createErrorEmailAction(Configuration configuration) {
- return new EmailAction(configuration.getSmtpHostname(), configuration.getErrorEmailSender(), configuration.getErrorEmailRecipient());
- }
-
- /**
- * Definition of the command-line parameters.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
- */
- private static interface Parameters {
-
- /**
- * Returns the directory to watch for chains.
- *
- * @return The chain directory
- */
- @Option(defaultValue = "chains", longName = "chains", shortName = "c", description = "The directory to watch for chains")
- String getChainDirectory();
-
- /**
- * Returns the directory to store states in.
- *
- * @return The states directory
- */
- @Option(defaultValue = "states", longName = "states", shortName = "s", description = "The directory to store states in")
- String getStateDirectory();
-
- @Option(defaultValue = "/etc/rhynodge/rhynodge.json", longName = "config", shortName = "C", description = "The name of the configuration file")
- String getConfigurationFile();
-
+ private static EmailAction createErrorEmailAction(String smtpHostname, String errorEmailSender, String errorEmailRecipient) {
+ return new EmailAction(smtpHostname, errorEmailSender, errorEmailRecipient);
}
}