This is an automated email from the ASF dual-hosted git repository.

mpetrov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new cc6888d176d IGNITE-25438 Added offline commands support (#12083)
cc6888d176d is described below

commit cc6888d176d0a2d6cd4bd90b50757c9e6daa20a0
Author: oleg-vlsk <[email protected]>
AuthorDate: Mon Jun 16 20:11:50 2025 +1000

    IGNITE-25438 Added offline commands support (#12083)
---
 .../apache/ignite/util/GridCommandHandlerTest.java | 76 ++++++++++++++++++++++
 .../util/GridCommandHandlerWithSslFactoryTest.java |  7 ++
 .../apache/ignite/util/TestCommandsProvider.java   | 51 +++++++++++++++
 ...ignite.internal.management.api.CommandsProvider |  1 +
 .../internal/management/ActivateCommand.java       |  4 +-
 .../internal/management/DeactivateCommand.java     |  4 +-
 .../internal/management/SetStateCommand.java       |  4 +-
 .../ignite/internal/management/StateCommand.java   |  4 +-
 .../internal/management/api/CommandInvoker.java    |  6 +-
 .../internal/management/api/CommandUtils.java      |  5 +-
 .../api/{LocalCommand.java => NativeCommand.java}  |  2 +-
 .../api/{LocalCommand.java => OfflineCommand.java} | 25 ++-----
 .../management/cache/CacheListCommand.java         |  4 +-
 .../consistency/ConsistencyRepairCommand.java      |  4 +-
 .../internal/management/tx/TxInfoCommand.java      |  4 +-
 .../commandline/CommandsProviderExtImpl.java       |  4 +-
 16 files changed, 165 insertions(+), 40 deletions(-)

diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index b7d1c3a0fdb..827c15161a0 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -19,6 +19,8 @@ package org.apache.ignite.util;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.RandomAccessFile;
 import java.io.Serializable;
 import java.lang.reflect.Field;
@@ -49,6 +51,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.LongAdder;
 import java.util.function.BiConsumer;
 import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.UnaryOperator;
 import java.util.regex.Matcher;
@@ -80,6 +83,9 @@ import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+import org.apache.ignite.internal.management.api.Argument;
+import org.apache.ignite.internal.management.api.OfflineCommand;
 import 
org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceTaskResult;
 import org.apache.ignite.internal.management.cache.IdleVerifyDumpTask;
 import org.apache.ignite.internal.management.cache.VerifyBackupPartitionsTask;
@@ -187,6 +193,8 @@ import static 
org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static 
org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 import static 
org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
+import static org.apache.ignite.util.TestCommandsProvider.registerCommands;
+import static org.apache.ignite.util.TestCommandsProvider.unregisterAll;
 import static org.apache.ignite.util.TestStorageUtils.corruptDataEntry;
 
 /**
@@ -3911,6 +3919,27 @@ public class GridCommandHandlerTest extends 
GridCommandHandlerClusterPerMethodAb
         }
     }
 
+    /** */
+    @Test
+    public void testOfflineCommand() throws Exception {
+        try {
+            registerCommands(new OfflineTestCommand());
+
+            startGrid(0);
+
+            injectTestSystemOut();
+
+            String input = "Test Offline Command";
+
+            assertEquals(EXIT_CODE_OK, execute("--offline-test", "--input", 
input));
+
+            assertTrue(testOut.toString().contains(input));
+        }
+        finally {
+            unregisterAll();
+        }
+    }
+
     /**
      * @param ignite Ignite to execute task on.
      * @param delFoundGarbage If clearing mode should be used.
@@ -4007,4 +4036,51 @@ public class GridCommandHandlerTest extends 
GridCommandHandlerClusterPerMethodAb
     public static void assertClusterState(ClusterState state, String 
logOutput) {
         assertTrue(Pattern.compile("Cluster state: " + state + 
"\\s+").matcher(logOutput).find());
     }
+
+    /** */
+    public static class OfflineTestCommand implements 
OfflineCommand<OfflineTestCommandArg, Void> {
+        /** {@inheritDoc} */
+        @Override public String description() {
+            return null;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Class<OfflineTestCommandArg> argClass() {
+            return OfflineTestCommandArg.class;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Void execute(OfflineTestCommandArg arg, 
Consumer<String> printer) {
+            printer.accept(arg.input());
+
+            return null;
+        }
+    }
+
+    /** */
+    public static class OfflineTestCommandArg extends IgniteDataTransferObject 
{
+        /** */
+        @Argument
+        private String input;
+
+        /** */
+        public String input() {
+            return input;
+        }
+
+        /** */
+        public void input(String input) {
+            this.input = input;
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void writeExternalData(ObjectOutput out) throws 
IOException {
+            U.writeString(out, input);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void readExternalData(ObjectInput in) throws 
IOException {
+            input = U.readString(in);
+        }
+    }
 }
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWithSslFactoryTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWithSslFactoryTest.java
index 0ffc6aae3fd..ed2828b8af1 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWithSslFactoryTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWithSslFactoryTest.java
@@ -105,4 +105,11 @@ public class GridCommandHandlerWithSslFactoryTest extends 
GridCommandHandlerWith
 
         factoryUsed = true; // It's an SSL free test. Setting to `true` to 
avoid fail on check.
     }
+
+    /** {@inheritDoc} */
+    @Override public void testOfflineCommand() throws Exception {
+        super.testOfflineCommand();
+
+        factoryUsed = true;
+    }
 }
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/TestCommandsProvider.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/TestCommandsProvider.java
new file mode 100644
index 00000000000..0e73241f558
--- /dev/null
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/TestCommandsProvider.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.util;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.internal.management.api.Command;
+import org.apache.ignite.internal.management.api.CommandsProvider;
+import org.apache.ignite.internal.util.typedef.F;
+
+/** Enables registration of additional commands for testing purposes. */
+public class TestCommandsProvider implements CommandsProvider {
+    /** Commands. */
+    private static final Set<Command<?, ?>> COMMANDS = 
ConcurrentHashMap.newKeySet();
+
+    /**
+     * Registers new commands.
+     *
+     * @param cmds Commands to register.
+     */
+    public static void registerCommands(Command<?, ?>... cmds) {
+        COMMANDS.addAll(F.asList(cmds));
+    }
+
+    /** Unregisters all registered commands. */
+    public static void unregisterAll() {
+        COMMANDS.clear();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<Command<?, ?>> commands() {
+        return Collections.unmodifiableSet(COMMANDS);
+    }
+}
diff --git 
a/modules/control-utility/src/test/resources/META-INF/services/org.apache.ignite.internal.management.api.CommandsProvider
 
b/modules/control-utility/src/test/resources/META-INF/services/org.apache.ignite.internal.management.api.CommandsProvider
new file mode 100644
index 00000000000..d2641b2c6dc
--- /dev/null
+++ 
b/modules/control-utility/src/test/resources/META-INF/services/org.apache.ignite.internal.management.api.CommandsProvider
@@ -0,0 +1 @@
+org.apache.ignite.util.TestCommandsProvider
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/ActivateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/ActivateCommand.java
index fc80456cdb5..8b718132f2f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/ActivateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/ActivateCommand.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.management;
 import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.client.IgniteClient;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.management.api.NoArg;
 import org.jetbrains.annotations.Nullable;
 
@@ -28,7 +28,7 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE;
 
 /** */
 @Deprecated
-public class ActivateCommand implements LocalCommand<NoArg, NoArg> {
+public class ActivateCommand implements NativeCommand<NoArg, NoArg> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Activate cluster (deprecated. Use --set-state instead)";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/DeactivateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/DeactivateCommand.java
index 7ab7eb25193..ccd60139e39 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/DeactivateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/DeactivateCommand.java
@@ -26,7 +26,7 @@ import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.client.thin.ClientClusterImpl;
 import org.apache.ignite.internal.cluster.IgniteClusterEx;
 import org.apache.ignite.internal.management.api.CommandUtils;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.management.api.NoArg;
 import org.apache.ignite.internal.management.api.PreparableCommand;
 import org.apache.ignite.internal.util.typedef.F;
@@ -38,7 +38,7 @@ import static org.apache.ignite.cluster.ClusterState.INACTIVE;
 
 /** */
 @Deprecated
-public class DeactivateCommand implements LocalCommand<DeactivateCommandArg, 
NoArg>, PreparableCommand<DeactivateCommandArg, NoArg> {
+public class DeactivateCommand implements NativeCommand<DeactivateCommandArg, 
NoArg>, PreparableCommand<DeactivateCommandArg, NoArg> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Deactivate cluster (deprecated. Use --set-state instead)";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/SetStateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/SetStateCommand.java
index 07ab1c36e6a..ce27f63f074 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/SetStateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/SetStateCommand.java
@@ -23,11 +23,11 @@ import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.internal.client.thin.ClientClusterImpl;
 import org.apache.ignite.internal.cluster.IgniteClusterEx;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class SetStateCommand implements LocalCommand<SetStateCommandArg, 
Boolean> {
+public class SetStateCommand implements NativeCommand<SetStateCommandArg, 
Boolean> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Change cluster state";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
index 45c3b8fe70a..04110ba3ce9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
@@ -23,7 +23,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.internal.management.api.CommandUtils;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.management.api.NoArg;
 import org.apache.ignite.internal.util.lang.GridTuple3;
 import org.apache.ignite.internal.util.typedef.F;
@@ -35,7 +35,7 @@ import static java.util.Collections.singleton;
 import static org.apache.ignite.internal.util.typedef.internal.U.DELIM;
 
 /** */
-public class StateCommand implements LocalCommand<NoArg, GridTuple3<UUID, 
String, ClusterState>> {
+public class StateCommand implements NativeCommand<NoArg, GridTuple3<UUID, 
String, ClusterState>> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Print current cluster state";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
index bc6f25d1440..7698d165557 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
@@ -72,8 +72,10 @@ public class CommandInvoker<A extends 
IgniteDataTransferObject> {
     public <R> R invoke(Consumer<String> printer) throws Exception {
         R res;
 
-        if (cmd instanceof LocalCommand)
-            res = ((LocalCommand<A, R>)cmd).execute(igniteClient(), ignite, 
arg, printer);
+        if (cmd instanceof OfflineCommand)
+            res = ((OfflineCommand<A, R>)cmd).execute(arg, printer);
+        else if (cmd instanceof NativeCommand)
+            res = ((NativeCommand<A, R>)cmd).execute(igniteClient(), ignite, 
arg, printer);
         else if (cmd instanceof ComputeCommand) {
             ComputeCommand<A, R> cmd = (ComputeCommand<A, R>)this.cmd;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
index 8489bcfe574..87573157a93 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
@@ -533,10 +533,11 @@ public class CommandUtils {
      * @return {@code True} if command can be executed, {@code false} 
otherwise.
      */
     public static boolean executable(Command<?, ?> cmd) {
-        return cmd instanceof LocalCommand
+        return cmd instanceof NativeCommand
             || cmd instanceof ComputeCommand
             || cmd instanceof HelpCommand
-            || cmd instanceof BeforeNodeStartCommand;
+            || cmd instanceof BeforeNodeStartCommand
+            || cmd instanceof OfflineCommand;
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/NativeCommand.java
similarity index 95%
copy from 
modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
copy to 
modules/core/src/main/java/org/apache/ignite/internal/management/api/NativeCommand.java
index 4d3bca08168..b71c37f053b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/NativeCommand.java
@@ -26,7 +26,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Command that must be executed directly using {@link IgniteClient} or {@link 
Ignite} instance.
  */
-public interface LocalCommand<A extends IgniteDataTransferObject, R> extends 
Command<A, R> {
+public interface NativeCommand<A extends IgniteDataTransferObject, R> extends 
Command<A, R> {
     /**
      * Executes command logic.
      * Commands invoked in two different environments:
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/OfflineCommand.java
similarity index 56%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
rename to 
modules/core/src/main/java/org/apache/ignite/internal/management/api/OfflineCommand.java
index 4d3bca08168..dc479c5f06f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/OfflineCommand.java
@@ -18,32 +18,19 @@
 package org.apache.ignite.internal.management.api;
 
 import java.util.function.Consumer;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
-import org.jetbrains.annotations.Nullable;
 
-/**
- * Command that must be executed directly using {@link IgniteClient} or {@link 
Ignite} instance.
- */
-public interface LocalCommand<A extends IgniteDataTransferObject, R> extends 
Command<A, R> {
+/** Represents commands that can be executed without connecting to the 
cluster. */
+public interface OfflineCommand<A extends IgniteDataTransferObject, R> extends 
Command<A, R> {
     /**
-     * Executes command logic.
-     * Commands invoked in two different environments:
-     * <ul>
-     *     <li>CLI utility using {@link IgniteClient} connection to interact 
with cluster.</li>
-     *     <li>Inside {@link Ignite} node therefore local node can be used to 
interact with cluster.</li>
-     * </ul>
+     * Executes the command in offline mode without cluster connection.
      *
-     * @param ignite Optional ignite node.
      * @param arg Command argument.
-     * @param printer Results printer.
-     * @return Command result.
+     * @param printer Consumer for command output printing.
+     * @return Command execution result.
      */
     public R execute(
-        @Nullable IgniteClient client,
-        @Nullable Ignite ignite,
         A arg,
         Consumer<String> printer
-    ) throws Exception;
+    );
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
index 9d15ed04b6e..eb626991900 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
@@ -30,7 +30,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.jetbrains.annotations.Nullable;
 
@@ -41,7 +41,7 @@ import static 
org.apache.ignite.internal.management.cache.ViewCacheCmd.GROUPS;
 import static org.apache.ignite.internal.management.cache.ViewCacheCmd.SEQ;
 
 /** Prints info regarding caches, groups or sequences. */
-public class CacheListCommand implements LocalCommand<CacheListCommandArg, 
ViewCacheTaskResult> {
+public class CacheListCommand implements NativeCommand<CacheListCommandArg, 
ViewCacheTaskResult> {
     /** */
     Function<CacheListCommandArg, Predicate<ClusterNode>> FILTER = arg -> node 
->
         arg.nodeId() == null || Objects.equals(node.id(), arg.nodeId());
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
index 354e8ac08ec..9df81022c8c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
@@ -26,7 +26,7 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.lang.IgniteExperimental;
 import org.jetbrains.annotations.Nullable;
 
@@ -35,7 +35,7 @@ import static 
org.apache.ignite.internal.management.api.CommandUtils.nodes;
 
 /** */
 @IgniteExperimental
-public class ConsistencyRepairCommand implements 
LocalCommand<ConsistencyRepairCommandArg, String> {
+public class ConsistencyRepairCommand implements 
NativeCommand<ConsistencyRepairCommandArg, String> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Check/Repair cache consistency using Read Repair approach";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
index 29c74b9645e..3b163f70276 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
@@ -28,7 +28,7 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.management.tx.TxCommand.AbstractTxCommandArg;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.typedef.F;
@@ -39,7 +39,7 @@ import static 
org.apache.ignite.internal.management.api.CommandUtils.DOUBLE_INDE
 import static 
org.apache.ignite.internal.management.tx.TxCommand.nodeDescription;
 
 /** */
-public class TxInfoCommand implements LocalCommand<AbstractTxCommandArg, 
Map<ClusterNode, TxTaskResult>> {
+public class TxInfoCommand implements NativeCommand<AbstractTxCommandArg, 
Map<ClusterNode, TxTaskResult>> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Print detailed information (topology and key lock ownership) 
about specific transaction";
diff --git 
a/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/commandline/CommandsProviderExtImpl.java
 
b/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/commandline/CommandsProviderExtImpl.java
index bb926e7e67d..72b10d898bd 100644
--- 
a/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/commandline/CommandsProviderExtImpl.java
+++ 
b/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/commandline/CommandsProviderExtImpl.java
@@ -29,7 +29,7 @@ import org.apache.ignite.internal.management.api.Argument;
 import org.apache.ignite.internal.management.api.Command;
 import org.apache.ignite.internal.management.api.CommandsProvider;
 import org.apache.ignite.internal.management.api.ComputeCommand;
-import org.apache.ignite.internal.management.api.LocalCommand;
+import org.apache.ignite.internal.management.api.NativeCommand;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -63,7 +63,7 @@ public class CommandsProviderExtImpl implements 
CommandsProvider {
     }
 
     /** */
-    public static class TestCommandCommand implements 
LocalCommand<TestCommandCommandArg, Void> {
+    public static class TestCommandCommand implements 
NativeCommand<TestCommandCommandArg, Void> {
         /** {@inheritDoc} */
         @Override public String description() {
             return TEST_COMMAND_USAGE;

Reply via email to