introduce jline line editing features
This commit is contained in:
parent
d30af3f4c3
commit
fb709fba09
@ -6,5 +6,6 @@
|
|||||||
<classpathentry kind="lib" path="lib/xmlrpc-client-3.1.jar"/>
|
<classpathentry kind="lib" path="lib/xmlrpc-client-3.1.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/xmlrpc-common-3.1.jar"/>
|
<classpathentry kind="lib" path="lib/xmlrpc-common-3.1.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/ws-commons-util-1.0.1.jar"/>
|
<classpathentry kind="lib" path="lib/ws-commons-util-1.0.1.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/jline-1.0.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
BIN
hsarjcli/lib/jline-1.0.jar
Normal file
BIN
hsarjcli/lib/jline-1.0.jar
Normal file
Binary file not shown.
@ -2,7 +2,6 @@ package de.hsadmin.jscli;
|
|||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
import java.io.Console;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@ -22,13 +21,16 @@ public class CASTicket {
|
|||||||
private static final String LOGIN_URL = "https://login.hostsharing.net:443/cas/v1/tickets";
|
private static final String LOGIN_URL = "https://login.hostsharing.net:443/cas/v1/tickets";
|
||||||
private static final String BACKEND_URL = "https://admin.hostsharing.net:443/hsar/backend";
|
private static final String BACKEND_URL = "https://admin.hostsharing.net:443/hsar/backend";
|
||||||
|
|
||||||
private String loginURL;
|
final private String loginURL;
|
||||||
private String backendURL;
|
final private String backendURL;
|
||||||
private String grantingTicket;
|
final private String runAs;
|
||||||
private String runAs;
|
final private String user;
|
||||||
private String user;
|
final private ConsoleWrapper cons;
|
||||||
|
|
||||||
public CASTicket(String user, String runAs) throws JSCliException {
|
private String grantingTicket;
|
||||||
|
|
||||||
|
public CASTicket(ConsoleWrapper console, String user, String runAs) throws JSCliException {
|
||||||
|
this.cons = console;
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this.runAs = runAs;
|
this.runAs = runAs;
|
||||||
Config config = Config.getInstance();
|
Config config = Config.getInstance();
|
||||||
@ -77,16 +79,7 @@ public class CASTicket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String readPasswordFromConsole() throws JSCliException {
|
private String readPasswordFromConsole() throws JSCliException {
|
||||||
char[] password = null;
|
return cons.readPassword();
|
||||||
Console console = System.console();
|
|
||||||
if (console == null) {
|
|
||||||
throw new JSCliException("fatal error: console not found");
|
|
||||||
}
|
|
||||||
password = console.readPassword("password:");
|
|
||||||
if (password == null || password.length <= 0) {
|
|
||||||
throw new JSCliException("no password given");
|
|
||||||
}
|
|
||||||
return new String(password);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String doHttpPost(String urlString, String encodedParams) throws JSCliException {
|
private String doHttpPost(String urlString, String encodedParams) throws JSCliException {
|
||||||
|
62
hsarjcli/src/de/hsadmin/jscli/ConsoleWrapper.java
Normal file
62
hsarjcli/src/de/hsadmin/jscli/ConsoleWrapper.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package de.hsadmin.jscli;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import jline.ConsoleReader;
|
||||||
|
import jline.SimpleCompletor;
|
||||||
|
|
||||||
|
public class ConsoleWrapper {
|
||||||
|
|
||||||
|
private ConsoleReader cons;
|
||||||
|
private String prompt;
|
||||||
|
|
||||||
|
public void open(final String prompt) throws JSCliException {
|
||||||
|
this.prompt = prompt;
|
||||||
|
try {
|
||||||
|
cons = new ConsoleReader();
|
||||||
|
cons.setDefaultPrompt(prompt);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new JSCliException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readInput() throws JSCliException {
|
||||||
|
try {
|
||||||
|
String line = cons.readLine();
|
||||||
|
while (line.trim().endsWith("\\")) {
|
||||||
|
line = line.substring(0, line.length() - 1) + "\n" + cons.readLine(">");
|
||||||
|
}
|
||||||
|
return line;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new JSCliException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void println(String text) throws JSCliException {
|
||||||
|
try {
|
||||||
|
if (cons != null) {
|
||||||
|
cons.printString(text);
|
||||||
|
cons.printNewline();
|
||||||
|
} else {
|
||||||
|
throw new JSCliException("cannot write console");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new JSCliException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readPassword() throws JSCliException {
|
||||||
|
try {
|
||||||
|
String pw = cons.readLine("password:", new Character('*'));
|
||||||
|
cons.setDefaultPrompt(prompt);
|
||||||
|
return pw;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new JSCliException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void codeCompletion(String[] candidateStrings) {
|
||||||
|
cons.addCompletor(new SimpleCompletor(candidateStrings));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package de.hsadmin.jscli;
|
package de.hsadmin.jscli;
|
||||||
|
|
||||||
import java.io.Console;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@ -10,19 +9,22 @@ import java.io.InputStreamReader;
|
|||||||
public class Main {
|
public class Main {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
ConsoleWrapper console = null;
|
||||||
try {
|
try {
|
||||||
JSONFormatter formatter = new JSONFormatter();
|
|
||||||
CommandlineParser cmdParser = new CommandlineParser(args);
|
CommandlineParser cmdParser = new CommandlineParser(args);
|
||||||
String runAs = cmdParser.getRunAs();
|
String runAs = cmdParser.getRunAs();
|
||||||
ScriptClient scriptClient = new ScriptClient(cmdParser.getUser(), runAs);
|
console = new ConsoleWrapper();
|
||||||
|
console.open(runAs + "@hsadmin>");
|
||||||
|
JSONFormatter formatter = new JSONFormatter();
|
||||||
|
ScriptClient scriptClient = new ScriptClient(console, cmdParser.getUser(), runAs);
|
||||||
String file = cmdParser.getFile();
|
String file = cmdParser.getFile();
|
||||||
if (file != null && file.length() > 0) {
|
if (file != null && file.length() > 0) {
|
||||||
if ("-".equals(file)) {
|
if ("-".equals(file)) {
|
||||||
System.out.println(formatter.format(scriptClient.execute(new InputStreamReader(System.in))));
|
console.println(formatter.format(scriptClient.execute(new InputStreamReader(System.in))));
|
||||||
} else {
|
} else {
|
||||||
File fileHandle = new File(file);
|
File fileHandle = new File(file);
|
||||||
try {
|
try {
|
||||||
System.out.println(formatter.format(scriptClient.execute(new FileReader(fileHandle))));
|
console.println(formatter.format(scriptClient.execute(new FileReader(fileHandle))));
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
System.err.println("file not found: " + file);
|
System.err.println("file not found: " + file);
|
||||||
}
|
}
|
||||||
@ -30,34 +32,20 @@ public class Main {
|
|||||||
}
|
}
|
||||||
String expr = cmdParser.getExpression();
|
String expr = cmdParser.getExpression();
|
||||||
if (expr != null && expr.length() > 0) {
|
if (expr != null && expr.length() > 0) {
|
||||||
System.out.println(formatter.format(scriptClient.execute(expr)));
|
console.println(formatter.format(scriptClient.execute(expr)));
|
||||||
}
|
}
|
||||||
if (cmdParser.isInteractive()) {
|
if (cmdParser.isInteractive()) {
|
||||||
Console console = System.console();
|
String command = console.readInput();
|
||||||
if (console == null) {
|
|
||||||
throw new JSCliException("fatal error: console not found");
|
|
||||||
}
|
|
||||||
String command = console.readLine("%s@hsadmin>", runAs);
|
|
||||||
if (command == null) {
|
|
||||||
command = "";
|
|
||||||
}
|
|
||||||
while (!("bye".equals(command.trim()) || "exit".equals(command.trim()) || "quit".equals(command.trim()))) {
|
while (!("bye".equals(command.trim()) || "exit".equals(command.trim()) || "quit".equals(command.trim()))) {
|
||||||
try {
|
try {
|
||||||
console.printf("%s\n", formatter.format(scriptClient.execute(command)));
|
console.println(formatter.format(scriptClient.execute(command)));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
console.printf("ERR: %s\n", e.getLocalizedMessage());
|
console.println("ERR: " + e.getLocalizedMessage() + "\n");
|
||||||
}
|
|
||||||
command = console.readLine("%s@hsadmin>", runAs);
|
|
||||||
if (command == null) {
|
|
||||||
command = "";
|
|
||||||
}
|
|
||||||
while (command.trim().endsWith("\\")) {
|
|
||||||
command = command.substring(0, command.length() - 1) +
|
|
||||||
"\n" + console.readLine(">");
|
|
||||||
}
|
}
|
||||||
|
command = console.readInput();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (JSCliException e) {
|
} catch (Exception e) {
|
||||||
System.err.println(e.getMessage());
|
System.err.println(e.getMessage());
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package de.hsadmin.jscli;
|
package de.hsadmin.jscli;
|
||||||
|
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.script.ScriptEngine;
|
import javax.script.ScriptEngine;
|
||||||
import javax.script.ScriptEngineManager;
|
import javax.script.ScriptEngineManager;
|
||||||
@ -9,10 +11,12 @@ import javax.script.ScriptException;
|
|||||||
|
|
||||||
public class ScriptClient {
|
public class ScriptClient {
|
||||||
|
|
||||||
private ScriptEngine engine;
|
final private ScriptEngine engine;
|
||||||
|
final private Set<String> completionStrings;
|
||||||
|
|
||||||
public ScriptClient(String user, String runAs) throws JSCliException {
|
public ScriptClient(ConsoleWrapper console, String user, String runAs) throws JSCliException {
|
||||||
CASTicket grantingTicket = new CASTicket(user, runAs);
|
completionStrings = new HashSet<String>();
|
||||||
|
CASTicket grantingTicket = new CASTicket(console, user, runAs);
|
||||||
RpcClient rpcClient = new RpcClient(grantingTicket);
|
RpcClient rpcClient = new RpcClient(grantingTicket);
|
||||||
ScriptEngineManager engineManager = new ScriptEngineManager();
|
ScriptEngineManager engineManager = new ScriptEngineManager();
|
||||||
engine = engineManager.getEngineByName("js");
|
engine = engineManager.getEngineByName("js");
|
||||||
@ -54,6 +58,8 @@ public class ScriptClient {
|
|||||||
if ("delete".equals(function)) {
|
if ("delete".equals(function)) {
|
||||||
function = "remove";
|
function = "remove";
|
||||||
}
|
}
|
||||||
|
completionStrings.add(module);
|
||||||
|
completionStrings.add(module + "." + function);
|
||||||
try {
|
try {
|
||||||
engine.eval("if (typeof " + module + " === 'undefined') " +
|
engine.eval("if (typeof " + module + " === 'undefined') " +
|
||||||
"{ var " + module + " = { }; };\n" +
|
"{ var " + module + " = { }; };\n" +
|
||||||
@ -73,6 +79,17 @@ public class ScriptClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
console.codeCompletion(getCodeCompletionStrings());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getCodeCompletionStrings() {
|
||||||
|
String[] codeCompletionStrings = new String[completionStrings.size()];
|
||||||
|
int idx = 0;
|
||||||
|
for (String s : completionStrings) {
|
||||||
|
codeCompletionStrings[idx] = s;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return codeCompletionStrings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object execute(String snippet) throws JSCliException {
|
public Object execute(String snippet) throws JSCliException {
|
||||||
|
Loading…
Reference in New Issue
Block a user