private ProcessEntryPoint(Props props, int processNumber, File sharedDir, SystemExit exit, ProcessCommands commands) { this.props = props; this.processKey = props.nonNullValue(PROPERTY_PROCESS_KEY); this.processNumber = processNumber; this.sharedDir = sharedDir; this.exit = exit; this.commands = commands; this.stopWatcher = new StopWatcher(commands, this); }
@Override public void run() { exit.setInShutdownHook(); stop(); } });
public static ProcessEntryPoint createForArguments(String[] args) { Props props = ConfigurationUtils.loadPropsFromCommandLineArgs(args); File sharedDir = getSharedDir(props); int processNumber = getProcessNumber(props); ProcessCommands commands = DefaultProcessCommands.main(sharedDir, processNumber); return new ProcessEntryPoint(props, processNumber, sharedDir, new SystemExit(), commands); }
@Override public void accept(Props props) { File homeDir = props.nonNullValueAsFile(PATH_HOME.getKey()); Provider provider = resolveProviderAndEnforceNonnullJdbcUrl(props); String url = props.value(JDBC_URL.getKey()); checkUrlParameters(provider, url); String driverPath = driverPath(homeDir, provider); props.set(JDBC_DRIVER_PATH.getKey(), driverPath); }
private static String getHost(Props props, NetworkUtils networkUtils) { String host = props.value(CLUSTER_NODE_HOST.getKey()); if (host != null && !host.isEmpty()) { return host; } return networkUtils.getHostname(); }
private static void ensureNotH2(Props props) { String jdbcUrl = props.value(JDBC_URL.getKey()); if (isBlank(jdbcUrl) || jdbcUrl.startsWith("jdbc:h2:")) { throw new MessageException("Embedded database is not supported in cluster mode"); } }
private static boolean isClusterEnabled(Props props) { return props.valueAsBoolean(CLUSTER_ENABLED.getKey()); }
private static File buildLogPath(Props props) { return props.nonNullValueAsFile(PATH_LOGS.getKey()); }
public static void main(String[] args) { ProcessEntryPoint entryPoint = ProcessEntryPoint.createForArguments(args); entryPoint.launch(new HttpProcess(entryPoint.getProps().valueAsInt("httpPort"), entryPoint.getCommands())); } }
private void ensureLocalButNotLoopbackAddress(Props props, String propertyKey) { String propertyValue = props.nonNullValue(propertyKey).trim(); try { InetAddress address = network.toInetAddress(propertyValue); if (!network.isLocalInetAddress(address) || network.isLoopbackInetAddress(address)) { throw new MessageException(format("Property %s must be a local non-loopback address: %s", propertyKey, propertyValue)); } } catch (UnknownHostException | SocketException e) { throw new MessageException(format("Property %s must be a local non-loopback address: %s [%s]", propertyKey, propertyValue, e.getMessage())); } }
@Override public void stopAsync() { if (lifecycle.tryToMoveTo(Lifecycle.State.STOPPING)) { stopperThread = new StopperThread(monitored, commands, Long.parseLong(props.nonNullValue(PROPERTY_TERMINATION_TIMEOUT_MS))); stopperThread.start(); stopWatcher.stopWatching(); } }
/** * Blocks until stopped in a timely fashion (see {@link org.sonar.process.StopperThread}) */ void stop() { stopAsync(); try { // stopperThread is not null for sure // join() does nothing if thread already finished stopperThread.join(); lifecycle.tryToMoveTo(Lifecycle.State.STOPPED); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } exit.exit(0); }
/** * Finds out whether we are in testing environment (usually ITs) and logs of all processes must be forward to * App's System.out. This is specified by the value of property {@link #ALL_LOGS_TO_CONSOLE_PROPERTY}. */ public boolean isAllLogsToConsoleEnabled(Props props) { return props.valueAsBoolean(ALL_LOGS_TO_CONSOLE_PROPERTY, false); }
@Override public void run() { // starts and waits until terminated entryPoint.launch(process); } };
/** * Unregister, if needed */ @Override public void stop() { Jmx.unregister(OBJECT_NAME); }
@Test public void deleteDirectory_throws_NPE_if_argument_is_null() throws IOException { expectDirectoryCanNotBeNullNPE(); FileUtils2.deleteDirectory(null); }
@Override public int hashCode() { return state.hashCode(); } }
@Test public void cleanDirectory_throws_NPE_if_file_is_null() throws IOException { expectDirectoryCanNotBeNullNPE(); FileUtils2.cleanDirectory(null); }
@Override public void run() { // starts and waits until terminated entryPoint.launch(process); } };
/** * Unregister, if needed */ @Override public void stop() { Jmx.unregister(OBJECT_NAME); }