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}