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}