package co.codewizards.cloudstore.ls.server.cproc;
import static co.codewizards.cloudstore.core.oio.OioFileFactory.*;
import static co.codewizards.cloudstore.core.util.AssertUtil.*;
import static co.codewizards.cloudstore.core.util.Util.*;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.util.StatusPrinter;
import co.codewizards.cloudstore.core.appid.AppIdRegistry;
import co.codewizards.cloudstore.core.config.ConfigDir;
import co.codewizards.cloudstore.core.oio.File;
import co.codewizards.cloudstore.core.util.DerbyUtil;
import co.codewizards.cloudstore.core.util.MainArgsUtil;
import co.codewizards.cloudstore.ls.server.LocalServer;
public class LocalServerMain {
private static Class<? extends LocalServer> localServerClass = LocalServer.class;
private static final Logger logger = LoggerFactory.getLogger(LocalServerMain.class);
protected LocalServerMain() {
}
public static void main(String[] args) throws Exception {
initLogging();
try {
args = MainArgsUtil.extractAndApplySystemPropertiesReturnOthers(args);
final LocalServer localServer = createLocalServer();
localServer.setLocalServerStopFileEnabled(true);
localServer.start();
} catch (final Throwable x) {
logger.error(x.toString(), x);
System.exit(999);
}
}
public static Class<? extends LocalServer> getLocalServerClass() {
return localServerClass;
}
public static void setLocalServerClass(final Class<? extends LocalServer> localServerClass) {
LocalServerMain.localServerClass = assertNotNull(localServerClass, "localServerClass");
}
protected static Constructor<? extends LocalServer> getLocalServerConstructor() throws NoSuchMethodException, SecurityException {
final Class<? extends LocalServer> clazz = getLocalServerClass();
final Constructor<? extends LocalServer> constructor = clazz.getConstructor();
return constructor;
}
protected static LocalServer createLocalServer() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
final Constructor<? extends LocalServer> constructor = getLocalServerConstructor();
final LocalServer cloudStoreServer = constructor.newInstance();
return cloudStoreServer;
}
private static void initLogging() throws IOException, JoranException {
final File logDir = ConfigDir.getInstance().getLogDir();
DerbyUtil.setLogFile(createFile(logDir, "derby.log"));
final String logbackXmlName = "logback.localserver.xml";
final File logbackXmlFile = createFile(ConfigDir.getInstance().getFile(), logbackXmlName);
if (!logbackXmlFile.exists()) {
AppIdRegistry.getInstance().copyResourceResolvingAppId(
LocalServerMain.class, logbackXmlName, logbackXmlFile);
}
final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
try {
final JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
// Call context.reset() to clear any previous configuration, e.g. default
// configuration. For multi-step configuration, omit calling context.reset().
context.reset();
configurator.doConfigure(logbackXmlFile.getIoFile());
} catch (final JoranException je) {
// StatusPrinter will handle this
doNothing();
}
StatusPrinter.printInCaseOfErrorsOrWarnings(context);
}
}