/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.core.internal.CoreErrorCode;
import org.seedstack.seed.core.internal.ToolLauncher;
import org.seedstack.seed.spi.SeedLauncher;
import java.util.List;
import java.util.ServiceLoader;
/**
* <p>
* Main Seed Java application entry point. It searches classes implementing {@link SeedLauncher} through the
* {@link ServiceLoader} mechanism. If no class or more than one class is found, it throws an exception. If exactly one
* class is found, it delegates the Seed application startup to its {@link SeedLauncher#launch(String[])} method.
* </p>
* <p>
* High-level exception handling and diagnostic is done directly in this class.
* </p>
*/
public class SeedMain {
/**
* Entry point of Seed standalone applications (launched from the command-line).
*
* @param args The command-line arguments.
*/
public static void main(String[] args) {
String toolName = System.getProperty("seedstack.tool");
SeedLauncher seedLauncher;
if (!Strings.isNullOrEmpty(toolName)) {
seedLauncher = getToolLauncher(toolName);
} else {
seedLauncher = getLauncher();
}
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
seedLauncher.shutdown();
Seed.close();
} catch (Exception e) {
handleException(e);
}
}, "shutdown"));
try {
seedLauncher.launch(args);
} catch (Exception e) {
handleException(e);
System.exit(-1);
}
}
/**
* Discover implementations of {@link SeedLauncher} through the {@link ServiceLoader} mechanism and if exactly one
* implementation is available, returns it. Otherwise, throws an exception.
*
* @return an instance of the unique {@link SeedLauncher} implementation.
*/
public static SeedLauncher getLauncher() {
List<SeedLauncher> entryPointServices = Lists.newArrayList(ServiceLoader.load(SeedLauncher.class));
if (entryPointServices.size() < 1) {
throw SeedException.createNew(CoreErrorCode.MISSING_SEED_LAUNCHER);
} else if (entryPointServices.size() > 1) {
throw SeedException.createNew(CoreErrorCode.MULTIPLE_SEED_LAUNCHERS);
}
return entryPointServices.get(0);
}
/**
* Returns an instance of the {@link ToolLauncher} configured for the specified tool.
*
* @param toolName the tool to execute.
* @return the {@link ToolLauncher} instance.
*/
public static SeedLauncher getToolLauncher(String toolName) {
return new ToolLauncher(toolName);
}
private static void handleException(Exception e) {
Seed.diagnostic().dumpDiagnosticReport(e);
if (e instanceof SeedException) {
e.printStackTrace(System.err);
} else {
SeedException.wrap(e, CoreErrorCode.UNEXPECTED_EXCEPTION).printStackTrace(System.err);
}
}
}