Compare commits
26 Commits
gclc-socke
...
socket-1.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 20d5a84269 | |||
| 637cfb8f43 | |||
| d7fbdfb66b | |||
| 22741104f5 | |||
| 45c5375118 | |||
| d01b1608f3 | |||
| 674333a42c | |||
| af0c8e91f8 | |||
| 461dec8894 | |||
| f590542b3f | |||
| c21517a53d | |||
| 7e3b727024 | |||
| bd5b67c312 | |||
| 216cd41dc8 | |||
| 1df33afdbe | |||
| 8d51733590 | |||
| d49a2474e0 | |||
| d7ecd75678 | |||
| 31ad72567a | |||
| 99134c1831 | |||
| dc988a07ac | |||
| 4d31bbacbf | |||
| 2145473706 | |||
| 3f8cee20e1 | |||
| 977c9a8ec8 | |||
| 889433d800 |
65
Jenkinsfile
vendored
Normal file
65
Jenkinsfile
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
pipeline {
|
||||
agent any
|
||||
stages {
|
||||
stage('Site GCLC') {
|
||||
when {
|
||||
tag "gclc-*"
|
||||
}
|
||||
steps {
|
||||
dir('gclc') {
|
||||
sh 'mvn site:site'
|
||||
sh 'mkdir -p /home/maven-sites/net/bigeon/gclc'
|
||||
sh 'cp -r target/site /home/maven-sites/net/bigeon/gclc/gclc'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Site GCLC-Socket') {
|
||||
when {
|
||||
tag "socket-*"
|
||||
}
|
||||
steps {
|
||||
dir('gclc-socket') {
|
||||
sh 'mvn site:site'
|
||||
sh 'mkdir -p /home/maven-sites/net/bigeon/gclc'
|
||||
sh 'cp -r target/site /home/maven-sites/net/bigeon/gclc/gclc-socket'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Site GCLC-Swt') {
|
||||
when {
|
||||
tag "swt-*"
|
||||
}
|
||||
steps {
|
||||
dir('gclc-swt') {
|
||||
sh 'mvn site:site'
|
||||
sh 'mkdir -p /home/maven-sites/net/bigeon/gclc'
|
||||
sh 'cp -r target/site /home/maven-sites/net/bigeon/gclc/gclc-swt'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Site GCLC-Processes') {
|
||||
when {
|
||||
tag "process-*"
|
||||
}
|
||||
steps {
|
||||
dir('gclc-process') {
|
||||
sh 'mvn site:site'
|
||||
sh 'mkdir -p /home/maven-sites/net/bigeon/gclc'
|
||||
sh 'cp -r target/site /home/maven-sites/net/bigeon/gclc/gclc-process'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Site GCLC-System') {
|
||||
when {
|
||||
tag "system-*"
|
||||
}
|
||||
steps {
|
||||
dir('gclc.system') {
|
||||
sh 'mvn site:site'
|
||||
sh 'mkdir -p /home/maven-sites/net/bigeon/gclc'
|
||||
sh 'cp -r target/site /home/maven-sites/net/bigeon/gclc/gclc-system'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +1,57 @@
|
||||
|
||||
<!-- process, Distribution repositories and basic setup for Emmanuel Bigeon projects -->
|
||||
<!-- Copyright (C) 2014-2018 E. Bigeon -->
|
||||
<!-- mailto:emmanuel@bigeon.fr -->
|
||||
<!-- -->
|
||||
<!-- This software is governed by the CeCILL license under French law and -->
|
||||
<!-- abiding by the rules of distribution of free software. You can use, -->
|
||||
<!-- modify and/or redistribute the software under the terms of the CeCILL -->
|
||||
<!-- license as circulated by CEA, CNRS and INRIA at the following URL -->
|
||||
<!-- "http://www.cecill.info". -->
|
||||
<!-- -->
|
||||
<!-- As a counterpart to the access to the source code and rights to copy, -->
|
||||
<!-- modify and redistribute granted by the license, users are provided only -->
|
||||
<!-- with a limited warranty and the software's author, the holder of the -->
|
||||
<!-- economic rights, and the successive licensors have only limited -->
|
||||
<!-- liability. -->
|
||||
<!-- -->
|
||||
<!-- In this respect, the user's attention is drawn to the risks associated -->
|
||||
<!-- with loading, using, modifying and/or developing or reproducing the -->
|
||||
<!-- software by the user in light of its specific status of free software, -->
|
||||
<!-- that may mean that it is complicated to manipulate, and that also -->
|
||||
<!-- therefore means that it is reserved for developers and experienced -->
|
||||
<!-- professionals having in-depth computer knowledge. Users are therefore -->
|
||||
<!-- encouraged to load and test the software's suitability as regards their -->
|
||||
<!-- requirements in conditions enabling the security of their systems and/or -->
|
||||
<!-- data to be ensured and, more generally, to use and operate it in the -->
|
||||
<!-- same conditions as regards security. -->
|
||||
<!-- -->
|
||||
<!-- The fact that you are presently reading this means that you have had -->
|
||||
<!-- knowledge of the CeCILL license and that you accept its terms. -->
|
||||
<!-- process, Distribution repositories and basic setup for Emmanuel Bigeon
|
||||
projects -->
|
||||
<!-- Copyright (C) 2014-2018 E. Bigeon -->
|
||||
<!-- mailto:emmanuel@bigeon.fr -->
|
||||
<!-- -->
|
||||
<!-- This software is governed by the CeCILL license under French law and -->
|
||||
<!-- abiding by the rules of distribution of free software. You can use, -->
|
||||
<!-- modify and/or redistribute the software under the terms of the CeCILL -->
|
||||
<!-- license as circulated by CEA, CNRS and INRIA at the following URL -->
|
||||
<!-- "http://www.cecill.info". -->
|
||||
<!-- -->
|
||||
<!-- As a counterpart to the access to the source code and rights to copy, -->
|
||||
<!-- modify and redistribute granted by the license, users are provided only -->
|
||||
<!-- with a limited warranty and the software's author, the holder of the -->
|
||||
<!-- economic rights, and the successive licensors have only limited -->
|
||||
<!-- liability. -->
|
||||
<!-- -->
|
||||
<!-- In this respect, the user's attention is drawn to the risks associated -->
|
||||
<!-- with loading, using, modifying and/or developing or reproducing the -->
|
||||
<!-- software by the user in light of its specific status of free software, -->
|
||||
<!-- that may mean that it is complicated to manipulate, and that also -->
|
||||
<!-- therefore means that it is reserved for developers and experienced -->
|
||||
<!-- professionals having in-depth computer knowledge. Users are therefore -->
|
||||
<!-- encouraged to load and test the software's suitability as regards their -->
|
||||
<!-- requirements in conditions enabling the security of their systems and/or -->
|
||||
<!-- data to be ensured and, more generally, to use and operate it in the -->
|
||||
<!-- same conditions as regards security. -->
|
||||
<!-- -->
|
||||
<!-- The fact that you are presently reading this means that you have had -->
|
||||
<!-- knowledge of the CeCILL license and that you accept its terms. -->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.21</version>
|
||||
</parent>
|
||||
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>process</artifactId>
|
||||
<version>0.0.4-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>process</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.12</version>
|
||||
</parent>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>process</artifactId>
|
||||
<version>0.0.4-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>process</name>
|
||||
<description>A library to handle processes in a generic console application.</description><url>https://bigeon.net/projects/gclc.html</url>
|
||||
<inceptionYear>2017</inceptionYear>
|
||||
<organization>
|
||||
<name>Bigeon</name>
|
||||
<url>https://bigeon.net</url>
|
||||
</organization>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
@@ -66,15 +59,7 @@
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
@@ -85,9 +70,30 @@
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<scm>
|
||||
<tag>HEAD</tag>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
</scm>
|
||||
<scm>
|
||||
<tag>HEAD</tag>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
</scm>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -69,6 +69,8 @@ package net.bigeon.gclc.process;
|
||||
* #L%
|
||||
*/
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import net.bigeon.gclc.command.CommandParameters;
|
||||
import net.bigeon.gclc.command.ParametrizedCommand;
|
||||
@@ -92,28 +94,33 @@ import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
* @author Emmanuel Bigeon */
|
||||
public class CommandForeground extends ParametrizedCommand {
|
||||
|
||||
/** Number of milliseconds in a second. */
|
||||
private static final int MILLIS_IN_A_SEC = 1000;
|
||||
/** The class logger. */
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(CommandForeground.class.getName());
|
||||
|
||||
/** The task pool to fetch task from. */
|
||||
private final TaskPool pool;
|
||||
|
||||
/** Add the fork command.
|
||||
*
|
||||
* @param name the command name
|
||||
* @param pool The pool to get joinable tasks from */
|
||||
public CommandForeground(final String name, TaskPool pool) {
|
||||
public CommandForeground(final String name, final TaskPool pool) {
|
||||
super(name, false);
|
||||
this.pool = pool;
|
||||
addParameters();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
/** Add the parameters of the command. */
|
||||
private void addParameters() {
|
||||
try {
|
||||
addStringParameter("pid", false);
|
||||
addStringParameter("delai", false);
|
||||
} catch (final InvalidParameterException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
// Cannot be reached unless GCLC base framework has an error
|
||||
LOGGER.log(Level.SEVERE, "unexpected parameter error!", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +148,7 @@ public class CommandForeground extends ParametrizedCommand {
|
||||
long delai = 0;
|
||||
final String delaiOpt = parameters.get("delai");
|
||||
if (delaiOpt != null) {
|
||||
delai = Long.parseLong(delaiOpt) * 1000;
|
||||
delai = Long.parseLong(delaiOpt) * MILLIS_IN_A_SEC;
|
||||
}
|
||||
if (delai < 0) {
|
||||
throw new CommandRunException("Join delai cannot be negative");
|
||||
|
||||
@@ -1,34 +1,3 @@
|
||||
/*
|
||||
* process, Distribution repositories and basic setup for Emmanuel Bigeon projects
|
||||
* Copyright (C) 2014-2018 E. Bigeon
|
||||
* mailto:emmanuel@bigeon.fr
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*/
|
||||
/**
|
||||
* gclc-process:net.bigeon.gclc.process.CommandFork.java
|
||||
* Created on: Nov 13, 2017
|
||||
@@ -91,15 +60,19 @@ import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
* @author Emmanuel Bigeon */
|
||||
public class CommandFork extends Command {
|
||||
|
||||
/** The task pool containing the tasks. */
|
||||
private final TaskPool pool;
|
||||
/** The command provider. */
|
||||
private final ICommandProvider provider;
|
||||
/** The number of lines stored in the commands. */
|
||||
private final int lines;
|
||||
|
||||
/** Add the fork command.
|
||||
*
|
||||
* @param name the command name
|
||||
* @param provider the allowed command collection */
|
||||
public CommandFork(final String name, ICommandProvider provider, TaskPool pool) {
|
||||
public CommandFork(final String name, final ICommandProvider provider,
|
||||
final TaskPool pool) {
|
||||
this(name, provider, pool, -1);
|
||||
}
|
||||
|
||||
@@ -107,17 +80,20 @@ public class CommandFork extends Command {
|
||||
*
|
||||
* @param name the command name
|
||||
* @param provider the allowed command collection */
|
||||
public CommandFork(final String name, ICommandProvider provider, TaskPool pool,
|
||||
int lines) {
|
||||
public CommandFork(final String name, final ICommandProvider provider,
|
||||
final TaskPool pool, final int lines) {
|
||||
super(name);
|
||||
this.provider = provider;
|
||||
this.pool = pool;
|
||||
this.lines = lines;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.bigeon.gclc.command.ICommand#execute(net.bigeon.gclc.manager.
|
||||
* ConsoleOutput, net.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) */
|
||||
@Override
|
||||
public void execute(final ConsoleOutput out, final ConsoleInput in, String... args)
|
||||
throws CommandRunException {
|
||||
public void execute(final ConsoleOutput out, final ConsoleInput in,
|
||||
final String... args) throws CommandRunException {
|
||||
if (args.length < 1) {
|
||||
throw new CommandRunException("No command to fork");
|
||||
}
|
||||
|
||||
@@ -77,23 +77,28 @@ import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
import net.bigeon.gclc.process.io.ConnectingConsoleInput;
|
||||
import net.bigeon.gclc.process.io.ConnectingConsoleOutput;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* TODO
|
||||
/** A task that is made to run into a thread.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public abstract class ForkTask implements Task {
|
||||
|
||||
/** THe listeners. */
|
||||
private final Set<InterruptionListener> listeners = new HashSet<>();
|
||||
/** The running state. */
|
||||
private boolean running = false;
|
||||
|
||||
protected final ConnectingConsoleInput in = new ConnectingConsoleInput();
|
||||
/** The connecting input for this task */
|
||||
protected final ConnectingConsoleInput in = new ConnectingConsoleInput();
|
||||
/** The connecting output for this task */
|
||||
protected final ConnectingConsoleOutput out;
|
||||
/** The exception of the run. */
|
||||
private CommandRunException exception;
|
||||
private final Object runLock = new Object();
|
||||
/** The synchronization lock. */
|
||||
private final Object runLock = new Object();
|
||||
|
||||
/** @param lines the number of print to store in the output */
|
||||
public ForkTask(int lines) {
|
||||
/** Create the task.
|
||||
*
|
||||
* @param lines the number of print to store in the output */
|
||||
public ForkTask(final int lines) {
|
||||
out = new ConnectingConsoleOutput(ConnectingConsoleOutput.PERSIST, lines);
|
||||
}
|
||||
|
||||
@@ -128,10 +133,13 @@ public abstract class ForkTask implements Task {
|
||||
}
|
||||
}
|
||||
|
||||
/** @param out the console output
|
||||
/** Join the task.
|
||||
*
|
||||
* @param out the console output
|
||||
* @param in the console input
|
||||
* @param timeout the maximal wait (0 for ever) */
|
||||
public final void join(final ConsoleOutput out, final ConsoleInput in, long timeout) {
|
||||
* @param timeout the maximal time to join for (0 for ever) */
|
||||
public final void join(final ConsoleOutput out, final ConsoleInput in,
|
||||
final long timeout) {
|
||||
synchronized (runLock) {
|
||||
this.out.connect(out);
|
||||
this.in.connect(in);
|
||||
@@ -140,7 +148,6 @@ public abstract class ForkTask implements Task {
|
||||
runLock.wait(timeout);
|
||||
}
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO log.
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
this.out.disconnect();
|
||||
|
||||
@@ -68,9 +68,10 @@ package net.bigeon.gclc.process;
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
/** A listener for interruption
|
||||
/** A listener for interruption.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
@FunctionalInterface
|
||||
public interface InterruptionListener {
|
||||
/** Notification of an interuption of a listened object */
|
||||
void interrupted();
|
||||
|
||||
@@ -69,7 +69,6 @@ package net.bigeon.gclc.process;
|
||||
* #L%
|
||||
*/
|
||||
import net.bigeon.gclc.command.Command;
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
@@ -92,18 +91,16 @@ public final class ProcessClear extends Command {
|
||||
* ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) */
|
||||
@Override
|
||||
public void execute(final ConsoleOutput out, final ConsoleInput in,
|
||||
final String... args) throws CommandRunException {
|
||||
final String... args) {
|
||||
for (final String id : pool.getPIDs()) {
|
||||
if (!pool.get(id).isRunning()) {
|
||||
pool.remove(id);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||
@SuppressWarnings("nls")
|
||||
@Override
|
||||
public String tip() {
|
||||
return "Request a process to stop (softly)";
|
||||
|
||||
@@ -69,7 +69,6 @@ package net.bigeon.gclc.process;
|
||||
* #L%
|
||||
*/
|
||||
import net.bigeon.gclc.command.Command;
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
@@ -92,13 +91,12 @@ public final class ProcessKill extends Command {
|
||||
* ConsoleOutput, fr.bigeon.gclc.manager.ConsoleInput, java.lang.String[]) */
|
||||
@Override
|
||||
public void execute(final ConsoleOutput out, final ConsoleInput in,
|
||||
final String... args) throws CommandRunException {
|
||||
final String... args) {
|
||||
pool.get(args[0]).setRunning(false);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||
@SuppressWarnings("nls")
|
||||
@Override
|
||||
public String tip() {
|
||||
return "Request a process to stop (softly)";
|
||||
|
||||
@@ -115,7 +115,6 @@ public final class ProcessList extends Command {
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||
@SuppressWarnings("nls")
|
||||
@Override
|
||||
public String tip() {
|
||||
return "List all processes";
|
||||
|
||||
@@ -91,7 +91,7 @@ public final class TaskPool {
|
||||
}
|
||||
|
||||
/** Default constructor. */
|
||||
public TaskPool(boolean autoClear) {
|
||||
public TaskPool(final boolean autoClear) {
|
||||
this.autoClear = autoClear;
|
||||
}
|
||||
|
||||
@@ -110,12 +110,9 @@ public final class TaskPool {
|
||||
}
|
||||
if (autoClear) {
|
||||
cmd.addInterruptionListener(new InterruptionListener() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void interrupted() {
|
||||
synchronized (lock) {
|
||||
remove(pid);
|
||||
}
|
||||
remove(pid);
|
||||
cmd.rmInterruptionListener(this);
|
||||
}
|
||||
});
|
||||
@@ -161,7 +158,7 @@ public final class TaskPool {
|
||||
/** Remove a task from the pool
|
||||
*
|
||||
* @param pid the task id */
|
||||
public void remove(String pid) {
|
||||
public void remove(final String pid) {
|
||||
synchronized (lock) {
|
||||
running.remove(pid);
|
||||
count = Math.min(count, Integer.parseInt(pid));
|
||||
|
||||
@@ -86,7 +86,7 @@ public abstract class TaskSpawner extends Command {
|
||||
/** @param name the command name
|
||||
* @param pool the pool */
|
||||
public TaskSpawner(final String name, final TaskPool pool,
|
||||
ExecutorService threadPool) {
|
||||
final ExecutorService threadPool) {
|
||||
super(name);
|
||||
this.pool = pool;
|
||||
this.threadPool = threadPool;
|
||||
@@ -107,8 +107,7 @@ public abstract class TaskSpawner extends Command {
|
||||
public final void execute(final ConsoleOutput out, final ConsoleInput in,
|
||||
final String... args) throws CommandRunException {
|
||||
final Task task = createTask(out, in, args);
|
||||
final Thread th = new Thread(task);
|
||||
pool.add(task);
|
||||
threadPool.execute(th);
|
||||
threadPool.execute(task);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,29 +72,46 @@ import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.tools.ConstantString;
|
||||
import net.bigeon.gclc.tools.StringProvider;
|
||||
|
||||
/** @author Emmanuel Bigeon */
|
||||
/** A console input that can be connected to and diconnected from.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
|
||||
private static final Logger LOGGER = Logger
|
||||
/** The empty string provider. */
|
||||
private static final ConstantString EMPTY_STRING = new ConstantString("");
|
||||
/** The logger. */
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(ConnectingConsoleInput.class.getName());
|
||||
private boolean close = false;
|
||||
private StringProvider prompt;
|
||||
private boolean prompting;
|
||||
private final Object promptLock = new Object();
|
||||
private final Object connectionLock = new Object();
|
||||
private ConsoleInput connected;
|
||||
private boolean disconnection;
|
||||
|
||||
/** If the input is closed. */
|
||||
private boolean close = false;
|
||||
/** The prompt string. */
|
||||
private StringProvider prompt = EMPTY_STRING;
|
||||
/** If the input is currently in prompting state. */
|
||||
private boolean prompting = false;
|
||||
/** The synchronization lock for the rompting status. */
|
||||
private final Object promptLock = new Object();
|
||||
/** The synchronization lock for the connection status. */
|
||||
private final Object connectionLock = new Object();
|
||||
/** The connected console input. */
|
||||
private ConsoleInput connected = null;
|
||||
/** The connection state. */
|
||||
private boolean disconnection = false;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#close() */
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
public void close() {
|
||||
close = true;
|
||||
}
|
||||
|
||||
public void connect(ConsoleInput input) {
|
||||
/** Connect an input.
|
||||
*
|
||||
* @param input the input to connect */
|
||||
public void connect(final ConsoleInput input) {
|
||||
disconnect();
|
||||
synchronized (promptLock) {
|
||||
connected = input;
|
||||
@@ -102,6 +119,7 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
}
|
||||
}
|
||||
|
||||
/** Disconnect the current input. */
|
||||
public void disconnect() {
|
||||
synchronized (connectionLock) {
|
||||
if (connected != null) {
|
||||
@@ -151,19 +169,22 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#prompt(long) */
|
||||
@Override
|
||||
public String prompt(long timeout) throws IOException {
|
||||
public String prompt(final long timeout) throws IOException {
|
||||
return prompt(prompt.apply(), timeout);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#prompt(java.lang.String) */
|
||||
@Override
|
||||
public String prompt(String message) throws IOException {
|
||||
public String prompt(final String message) throws IOException {
|
||||
synchronized (promptLock) {
|
||||
prompting = true;
|
||||
}
|
||||
while (prompting) {
|
||||
while (true) {
|
||||
synchronized (promptLock) {
|
||||
if (!prompting) {
|
||||
return null;
|
||||
}
|
||||
if (connected == null) {
|
||||
try {
|
||||
promptLock.wait();
|
||||
@@ -178,18 +199,19 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
disconnection = false;
|
||||
} else if (prompting) {
|
||||
return res;
|
||||
} else {
|
||||
// prompt interrupted, lose the result.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#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 {
|
||||
if (timeout <= 0) {
|
||||
return prompt(message);
|
||||
}
|
||||
@@ -197,8 +219,11 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
synchronized (promptLock) {
|
||||
prompting = true;
|
||||
}
|
||||
while (prompting) {
|
||||
while (true) {
|
||||
synchronized (promptLock) {
|
||||
if (!prompting) {
|
||||
return null;
|
||||
}
|
||||
if (connected == null) {
|
||||
try {
|
||||
promptLock.wait();
|
||||
@@ -214,12 +239,13 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
disconnection = false;
|
||||
} else if (prompting) {
|
||||
return res;
|
||||
} else {
|
||||
// prompt interrupted, lose the result.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -238,7 +264,7 @@ public final class ConnectingConsoleInput implements ConsoleInput {
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#setPrompt(fr.bigeon.gclc.tools.
|
||||
* StringProvider) */
|
||||
@Override
|
||||
public void setPrompt(StringProvider string) {
|
||||
public void setPrompt(final StringProvider string) {
|
||||
prompt = string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,26 +75,37 @@ import java.util.logging.Logger;
|
||||
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
/** @author Emmanuel Bigeon */
|
||||
/** A console output that can be connected and disconnected from.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
|
||||
/** The logger. */
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(ConnectingConsoleOutput.class.getName());
|
||||
/** If the undelivered message should be stored. */
|
||||
/** The flag indicating that the un-delivered message should be stored. */
|
||||
public static final int QUEUE = 1;
|
||||
/** If the messages should be stored in all cases. */
|
||||
/** The flag indicating that the messages should be stored in all cases. */
|
||||
public static final int PERSIST = 1 << 1;
|
||||
/** The connected output console */
|
||||
private ConsoleOutput output;
|
||||
/** If the console is closed */
|
||||
private boolean close = false;
|
||||
|
||||
/** If the messages should be stored. */
|
||||
private final boolean persistent;
|
||||
/** If the message should be stored until delivery. */
|
||||
private final boolean queued;
|
||||
/** The messages. */
|
||||
private final Deque<String> messages;
|
||||
/** The number of stored messages. */
|
||||
private final int lines;
|
||||
|
||||
/** @param style the type of redirected output
|
||||
/** Create the console output.
|
||||
*
|
||||
* @param style the type of redirected output
|
||||
* @param lines the number of lines to store */
|
||||
public ConnectingConsoleOutput(int style, int lines) {
|
||||
public ConnectingConsoleOutput(final int style, final int lines) {
|
||||
super();
|
||||
this.lines = lines;
|
||||
queued = (style & QUEUE) != 0;
|
||||
@@ -106,7 +117,10 @@ public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void addMessage(String text) {
|
||||
/** Add a message.
|
||||
*
|
||||
* @param text the message */
|
||||
private synchronized void addMessage(final String text) {
|
||||
if (persistent || queued && output == null) {
|
||||
if (messages.size() == lines) {
|
||||
messages.poll();
|
||||
@@ -130,7 +144,10 @@ public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
close = true;
|
||||
}
|
||||
|
||||
public synchronized void connect(ConsoleOutput output) {
|
||||
/** Connect an output.
|
||||
*
|
||||
* @param output the output */
|
||||
public synchronized void connect(final ConsoleOutput output) {
|
||||
this.output = output;
|
||||
for (final String string : messages) {
|
||||
try {
|
||||
@@ -145,6 +162,7 @@ public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
}
|
||||
}
|
||||
|
||||
/** Disconnect the currently connected output. */
|
||||
public synchronized void disconnect() {
|
||||
output = null;
|
||||
}
|
||||
@@ -159,7 +177,7 @@ public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleOutput#print(java.lang.String) */
|
||||
@Override
|
||||
public void print(String text) {
|
||||
public void print(final String text) {
|
||||
addMessage(text);
|
||||
}
|
||||
|
||||
@@ -173,7 +191,7 @@ public class ConnectingConsoleOutput implements ConsoleOutput {
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleOutput#println(java.lang.String) */
|
||||
@Override
|
||||
public void println(String message) {
|
||||
public void println(final String message) {
|
||||
addMessage(message + System.lineSeparator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/** Connecting Input and Output related classes.
|
||||
* <p>
|
||||
* This package groups the Connecting classes that are used to be able to put
|
||||
* the tasks in background and foreground and reattach the actual console input
|
||||
* and outputs to the tasks' ones.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
package net.bigeon.gclc.process.io;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* process
|
||||
* %%
|
||||
* Copyright (C) 2014 - 2018 Bigeon
|
||||
* %%
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
@@ -0,0 +1,48 @@
|
||||
/** This package defines elements for processes inside a console application.
|
||||
* <p>
|
||||
* Processes are tasks that are run in background of the application. One may
|
||||
* want to temporarily connect to such a task (through
|
||||
* {@link net.bigeon.gclc.process.CommandForeground}), or verify it's actual
|
||||
* running status (through {@link net.bigeon.gclc.process.ProcessList}. One may
|
||||
* also want to start such a process (through
|
||||
* {@link net.bigeon.gclc.process.ForkCommandTask}) or close it (through
|
||||
* {@link net.bigeon.gclc.process.ProcessKill}).
|
||||
* <p>
|
||||
* The task list can be managed by several commands to list or clear it.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
package net.bigeon.gclc.process;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* process
|
||||
* %%
|
||||
* Copyright (C) 2014 - 2018 Bigeon
|
||||
* %%
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
@@ -1,64 +1,22 @@
|
||||
|
||||
<!-- GCLC Socket, Socket implementation of GCLC -->
|
||||
<!-- Copyright (C) 2014-2017 E. Bigeon -->
|
||||
<!-- mailto:emmanuel@bigeon.fr -->
|
||||
<!-- -->
|
||||
<!-- This software is governed by the CeCILL license under French law and -->
|
||||
<!-- abiding by the rules of distribution of free software. You can use, -->
|
||||
<!-- modify and/or redistribute the software under the terms of the CeCILL -->
|
||||
<!-- license as circulated by CEA, CNRS and INRIA at the following URL -->
|
||||
<!-- "http://www.cecill.info". -->
|
||||
<!-- -->
|
||||
<!-- As a counterpart to the access to the source code and rights to copy, -->
|
||||
<!-- modify and redistribute granted by the license, users are provided only -->
|
||||
<!-- with a limited warranty and the software's author, the holder of the -->
|
||||
<!-- economic rights, and the successive licensors have only limited -->
|
||||
<!-- liability. -->
|
||||
<!-- -->
|
||||
<!-- In this respect, the user's attention is drawn to the risks associated -->
|
||||
<!-- with loading, using, modifying and/or developing or reproducing the -->
|
||||
<!-- software by the user in light of its specific status of free software, -->
|
||||
<!-- that may mean that it is complicated to manipulate, and that also -->
|
||||
<!-- therefore means that it is reserved for developers and experienced -->
|
||||
<!-- professionals having in-depth computer knowledge. Users are therefore -->
|
||||
<!-- encouraged to load and test the software's suitability as regards their -->
|
||||
<!-- requirements in conditions enabling the security of their systems and/or -->
|
||||
<!-- data to be ensured and, more generally, to use and operate it in the -->
|
||||
<!-- same conditions as regards security. -->
|
||||
<!-- -->
|
||||
<!-- The fact that you are presently reading this means that you have had -->
|
||||
<!-- knowledge of the CeCILL license and that you accept its terms. -->
|
||||
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>gclc-socket</artifactId>
|
||||
<version>1.1.11</version>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://www.bigeon.net</url>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.scm.id>git.code.bigeon.net</project.scm.id>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>smu</artifactId>
|
||||
<version>1.0.5</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.12</version>
|
||||
<version>1.8.21</version>
|
||||
</parent>
|
||||
<artifactId>socket</artifactId>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<version>1.1.12</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>GCLC Socket</name>
|
||||
<description>Socket implementation of GCLC</description>
|
||||
<url>https://bigeon.net/projects/gclc.html</url>
|
||||
<inceptionYear>2016</inceptionYear>
|
||||
<organization>
|
||||
<name>Bigeon</name>
|
||||
<url>https://bigeon.net/</url>
|
||||
</organization>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
@@ -66,15 +24,6 @@
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
@@ -85,12 +34,34 @@
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
<name>GCLC Socket</name>
|
||||
<description>Socket implementation of GCLC</description>
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>gclc-socket-1.1.11</tag>
|
||||
<tag>socket-1.1.12</tag>
|
||||
</scm>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<inceptionYear>2016</inceptionYear>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.scm.id>git.code.bigeon.net</project.scm.id>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.10</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>smu</artifactId>
|
||||
<version>1.0.6</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
</project>
|
||||
|
||||
@@ -143,7 +143,8 @@ public final class DConnexionManager<T> implements ConnexionManager<T> {
|
||||
*
|
||||
* @return a new ID */
|
||||
private String newID() {
|
||||
return "Client " + count++; //$NON-NLS-1$
|
||||
final int c = count++;
|
||||
return "Client " + c; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -54,9 +54,12 @@ import net.bigeon.gclc.utils.ReadingRunnable;
|
||||
/** A console input where the stream can be plugged.
|
||||
* <p>
|
||||
* This pluggable console input accepts an input and output to be connected to
|
||||
* it. The connexion cannot be concurrent, which mean that any connected stream
|
||||
* it. The connection cannot be concurrent, which mean that any connected stream
|
||||
* must be disconnected before a new call to
|
||||
* {@link #connect(InputStream, PrintStream)} is done.
|
||||
* <p>
|
||||
* On connection, if the prompt is in wait, this console input will provide the
|
||||
* prompting message.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public final class PluggableConsoleInput implements ConsoleInput {
|
||||
@@ -109,15 +112,15 @@ public final class PluggableConsoleInput implements ConsoleInput {
|
||||
throws IOException {
|
||||
synchronized (connexionLock) {
|
||||
if (connected) {
|
||||
// Cannot be connected to several sources
|
||||
throw new IOException("Input already connected to an input stream"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
output = out;
|
||||
if (prompting) {
|
||||
// print the hint, to indicate we are waiting for a user input.
|
||||
out.print(hint);
|
||||
out.flush();
|
||||
}
|
||||
|
||||
final InputStreamReader streamReader = new InputStreamReader(stream,
|
||||
StandardCharsets.UTF_8);
|
||||
final BufferedReader reader = new BufferedReader(streamReader);
|
||||
@@ -189,19 +192,11 @@ public final class PluggableConsoleInput implements ConsoleInput {
|
||||
if (closed) {
|
||||
throw new IOException();
|
||||
}
|
||||
prompting = true;
|
||||
hint = message;
|
||||
synchronized (connexionLock) {
|
||||
hint = message;
|
||||
if (connected) {
|
||||
output.print(message);
|
||||
output.flush();
|
||||
}
|
||||
}
|
||||
|
||||
preparePrompt(message);
|
||||
String res = null;
|
||||
while (res == null && !interrupted) {
|
||||
try {
|
||||
// Wait for a message or a connection with message
|
||||
res = waitMessageOrConnexion(TIMEOUT, TIMEOUT / TENTH);
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.FINE, "Interruption of thread", e); //$NON-NLS-1$
|
||||
@@ -215,6 +210,22 @@ public final class PluggableConsoleInput implements ConsoleInput {
|
||||
return res;
|
||||
}
|
||||
|
||||
/** Prepare the new prompt.
|
||||
*
|
||||
* @param message the message to indicate request of prompt. */
|
||||
private void preparePrompt(final String message) {
|
||||
prompting = true;
|
||||
// hold the message
|
||||
synchronized (connexionLock) {
|
||||
hint = message;
|
||||
if (connected) {
|
||||
// print the message
|
||||
output.print(message);
|
||||
output.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#prompt(java.lang.String, long) */
|
||||
@Override
|
||||
@@ -222,15 +233,7 @@ public final class PluggableConsoleInput implements ConsoleInput {
|
||||
if (closed) {
|
||||
throw new IOException();
|
||||
}
|
||||
prompting = true;
|
||||
synchronized (connexionLock) {
|
||||
hint = message;
|
||||
if (connected) {
|
||||
output.print(message);
|
||||
output.flush();
|
||||
}
|
||||
}
|
||||
|
||||
preparePrompt(message);
|
||||
String res = null;
|
||||
final long tic = System.currentTimeMillis();
|
||||
long time = System.currentTimeMillis() - tic;
|
||||
@@ -250,11 +253,16 @@ public final class PluggableConsoleInput implements ConsoleInput {
|
||||
return res;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.bigeon.gclc.manager.ConsoleInput#setPrompt(java.lang.String) */
|
||||
@Override
|
||||
public void setPrompt(String prompt) {
|
||||
public void setPrompt(final String prompt) {
|
||||
setPrompt(new ConstantString(prompt));
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.bigeon.gclc.manager.ConsoleInput#setPrompt(net.bigeon.gclc.tools.
|
||||
* StringProvider) */
|
||||
@Override
|
||||
public void setPrompt(final StringProvider prompt) {
|
||||
this.prompt = prompt;
|
||||
|
||||
@@ -123,8 +123,7 @@ public final class RemoteDisconnectCommand<T> extends Command {
|
||||
@Override
|
||||
protected String usageDetail() {
|
||||
return MessageFormat.format(
|
||||
" If arguments are provided the corresponding connexions are closed, "
|
||||
+ "otherwise{0}{1} are.",
|
||||
System.lineSeparator(), all ? "all connexions" : "none");
|
||||
" If arguments are provided the corresponding connexions are closed, otherwise\n{0} are.",
|
||||
all ? "all connexions" : "none");
|
||||
}
|
||||
}
|
||||
|
||||
131
gclc-swt/pom.xml
131
gclc-swt/pom.xml
@@ -1,69 +1,24 @@
|
||||
|
||||
<!-- GCLC swt, provide a swt window for console applications -->
|
||||
<!-- Copyright (C) 2015-2017 E. Bigeon -->
|
||||
<!-- mailto:emmanuel@bigeon.fr -->
|
||||
<!-- -->
|
||||
<!-- This software is governed by the CeCILL license under French law and -->
|
||||
<!-- abiding by the rules of distribution of free software. You can use, -->
|
||||
<!-- modify and/or redistribute the software under the terms of the CeCILL -->
|
||||
<!-- license as circulated by CEA, CNRS and INRIA at the following URL -->
|
||||
<!-- "http://www.cecill.info". -->
|
||||
<!-- -->
|
||||
<!-- As a counterpart to the access to the source code and rights to copy, -->
|
||||
<!-- modify and redistribute granted by the license, users are provided only -->
|
||||
<!-- with a limited warranty and the software's author, the holder of the -->
|
||||
<!-- economic rights, and the successive licensors have only limited -->
|
||||
<!-- liability. -->
|
||||
<!-- -->
|
||||
<!-- In this respect, the user's attention is drawn to the risks associated -->
|
||||
<!-- with loading, using, modifying and/or developing or reproducing the -->
|
||||
<!-- software by the user in light of its specific status of free software, -->
|
||||
<!-- that may mean that it is complicated to manipulate, and that also -->
|
||||
<!-- therefore means that it is reserved for developers and experienced -->
|
||||
<!-- professionals having in-depth computer knowledge. Users are therefore -->
|
||||
<!-- encouraged to load and test the software's suitability as regards their -->
|
||||
<!-- requirements in conditions enabling the security of their systems and/or -->
|
||||
<!-- data to be ensured and, more generally, to use and operate it in the -->
|
||||
<!-- same conditions as regards security. -->
|
||||
<!-- -->
|
||||
<!-- The fact that you are presently reading this means that you have had -->
|
||||
<!-- knowledge of the CeCILL license and that you accept its terms. -->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>gclc-swt</artifactId>
|
||||
<version>1.1.6-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<inceptionYear>2015</inceptionYear>
|
||||
<name>GCLC swt</name>
|
||||
<description>A swt window for console applications</description>
|
||||
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>swt-config</artifactId>
|
||||
<version>1.8.9</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>collections</artifactId>
|
||||
<version>1.1.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>swt-config</artifactId>
|
||||
<version>1.8.11</version>
|
||||
</parent>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>swt</artifactId>
|
||||
<version>1.1.6-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>GCLC swt</name>
|
||||
<description>A swt window for console applications</description>
|
||||
<inceptionYear>2015</inceptionYear>
|
||||
<url>https://bigeon.net/projects/gclc.html</url>
|
||||
<organization>
|
||||
<name>Bigeon</name>
|
||||
<url>https://bigeon.net/</url>
|
||||
</organization>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
@@ -71,15 +26,6 @@
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
@@ -90,9 +36,36 @@
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>collections</artifactId>
|
||||
<version>1.1.4</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
</project>
|
||||
|
||||
@@ -131,11 +131,14 @@ public final class HistoryTextKeyListener extends KeyAdapter {
|
||||
|
||||
// Lower arrow retrieves next commands
|
||||
if (keyCode == SWT.ARROW_DOWN) {
|
||||
if (currentIndex == 0) {
|
||||
if (currentIndex <= 0) {
|
||||
if (currentIndex == 0) {
|
||||
console.setInput(EMPTY);
|
||||
}
|
||||
currentIndex = -1;
|
||||
} else {
|
||||
currentIndex--;
|
||||
console.setInput(EMPTY);
|
||||
} else if (currentIndex > 0) {
|
||||
final String cmd = commands.get(commands.size() - (--currentIndex) - 1);
|
||||
final String cmd = commands.get(commands.size() - currentIndex - 1);
|
||||
console.setInput(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,29 +92,32 @@ import net.bigeon.gclc.tools.StringProvider;
|
||||
* @author Emmanuel Bigeon */
|
||||
public final class SWTConsole extends Composite
|
||||
implements ConsoleDelayIO, ConsoleInput, ConsoleOutput {
|
||||
private static final int TWO = 2;
|
||||
private static final String ERROR_SYNCHRO_PROMPT = "Error in synchronization of prompting";
|
||||
/** The number of columns of the layout. */
|
||||
private static final int LAYOUT_NB_COLUMNS = 2;
|
||||
private static final int LAYOUT_NB_COLUMNS = 2;
|
||||
/** The cmd prefix in the output console. */
|
||||
private static final String CMD_PREFIX = "[CMD] "; //$NON-NLS-1$
|
||||
private static final String CMD_PREFIX = "[CMD] "; //$NON-NLS-1$
|
||||
/** The class logger. */
|
||||
private static final Logger LOGGER = Logger
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(SWTConsole.class.getName());
|
||||
/** The empty string constant. */
|
||||
private static final String EMPTY = ""; //$NON-NLS-1$
|
||||
private static final String EMPTY = ""; //$NON-NLS-1$
|
||||
|
||||
/** The console output text field. */
|
||||
private final Text consoleOutput;
|
||||
private final Text consoleOutput;
|
||||
/** The console input text field. */
|
||||
private final Text consoleInput;
|
||||
private final Text consoleInput;
|
||||
/** The prompt label. */
|
||||
private final Label lblPromptlabel;
|
||||
private final Label lblPromptlabel;
|
||||
/** The prompt text. */
|
||||
private StringProvider prompt = new ConstantString("> "); //$NON-NLS-1$
|
||||
private StringProvider prompt = new ConstantString("> "); //$NON-NLS-1$
|
||||
/** The command entered by the user. */
|
||||
private String command = null;
|
||||
private String command = null;
|
||||
/** If the prompt should be active. */
|
||||
private boolean prompting = false;
|
||||
private boolean prompting = false;
|
||||
/** The object for thread synchronization with the prompt. */
|
||||
private final Object promptLock = new Object();
|
||||
private final Object promptLock = new Object();
|
||||
|
||||
/** Create the composite.
|
||||
*
|
||||
@@ -140,6 +143,8 @@ public final class SWTConsole extends Composite
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.widgets.Composite#checkSubclass() */
|
||||
@Override
|
||||
protected void checkSubclass() {
|
||||
// Disable the check that prevents subclassing of SWT components
|
||||
@@ -250,29 +255,14 @@ public final class SWTConsole extends Composite
|
||||
@Override
|
||||
public String prompt() throws IOException {
|
||||
synchronized (promptLock) {
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
initPrompt(prompt.apply());
|
||||
promptLock.notifyAll();
|
||||
try {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleInput.isDisposed()) {
|
||||
consoleInput.setEnabled(true);
|
||||
lblPromptlabel.setText(prompt.apply());
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
consoleInput.setFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
prompting = true;
|
||||
promptLock.notifyAll();
|
||||
while (prompting) {
|
||||
promptLock.wait();
|
||||
}
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$
|
||||
LOGGER.log(Level.WARNING, ERROR_SYNCHRO_PROMPT, e);
|
||||
command = null;
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
@@ -283,45 +273,46 @@ public final class SWTConsole extends Composite
|
||||
return command;
|
||||
}
|
||||
|
||||
/** Initialize the prompting.
|
||||
*
|
||||
* @param message the prompt message
|
||||
* @throws IOException if the console is disposed */
|
||||
private void initPrompt(final String message) throws IOException {
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleOutput.isDisposed()) {
|
||||
lblPromptlabel.setText(message);
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
consoleInput.setEnabled(true);
|
||||
consoleInput.setFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
prompting = true;
|
||||
command = null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.manager.ConsoleInput#prompt(long) */
|
||||
@Override
|
||||
public String prompt(final long timeout) throws IOException {
|
||||
synchronized (promptLock) {
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
initPrompt(prompt.apply());
|
||||
promptLock.notifyAll();
|
||||
try {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleInput.isDisposed()) {
|
||||
consoleInput.setEnabled(true);
|
||||
lblPromptlabel.setText(prompt.apply());
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
consoleInput.setFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
prompting = true;
|
||||
command = null;
|
||||
promptLock.notifyAll();
|
||||
final long start = System.currentTimeMillis();
|
||||
long cur = start;
|
||||
while (prompting && start + timeout > cur) {
|
||||
promptLock.wait((cur - start - timeout) / 2);
|
||||
cur = System.currentTimeMillis();
|
||||
}
|
||||
waitPromptResolution(timeout);
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$
|
||||
LOGGER.log(Level.WARNING, ERROR_SYNCHRO_PROMPT, e);
|
||||
command = null;
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
if (isDisposed()) {
|
||||
throw new IOException("Input closed"); //$NON-NLS-1$
|
||||
}
|
||||
return command;
|
||||
}
|
||||
|
||||
@@ -330,44 +321,21 @@ public final class SWTConsole extends Composite
|
||||
@Override
|
||||
public String prompt(final String message) throws IOException {
|
||||
synchronized (promptLock) {
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
initPrompt(message);
|
||||
promptLock.notifyAll();
|
||||
try {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleOutput.isDisposed()) {
|
||||
lblPromptlabel.setText(message);
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
consoleInput.setEnabled(true);
|
||||
consoleInput.setFocus();
|
||||
}
|
||||
}
|
||||
});
|
||||
prompting = true;
|
||||
promptLock.wait();
|
||||
while (prompting) {
|
||||
promptLock.wait();
|
||||
}
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.WARNING, "Error in synchronization of prompting", e); //$NON-NLS-1$
|
||||
LOGGER.log(Level.WARNING, ERROR_SYNCHRO_PROMPT, e);
|
||||
command = null;
|
||||
Thread.currentThread().interrupt();
|
||||
} finally {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleOutput.isDisposed()) {
|
||||
lblPromptlabel.setText(prompt.apply());
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
}
|
||||
}
|
||||
});
|
||||
resetPrompt();
|
||||
}
|
||||
}
|
||||
return command;
|
||||
@@ -377,9 +345,53 @@ public final class SWTConsole extends Composite
|
||||
* @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");
|
||||
synchronized (promptLock) {
|
||||
initPrompt(message);
|
||||
promptLock.notifyAll();
|
||||
try {
|
||||
waitPromptResolution(timeout);
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.WARNING, ERROR_SYNCHRO_PROMPT, e);
|
||||
command = null;
|
||||
Thread.currentThread().interrupt();
|
||||
} finally {
|
||||
resetPrompt();
|
||||
}
|
||||
}
|
||||
return command;
|
||||
}
|
||||
|
||||
/** Wait the prompt resolution by user.
|
||||
*
|
||||
* @param timeout the timeout for the wait
|
||||
* @throws InterruptedException if the thread is interrupted
|
||||
* @throws IOException if the console is disposed. */
|
||||
private void waitPromptResolution(final long timeout)
|
||||
throws InterruptedException, IOException {
|
||||
final long start = System.currentTimeMillis();
|
||||
long cur = start;
|
||||
while (prompting && start + timeout > cur) {
|
||||
promptLock.wait((cur - start - timeout) / TWO);
|
||||
cur = System.currentTimeMillis();
|
||||
}
|
||||
if (isDisposed()) {
|
||||
throw new IOException();
|
||||
}
|
||||
}
|
||||
|
||||
/** Reset the prompt message. */
|
||||
private void resetPrompt() {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void run() {
|
||||
if (!consoleOutput.isDisposed()) {
|
||||
lblPromptlabel.setText(prompt.apply());
|
||||
// relayout
|
||||
SWTConsole.this.layout();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -397,8 +409,10 @@ public final class SWTConsole extends Composite
|
||||
consoleInput.setSelection(input.length());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see net.bigeon.gclc.manager.ConsoleInput#setPrompt(java.lang.String) */
|
||||
@Override
|
||||
public void setPrompt(String prompt) {
|
||||
public void setPrompt(final String prompt) {
|
||||
setPrompt(new ConstantString(prompt));
|
||||
}
|
||||
|
||||
@@ -420,21 +434,15 @@ public final class SWTConsole extends Composite
|
||||
});
|
||||
}
|
||||
|
||||
/** @param string the text */
|
||||
/** Set the input text.
|
||||
*
|
||||
* @param string the text */
|
||||
public void setText(final String string) {
|
||||
consoleInput.setText(string);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void validateCommand() {
|
||||
validateInput();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
/* (non-Javadoc)
|
||||
* @see net.bigeon.gclc.swt.ConsoleDelayIO#validateInput() */
|
||||
@Override
|
||||
public void validateInput() {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@@ -450,6 +458,7 @@ public final class SWTConsole extends Composite
|
||||
promptLock.wait();
|
||||
} catch (final InterruptedException e) {
|
||||
LOGGER.log(Level.SEVERE, "Interruption while waiting prompt", e); //$NON-NLS-1$
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
|
||||
@@ -85,8 +85,8 @@ public final class SWTConsoleShell extends Shell {
|
||||
/** Create the shell.
|
||||
*
|
||||
* @param display the display */
|
||||
public SWTConsoleShell(final Display display) {
|
||||
super(display, SWT.SHELL_TRIM);
|
||||
public SWTConsoleShell(final Display display, final int style) {
|
||||
super(display, style);
|
||||
setLayout(new FillLayout(SWT.HORIZONTAL));
|
||||
|
||||
createContents();
|
||||
@@ -98,7 +98,7 @@ public final class SWTConsoleShell extends Shell {
|
||||
}
|
||||
|
||||
/** Create contents of the shell. */
|
||||
protected void createContents() {
|
||||
private void createContents() {
|
||||
console = new SWTConsole(this, SWT.NONE);
|
||||
setText("Console Application"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ public final class SWTConsoleView extends Composite implements ConsoleDelayIO {
|
||||
|
||||
@Override
|
||||
protected void forwardLine(final String m) {
|
||||
appendConsoleOutput(m);
|
||||
appendConsoleOutput(System.lineSeparator() + m);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -149,12 +149,12 @@ public final class SWTConsoleView extends Composite implements ConsoleDelayIO {
|
||||
}
|
||||
|
||||
/** @param next the next message */
|
||||
protected void appendConsoleOutput(final String next) {
|
||||
public void appendConsoleOutput(final String next) {
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@SuppressWarnings("synthetic-access")
|
||||
@Override
|
||||
public void run() {
|
||||
consoleOutput.append(System.lineSeparator() + next);
|
||||
consoleOutput.append(next);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -98,8 +99,8 @@ public class SWTConsoleShellTest {
|
||||
private static final Display DISPLAY = Display.getDefault();
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY);
|
||||
public void testGeneric() {
|
||||
final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY, SWT.SHELL_TRIM);
|
||||
final SWTConsole swtConsole = shell.getManager();
|
||||
try {
|
||||
final ConsoleApplication appl = new ConsoleApplication(swtConsole, swtConsole,
|
||||
@@ -138,6 +139,7 @@ public class SWTConsoleShellTest {
|
||||
});
|
||||
// shell.pack();
|
||||
shell.open();
|
||||
shell.setVisible(false);
|
||||
final Thread applThread = new Thread(new Runnable() {
|
||||
|
||||
@Override
|
||||
@@ -159,7 +161,7 @@ public class SWTConsoleShellTest {
|
||||
@Override
|
||||
public void run() {
|
||||
swtConsole.setText("test"); //$NON-NLS-1$
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
}
|
||||
});
|
||||
try {
|
||||
@@ -198,7 +200,7 @@ public class SWTConsoleShellTest {
|
||||
|
||||
@Test
|
||||
public void testConsoleClose() {
|
||||
final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY);
|
||||
final SWTConsoleShell shell = new SWTConsoleShell(DISPLAY, SWT.SHELL_TRIM);
|
||||
final SWTConsole swtConsole = shell.getManager();
|
||||
swtConsole.close();
|
||||
swtConsole.setPrompt(":");
|
||||
@@ -267,6 +269,7 @@ public class SWTConsoleShellTest {
|
||||
});
|
||||
// shell.pack();
|
||||
shell.open();
|
||||
shell.setVisible(false);
|
||||
final Thread applThread = new Thread(new Runnable() {
|
||||
|
||||
@Override
|
||||
@@ -288,7 +291,7 @@ public class SWTConsoleShellTest {
|
||||
@Override
|
||||
public void run() {
|
||||
swtConsole.setText("test"); //$NON-NLS-1$
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
}
|
||||
});
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@@ -297,28 +300,28 @@ public class SWTConsoleShellTest {
|
||||
swtConsole.setText("ok"); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
swtConsole.setText("long"); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
swtConsole.setText("test"); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
Display.getDefault().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
swtConsole.setText("test"); //$NON-NLS-1$
|
||||
}
|
||||
});
|
||||
swtConsole.validateCommand();
|
||||
swtConsole.validateInput();
|
||||
try {
|
||||
Thread.sleep(TWO_SECONDS);
|
||||
} catch (final InterruptedException e) {
|
||||
|
||||
@@ -99,7 +99,7 @@ public class SWTConsoleViewTest {
|
||||
private static final Display DISPLAY = Display.getDefault();
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
public void testGeneric() {
|
||||
final Shell shell = new Shell(DISPLAY);
|
||||
final SWTConsoleView swtConsole = new SWTConsoleView(shell, SWT.NONE);
|
||||
try (PipedConsoleOutput manager = new PipedConsoleOutput();
|
||||
@@ -147,6 +147,7 @@ public class SWTConsoleViewTest {
|
||||
});
|
||||
// shell.pack();
|
||||
shell.open();
|
||||
shell.setVisible(false);
|
||||
final Thread applThread = new Thread(new Runnable() {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,30 +1,24 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>system</artifactId>
|
||||
<version>0.0.2-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://www.bigeon.net</url>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<name>GCLC system command</name>
|
||||
<description>Provide an exec command to execute system commands</description>
|
||||
<inceptionYear>2016</inceptionYear>
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.21</version>
|
||||
</parent>
|
||||
<groupId>net.bigeon.gclc</groupId>
|
||||
<artifactId>system</artifactId>
|
||||
<version>0.0.2-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>GCLC system command</name>
|
||||
<description>Provide an exec command to execute system commands</description>
|
||||
<url>https://bigeon.net/projects/gclc.html</url>
|
||||
<inceptionYear>2016</inceptionYear>
|
||||
<organization>
|
||||
<name>Bigeon</name>
|
||||
<url>https://bigeon.net</url>
|
||||
</organization>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
@@ -32,15 +26,6 @@
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
@@ -51,14 +36,34 @@
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.12</version>
|
||||
</parent>
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<copyright.email>emmanuel@bigeon.fr</copyright.email>
|
||||
<license.licenseName>cecill_2.1</license.licenseName>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.github.sevntu-checkstyle</groupId>
|
||||
<artifactId>dsm-maven-plugin</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting><build>
|
||||
<plugins>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
@@ -42,8 +42,6 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import net.bigeon.gclc.command.Command;
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
@@ -51,7 +49,11 @@ import net.bigeon.gclc.exception.CommandRunExceptionType;
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
/** A command that will execute a system command.
|
||||
/** A command that will execute system commands.
|
||||
* <p>
|
||||
* Note that this class may induce security issues in the code as it can execute
|
||||
* arbitrary system commands. It is recommended that it be used only in private
|
||||
* applications or application used by aware parties.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public class ExecSystemCommand extends Command {
|
||||
@@ -62,9 +64,6 @@ public class ExecSystemCommand extends Command {
|
||||
private static final String COMMAND_DEFAULT_NAME = "exec"; //$NON-NLS-1$
|
||||
/** The end of line separator */
|
||||
private static final String EOL = System.lineSeparator();
|
||||
/** The class logger */
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(ExecSystemCommand.class.getName());
|
||||
|
||||
/** Create the command with the name 'exec'. */
|
||||
public ExecSystemCommand() {
|
||||
@@ -89,32 +88,22 @@ public class ExecSystemCommand extends Command {
|
||||
try {
|
||||
proc = Runtime.getRuntime().exec(args);
|
||||
} catch (final IOException e2) {
|
||||
LOGGER.log(Level.SEVERE, "Unable to run process", e2); //$NON-NLS-1$
|
||||
return;
|
||||
throw new CommandRunException("Unable to run process", e2);
|
||||
}
|
||||
|
||||
// Stream forwarding to the application's console
|
||||
// This is started in a parallel thread.
|
||||
final InputStream is = proc.getInputStream();
|
||||
final Thread th = new Thread(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
readToEnd(out, is);
|
||||
is.close();
|
||||
} catch (final CommandRunException e) {
|
||||
LOGGER.log(Level.WARNING, "Manager was closed in the meantime...", e); //$NON-NLS-1$
|
||||
} catch (final IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Input stream was closed...", e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
});
|
||||
final Thread th = new Thread(new ForwardingRunnable(out, is));
|
||||
th.start();
|
||||
in.setPrompt(""); //$NON-NLS-1$
|
||||
// Forward console input to the process.
|
||||
final OutputStream os = proc.getOutputStream();
|
||||
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os))) {
|
||||
while (th.isAlive()) {
|
||||
String user = in.prompt();
|
||||
writer.write(user + EOL);
|
||||
final String user = in.prompt();
|
||||
if (!user.isEmpty()) {
|
||||
writer.write(user + EOL);
|
||||
}
|
||||
}
|
||||
} catch (final IOException e1) {
|
||||
throw new CommandRunException(CommandRunExceptionType.INTERACTION,
|
||||
@@ -122,36 +111,6 @@ public class ExecSystemCommand extends Command {
|
||||
}
|
||||
}
|
||||
|
||||
/** @param is the input stream
|
||||
* @throws CommandRunException if the manager was closed while writing the
|
||||
* stream */
|
||||
protected void readToEnd(final ConsoleOutput out, final InputStream is)
|
||||
throws CommandRunException {
|
||||
int c;
|
||||
try {
|
||||
while ((c = is.read()) != -1) {
|
||||
printCharacter(out, (char) c);
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
LOGGER.log(Level.INFO, "input stream reading failed", e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
/** Print a character on the console.
|
||||
*
|
||||
* @param out the console
|
||||
* @param c the character
|
||||
* @throws CommandRunException if the console failed to print the character. */
|
||||
private void printCharacter(final ConsoleOutput out, char c)
|
||||
throws CommandRunException {
|
||||
try {
|
||||
out.print(Character.toString(c));
|
||||
} catch (final IOException e) {
|
||||
throw new CommandRunException(CommandRunExceptionType.INTERACTION,
|
||||
MANAGER_WAS_CLOSED, e); // $NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
package net.bigeon.gclc.system;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* GCLC system command
|
||||
* %%
|
||||
* Copyright (C) 2016 - 2018 Bigeon
|
||||
* %%
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.exception.CommandRunExceptionType;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
/** A class forwarding the content of a stream into a console output.
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public final class ForwardingRunnable implements Runnable {
|
||||
/** Error message for the manager closed. */
|
||||
private static final String MANAGER_WAS_CLOSED = "manager was closed";
|
||||
/** The class logger */
|
||||
private static final Logger LOGGER = Logger
|
||||
.getLogger(ForwardingRunnable.class.getName());
|
||||
|
||||
/** The console output. */
|
||||
private final ConsoleOutput out;
|
||||
/** The input stream. */
|
||||
private final InputStream is;
|
||||
|
||||
/** Create the runnable.
|
||||
*
|
||||
* @param out the output console
|
||||
* @param is the input stream */
|
||||
public ForwardingRunnable(final ConsoleOutput out, final InputStream is) {
|
||||
this.out = out;
|
||||
this.is = is;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Runnable#run() */
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
readToEnd(out, is);
|
||||
is.close();
|
||||
} catch (final CommandRunException e) {
|
||||
LOGGER.log(Level.WARNING,
|
||||
"Manager was closed in the meantime...", e); //$NON-NLS-1$
|
||||
} catch (final IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Input stream was closed...", e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
/** Read the input until its end.
|
||||
*
|
||||
* @param is the input stream
|
||||
* @throws CommandRunException if the manager was closed while writing the
|
||||
* stream */
|
||||
private void readToEnd(final ConsoleOutput out, final InputStream is)
|
||||
throws CommandRunException {
|
||||
int c;
|
||||
try {
|
||||
while ((c = is.read()) >= 0) {
|
||||
// Print the chaeacter in the output
|
||||
printCharacter(out, (char) c);
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
LOGGER.log(Level.INFO, "input stream reading failed", e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
/** Print a character on the console.
|
||||
*
|
||||
* @param out the console
|
||||
* @param c the character
|
||||
* @throws CommandRunException if the console failed to print the character. */
|
||||
private static void printCharacter(final ConsoleOutput out, final char c)
|
||||
throws CommandRunException {
|
||||
try {
|
||||
out.print(Character.toString(c));
|
||||
} catch (final IOException e) {
|
||||
throw new CommandRunException(CommandRunExceptionType.INTERACTION,
|
||||
MANAGER_WAS_CLOSED, e); // $NON-NLS-1$
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,3 +6,37 @@
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
package net.bigeon.gclc.system;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* GCLC system command
|
||||
* %%
|
||||
* Copyright (C) 2016 - 2018 Bigeon
|
||||
* %%
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package net.bigeon.gclc.system;
|
||||
|
||||
/*-
|
||||
* #%L
|
||||
* GCLC system command
|
||||
* %%
|
||||
* Copyright (C) 2016 - 2018 Bigeon
|
||||
* %%
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
import net.bigeon.gclc.utils.EmptyInput;
|
||||
import net.bigeon.gclc.utils.SinkOutput;
|
||||
|
||||
public class ExecSystemCommandTest {
|
||||
|
||||
@Test
|
||||
public void testExecSystemCommand() {
|
||||
ExecSystemCommand cmd = new ExecSystemCommand("test");
|
||||
assertEquals("Name should be preserved", "test", cmd.getCommandName());
|
||||
assertNotNull("tip should be defined", cmd.tip());
|
||||
assertNotNull("usage should be defined", cmd.usagePattern());
|
||||
assertNotNull("usage should be defined", cmd.usageDetail());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExecute() throws CommandRunException {
|
||||
ConsoleOutput out = SinkOutput.INSTANCE;
|
||||
ConsoleInput in = EmptyInput.INSTANCE;
|
||||
|
||||
ExecSystemCommand cmd = new ExecSystemCommand();
|
||||
if (System.getProperty("os.name").contains("indows")) {
|
||||
cmd.execute(out, in, "cmd", "/C", "dir");
|
||||
try {
|
||||
cmd.execute(out, in, "inexistent");
|
||||
fail("Able to execute inexistent command in system");
|
||||
} catch (CommandRunException e) {
|
||||
// ok
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
96
gclc/pom.xml
96
gclc/pom.xml
@@ -1,10 +1,44 @@
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.21</version>
|
||||
</parent>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<artifactId>gclc</artifactId>
|
||||
<version>2.0.10-SNAPSHOT</version>
|
||||
<version>2.0.11-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<url>http://bigeon.net</url>
|
||||
<name>Generic Command Ligne console</name>
|
||||
<description>A generic framework for console applications, with customized command input and output streams.</description>
|
||||
<url>https://bigeon.net/projects/gclc.html</url>
|
||||
<inceptionYear>2014</inceptionYear>
|
||||
<organization>
|
||||
<name>Bigeon</name>
|
||||
<url>https://bigeon.net/</url>
|
||||
</organization>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
<name>CeCILL 2.1</name>
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
<name>Emmanuel Bigeon</name>
|
||||
<url>bigeon.net</url>
|
||||
<roles>
|
||||
<role>PM</role>
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.scm.id>git.code.bigeon.net</project.scm.id>
|
||||
@@ -19,32 +53,6 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<parent>
|
||||
<groupId>net.bigeon.config</groupId>
|
||||
<artifactId>ebigeon-config</artifactId>
|
||||
<version>1.8.12</version>
|
||||
</parent>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>license-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<extraExtensions>
|
||||
<gclc>properties</gclc>
|
||||
<txt>properties</txt>
|
||||
</extraExtensions>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<licenses>
|
||||
<license>
|
||||
<distribution>manual</distribution>
|
||||
<name>CeCILL 2.1</name>
|
||||
<url>https://cecill.info/licences/Licence_CeCILL_V2.1-en.html</url>
|
||||
</license>
|
||||
</licenses>
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
@@ -59,22 +67,18 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
<developers>
|
||||
<developer>
|
||||
<email>emmanuel@bigeon.fr</email>
|
||||
<name>Emmanuel Bigeon</name>
|
||||
<url>bigeon.net</url>
|
||||
<roles>
|
||||
<role>PM</role>
|
||||
</roles>
|
||||
</developer>
|
||||
</developers>
|
||||
<inceptionYear>2014</inceptionYear>
|
||||
<name>Generic Command Ligne console</name>
|
||||
<description>A generic framework for console applications, with customized command input and output streams.</description>
|
||||
<scm>
|
||||
<developerConnection>scm:git:gogs@git.code.bigeon.net:emmanuel/gclc.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<groupId>net.bigeon</groupId>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>license-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<extraExtensions>
|
||||
<gclc>properties</gclc>
|
||||
<txt>properties</txt>
|
||||
</extraExtensions>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
||||
100
gclc/src/main/java/net/bigeon/gclc/command/base/EchoCommand.java
Normal file
100
gclc/src/main/java/net/bigeon/gclc/command/base/EchoCommand.java
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* ralph.runner, Runs RALPH (belongs to IREQ) in sequence for several days
|
||||
* Copyright (C) 2016-2018 E. Bigeon
|
||||
* mailto:emmanuel@bigeon.fr
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited
|
||||
* liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
*
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*/
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package net.bigeon.gclc.command.base;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
|
||||
import net.bigeon.gclc.command.Command;
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.manager.ConsoleInput;
|
||||
import net.bigeon.gclc.manager.ConsoleOutput;
|
||||
|
||||
/** A command printing test to the console.
|
||||
* <p>
|
||||
* This command mimics the effect of the echo command in linux system. The
|
||||
* difference is this command accepts java like formatting.
|
||||
*
|
||||
* <pre>
|
||||
* echo.execute(out, in, "My Formatted {0}, with {1}", "message", "short arguments");
|
||||
* </pre>
|
||||
*
|
||||
* @author Emmanuel Bigeon */
|
||||
public class EchoCommand extends Command {
|
||||
|
||||
/** Create the command.
|
||||
*
|
||||
* @param name the command name */
|
||||
public EchoCommand(final String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/* (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 {
|
||||
if (args.length == 1) {
|
||||
out.print(args[0]);
|
||||
}
|
||||
if (args.length > 1) {
|
||||
out.print(MessageFormat.format(args[0],
|
||||
(Object[]) Arrays.copyOfRange(args, 1, args.length)));
|
||||
}
|
||||
out.println();
|
||||
} catch (final IOException e) {
|
||||
throw new CommandRunException("Printing failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.ICommand#tip() */
|
||||
@Override
|
||||
public String tip() {
|
||||
return "Print the message";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see fr.bigeon.gclc.command.Command#usageDetail() */
|
||||
@Override
|
||||
protected String usageDetail() {
|
||||
return "A formatted message can be used";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package net.bigeon.gclc.command.base;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import net.bigeon.gclc.exception.CommandRunException;
|
||||
import net.bigeon.gclc.utils.PipedConsoleOutput;
|
||||
|
||||
public class EchoCommandTest {
|
||||
|
||||
@Test
|
||||
public void testExecute() throws IOException, CommandRunException {
|
||||
final EchoCommand echo = new EchoCommand("echo");
|
||||
assertNotNull("Help tip should be specified", echo.tip());
|
||||
assertNotNull("Usage should be specified", echo.usageDetail());
|
||||
|
||||
try (PipedConsoleOutput out = new PipedConsoleOutput()) {
|
||||
echo.execute(out, null);
|
||||
assertEquals("Echo should print a line", "", out.readNextLine());
|
||||
|
||||
echo.execute(out, null, "Message");
|
||||
assertEquals("Echo should print argument", "Message", out.readNextLine());
|
||||
|
||||
echo.execute(out, null, "Message {0}", "with parameter");
|
||||
assertEquals("Echo should format string and print", "Message with parameter",
|
||||
out.readNextLine());
|
||||
}
|
||||
|
||||
final PipedConsoleOutput out = new PipedConsoleOutput();
|
||||
out.close();
|
||||
try {
|
||||
echo.execute(out, null);
|
||||
fail("Should not be able to print in closed outputs");
|
||||
} catch (final CommandRunException e) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user