You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/07/31 04:28:25 UTC

[12/41] incubator-ignite git commit: IGNITE-843: WIP Generate cache type metadata configs + typeahead for java types + minor fixes.

IGNITE-843: WIP Generate cache type metadata configs + typeahead for java types + minor fixes.


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

Branch: refs/heads/ignite-1121
Commit: 8af110a8f5bd58fc069cfdac1eb4daa59e28c032
Parents: ee6fa09
Author: AKuznetsov <ak...@gridgain.com>
Authored: Mon Jul 27 18:17:06 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Mon Jul 27 18:17:06 2015 +0700

----------------------------------------------------------------------
 .../main/js/controllers/caches-controller.js    |   1 +
 .../src/main/js/controllers/common-module.js    |   5 +-
 .../main/js/controllers/metadata-controller.js  |  63 +++++-----
 .../main/js/controllers/models/metadata.json    |   4 +-
 modules/web-control-center/src/main/js/db.js    |  20 +++-
 .../web-control-center/src/main/js/package.json |   1 +
 .../src/main/js/routes/generator/common.js      |  16 +++
 .../src/main/js/routes/generator/xml.js         | 114 +++++++++++++++++--
 .../src/main/js/routes/summary.js               |   2 +-
 .../src/main/js/views/configuration/caches.jade |   2 +-
 .../main/js/views/configuration/clusters.jade   |   2 +-
 .../main/js/views/configuration/metadata.jade   |   8 +-
 .../main/js/views/configuration/summary.jade    |  27 +++--
 .../src/main/js/views/includes/controls.jade    |  44 ++++---
 .../src/main/js/views/login.jade                |   2 +-
 .../src/main/js/views/settings/admin.jade       |   2 +-
 .../src/main/js/views/settings/profile.jade     |   2 +-
 .../src/main/js/views/templates/confirm.jade    |   6 +-
 .../src/main/js/views/templates/copy.jade       |   8 +-
 19 files changed, 234 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/controllers/caches-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/controllers/caches-controller.js b/modules/web-control-center/src/main/js/controllers/caches-controller.js
index d8993c2..0cebc16 100644
--- a/modules/web-control-center/src/main/js/controllers/caches-controller.js
+++ b/modules/web-control-center/src/main/js/controllers/caches-controller.js
@@ -18,6 +18,7 @@
 controlCenterModule.controller('cachesController', ['$scope', '$http', '$common', '$confirm', '$copy', '$table', function ($scope, $http, $common, $confirm, $copy, $table) {
         $scope.joinTip = $common.joinTip;
         $scope.getModel = $common.getModel;
+        $scope.javaBuildInTypes = $common.javaBuildInTypes;
 
         $scope.tableNewItem = $table.tableNewItem;
         $scope.tableNewItemActive = $table.tableNewItemActive;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/controllers/common-module.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/controllers/common-module.js b/modules/web-control-center/src/main/js/controllers/common-module.js
index 75af155..d44b895 100644
--- a/modules/web-control-center/src/main/js/controllers/common-module.js
+++ b/modules/web-control-center/src/main/js/controllers/common-module.js
@@ -129,7 +129,10 @@ controlCenterModule.service('$common', ['$alert', function ($alert) {
                 title: msg,
                 duration: 2
             });
-        }
+        },
+        javaBuildInTypes: [
+            'Boolean', 'Byte', 'Date', 'Double', 'Float', 'Integer', 'Long', 'Short', 'String', 'Time', 'Timestamp', 'UUID'
+        ]
     }
 }]);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/controllers/metadata-controller.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/controllers/metadata-controller.js b/modules/web-control-center/src/main/js/controllers/metadata-controller.js
index 21af931..47c8687 100644
--- a/modules/web-control-center/src/main/js/controllers/metadata-controller.js
+++ b/modules/web-control-center/src/main/js/controllers/metadata-controller.js
@@ -18,6 +18,7 @@
 controlCenterModule.controller('metadataController', ['$scope', '$http', '$common', '$confirm', '$copy', '$table', function ($scope, $http, $common, $confirm, $copy, $table) {
         $scope.joinTip = $common.joinTip;
         $scope.getModel = $common.getModel;
+        $scope.javaBuildInTypes = $common.javaBuildInTypes;
 
         $scope.tableNewItem = $table.tableNewItem;
         $scope.tableNewItemActive = $table.tableNewItemActive;
@@ -127,8 +128,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: true,
                             ak: true,
-                            dbName: 'name1',
-                            dbType: 'dbType1',
+                            databaseName: 'name1',
+                            databaseType: 'dbType1',
                             javaName: 'javaName1',
                             javaType: 'javaType1'
                         },
@@ -136,8 +137,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: false,
                             ak: false,
-                            dbName: 'name2',
-                            dbType: 'dbType2',
+                            databaseName: 'name2',
+                            databaseType: 'dbType2',
                             javaName: 'javaName2',
                             javaType: 'javaType2'
                         },
@@ -145,8 +146,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name3',
-                            dbType: 'dbType3',
+                            databaseName: 'name3',
+                            databaseType: 'dbType3',
                             javaName: 'javaName3',
                             javaType: 'javaType3'
                         }
@@ -164,8 +165,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: true,
                             ak: true,
-                            dbName: 'name4',
-                            dbType: 'dbType4',
+                            databaseName: 'name4',
+                            databaseType: 'dbType4',
                             javaName: 'javaName4',
                             javaType: 'javaType4'
                         },
