Repository: ignite
Updated Branches:
  refs/heads/master a5a907b80 -> f53c48aa7


IGNITE-7485 Added support for authentication parameters in control.sh.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f53c48aa
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f53c48aa
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f53c48aa

Branch: refs/heads/master
Commit: f53c48aa731f1c69513c5ea474bb1e18de1b81f5
Parents: a5a907b
Author: Sergey Kosarev <macrerg...@gmail.com>
Authored: Mon Feb 12 10:51:57 2018 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Mon Feb 12 10:51:57 2018 +0700

----------------------------------------------------------------------
 .../internal/client/impl/GridClientImpl.java    |  28 +--
 .../GridClientConnectionManagerAdapter.java     |  11 +-
 .../connection/GridClientNioTcpConnection.java  |   8 +-
 .../client/router/impl/GridTcpRouterImpl.java   |  25 +-
 .../ignite/internal/commandline/Arguments.java  | 117 ++++++++++
 .../internal/commandline/CommandHandler.java    | 232 +++++++++++--------
 .../commandline/CommandHandlerParsingTest.java  | 118 ++++++++++
 .../testsuites/IgniteUtilSelfTestSuite.java     |   2 +
 .../ignite/util/GridCommandHandlerTest.java     |  35 +--
 9 files changed, 405 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientImpl.java
index 9b71ae4..d045a62 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientImpl.java
@@ -17,8 +17,6 @@
 
 package org.apache.ignite.internal.client.impl;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,6 +38,7 @@ import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.internal.client.GridClient;
 import org.apache.ignite.internal.client.GridClientCacheMode;
 import org.apache.ignite.internal.client.GridClientClosedException;
+import org.apache.ignite.internal.client.GridClientClusterState;
 import org.apache.ignite.internal.client.GridClientCompute;
 import org.apache.ignite.internal.client.GridClientConfiguration;
 import org.apache.ignite.internal.client.GridClientData;
@@ -48,7 +47,6 @@ import 
org.apache.ignite.internal.client.GridClientDataConfiguration;
 import org.apache.ignite.internal.client.GridClientDisconnectedException;
 import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.client.GridClientFactory;
-import org.apache.ignite.internal.client.GridClientClusterState;
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.client.GridClientPartitionAffinity;
 import org.apache.ignite.internal.client.GridClientPredicate;
@@ -70,10 +68,6 @@ import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS;
  * Client implementation.
  */
 public class GridClientImpl implements GridClient {
-    /** Enterprise connection manager class name. */
-    private static final String ENT_CONN_MGR_CLS =
-        
"org.apache.ignite.internal.client.impl.connection.GridClientConnectionManagerEntImpl";
-
     /** Null mask object. */
     private static final Object NULL_MASK = new Object();
 
@@ -445,25 +439,7 @@ public class GridClientImpl implements GridClient {
         GridClientConfiguration cfg, Collection<InetSocketAddress> routers, 
GridClientTopology top,
         @Nullable Byte marshId, boolean routerClient)
         throws GridClientException {
-        GridClientConnectionManager mgr;
-
-        try {
-            Class<?> cls = Class.forName(ENT_CONN_MGR_CLS);
-
-            Constructor<?> cons = cls.getConstructor(UUID.class, 
SSLContext.class, GridClientConfiguration.class,
-                Collection.class, GridClientTopology.class, Byte.class, 
boolean.class);
-
-            mgr = (GridClientConnectionManager)cons.newInstance(clientId, 
sslCtx, cfg, routers, top, marshId,
-                routerClient);
-        }
-        catch (ClassNotFoundException ignored) {
-            mgr = new GridClientConnectionManagerOsImpl(clientId, sslCtx, cfg, 
routers, top, marshId, routerClient);
-        }
-        catch (NoSuchMethodException | IllegalAccessException | 
InstantiationException | InvocationTargetException e) {
-            throw new GridClientException("Failed to create client connection 
manager.", e);
-        }
-
-        return mgr;
+        return new GridClientConnectionManagerOsImpl(clientId, sslCtx, cfg, 
routers, top, marshId, routerClient);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
index aa06322..87980b9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
@@ -472,7 +472,7 @@ public abstract class GridClientConnectionManagerAdapter 
implements GridClientCo
                 try {
                     conn = new GridClientNioTcpConnection(srv, clientId, addr, 
sslCtx, pingExecutor,
                         cfg.getConnectTimeout(), cfg.getPingInterval(), 
cfg.getPingTimeout(),
-                        cfg.isTcpNoDelay(), marsh, marshId, top, cred, 
keepBinariesThreadLocal());
+                        cfg.isTcpNoDelay(), marsh, marshId, top, cred);
                 }
                 catch (GridClientException e) {
                     if (marsh instanceof GridClientZipOptimizedMarshaller) {
@@ -482,7 +482,7 @@ public abstract class GridClientConnectionManagerAdapter 
implements GridClientCo
                         conn = new GridClientNioTcpConnection(srv, clientId, 
addr, sslCtx, pingExecutor,
                             cfg.getConnectTimeout(), cfg.getPingInterval(), 
cfg.getPingTimeout(),
                             cfg.isTcpNoDelay(), 
((GridClientZipOptimizedMarshaller)marsh).defaultMarshaller(), marshId,
-                            top, cred, keepBinariesThreadLocal());
+                            top, cred);
                     }
                     else
                         throw e;
@@ -506,13 +506,6 @@ public abstract class GridClientConnectionManagerAdapter 
implements GridClientCo
         }
     }
 
