Repository: ignite
Updated Branches:
  refs/heads/master f579a750b -> ad0cd5043


IGNITE-7725 REST: Enhanced GET_OR_CREATE_CACHE command with optional 
"templateName", "backups", "cacheGroup", "dataRegion" and 
"writeSynchronizationMode" options.


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

Branch: refs/heads/master
Commit: ad0cd50433960b7f3dddc63c898b04259fe0c074
Parents: f579a75
Author: Alexey Kuznetsov <akuznet...@apache.org>
Authored: Tue Feb 20 10:27:40 2018 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Tue Feb 20 10:27:40 2018 +0700

----------------------------------------------------------------------
 .../JettyRestProcessorAbstractSelfTest.java     | 611 ++++++++++++-------
 .../apache/ignite/internal/IgniteKernal.java    |  16 +-
 .../cache/CacheConfigurationOverride.java       | 165 +++++
 .../processors/cache/GridCacheProcessor.java    |  29 +-
 .../processors/cache/GridCacheUtils.java        |   2 +-
 .../handlers/cache/GridCacheCommandHandler.java |  46 +-
 .../rest/request/GridRestCacheRequest.java      |  40 +-
 .../http/jetty/GridJettyRestHandler.java        | 101 ++-
 8 files changed, 752 insertions(+), 258 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
index 13613ef..a33f019 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java
@@ -31,19 +31,25 @@ import java.text.DateFormat;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
 import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.FileSystemConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.igfs.IgfsIpcEndpointConfiguration;
@@ -139,7 +145,13 @@ import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.testframework.GridTestUtils;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_JETTY_PORT;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_ASYNC;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
 import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR;
+import static 
org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_PARTITIONED;
+import static 
org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_REPLICATED;
 
 /**
  * Tests for Jetty REST protocol.
@@ -229,6 +241,31 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     }
 
     /**
+     * @param cacheName Optional cache name.
+     * @param cmd REST command.
+     * @param params Command parameters.
+     * @return Returned content.
+     * @throws Exception If failed.
+     */
+    protected String content(String cacheName, GridRestCommand cmd, String... 
params) throws Exception {
+        Map<String, String> paramsMap = new LinkedHashMap<>();
+
+        if (cacheName != null)
+            paramsMap.put("cacheName", cacheName);
+
+        paramsMap.put("cmd", cmd.key());
+
+        if (params != null) {
+            assertEquals(0, params.length % 2);
+
+            for (int i = 0; i < params.length; i += 2)
+                paramsMap.put(params[i], params[i + 1]);
+        }
+
+        return content(paramsMap);
+    }
+
+    /**
      * @param content Content to check.
      */
     private void assertResponseContainsError(String content) throws 
IOException {
@@ -359,7 +396,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testGet() throws Exception {
         jcache().put("getKey", "getVal");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "getKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "getKey");
 
         info("Get command result: " + ret);
 
@@ -376,7 +413,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("mapKey1", map1);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "mapKey1"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "mapKey1");
 
         info("Get command result: " + ret);
 
@@ -390,7 +427,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("mapKey2", map2);
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "mapKey2"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, "key", 
"mapKey2");
 
         info("Get command result: " + ret);
 
@@ -407,7 +444,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("simplePersonKey", p);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "simplePersonKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "simplePersonKey");
 
         info("Get command result: " + ret);
 
@@ -434,7 +471,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("utilDateKey", utilDate);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "utilDateKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "utilDateKey");
 
         info("Get command result: " + ret);
 
@@ -444,7 +481,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("sqlDateKey", sqlDate);
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "sqlDateKey"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, "key", 
"sqlDateKey");
 
         info("Get SQL result: " + ret);
 
@@ -452,7 +489,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("timestampKey", new 
java.sql.Timestamp(utilDate.getTime()));
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "timestampKey"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, "key", 
"timestampKey");
 
         info("Get timestamp: " + ret);
 
@@ -467,7 +504,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("uuidKey", uuid);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "uuidKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "uuidKey");
 
         info("Get command result: " + ret);
 
@@ -477,7 +514,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("igniteUuidKey", igniteUuid);
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "igniteUuidKey"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, "key", 
"igniteUuidKey");
 
         info("Get command result: " + ret);
 
@@ -492,7 +529,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("tupleKey", t);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET.key(), "key", "tupleKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET, 
"key", "tupleKey");
 
         info("Get command result: " + ret);
 
@@ -510,7 +547,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().put("getKey", "getVal");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_SIZE.key()));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_SIZE);
 
         info("Size command result: " + ret);
 
@@ -521,7 +558,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testIgniteName() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.NAME.key()));
+        String ret = content(null, GridRestCommand.NAME);
 
         info("Name command result: " + ret);
 
@@ -529,20 +566,94 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     }
 
     /**
-     * @throws Exception If failed.
+     * @param cacheName Cache name to create.
+     * @param mode Expected cache mode.
+     * @param backups Expected number of backups.
+     * @param wrtSync Expected cache write synchronization mode.
+     * @param params Optional cache params.
      */
-    public void testGetOrCreateCache() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.GET_OR_CREATE_CACHE.key(), "cacheName", "testCache"));
+    private void checkGetOrCreateAndDestroy(
+        String cacheName,
+        CacheMode mode,
+        int backups,
+        CacheWriteSynchronizationMode wrtSync,
+        String cacheGroup,
+        String dataRegion,
+        String... params
+    ) throws Exception {
+        String ret = content(cacheName, GridRestCommand.GET_OR_CREATE_CACHE, 
params);
 
-        info("Name command result: " + ret);
+        info("GetOrCreateCache command result: " + ret);
+
+        IgniteCache<String, String> cache = grid(0).cache(cacheName);
+
+        cache.put("1", "1");
+
+        CacheConfiguration ccfg = 
cache.getConfiguration(CacheConfiguration.class);
+
+        assertEquals(backups, ccfg.getBackups());
+        assertEquals(mode, ccfg.getCacheMode());
+        assertEquals(wrtSync, ccfg.getWriteSynchronizationMode());
+
+        if (!F.isEmpty(cacheGroup))
+            assertEquals(cacheGroup, ccfg.getGroupName());
 
-        grid(0).cache("testCache").put("1", "1");
+        if (!F.isEmpty(dataRegion))
+            assertEquals(dataRegion, ccfg.getDataRegionName());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.DESTROY_CACHE.key(), "cacheName", "testCache"));
+        ret = content(cacheName, GridRestCommand.DESTROY_CACHE);
 
         assertTrue(jsonResponse(ret).isNull());
+        assertNull(grid(0).cache(cacheName));
+    }
 