@@ -173,8 +174,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: false,
                             ak: false,
-                            dbName: 'name5',
-                            dbType: 'dbType5',
+                            databaseName: 'name5',
+                            databaseType: 'dbType5',
                             javaName: 'javaName5',
                             javaType: 'javaType5'
                         },
@@ -182,8 +183,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name6',
-                            dbType: 'dbType6',
+                            databaseName: 'name6',
+                            databaseType: 'dbType6',
                             javaName: 'javaName6',
                             javaType: 'javaType6'
                         }
@@ -200,8 +201,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: true,
                             ak: true,
-                            dbName: 'name7',
-                            dbType: 'dbType7',
+                            databaseName: 'name7',
+                            databaseType: 'dbType7',
                             javaName: 'javaName7',
                             javaType: 'javaType7'
                         },
@@ -209,8 +210,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: true,
                             key: false,
                             ak: false,
-                            dbName: 'name8',
-                            dbType: 'dbType8',
+                            databaseName: 'name8',
+                            databaseType: 'dbType8',
                             javaName: 'javaName8',
                             javaType: 'javaType8'
                         },
@@ -218,8 +219,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name9',
-                            dbType: 'dbType9',
+                            databaseName: 'name9',
+                            databaseType: 'dbType9',
                             javaName: 'javaName9',
                             javaType: 'javaType9'
                         },
@@ -227,8 +228,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name10',
-                            dbType: 'dbType10',
+                            databaseName: 'name10',
+                            databaseType: 'dbType10',
                             javaName: 'javaName10',
                             javaType: 'javaType10'
                         },
@@ -236,8 +237,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name11',
-                            dbType: 'dbType11',
+                            databaseName: 'name11',
+                            databaseType: 'dbType11',
                             javaName: 'javaName11',
                             javaType: 'javaType11'
                         },
@@ -245,8 +246,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                             use: false,
                             key: false,
                             ak: false,
-                            dbName: 'name12',
-                            dbType: 'dbType12',
+                            databaseName: 'name12',
+                            databaseType: 'dbType12',
                             javaName: 'javaName12',
                             javaType: 'javaType12'
                         }
@@ -467,21 +468,21 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
             return true;
         };
 