-    /**
-     * @return Get thread local used to enable keep binary mode.
-     */
-    protected ThreadLocal<Boolean> keepBinariesThreadLocal() {
-        return null;
-    }
-
     /** {@inheritDoc} */
     @Override public void terminateConnection(GridClientConnection conn, 
GridClientNode node, Throwable e) {
         if (log.isLoggable(Level.FINE))

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java
index 3bedd5f..e117cc8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java
@@ -158,9 +158,6 @@ public class GridClientNioTcpConnection extends 
GridClientConnection {
     /** Marshaller. */
     private final GridClientMarshaller marsh;
 
-    /** */
-    private final ThreadLocal<Boolean> keepBinariesMode;
-
     /**
      * Creates a client facade, tries to connect to remote server, in case of 
success starts reader thread.
      *
@@ -192,8 +189,7 @@ public class GridClientNioTcpConnection extends 
GridClientConnection {
         GridClientMarshaller marsh,
         Byte marshId,
         GridClientTopology top,
-        Object cred,
-        ThreadLocal<Boolean> keepBinariesMode
+        Object cred
     ) throws IOException, GridClientException {
         super(clientId, srvAddr, sslCtx, top, cred);
 
@@ -202,7 +198,6 @@ public class GridClientNioTcpConnection extends 
GridClientConnection {
         this.marsh = marsh;
         this.pingInterval = pingInterval;
         this.pingTimeout = pingTimeout;
-        this.keepBinariesMode = keepBinariesMode;
 
         SocketChannel ch = null;
         Socket sock = null;
@@ -1062,7 +1057,6 @@ public class GridClientNioTcpConnection extends 
GridClientConnection {
         private GridClientMessage pendingMsg;
 
         /** Flag indicating whether authentication retry was attempted for 
this request. */
-        @SuppressWarnings("RedundantFieldInitialization")
         private int authRetry = STATE_INITIAL;
 
         /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridTcpRouterImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridTcpRouterImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridTcpRouterImpl.java
index da55ec7..d6daf99 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridTcpRouterImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridTcpRouterImpl.java
@@ -18,8 +18,6 @@
 package org.apache.ignite.internal.client.router.impl;
 
 import java.lang.management.ManagementFactory;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteOrder;
@@ -53,9 +51,6 @@ import org.jetbrains.annotations.Nullable;
  * Wrapper class for router process.
  */
 public class GridTcpRouterImpl implements GridTcpRouter, GridTcpRouterMBean, 
LifecycleAware {
-    /** */
-    private static final String ENT_NIO_LSNR_CLS = 
"org.apache.ignite.client.router.impl.GridTcpRouterNioListenerEntImpl";
-
     /** Id. */
     private final UUID id = UUID.randomUUID();
 
@@ -108,23 +103,7 @@ public class GridTcpRouterImpl implements GridTcpRouter, 
GridTcpRouterMBean, Lif
             throw new IgniteException("Failed to initialise embedded client.", 
e);
         }
 
-        GridNioServerListener<GridClientMessage> lsnr;
-
-        try {
-            Class<?> cls = Class.forName(ENT_NIO_LSNR_CLS);
-
-            Constructor<?> cons = 
cls.getDeclaredConstructor(IgniteLogger.class, GridRouterClientImpl.class);
-
-            cons.setAccessible(true);
-
-            lsnr = 
(GridNioServerListener<GridClientMessage>)cons.newInstance(log, client);
-        }
-        catch (ClassNotFoundException ignored) {
-            lsnr = new GridTcpRouterNioListenerOsImpl(log, client);
-        }
-        catch (NoSuchMethodException | IllegalAccessException | 
InstantiationException | InvocationTargetException e) {
-            throw new IgniteException("Failed to create NIO listener.", e);
-        }
+        GridNioServerListener<GridClientMessage> lsnr = new 
GridTcpRouterNioListenerOsImpl(log, client);
 
         parser = new GridTcpRouterNioParser();
 
@@ -379,4 +358,4 @@ public class GridTcpRouterImpl implements GridTcpRouter, 
GridTcpRouterMBean, Lif
 
         return id.equals(that.id);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
new file mode 100644
index 0000000..6a9a3f7
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java
@@ -0,0 +1,117 @@
+/*
+ * 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.internal.commandline;
+
+/**
+ * Bean with all parsed and validated arguments.
+ */
+public class Arguments {
+    /** Command. */
+    private String cmd;
+
+    /** Host. */
+    private String host;
+
+    /** Port. */
+    private String port;
+
+    /** User. */
+    private String user;
+
+    /** Password. */
+    private String pwd;
+
+    /**
+     * Action for baseline command.
+     */
+    private String baselineAct;
+
+    /**
+     * Arguments for baseline command.
+     */
+    private String baselineArgs;
+
+    /**
+     * @param cmd Command.
+     * @param host Host.
+     * @param port Port.
+     * @param user User.
+     * @param pwd Password.
+     * @param baselineAct Baseline action.
+     * @param baselineArgs Baseline args.
+     */
+    public Arguments(String cmd, String host, String port, String user, String 
pwd, String baselineAct,
+        String baselineArgs) {
+        this.cmd = cmd;
+        this.host = host;
+        this.port = port;
+        this.user = user;
+        this.pwd = pwd;
+        this.baselineAct = baselineAct;
+        this.baselineArgs = baselineArgs;
+    }
+
+    /**
+     * @return command
+     */
+    public String command() {
+        return cmd;
+    }
+
+    /**
+     * @return host name
+     */
+    public String host() {
+        return host;
+    }
+
+    /**
+     * @return port number
+     */
+    public String port() {
+        return port;
+    }
+
+    /**
+     * @return user name
+     */
+    public String user() {
+        return user;
+    }
+
+    /**
+     * @return password
+     */
+    public String password() {
+        return pwd;
+    }
+
+    /**
+     * @return baseline action
+     */
+    public String baselineAction() {
+        return baselineAct;
+    }
+
+    /**
+     * @return baseline arguments
+     */
+    public String baselineArguments() {
+        return baselineArgs;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index cf331f8..5895ad2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -44,6 +44,9 @@ import 
org.apache.ignite.internal.visor.baseline.VisorBaselineOperation;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTask;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskArg;
 import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskResult;
+import org.apache.ignite.plugin.security.SecurityCredentials;
+import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider;
+import org.jetbrains.annotations.NotNull;
 
 import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
@@ -58,10 +61,10 @@ import static 
org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.V
  */
 public class CommandHandler {
     /** */
-    private static final String DFLT_HOST = "127.0.0.1";
+    static final String DFLT_HOST = "127.0.0.1";
 
     /** */
-    private static final String DFLT_PORT = "11211";
+    static final String DFLT_PORT = "11211";
 
     /** */
     private static final String CMD_HELP = "--help";
@@ -73,16 +76,10 @@ public class CommandHandler {
     private static final String CMD_PORT = "--port";
 
     /** */
-    private static final String CMD_ACTIVATE = "--activate";
+    private static final String CMD_PASSWORD = "--password";
 
     /** */
-    private static final String CMD_DEACTIVATE = "--deactivate";
-
-    /** */
-    private static final String CMD_STATE = "--state";
-
-    /** */
-    private static final String CMD_BASE_LINE = "--baseline";
+    private static final String CMD_USER = "--user";
 
     /** */
     private static final String BASELINE_ADD = "add";
@@ -100,6 +97,18 @@ public class CommandHandler {
     private static final String DELIM = 
"--------------------------------------------------------------------------------";
 
     /** */
+    static final String CMD_ACTIVATE = "--activate";
+
+    /** */
+    static final String CMD_BASE_LINE = "--baseline";
+
+    /** */
+    static final String CMD_DEACTIVATE = "--deactivate";
+
+    /** */
+    static final String CMD_STATE = "--state";
+
+    /** */
     public static final int EXIT_CODE_OK = 0;
 
     /** */
@@ -158,18 +167,6 @@ public class CommandHandler {
     }
 
     /**
-     * Print command usage.
-     *
-     * @param desc Command description.
-     * @param cmd Command.
-     */
-    private void usage(String desc, String cmd) {
-        log(desc);
-        log("    control.sh [--host HOST_OR_IP] [--port PORT] " + cmd);
-        nl();
-    }
-
-    /**
      * Extract next argument.
      *
      * @param it Arguments iterator.
@@ -190,6 +187,102 @@ public class CommandHandler {
     }
 
     /**
+     * Parses and validates arguments.
+     *
+     * @param rawArgs Array of arguments.
+     * @return Arguments bean.
+     * @throws IllegalArgumentException In case arguments aren't valid.
+     */
+    @NotNull Arguments parseAndValidate(String... rawArgs) {
+        String host = DFLT_HOST;
+
+        String port = DFLT_PORT;
+
+        String user = null;
+
+        String pwd = null;
+
+        String baselineAct = "";
+
+        String baselineArgs = "";
+
+        List<String> commands = new ArrayList<>();
+
+        Iterator<String> it = Arrays.asList(rawArgs).iterator();
+
+        while (it.hasNext()) {
+            String str = it.next().toLowerCase();
+
+            switch (str) {
+                case CMD_HOST:
+                    host = nextArg(it, "Expected host name");
+                    break;
+
+                case CMD_PORT:
+                    port = nextArg(it, "Expected port number");
+
+                    try {
+                        int p = Integer.parseInt(port);
+
+                        if (p <= 0 || p > 65535)
+                            throw new IllegalArgumentException("Invalid value 
for port: " + port);
+                    }
+                    catch (NumberFormatException ignored) {
+                        throw new IllegalArgumentException("Invalid value for 
port: " + port);
+                    }
+                    break;
+
+                case CMD_USER:
+                    user = nextArg(it, "Expected user name");
+                    break;
+
+                case CMD_PASSWORD:
+                    pwd = nextArg(it, "Expected password");
+                    break;
+
+                case CMD_ACTIVATE:
+                case CMD_DEACTIVATE:
+                case CMD_STATE:
+                    commands.add(str);
+                    break;
+
+                case CMD_BASE_LINE:
+                    commands.add(CMD_BASE_LINE);
+
+                    if (it.hasNext()) {
+                        baselineAct = it.next().toLowerCase();
+
+                        if (BASELINE_ADD.equals(baselineAct) || 
BASELINE_REMOVE.equals(baselineAct) ||
+                            BASELINE_SET.equals(baselineAct) || 
BASELINE_SET_VERSION.equals(baselineAct))
+                            baselineArgs = nextArg(it, "Expected baseline 
arguments");
+                        else
+                            throw new IllegalArgumentException("Unexpected 
argument for " + CMD_BASE_LINE + ": "
+                                + baselineAct);
+                    }
+
+            }
+        }
+
+        int sz = commands.size();
+
+        if (sz < 1)
+            throw new IllegalArgumentException("No action was specified");
+
+        if (sz > 1)
+            throw new IllegalArgumentException("Only one action can be 
specified, but found: " + sz);
+
+        String cmd = commands.get(0);
+
+        boolean hasUsr = F.isEmpty(user);
+        boolean hasPwd = F.isEmpty(pwd);
+
+        if (hasUsr != hasPwd)
+            throw new IllegalArgumentException("Both user and password should 
be specified");
+
+        return new Arguments(cmd, host, port, user, pwd, baselineAct, 
baselineArgs);
+    }
+
+    /**
      * Activate cluster.
      *
      * @param client Client.
@@ -501,19 +594,31 @@ public class CommandHandler {
     }
 
     /**
+     * Print command usage.
+     *
+     * @param desc Command description.
+     * @param cmd Command.
+     */
+    private void usage(String desc, String cmd) {
+        log(desc);
+        log("    control.sh [--host HOST_OR_IP] [--port PORT] [--user USER] 
[--password PASSWORD] " + cmd);
+        nl();
+    }
+
+    /**
      * Parse and execute command.
      *
-     * @param args Arguments to parse and execute.
+     * @param rawArgs Arguments to parse and execute.
      * @return Exit code.
      */
-    public int execute(String... args) {
+    public int execute(String... rawArgs) {
         log("Control utility [ver. " + ACK_VER_STR + "]");
         log(COPYRIGHT);
         log("User: " + System.getProperty("user.name"));
         log(DELIM);
 
         try {
-            if (F.isEmpty(args) || (args.length == 1 && 
CMD_HELP.equalsIgnoreCase(args[0]))){
+            if (F.isEmpty(rawArgs) || (rawArgs.length == 1 && 
CMD_HELP.equalsIgnoreCase(rawArgs[0]))) {
                 log("This utility can do the following commands:");
 
                 usage("  Activate cluster:", CMD_ACTIVATE);
@@ -540,79 +645,20 @@ public class CommandHandler {
                 return EXIT_CODE_OK;
             }
 
-            String host = DFLT_HOST;
-
-            String port = DFLT_PORT;
-
-            String baselineAct = "";
-
-            String baselineArgs = "";
-
-            List<String> commands = new ArrayList<>();
-
-            Iterator<String> it = Arrays.asList(args).iterator();
-
-            while (it.hasNext()) {
-                String str = it.next().toLowerCase();
-
-                switch (str) {
-                    case CMD_HOST:
-                        host = nextArg(it, "Expected host name");
-                        break;
-
-                    case CMD_PORT:
-                        port = nextArg(it, "Expected port number");
-
-                        try {
-                            int p = Integer.parseInt(port);
-
-                            if (p <= 0 || p > 65535)
-                                throw new IllegalArgumentException("Invalid 
value for port: " + port);
-                        }
-                        catch (NumberFormatException ignored) {
-                            throw new IllegalArgumentException("Invalid value 
for port: " + port);
-                        }
-                        break;
+            Arguments args = parseAndValidate(rawArgs);
 
-                    case CMD_ACTIVATE:
-                    case CMD_DEACTIVATE:
-                    case CMD_STATE:
-                        commands.add(str);
-                        break;
-
-                    case CMD_BASE_LINE:
-                        commands.add(CMD_BASE_LINE);
-
-                        if (it.hasNext()) {
-                            baselineAct = it.next().toLowerCase();
+            GridClientConfiguration cfg = new GridClientConfiguration();
 
-                            if (BASELINE_ADD.equals(baselineAct) || 
BASELINE_REMOVE.equals(baselineAct) ||
-                                BASELINE_SET.equals(baselineAct) || 
BASELINE_SET_VERSION.equals(baselineAct))
-                                baselineArgs = nextArg(it, "Expected baseline 
arguments");
-                            else
-                                throw new IllegalArgumentException("Unexpected 
argument for " + CMD_BASE_LINE + ": "
-                                        + baselineAct);
-                        }
+            cfg.setServers(Collections.singletonList(args.host() + ":" + 
args.port()));
 
-                }
+            if (!F.isEmpty(args.user())) {
+                cfg.setSecurityCredentialsProvider(
+                    new SecurityCredentialsBasicProvider(new 
SecurityCredentials(args.user(), args.password())));
             }
 
-            int sz = commands.size();
-
-            if (sz < 1)
-                throw new IllegalArgumentException("No action was specified");
-
-            if (sz > 1)
-                throw new IllegalArgumentException("Only one action can be 
specified, but found: " + sz);
-
-            GridClientConfiguration cfg = new GridClientConfiguration();
-
-            cfg.setServers(Collections.singletonList(host + ":" + port));
-
             try (GridClient client = GridClientFactory.start(cfg)) {
-                String cmd = commands.get(0);
 
-                switch (cmd) {
+                switch (args.command()) {
                     case CMD_ACTIVATE:
                         activate(client);
                         break;
@@ -626,7 +672,7 @@ public class CommandHandler {
                         break;
 
                     case CMD_BASE_LINE:
-                        baseline(client, baselineAct, baselineArgs);
+                        baseline(client, args.baselineAction(), 
args.baselineArguments());
                         break;
                 }
             }
@@ -643,7 +689,6 @@ public class CommandHandler {
             if (isConnectionError(e))
                 return error(EXIT_CODE_CONNECTION_FAILED, "Connection to 
cluster failed.", e);
 
-
             return error(EXIT_CODE_UNEXPECTED_ERROR, "", e);
         }
     }
@@ -657,3 +702,4 @@ public class CommandHandler {
         System.exit(hnd.execute(args));
     }
 }
+

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
new file mode 100644
index 0000000..1ba8b3d
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java
@@ -0,0 +1,118 @@
+/*
+ *
+ *  * 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.internal.commandline;
+
+import junit.framework.TestCase;
+
+import static 
org.apache.ignite.internal.commandline.CommandHandler.CMD_ACTIVATE;
+import static 
org.apache.ignite.internal.commandline.CommandHandler.CMD_BASE_LINE;
+import static 
org.apache.ignite.internal.commandline.CommandHandler.CMD_DEACTIVATE;
+import static org.apache.ignite.internal.commandline.CommandHandler.CMD_STATE;
+import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_HOST;
+import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_PORT;
+
+/**
+ * Tests Command Handler parsing arguments.
+ */
+public class CommandHandlerParsingTest extends TestCase {
+    /** Commands to test. */
+    private static final String[] Commands = new String[] {CMD_STATE, 
CMD_ACTIVATE, CMD_DEACTIVATE, CMD_BASE_LINE};
+
+    /**
+     * Test parsing and validation for user and password arguments
+     */
+    public void testParseAndValidateUserAndPassword() {
+        CommandHandler hnd = new CommandHandler();
+
+        for (String cmd : Commands) {
+            try {
+                hnd.parseAndValidate("--user");
+
+                fail("expected exception: Expected user name");
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                hnd.parseAndValidate("--password");
+
+                fail("expected exception: Expected password");
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                hnd.parseAndValidate("--user", "testUser", cmd);
+
+                fail("expected exception: Both user and password should be 
specified");
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                hnd.parseAndValidate("--password", "testPass", cmd);
+
+                fail("expected exception: Both user and password should be 
specified");
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+
+            Arguments args = hnd.parseAndValidate("--user", "testUser", 
"--password", "testPass", cmd);
+
+            assertEquals("testUser", args.user());
+            assertEquals("testPass", args.password());
+            assertEquals(cmd, args.command());
+        }
+    }
+
+    /**
+     * tests host and port arguments
+     */
+    public void testHostAndPort() {
+        CommandHandler hnd = new CommandHandler();
+
+        for (String cmd : Commands) {
+            Arguments args = hnd.parseAndValidate(cmd);
+
+            assertEquals(cmd, args.command());
+            assertEquals(DFLT_HOST, args.host());
+            assertEquals(DFLT_PORT, args.port());
+
+            args = hnd.parseAndValidate("--port", "12345", "--host", 
"test-host", cmd);
+
+            assertEquals(cmd, args.command());
+            assertEquals("test-host", args.host());
+            assertEquals("12345", args.port());
+
+            try {
+                hnd.parseAndValidate("--port", "wrong-port", cmd);
+
+                fail("expected exception: Invalid value for port:");
+            }
+            catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
index e524d04..e3be1e3 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java
@@ -19,6 +19,7 @@ package org.apache.ignite.testsuites;
 
 import java.util.Set;
 import junit.framework.TestSuite;
+import org.apache.ignite.internal.commandline.CommandHandlerParsingTest;
 import org.apache.ignite.internal.pagemem.impl.PageIdUtilsSelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheUtilsSelfTest;
 import org.apache.ignite.internal.util.GridArraysSelfTest;
@@ -113,6 +114,7 @@ public class IgniteUtilSelfTestSuite extends TestSuite {
         suite.addTestSuite(PageIdUtilsSelfTest.class);
 
         // control.sh
+        suite.addTestSuite(CommandHandlerParsingTest.class);
         suite.addTestSuite(GridCommandHandlerTest.class);
 
         return suite;

http://git-wip-us.apache.org/repos/asf/ignite/blob/f53c48aa/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java 
b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index b119bfa..a4e9ac1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -96,12 +96,21 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--activate"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--activate"));
 
         assertTrue(ignite.active());
     }
 
     /**
+     * @param cmd CommandHandler
+     * @param args arguments
+     * @return result of execution
+     */
+    protected int execute(CommandHandler cmd, String... args) {
+        return cmd.execute(args);
+    }
+
+    /**
      * Test deactivation works via control.sh
      *
      * @throws Exception If failed.
@@ -117,7 +126,7 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--deactivate"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--deactivate"));
 
         assertFalse(ignite.active());
     }
@@ -134,11 +143,11 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--state"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--state"));
 
         ignite.active(true);
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--state"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--state"));
     }
 
     /**
@@ -155,7 +164,7 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        cmd.execute("--baseline");
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
 
         assertEquals(1, ignite.cluster().currentBaselineTopology().size());
     }
@@ -195,8 +204,8 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         Ignite other = startGrid(2);
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline", "add", 
consistentIds(other)));
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline", "add", 
consistentIds(other)));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "add", 
consistentIds(other)));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "add", 
consistentIds(other)));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
     }
@@ -220,8 +229,8 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline"));
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline", "remove", 
offlineNodeConsId));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "remove", 
offlineNodeConsId));
 
         assertEquals(1, ignite.cluster().currentBaselineTopology().size());
     }
@@ -242,11 +251,11 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         CommandHandler cmd = new CommandHandler();
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline", "set", 
consistentIds(ignite, other)));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "set", 
consistentIds(ignite, other)));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
 
-        assertEquals(EXIT_CODE_UNEXPECTED_ERROR, cmd.execute("--baseline", 
"set", "invalidConsistentId"));
+        assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(cmd, "--baseline", 
"set", "invalidConsistentId"));
     }
 
     /**
@@ -265,9 +274,9 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
         startGrid(2);
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline"));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline"));
 
-        assertEquals(EXIT_CODE_OK, cmd.execute("--baseline", "version", 
String.valueOf(ignite.cluster().topologyVersion())));
+        assertEquals(EXIT_CODE_OK, execute(cmd, "--baseline", "version", 
String.valueOf(ignite.cluster().topologyVersion())));
 
         assertEquals(2, ignite.cluster().currentBaselineTopology().size());
     }

Reply via email to