diff --git a/samples/helloworld/src/main/resources/log4j.properties b/samples/helloworld/src/main/resources/log4j.properties new file mode 100644 index 00000000..d43a9859 --- /dev/null +++ b/samples/helloworld/src/main/resources/log4j.properties @@ -0,0 +1 @@ +log4j.rootCategory=OFF \ No newline at end of file diff --git a/src/main/java/org/springframework/shell/Bootstrap.java b/src/main/java/org/springframework/shell/Bootstrap.java index eab40c7c..a627e526 100644 --- a/src/main/java/org/springframework/shell/Bootstrap.java +++ b/src/main/java/org/springframework/shell/Bootstrap.java @@ -88,8 +88,6 @@ public class Bootstrap { for (Converter converter : converters.values()) { shell.getSimpleParser().add(converter); } - - shell.start(); } private void createApplicationContext() { @@ -186,6 +184,7 @@ public class Bootstrap { } } else { + shell.start(); shell.promptLoop(); exitShellRequest = shell.getExitShellRequest(); if (exitShellRequest == null) { diff --git a/src/main/java/org/springframework/shell/core/JLineShell.java b/src/main/java/org/springframework/shell/core/JLineShell.java index 28e7e4bf..621bd84f 100644 --- a/src/main/java/org/springframework/shell/core/JLineShell.java +++ b/src/main/java/org/springframework/shell/core/JLineShell.java @@ -87,6 +87,7 @@ public abstract class JLineShell extends AbstractShell implements CommandMarker, private final Map flashInfoMap = new HashMap(); /** key: row number, value: eraseLineFromPosition */ private final Map rowErasureMap = new HashMap(); + private boolean shutdownHookFired = false; // ROO-1599 private int historySize; @@ -129,7 +130,15 @@ public abstract class JLineShell extends AbstractShell implements CommandMarker, setShellStatus(Status.STARTED); - + try { + // Monitor CTRL+C initiated shutdowns (ROO-1599) + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + public void run() { + shutdownHookFired = true; + } + }, getProductName() + " JLine Shutdown Hook")); + } catch (Throwable t) { + } // Handle any "execute-then-quit" operation @@ -290,7 +299,7 @@ public abstract class JLineShell extends AbstractShell implements CommandMarker, // Setup a thread to ensure flash messages are displayed and cleared correctly Thread t = new Thread(new Runnable() { public void run() { - while (!shellStatus.getStatus().equals(Status.SHUTTING_DOWN)) { + while (!shellStatus.getStatus().equals(Status.SHUTTING_DOWN) && !shutdownHookFired) { synchronized (flashInfoMap) { long now = System.currentTimeMillis(); @@ -426,6 +435,9 @@ public abstract class JLineShell extends AbstractShell implements CommandMarker, rowErasureMap.remove(row); } else { + if (shutdownHookFired) { + return; // ROO-1599 + } // They want some message displayed int startFrom = reader.getTermwidth() - message.length() + 1; if (startFrom < 1) {