-        assertNull(grid(0).cache("testCache"));
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGetOrCreateCache() throws Exception {
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 0, FULL_SYNC, 
null, null);
+
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 3, FULL_SYNC, 
null, null,
+            "backups", "3"
+        );
+
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 2, FULL_ASYNC, 
null, null,
+            "backups", "2",
+            "writeSynchronizationMode", FULL_ASYNC.name()
+        );
+
+        checkGetOrCreateAndDestroy("testCache", REPLICATED, Integer.MAX_VALUE, 
FULL_ASYNC, null, null,
+            "templateName", TEMPLATE_REPLICATED,
+            "writeSynchronizationMode", FULL_ASYNC.name()
+        );
+
+        checkGetOrCreateAndDestroy("testCache", REPLICATED, Integer.MAX_VALUE, 
FULL_ASYNC, null, null,
+            "templateName", TEMPLATE_REPLICATED,
+            "backups", "0",
+            "writeSynchronizationMode", FULL_ASYNC.name()
+        );
+
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 1, FULL_ASYNC, 
"testGroup", null,
+            "templateName", TEMPLATE_PARTITIONED,
+            "backups", "1",
+            "writeSynchronizationMode", FULL_ASYNC.name(),
+            "cacheGroup", "testGroup"
+        );
+
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 2, FULL_ASYNC, 
null, "testDataRegion",
+            "templateName", TEMPLATE_PARTITIONED,
+            "backups", "2",
+            "writeSynchronizationMode", FULL_ASYNC.name(),
+            "dataRegion", "testDataRegion"
+        );
+
+        checkGetOrCreateAndDestroy("testCache", PARTITIONED, 3, FULL_ASYNC, 
"testGroup", "testDataRegion",
+            "templateName", TEMPLATE_PARTITIONED,
+            "backups", "3",
+            "writeSynchronizationMode", FULL_ASYNC.name(),
+            "cacheGroup", "testGroup",
+            "dataRegion", "testDataRegion"
+        );
     }
 
     /**
@@ -553,7 +664,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         jcache().putAll(entries);
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET_ALL.key(), "k1", "getKey1", "k2", "getKey2"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_GET_ALL,
+            "k1", "getKey1",
+            "k2", "getKey2"
+        );
 
         info("Get all command result: " + ret);
 
@@ -568,7 +682,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testIncorrectPut() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_PUT.key(), "key", "key0"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT, 
"key", "key0");
 
         assertResponseContainsError(ret,
             "Failed to handle request: [req=CACHE_PUT, err=Failed to find 
mandatory parameter in request: val]");
@@ -580,7 +694,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testContainsKey() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CONTAINS_KEY.key(), "key", "key0"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_CONTAINS_KEY, "key", "key0");
 
         assertCacheOperation(ret, true);
     }
@@ -588,12 +702,14 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     /**
      * @throws Exception If failed.
      */
-    public void testContainesKeys() throws Exception {
+    public void testContainsKeys() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
         grid(0).cache(DEFAULT_CACHE_NAME).put("key1", "val1");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CONTAINS_KEYS.key(),
-            "k1", "key0", "k2", "key1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_CONTAINS_KEYS,
+            "k1", "key0",
+            "k2", "key1"
+        );
 
         assertCacheBulkOperation(ret, true);
     }
@@ -604,7 +720,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testGetAndPut() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET_AND_PUT.key(), "key", "key0", "val", "val1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_GET_AND_PUT,
+            "key", "key0",
+            "val", "val1"
+        );
 
         assertCacheOperation(ret, "val0");
 
@@ -617,8 +736,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testGetAndPutIfAbsent() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET_AND_PUT_IF_ABSENT.key(),
-            "key", "key0", "val", "val1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_GET_AND_PUT_IF_ABSENT,
+            "key", "key0",
+            "val", "val1"
+        );
 
         assertCacheOperation(ret, "val0");
 
@@ -629,8 +750,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testPutIfAbsent2() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_PUT_IF_ABSENT.key(),
-            "key", "key0", "val", "val1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_PUT_IF_ABSENT,
+            "key", "key0",
+            "val", "val1"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -643,15 +766,19 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testRemoveValue() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REMOVE_VALUE.key(),
-            "key", "key0", "val", "val1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_REMOVE_VALUE,
+            "key", "key0",
+            "val", "val1"
+        );
 
         assertCacheOperation(ret, false);
 
         assertEquals("val0", grid(0).cache(DEFAULT_CACHE_NAME).get("key0"));
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REMOVE_VALUE.key(),
-            "key", "key0", "val", "val0"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REMOVE_VALUE,
+            "key", "key0",
+            "val", "val0"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -664,8 +791,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testGetAndRemove() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET_AND_REMOVE.key(),
-            "key", "key0"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_GET_AND_REMOVE, "key", "key0");
 
         assertCacheOperation(ret, "val0");
 
@@ -678,15 +804,21 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testReplaceValue() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REPLACE_VALUE.key(),
-            "key", "key0", "val", "val1", "val2", "val2"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_REPLACE_VALUE,
+            "key", "key0",
+            "val", "val1",
+            "val2", "val2"
+        );
 
         assertCacheOperation(ret, false);
 
         assertEquals("val0", grid(0).cache(DEFAULT_CACHE_NAME).get("key0"));
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REPLACE_VALUE.key(),
-            "key", "key0", "val", "val1", "val2", "val0"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REPLACE_VALUE,
+            "key", "key0",
+            "val", "val1",
+            "val2", "val0"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -699,8 +831,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testGetAndReplace() throws Exception {
         grid(0).cache(DEFAULT_CACHE_NAME).put("key0", "val0");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_GET_AND_REPLACE.key(),
-            "key", "key0", "val", "val1"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_GET_AND_REPLACE,
+            "key", "key0",
+            "val", "val1"
+        );
 
         assertCacheOperation(ret, "val0");
 
@@ -723,8 +857,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testPut() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_PUT.key(),
-            "key", "putKey", "val", "putVal"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT,
+            "key", "putKey",
+            "val", "putVal"
+        );
 
         info("Put command result: " + ret);
 
