001package co.codewizards.cloudstore.ls.server.cproc;
002
003import static co.codewizards.cloudstore.core.oio.OioFileFactory.*;
004import static co.codewizards.cloudstore.core.util.Util.*;
005import static java.util.Objects.*;
006
007import java.io.IOException;
008import java.lang.reflect.Constructor;
009import java.lang.reflect.InvocationTargetException;
010
011import org.slf4j.Logger;
012import org.slf4j.LoggerFactory;
013
014import ch.qos.logback.classic.LoggerContext;
015import ch.qos.logback.classic.joran.JoranConfigurator;
016import ch.qos.logback.core.joran.spi.JoranException;
017import ch.qos.logback.core.util.StatusPrinter;
018import co.codewizards.cloudstore.core.appid.AppIdRegistry;
019import co.codewizards.cloudstore.core.config.ConfigDir;
020import co.codewizards.cloudstore.core.oio.File;
021import co.codewizards.cloudstore.core.util.DebugUtil;
022import co.codewizards.cloudstore.core.util.DerbyUtil;
023import co.codewizards.cloudstore.core.util.MainArgsUtil;
024import co.codewizards.cloudstore.ls.server.LocalServer;
025
026public class LocalServerMain {
027        private static Class<? extends LocalServer> localServerClass = LocalServer.class;
028
029        private static final Logger logger = LoggerFactory.getLogger(LocalServerMain.class);
030
031        protected LocalServerMain() {
032        }
033
034        public static void main(String[] args) throws Exception {
035                initLogging();
036
037                try {
038                        args = MainArgsUtil.extractAndApplySystemPropertiesReturnOthers(args);
039                        final LocalServer localServer = createLocalServer();
040                        localServer.setLocalServerStopFileEnabled(true);
041                        localServer.start();
042                } catch (final Throwable x) {
043                        logger.error(x.toString(), x);
044                        System.exit(999);
045                }
046        }
047
048        public static Class<? extends LocalServer> getLocalServerClass() {
049                return localServerClass;
050        }
051        public static void setLocalServerClass(final Class<? extends LocalServer> localServerClass) {
052                LocalServerMain.localServerClass = requireNonNull(localServerClass, "localServerClass");
053        }
054
055        protected static Constructor<? extends LocalServer> getLocalServerConstructor() throws NoSuchMethodException, SecurityException {
056                final Class<? extends LocalServer> clazz = getLocalServerClass();
057                final Constructor<? extends LocalServer> constructor = clazz.getConstructor();
058                return constructor;
059        }
060
061        protected static LocalServer createLocalServer() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
062                final Constructor<? extends LocalServer> constructor = getLocalServerConstructor();
063                final LocalServer cloudStoreServer = constructor.newInstance();
064                return cloudStoreServer;
065        }
066
067        private static void initLogging() throws IOException, JoranException {
068                final File logDir = ConfigDir.getInstance().getLogDir();
069                DerbyUtil.setLogFile(createFile(logDir, "derby.log"));
070
071                final String logbackXmlName = "logback.localserver.xml";
072                final File logbackXmlFile = createFile(ConfigDir.getInstance().getFile(), logbackXmlName);
073                if (!logbackXmlFile.exists()) {
074                        AppIdRegistry.getInstance().copyResourceResolvingAppId(
075                                        LocalServerMain.class, logbackXmlName, logbackXmlFile);
076                }
077
078                final LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
079            try {
080              final JoranConfigurator configurator = new JoranConfigurator();
081              configurator.setContext(context);
082              // Call context.reset() to clear any previous configuration, e.g. default
083              // configuration. For multi-step configuration, omit calling context.reset().
084              context.reset();
085              configurator.doConfigure(logbackXmlFile.getIoFile());
086            } catch (final JoranException je) {
087                // StatusPrinter will handle this
088                doNothing();
089            }
090            StatusPrinter.printInCaseOfErrorsOrWarnings(context);
091            DebugUtil.logSystemProperties();
092        }
093}