Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.apache.ignite.internal.cli.commands.TopLevelCliCommand;
import org.apache.ignite.internal.cli.core.repl.EventListeningActivationPoint;
import org.junit.jupiter.api.Test;
import picocli.CommandLine;

class ItConnectNonReplCommandTest extends ItConnectCommandTest {
@Inject
Expand All @@ -39,7 +40,7 @@ public void subscribe() {
}

@Override
public void startReplMode() {
public void startReplMode(CommandLine.IFactory factory) {
// Emulate repl start by asking a question.
question.askQuestionOnReplStart();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.apache.ignite.internal.cli.core.repl.executor.ReplExecutorProvider;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import picocli.CommandLine.IFactory;

/** Tests for {@link SqlReplCommand} with not initialized cluster. */
public class ItSqlReplCommandNotInitializedClusterTest extends CliIntegrationTest {
Expand All @@ -38,7 +39,7 @@ public class ItSqlReplCommandNotInitializedClusterTest extends CliIntegrationTes
@Bean
@Replaces(ReplExecutorProvider.class)
public ReplExecutorProvider replExecutorProvider() {
return () -> repl -> {};
return (IFactory factory) -> repl -> {};
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.ignite.internal.cli.core.repl.executor.ReplExecutorProvider;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import picocli.CommandLine.IFactory;

/** Tests for {@link SqlReplCommand}. */
class ItSqlReplCommandTest extends CliIntegrationTest {
Expand Down Expand Up @@ -161,6 +162,6 @@ void verboseDriver() {
@Bean
@Replaces(ReplExecutorProvider.class)
public ReplExecutorProvider replExecutorProvider() {
return () -> repl -> {};
return (IFactory factory) -> repl -> {};
}
}
23 changes: 2 additions & 21 deletions modules/cli/src/main/java/org/apache/ignite/internal/cli/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,9 @@
import org.apache.ignite.internal.cli.config.ConfigManagerProvider;
import org.apache.ignite.internal.cli.config.StateFolderProvider;
import org.apache.ignite.internal.cli.core.exception.handler.PicocliExecutionExceptionHandler;
import org.apache.ignite.internal.cli.core.flow.question.JlineQuestionWriterReaderFactory;
import org.apache.ignite.internal.cli.core.flow.question.QuestionAskerFactory;
import org.apache.ignite.internal.cli.core.repl.executor.ReplExecutorProviderImpl;
import org.apache.ignite.internal.cli.core.style.AnsiStringSupport;
import org.apache.ignite.internal.cli.core.style.ColorScheme;
import org.fusesource.jansi.AnsiConsole;
import org.jline.terminal.Terminal;
import picocli.CommandLine;
import picocli.CommandLine.Help.Ansi;

Expand All @@ -67,8 +63,6 @@ public static void main(String[] args) {
if (interactiveMode) {
// REPL mode: full initialization with Jansi ANSI console and JLine terminal.
AnsiConsole.systemInstall();
initReplExecutor(micronautFactory);
initQuestionAsker(micronautFactory);
enterRepl(micronautFactory);
} else {
// Non-interactive mode: skip JLine terminal initialization for faster startup.
Expand Down Expand Up @@ -105,30 +99,17 @@ private static void initColorScheme(MicronautFactory micronautFactory) throws Ex
AnsiStringSupport.setColorSchemeProvider(() -> {
String schemeName = configProvider.get().getCurrentProperty("ignite.cli.color-scheme");
ColorScheme scheme = ColorScheme.fromString(schemeName);
ColorScheme result = scheme != null ? scheme : ColorScheme.SOLARIZED_DARK;
return result;
return scheme != null ? scheme : ColorScheme.SOLARIZED_DARK;
});
}

/** Needed for immediate REPL mode and for running a command which will stay in REPL mode so we need to init it once. */
private static void initReplExecutor(MicronautFactory micronautFactory) throws Exception {
ReplExecutorProviderImpl replExecutorProvider = micronautFactory.create(ReplExecutorProviderImpl.class);
replExecutorProvider.injectFactory(micronautFactory);
}

/** Creates an instance of the terminal and sets the question asker factory. */
private static void initQuestionAsker(MicronautFactory micronautFactory) throws Exception {
Terminal terminal = micronautFactory.create(Terminal.class);
QuestionAskerFactory.setWriterReaderFactory(new JlineQuestionWriterReaderFactory(terminal));
}

private static void enterRepl(MicronautFactory micronautFactory) throws Exception {
VersionProvider versionProvider = micronautFactory.create(VersionProvider.class);
System.out.println(banner(versionProvider));

ReplManager replManager = micronautFactory.create(ReplManager.class);
replManager.subscribe();
replManager.startReplMode();
replManager.startReplMode(micronautFactory);
}

private static int executeCommand(String[] args, MicronautFactory micronautFactory) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,16 @@
import org.apache.ignite.internal.cli.core.call.CallExecutionPipeline;
import org.apache.ignite.internal.cli.core.call.StringCallInput;
import org.apache.ignite.internal.cli.core.exception.handler.DefaultExceptionHandlers;
import org.apache.ignite.internal.cli.core.flow.question.JlineQuestionWriterReaderFactory;
import org.apache.ignite.internal.cli.core.flow.question.QuestionAskerFactory;
import org.apache.ignite.internal.cli.core.repl.EventListeningActivationPoint;
import org.apache.ignite.internal.cli.core.repl.Repl;
import org.apache.ignite.internal.cli.core.repl.SessionDefaultValueProvider;
import org.apache.ignite.internal.cli.core.repl.executor.ReplExecutorProvider;
import org.apache.ignite.internal.cli.core.repl.prompt.PromptProvider;
import org.jline.terminal.Terminal;
import picocli.CommandLine;
import picocli.CommandLine.IFactory;

/**
* Class which runs main REPL mode, it's used both when starting directly into the REPL mode and from the `connect` command.
Expand All @@ -50,8 +55,11 @@ public class ReplManager {
@Inject
private EventListeningActivationPoint eventListeningActivationPoint;

@Inject
private Terminal terminal;

/**
* Subscribes to CLI events. Should be called before {@link #startReplMode()}.
* Subscribes to CLI events. Should be called before {@link #startReplMode(IFactory)} ()}.
*/
public void subscribe() {
eventListeningActivationPoint.subscribe();
Expand All @@ -60,8 +68,10 @@ public void subscribe() {
/**
* Enters REPL mode.
*/
public void startReplMode() {
replExecutorProvider.get().execute(Repl.builder()
public void startReplMode(CommandLine.IFactory factory) {
QuestionAskerFactory.setWriterReaderFactory(new JlineQuestionWriterReaderFactory(terminal));

replExecutorProvider.get(factory).execute(Repl.builder()
.withPromptProvider(promptProvider)
.withCommandClass(TopLevelCliReplCommand.class)
.withDefaultValueProvider(defaultValueProvider)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public Integer call() {
.input(connectCallInput())
);
if (exitCode == 0) {
replManager.startReplMode();
replManager.startReplMode(spec.commandLine().getFactory());
}
return exitCode;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public void run() {
SqlCompleter sqlCompleter = new SqlCompleter(schemaProvider);
IgniteSqlCommandCompleter sqlCommandCompleter = new IgniteSqlCommandCompleter();

replExecutorProvider.get().execute(Repl.builder()
replExecutorProvider.get(spec.commandLine().getFactory()).execute(Repl.builder()
.withPromptProvider(() -> ansi(fg(Color.GREEN).mark("sql-cli> ")))
.withCompleter(new AggregateCompleter(sqlCommandCompleter, sqlCompleter))
.withCommandClass(SqlReplTopLevelCliCommand.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,18 @@

package org.apache.ignite.internal.cli.core.repl.executor;

import picocli.CommandLine.IFactory;

/**
* Provider of {@link ReplExecutor}.
*/
@FunctionalInterface
public interface ReplExecutorProvider {
ReplExecutor get();
/**
* Creates REPL executor.
*
* @param factory Commands factory.
* @return New instance of {@link ReplExecutor}.
*/
ReplExecutor get(IFactory factory);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,29 @@

package org.apache.ignite.internal.cli.core.repl.executor;

import io.micronaut.configuration.picocli.MicronautFactory;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import org.apache.ignite.internal.cli.config.ConfigManagerProvider;
import org.jline.terminal.Terminal;
import picocli.CommandLine.IFactory;
import picocli.shell.jline3.PicocliCommands.PicocliCommandsFactory;

/**
* Provider of {@link ReplExecutor}.
*/
@Singleton
public class ReplExecutorProviderImpl implements ReplExecutorProvider {
private PicocliCommandsFactory factory;

@Inject
private Terminal terminal;

@Inject
private ConfigManagerProvider configManagerProvider;

@Override
public ReplExecutor get() {
return new ReplExecutorImpl(factory, terminal, configManagerProvider);
}
public ReplExecutor get(IFactory factory) {
PicocliCommandsFactory picocliCommandsFactory = new PicocliCommandsFactory(factory);
picocliCommandsFactory.setTerminal(terminal);

public void injectFactory(MicronautFactory micronautFactory) {
factory = new PicocliCommandsFactory(micronautFactory);
factory.setTerminal(terminal);
return new ReplExecutorImpl(picocliCommandsFactory, terminal, configManagerProvider);
}
}