@@ -737,8 +873,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testPutWithExpiration() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_PUT.key(),
-            "key", "putKey", "val", "putVal", "exp", "2000"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT,
+            "key", "putKey",
+            "val", "putVal",
+            "exp", "2000"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -755,8 +894,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testAdd() throws Exception {
         jcache().put("addKey1", "addVal1");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_ADD.key(),
-            "key", "addKey2", "val", "addVal2"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_ADD,
+            "key", "addKey2",
+            "val", "addVal2"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -768,8 +909,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testAddWithExpiration() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_ADD.key(),
-            "key", "addKey", "val", "addVal", "exp", "2000"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_ADD,
+            "key", "addKey",
+            "val", "addVal",
+            "exp", "2000"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -784,14 +928,12 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testPutAll() throws Exception {
-        Map<String, String> map = F.asMap("cacheName", DEFAULT_CACHE_NAME, 
"cmd", GridRestCommand.CACHE_PUT_ALL.key());
-
-        map.put("k1", "putKey1");
-        map.put("k2", "putKey2");
-        map.put("v1", "putVal1");
-        map.put("v2", "putVal2");
-
-        String ret = content(map);
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PUT_ALL,
+            "k1", "putKey1",
+            "k2", "putKey2",
+            "v1", "putVal1",
+            "v2", "putVal2"
+        );
 
         info("Put all command result: " + ret);
 
@@ -809,8 +951,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("rmvVal", jcache().localPeek("rmvKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REMOVE.key(),
-            "key", "rmvKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REMOVE, 
"key", "rmvKey");
 
         info("Remove command result: " + ret);
 
@@ -833,8 +974,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
         assertEquals("rmvVal3", jcache().localPeek("rmvKey3"));
         assertEquals("rmvVal4", jcache().localPeek("rmvKey4"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REMOVE_ALL.key(),
-            "k1", "rmvKey1", "k2", "rmvKey2"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_REMOVE_ALL,
+            "k1", "rmvKey1",
+            "k2", "rmvKey2"
+        );
 
         info("Remove all command result: " + ret);
 
@@ -845,7 +988,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertCacheBulkOperation(ret, true);
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REMOVE_ALL.key()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REMOVE_ALL);
 
         info("Remove all command result: " + ret);
 
@@ -866,8 +1009,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("casOldVal", jcache().localPeek("casKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CAS.key(),
-            "key", "casKey", "val2", "casOldVal", "val1", "casNewVal"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_CAS,
+            "key", "casKey",
+            "val2", "casOldVal",
+            "val1", "casNewVal"
+        );
 
         info("CAS command result: " + ret);
 
@@ -886,8 +1032,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("repOldVal", jcache().localPeek("repKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REPLACE.key(),
-            "key", "repKey", "val", "repVal"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REPLACE,
+            "key", "repKey",
+            "val", "repVal"
+        );
 
         info("Replace command result: " + ret);
 
@@ -904,8 +1052,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("replaceVal", jcache().get("replaceKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_REPLACE.key(),
-            "key", "replaceKey", "val", "replaceValNew", "exp", "2000"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_REPLACE,
+            "key", "replaceKey",
+            "val", "replaceValNew",
+            "exp", "2000"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -923,8 +1074,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testAppend() throws Exception {
         jcache().put("appendKey", "appendVal");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_APPEND.key(),
-            "key", "appendKey", "val", "_suffix"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_APPEND,
+            "key", "appendKey",
+            "val", "_suffix"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -937,8 +1090,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testPrepend() throws Exception {
         jcache().put("prependKey", "prependVal");
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_PREPEND.key(),
-            "key", "prependKey", "val", "prefix_"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_PREPEND,
+            "key", "prependKey",
+            "val", "prefix_"
+        );
 
         assertCacheOperation(ret, true);
 
@@ -949,15 +1104,21 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testIncrement() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.ATOMIC_INCREMENT.key(),
-            "key", "incrKey", "init", "2", "delta", "3"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.ATOMIC_INCREMENT,
+            "key", "incrKey",
+            "init", "2",
+            "delta", "3"
+        );
 
         JsonNode res = jsonResponse(ret);
 
         assertEquals(5, res.asInt());
         assertEquals(5, grid(0).atomicLong("incrKey", 0, true).get());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.ATOMIC_INCREMENT.key(), "key", "incrKey", "delta", "10"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.ATOMIC_INCREMENT,
+            "key", "incrKey",
+            "delta", "10"
+        );
 
         res = jsonResponse(ret);
 
@@ -969,16 +1130,21 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testDecrement() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.ATOMIC_DECREMENT.key(),
-            "key", "decrKey", "init", "15", "delta", "10"));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.ATOMIC_DECREMENT,
+            "key", "decrKey",
+            "init", "15",
+            "delta", "10"
+        );
 
         JsonNode res = jsonResponse(ret);
 
         assertEquals(5, res.asInt());
         assertEquals(5, grid(0).atomicLong("decrKey", 0, true).get());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.ATOMIC_DECREMENT.key(),
-            "key", "decrKey", "delta", "3"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.ATOMIC_DECREMENT,
+            "key", "decrKey",
+            "delta", "3"
+        );
 
         res = jsonResponse(ret);
 
@@ -994,8 +1160,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("casOldVal", jcache().localPeek("casKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CAS.key(),
-            "key", "casKey", "val2", "casOldVal"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_CAS,
+            "key", "casKey",
+            "val2", "casOldVal"
+        );
 
         info("CAR command result: " + ret);
 
@@ -1010,8 +1178,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
     public void testPutIfAbsent() throws Exception {
         assertNull(jcache().localPeek("casKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CAS.key(),
-            "key", "casKey", "val1", "casNewVal"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_CAS,
+            "key", "casKey",
+            "val1", "casNewVal"
+        );
 
         info("PutIfAbsent command result: " + ret);
 
@@ -1028,7 +1198,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals("casVal", jcache().localPeek("casKey"));
 
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_CAS.key(), "key", "casKey"));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_CAS, 
"key", "casKey");
 
         info("CAS Remove command result: " + ret);
 
@@ -1041,7 +1211,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testMetrics() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_METRICS.key()));
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.CACHE_METRICS);
 
         info("Cache metrics command result: " + ret);
 
@@ -1136,32 +1306,34 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
 
         Collection<GridCacheSqlMetadata> metas = 
cache.context().queries().sqlMetadata();
 
-        assertEquals(5, metas.size());
+        // TODO: IGNITE-7740 uncomment after IGNITE-7740 will be fixed.
+        // int cachesCnt = grid(0).cacheNames().size();
+        // assertEquals(cachesCnt, metas.size());
 
-        String ret = content(F.asMap("cacheName", "", "cmd", 
GridRestCommand.CACHE_METADATA.key()));
+        String ret = content("", GridRestCommand.CACHE_METADATA);
 
         info("Cache metadata: " + ret);
 
-        JsonNode arrResponse = jsonResponse(ret);
+        JsonNode arrRes = jsonResponse(ret);
 
-        assertEquals(5, arrResponse.size());
+        // TODO: IGNITE-7740 uncomment after IGNITE-7740 will be fixed.
+        // assertEquals(cachesCnt, arrRes.size());
 
-        testMetadata(metas, arrResponse);
+        testMetadata(metas, arrRes);
 
         Collection<GridCacheSqlMetadata> dfltCacheMeta = 
cache.context().queries().sqlMetadata();
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CACHE_METADATA.key()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.CACHE_METADATA);
 
         info("Cache metadata: " + ret);
 
-        arrResponse = jsonResponse(ret);
+        arrRes = jsonResponse(ret);
 
-        assertEquals(1, arrResponse.size());
+        assertEquals(1, arrRes.size());
 
-        testMetadata(dfltCacheMeta, arrResponse);
+        testMetadata(dfltCacheMeta, arrRes);
 
-        assertResponseContainsError(content(
-            F.asMap("cacheName", "nonExistingCacheName", "cmd", 
GridRestCommand.CACHE_METADATA.key())));
+        assertResponseContainsError(content("nonExistingCacheName", 
GridRestCommand.CACHE_METADATA));
     }
 
     /**
@@ -1177,36 +1349,39 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
 
         Collection<GridCacheSqlMetadata> metas = 
c.context().queries().sqlMetadata();
 
-        String ret = content(F.asMap("cacheName", "", "cmd", 
GridRestCommand.CACHE_METADATA.key()));
+        String ret = content("", GridRestCommand.CACHE_METADATA);
 
         info("Cache metadata: " + ret);
 
-        JsonNode arrResponse = jsonResponse(ret);
+        JsonNode arrRes = jsonResponse(ret);
 
-        assertEquals(6, arrResponse.size());
+        // TODO: IGNITE-7740 uncomment after IGNITE-7740 will be fixed.
+        // int cachesCnt = grid(1).cacheNames().size();
+        // assertEquals(cachesCnt, arrRes.size());
 
-        testMetadata(metas, arrResponse);
+        testMetadata(metas, arrRes);
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME,
-            "cmd", GridRestCommand.CACHE_METADATA.key(), "cacheName", 
"person"));
+        ret = content("person", GridRestCommand.CACHE_METADATA);
 
         info("Cache metadata with cacheName parameter: " + ret);
 
-        arrResponse = jsonResponse(ret);
+        arrRes = jsonResponse(ret);
 
-        assertEquals(1, arrResponse.size());
+        assertEquals(1, arrRes.size());
 
-        testMetadata(metas, arrResponse);
+        testMetadata(metas, arrRes);
 
-        assertResponseContainsError(content(
-            F.asMap("cacheName", "nonExistingCacheName", "cmd", 
GridRestCommand.CACHE_METADATA.key())));
+        assertResponseContainsError(content("nonExistingCacheName", 
GridRestCommand.CACHE_METADATA));
     }
 
     /**
      * @throws Exception If failed.
      */
     public void testTopology() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.TOPOLOGY.key(), "attr", "false", "mtr", "false"));
