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