package ameba;
import ameba.container.Container;
import ameba.core.Application;
import ameba.exception.AmebaException;
import ameba.i18n.Messages;
import ameba.util.IOUtils;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* <p>Ameba class.</p>
*
* @author icode
*
*/
public class Ameba {
private static final String LINE = System.getProperty("line.separator", "/n");
/**
* Constant <code>LOGO="LINE + LINE + _ _ "{trunked}</code>
*/
public static final String LOGO = LINE + LINE +
" _ _ " + LINE +
" / \\ _ __ ___ ___| |__ __ _ " + LINE +
" / _ \\ | '_ ` _ \\ / _ \\ '_ \\ / _` |" + LINE +
" / ___ \\| | | | | | __/ |_) | (_| |" + LINE +
"/_/ \\_\\_| |_| |_|\\___|_.__/ \\__,_| {}" + LINE + LINE;
/**
* Constant <code>logger</code>
*/
private static final Logger logger = LoggerFactory.getLogger(Ameba.class);
private static Application app;
private static Container container;
private static String version;
private Ameba() {
}
/**
* <p>getInjectionManager.</p>
*
* @return a InjectionManager object.
*/
public static InjectionManager getInjectionManager() {
return container.getInjectionManager();
}
/**
* <p>Getter for the field <code>container</code>.</p>
*
* @return a {@link ameba.container.Container} object.
* @since 0.1.6e
*/
public static Container getContainer() {
return container;
}
/**
* <p>Getter for the field <code>app</code>.</p>
*
* @return a {@link ameba.core.Application} object.
*/
public static Application getApp() {
return app;
}
/**
* <p>Getter for the field <code>version</code>.</p>
*
* @return a {@link java.lang.String} object.
* @since 0.1.6e
*/
public static String getVersion() {
if (version == null) {
version = IOUtils.getJarImplVersion(Ameba.class);
}
return version;
}
/**
* <p>printInfo.</p>
*
* @since 0.1.6e
*/
public static void printInfo() {
logger.info(LOGO, getVersion());
}
/**
* <p>main.</p>
*
* @param args an array of {@link java.lang.String} objects.
*/
public static void main(String[] args) {
// register shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(Ameba::shutdown, "AmebaShutdownHook"));
List<String> list = Lists.newArrayList();
String idCommand = "--#";
int idArgLen = idCommand.length();
for (String arg : args) {
if (arg.startsWith(idCommand)) {
String idConf = arg.substring(idArgLen);
if (StringUtils.isNotBlank(idConf)) {
list.add(idConf);
}
}
}
try {
bootstrap(list.toArray(new String[list.size()]));
} catch (Throwable e) {
logger.error(Messages.get("info.service.error.startup"), e);
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
//no op
}
shutdown();
System.exit(500);
}
try {
Thread.currentThread().join();
} catch (InterruptedException e) {
//no op
}
}
/**
* <p>bootstrap.</p>
*
* @param ids a {@link java.lang.String} object.
* @throws java.lang.Exception if any.
*/
public static void bootstrap(String... ids) throws Exception {
bootstrap(new Application(ids));
}
/**
* <p>bootstrap.</p>
*
* @param application a {@link ameba.core.Application} object.
* @throws java.lang.Exception if any.
*/
public static synchronized void bootstrap(Application application) throws Exception {
if (Ameba.container != null) {
throw new AmebaException(Messages.get("info.service.start"));
}
app = application;
container = Container.create(app);
// run
logger.info(Messages.get("info.service.start"));
container.start();
}
/**
* <p>shutdown.</p>
*/
public static synchronized void shutdown() {
logger.info(Messages.get("info.service.shutdown"));
if (container != null)
try {
container.shutdown();
} catch (Exception e) {
logger.error(Messages.get("info.service.error.shutdown"), e);
}
logger.info(Messages.get("info.service.shutdown.done"));
}
}