+        String ret = content(null, GridRestCommand.TOPOLOGY,
+            "attr", "false",
+            "mtr", "false"
+        );
 
         info("Topology command result: " + ret);
 
@@ -1229,7 +1404,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
             for (JsonNode cache : caches) {
                 String cacheName0 = cache.get("name").asText();
 
-                final String cacheName = cacheName0.equals("") ? null : 
cacheName0;
+                final String cacheName = cacheName0.isEmpty() ? null : 
cacheName0;
 
                 IgniteCacheProxy<?, ?> publicCache = F.find(publicCaches, 
null, new P1<IgniteCacheProxy<?, ?>>() {
                     @Override public boolean apply(IgniteCacheProxy<?, ?> c) {
@@ -1250,8 +1425,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testNode() throws Exception {
-        String ret = content(F.asMap("cmd", GridRestCommand.NODE.key(), 
"attr", "true", "mtr", "true", "id",
-            grid(0).localNode().id().toString()));
+        String ret = content(null, GridRestCommand.NODE,
+            "attr", "true",
+            "mtr", "true",
+            "id", grid(0).localNode().id().toString()
+        );
 
         info("Topology command result: " + ret);
 
@@ -1260,7 +1438,11 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
         assertTrue(res.get("attributes").isObject());
         assertTrue(res.get("metrics").isObject());
 
-        ret = content(F.asMap("cmd", GridRestCommand.NODE.key(), "attr", 
"false", "mtr", "false", "ip", LOC_HOST));
+        ret = content(null, GridRestCommand.NODE,
+            "attr", "false",
+            "mtr", "false",
+            "ip", LOC_HOST
+        );
 
         info("Topology command result: " + ret);
 
@@ -1269,8 +1451,12 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
         assertTrue(res.get("attributes").isNull());
         assertTrue(res.get("metrics").isNull());
 
-        ret = content(F.asMap("cmd", GridRestCommand.NODE.key(), "attr", 
"false", "mtr", "false", "ip", LOC_HOST, "id",
-            UUID.randomUUID().toString()));
+        ret = content(null, GridRestCommand.NODE,
+            "attr", "false",
+            "mtr", "false",
+            "ip", LOC_HOST,
+            "id", UUID.randomUUID().toString()
+        );
 
         info("Topology command result: " + ret);
 
@@ -1287,14 +1473,14 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testExe() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.EXE.key()));
+        String ret = content(DEFAULT_CACHE_NAME, GridRestCommand.EXE);
 
         info("Exe command result: " + ret);
 
         assertResponseContainsError(ret);
 
         // Attempt to execute unknown task (UNKNOWN_TASK) will result in 
exception on server.
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.EXE.key(), "name", "UNKNOWN_TASK"));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.EXE, "name", 
"UNKNOWN_TASK");
 
         info("Exe command result: " + ret);
 
@@ -1303,7 +1489,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
         grid(0).compute().localDeployTask(TestTask1.class, 
TestTask1.class.getClassLoader());
         grid(0).compute().localDeployTask(TestTask2.class, 
TestTask2.class.getClassLoader());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.EXE.key(), "name", TestTask1.class.getName()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.EXE, "name", 
TestTask1.class.getName());
 
         info("Exe command result: " + ret);
 
@@ -1311,7 +1497,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertTrue(res.isNull());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.EXE.key(), "name", TestTask2.class.getName()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.EXE, "name", 
TestTask2.class.getName());
 
         info("Exe command result: " + ret);
 
@@ -1319,7 +1505,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         assertEquals(TestTask2.RES, res.asText());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.RESULT.key()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.RESULT);
 
         info("Exe command result: " + ret);
 
@@ -1689,7 +1875,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testVersion() throws Exception {
-        String ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.VERSION.key()));
+        String ret = content(null, GridRestCommand.VERSION);
 
         JsonNode res = jsonResponse(ret);
 
@@ -1702,16 +1888,13 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testQueryArgs() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_QUERY.key());
-        params.put("type", "Person");
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-        params.put("arg1", "1000");
-        params.put("arg2", "2000");
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SQL_QUERY,
+            "type", "Person",
+            "pageSize", "10",
+            "qry", URLEncoder.encode(qry, CHARSET),
+            "arg1", "1000",
+            "arg2", "2000"
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1724,12 +1907,10 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testQueryScan() throws Exception {
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SCAN_QUERY.key());
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SCAN_QUERY,
+            "pageSize", "10",
+            "cacheName", "person"
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1742,13 +1923,10 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
      * @throws Exception If failed.
      */
     public void testFilterQueryScan() throws Exception {
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SCAN_QUERY.key());
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("className", ScanFilter.class.getName());
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SCAN_QUERY,
+            "pageSize", "10",
+            "className", ScanFilter.class.getName()
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1763,13 +1941,10 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testIncorrectFilterQueryScan() throws Exception {
         String clsName = ScanFilter.class.getName() + 1;
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SCAN_QUERY.key());
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("className", clsName);
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SCAN_QUERY,
+            "pageSize", "10",
+            "className", clsName
+        );
 
         assertResponseContainsError(ret, "Failed to find target class: " + 
clsName);
     }
@@ -1782,21 +1957,20 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
         grid(0).cache(DEFAULT_CACHE_NAME).put("2", "2");
         grid(0).cache(DEFAULT_CACHE_NAME).put("3", "3");
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cacheName", DEFAULT_CACHE_NAME);
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_QUERY.key());
-        params.put("type", "String");
-        params.put("pageSize", "1");
-        params.put("qry", URLEncoder.encode("select * from String", CHARSET));
-
-        String ret = content(params);
+        String ret = content(DEFAULT_CACHE_NAME, 
GridRestCommand.EXECUTE_SQL_QUERY,
+            "type", "String",
+            "pageSize", "1",
+            "qry", URLEncoder.encode("select * from String", CHARSET)
+        );
 
         JsonNode qryId = jsonResponse(ret).get("queryId");
 
         assertFalse(jsonResponse(ret).get("queryId").isNull());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.FETCH_SQL_QUERY.key(),
-            "pageSize", "1", "qryId", qryId.asText()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.FETCH_SQL_QUERY,
+            "pageSize", "1",
+            "qryId", qryId.asText()
+        );
 
         JsonNode res = jsonResponse(ret);
 
@@ -1805,8 +1979,10 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
         assertEquals(qryId0, qryId);
         assertFalse(res.get("last").asBoolean());
 
-        ret = content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.FETCH_SQL_QUERY.key(),
-            "pageSize", "1", "qryId", qryId.asText()));
+        ret = content(DEFAULT_CACHE_NAME, GridRestCommand.FETCH_SQL_QUERY,
+            "pageSize", "1",
+            "qryId", qryId.asText()
+        );
 
         res = jsonResponse(ret);
 
@@ -1826,16 +2002,13 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
             "where \"organization\".Organization.id = Person.orgId " +
             "and \"organization\".Organization.name = ?";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_QUERY.key());
-        params.put("type", "Person");
-        params.put("distributedJoins", "true");
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-        params.put("arg1", "o1");
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SQL_QUERY,
+            "type", "Person",
+            "distributedJoins", "true",
+            "pageSize", "10",
+            "qry", URLEncoder.encode(qry, CHARSET),
+            "arg1", "o1"
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1850,13 +2023,10 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testSqlFieldsQuery() throws Exception {
         String qry = "select concat(firstName, ' ', lastName) from Person";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_FIELDS_QUERY.key());
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-
-        String ret = content(params);
+        String ret = content("person", 
GridRestCommand.EXECUTE_SQL_FIELDS_QUERY,
+            "pageSize", "10",
+            "qry", URLEncoder.encode(qry, CHARSET)
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1871,14 +2041,11 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testDistributedJoinsSqlFieldsQuery() throws Exception {
         String qry = "select * from \"person\".Person p, 
\"organization\".Organization o where o.id = p.orgId";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_FIELDS_QUERY.key());
-        params.put("distributedJoins", "true");
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-
-        String ret = content(params);
+        String ret = content("person", 
GridRestCommand.EXECUTE_SQL_FIELDS_QUERY,
+            "distributedJoins", "true",
+            "pageSize", "10",
+            "qry", URLEncoder.encode(qry, CHARSET)
+        );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -1893,13 +2060,10 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testSqlFieldsMetadataQuery() throws Exception {
         String qry = "select firstName, lastName from Person";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_FIELDS_QUERY.key());
-        params.put("pageSize", "10");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-
-        String ret = content(params);
+        String ret = content("person", 
GridRestCommand.EXECUTE_SQL_FIELDS_QUERY,
+            "pageSize", "10",
+            "qry", URLEncoder.encode(qry, CHARSET)
+        );
 
         JsonNode res = jsonResponse(ret);
 
@@ -1926,16 +2090,13 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testQueryClose() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_QUERY.key());
-        params.put("type", "Person");
-        params.put("pageSize", "1");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-        params.put("arg1", "1000");
-        params.put("arg2", "2000");
-
-        String ret = content(params);
+        String ret = content("person", GridRestCommand.EXECUTE_SQL_QUERY,
+            "type", "Person",
+            "pageSize", "1",
+            "qry", URLEncoder.encode(qry, CHARSET),
+            "arg1", "1000",
+            "arg2", "2000"
+        );
 
         JsonNode res = jsonResponse(ret);
 
@@ -1947,7 +2108,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
         String qryId = res.get("queryId").asText();
 
-        content(F.asMap("cacheName", DEFAULT_CACHE_NAME, "cmd", 
GridRestCommand.CLOSE_SQL_QUERY.key(), "cacheName", "person", "qryId", qryId));
+        content("person", GridRestCommand.CLOSE_SQL_QUERY, "qryId", qryId);
 
         assertFalse(queryCursorFound());
     }
@@ -1958,19 +2119,16 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
     public void testQueryDelay() throws Exception {
         String qry = "salary > ? and salary <= ?";
 
-        Map<String, String> params = new HashMap<>();
-        params.put("cmd", GridRestCommand.EXECUTE_SQL_QUERY.key());
-        params.put("type", "Person");
-        params.put("pageSize", "1");
-        params.put("cacheName", "person");
-        params.put("qry", URLEncoder.encode(qry, CHARSET));
-        params.put("arg1", "1000");
-        params.put("arg2", "2000");
-
         String ret = null;
 
         for (int i = 0; i < 10; ++i)
-            ret = content(params);
+            ret = content("person", GridRestCommand.EXECUTE_SQL_QUERY,
+                "type", "Person",
+                "pageSize", "1",
+                "qry", URLEncoder.encode(qry, CHARSET),
+                "arg1", "1000",
+                "arg2", "2000"
+            );
 
         JsonNode items = jsonResponse(ret).get("items");
 
@@ -2003,7 +2161,7 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
 
             ConcurrentHashMap<Long, Iterator> its = 
GridTestUtils.getFieldValue(qryHnd, "qryCurs");
 
-            found |= its.size() != 0;
+            found |= !its.isEmpty();
         }
 
         return found;
@@ -2380,11 +2538,20 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
         FileSystemConfiguration igfs = new FileSystemConfiguration();
 
         igfs.setName("igfs");
-
         igfs.setIpcEndpointConfiguration(new IgfsIpcEndpointConfiguration());
 
         cfg.setFileSystemConfiguration(igfs);
 
+        DataStorageConfiguration dsCfg = new DataStorageConfiguration();
+
+        DataRegionConfiguration drCfg = new DataRegionConfiguration();
+        drCfg.setName("testDataRegion");
+        drCfg.setMaxSize(100 * 1024 * 1024);
+
+        dsCfg.setDefaultDataRegionConfiguration(drCfg);
+
+        cfg.setDataStorageConfiguration(dsCfg);
+
         return cfg;
     }
 
@@ -2395,13 +2562,13 @@ public abstract class 
JettyRestProcessorAbstractSelfTest extends AbstractRestPro
      * @throws Exception If failed.
      */
     private void assertClusterState(boolean exp) throws Exception {
-        String ret = content(F.asMap("cmd", 
GridRestCommand.CLUSTER_CURRENT_STATE.key()));
+        String ret = content("cmd", GridRestCommand.CLUSTER_CURRENT_STATE);
 
         info("Cluster state: " + ret);
         JsonNode res = jsonResponse(ret);
 
         assertEquals(exp, res.asBoolean());
-        assertEquals(exp, grid(0).active());
+        assertEquals(exp, grid(0).cluster().active());
     }
 
     /**
@@ -2411,9 +2578,9 @@ public abstract class JettyRestProcessorAbstractSelfTest 
extends AbstractRestPro
      * @throws Exception If failed.
      */
     private void changeClusterState(boolean state) throws Exception {
-        String cmd = (state ? GridRestCommand.CLUSTER_ACTIVE : 
GridRestCommand.CLUSTER_INACTIVE).key();
+        GridRestCommand cmd = state ? GridRestCommand.CLUSTER_ACTIVE : 
GridRestCommand.CLUSTER_INACTIVE;
 
-        String ret = content(F.asMap("cmd", cmd));
+        String ret = content(null, cmd);
 
         JsonNode res = jsonResponse(ret);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index d0c8364..9bfa8e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -118,6 +118,7 @@ import 
org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
 import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
 import org.apache.ignite.internal.processors.GridProcessor;
 import org.apache.ignite.internal.processors.affinity.GridAffinityProcessor;
+import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
@@ -447,14 +448,12 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
     }
 
     /** {@inheritDoc} */
