Fix server command
This commit is contained in:
parent
0b6a146945
commit
e187d72a3b
|
@ -33,6 +33,7 @@ import org.fusesource.jansi.AnsiConsole;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -52,14 +53,18 @@ public abstract class BaseApp {
|
||||||
loggingConfigOff();
|
loggingConfigOff();
|
||||||
|
|
||||||
// We don't use qualified names for loggers in CLI
|
// We don't use qualified names for loggers in CLI
|
||||||
ourLog = LoggerFactory.getLogger(App.class.getSimpleName());
|
ourLog = LoggerFactory.getLogger(App.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MyShutdownHook myShutdownHook;
|
||||||
|
private boolean myShutdownHookHasNotRun;
|
||||||
|
|
||||||
private void logAppHeader() {
|
private void logAppHeader() {
|
||||||
System.out.flush();
|
System.out.flush();
|
||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
System.out.println("\ud83d\udd25 " + ansi().bold() + " " + provideProductName() + ansi().boldOff() + " " + provideProductVersion() + " - Command Line Tool");
|
System.out.println("\ud83d\udd25 " + ansi().bold() + " " + provideProductName() + ansi().boldOff() + " " + provideProductVersion() + " - Command Line Tool");
|
||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
|
System.out.println("Process ID : " + ManagementFactory.getRuntimeMXBean().getName());
|
||||||
System.out.println("Max configured JVM memory (Xmx) : " + FileHelper.getFileSizeDisplay(Runtime.getRuntime().maxMemory(), 1));
|
System.out.println("Max configured JVM memory (Xmx) : " + FileHelper.getFileSizeDisplay(Runtime.getRuntime().maxMemory(), 1));
|
||||||
System.out.println("Detected Java version : " + System.getProperty("java.version"));
|
System.out.println("Detected Java version : " + System.getProperty("java.version"));
|
||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
|
@ -197,6 +202,9 @@ public abstract class BaseApp {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myShutdownHook = new MyShutdownHook(command);
|
||||||
|
Runtime.getRuntime().addShutdownHook(myShutdownHook);
|
||||||
|
|
||||||
Options options = command.getOptions();
|
Options options = command.getOptions();
|
||||||
DefaultParser parser = new DefaultParser();
|
DefaultParser parser = new DefaultParser();
|
||||||
CommandLine parsedOptions;
|
CommandLine parsedOptions;
|
||||||
|
@ -215,6 +223,9 @@ public abstract class BaseApp {
|
||||||
// Actually execute the command
|
// Actually execute the command
|
||||||
command.run(parsedOptions);
|
command.run(parsedOptions);
|
||||||
|
|
||||||
|
myShutdownHookHasNotRun = true;
|
||||||
|
runCleanupHookAndUnregister();
|
||||||
|
|
||||||
if (!"true".equals(System.getProperty("test"))) {
|
if (!"true".equals(System.getProperty("test"))) {
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
@ -225,9 +236,11 @@ public abstract class BaseApp {
|
||||||
System.err.println(" " + ansi().fg(Ansi.Color.RED).bold() + e.getMessage());
|
System.err.println(" " + ansi().fg(Ansi.Color.RED).bold() + e.getMessage());
|
||||||
System.err.println("" + ansi().fg(Ansi.Color.WHITE).boldOff());
|
System.err.println("" + ansi().fg(Ansi.Color.WHITE).boldOff());
|
||||||
logCommandUsageNoHeader(command);
|
logCommandUsageNoHeader(command);
|
||||||
|
runCleanupHookAndUnregister();
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
} catch (CommandFailureException e) {
|
} catch (CommandFailureException e) {
|
||||||
ourLog.error(e.getMessage());
|
ourLog.error(e.getMessage());
|
||||||
|
runCleanupHookAndUnregister();
|
||||||
if ("true".equals(System.getProperty("test"))) {
|
if ("true".equals(System.getProperty("test"))) {
|
||||||
throw e;
|
throw e;
|
||||||
} else {
|
} else {
|
||||||
|
@ -235,12 +248,22 @@ public abstract class BaseApp {
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
ourLog.error("Error during execution: ", t);
|
ourLog.error("Error during execution: ", t);
|
||||||
|
runCleanupHookAndUnregister();
|
||||||
if ("true".equals(System.getProperty("test"))) {
|
if ("true".equals(System.getProperty("test"))) {
|
||||||
throw new CommandFailureException("Error: " + t.toString(), t);
|
throw new CommandFailureException("Error: " + t.toString(), t);
|
||||||
} else {
|
} else {
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runCleanupHookAndUnregister() {
|
||||||
|
if (myShutdownHookHasNotRun) {
|
||||||
|
Runtime.getRuntime().removeShutdownHook(myShutdownHook);
|
||||||
|
myShutdownHook.run();
|
||||||
|
myShutdownHookHasNotRun = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateJavaVersion() {
|
private void validateJavaVersion() {
|
||||||
|
@ -275,4 +298,17 @@ public abstract class BaseApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class MyShutdownHook extends Thread {
|
||||||
|
private final BaseCommand myFinalCommand;
|
||||||
|
|
||||||
|
public MyShutdownHook(BaseCommand theFinalCommand) {
|
||||||
|
myFinalCommand = theFinalCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
ourLog.info(provideProductName() + " is shutting down...");
|
||||||
|
myFinalCommand.cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,6 +152,13 @@ public abstract class BaseCommand implements Comparable<BaseCommand> {
|
||||||
addOptionalOption(theOptions, VERBOSE_LOGGING_PARAM, VERBOSE_LOGGING_PARAM_LONGOPT, false, VERBOSE_LOGGING_PARAM_DESC);
|
addOptionalOption(theOptions, VERBOSE_LOGGING_PARAM, VERBOSE_LOGGING_PARAM_LONGOPT, false, VERBOSE_LOGGING_PARAM_DESC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subclasses may override if they want, to do any cleanup they need to do.
|
||||||
|
*/
|
||||||
|
public void cleanup() {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(BaseCommand theO) {
|
public int compareTo(BaseCommand theO) {
|
||||||
return getCommandName().compareTo(theO.getCommandName());
|
return getCommandName().compareTo(theO.getCommandName());
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.apache.commons.cli.CommandLine;
|
||||||
import org.apache.commons.cli.Options;
|
import org.apache.commons.cli.Options;
|
||||||
import org.apache.commons.cli.ParseException;
|
import org.apache.commons.cli.ParseException;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.time.DateUtils;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
import org.springframework.web.context.ContextLoader;
|
import org.springframework.web.context.ContextLoader;
|
||||||
|
@ -193,9 +194,22 @@ public class RunServerCommand extends BaseCommand {
|
||||||
ourLog.info("Web Testing UI : http://localhost:{}/", myPort);
|
ourLog.info("Web Testing UI : http://localhost:{}/", myPort);
|
||||||
ourLog.info("Server Base URL: http://localhost:{}{}", myPort, path);
|
ourLog.info("Server Base URL: http://localhost:{}{}", myPort, path);
|
||||||
|
|
||||||
|
// Never quit.. We'll let the user ctrl-C their way out.
|
||||||
|
loopForever();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("InfiniteLoopStatement")
|
||||||
|
private void loopForever() {
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(DateUtils.MILLIS_PER_MINUTE);
|
||||||
|
} catch (InterruptedException theE) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] theArgs) {
|
public static void main(String[] theArgs) {
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ package ca.uhn.fhir.cli;
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.igpacks.parser.IgPackParserDstu2;
|
import ca.uhn.fhir.igpacks.parser.IgPackParserDstu2;
|
||||||
import ca.uhn.fhir.igpacks.parser.IgPackParserDstu3;
|
import ca.uhn.fhir.igpacks.parser.IgPackParserDstu3;
|
||||||
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.parser.LenientErrorHandler;
|
import ca.uhn.fhir.parser.LenientErrorHandler;
|
||||||
import ca.uhn.fhir.validation.FhirValidator;
|
import ca.uhn.fhir.validation.FhirValidator;
|
||||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||||
|
@ -103,7 +104,7 @@ public class ValidateCommand extends BaseCommand {
|
||||||
parseFhirContext(theCommandLine);
|
parseFhirContext(theCommandLine);
|
||||||
|
|
||||||
String fileName = theCommandLine.getOptionValue("n");
|
String fileName = theCommandLine.getOptionValue("n");
|
||||||
String contents = theCommandLine.getOptionValue("c");
|
String contents = theCommandLine.getOptionValue("d");
|
||||||
if (isNotBlank(fileName) && isNotBlank(contents)) {
|
if (isNotBlank(fileName) && isNotBlank(contents)) {
|
||||||
throw new ParseException("Can not supply both a file (-n) and data (-d)");
|
throw new ParseException("Can not supply both a file (-n) and data (-d)");
|
||||||
}
|
}
|
||||||
|
@ -199,7 +200,12 @@ public class ValidateCommand extends BaseCommand {
|
||||||
val.setValidateAgainstStandardSchema(theCommandLine.hasOption("x"));
|
val.setValidateAgainstStandardSchema(theCommandLine.hasOption("x"));
|
||||||
val.setValidateAgainstStandardSchematron(theCommandLine.hasOption("s"));
|
val.setValidateAgainstStandardSchematron(theCommandLine.hasOption("s"));
|
||||||
|
|
||||||
ValidationResult results = val.validateWithResult(contents);
|
ValidationResult results;
|
||||||
|
try {
|
||||||
|
results = val.validateWithResult(contents);
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
throw new CommandFailureException(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
StringBuilder b = new StringBuilder("Validation results:" + ansi().boldOff());
|
StringBuilder b = new StringBuilder("Validation results:" + ansi().boldOff());
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
Loading…
Reference in New Issue