com.github.jy2.commandline.picocli.Main Maven / Gradle / Ivy
package com.github.jy2.commandline.picocli;
import java.io.IOError;
import java.util.Random;
import org.jline.reader.EndOfFileException;
import org.jline.reader.LineReader;
import org.jline.reader.LineReaderBuilder;
import org.jline.reader.MaskingCallback;
import org.jline.reader.ParsedLine;
import org.jline.reader.UserInterruptException;
import org.jline.reader.impl.DefaultParser;
import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder;
import com.github.jy2.classpath.ClasspathUtils;
import com.github.jy2.commandline.common.Deserializer;
import com.github.jy2.commandline.common.Serializer;
import com.github.jy2.commandline.picocli.member.MemberPingCommand;
import com.github.jy2.commandline.picocli.topic.TopicEchoCommand;
import com.github.jy2.commandline.picocli.topic.TopicPubCommand;
import com.github.jy2.di.JyroscopeDi;
import com.github.jy2.introspection.IntrospectionClient;
import com.github.jy2.logs.console.collector.LogCollector;
import picocli.CommandLine;
import picocli.shell.jline3.PicocliJLineCompleter;
public class Main {
public static Object monitor = new Object();
public static Serializer serializer = new Serializer();
public static Deserializer deserializer = new Deserializer();
public static JyroscopeDi di;
public static LogCollector logCollector;
public static IntrospectionClient introspector;
public static String orchestratorName;
public static void main(String[] args) {
try {
ClasspathUtils.setContextClassLoader();
di = new JyroscopeDi("jy2_command_line_" + Math.abs(new Random().nextLong()), args);
logCollector = di.create(LogCollector.class);
introspector = di.inject(new IntrospectionClient(di));
di.start();
// get orchestrator name
orchestratorName = "/orchestrator";
String tmp = System.getenv("ROS_ORCHESTRATOR_NAME");
if (tmp != null) {
orchestratorName = tmp;
}
// set up the completion
HzCommand commands = new HzCommand();
CommandLine cmd = new CommandLine(commands);
Terminal terminal = TerminalBuilder.builder().build();
LineReader reader = LineReaderBuilder.builder().terminal(terminal)
.completer(new PicocliJLineCompleter(cmd.getCommandSpec())).parser(new DefaultParser()).build();
commands.setReader(reader);
String prompt = "jy2> ";
String rightPrompt = null;
// fix parsing negative numbers
// cmd.setUnmatchedOptionsArePositionalParams(true);
// FIXME: patched the library CommandLine.run - revert this and fix properly
// WOJ: parse program arguments in non-console mode, if present
if (args.length > 0) {
CommandLine.run(commands, args);
reader.getTerminal().flush();
// prevent from exiting when topic echo from command line
if (TopicEchoCommand.subscriber != null || TopicPubCommand.thread != null
|| MemberPingCommand.runPing) {
Thread.sleep(Long.MAX_VALUE);
}
System.exit(0);
}
// start the shell and process input until the user quits with Ctl-D
String line;
while (true) {
try {
String prompt1 = prompt;
if (TopicEchoCommand.subscriber != null || TopicPubCommand.thread != null
|| MemberPingCommand.runPing) {
prompt1 = "";
}
line = reader.readLine(prompt1, rightPrompt, (MaskingCallback) null, null);
if (TopicEchoCommand.subscriber != null || TopicPubCommand.thread != null
|| MemberPingCommand.runPing) {
// ignore commands when subscribed to topic
terminal.writer().println("Press Crtl-C to stop");
continue;
}
ParsedLine pl = reader.getParser().parse(line, 0);
String[] arguments = pl.words().toArray(new String[0]);
CommandLine.run(commands, arguments);
} catch (UserInterruptException e) {
if (TopicEchoCommand.subscriber != null) {
//TopicEchoCommand.subscriber.removeAllMessageListeners();
TopicEchoCommand.subscriber.shutdown();
TopicEchoCommand.subscriber = null;
}
if (TopicPubCommand.thread != null) {
TopicPubCommand.thread.stop = true;
TopicPubCommand.thread.interrupt();
TopicPubCommand.thread = null;
}
MemberPingCommand.runPing = false;
// ignore
} catch (EndOfFileException e) {
System.exit(0);
} catch (Exception t) {
t.printStackTrace();
} catch (IOError t) {
t.printStackTrace();
}
}
} catch (Exception t) {
t.printStackTrace();
}
System.exit(0);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy