Archived
0

5 Commits

6 changed files with 158 additions and 1 deletions

View File

@@ -13,3 +13,19 @@ repositories {
mavenLocal() mavenLocal()
mavenCentral() mavenCentral()
} }
ext {
libs_dir = 'libs'
jline_version = '3.14.1'
}
dependencies {
compile group: 'org.jline', name: 'jline', version: jline_version
compile group: 'org.jline', name: 'jline-terminal-jansi', version: jline_version
}
task copyDeps(type: Copy) {
into project.buildDir.toPath().resolve('libs').resolve(libs_dir)
from configurations.runtime
}
jar.dependsOn(copyDeps)

View File

@@ -1,8 +1,48 @@
package mc.server; package mc.server;
import mc.server.shell.CommandService;
import mc.server.shell.CommandServiceImpl;
import mc.server.shell.SystemPropertiesCommand;
import org.jline.builtins.CommandRegistry;
import org.jline.reader.*;
import java.io.PrintWriter;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
System.out.println("hello?"); System.out.println("mc-server");
CommandService commandService = new CommandServiceImpl();
commandService.register("system-properties", new SystemPropertiesCommand());
final Completer completer = CommandRegistry.compileCompleters(commandService);
final LineReader reader = LineReaderBuilder.builder()
.completer(completer)
.build();
try {
final CommandRegistry.CommandSession session = new CommandRegistry.CommandSession(reader.getTerminal());
final PrintWriter terminalWriter = reader.getTerminal().writer();
//noinspection InfiniteLoopStatement
while (true) {
final String line = reader.readLine().trim();
final ParsedLine parsedLine = reader.getParser().parse(line, 0);
final String commandName = parsedLine.word();
final String[] argv = parsedLine.words().subList(1, parsedLine.words().size()).toArray(new String[0]);
if (commandService.hasCommand(commandName)) {
commandService.execute(session, commandName, argv);
}
terminalWriter.println("line = " + String.join(", ", parsedLine.words()));
}
} catch (UserInterruptException ignore) {
// ignore
} catch (Exception e) {
e.printStackTrace();
}
} }
} }

View File

@@ -0,0 +1,8 @@
package mc.server.shell;
import org.jline.builtins.Builtins;
public interface Command {
void execute(Builtins.CommandInput commandInput);
}

View File

@@ -0,0 +1,8 @@
package mc.server.shell;
import org.jline.builtins.CommandRegistry;
public interface CommandService extends CommandRegistry {
void register(String commandName, Command command);
}

View File

@@ -0,0 +1,57 @@
package mc.server.shell;
import org.jline.builtins.Builtins;
import org.jline.builtins.Builtins.CommandMethods;
import org.jline.builtins.Completers.SystemCompleter;
import org.jline.reader.impl.completer.NullCompleter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class CommandServiceImpl implements CommandService {
private final Map<String, CommandMethods> commands = new HashMap<>();
public void register(String commandName, Command command) {
commands.put(commandName, new CommandMethods(
command::execute,
cmdName -> Collections.singletonList(NullCompleter.INSTANCE)
));
}
public Object execute(CommandSession session, String command) {
return execute(session, command, new String[0]);
}
@Override
public Object execute(CommandSession session, String command, String[] args) {
commands.get(command).execute().accept(new Builtins.CommandInput(command, args, session));
return null;
}
@Override
public Set<String> commandNames() {
return commands.keySet();
}
@Override
public Map<String, String> commandAliases() {
return Collections.emptyMap();
}
@Override
public boolean hasCommand(String commandName) {
return commands.containsKey(commandName);
}
@Override
public SystemCompleter compileCompleters() {
final SystemCompleter systemCompleter = new SystemCompleter();
systemCompleter.addAliases(commandAliases());
commands.forEach((commandName, command) -> systemCompleter.add(commandName, NullCompleter.INSTANCE));
return systemCompleter;
}
}

View File

@@ -0,0 +1,28 @@
package mc.server.shell;
import org.jline.builtins.Builtins.CommandInput;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
public class SystemPropertiesCommand implements Command {
@Override
public void execute(CommandInput input) {
final PrintWriter writer = input.terminal().writer();
Stream<Map.Entry<Object, Object>> stream = System.getProperties().entrySet().stream();
if (input.args().length > 0) {
final List<String> argv = Arrays.asList(input.args());
stream = stream.filter(entry -> {
//noinspection SuspiciousMethodCalls
return argv.contains(entry.getKey());
});
}
stream.forEach(entry -> writer.printf("%s = %s\n", entry.getKey(), entry.getValue().toString()));
}
}