-    @Override
-    public boolean isRebalanceEnabled() {
+    @Override public boolean isRebalanceEnabled() {
         return ctx.cache().context().isRebalanceEnabled();
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void rebalanceEnabled(boolean rebalanceEnabled) {
+    @Override public void rebalanceEnabled(boolean rebalanceEnabled) {
         ctx.cache().context().rebalanceEnabled(rebalanceEnabled);
     }
 
@@ -3182,10 +3181,13 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
 
     /**
      * @param cacheName Cache name.
+     * @param templateName Template name.
+     * @param cfgOverride Cache config properties to override.
      * @param checkThreadTx If {@code true} checks that current thread does 
not have active transactions.
      * @return Future that will be completed when cache is deployed.
      */
-    public IgniteInternalFuture<?> getOrCreateCacheAsync(String cacheName, 
boolean checkThreadTx) {
+    public IgniteInternalFuture<?> getOrCreateCacheAsync(String cacheName, 
String templateName,
+        CacheConfigurationOverride cfgOverride, boolean checkThreadTx) {
         CU.validateCacheName(cacheName);
 
         guard();
@@ -3194,7 +3196,7 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
             checkClusterState();
 
             if (ctx.cache().cache(cacheName) == null)
-                return ctx.cache().getOrCreateFromTemplate(cacheName, 
checkThreadTx);
+                return ctx.cache().getOrCreateFromTemplate(cacheName, 
templateName, cfgOverride, checkThreadTx);
 
             return new GridFinishedFuture<>();
         }
@@ -4029,7 +4031,7 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
     }
 
     /** {@inheritDoc} */
-    public void dumpDebugInfo() {
+    @Override public void dumpDebugInfo() {
         try {
             GridKernalContextImpl ctx = this.ctx;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConfigurationOverride.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConfigurationOverride.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConfigurationOverride.java
new file mode 100644
index 0000000..7bd6072
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheConfigurationOverride.java
@@ -0,0 +1,165 @@
+/*
+ * 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.processors.cache;
+
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ * Helper class to override cache configuration.
+ */
+public class CacheConfigurationOverride {
+    /** */
+    private CacheMode mode;
+
+    /** */
+    private Integer backups;
+
+    /** */
+    private String cacheGroup;
+
+    /** */
+    private String dataRegion;
+
+    /** */
+    private CacheWriteSynchronizationMode writeSync;
+
+    /**
+     * @return Cache mode.
+     */
+    public CacheMode mode() {
+        return mode;
+    }
+
+    /**
+     * @param mode New cache mode.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfigurationOverride mode(CacheMode mode) {
+        this.mode = mode;
+
+        return this;
+    }
+
+    /**
+     * @return Number of backup nodes for one partition.
+     */
+    public Integer backups() {
+        return backups;
+    }
+
+    /**
+     * @param backups New number of backup nodes for one partition.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfigurationOverride backups(Integer backups) {
+        this.backups = backups;
+
+        return this;
+    }
+
+    /**
+     * @return Cache group name.
+     */
+    public String cacheGroup() {
+        return cacheGroup;
+    }
+
+    /**
+     * @param grpName New cache group name.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfigurationOverride cacheGroup(String grpName) {
+        this.cacheGroup = grpName;
+
+        return this;
+    }
+
+    /**
+     * @return Data region name.
+     */
+    public String dataRegion() {
+        return dataRegion;
+    }
+
+    /**
+     * @param dataRegName Data region name.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfigurationOverride dataRegion(String dataRegName) {
+        this.dataRegion = dataRegName;
+
+        return this;
+    }
+
+    /**
+     * @return Write synchronization mode.
+     */
+    public CacheWriteSynchronizationMode writeSynchronizationMode() {
+        return writeSync;
+    }
+
+    /**
+     * @param writeSync New write synchronization mode.
+     * @return {@code this} for chaining.
+     */
+    public CacheConfigurationOverride 
writeSynchronizationMode(CacheWriteSynchronizationMode writeSync) {
+        this.writeSync = writeSync;
+
+        return this;
+    }
+
+    /**
+     * Apply overrides to specified cache configuration.
+     *
+     * @param ccfg Cache configuration to override.
+     * @return Updated cache configuration to permit fluent-style method calls.
+     */
+    public CacheConfiguration apply(CacheConfiguration ccfg) {
+        assert ccfg != null;
+
+        if (mode != null)
+            ccfg.setCacheMode(mode);
+
+        if (backups != null)
+            ccfg.setBackups(backups);
+
+        if (cacheGroup != null)
+            ccfg.setGroupName(cacheGroup);
+
+        if (dataRegion != null)
+            ccfg.setDataRegionName(dataRegion);
+
+        if (writeSync != null)
+            ccfg.setWriteSynchronizationMode(writeSync);
+
+        return ccfg;
+    }
+
+    /**
+     * @return {@code true} If nothing was set.
+     */
+    public boolean isEmpty() {
+        return mode == null &&
+            backups == null &&
+            cacheGroup == null &&
+            dataRegion == null &&
+            writeSync == null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 94a9037..8db4567 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -2574,15 +2574,36 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
      * @return Future that will be completed when cache is deployed.
      */
     public IgniteInternalFuture<?> getOrCreateFromTemplate(String cacheName, 
boolean checkThreadTx) {
+        return getOrCreateFromTemplate(cacheName, cacheName, null, 
checkThreadTx);
+    }
+
+    /**
+     * Dynamically starts cache using template configuration.
+     *
+     * @param cacheName Cache name.
+     * @param templateName Cache template name.
+     * @param cfgOverride Cache config properties to override.
+     * @param checkThreadTx If {@code true} checks that current thread does 
not have active transactions.
+     * @return Future that will be completed when cache is deployed.
+     */
+    public IgniteInternalFuture<?> getOrCreateFromTemplate(String cacheName, 
String templateName,
+        CacheConfigurationOverride cfgOverride, boolean checkThreadTx) {
         assert cacheName != null;
 
         try {
             if (publicJCache(cacheName, false, checkThreadTx) != null) // 
Cache with given name already started.
                 return new GridFinishedFuture<>();
 
-            CacheConfiguration cfg = getOrCreateConfigFromTemplate(cacheName);
+            CacheConfiguration ccfg = F.isEmpty(templateName)
+                ?  getOrCreateConfigFromTemplate(cacheName)
+                :  getOrCreateConfigFromTemplate(templateName);
+
+            ccfg.setName(cacheName);
+
+            if (cfgOverride != null)
+                cfgOverride.apply(ccfg);
 
-            return dynamicStartCache(cfg, cacheName, null, false, true, 
checkThreadTx);
+            return dynamicStartCache(ccfg, cacheName, null, false, true, 
checkThreadTx);
         }
         catch (IgniteCheckedException e) {
             return new GridFinishedFuture<>(e);
@@ -3083,6 +3104,10 @@ public class GridCacheProcessor extends 
GridProcessorAdapter {
         return fut;
     }
 
+    /**
+     * @param cacheName Cache name.
+     * @return Cache type.
+     */
     public CacheType cacheType(String cacheName ) {
         if (CU.isUtilityCache(cacheName))
             return CacheType.UTILITY;

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index 9875f64..0926a70 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -1158,7 +1158,7 @@ public class GridCacheUtils {
     public static <K, V> void inTx(IgniteInternalCache<K, V> cache, 
TransactionConcurrency concurrency,
         TransactionIsolation isolation, IgniteInClosureX<IgniteInternalCache<K 
,V>> clo) throws IgniteCheckedException {
 
-        try (GridNearTxLocal tx = cache.txStartEx(concurrency, isolation);) {
+        try (GridNearTxLocal tx = cache.txStartEx(concurrency, isolation)) {
             clo.applyx(cache);
 
             tx.commit();

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java
index 21bab22..f9f2cc3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java
@@ -39,7 +39,6 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cache.CacheMetrics;
-import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.cluster.ClusterGroup;
 import org.apache.ignite.cluster.ClusterNode;
@@ -52,6 +51,7 @@ import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteKernal;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
 import org.apache.ignite.internal.processors.cache.CacheInvokeEntry;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
@@ -78,7 +78,12 @@ import org.apache.ignite.resources.IgniteInstanceResource;
 import org.jetbrains.annotations.Nullable;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
 import static org.apache.ignite.internal.GridClosureCallMode.BALANCE;
+import static 
org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_PARTITIONED;
+import static 
org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_REPLICATED;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.ATOMIC_DECREMENT;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.ATOMIC_INCREMENT;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_ADD;
@@ -87,7 +92,6 @@ import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_C
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_CLEAR;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_CONTAINS_KEY;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_CONTAINS_KEYS;
-import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_UPDATE_TLL;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_GET;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_GET_ALL;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_GET_AND_PUT;
@@ -106,6 +110,7 @@ import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_R
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_REPLACE;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_REPLACE_VALUE;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_SIZE;
+import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_UPDATE_TLL;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.DESTROY_CACHE;
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.GET_OR_CREATE_CACHE;
 import static 
org.apache.ignite.internal.processors.task.GridTaskThreadContextKey.TC_NO_FAILOVER;
@@ -217,11 +222,9 @@ public class GridCacheCommandHandler extends 
GridRestCommandHandlerAdapter {
             throw new 
IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
 
         return ctx.closure().callLocalSafe(new Callable<Object>() {
-            @Override
-            public Object call() throws Exception {
+            @Override public Object call() throws Exception {
                 EntryProcessorResult<Boolean> res = cache.invoke(key, new 
EntryProcessor<Object, Object, Boolean>() {
-                    @Override
-                    public Boolean process(MutableEntry<Object, Object> entry,
+                    @Override public Boolean process(MutableEntry<Object, 
Object> entry,
                         Object... objects) throws EntryProcessorException {
                         try {
                             Object curVal = entry.getValue();
@@ -402,9 +405,29 @@ public class GridCacheCommandHandler extends 
GridRestCommandHandlerAdapter {
                 }
 
                 case GET_OR_CREATE_CACHE: {
+                    String templateName = req0.templateName();
+
+                    if (F.isEmpty(templateName))
+                        templateName = TEMPLATE_PARTITIONED;
+
+                    CacheConfigurationOverride cfgOverride = 
req0.configuration();
+
+                    boolean dfltPartTemplate = F.isEmpty(templateName) || 
TEMPLATE_PARTITIONED.equalsIgnoreCase(templateName);
+                    boolean dfltReplTemplate = 
TEMPLATE_REPLICATED.equalsIgnoreCase(templateName);
+
+                    if (dfltPartTemplate || dfltReplTemplate) {
+                        if (cfgOverride == null)
+                            cfgOverride = new CacheConfigurationOverride();
+
+                        cfgOverride.mode(dfltPartTemplate ? PARTITIONED : 
REPLICATED);
+
+                        if (cfgOverride.writeSynchronizationMode() == null)
+                            cfgOverride.writeSynchronizationMode(FULL_SYNC);
+                    }
+
                     // Do not check thread tx here since there can be active 
system cache txs.
-                    fut = 
((IgniteKernal)ctx.grid()).getOrCreateCacheAsync(cacheName, false).chain(
-                        new CX1<IgniteInternalFuture<?>, GridRestResponse>() {
+                    fut = 
((IgniteKernal)ctx.grid()).getOrCreateCacheAsync(cacheName, templateName, 
cfgOverride, false)
+                        .chain(new CX1<IgniteInternalFuture<?>, 
GridRestResponse>() {
                             @Override public GridRestResponse 
applyx(IgniteInternalFuture<?> f)
                                 throws IgniteCheckedException {
                                 f.get();
@@ -800,7 +823,7 @@ public class GridCacheCommandHandler extends 
GridRestCommandHandlerAdapter {
     private boolean replicatedCacheAvailable(String cacheName) {
         GridCacheAdapter<Object, Object> cache = 
ctx.cache().internalCache(cacheName);
 
-        return cache != null && cache.configuration().getCacheMode() == 
CacheMode.REPLICATED;
+        return cache != null && cache.configuration().getCacheMode() == 
REPLICATED;
     }
 
     /**
@@ -1080,7 +1103,7 @@ public class GridCacheCommandHandler extends 
GridRestCommandHandlerAdapter {
         @Override public Collection<GridCacheSqlMetadata> execute() {
             String cacheName = null;
 
-            if (!ignite.active())
+            if (!ignite.cluster().active())
                 return Collections.emptyList();
 
             IgniteInternalCache<?, ?> cache = null;
@@ -1673,8 +1696,7 @@ public class GridCacheCommandHandler extends 
GridRestCommandHandlerAdapter {
             return ctx.closure().callLocalSafe(new Callable<Object>() {
                 @Override public Object call() throws Exception {
                     EntryProcessorResult<Boolean> res = c.invoke(key, new 
EntryProcessor<Object, Object, Boolean>() {
-                        @Override
-                        public Boolean process(MutableEntry<Object, Object> 
entry,
+                        @Override public Boolean process(MutableEntry<Object, 
Object> entry,
                             Object... objects) throws EntryProcessorException {
                             GridCacheEntryEx ex = 
((CacheInvokeEntry)entry).entry();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestCacheRequest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestCacheRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestCacheRequest.java
index b932036..7e19245 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestCacheRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestCacheRequest.java
@@ -18,15 +18,19 @@
 package org.apache.ignite.internal.processors.rest.request;
 
 import java.util.Map;
+import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
 /**
- *
+ * Cache command request descriptor.
  */
 public class GridRestCacheRequest extends GridRestRequest {
     /** Cache name. */
     private String cacheName;
 
+    /** Template name. */
+    private String templateName;
+
     /** Key. */
     private Object key;
 
@@ -39,6 +43,9 @@ public class GridRestCacheRequest extends GridRestRequest {
     /** Keys and values for put all, get all, remove all operations. */
     private Map<Object, Object> vals;
 
+    /** Cache configuration parameters. */
+    private CacheConfigurationOverride cfg;
+
     /** Bit map of cache flags to be enabled on cache projection. */
     private int cacheFlags;
 
@@ -60,6 +67,20 @@ public class GridRestCacheRequest extends GridRestRequest {
     }
 
     /**
+     * @return Template name, or {@code null} if not set.
+     */
+    public String templateName() {
+        return templateName;
+    }
+
+    /**
+     * @param templateName Template name.
+     */
+    public void templateName(String templateName) {
+        this.templateName = templateName;
+    }
+
+    /**
      * @return Key.
      */
     public Object key() {
@@ -115,6 +136,21 @@ public class GridRestCacheRequest extends GridRestRequest {
         this.vals = vals;
     }
 
+
+    /**
+     * @return Cache configuration.
+     */
+    public CacheConfigurationOverride configuration() {
+        return cfg;
+    }
+
+    /**
+     * @param cfg Cache configuration.
+     */
+    public void configuration(CacheConfigurationOverride cfg) {
+        this.cfg = cfg;
+    }
+
     /**
      * @param cacheFlags Bit representation of cache flags.
      */
@@ -147,4 +183,4 @@ public class GridRestCacheRequest extends GridRestRequest {
     @Override public String toString() {
         return S.toString(GridRestCacheRequest.class, this, super.toString());
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad0cd504/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
 
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
index b7f0d45..7bad10d 100644
--- 
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
+++ 
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
@@ -17,8 +17,6 @@
 
 package org.apache.ignite.internal.processors.rest.protocols.http.jetty;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -33,13 +31,15 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
 import org.apache.ignite.internal.processors.rest.GridRestCommand;
 import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
 import org.apache.ignite.internal.processors.rest.GridRestResponse;
@@ -55,8 +55,11 @@ import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteClosure;
 import org.apache.ignite.plugin.security.SecurityCredentials;
+
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.jetbrains.annotations.Nullable;
 
 import static 
org.apache.ignite.internal.processors.rest.GridRestCommand.CACHE_CONTAINS_KEYS;
@@ -75,6 +78,24 @@ public class GridJettyRestHandler extends AbstractHandler {
     /** Used to sent request charset. */
     private static final String CHARSET = StandardCharsets.UTF_8.name();
 
+    /** */
+    private static final String  CACHE_NAME_PARAM = "cacheName";
+
+    /** */
+    private static final String BACKUPS_PARAM = "backups";
+
+    /** */
+    private static final String CACHE_GROUP_PARAM = "cacheGroup";
+
+    /** */
+    private static final String DATA_REGION_PARAM = "dataRegion";
+
+    /** */
+    private static final String WRITE_SYNCHRONIZATION_MODE_PARAM = 
"writeSynchronizationMode";
+
+    /** */
+    private static final String  TEMPLATE_NAME_PARAM = "templateName";
+
     /** Logger. */
     private final IgniteLogger log;
 
@@ -261,7 +282,7 @@ public class GridJettyRestHandler extends AbstractHandler {
 
     /** {@inheritDoc} */
     @Override public void handle(String target, Request req, 
HttpServletRequest srvReq, HttpServletResponse res)
-        throws IOException, ServletException {
+        throws IOException {
         if (log.isDebugEnabled())
             log.debug("Handling request [target=" + target + ", req=" + req + 
", srvReq=" + srvReq + ']');
 
@@ -400,11 +421,66 @@ public class GridJettyRestHandler extends AbstractHandler 
{
         GridRestRequest restReq;
 
         switch (cmd) {
-            case GET_OR_CREATE_CACHE:
+            case GET_OR_CREATE_CACHE: {
+                GridRestCacheRequest restReq0 = new GridRestCacheRequest();
+
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
+
+                String templateName = (String)params.get(TEMPLATE_NAME_PARAM);
+
+                if (!F.isEmpty(templateName))
+                    restReq0.templateName(templateName);
+
+                String backups = (String)params.get(BACKUPS_PARAM);
+
+                CacheConfigurationOverride cfg = new 
CacheConfigurationOverride();
+
+                // Set cache backups.
+                if (!F.isEmpty(backups)) {
+                    try {
+                        cfg.backups(Integer.parseInt(backups));
+                    }
+                    catch (NumberFormatException e) {
+                        throw new IgniteCheckedException("Failed to parse 
number of cache backups: " + backups, e);
+                    }
+                }
+
+                // Set cache group name.
+                String cacheGroup = (String)params.get(CACHE_GROUP_PARAM);
+
+                if (!F.isEmpty(cacheGroup))
+                    cfg.cacheGroup(cacheGroup);
+
+                // Set cache data region name.
+                String dataRegion = (String)params.get(DATA_REGION_PARAM);
+
+                if (!F.isEmpty(dataRegion))
+                    cfg.dataRegion(dataRegion);
+
+                // Set cache write mode.
+                String wrtSyncMode = 
(String)params.get(WRITE_SYNCHRONIZATION_MODE_PARAM);
+
+                if (!F.isEmpty(wrtSyncMode)) {
+                    try {
+                        
cfg.writeSynchronizationMode(CacheWriteSynchronizationMode.valueOf(wrtSyncMode));
+                    }
+                    catch (IllegalArgumentException e) {
+                        throw new IgniteCheckedException("Failed to parse 
cache write synchronization mode: " + wrtSyncMode, e);
+                    }
+                }
+
+                if (!cfg.isEmpty())
+                    restReq0.configuration(cfg);
+
+                restReq = restReq0;
+
+                break;
+            }
+
             case DESTROY_CACHE: {
                 GridRestCacheRequest restReq0 = new GridRestCacheRequest();
 
-                restReq0.cacheName((String)params.get("cacheName"));
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
 
                 restReq = restReq0;
 
@@ -450,7 +526,7 @@ public class GridJettyRestHandler extends AbstractHandler {
             case CACHE_PREPEND: {
                 GridRestCacheRequest restReq0 = new GridRestCacheRequest();
 
-                String cacheName = (String)params.get("cacheName");
+                String cacheName = (String)params.get(CACHE_NAME_PARAM);
 
                 restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);
                 restReq0.key(params.get("key"));
@@ -579,7 +655,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 if (distributedJoins != null)
                     
restReq0.distributedJoins(Boolean.parseBoolean(distributedJoins));
 
-                restReq0.cacheName((String)params.get("cacheName"));
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
 
                 if (cmd == EXECUTE_SQL_QUERY)
                     restReq0.queryType(RestQueryRequest.QueryType.SQL);
@@ -601,7 +677,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 if (pageSize != null)
                     restReq0.pageSize(Integer.parseInt(pageSize));
 
-                restReq0.cacheName((String)params.get("cacheName"));
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
 
                 restReq0.className((String)params.get("className"));
 
@@ -625,7 +701,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 if (pageSize != null)
                     restReq0.pageSize(Integer.parseInt(pageSize));
 
-                restReq0.cacheName((String)params.get("cacheName"));
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
 
                 restReq = restReq0;
 
@@ -640,7 +716,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 if (qryId != null)
                     restReq0.queryId(Long.parseLong(qryId));
 
-                restReq0.cacheName((String)params.get("cacheName"));
+                restReq0.cacheName((String)params.get(CACHE_NAME_PARAM));
 
                 restReq = restReq0;
 
@@ -757,7 +833,8 @@ public class GridJettyRestHandler extends AbstractHandler {
     @Nullable private String parameter(Object obj) {
         if (obj instanceof String)
             return (String)obj;
-        else if (obj instanceof String[] && ((String[])obj).length > 0)
+
+        if (obj instanceof String[] && ((String[])obj).length > 0)
             return ((String[])obj)[0];
 
         return null;

Reply via email to