http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientConfiguration.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientConfiguration.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientConfiguration.java
new file mode 100644
index 0000000..330fca8
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientConfiguration.java
@@ -0,0 +1,867 @@
+/*
+ * 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.client;
+
+import org.apache.ignite.internal.client.balancer.*;
+import org.apache.ignite.internal.client.marshaller.*;
+import org.apache.ignite.internal.client.marshaller.optimized.*;
+import org.apache.ignite.internal.client.ssl.*;
+import org.apache.ignite.portables.*;
+import org.apache.ignite.plugin.security.*;
+import org.apache.ignite.internal.util.typedef.*;
+import org.apache.ignite.internal.util.typedef.internal.*;
+import org.jetbrains.annotations.*;
+
+import java.net.*;
+import java.util.*;
+import java.util.concurrent.*;
+
+/**
+ * Java client configuration.
+ */
+public class GridClientConfiguration {
+    /** Default client protocol. */
+    public static final GridClientProtocol DFLT_CLIENT_PROTOCOL = 
GridClientProtocol.TCP;
+
+    /** Default topology refresh frequency is 2 sec. */
+    public static final int DFLT_TOP_REFRESH_FREQ = 2000;
+
+    /** Default maximum time connection can be idle. */
+    public static final long DFLT_MAX_CONN_IDLE_TIME = 30000;
+
+    /** Default ping interval in milliseconds. */
+    public static final long DFLT_PING_INTERVAL = 5000;
+
+    /** Default ping timeout in milliseconds. */
+    public static final long DFLT_PING_TIMEOUT = 7000;
+
+    /** Default connect timeout in milliseconds. */
+    public static final int DFLT_CONNECT_TIMEOUT = 10000;
+
+    /** Default flag setting for TCP_NODELAY option. */
+    public static final boolean DFLT_TCP_NODELAY = true;
+
+    /** List of servers to connect to. */
+    private Collection<String> srvs = Collections.emptySet();
+
+    /** List of routers to connect to. */
+    private Collection<String> routers = Collections.emptySet();
+
+    /** Client protocol. */
+    private GridClientProtocol proto = DFLT_CLIENT_PROTOCOL;
+
+    /** Socket connect timeout. */
+    private int connectTimeout = DFLT_CONNECT_TIMEOUT;
+
+    /** TCP_NODELAY flag. */
+    private boolean tcpNoDelay = DFLT_TCP_NODELAY;
+
+    /** SSL context factory  */
+    private GridSslContextFactory sslCtxFactory;
+
+    /** Flag indicating whether metrics cache is enabled. */
+    private boolean enableMetricsCache = true;
+
+    /** Flag indicating whether attributes cache is enabled. */
+    private boolean enableAttrsCache = true;
+
+    /** Flag indicating whether metrics should be automatically fetched. */
+    private boolean autoFetchMetrics = true;
+
+    /** Flag indicating whether attributes should be automatically fetched. */
+    private boolean autoFetchAttrs = true;
+
+    /** Topology refresh  frequency. */
+    private long topRefreshFreq = DFLT_TOP_REFRESH_FREQ;
+
+    /** Max time of connection idleness. */
+    private long maxConnIdleTime = DFLT_MAX_CONN_IDLE_TIME;
+
+    /** Ping interval. */
+    private long pingInterval = DFLT_PING_INTERVAL;
+
+    /** Ping timeout. */
+    private long pingTimeout = DFLT_PING_TIMEOUT;
+
+    /** Default balancer. */
+    private GridClientLoadBalancer balancer = new GridClientRandomBalancer();
+
+    /** Collection of data configurations. */
+    private Map<String, GridClientDataConfiguration> dataCfgs = 
Collections.emptyMap();
+
+    /** Credentials. */
+    private GridSecurityCredentialsProvider credProvider;
+
+    /** Executor. */
+    private ExecutorService executor;
+
+    /** Marshaller. */
+    private GridClientMarshaller marshaller = new 
GridClientOptimizedMarshaller();
+
+    /** Daemon flag. */
+    private boolean daemon;
+
+    /** Portable configuration. */
+    private PortableConfiguration portableCfg;
+
+    /**
+     * Creates default configuration.
+     */
+    public GridClientConfiguration() {
+        // No-op.
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param cfg Configuration to be copied.
+     */
+    public GridClientConfiguration(GridClientConfiguration cfg) {
+        // Preserve alphabetical order for maintenance;
+        autoFetchAttrs = cfg.isAutoFetchAttributes();
+        autoFetchMetrics = cfg.isAutoFetchMetrics();
+        balancer = cfg.getBalancer();
+        connectTimeout = cfg.getConnectTimeout();
+        credProvider = cfg.getSecurityCredentialsProvider();
+        enableAttrsCache = cfg.isEnableAttributesCache();
+        enableMetricsCache = cfg.isEnableMetricsCache();
+        executor = cfg.getExecutorService();
+        marshaller = cfg.getMarshaller();
+        maxConnIdleTime = cfg.getMaxConnectionIdleTime();
+        pingInterval = cfg.getPingInterval();
+        pingTimeout = cfg.getPingTimeout();
+        proto = cfg.getProtocol();
+        routers = cfg.getRouters();
+        srvs = cfg.getServers();
+        sslCtxFactory = cfg.getSslContextFactory();
+        tcpNoDelay = cfg.isTcpNoDelay();
+        topRefreshFreq = cfg.getTopologyRefreshFrequency();
+        daemon = cfg.isDaemon();
+        marshaller = cfg.getMarshaller();
+        portableCfg = cfg.getPortableConfiguration();
+
+        setDataConfigurations(cfg.getDataConfigurations());
+    }
+
+    /**
+     * Creates properties-based configuration based on passed in properties.
+     *
+     * @param in Client configuration in properties format.
+     * @throws GridClientException If parsing configuration failed.
+     */
+    public GridClientConfiguration(Properties in) throws GridClientException {
+        this("gg.client", in);
+    }
+
+    /**
+     * Creates properties-based configuration.
+     *
+     * @param prefix Prefix for the client properties.
+     * @param in Properties map to load configuration from.
+     * @throws GridClientException If parsing configuration failed.
+     */
+    public GridClientConfiguration(String prefix, Properties in) throws 
GridClientException {
+        load(prefix, in);
+    }
+
+    /**
+     * Collection of {@code 'host:port'} pairs representing
+     * remote grid servers used to establish initial connection to
+     * the grid. Once connection is established, GridGain will get
+     * a full view on grid topology and will be able to connect to
+     * any available remote node.
+     * <p>
+     * Note that only these addresses are used to perform
+     * topology updates in background and to detect Grid connectivity
+     * status.
+     *
+     * @return Collection of {@code 'host:port'} pairs representing remote
+     *      grid servers.
+     * @see GridClient#connected()
+     */
+    public Collection<String> getServers() {
+        return Collections.unmodifiableCollection(srvs);
+    }
+
+    /**
+     * Collection of {@code 'host:port'} pairs representing
+     * grid routers used to establish connection to the grid.
+     * <p>
+     * Addresses here could be owned by Routers as well as
+     * by individual Grid nodes. No additional connections
+     * will be made even if other Grid nodes are available.
+     * <p>
+     * This configuration mode is designated for cases when
+     * some Grid nodes are unavailable (due to security restrictions
+     * for example). So only few nodes acting as routers or
+     * dedicated router components used to access entire Grid.
+     * <p>
+     * This configuration parameter will not be used and direct
+     * connections to all grid nodes will be established if
+     * {@link #getServers()} return non-empty collection value.
+     * <p>
+     * Note that only these addresses are used to perform
+     * topology updates in background and to detect Grid connectivity
+     * status.
+     *
+     * @return Collection of {@code 'host:port'} pairs
+     *      representing routers.
+     * @see GridClient#connected()
+     */
+    public Collection<String> getRouters() {
+        return routers;
+    }
+
+    /**
+     * Sets list of servers this client should connect to.
+     *
+     * @param srvs List of servers.
+     */
+    public void setServers(Collection<String> srvs) {
+        this.srvs = srvs != null ? srvs : Collections.<String>emptySet();
+    }
+
+    /**
+     * Sets list of routers this client should connect to.
+     *
+     * @param routers List of routers.
+     */
+    public void setRouters(Collection<String> routers) {
+        this.routers = routers != null ? routers : 
Collections.<String>emptySet();
+    }
+
+    /**
+     * Gets protocol for communication between client and remote grid.
+     * Default is defined by {@link #DFLT_CLIENT_PROTOCOL} constant.
+     *
+     * @return Protocol for communication between client and remote grid.
+     */
+    public GridClientProtocol getProtocol() {
+        return proto;
+    }
+
+    /**
+     * Sets protocol type that should be used in communication. Protocol type 
cannot be changed after
+     * client is created.
+     *
+     * @param proto Protocol type.
+     * @see GridClientProtocol
+     */
+    public void setProtocol(GridClientProtocol proto) {
+        this.proto = proto;
+    }
+
+    /**
+     * Gets timeout for socket connect operation in milliseconds. If {@code 0} 
-
+     * then wait infinitely. Default is defined by {@link 
#DFLT_CONNECT_TIMEOUT} constant.
+     *
+     * @return Connect timeout in milliseconds.
+     */
+    public int getConnectTimeout() {
+        return connectTimeout;
+    }
+
+    /**
+     * Gets flag indicating whether {@code TCP_NODELAY} flag should be enabled 
for outgoing connections.
+     * This flag reduces communication latency and in the majority of cases 
should be set to true. For more
+     * information, see {@link Socket#setTcpNoDelay(boolean)}
+     * <p>
+     * If not set, default value is {@link #DFLT_TCP_NODELAY}
+     *
+     * @return If {@code TCP_NODELAY} should be set on underlying sockets.
+     */
+    public boolean isTcpNoDelay() {
+        return tcpNoDelay;
+    }
+
+    /**
+     * Sets whether {@code TCP_NODELAY} flag should be set on underlying 
socket connections.
+     *
+     * @param tcpNoDelay {@code True} if flag should be set.
+     */
+    public void setTcpNoDelay(boolean tcpNoDelay) {
+        this.tcpNoDelay = tcpNoDelay;
+    }
+
+    /**
+     * Sets timeout for socket connect operation.
+     *
+     * @param connectTimeout Connect timeout in milliseconds.
+     */
+    public void setConnectTimeout(int connectTimeout) {
+        this.connectTimeout = connectTimeout;
+    }
+
+    /**
+     * Gets a factory that should be used for SSL context creation.
+     * If it returns {@code null} then SSL is considered disabled.
+     *
+     * @return Factory instance.
+     * @see GridSslContextFactory
+     */
+    public GridSslContextFactory getSslContextFactory() {
+        return sslCtxFactory;
+    }
+
+    /**
+     * Sets SSL context factory that will be used for creation of secure 
connections.
+     *
+     * @param sslCtxFactory Context factory.
+     */
+    public void setSslContextFactory(GridSslContextFactory sslCtxFactory) {
+        this.sslCtxFactory = sslCtxFactory;
+    }
+
+    /**
+     * Default balancer to be used for computational client. It can be 
overridden
+     * for different compute instances. By default {@link 
GridClientRandomBalancer}
+     * is used.
+     *
+     * @return Default balancer to be used for computational client.
+     */
+    public GridClientLoadBalancer getBalancer() {
+        return balancer;
+    }
+
+    /**
+     * Sets default compute balancer.
+     *
+     * @param balancer Balancer to use.
+     */
+    public void setBalancer(GridClientLoadBalancer balancer) {
+        this.balancer = balancer;
+    }
+
+    /**
+     * Gets client credentials provider to authenticate with.
+     *
+     * @return Credentials provider.
+     */
+    public GridSecurityCredentialsProvider getSecurityCredentialsProvider() {
+        return credProvider;
+    }
+
+    /**
+     * Sets client credentials provider used in authentication process.
+     *
+     * @param credProvider Client credentials provider.
+     */
+    public void setSecurityCredentialsProvider(GridSecurityCredentialsProvider 
credProvider) {
+        this.credProvider = credProvider;
+    }
+
+    /**
+     * Gets a collection of data configurations specified by user.
+     *
+     * @return Collection of data configurations (possibly empty).
+     */
+    public Collection<GridClientDataConfiguration> getDataConfigurations() {
+        return dataCfgs.values();
+    }
+
+    /**
+     * Sets data configurations.
+     *
+     * @param dataCfgs Data configurations.
+     */
+    public void setDataConfigurations(Collection<? extends 
GridClientDataConfiguration> dataCfgs) {
+        this.dataCfgs = U.newHashMap(dataCfgs.size());
+
+        for (GridClientDataConfiguration dataCfg : dataCfgs)
+            this.dataCfgs.put(dataCfg.getName(), new 
GridClientDataConfiguration(dataCfg));
+    }
+
+    /**
+     * Gets data configuration for a cache with specified name.
+     *
+     * @param name Name of grid cache.
+     * @return Configuration or {@code null} if there is not configuration for 
specified name.
+     */
+    public GridClientDataConfiguration getDataConfiguration(@Nullable String 
name) {
+        return dataCfgs.get(name);
+    }
+
+    /**
+     * Sets flag indicating whether node and cache metrics should be cached by 
client.
+     *
+     * @param enableMetricsCache {@code True} if cache should be enabled.
+     */
+    public void setEnableMetricsCache(boolean enableMetricsCache) {
+        this.enableMetricsCache = enableMetricsCache;
+    }
+
+    /**
+     * Enables client to cache per-node and per-cache metrics internally. In 
memory
+     * sensitive environments, such as mobile platforms, caching metrics
+     * may be expensive and, hence, this parameter should be set to {@code 
false}.
+     * <p>
+     * Note that topology is refreshed automatically every {@link 
#getTopologyRefreshFrequency()}
+     * interval, and if {@link #isAutoFetchMetrics()} enabled then metrics 
will be updated
+     * with that frequency.
+     * <p>
+     * By default this value is {@code true} which means that metrics will be 
cached
+     * on the client side.
+     *
+     * @return {@code True} if metrics cache is enabled, {@code false} 
otherwise.
+     */
+    public boolean isEnableMetricsCache() {
+        return enableMetricsCache;
+    }
+
+    /**
+     * Sets flag indicating whether node attributes should be cached by client.
+     *
+     * @param enableAttrsCache {@code True} if cache should be enabled.
+     */
+    public void setEnableAttributesCache(boolean enableAttrsCache) {
+        this.enableAttrsCache = enableAttrsCache;
+    }
+
+    /**
+     * Enables client to cache per-node attributes internally. In memory
+     * sensitive environments, such as mobile platforms, caching node 
attributes
+     * may be expensive and, hence, this parameter should be set to {@code 
false}.
+     * <p>
+     * Note that node attributes are static and, if cached, there is no need
+     * to refresh them again. If {@link #isAutoFetchAttributes()} is enabled 
then
+     * attributes will be cached during client initialization.
+     * <p>
+     * By default this value is {@code true} which means that node attributes
+     * will be cached on the client side.
+     *
+     * @return {@code True} if attributes cache is enabled, {@code false} 
otherwise.
+     */
+    public boolean isEnableAttributesCache() {
+        return enableAttrsCache;
+    }
+
+    /**
+     * Sets flag indicating whether node metrics should be fetched by client 
automatically.
+     *
+     * @param autoFetchMetrics {@code True} if metrics should be fetched.
+     */
+    public void setAutoFetchMetrics(boolean autoFetchMetrics) {
+        this.autoFetchMetrics = autoFetchMetrics;
+    }
+
+    /**
+     * Allows client to fetch node metrics automatically with background 
topology refresh.
+     * <p>
+     * Note that this parameter will only affect auto-fetching of node metrics.
+     * Cache metrics still need to be fetched explicitly via
+     * {@link GridClientData#metrics()} or {@link 
GridClientData#metricsAsync()} methods.
+     * <p>
+     * By default this value is {@code true} which means that metrics will be 
fetched
+     * automatically.
+     *
+     * @return {@code true} if client should fetch metrics on topology refresh,
+     *      {@code false} otherwise.
+     */
+    public boolean isAutoFetchMetrics() {
+        return autoFetchMetrics;
+    }
+
+    /**
+     * Sets flag indicating whether node attributes should be fetched by 
client automatically.
+     *
+     * @param autoFetchAttrs {@code True} if attributes should be fetched.
+     */
+    public void setAutoFetchAttributes(boolean autoFetchAttrs) {
+        this.autoFetchAttrs = autoFetchAttrs;
+    }
+
+    /**
+     * Allows client to fetch node attributes automatically with background 
topology refresh.
+     * <p>
+     * By default this value is {@code true} which means that attributes will 
be fetched
+     * automatically.
+     *
+     * @return {@code True} if client should fetch attributes once on topology 
refresh,
+     *      {@code false} otherwise.
+     */
+    public boolean isAutoFetchAttributes() {
+        return autoFetchAttrs;
+    }
+
+    /**
+     * Gets topology refresh frequency. Default is defined by {@link 
#DFLT_TOP_REFRESH_FREQ}
+     * constant.
+     *
+     * @return Topology refresh frequency.
+     */
+    public long getTopologyRefreshFrequency() {
+        return topRefreshFreq;
+    }
+
+    /**
+     * Sets topology refresh frequency. If topology cache is enabled, grid 
topology
+     * will be refreshed every {@code topRefreshFreq} milliseconds.
+     *
+     * @param topRefreshFreq Topology refresh frequency in milliseconds.
+     */
+    public void setTopologyRefreshFrequency(long topRefreshFreq) {
+        this.topRefreshFreq = topRefreshFreq;
+    }
+
+    /**
+     * Gets maximum amount of time that client connection can be idle before 
it is closed.
+     * Default is defined by {@link #DFLT_MAX_CONN_IDLE_TIME} constant.
+     *
+     * @return Maximum idle time in milliseconds.
+     */
+    public long getMaxConnectionIdleTime() {
+        return maxConnIdleTime;
+    }
+
+    /**
+     * Sets maximum time in milliseconds which connection can be idle before 
it is closed by client.
+     *
+     * @param maxConnIdleTime Maximum time of connection idleness in 
milliseconds.
+     */
+    public void setMaxConnectionIdleTime(long maxConnIdleTime) {
+        this.maxConnIdleTime = maxConnIdleTime;
+    }
+
+    /**
+     * Gets time interval in milliseconds between ping requests. Default is 
defined
+     * by {@link #DFLT_PING_INTERVAL} constant.
+     * <p>
+     * Ping requests used by {@link GridClientProtocol#TCP} protocol
+     * to detect network failures and half-opened sockets.
+     *
+     * @return Ping interval.
+     */
+    public long getPingInterval() {
+        return pingInterval;
+    }
+
+    /**
+     * Sets ping interval in milliseconds.
+     *
+     * @param pingInterval Ping interval in milliseconds.
+     */
+    public void setPingInterval(long pingInterval) {
+        this.pingInterval = pingInterval;
+    }
+
+    /**
+     * Gets ping timeout. Default is defined by {@link #DFLT_PING_TIMEOUT} 
constant.
+     * <p>
+     * Ping requests used by {@link GridClientProtocol#TCP} protocol
+     * to detect network failures and half-opened sockets.
+     * If no response received in period equal to this timeout than connection
+     * considered broken and closed.
+     *
+     * @return Ping timeout.
+     */
+    public long getPingTimeout() {
+        return pingTimeout;
+    }
+
+    /**
+     * Sets ping timeout in milliseconds.
+     *
+     * @param pingTimeout Ping interval in milliseconds.
+     */
+    public void setPingTimeout(long pingTimeout) {
+        this.pingTimeout = pingTimeout;
+    }
+
+    /**
+     * Gets {@link ExecutorService} where client could run asynchronous 
operations.
+     * <p>
+     * When using {@link GridClientProtocol#TCP} this executor should be able 
to serve at least
+     * {@code Runtime.getRuntime().availableProcessors()} parallel tasks.
+     * <p>
+     * Note that this executor will be automatically shut down when client get 
closed.
+     *
+     * @return {@link ExecutorService} instance to use.
+     */
+    public ExecutorService getExecutorService() {
+        return executor;
+    }
+
+    /**
+     * Sets executor service.
+     *
+     * @param executor Executor service to use in client.
+     */
+    public void setExecutorService(ExecutorService executor) {
+        this.executor = executor;
+    }
+
+    /**
+     * Gets the marshaller, that is used to communicate between client and 
server.
+     * <p>
+     * Options, that can be used out-of-the-box:
+     * <ul>
+     *     <li>{@link GridClientOptimizedMarshaller} (default) - GridGain's 
optimized marshaller.</li>
+     *     <li>{@code GridClientPortableMarshaller} - Marshaller that supports 
portable objects.</li>
+     *     <li>{@link 
org.apache.ignite.internal.client.marshaller.jdk.GridClientJdkMarshaller} - JDK 
marshaller (not recommended).</li>
+     * </ul>
+     *
+     * @return A marshaller to use.
+     */
+    public GridClientMarshaller getMarshaller() {
+        return marshaller;
+    }
+
+    /**
+     * Sets the marshaller to use for communication.
+     *
+     * @param marshaller A marshaller to use.
+     */
+    public void setMarshaller(GridClientMarshaller marshaller) {
+        this.marshaller = marshaller;
+    }
+
+    /**
+     * Gets portable configuration.
+     *
+     * @return Portable configuration.
+     */
+    public PortableConfiguration getPortableConfiguration() {
+        return portableCfg;
+    }
+
+    /**
+     * Sets portable configuration.
+     *
+     * @param portableCfg Portable configuration.
+     */
+    public void setPortableConfiguration(@Nullable PortableConfiguration 
portableCfg) {
+        this.portableCfg = portableCfg;
+    }
+
+    /**
+     * Load client configuration from the properties map.
+     *
+     * @param prefix Prefix for the client properties.
+     * @param in Properties map to load configuration from.
+     * @throws GridClientException If parsing configuration failed.
+     */
+    public void load(String prefix, Properties in) throws GridClientException {
+        while (prefix.endsWith("."))
+            prefix = prefix.substring(0, prefix.length() - 1);
+
+        if (!prefix.isEmpty())
+            prefix += ".";
+
+        String balancer = in.getProperty(prefix + "balancer");
+        String connectTimeout = in.getProperty(prefix + "connectTimeout");
+        String cred = in.getProperty(prefix + "credentials");
+        String autoFetchMetrics = in.getProperty(prefix + "autoFetchMetrics");
+        String autoFetchAttrs = in.getProperty(prefix + "autoFetchAttributes");
+        String maxConnIdleTime = in.getProperty(prefix + "idleTimeout");
+        String proto = in.getProperty(prefix + "protocol");
+        String srvrs = in.getProperty(prefix + "servers");
+        String tcpNoDelay = in.getProperty(prefix + "tcp.noDelay");
+        String topRefreshFreq = in.getProperty(prefix + "topology.refresh");
+
+        String sslEnabled = in.getProperty(prefix + "ssl.enabled");
+
+        String sslProto = in.getProperty(prefix + "ssl.protocol", "TLS");
+        String sslKeyAlg = in.getProperty(prefix + "ssl.key.algorithm", 
"SunX509");
+
+        String keyStorePath = in.getProperty(prefix + "ssl.keystore.location");
+        String keyStorePwd = in.getProperty(prefix + "ssl.keystore.password");
+        String keyStoreType = in.getProperty(prefix + "ssl.keystore.type");
+
+        String trustStorePath = in.getProperty(prefix + 
"ssl.truststore.location");
+        String trustStorePwd = in.getProperty(prefix + 
"ssl.truststore.password");
+        String trustStoreType = in.getProperty(prefix + "ssl.truststore.type");
+
+        String dataCfgs = in.getProperty(prefix + "data.configurations");
+
+        setBalancer(resolveBalancer(balancer));
+
+        if (!F.isEmpty(connectTimeout))
+            setConnectTimeout(Integer.parseInt(connectTimeout));
+
+        if (!F.isEmpty(cred)) {
+            int idx = cred.indexOf(':');
+
+            if (idx >= 0 && idx < cred.length() - 1) {
+                setSecurityCredentialsProvider(new 
GridSecurityCredentialsBasicProvider(
+                    new GridSecurityCredentials(cred.substring(0, idx), 
cred.substring(idx + 1))));
+            }
+            else {
+                setSecurityCredentialsProvider(new 
GridSecurityCredentialsBasicProvider(
+                    new GridSecurityCredentials(null, null, cred)));
+            }
+        }
+
+        if (!F.isEmpty(autoFetchMetrics))
+            setAutoFetchMetrics(Boolean.parseBoolean(autoFetchMetrics));
+
+        if (!F.isEmpty(autoFetchAttrs))
+            setAutoFetchAttributes(Boolean.parseBoolean(autoFetchAttrs));
+
+        if (!F.isEmpty(maxConnIdleTime))
+            setMaxConnectionIdleTime(Integer.parseInt(maxConnIdleTime));
+
+        if (!F.isEmpty(proto))
+            setProtocol(GridClientProtocol.valueOf(proto));
+
+        if (!F.isEmpty(srvrs))
+            setServers(Arrays.asList(srvrs.replaceAll("\\s+", "").split(",")));
+
+        if (!F.isEmpty(tcpNoDelay))
+            setTcpNoDelay(Boolean.parseBoolean(tcpNoDelay));
+
+        if (!F.isEmpty(topRefreshFreq))
+            setTopologyRefreshFrequency(Long.parseLong(topRefreshFreq));
+
+        //
+        // SSL configuration section
+        //
+
+        if (!F.isEmpty(sslEnabled) && Boolean.parseBoolean(sslEnabled)) {
+            GridSslBasicContextFactory factory = new 
GridSslBasicContextFactory();
+
+            factory.setProtocol(F.isEmpty(sslProto) ? "TLS" : sslProto);
+            factory.setKeyAlgorithm(F.isEmpty(sslKeyAlg) ? "SunX509" : 
sslKeyAlg);
+
+            if (F.isEmpty(keyStorePath))
+                throw new IllegalArgumentException("SSL key store location is 
not specified.");
+
+            factory.setKeyStoreFilePath(keyStorePath);
+
+            if (keyStorePwd != null)
+                factory.setKeyStorePassword(keyStorePwd.toCharArray());
+
+            factory.setKeyStoreType(F.isEmpty(keyStoreType) ? "jks" : 
keyStoreType);
+
+            if (F.isEmpty(trustStorePath))
+                
factory.setTrustManagers(GridSslBasicContextFactory.getDisabledTrustManager());
+            else {
+                factory.setTrustStoreFilePath(trustStorePath);
+
+                if (trustStorePwd != null)
+                    factory.setTrustStorePassword(trustStorePwd.toCharArray());
+
+                factory.setTrustStoreType(F.isEmpty(trustStoreType) ? "jks" : 
trustStoreType);
+            }
+
+            setSslContextFactory(factory);
+        }
+
+        //
+        // Data configuration section
+        //
+
+        if (!F.isEmpty(dataCfgs)) {
+            String[] names = dataCfgs.replaceAll("\\s+", "").split(",");
+            Collection<GridClientDataConfiguration> list = new ArrayList<>();
+
+            for (String cfgName : names) {
+                if (F.isEmpty(cfgName))
+                    continue;
+
+                String name = in.getProperty(prefix + "data." + cfgName + 
".name");
+                String bal = in.getProperty(prefix + "data." + cfgName + 
".balancer");
+                String aff = in.getProperty(prefix + "data." + cfgName + 
".affinity");
+
+                GridClientDataConfiguration dataCfg = new 
GridClientDataConfiguration();
+
+                dataCfg.setName(F.isEmpty(name) ? null : name);
+                dataCfg.setBalancer(resolveBalancer(bal));
+                dataCfg.setAffinity(resolveAffinity(aff));
+
+                list.add(dataCfg);
+            }
+
+            setDataConfigurations(list);
+        }
+    }
+
+    /**
+     * Resolve load balancer from string definition.
+     *
+     * @param balancer Load balancer string definition.
+     * @return Resolved load balancer.
+     * @throws GridClientException If loading failed.
+     */
+    private static GridClientLoadBalancer resolveBalancer(String balancer) 
throws GridClientException {
+        if (F.isEmpty(balancer) || "random".equals(balancer))
+            return new GridClientRandomBalancer();
+
+        if ("roundrobin".equals(balancer))
+            return new GridClientRoundRobinBalancer();
+
+        return newInstance(GridClientLoadBalancer.class, balancer);
+    }
+
+    /**
+     * Resolve data affinity from string definition.
+     *
+     * @param affinity Data affinity string definition.
+     * @return Resolved data affinity.
+     * @throws GridClientException If loading failed.
+     */
+    private static GridClientDataAffinity resolveAffinity(String affinity) 
throws GridClientException {
+        if (F.isEmpty(affinity))
+            return null;
+
+        if ("partitioned".equals(affinity))
+            return new GridClientPartitionAffinity();
+
+        return newInstance(GridClientDataAffinity.class, affinity);
+    }
+
+    /**
+     * Constructs new instance of the specified class.
+     *
+     * @param exp Expected class for the new instance.
+     * @param clsName Class name to create new instance for.
+     * @param <T> Expected class type for the new instance.
+     * @return New instance of specified class.
+     * @throws GridClientException If loading failed.
+     */
+    private static <T> T newInstance(Class<T> exp, String clsName) throws 
GridClientException {
+        Object obj;
+
+        try {
+            obj = Class.forName(clsName).newInstance();
+        }
+        // Catch all for convenience.
+        catch (Exception e) {
+            throw new GridClientException("Failed to create class instance: " 
+ clsName, e);
+        }
+
+        return exp.cast(obj);
+    }
+
+    /**
+     * Set the daemon flag value. Communication threads will be created as 
daemons if this flag is set.
+     *
+     * @param daemon Daemon flag.
+     */
+    public void setDaemon(boolean daemon) {
+        this.daemon = daemon;
+    }
+
+    /**
+     * Get the daemon flag.
+     *
+     * @return Daemon flag.
+     */
+    public boolean isDaemon() {
+        return daemon;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientData.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientData.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientData.java
index 78b9e09..79d5c5c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientData.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientData.java
@@ -350,7 +350,7 @@ public interface GridClientData {
      * Tries to get metrics from local cache.
      * <p>
      * Local cache is updated on every {@link #metrics()} or {@link 
#metricsAsync()} call
-     * if {@link 
org.apache.ignite.client.GridClientConfiguration#isEnableMetricsCache()} is 
enabled. If it is
+     * if {@link GridClientConfiguration#isEnableMetricsCache()} is enabled. 
If it is
      * disabled then this method will always return {@code null}.
      *
      * @return Cached metrics or {@code null} if no cached metrics available.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientFactory.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientFactory.java
index 7b53573..0160159 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientFactory.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.client;
 
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.impl.*;
 
 import java.util.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientNodeMetrics.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientNodeMetrics.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientNodeMetrics.java
index 16074ac..7859ba5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientNodeMetrics.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientNodeMetrics.java
@@ -27,7 +27,7 @@ import java.io.*;
  * fetched via any of the {@code refreshNode(...)} or {@code 
refreshTopology(...)}
  * methods on {@link GridClientCompute} API.
  * <p>
- * Also note that if {@link 
org.apache.ignite.client.GridClientConfiguration#isEnableMetricsCache()} 
property
+ * Also note that if {@link GridClientConfiguration#isEnableMetricsCache()} 
property
  * is set to {@code true}, then {@link GridClientNode} will cache the last 
fetched
  * instance of node metrics.
  */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientTopologyListener.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientTopologyListener.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientTopologyListener.java
index adceba8..3d32302 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientTopologyListener.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientTopologyListener.java
@@ -22,7 +22,7 @@ package org.apache.ignite.internal.client;
  * <p>
  * Since the topology refresh is performed in background, the listeners will 
not be notified
  * immediately after the node leaves grid, but the maximum time window between 
remote grid detects
- * node leaving and client receives topology update is {@link 
org.apache.ignite.client.GridClientConfiguration#getTopologyRefreshFrequency()}.
+ * node leaving and client receives topology update is {@link 
GridClientConfiguration#getTopologyRefreshFrequency()}.
  */
 public interface GridClientTopologyListener {
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/balancer/GridClientLoadBalancer.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/balancer/GridClientLoadBalancer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/balancer/GridClientLoadBalancer.java
index 6666ad1..dd5f36b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/balancer/GridClientLoadBalancer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/balancer/GridClientLoadBalancer.java
@@ -24,7 +24,7 @@ import java.util.*;
 /**
  * Interface that defines a selection logic of a server node for a particular 
operation.
  * Use it to define custom load balancing logic for client. Load balancer is 
specified via
- * {@link org.apache.ignite.client.GridClientConfiguration#getBalancer()} 
configuration property.
+ * {@link 
org.apache.ignite.internal.client.GridClientConfiguration#getBalancer()} 
configuration property.
  * <p>
  * The following implementations are provided out of the box:
  * <ul>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/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 7120cd6..dac882a 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
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.client.impl;
 
 import org.apache.ignite.*;
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 import org.apache.ignite.internal.client.balancer.*;
 import org.apache.ignite.internal.client.impl.connection.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/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 102765e..667adb5 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
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.client.impl.connection;
 
 import org.apache.ignite.*;
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 import org.apache.ignite.internal.client.impl.*;
 import org.apache.ignite.internal.client.util.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerOsImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerOsImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerOsImpl.java
index 372b9e8..d16b235 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerOsImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerOsImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.client.impl.connection;
 
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 
 import javax.net.ssl.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
index 1880ecd..7df1121 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.client.impl.connection;
 
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 import org.apache.ignite.internal.client.impl.*;
 import org.apache.ignite.internal.client.util.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/router/GridTcpRouter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/GridTcpRouter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/GridTcpRouter.java
index 638c242..74909c7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/GridTcpRouter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/GridTcpRouter.java
@@ -43,8 +43,8 @@ import java.util.*;
  * </pre>
  * <p>
  * Note that clients should be specifically configured in order to use router.
- * Please refer to {@link 
org.apache.ignite.client.GridClientConfiguration#getServers()} and
- * {@link org.apache.ignite.client.GridClientConfiguration#getRouters()} 
documentation for more details.
+ * Please refer to {@link 
org.apache.ignite.internal.client.GridClientConfiguration#getServers()} and
+ * {@link 
org.apache.ignite.internal.client.GridClientConfiguration#getRouters()} 
documentation for more details.
  * <p>
  * Instances of this interface are managed through {@link GridRouterFactory}.
  *

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridRouterClientImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridRouterClientImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridRouterClientImpl.java
index f3b31a8..08090c9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridRouterClientImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/router/impl/GridRouterClientImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.client.router.impl;
 
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 import org.apache.ignite.internal.client.impl.*;
 import org.apache.ignite.internal.client.impl.connection.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/core/src/main/java/org/apache/ignite/jdbc/IgniteJdbcConnection.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/jdbc/IgniteJdbcConnection.java 
b/modules/core/src/main/java/org/apache/ignite/jdbc/IgniteJdbcConnection.java
index 599afa7..ffa0a41 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/jdbc/IgniteJdbcConnection.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/jdbc/IgniteJdbcConnection.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.jdbc;
 
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.client.*;
 
 import java.sql.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/94cf4f01/modules/hadoop/src/main/java/org/apache/ignite/client/hadoop/GridHadoopClientProtocolProvider.java
----------------------------------------------------------------------
diff --git 
a/modules/hadoop/src/main/java/org/apache/ignite/client/hadoop/GridHadoopClientProtocolProvider.java
 
b/modules/hadoop/src/main/java/org/apache/ignite/client/hadoop/GridHadoopClientProtocolProvider.java
index d93b694..397bff4 100644
--- 
a/modules/hadoop/src/main/java/org/apache/ignite/client/hadoop/GridHadoopClientProtocolProvider.java
+++ 
b/modules/hadoop/src/main/java/org/apache/ignite/client/hadoop/GridHadoopClientProtocolProvider.java
@@ -21,7 +21,6 @@ import org.apache.hadoop.conf.*;
 import org.apache.hadoop.mapreduce.*;
 import org.apache.hadoop.mapreduce.protocol.*;
 import org.apache.ignite.*;
-import org.apache.ignite.client.*;
 import org.apache.ignite.internal.*;
 import org.apache.ignite.internal.client.*;
 import org.apache.ignite.internal.client.marshaller.optimized.*;

Reply via email to