diff --git a/gclc-process/pom.xml b/gclc-process/pom.xml index 94a5122..c43e13c 100644 --- a/gclc-process/pom.xml +++ b/gclc-process/pom.xml @@ -54,7 +54,7 @@ fr.bigeon gclc - 2.0.0-SNAPSHOT + 2.0.0 diff --git a/gclc-socket/pom.xml b/gclc-socket/pom.xml index fce654a..133f0a2 100644 --- a/gclc-socket/pom.xml +++ b/gclc-socket/pom.xml @@ -81,12 +81,12 @@ of Emmanuel Bigeon. --> fr.bigeon gclc - 1.5.0 + 2.0.0 fr.bigeon smu - 0.0.5 + 0.0.7 diff --git a/gclc-socket/src/main/java/fr/bigeon/gclc/socket/SocketConsoleApplicationShell.java b/gclc-socket/src/main/java/fr/bigeon/gclc/socket/SocketConsoleApplicationShell.java index bcf2ad6..817561b 100644 --- a/gclc-socket/src/main/java/fr/bigeon/gclc/socket/SocketConsoleApplicationShell.java +++ b/gclc-socket/src/main/java/fr/bigeon/gclc/socket/SocketConsoleApplicationShell.java @@ -47,8 +47,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import fr.bigeon.gclc.ConsoleApplication; -import fr.bigeon.gclc.manager.ConsoleManager; -import fr.bigeon.gclc.manager.PipedConsoleManager; +import fr.bigeon.gclc.manager.PipedConsoleInput; +import fr.bigeon.gclc.manager.PipedConsoleOutput; import fr.bigeon.gclc.manager.ReadingRunnable; /** This is a socket communicating console consoleManager @@ -76,17 +76,17 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { * @author Emmanuel Bigeon */ private final class OutputForwardRunnable implements Runnable { /** - * + * */ private final PrintWriter writer; /** - * + * */ private final Socket socket; /** @param writer the writer * @param socket the socket */ - protected OutputForwardRunnable(PrintWriter writer, Socket socket) { + protected OutputForwardRunnable(final PrintWriter writer, final Socket socket) { this.writer = writer; this.socket = socket; } @@ -96,16 +96,16 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { public void run() { try { while (!socket.isClosed()) { - while (!socket.isClosed() && !consoleManager.available()) { + while (!socket.isClosed() && !output.available()) { waitASec(); } if (socket.isClosed()) { return; } - String m = consoleManager.readNextLine(); + final String m = output.readNextLine(); writer.println(m); } - } catch (IOException e) { + } catch (final IOException e) { LOGGER.log(Level.SEVERE, "Unexpected problem in manager", //$NON-NLS-1$ e); } @@ -129,8 +129,6 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { /** The running status */ private boolean running; - /** The console manager implementation */ - private final PipedConsoleManager consoleManager; /** The auto close flag. if this is true, every request closes the session * after its call */ private final boolean autoClose; @@ -140,25 +138,8 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { private final String applicationShutdown; /** The charset for the communication. */ private final Charset charset; - - /** Create a socket application shell which will listen on the given port - * and close session upon the provided string reception by client - * - * @param port the port to listen to - * @param close the session closing command - * @param applicationShutdown the appication shut down command - * @param charset the charset for communication - * @throws IOException if the manager could not be created */ - public SocketConsoleApplicationShell(int port, String close, - String applicationShutdown, Charset charset) throws IOException { - this.port = port; - this.close = close; - this.applicationShutdown = applicationShutdown; - this.autoClose = false; - this.charset = charset; - // - consoleManager = new PipedConsoleManager(); - } + private final PipedConsoleOutput output; + private final PipedConsoleInput input; /** Create a socket application shell which will listen on the given port * and auto close session after one instruction @@ -169,15 +150,157 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { * @param applicationShutdown the appication shut down command * @param charset the charset for communication * @throws IOException if the manager could not be created */ - public SocketConsoleApplicationShell(int port, boolean autoClose, - String applicationShutdown, Charset charset) throws IOException { + public SocketConsoleApplicationShell(final int port, final boolean autoClose, + final String applicationShutdown, final Charset charset) throws IOException { this.port = port; this.autoClose = autoClose; this.applicationShutdown = applicationShutdown; - this.close = autoClose ? null : "close"; //$NON-NLS-1$ + close = autoClose ? null : "close"; //$NON-NLS-1$ this.charset = charset; // - consoleManager = new PipedConsoleManager(); + output = new PipedConsoleOutput(); + input = new PipedConsoleInput(); + } + + /** Create a socket application shell which will listen on the given port + * and close session upon the provided string reception by client + * + * @param port the port to listen to + * @param close the session closing command + * @param applicationShutdown the appication shut down command + * @param charset the charset for communication + * @throws IOException if the manager could not be created */ + public SocketConsoleApplicationShell(final int port, final String close, + final String applicationShutdown, final Charset charset) throws IOException { + this.port = port; + this.close = close; + this.applicationShutdown = applicationShutdown; + autoClose = false; + this.charset = charset; + // + output = new PipedConsoleOutput(); + input = new PipedConsoleInput(); + } + + /* (non-Javadoc) + * @see java.lang.AutoCloseable#close() */ + @Override + public void close() throws IOException { + input.close(); + output.close(); + } + + /** Close the console manager after writing the application shutdown + * command. + * + * @param appThNext the thread containing the application + * @throws IOException if the typyng or closing failed */ + private void closeManager(final Thread appThNext) throws IOException { + input.type(applicationShutdown); + try { + appThNext.join(ONE_TENTH_OF_SECOND); + } catch (final InterruptedException e) { + LOGGER.warning("Application thread was interrupted!"); //$NON-NLS-1$ + LOGGER.log(Level.FINE, + "Application thread was interrupted while closing", //$NON-NLS-1$ + e); + } + close(); + } + + /** active communication between server and client + * + * @param socket the socket + * @param writer the writer to the application + * @param in the input from the client + * @throws IOException if the communication failed */ + private void communicate(final Socket socket, final PrintWriter writer, + final BufferedReader in) throws IOException { + final OutputForwardRunnable cc = new OutputForwardRunnable(writer, socket); + final Thread th = new Thread(cc, "ClientComm"); //$NON-NLS-1$ + th.start(); + if (autoClose) { + communicateOnce(in); + } else { + communicateLoop(in); + } + } + + /** @param in the input from the client + * @throws IOException if the communication failed */ + private void communicateLoop(final BufferedReader in) throws IOException { + final ReadingRunnable reading = new ReadingRunnable(in); + final Thread th = new Thread(reading, "gclcToApp"); //$NON-NLS-1$ + th.start(); + while (app.isRunning() && communicationContent(reading)) { + // keep on going + } + doEndCommunication(reading); + } + + /** @param in the input from the client + * @throws IOException if the communication failed */ + private void communicateOnce(final BufferedReader in) throws IOException { + final ReadingRunnable reading = new ReadingRunnable(in); + final Thread th = new Thread(reading, "gclcToApp"); //$NON-NLS-1$ + th.start(); + communicationContent(reading); + doEndCommunication(reading); + } + + /** @param reading the reading + * @return if the communication should be stopped. + * @throws IOException if the reading failed */ + private boolean communicationContent(final ReadingRunnable reading) throws IOException { + try { + while (app.isRunning() && !reading.hasMessage()) { + synchronized (this) { + waitASec(); + } + } + } catch (final IOException e) { + LOGGER.warning("Client seems dead. Closing communication"); //$NON-NLS-1$ + LOGGER.log(Level.FINE, "Wait on message from client failed", e); //$NON-NLS-1$ + return false; + } + if (!app.isRunning()) { + return false; + } + final String ln = reading.getMessage(); + if (ln.equals(close)) { + return false; + } + // Pass command to application + input.type(ln); + return true; + } + + /** @param reading the reading runnable + * @throws IOException if the end of communication failed */ + private void doEndCommunication(final ReadingRunnable reading) throws IOException { + reading.setRunning(false); + final Thread wait = output.getWaitForDelivery("Bye."); //$NON-NLS-1$ + output.println("Bye."); //$NON-NLS-1$ + try { + wait.join(); + } catch (final InterruptedException e) { + LOGGER.warning("The Bye wait was interrupted."); //$NON-NLS-1$ + LOGGER.log(Level.FINE, "An interruption occured", e); //$NON-NLS-1$ + } + } + + /** + * @return the input + */ + public PipedConsoleInput getInput() { + return input; + } + + /** + * @return the output + */ + public PipedConsoleOutput getOutput() { + return output; } /* (non-Javadoc) @@ -186,7 +309,7 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { public void run() { // Create the server try (ServerSocket actualServerSocket = new ServerSocket(port)) { - this.serverSocket = actualServerSocket; + serverSocket = actualServerSocket; running = true; // Create the streams runSokectServer(); @@ -200,7 +323,7 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { /** @throws IOException if the communication with the client failed */ private void runSokectServer() throws IOException { final ConsoleRunnable runnable = new ConsoleRunnable(app); - Thread appThNext = new Thread(runnable, "gclc-ctrl"); //$NON-NLS-1$ + final Thread appThNext = new Thread(runnable, "gclc-ctrl"); //$NON-NLS-1$ appThNext.start(); while (running) { LOGGER.info("Waiting client"); //$NON-NLS-1$ @@ -221,15 +344,15 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { } else { LOGGER.info("Reconnect to application"); //$NON-NLS-1$ out.println("Reconnected"); //$NON-NLS-1$ - out.println(consoleManager.getPrompt()); + out.println(input.getPrompt()); } communicate(clientSocket, out, in); - } catch (SocketException e) { + } catch (final SocketException e) { LOGGER.log(Level.INFO, "Socket closed"); //$NON-NLS-1$ LOGGER.log(Level.FINE, "Socket closed with exception (probably due to server interruption)", //$NON-NLS-1$ e); - } catch (IOException e) { + } catch (final IOException e) { throw e; } LOGGER.info("Closing client"); //$NON-NLS-1$ @@ -237,7 +360,7 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { runnable.setRunning(false); try { closeManager(appThNext); - } catch (IOException e) { + } catch (final IOException e) { LOGGER.warning("Unable to close application correctly"); //$NON-NLS-1$ LOGGER.log(Level.FINE, "Application closing caused an exception", //$NON-NLS-1$ e); @@ -245,128 +368,24 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { LOGGER.info("Closing Server"); //$NON-NLS-1$ } - /** Close the console manager after writing the application shutdown - * command. - * - * @param appThNext the thread containing the application - * @throws IOException if the typyng or closing failed */ - private void closeManager(Thread appThNext) throws IOException { - consoleManager.type(applicationShutdown); - try { - appThNext.join(ONE_TENTH_OF_SECOND); - } catch (InterruptedException e) { - LOGGER.warning("Application thread was interrupted!"); //$NON-NLS-1$ - LOGGER.log(Level.FINE, - "Application thread was interrupted while closing", //$NON-NLS-1$ - e); - } - consoleManager.close(); + /** @param app the application to set */ + public synchronized void setApplication(final ConsoleApplication app) { + this.app = app; } /** @param runnable the runnable */ - private void startApplication(ConsoleRunnable runnable) { + private void startApplication(final ConsoleRunnable runnable) { runnable.restart(); synchronized (this) { try { wait(ONE_TENTH_OF_SECOND); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { LOGGER.log(Level.SEVERE, "Interruption in application start", //$NON-NLS-1$ e); } } } - /** active communication between server and client - * - * @param socket the socket - * @param writer the writer to the application - * @param in the input from the client - * @throws IOException if the communication failed */ - private void communicate(final Socket socket, final PrintWriter writer, - BufferedReader in) throws IOException { - OutputForwardRunnable cc = new OutputForwardRunnable(writer, socket); - Thread th = new Thread(cc, "ClientComm"); //$NON-NLS-1$ - th.start(); - if (autoClose) { - communicateOnce(in); - } else { - communicateLoop(in); - } - } - - /** @param in the input from the client - * @throws IOException if the communication failed */ - private void communicateOnce(BufferedReader in) throws IOException { - ReadingRunnable reading = new ReadingRunnable(in); - Thread th = new Thread(reading, "gclcToApp"); //$NON-NLS-1$ - th.start(); - communicationContent(reading); - doEndCommunication(reading); - } - - /** @param reading the reading runnable - * @throws IOException if the end of communication failed */ - private void doEndCommunication(ReadingRunnable reading) throws IOException { - reading.setRunning(false); - Thread wait = consoleManager.getWaitForDelivery("Bye."); //$NON-NLS-1$ - consoleManager.println("Bye."); //$NON-NLS-1$ - try { - wait.join(); - } catch (InterruptedException e) { - LOGGER.warning("The Bye wait was interrupted."); //$NON-NLS-1$ - LOGGER.log(Level.FINE, "An interruption occured", e); //$NON-NLS-1$ - } - } - - /** @param in the input from the client - * @throws IOException if the communication failed */ - private void communicateLoop(BufferedReader in) throws IOException { - ReadingRunnable reading = new ReadingRunnable(in); - Thread th = new Thread(reading, "gclcToApp"); //$NON-NLS-1$ - th.start(); - while (app.isRunning() && communicationContent(reading)) { - // keep on going - } - doEndCommunication(reading); - } - - /** @param reading the reading - * @return if the communication should be stopped. - * @throws IOException if the reading failed */ - private boolean communicationContent(ReadingRunnable reading) throws IOException { - try { - while (app.isRunning() && !reading.hasMessage()) { - synchronized (this) { - waitASec(); - } - } - } catch (IOException e) { - LOGGER.warning("Client seems dead. Closing communication"); //$NON-NLS-1$ - LOGGER.log(Level.FINE, "Wait on message from client failed", e); //$NON-NLS-1$ - return false; - } - if (!app.isRunning()) { - return false; - } - String ln = reading.getMessage(); - if (ln.equals(close)) { - return false; - } - // Pass command to application - consoleManager.type(ln); - return true; - } - - /** @return the consoleManager */ - public synchronized ConsoleManager getConsoleManager() { - return consoleManager; - } - - /** @param app the application to set */ - public synchronized void setApplication(ConsoleApplication app) { - this.app = app; - } - /** This method will request the server to stop. *

* In most cases, this will terminate communication on every client. On some @@ -375,7 +394,7 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { running = false; try { serverSocket.close(); - } catch (IOException e) { + } catch (final IOException e) { LOGGER.log(Level.SEVERE, "Exception in closing socket server", e); //$NON-NLS-1$ } app.exit(); @@ -387,17 +406,10 @@ public class SocketConsoleApplicationShell implements Runnable, AutoCloseable { synchronized (this) { wait(ONE_TENTH_OF_SECOND); } - } catch (InterruptedException e) { + } catch (final InterruptedException e) { LOGGER.log(Level.SEVERE, "Interrupted wait", //$NON-NLS-1$ e); return; } } - - /* (non-Javadoc) - * @see java.lang.AutoCloseable#close() */ - @Override - public void close() throws IOException { - consoleManager.close(); - } } diff --git a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleRunnableTest.java b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleRunnableTest.java index a32f9a4..323f9d0 100644 --- a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleRunnableTest.java +++ b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleRunnableTest.java @@ -42,7 +42,7 @@ import java.io.IOException; import org.junit.Test; -import fr.bigeon.gclc.manager.ConsoleManager; +import fr.bigeon.gclc.manager.ConsoleInput; /** Test class for {@link ConsoleRunnable} * @@ -55,71 +55,25 @@ public class ConsoleRunnableTest { * * @author Emmanuel Bigeon */ private static final class ConsoleManagerTestImplementation - implements ConsoleManager { + implements ConsoleInput { int i = 0; String[] cmds; /** @param cmds the commands to run */ - public ConsoleManagerTestImplementation(String[] cmds) { + public ConsoleManagerTestImplementation(final String[] cmds) { super(); this.cmds = cmds; } - @Override - public void setPrompt(String prompt) { - // do nothing - } - - @Override - public String getPrompt() { - // Not used in test - return ""; //$NON-NLS-1$ - } - - @Override - public String prompt() { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { // NOSONAR - // do nothing - } - i++; - if (i == cmds.length) { - i = 0; - } - return cmds[i]; - } - - @Override - public String prompt(String message) { - return prompt(); - } - - @Override - public void println(String message) { - // do nothing - } - - @Override - public void println() { - // do nothing - } - - @Override - public void print(String text) { - // do nothing - } - @Override public void close() throws IOException { // do nothing } - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ @Override - public boolean isClosed() { - return i == cmds.length; + public String getPrompt() { + // Not used in test + return ""; //$NON-NLS-1$ } /* (non-Javadoc) @@ -129,10 +83,36 @@ public class ConsoleRunnableTest { // } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ + @Override + public boolean isClosed() { + return i == cmds.length; + } + + @Override + public String prompt() { + try { + Thread.sleep(1000); + } catch (final InterruptedException e) { // NOSONAR + // do nothing + } + i++; + if (i == cmds.length) { + i = 0; + } + return cmds[i]; + } + /* (non-Javadoc) * @see fr.bigeon.gclc.manager.ConsoleManager#prompt(long) */ @Override - public String prompt(long timeout) throws IOException { + public String prompt(final long timeout) throws IOException { + return prompt(); + } + + @Override + public String prompt(final String message) { return prompt(); } @@ -140,9 +120,14 @@ public class ConsoleRunnableTest { * @see fr.bigeon.gclc.manager.ConsoleManager#prompt(java.lang.String, * long) */ @Override - public String prompt(String message, long timeout) throws IOException { + public String prompt(final String message, final long timeout) throws IOException { return prompt(message); } + + @Override + public void setPrompt(final String prompt) { + // do nothing + } } /** Test method for @@ -156,6 +141,16 @@ public class ConsoleRunnableTest { } + /** Test method for {@link fr.bigeon.gclc.socket.ConsoleRunnable#stop()}. */ + @Test + public void testRun() { +// ConsoleApplication app = new ConsoleTestApplication( +// new ConsoleManagerTestImplementation( +// new String[] {"test", ConsoleTestApplication.EXIT})); //$NON-NLS-1$ +// ConsoleRunnable runnable = new ConsoleRunnable(app); +// runnable.run(); + } + /** Test method for {@link fr.bigeon.gclc.socket.ConsoleRunnable#run()}. */ @Test public void testRunFlow() { @@ -184,14 +179,4 @@ public class ConsoleRunnableTest { // runnable.stop(); } - /** Test method for {@link fr.bigeon.gclc.socket.ConsoleRunnable#stop()}. */ - @Test - public void testRun() { -// ConsoleApplication app = new ConsoleTestApplication( -// new ConsoleManagerTestImplementation( -// new String[] {"test", ConsoleTestApplication.EXIT})); //$NON-NLS-1$ -// ConsoleRunnable runnable = new ConsoleRunnable(app); -// runnable.run(); - } - } diff --git a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleTestApplication.java b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleTestApplication.java index 5078bf8..1276208 100644 --- a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleTestApplication.java +++ b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/ConsoleTestApplication.java @@ -42,10 +42,11 @@ import fr.bigeon.gclc.command.ExitCommand; import fr.bigeon.gclc.command.HelpExecutor; import fr.bigeon.gclc.exception.CommandRunException; import fr.bigeon.gclc.exception.InvalidCommandName; -import fr.bigeon.gclc.manager.ConsoleManager; +import fr.bigeon.gclc.manager.ConsoleInput; +import fr.bigeon.gclc.manager.ConsoleOutput; /** A test-purpose application - * + * * @author Emmanuel Bigeon */ public class ConsoleTestApplication { @@ -55,40 +56,59 @@ public class ConsoleTestApplication { /** @param manager the manager * @return create the application */ @SuppressWarnings("nls") - public static ConsoleApplication create(final ConsoleManager manager) { + public static ConsoleApplication create(final ConsoleOutput manager, + final ConsoleInput input) { try { - ConsoleApplication application = new ConsoleApplication(manager, + final ConsoleApplication application = new ConsoleApplication( + manager, input, "Welcome to the test application. Type help or test.", "See you"); application.add(new ExitCommand(EXIT, application)); - application.add( - new HelpExecutor("help", manager, application.root)); + application + .add(new HelpExecutor("help", application.root)); application.add(new Command("test") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + manager.println("Test command ran fine"); + } catch (final IOException e) { + throw new CommandRunException("manager closed", e, + this); + } + } + @Override public String tip() { return "A test command"; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() + */ @Override - public void execute(String... args) throws CommandRunException { - try { - manager.println("Test command ran fine"); - } catch (IOException e) { - throw new CommandRunException("manager closed", e, - this); - } + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); } }); application.add(new Command("long") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ @Override - public String tip() { - return "A long run test command"; - } - - @Override - public void execute(String... args) throws CommandRunException { + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { try { Thread.sleep(2000); manager.println("Test command ran fine"); @@ -97,6 +117,21 @@ public class ConsoleTestApplication { this); } } + + @Override + public String tip() { + return "A long run test command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() + */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } }); return application; } catch (final InvalidCommandName e) { diff --git a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/TestServer.java b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/TestServer.java index 7cd253c..782bb2e 100644 --- a/gclc-socket/src/test/java/fr/bigeon/gclc/socket/TestServer.java +++ b/gclc-socket/src/test/java/fr/bigeon/gclc/socket/TestServer.java @@ -40,7 +40,7 @@ import java.nio.charset.Charset; import fr.bigeon.gclc.ConsoleApplication; /** A test server - * + * * @author Emmanuel Bigeon */ @SuppressWarnings({"javadoc", "nls"}) public class TestServer { @@ -48,14 +48,9 @@ public class TestServer { private static SocketConsoleApplicationShell SHELL; private static Thread server; - /** @param args no argument - * @throws IOException if the server starting failed */ - public static void main(String... args) throws IOException { - try { - startServer(false).join(); - } catch (final InterruptedException e) { - e.printStackTrace(); - } + public static void closeServer() { + SHELL.stop(); + SHELL = null; } public static Thread getServer() throws IOException { @@ -71,38 +66,43 @@ public class TestServer { SHELL = new SocketConsoleApplicationShell(3300, "close", ConsoleTestApplication.EXIT, Charset.forName("UTF-8")); final ConsoleApplication app = ConsoleTestApplication - .create(SHELL.getConsoleManager()); + .create(SHELL.getOutput(), SHELL.getInput()); SHELL.setApplication(app); } return SHELL; } - public static Thread startServer(boolean autoClose) throws IOException { + /** @param args no argument + * @throws IOException if the server starting failed */ + public static void main(final String... args) throws IOException { + try { + startServer(false).join(); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + } + + public static Thread startServer(final boolean autoClose) throws IOException { if (SHELL == null) { SHELL = new SocketConsoleApplicationShell(3300, autoClose, ConsoleTestApplication.EXIT, Charset.forName("UTF-8")); final ConsoleApplication app = ConsoleTestApplication - .create(SHELL.getConsoleManager()); + .create(SHELL.getOutput(), SHELL.getInput()); SHELL.setApplication(app); server = null; } return getServer(); } - public static Thread startServer(String closeConnection) throws IOException { + public static Thread startServer(final String closeConnection) throws IOException { if (SHELL == null) { SHELL = new SocketConsoleApplicationShell(3300, closeConnection, ConsoleTestApplication.EXIT, Charset.forName("UTF-8")); final ConsoleApplication app = ConsoleTestApplication - .create(SHELL.getConsoleManager()); + .create(SHELL.getOutput(), SHELL.getInput()); SHELL.setApplication(app); server = null; } return getServer(); } - - public static void closeServer() { - SHELL.stop(); - SHELL = null; - } } diff --git a/gclc-swt/pom.xml b/gclc-swt/pom.xml index a84896a..7af6d6f 100644 --- a/gclc-swt/pom.xml +++ b/gclc-swt/pom.xml @@ -51,12 +51,12 @@ fr.bigeon gclc - 1.3.6 + 2.0.0 fr.bigeon collections - 1.0.1 + 1.1.0 2015 diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java index 64269a0..a0c7578 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java +++ b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsole.java @@ -51,14 +51,15 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import fr.bigeon.gclc.ConsoleApplication; -import fr.bigeon.gclc.manager.ConsoleManager; +import fr.bigeon.gclc.manager.ConsoleInput; +import fr.bigeon.gclc.manager.ConsoleOutput; /** A SWT component to connect to gclc {@link ConsoleApplication} *

* * @author Emmanuel Bigeon */ public class SWTConsole extends Composite - implements ConsoleDelayIO, ConsoleManager { + implements ConsoleDelayIO, ConsoleInput, ConsoleOutput { /** * */ @@ -89,7 +90,7 @@ public class SWTConsole extends Composite * * @param parent the prent composite * @param style the composite style */ - public SWTConsole(Composite parent, int style) { + public SWTConsole(final Composite parent, final int style) { super(parent, style); setLayout(new GridLayout(LAYOUT_NB_COLUMNS, false)); @@ -110,47 +111,32 @@ public class SWTConsole extends Composite } - /** - * - */ - @Override - public void validateInput() { - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - consoleInput.setEnabled(false); - } - }); - synchronized (promptLock) { - while (!prompting) { - try { - promptLock.wait(); - } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, - "Interruption while waiting prompt", e); //$NON-NLS-1$ - } - } - Display.getDefault().syncExec(new Runnable() { - @SuppressWarnings("synthetic-access") - @Override - public void run() { - command = consoleInput.getText(); - prompting = false; - consoleInput.setText(EMPTY); - consoleOutput.append( - CMD_PREFIX + command + System.lineSeparator()); - } - }); - promptLock.notifyAll(); - } - } - @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#close() */ + @Override + public void close() { + synchronized (promptLock) { + promptLock.notify(); + } + if (consoleInput.isDisposed()) { + return; + } + consoleInput.setEnabled(false); + consoleOutput.setEnabled(false); + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ + @Override + public String getInput() { + return consoleInput.getText(); + } + /* (non-Javadoc) * @see fr.bigeon.gclc.ConsoleManager#getPrompt() */ @Override @@ -158,6 +144,22 @@ public class SWTConsole extends Composite return prompt; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#interruptPrompt() */ + @Override + public void interruptPrompt() { + synchronized (promptLock) { + promptLock.notify(); + } + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ + @Override + public boolean isClosed() { + return isDisposed(); + } + /* (non-Javadoc) * @see fr.bigeon.gclc.ConsoleManager#print(java.lang.String) */ @Override @@ -238,6 +240,16 @@ public class SWTConsole extends Composite return command; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(long) + */ + @Override + public String prompt(final long timeout) throws IOException { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + /* (non-Javadoc) * @see fr.bigeon.gclc.ConsoleManager#prompt(java.lang.String) */ @Override @@ -286,6 +298,16 @@ public class SWTConsole extends Composite return command; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleInput#prompt(java.lang.String, long) + */ + @Override + public String prompt(final String message, final long timeout) throws IOException { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + /* (non-Javadoc) * @see org.eclipse.swt.widgets.Composite#setFocus() */ @Override @@ -293,6 +315,14 @@ public class SWTConsole extends Composite return consoleInput.setFocus(); } + /* (non-Javadoc) + * @see fr.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ + @Override + public void setInput(final String input) { + consoleInput.setText(input); + consoleInput.setSelection(input.length()); + } + /* (non-Javadoc) * @see fr.bigeon.gclc.ConsoleManager#setPrompt(java.lang.String) */ @Override @@ -311,60 +341,51 @@ public class SWTConsole extends Composite }); } - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#close() */ - @Override - public void close() { - synchronized (promptLock) { - promptLock.notify(); - } - if (consoleInput.isDisposed()) { - return; - } - consoleInput.setEnabled(false); - consoleOutput.setEnabled(false); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#isClosed() */ - @Override - public boolean isClosed() { - return isDisposed(); - } - /** @param string the text */ - public void setText(String string) { + public void setText(final String string) { consoleInput.setText(string); } /** - * + * */ public void validateCommand() { validateInput(); } - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ + /** + * + */ @Override - public void setInput(String input) { - consoleInput.setText(input); - consoleInput.setSelection(input.length()); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ - @Override - public String getInput() { - return consoleInput.getText(); - } - - /* (non-Javadoc) - * @see fr.bigeon.gclc.manager.ConsoleManager#interruptPrompt() */ - @Override - public void interruptPrompt() { + public void validateInput() { + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + consoleInput.setEnabled(false); + } + }); synchronized (promptLock) { - promptLock.notify(); + while (!prompting) { + try { + promptLock.wait(); + } catch (final InterruptedException e) { + LOGGER.log(Level.SEVERE, + "Interruption while waiting prompt", e); //$NON-NLS-1$ + } + } + Display.getDefault().syncExec(new Runnable() { + @SuppressWarnings("synthetic-access") + @Override + public void run() { + command = consoleInput.getText(); + prompting = false; + consoleInput.setText(EMPTY); + consoleOutput.append( + CMD_PREFIX + command + System.lineSeparator()); + } + }); + promptLock.notifyAll(); } } diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java index e4f0d6f..a31e659 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java +++ b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleShell.java @@ -43,8 +43,6 @@ import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; -import fr.bigeon.gclc.manager.ConsoleManager; - /** A shell containing a {@link SWTConsole} *

* @@ -57,7 +55,7 @@ public class SWTConsoleShell extends Shell { /** Create the shell. * * @param display the display */ - public SWTConsoleShell(Display display) { + public SWTConsoleShell(final Display display) { super(display, SWT.SHELL_TRIM); setLayout(new FillLayout(SWT.HORIZONTAL)); @@ -75,11 +73,6 @@ public class SWTConsoleShell extends Shell { setText("Console Application"); //$NON-NLS-1$ } - /** @return the console manager */ - public ConsoleManager getManager() { - return console; - } - /* (non-Javadoc) * @see org.eclipse.swt.widgets.Shell#dispose() */ @Override @@ -87,4 +80,9 @@ public class SWTConsoleShell extends Shell { super.dispose(); console.close(); } + + /** @return the input and output. */ + public SWTConsole getManager() { + return console; + } } diff --git a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java index 38b6965..396c099 100644 --- a/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java +++ b/gclc-swt/src/main/java/fr/bigeon/gclc/swt/SWTConsoleView.java @@ -50,7 +50,8 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import fr.bigeon.gclc.ConsoleApplication; -import fr.bigeon.gclc.manager.PipedConsoleManager; +import fr.bigeon.gclc.manager.PipedConsoleInput; +import fr.bigeon.gclc.manager.PipedConsoleOutput; import fr.bigeon.gclc.tools.AOutputForwardRunnable; /** A SWT component to connect to gclc {@link ConsoleApplication} @@ -59,7 +60,7 @@ import fr.bigeon.gclc.tools.AOutputForwardRunnable; * @author Emmanuel Bigeon */ public class SWTConsoleView extends Composite implements ConsoleDelayIO { /** The local implementation of the forwarding runnable - * + * * @author Emmanuel Bigeon */ private final class ToSWTConsoleForwardRunnable extends AOutputForwardRunnable { @@ -67,12 +68,12 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { private boolean running = true; /** @param manager the manager */ - public ToSWTConsoleForwardRunnable(PipedConsoleManager manager) { + public ToSWTConsoleForwardRunnable(final PipedConsoleOutput manager) { super(manager); } @Override - protected void forwardLine(String m) { + protected void forwardLine(final String m) { appendConsoleOutput(m); } @@ -82,7 +83,7 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { } /** @param running the running to set */ - public void setRunning(boolean running) { + public void setRunning(final boolean running) { this.running = running; } } @@ -95,7 +96,8 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { /** The console input text field */ private final Text consoleInput; /** The actual manager */ - private PipedConsoleManager manager; + private PipedConsoleOutput manager; + private PipedConsoleInput input; /** The forwarding runnable */ private ToSWTConsoleForwardRunnable forward; @@ -103,7 +105,7 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { * * @param parent the prent composite * @param style the composite style */ - public SWTConsoleView(Composite parent, int style) { + public SWTConsoleView(final Composite parent, final int style) { super(parent, style); setLayout(new GridLayout(1, false)); @@ -120,17 +122,6 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { consoleInput.addKeyListener(new HistoryTextKeyListener(this)); } - /** @param manager the manager to set */ - public void setManager(PipedConsoleManager manager) { - this.manager = manager; - if (forward != null) { - forward.setRunning(false); - } - forward = new ToSWTConsoleForwardRunnable(manager); - Thread th = new Thread(forward, "gclcToSWT"); //$NON-NLS-1$ - th.start(); - } - /** @param next the next message */ protected void appendConsoleOutput(final String next) { Display.getDefault().syncExec(new Runnable() { @@ -142,23 +133,18 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { }); } - /** - * - */ - @Override - public void validateInput() { - try { - manager.type(getInput()); - } catch (IOException e) { - LOGGER.log(Level.SEVERE, "Unable to input value to console", e); //$NON-NLS-1$ - } - } - @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } + /* (non-Javadoc) + * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ + @Override + public String getInput() { + return consoleInput.getText(); + } + /* (non-Javadoc) * @see org.eclipse.swt.widgets.Composite#setFocus() */ @Override @@ -166,23 +152,41 @@ public class SWTConsoleView extends Composite implements ConsoleDelayIO { return consoleInput.setFocus(); } - /** @param string the text */ - public void setText(String string) { - consoleInput.setText(string); - } - /* (non-Javadoc) * @see fr.bigeon.gclc.swt.ConsoleDelayIO#setInput(java.lang.String) */ @Override - public void setInput(String input) { + public void setInput(final String input) { consoleInput.setText(input); consoleInput.setSelection(input.length()); } - /* (non-Javadoc) - * @see fr.bigeon.gclc.swt.ConsoleDelayIO#getInput() */ + /** @param manager the manager to set */ + public void setManager(final PipedConsoleOutput manager, + final PipedConsoleInput input) { + this.manager = manager; + this.input = input; + if (forward != null) { + forward.setRunning(false); + } + forward = new ToSWTConsoleForwardRunnable(manager); + final Thread th = new Thread(forward, "gclcToSWT"); //$NON-NLS-1$ + th.start(); + } + + /** @param string the text */ + public void setText(final String string) { + consoleInput.setText(string); + } + + /** + * + */ @Override - public String getInput() { - return consoleInput.getText(); + public void validateInput() { + try { + input.type(getInput()); + } catch (final IOException e) { + LOGGER.log(Level.SEVERE, "Unable to input value to console", e); //$NON-NLS-1$ + } } } diff --git a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java b/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java index d690510..1a3d80c 100644 --- a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java +++ b/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleShellTest.java @@ -53,8 +53,11 @@ import fr.bigeon.gclc.command.Command; import fr.bigeon.gclc.command.ExitCommand; import fr.bigeon.gclc.exception.CommandRunException; import fr.bigeon.gclc.exception.InvalidCommandName; +import fr.bigeon.gclc.manager.ConsoleInput; +import fr.bigeon.gclc.manager.ConsoleOutput; -/**

+/** + *

* TODO * * @author Emmanuel Bigeon */ @@ -65,64 +68,192 @@ public class SWTConsoleShellTest { private static final Display DISPLAY = Display.getDefault(); @Test - public void testConsoleClose() { + public void test() { final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); - final SWTConsole swtConsole = (SWTConsole) shell.getManager(); - swtConsole.close(); - swtConsole.setPrompt(":"); + final SWTConsole swtConsole = shell.getManager(); try { final ConsoleApplication appl = new ConsoleApplication(swtConsole, - "Hello", "See you"); + swtConsole, "Hello", "See you"); appl.add(new ExitCommand("exit", appl)); appl.add(new Command("long") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + @Override public String tip() { return "a long running command"; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ @Override - public void execute(String... args) { - try { - Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - }); - appl.add(new Command("test") { - - @Override - public String tip() { - return "a prompting running command"; - } - - @Override - public void execute(String... args) throws CommandRunException { - try { - appl.getManager().prompt("Test"); - } catch (IOException e) { - throw new CommandRunException("No input", e, this); - } + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); } }); // shell.pack(); shell.open(); - Thread applThread = new Thread(new Runnable() { + final Thread applThread = new Thread(new Runnable() { @Override public void run() { appl.start(); } }); - Thread testThread = new Thread(new Runnable() { + final Thread testThread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + swtConsole.setText("test"); //$NON-NLS-1$ + swtConsole.validateCommand(); + } + }); + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + shell.dispose(); + } + }); + } + }); + applThread.start(); + testThread.start(); + while (!shell.isDisposed()) { + if (!DISPLAY.readAndDispatch()) { + DISPLAY.sleep(); + } + } +// DISPLAY.dispose(); + assertTrue(swtConsole.isClosed()); + Thread.sleep(TWO_SECONDS); + assertFalse(appl.isRunning()); + } catch (final InvalidCommandName e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Test + public void testConsoleClose() { + final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); + final SWTConsole swtConsole = shell.getManager(); + swtConsole.close(); + swtConsole.setPrompt(":"); + try { + final ConsoleApplication appl = new ConsoleApplication(swtConsole, + swtConsole, "Hello", "See you"); + appl.add(new ExitCommand("exit", appl)); + appl.add(new Command("long") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public String tip() { + return "a long running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); + appl.add(new Command("test") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc. + * manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ + @Override + public void execute(final ConsoleOutput out, + final ConsoleInput in, + final String... args) throws CommandRunException { + try { + swtConsole.prompt("Test"); + } catch (final IOException e) { + throw new CommandRunException("No input", e, this); + } + } + + @Override + public String tip() { + return "a prompting running command"; + } + + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ + @Override + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); + } + }); +// shell.pack(); + shell.open(); + final Thread applThread = new Thread(new Runnable() { + + @Override + public void run() { + appl.start(); + } + }); + final Thread testThread = new Thread(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -163,7 +294,7 @@ public class SWTConsoleShellTest { swtConsole.validateCommand(); try { Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -187,102 +318,17 @@ public class SWTConsoleShellTest { try { swtConsole.prompt(); fail("Prompting when closed should fail!"); - } catch (IOException e) { + } catch (final IOException e) { assertNotNull(e); } // DISPLAY.dispose(); - assertTrue(appl.getManager().isClosed()); + assertTrue(swtConsole.isClosed()); Thread.sleep(TWO_SECONDS); assertFalse(appl.isRunning()); - } catch (InvalidCommandName e) { + } catch (final InvalidCommandName e) { // TODO Auto-generated catch block e.printStackTrace(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Test - public void test() { - final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY); - final SWTConsole swtConsole = (SWTConsole) shell.getManager(); - try { - final ConsoleApplication appl = new ConsoleApplication(swtConsole, - "Hello", "See you"); - appl.add(new ExitCommand("exit", appl)); - appl.add(new Command("long") { - - @Override - public String tip() { - return "a long running command"; - } - - @Override - public void execute(String... args) { - try { - Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - }); -// shell.pack(); - shell.open(); - Thread applThread = new Thread(new Runnable() { - - @Override - public void run() { - appl.start(); - } - }); - Thread testThread = new Thread(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - swtConsole.setText("test"); //$NON-NLS-1$ - swtConsole.validateCommand(); - } - }); - try { - Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - shell.dispose(); - } - }); - } - }); - applThread.start(); - testThread.start(); - while (!shell.isDisposed()) { - if (!DISPLAY.readAndDispatch()) { - DISPLAY.sleep(); - } - } -// DISPLAY.dispose(); - assertTrue(appl.getManager().isClosed()); - Thread.sleep(TWO_SECONDS); - assertFalse(appl.isRunning()); - } catch (InvalidCommandName e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } diff --git a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java b/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java index 9a2b50b..b12cd0c 100644 --- a/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java +++ b/gclc-swt/src/test/java/fr/bigeon/gclc/swt/SWTConsoleViewTest.java @@ -50,8 +50,12 @@ import org.junit.Test; import fr.bigeon.gclc.ConsoleApplication; import fr.bigeon.gclc.command.Command; import fr.bigeon.gclc.command.ExitCommand; +import fr.bigeon.gclc.exception.CommandRunException; import fr.bigeon.gclc.exception.InvalidCommandName; -import fr.bigeon.gclc.manager.PipedConsoleManager; +import fr.bigeon.gclc.manager.ConsoleInput; +import fr.bigeon.gclc.manager.ConsoleOutput; +import fr.bigeon.gclc.manager.PipedConsoleInput; +import fr.bigeon.gclc.manager.PipedConsoleOutput; /**

* TODO @@ -67,49 +71,65 @@ public class SWTConsoleViewTest { public void test() { final Shell shell = new Shell(DISPLAY); final SWTConsoleView swtConsole = new SWTConsoleView(shell, SWT.NONE); - try (PipedConsoleManager manager = new PipedConsoleManager()) { - swtConsole.setManager(manager); - } catch (IOException e2) { + try (PipedConsoleOutput manager = new PipedConsoleOutput(); + PipedConsoleInput input = new PipedConsoleInput()) { + swtConsole.setManager(manager, input); + } catch (final IOException e2) { assertNull(e2); } - try (PipedConsoleManager manager = new PipedConsoleManager()) { - swtConsole.setManager(manager); + try (PipedConsoleOutput manager = new PipedConsoleOutput(); + PipedConsoleInput input = new PipedConsoleInput()) { + swtConsole.setManager(manager, input); final ConsoleApplication appl = new ConsoleApplication(manager, + input, "Hello", "See you"); appl.add(new ExitCommand("exit", appl)); appl.add(new Command("long") { + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc.manager.ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) + */ + @Override + public void execute(final ConsoleOutput out, final ConsoleInput in, + final String... args) throws CommandRunException { + try { + Thread.sleep(TWO_SECONDS); + } catch (final InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + @Override public String tip() { return "a long running command"; } + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.Command#usageDetail() */ @Override - public void execute(String... args) { - try { - Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + protected String usageDetail() { + // TODO Auto-generated method stub + // return null; + throw new RuntimeException("Not implemented yet"); } }); // shell.pack(); shell.open(); - Thread applThread = new Thread(new Runnable() { + final Thread applThread = new Thread(new Runnable() { @Override public void run() { appl.start(); } }); - Thread testThread = new Thread(new Runnable() { + final Thread testThread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -122,7 +142,7 @@ public class SWTConsoleViewTest { }); try { Thread.sleep(TWO_SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } @@ -141,10 +161,10 @@ public class SWTConsoleViewTest { DISPLAY.sleep(); } } - } catch (InvalidCommandName e) { + } catch (final InvalidCommandName e) { // TODO Auto-generated catch block e.printStackTrace(); - } catch (IOException e1) { + } catch (final IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } diff --git a/gclc.system/pom.xml b/gclc.system/pom.xml index f8656c8..84eb566 100644 --- a/gclc.system/pom.xml +++ b/gclc.system/pom.xml @@ -23,7 +23,7 @@ fr.bigeon gclc - 1.3.1 + 2.0.0 GCLC system command diff --git a/gclc.system/src/main/java/net/bigeon/gclc/system/ExecSystemCommand.java b/gclc.system/src/main/java/net/bigeon/gclc/system/ExecSystemCommand.java index 0b53e0f..76c7b07 100644 --- a/gclc.system/src/main/java/net/bigeon/gclc/system/ExecSystemCommand.java +++ b/gclc.system/src/main/java/net/bigeon/gclc/system/ExecSystemCommand.java @@ -15,7 +15,8 @@ import java.util.logging.Logger; import fr.bigeon.gclc.command.Command; import fr.bigeon.gclc.exception.CommandRunException; import fr.bigeon.gclc.exception.CommandRunExceptionType; -import fr.bigeon.gclc.manager.ConsoleManager; +import fr.bigeon.gclc.manager.ConsoleInput; +import fr.bigeon.gclc.manager.ConsoleOutput; /** A command that will execute a system command. * @@ -29,71 +30,68 @@ public class ExecSystemCommand extends Command { /** The class logger */ private static final Logger LOGGER = Logger .getLogger(ExecSystemCommand.class.getName()); - /** The manager for the application's user interface */ - private final ConsoleManager manager; - /** @param name the name of the command (the input from the manager that - * should trigger this command) - * @param manager the console manager for input and outputs */ - public ExecSystemCommand(String name, ConsoleManager manager) { - super(name); - this.manager = manager; + /***/ + public ExecSystemCommand() { + super(COMMAND_DEFAULT_NAME); } - /** @param manager the console manager for input and outputs */ - public ExecSystemCommand(ConsoleManager manager) { - super(COMMAND_DEFAULT_NAME); - this.manager = manager; + /** @param name the name of the command (the input from the manager that + * should trigger this command) */ + public ExecSystemCommand(final String name) { + super(name); } /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#execute(java.lang.String[]) */ - @SuppressWarnings("resource") + * @see fr.bigeon.gclc.command.ICommand#execute(fr.bigeon.gclc.manager. + * ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, + * java.lang.String[]) */ @Override - public void execute(String... args) throws CommandRunException { + public void execute(final ConsoleOutput out, final ConsoleInput in, + final String... args) throws CommandRunException { Process proc; try { proc = Runtime.getRuntime().exec(args); - } catch (IOException e2) { + } catch (final IOException e2) { LOGGER.log(Level.SEVERE, "Unable to run process", e2); //$NON-NLS-1$ return; } final InputStream is = proc .getInputStream(); - Thread th = new Thread(new Runnable() { + final Thread th = new Thread(new Runnable() { @SuppressWarnings("synthetic-access") @Override public void run() { try { - readToEnd(is); + readToEnd(out, is); is.close(); - } catch (CommandRunException e) { + } catch (final CommandRunException e) { LOGGER.log(Level.WARNING, "Manager was closed in the meantime...", e); //$NON-NLS-1$ - } catch (IOException e) { + } catch (final IOException e) { LOGGER.log(Level.WARNING, "Input stream was closed...", e); //$NON-NLS-1$ } } }); th.start(); - manager.setPrompt(""); //$NON-NLS-1$ + in.setPrompt(""); //$NON-NLS-1$ final OutputStream os = proc.getOutputStream(); try (BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os))) { while (th.isAlive()) { String user; try { - user = manager.prompt(); - } catch (IOException e) { + user = in.prompt(); + } catch (final IOException e) { throw new CommandRunException( CommandRunExceptionType.INTERACTION, "manager was closed", e, this); //$NON-NLS-1$ } writer.write(user + EOL); } - } catch (IOException e1) { + } catch (final IOException e1) { throw new CommandRunException(CommandRunExceptionType.INTERACTION, "manager was closed", e1, this); //$NON-NLS-1$ } @@ -102,23 +100,31 @@ public class ExecSystemCommand extends Command { /** @param is the input stream * @throws CommandRunException if the manager was closed while writing the * stream */ - protected void readToEnd(InputStream is) throws CommandRunException { + protected void readToEnd(final ConsoleOutput out, + final InputStream is) throws CommandRunException { int c; try { while ((c = is.read()) != -1) { try { - manager.print(Character.valueOf((char) c).toString()); - } catch (IOException e) { + out.print(Character.valueOf((char) c).toString()); + } catch (final IOException e) { throw new CommandRunException( CommandRunExceptionType.INTERACTION, "manager was closed", e, this); //$NON-NLS-1$ } } - } catch (IOException e) { + } catch (final IOException e) { LOGGER.log(Level.INFO, "input stream reading failed", e); //$NON-NLS-1$ } } + /* (non-Javadoc) + * @see fr.bigeon.gclc.command.ICommand#tip() */ + @Override + public String tip() { + return "Execute a system command"; //$NON-NLS-1$ + } + /* (non-Javadoc) * @see fr.bigeon.gclc.command.Command#usageDetail() */ @Override @@ -139,11 +145,4 @@ public class ExecSystemCommand extends Command { return " CMD "; //$NON-NLS-1$ } - /* (non-Javadoc) - * @see fr.bigeon.gclc.command.ICommand#tip() */ - @Override - public String tip() { - return "Execute a system command"; //$NON-NLS-1$ - } - }