-        $scope.tableDbFieldSaveVisible = function (dbName, dbType, javaName, javaType) {
-            return $common.isNonEmpty(dbName) && $common.isDefined(dbType) &&
+        $scope.tableDbFieldSaveVisible = function (databaseName, databaseType, javaName, javaType) {
+            return $common.isNonEmpty(databaseName) && $common.isDefined(databaseType) &&
                 $common.isNonEmpty(javaName) && $common.isDefined(javaType);
         };
 
-        $scope.tableDbFieldSave = function (field, newDbName, newDbType, newJavaName, newJavaType, index) {
+        $scope.tableDbFieldSave = function (field, newDatabaseName, newDatabaseType, newJavaName, newJavaType, index) {
             var item = $scope.backupItem;
 
             var model = item[field.model];
 
-            var newItem = {dbName: newDbName, dbType: newDbType, javaName: newJavaName, javaType: newJavaType};
+            var newItem = {databaseName: newDatabaseName, databaseType: newDatabaseType, javaName: newJavaName, javaType: newJavaType};
 
             if ($common.isDefined(model)) {
                 var idx = _.findIndex(model, function (dbMeta) {
-                    return dbMeta.dbName == newDbName
+                    return dbMeta.databaseName == newDatabaseName
                 });
 
                 // Found duplicate.
@@ -500,8 +501,8 @@ controlCenterModule.controller('metadataController', ['$scope', '$http', '$commo
                 else {
                     var dbField = model[index];
 
-                    dbField.dbName = newDbName;
-                    dbField.dbType = newDbType;
+                    dbField.databaseName = newDatabaseName;
+                    dbField.databaseType = newDatabaseType;
                     dbField.javaName = newJavaName;
                     dbField.javaType = newJavaType;
                 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/controllers/models/metadata.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/controllers/models/metadata.json b/modules/web-control-center/src/main/js/controllers/models/metadata.json
index 6c9bf35..85ac5aa 100644
--- a/modules/web-control-center/src/main/js/controllers/models/metadata.json
+++ b/modules/web-control-center/src/main/js/controllers/models/metadata.json
@@ -68,7 +68,7 @@
     },
     {
       "label": "Key type",
-      "type": "text",
+      "type": "withJavaBuildInTypes",
       "model": "keyType",
       "required": true,
       "placeholder": "Full class name for Key",
@@ -189,7 +189,7 @@
     {
       "label": "Database type",
       "type": "dropdown",
-      "model": "dbType",
+      "model": "rdbms",
       "placeholder": "Choose database",
       "items": "databases",
       "tip": [

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/db.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/db.js b/modules/web-control-center/src/main/js/db.js
index 84947e5..e6fb99b 100644
--- a/modules/web-control-center/src/main/js/db.js
+++ b/modules/web-control-center/src/main/js/db.js
@@ -23,6 +23,8 @@ var mongoose = require('mongoose'),
     ObjectId = mongoose.Schema.Types.ObjectId,
     passportLocalMongoose = require('passport-local-mongoose');
 
+var deepPopulate = require('mongoose-deep-populate');
+
 // Connect to mongoDB database.
 mongoose.connect(config.get('mongoDB:url'), {server: {poolSize: 4}});
 
@@ -70,8 +72,8 @@ var CacheTypeMetadataSchema = new Schema({
     databaseTable: String,
     keyType: String,
     valueType: String,
-    keyFields: [{dbName: String, dbType: String, javaName: String, javaType: String}],
-    valueFields: [{dbName: String, dbType: String, javaName: String, javaType: String}],
+    keyFields: [{databaseName: String, databaseType: String, javaName: String, javaType: String}],
+    valueFields: [{databaseName: String, databaseType: String, javaName: String, javaType: String}],
     queryFields: [{name: String, className: String}],
     ascendingFields: [{name: String, className: String}],
     descendingFields:  [{name: String, className: String}],
@@ -312,6 +314,14 @@ var ClusterSchema = new Schema({
     waitForSegmentOnStart: Boolean
 });
 
+ClusterSchema.plugin(deepPopulate, {
+    whitelist: [
+        'caches',
+        'caches.queryMetadata',
+        'caches.storeMetadata'
+    ]
+});
+
 // Define cluster model.
 exports.Cluster = mongoose.model('Cluster', ClusterSchema);
 
@@ -319,7 +329,7 @@ exports.Cluster = mongoose.model('Cluster', ClusterSchema);
 var PersistenceSchema = new Schema({
     space: {type: ObjectId, ref: 'Space'},
     name: String,
-    dbType: {type: String, enum: ['oracle', 'db2', 'mssql', 'postgre', 'mysql', 'h2']},
+    rdbms: {type: String, enum: ['oracle', 'db2', 'mssql', 'postgre', 'mysql', 'h2']},
     dbName: String,
     host: String,
     user: String,
@@ -334,8 +344,8 @@ var PersistenceSchema = new Schema({
             pk: Boolean,
             ak: Boolean,
             notNull: Boolean,
-            dbName: String,
-            dbType: Number,
+            databaseName: String,
+            databaseType: Number,
             javaName: String,
             javaType: String
         }]

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/package.json
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/package.json b/modules/web-control-center/src/main/js/package.json
index ed06004..fd82196 100644
--- a/modules/web-control-center/src/main/js/package.json
+++ b/modules/web-control-center/src/main/js/package.json
@@ -32,6 +32,7 @@
     "jade": "~1.9.2",
     "lodash": "3.10.0",
     "mongoose": "^4.0.2",
+    "mongoose-deep-populate": "1.1.0",
     "nconf": "^0.7.1",
     "node-sass-middleware": "^0.9.0",
     "passport": "^0.2.1",

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/routes/generator/common.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/routes/generator/common.js b/modules/web-control-center/src/main/js/routes/generator/common.js
index dcbf156..05405d3 100644
--- a/modules/web-control-center/src/main/js/routes/generator/common.js
+++ b/modules/web-control-center/src/main/js/routes/generator/common.js
@@ -174,6 +174,22 @@ exports.marshallers = {
     JdkMarshaller: new ClassDescriptor('org.apache.ignite.marshaller.jdk.JdkMarshaller', {})
 };
 
+exports.knownBuildInClasses = {
+    BigDecimal: {className: 'java.math.Boolean'},
+    Boolean: {className: 'java.lang.Boolean'},
+    Byte: {className: 'java.lang.Byte'},
+    Date: {className: 'java.sql.Date'},
+    Double: {className: 'java.lang.Double'},
+    Float: {className: 'java.lang.Float'},
+    Integer: {className: 'java.lang.Integer'},
+    Long: {className: 'java.lang.Long'},
+    Short: {className: 'java.lang.Short'},
+    String: {className: 'java.lang.String'},
+    Time: {className: 'java.sql.Time'},
+    Timestamp: {className: 'java.sql.Timestamp'},
+    UUID: {className: 'java.util.UUID'}
+};
+
 exports.knownClasses = {
     Oracle: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.OracleDialect', {}),
     DB2: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.DB2Dialect', {}),

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/routes/generator/xml.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/routes/generator/xml.js b/modules/web-control-center/src/main/js/routes/generator/xml.js
index 7c18655..8009698 100644
--- a/modules/web-control-center/src/main/js/routes/generator/xml.js
+++ b/modules/web-control-center/src/main/js/routes/generator/xml.js
@@ -337,13 +337,79 @@ function createEvictionPolicy(res, evictionPolicy, propertyName) {
     }
 }
 
+function addFields(res, meta, fieldsProperty) {
+    var fields = meta[fieldsProperty];
+
+    if (fields && fields.length > 0) {
+        res.startBlock('<property name="' + fieldsProperty + '">');
+
+        res.startBlock('<list>');
+
+        _.forEach(fields, function (field) {
+            res.startBlock('<bean class="org.apache.ignite.cache.CacheTypeFieldMetadata">');
+
+            addProperty(res, field, 'databaseName');
+
+            addProperty(res, field, 'databaseType');
+            //addPropertyAsConst(res, field, databaseType, toJdbcTypeConst);
+
+            addProperty(res, field, 'javaName');
+            addElement(res, 'property', 'name', 'javaType', 'value', knownBuildInClasses(field.javaType));
+
+            res.endBlock('</bean>');
+        });
+
+        res.endBlock('</list>');
+    }
+}
+
+function knownBuildInClasses(className) {
+    var fullClassName = generatorUtils.knownBuildInClasses[className];
+
+    if (fullClassName)
+        return fullClassName.className;
+
+    return className;
+}
+
+function addQueryFields(res, meta, fieldsProperty) {
+    var fields = meta[fieldsProperty];
+
+    if (fields && fields.length > 0) {
+        res.startBlock('<property name="' + fieldsProperty + '">');
+
+        res.startBlock('<map>');
+
+        _.forEach(fields, function (field) {
+            addElement(res, 'entry', 'key', field.name, 'value', knownBuildInClasses(field.className));
+        });
+
+        res.endBlock('</map>');
+
+        res.endBlock('</property>');
+    }
+}
+
 function generateCacheTypeMetadataConfiguration(metaCfg, res) {
     if (!res)
         res = generatorUtils.builder();
 
     res.startBlock('<bean class="org.apache.ignite.cache.CacheTypeMetadata">');
 
+    addProperty(res, metaCfg, 'databaseSchema');
+    addProperty(res, metaCfg, 'databaseTable');
+
+    addProperty(res, metaCfg, 'keyType');
+    addProperty(res, metaCfg, 'valueType');
+
+    addFields(res, metaCfg, 'keyFields');
+    addFields(res, metaCfg, 'valueFields');
+
+    addQueryFields(res, metaCfg, 'queryFields');
+    addQueryFields(res, metaCfg, 'ascendingFields');
+    addQueryFields(res, metaCfg, 'descendingFields');
 
+    addListProperty(res, metaCfg, 'textFields');
 
     res.endBlock('</bean>');
 
@@ -409,8 +475,8 @@ function generateCacheConfiguration(cacheCfg, res) {
         for (var i = 0; i < cacheCfg.indexedTypes.length; i++) {
             var pair = cacheCfg.indexedTypes[i];
 
-            res.line('<value>' + escape(pair.keyClass) + '</value>');
-            res.line('<value>' + escape(pair.valueClass) + '</value>');
+            res.line('<value>' + knownBuildInClasses(pair.keyClass) + '</value>');
+            res.line('<value>' + knownBuildInClasses(pair.valueClass) + '</value>');
         }
 
         res.endBlock('</list>');
@@ -486,10 +552,26 @@ function generateCacheConfiguration(cacheCfg, res) {
         res.startBlock('<property name="typeMetadata">');
         res.startBlock('<list>');
 
-        // TODO
+        var metas = [];
+
+        if (cacheCfg.queryMetadata && cacheCfg.queryMetadata.length > 0) {
+            _.forEach(cacheCfg.queryMetadata, function (meta) {
+                metas.push(meta);
+            });
+        }
+
+        if (cacheCfg.storeMetadata && cacheCfg.storeMetadata.length > 0) {
+            _.forEach(cacheCfg.storeMetadata, function (meta) {
+                metas.push(meta);
+            });
+        }
+
+        _.forEach(metas, function (meta) {
+            generateCacheTypeMetadataConfiguration(meta, res);
+        });
 
         res.endBlock('</list>');
-        res.endBlock('</property');
+        res.endBlock('</property>');
     }
 
     res.endBlock('</bean>');
@@ -499,14 +581,28 @@ function generateCacheConfiguration(cacheCfg, res) {
 
 exports.generateCacheConfiguration = generateCacheConfiguration;
 
-function addProperty(res, obj, propName, setterName) {
-    var val = obj[propName];
+function addElement(res, tag, attr1, val1, attr2, val2) {
+    var elem = '<' + tag;
 
-    if (generatorUtils.isDefined(val)) {
-        res.emptyLineIfNeeded();
+    if (attr1) {
+        elem += ' ' + attr1 + '="' + val1 + '"'
+    }
 
-        res.line('<property name="' + (setterName ? setterName : propName) + '" value="' + escapeAttr(val) + '"/>');
+    if (attr2) {
+        elem += ' ' + attr2 + '="' + val2 + '"'
     }
+
+    elem += '/>';
+
+    res.emptyLineIfNeeded();
+    res.line(elem);
+}
+
+function addProperty(res, obj, propName, setterName) {
+    var val = obj[propName];
+
+    if (generatorUtils.isDefined(val))
+        addElement(res, 'property', 'name', setterName ? setterName : propName, 'value', escapeAttr(val));
 }
 
 function addBeanWithProperties(res, bean, beanPropName, beanClass, props, createBeanAlthoughNoProps) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/routes/summary.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/routes/summary.js b/modules/web-control-center/src/main/js/routes/summary.js
index f766945..9f8df2a 100644
--- a/modules/web-control-center/src/main/js/routes/summary.js
+++ b/modules/web-control-center/src/main/js/routes/summary.js
@@ -30,7 +30,7 @@ router.get('/', function (req, res) {
 
 router.post('/generator', function (req, res) {
     // Get cluster.
-    db.Cluster.findById(req.body._id).populate('caches').exec(function (err, cluster) {
+    db.Cluster.findById(req.body._id).deepPopulate('caches caches.queryMetadata caches.storeMetadata').exec(function (err, cluster) {
         if (err)
             return res.status(500).send(err.message);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/configuration/caches.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/configuration/caches.jade b/modules/web-control-center/src/main/js/views/configuration/caches.jade
index ea50317..579b5aa 100644
--- a/modules/web-control-center/src/main/js/views/configuration/caches.jade
+++ b/modules/web-control-center/src/main/js/views/configuration/caches.jade
@@ -48,7 +48,7 @@ block content
                         .panel-body
                             .settings-row(ng-repeat='field in general')
                                 +form-row(['col-sm-3'], ['col-sm-3'])
-            .panel-group(bs-collapse data-allow-multiple="true")
+            .panel-group(bs-collapse data-allow-multiple='true')
                 div(bs-collapse data-start-collapsed='true')
                     .panel-title(ng-show='expanded')
                         h3

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/configuration/clusters.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/configuration/clusters.jade b/modules/web-control-center/src/main/js/views/configuration/clusters.jade
index cf429e5..882a2b9 100644
--- a/modules/web-control-center/src/main/js/views/configuration/clusters.jade
+++ b/modules/web-control-center/src/main/js/views/configuration/clusters.jade
@@ -51,7 +51,7 @@ block content
                         .panel-body
                             .settings-row(ng-repeat='field in general')
                                 +form-row
-            .panel-group(bs-collapse data-allow-multiple="true")
+            .panel-group(bs-collapse data-allow-multiple='true')
                 div(bs-collapse data-start-collapsed='true')
                     .panel-title(ng-show='expanded')
                         h3

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/configuration/metadata.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/configuration/metadata.jade b/modules/web-control-center/src/main/js/views/configuration/metadata.jade
index 9f94965..e01eaa8 100644
--- a/modules/web-control-center/src/main/js/views/configuration/metadata.jade
+++ b/modules/web-control-center/src/main/js/views/configuration/metadata.jade
@@ -41,12 +41,12 @@ block content
             button.btn.btn-default(ng-model='template' data-template='/select' data-placeholder='Choose metadata type' bs-options='item.value as item.label for item in templates' bs-select)
             i.tiplabel.fa.fa-question-circle(bs-tooltip data-title='{{joinTip(templateTip)}}' type='button')
         hr
-        .panel-group(bs-collapse ng-model='panels.activePanel' data-allow-multiple="false")
+        .panel-group(bs-collapse ng-model='panels.activePanel' data-allow-multiple='false')
             .panel.panel-default(ng-show='selectedItem || backupItem')
                 .panel-heading
                     h3
                         a(bs-collapse-toggle) Manual
-                .panel-collapse(role="tabpanel" bs-collapse-target)
+                .panel-collapse(role='tabpanel' bs-collapse-target)
                     .panel-body
                         form.form-horizontal(name='manualForm' ng-if='backupItem' novalidate)
                             .settings-row(ng-repeat='field in metadataManual')
@@ -107,9 +107,9 @@ block content
                         //                td
                         //                    +dbcheck('row.ak')
                         //                td
-                        //                    label {{row.dbName}}
+                        //                    label {{row.databaseName}}
                         //                td
-                        //                    label {{row.dbType}}
+                        //                    label {{row.databaseType}}
                         //                td
                         //                    a(ng-show='data.curFieldIdx != $index' ng-click='selectField($index)') {{row.javaName}}
                         //                    input.form-control(type='text' ng-show='data.curFieldIdx == $index' ng-model='data.curJavaName' placeholder='Field Java name')

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/configuration/summary.jade b/modules/web-control-center/src/main/js/views/configuration/summary.jade
index 8e19b7c..be1cf77 100644
--- a/modules/web-control-center/src/main/js/views/configuration/summary.jade
+++ b/modules/web-control-center/src/main/js/views/configuration/summary.jade
@@ -19,8 +19,8 @@ extends sidebar
 append scripts
     script(src='/summary-controller.js')
 
-    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-animate.min.js")
-    script(src="//cdn.jsdelivr.net/angularjs/1.3.15/angular-sanitize.min.js")
+    script(src='//cdn.jsdelivr.net/angularjs/1.3.15/angular-animate.min.js')
+    script(src='//cdn.jsdelivr.net/angularjs/1.3.15/angular-sanitize.min.js')
 
     script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/theme-chrome.js')
     script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-xml.js')
@@ -32,7 +32,7 @@ append css
 include ../includes/controls
 
 mixin hard-link(ref, txt)
-    a(style='color:#ec1c24' href=ref target="_blank") #{txt}
+    a(style='color:#ec1c24' href=ref target='_blank') #{txt}
 
 block content
     .docs-header
@@ -51,17 +51,17 @@ block content
                     tr(ng-repeat='row in clusters track by row._id')
                         td.col-sm-6(ng-class='{active: row._id == selectedItem._id}')
                             a(ng-click='selectItem(row)') {{$index + 1}}) {{row.name}}
-        div(ng-show='selectedItem' role="tab" method='post' action='summary/download')
+        div(ng-show='selectedItem' role='tab' method='post' action='summary/download')
             .padding-dflt(bs-collapse data-start-collapsed='false')
                 .panel.panel-default
                     form.panel-heading(role='tab' method='post' action='summary/download')
-                        input(type="hidden" name="_id" value="{{selectedItem._id}}")
-                        input(type="hidden" name="os" value="{{os}}")
-                        input(type="hidden" name="javaClass" value="{{javaClassServer}}")
+                        input(type='hidden' name='_id' value='{{selectedItem._id}}')
+                        input(type='hidden' name='os' value='{{os}}')
+                        input(type='hidden' name='javaClass' value='{{javaClassServer}}')
                         h3
                             a(bs-collapse-toggle) Server
                             button.btn.btn-primary.pull-right(type='submit' style='margin-top: -5px') Download
-                    .panel-collapse(role="tabpanel" bs-collapse-target)
+                    .panel-collapse(role='tabpanel' bs-collapse-target)
                         div(ng-show='selectedItem' bs-tabs style='margin-top: 0.65em')
                             div(title='<img src="/images/xml.png" width="16px" height="16px"/> XML' bs-pane)
                                 div(ui-ace='{ onLoad: aceInit, mode: "xml" }' ng-model='xmlServer')
@@ -86,19 +86,18 @@ block content
                                     .col-sm-2
                                         label(for='os') Operation System:
                                     .col-sm-4
-                                        input#os.form-control(type='text', ng-model='configServer.os' placeholder='debian:8' data-min-length="0" data-html="1" data-auto-select="true" data-animation="am-flip-x" bs-typeahead bs-options='os for os in oss')
+                                        input#os.form-control(type='text', ng-model='configServer.os' placeholder='debian:8' data-min-length='0' data-html='1' data-auto-select='true' data-animation='am-flip-x' bs-typeahead bs-options='os for os in oss')
                                 div(ui-ace='{ onLoad: aceInit, mode: "dockerfile" }' ng-model='dockerServer')
             .padding-dflt(bs-collapse data-start-collapsed='false')
                 .panel.panel-default
                     form.panel-heading(role='tab' method='post' action='summary/download')
-                        input(type="hidden" name="_id" value="{{selectedItem._id}}")
-                        input(type="hidden" name="javaClass" value="{{javaClassClient}}")
-                        input(type="hidden" name="clientNearConfiguration" value="{{backupItem}}")
-
+                        input(type='hidden' name='_id' value='{{selectedItem._id}}')
+                        input(type='hidden' name='javaClass' value='{{javaClassClient}}')
+                        input(type='hidden' name='clientNearConfiguration' value='{{backupItem}}')
                         h3
                             a(bs-collapse-toggle) Client
                             button.btn.btn-primary.pull-right(type='submit' style='margin-top: -5px') Download
-                    .panel-collapse(role="tabpanel" bs-collapse-target)
+                    .panel-collapse(role='tabpanel' bs-collapse-target)
                         div(ng-show='selectedItem')
                             .details-row(ng-repeat='field in clientFields')
                                 +form-row-custom(['col-sm-3'], ['col-sm-3'])

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/includes/controls.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/includes/controls.jade b/modules/web-control-center/src/main/js/views/includes/controls.jade
index aebe4de..340a612 100644
--- a/modules/web-control-center/src/main/js/views/includes/controls.jade
+++ b/modules/web-control-center/src/main/js/views/includes/controls.jade
@@ -52,14 +52,20 @@ mixin btn-up(show, click)
 mixin btn-down(show, click)
     i.tipField.fa.fa-arrow-down(ng-show=show ng-click=click bs-tooltip data-title='Move item down')
 
-mixin table-pair-edit(keyModel, valModel, keyPlaceholder, valPlaceholder)
+mixin table-pair-edit(keyModel, valModel, keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes)
     .col-sm-6(style='float: right')
-        input.form-control(type='text' ng-model=valModel placeholder=valPlaceholder)
+        if valueJavaBuildInTypes
+            input.form-control(type='text' ng-model=valModel placeholder=valPlaceholder bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes')
+        else
+            input.form-control(type='text' ng-model=valModel placeholder=valPlaceholder)
     label.fieldSep /
     .input-tip
-        input.form-control(type='text' ng-model=keyModel placeholder=keyPlaceholder)
+        if keyJavaBuildInTypes
+            input.form-control(type='text' ng-model=keyModel placeholder=keyPlaceholder bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes')
+        else
+            input.form-control(type='text' ng-model=keyModel placeholder=keyPlaceholder)
 
-mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder)
+mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes)
     .col-sm-6
         label.table-header #{header}:
         +tipLabel('field.tip')
@@ -75,12 +81,12 @@ mixin table-pair(header, tblMdl, keyFld, valFld, keyPlaceholder, valPlaceholder)
                             div(ng-show='tableEditing(field, $index)')
                                 label.labelField {{$index + 1}})
                                 +btn-save('tablePairSaveVisible(curKey, curValue)', 'tablePairSave(tablePairValid, backupItem, field, curKey, curValue, $index)')
-                                +table-pair-edit('curKey', 'curValue', keyPlaceholder, valPlaceholder)
+                                +table-pair-edit('curKey', 'curValue', keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes)
                 tfoot(ng-show='tableNewItemActive(field)')
                     tr
                         td.col-sm-12
                             +btn-save('tablePairSaveVisible(newKey, newValue)', 'tablePairSave(tablePairValid, backupItem, field, newKey, newValue, -1)')
-                            +table-pair-edit('newKey', 'newValue', keyPlaceholder, valPlaceholder)
+                            +table-pair-edit('newKey', 'newValue', keyPlaceholder, valPlaceholder, keyJavaBuildInTypes, valueJavaBuildInTypes)
 
 mixin details-row
     - var lblDetailClasses = ['col-sm-4', 'details-label']
@@ -149,7 +155,7 @@ mixin details-row
                 input.form-control(name='{{detail.model}}' type='text' ng-model='newValue' ng-focus='tableNewItem(detail)' placeholder='{{::detail.placeholder}}')&attributes(customValidators)
                 +ico-exclamation('{{detail.model}}', 'ipaddress', 'Invalid address, see help for format description.')
 
-mixin table-db-field-edit(dbName, dbType, javaName, javaType)
+mixin table-db-field-edit(databaseName, databaseType, javaName, javaType)
     div(style='width: 22%; float: right')
         button.form-control(ng-model=javaType bs-select data-placeholder='Java type' bs-options='item.value as item.label for item in {{javaTypes}}')
     label.fieldSep /
@@ -157,10 +163,10 @@ mixin table-db-field-edit(dbName, dbType, javaName, javaType)
         input.form-control(type='text' ng-model=javaName placeholder='Java name')
     label.fieldSep /
     div(style='width: 22%; float: right')
-        button.form-control(ng-model=dbType bs-select data-placeholder='JDBC type' bs-options='item.value as item.label for item in {{jdbcTypes}}')
+        button.form-control(ng-model=databaseType bs-select data-placeholder='JDBC type' bs-options='item.value as item.label for item in {{jdbcTypes}}')
     label.fieldSep /
     .input-tip
-        input.form-control(type='text' ng-model=dbName placeholder='DB name')
+        input.form-control(type='text' ng-model=databaseName placeholder='DB name')
 
 mixin table-group-item-edit(fieldName, className, direction)
     div(style='width: 15%; float: right')
@@ -195,6 +201,12 @@ mixin form-row-custom(lblClasses, fieldClasses)
                 +tipField('field.tip')
                 .input-tip
                     input.form-control(type='text' placeholder='{{::field.placeholder}}')&attributes(fieldCommon)
+        div(ng-switch-when='withJavaBuildInTypes' ng-hide=fieldHide)
+            label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}:
+            div(class=fieldClasses)
+                +tipField('field.tip')
+                .input-tip
+                    input.form-control(type='text' placeholder='{{::field.placeholder}}' bs-typeahead data-min-length='1' bs-options='javaType for javaType in javaBuildInTypes')&attributes(fieldCommon)
         div(ng-switch-when='password' ng-hide=fieldHide)
             label(class=lblClasses ng-class=fieldRequiredClass) {{::field.label}}:
             div(class=fieldClasses)
@@ -264,9 +276,9 @@ mixin form-row-custom(lblClasses, fieldClasses)
                                         .input-tip
                                             input.form-control(type='text' ng-model='newValue' placeholder='{{::field.placeholder}}')
         div(ng-switch-when='indexedTypes')
-            +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 'valueClass', 'Key class full name', 'Value class full name')
+            +table-pair('Index key-value type pairs', fieldMdl, 'keyClass', 'valueClass', 'Key class full name', 'Value class full name', true, false)
         div(ng-switch-when='queryFields' ng-hide=fieldHide)
-            +table-pair('{{::field.label}}', fieldMdl, 'name', 'className', 'Field name', 'Field class full name')
+            +table-pair('{{::field.label}}', fieldMdl, 'name', 'className', 'Field name', 'Field class full name', false, true)
         div(ng-switch-when='dbFields' ng-hide=fieldHide)
             .col-sm-6
                 label.table-header {{::field.label}}:
@@ -280,17 +292,17 @@ mixin form-row-custom(lblClasses, fieldClasses)
                                 tr(ng-repeat='item in #{fieldMdl}')
                                     td.col-sm-12
                                         div(ng-show='!tableEditing(field, $index)')
-                                            a.labelFormField(ng-click='curField = tableStartEdit(backupItem, field, $index); curDbName = curField.dbName; curDbType = curField.dbType; curJavaName = curField.javaName; curJavaType = curField.javaType') {{$index + 1}}) {{item.dbName}} / {{item.dbType}} / {{item.javaName}} / {{item.javaType}}
+                                            a.labelFormField(ng-click='curField = tableStartEdit(backupItem, field, $index); curDatabaseName = curField.databaseName; curDatabaseType = curField.databaseType; curJavaName = curField.javaName; curJavaType = curField.javaType') {{$index + 1}}) {{item.databaseName}} / {{item.databaseType}} / {{item.javaName}} / {{item.javaType}}
                                             +btn-remove('tableRemove(backupItem, field, $index)', 'field.removeTip')
                                         div(ng-if='tableEditing(field, $index)')
                                             label.labelField {{$index + 1}})
-                                            +btn-save('tableDbFieldSaveVisible(curDbName, curDbType, curJavaName, curJavaType)', 'tableDbFieldSave(field, curDbName, curDbType, curJavaName, curJavaType, $index)')
-                                            +table-db-field-edit('curDbName', 'curDbType', 'curJavaName', 'curJavaType')
+                                            +btn-save('tableDbFieldSaveVisible(curDatabaseName, curDatabaseType, curJavaName, curJavaType)', 'tableDbFieldSave(field, curDatabaseName, curDatabaseType, curJavaName, curJavaType, $index)')
+                                            +table-db-field-edit('curDatabaseName', 'curDatabaseType', 'curJavaName', 'curJavaType')
                             tfoot(ng-show='tableNewItemActive(field)')
                                 tr
                                     td.col-sm-12
-                                        +btn-save('tableDbFieldSaveVisible(newDbName, newDbType, newJavaName, newJavaType)', 'tableDbFieldSave(field, newDbName, newDbType, newJavaName, newJavaType, -1)')
-                                        +table-db-field-edit('newDbName', 'newDbType', 'newJavaName', 'newJavaType')
+                                        +btn-save('tableDbFieldSaveVisible(newDatabaseName, newDatabaseType, newJavaName, newJavaType)', 'tableDbFieldSave(field, newDatabaseName, newDatabaseType, newJavaName, newJavaType, -1)')
+                                        +table-db-field-edit('newDatabaseName', 'newDatabaseType', 'newJavaName', 'newJavaType')
         div(ng-switch-when='queryGroups' ng-hide=fieldHide)
             .col-sm-6
                 label.table-header {{::field.label}}:

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/login.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/login.jade b/modules/web-control-center/src/main/js/views/login.jade
index 5bb39dd..7cce3f6 100644
--- a/modules/web-control-center/src/main/js/views/login.jade
+++ b/modules/web-control-center/src/main/js/views/login.jade
@@ -49,7 +49,7 @@ mixin lbl(txt)
 
             .modal-footer
                 a.show-signup.ng-hide(ng-show='action != "login"', ng-click='action = "login";') log in
-                a.show-signup(ng-show="action != 'register'", ng-click='action = "register";') sign up
+                a.show-signup(ng-show='action != "register"', ng-click='action = "register"') sign up
                 | &nbsp;or&nbsp;
                 button.btn.btn-primary(ng-show='action == "login"' ng-click='auth(action, user_info)') Log In
                 button.btn.btn-primary(ng-show='action == "register"' ng-disabled='loginForm.$invalid || user_info.password != user_info.confirm' ng-click='auth(action, user_info)') Sign Up

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/settings/admin.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/settings/admin.jade b/modules/web-control-center/src/main/js/views/settings/admin.jade
index 4d50631..8345bb9 100644
--- a/modules/web-control-center/src/main/js/views/settings/admin.jade
+++ b/modules/web-control-center/src/main/js/views/settings/admin.jade
@@ -53,6 +53,6 @@ block container
                                     i.fa.fa-eye
                     tfoot
                         tr
-                            td(colspan='5' class="text-right")
+                            td.text-right(colspan='5')
                                 div(st-pagination st-items-by-page='15' st-displayed-pages='5')
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/settings/profile.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/settings/profile.jade b/modules/web-control-center/src/main/js/views/settings/profile.jade
index dbc6dea..96f06c5 100644
--- a/modules/web-control-center/src/main/js/views/settings/profile.jade
+++ b/modules/web-control-center/src/main/js/views/settings/profile.jade
@@ -42,7 +42,7 @@ block container
                         .details-row
                             .checkbox
                                 label
-                                    input(type="checkbox" ng-model='profileUser.changePassword')
+                                    input(type='checkbox' ng-model='profileUser.changePassword')
                                     | Change password
                         div(ng-show='profileUser.changePassword')
                             .details-row

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/templates/confirm.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/templates/confirm.jade b/modules/web-control-center/src/main/js/views/templates/confirm.jade
index bdaf9bf..949318a 100644
--- a/modules/web-control-center/src/main/js/views/templates/confirm.jade
+++ b/modules/web-control-center/src/main/js/views/templates/confirm.jade
@@ -18,10 +18,10 @@
     .modal-dialog
         .modal-content
             .modal-header
-                button.close(type="button" ng-click="$hide()") &times;
+                button.close(type='button' ng-click='$hide()') &times;
                 h4.modal-title Confirmation
             .modal-body(ng-show='content')
                 p(ng-bind-html='content' style='text-align: center;')
             .modal-footer
-                button.btn.btn-default(type="button" ng-click="$hide()") Cancel
-                button.btn.btn-primary(type="button" ng-click="ok()") Confirm
\ No newline at end of file
+                button.btn.btn-default(type='button' ng-click='$hide()') Cancel
+                button.btn.btn-primary(type='button' ng-click='ok()') Confirm
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8af110a8/modules/web-control-center/src/main/js/views/templates/copy.jade
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/views/templates/copy.jade b/modules/web-control-center/src/main/js/views/templates/copy.jade
index 22cc64c..2ba9096 100644
--- a/modules/web-control-center/src/main/js/views/templates/copy.jade
+++ b/modules/web-control-center/src/main/js/views/templates/copy.jade
@@ -18,14 +18,14 @@
     .modal-dialog
         .modal-content
             .modal-header
-                button.close(type="button" ng-click="$hide()") &times;
+                button.close(type='button' ng-click='$hide()') &times;
                 h4.modal-title Copy
             form.form-horizontal(name='inputForm' novalidate)
                 .modal-body.row
                     .col-sm-9.login.col-sm-offset-1
                         label.required.labelFormField() New name:&nbsp;
                         .col-sm-9
-                            input.form-control(type="text" ng-model='newName' required)
+                            input.form-control(type='text' ng-model='newName' required)
             .modal-footer
-                button.btn.btn-default(type="button" ng-click="$hide()") Cancel
-                button.btn.btn-primary(type="button" ng-disabled='inputForm.$invalid' ng-click="ok(newName)") Confirm
\ No newline at end of file
+                button.btn.btn-default(type='button' ng-click='$hide()') Cancel
+                button.btn.btn-primary(type='button' ng-disabled='inputForm.$invalid' ng-click='ok(newName)') Confirm
\ No newline at end of file