You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2015/09/18 09:37:58 UTC

[1/2] ignite git commit: IGNITE-843 Initial version of POJO generation.

Repository: ignite
Updated Branches:
  refs/heads/ignite-843 ee0fd4354 -> 5d2b9a7f7


IGNITE-843 Initial version of POJO generation.


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

Branch: refs/heads/ignite-843
Commit: 9824da79a0486e202f9418cf17473ef9239afa17
Parents: d43f417
Author: vsisko <vs...@gridgain.com>
Authored: Fri Sep 18 14:37:35 2015 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Sep 18 14:37:35 2015 +0700

----------------------------------------------------------------------
 .../src/main/js/routes/admin.js                 |   2 +-
 .../js/routes/generator/generator-common.js     |  11 +-
 .../main/js/routes/generator/generator-java.js  | 348 ++++++++++++++++++-
 .../src/main/js/routes/public.js                |   4 +-
 .../src/main/js/routes/summary.js               |  18 +-
 5 files changed, 367 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9824da79/modules/control-center-web/src/main/js/routes/admin.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/admin.js b/modules/control-center-web/src/main/js/routes/admin.js
index 1dc421c..d554a70 100644
--- a/modules/control-center-web/src/main/js/routes/admin.js
+++ b/modules/control-center-web/src/main/js/routes/admin.js
@@ -74,7 +74,7 @@ router.post('/remove', function (req, res) {
                 subject: 'Your account was deleted',
                 text: 'You are receiving this e-mail because admin remove your account.\n\n' +
                 '--------------\n' +
-                'Apache Ignite Web Control Center http://' + req.headers.host + '\n'
+                'Apache Ignite Web Console http://' + req.headers.host + '\n'
             };
 
             mailer.sendMail(mailOptions, function(err){

http://git-wip-us.apache.org/repos/asf/ignite/blob/9824da79/modules/control-center-web/src/main/js/routes/generator/generator-common.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-common.js b/modules/control-center-web/src/main/js/routes/generator/generator-common.js
index 72362d3..490dda3 100644
--- a/modules/control-center-web/src/main/js/routes/generator/generator-common.js
+++ b/modules/control-center-web/src/main/js/routes/generator/generator-common.js
@@ -50,7 +50,7 @@ $generatorCommon.formatDate = function (date) {
 
 // Generate comment for generated XML, Java, ... files.
 $generatorCommon.mainComment = function mainComment() {
-    return 'This configuration was generated by Ignite Web Control Center (' + $generatorCommon.formatDate(new Date()) + ')';
+    return 'This configuration was generated by Ignite Web Console (' + $generatorCommon.formatDate(new Date()) + ')';
 };
 
 // Create result holder with service functions and properties for XML and java code generation.
@@ -115,10 +115,17 @@ $generatorCommon.builder = function () {
     };
 
     res.startBlock = function (s) {
-        if (s)
+        if (s) {
+            if (this.needEmptyLine)
+                this.push('');
+
             this.append(s);
+        }
+
+        this.needEmptyLine = false;
 
         this.lineStart = true;
+
         this.deep++;
 
         return this;

http://git-wip-us.apache.org/repos/asf/ignite/blob/9824da79/modules/control-center-web/src/main/js/routes/generator/generator-java.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-java.js b/modules/control-center-web/src/main/js/routes/generator/generator-java.js
index 066f479..5c0af77 100644
--- a/modules/control-center-web/src/main/js/routes/generator/generator-java.js
+++ b/modules/control-center-web/src/main/js/routes/generator/generator-java.js
@@ -24,9 +24,35 @@ if (typeof window === 'undefined') {
     $generatorCommon = require('./generator-common');
 }
 
-// XML generation entry point.
+// Java generation entry point.
 $generatorJava = {};
 
+
+/** Java key words. */
+$generatorJava.javaKeywords = [
+    "abstract",     "assert",        "boolean",      "break",           "byte",
+    "case",         "catch",         "char",         "class",           "const",
+    "continue",     "default",       "do",           "double",          "else",
+    "enum",         "extends",       "false",        "final",           "finally",
+    "float",        "for",           "goto",         "if",              "implements",
+    "import",       "instanceof",    "int",          "interface",       "long",
+    "native",       "new",           "null",         "package",         "private",
+    "protected",    "public",        "return",       "short",           "static",
+    "strictfp",     "super",         "switch",       "synchronized",    "this",
+    "throw",        "throws",        "transient",    "true",            "try",
+    "void",         "volatile",      "while"
+];
+
+$generatorJava.javaBuildInClasses = [
+    'BigDecimal', 'Boolean', 'Byte', 'Date', 'Double', 'Float', 'Integer', 'Long', 'Short', 'String', 'Time', 'Timestamp', 'UUID'
+];
+
+$generatorJava.javaBuildInFullNameClasses = [
+    'java.math.BigDecimal', 'java.lang.Boolean', 'java.lang.Byte', 'java.sql.Date', 'java.lang.Double',
+    'java.lang.Float', 'java.lang.Integer', 'java.lang.Long', 'java.lang.Short', 'java.lang.String',
+    'java.sql.Time', 'java.sql.Timestamp', 'java.util.UUID'
+];
+
 /**
  * Translate some value to valid java code.
  *
@@ -1111,23 +1137,327 @@ $generatorJava.clusterCaches = function (caches, res) {
             res.needEmptyLine = true;
         });
 
-        res.emptyLineIfNeeded();
+        res.line('cfg.setCacheConfiguration(' + names.join(', ') + ');');
 
-        res.append('cfg.setCacheConfiguration(');
+        res.needEmptyLine = true;
+    }
 
-        for (var i = 0; i < names.length; i++) {
-            if (i > 0)
-                res.append(', ');
+    return res;
+};
 
-            res.append(names[i]);
+/**
+ * Generate java class code.
+ *
+ * @param meta Metadata object.
+ * @param key {@code true} if key class should be generated.
+ * @param pkg Package name.
+ * @param pkgFolder Folder where to save generated class.
+ * @param constructor {@code true} if empty and full constructors should be generated.
+ * @param includeKeys {@code true} if key fields should be included into value class.
+ * @throws IOException If failed to write generated code into file.
+ */
+$generatorJava.javaClassCode = function(meta, key, pkg, constructor, includeKeys) {
+    type = (key ? meta.keyType : meta.valueType);
+    type = type.substring(type.lastIndexOf('.') + 1);
+
+    var res = $generatorCommon.builder();
+
+    $generatorJava.header(res, pkg, 'java.io.*', type, type + ' implements Serializable');
+
+    res.line('/** */');
+    res.line('private static final long serialVersionUID = 0L;');
+    res.needEmptyLine = true;
+
+    fields = key ? meta.keyFields : meta.valueFields;
+
+    var field;
+
+    // Generate fields declaration.
+    for (var fldIx = 0; fldIx < fields.length; fldIx ++) {
+        field = fields[fldIx];
+
+        fldName = field.javaName;
+
+        res.line('/** Value for ' + fldName + '. */');
+
+        res.line('private ' + $generatorJava.javaTypeName(field.javaType) + ' ' + fldName + ';');
+        res.needEmptyLine = true;
+    }
+
+    // Generate constructors.
+    if (constructor) {
+        res.line('/**');
+        res.line(' * Empty constructor.');
+        res.line(' */');
+        res.startBlock('public ' + type + '() {');
+        res.line('// No-op.');
+        res.endBlock('}');
+
+        res.needEmptyLine = true;
+
+        res.line('/**');
+        res.line(' * Full constructor.');
+        res.line(' */');
+        res.startBlock('public ' + type + '(');
+
+        for (fldIx = 0; fldIx < fields.length; fldIx ++) {
+            field = fields[fldIx];
+
+            res.append($generatorJava.javaTypeName(field.javaType) + ' ' + field.javaName + (fldIx == fields.length - 1 ? '' : ', '));
         }
 
-        res.line(');');
+        res.endBlock(') {');
+        res.startBlock();
+
+        for (fldIx = 0; fldIx < fields.length; fldIx ++) {
+            field = fields[fldIx];
 
+            res.line('this.' + field.javaName +' = ' + field.javaName + ';');
+        }
+
+        res.endBlock('}');
         res.needEmptyLine = true;
     }
 
-    return res;
+    // Generate getters and setters methods.
+    for (fldIx = 0; fldIx < fields.length; fldIx ++) {
+        field = fields[fldIx];
+
+        fldName = field.javaName;
+
+        fldType = $generatorJava.javaTypeName(field.javaType);
+
+        mtdName = $generatorJava.capitalizeFirst(fldName);
+
+        res.line('/**');
+        res.line(' * Gets ' + fldName + '.');
+        res.line(' *');
+        res.line(' * @return Value for ' + fldName + '.');
+        res.line(' */');
+        res.startBlock('public ' + fldType + ' get' + mtdName + '() {');
+        res.line('return ' + fldName + ';');
+        res.endBlock('}');
+        res.needEmptyLine = true;
+
+        res.line('/**');
+        res.line(' * Sets ' + fldName + '.');
+        res.line(' *');
+        res.line(' * @param ' + fldName + ' New value for ' + fldName + '.');
+        res.line(' */');
+        res.startBlock('public void set' + mtdName + '(' + fldType + ' ' + fldName + ') {');
+        res.line('this.' + fldName + ' = ' + fldName + ';');
+        res.endBlock('}');
+        res.needEmptyLine = true;
+    }
+
+    // Generate equals() method.
+    res.line('/** {@inheritDoc} */');
+    res.startBlock('@Override public boolean equals(Object o) {');
+    res.startBlock('if (this == o)');
+    res.line('return true;');
+    res.endBlock();
+    res.append('');
+
+    res.startBlock('if (!(o instanceof ' + type + '))');
+    res.line('return false;');
+    res.endBlock();
+    res.needEmptyLine = true;
+
+    res.line(type + ' that = (' + type + ')o;');
+
+    for (fldIx = 0; fldIx < fields.length; fldIx ++) {
+        field = fields[fldIx];
+
+        res.needEmptyLine = true;
+
+        javaName = field.javaName;
+
+        res.startBlock('if (' + javaName + ' != null ? !' + javaName + '.equals(that.' + javaName + ') : that.' + javaName + ' != null)');
+
+        res.line('return false;');
+        res.endBlock()
+    }
+
+    res.needEmptyLine = true;
+
+    res.line('return true;');
+    res.endBlock('}');
+    res.needEmptyLine = true;
+
+    // Generate hashCode() method.
+    res.line('/** {@inheritDoc} */');
+    res.startBlock('@Override public int hashCode() {');
+
+    first = true;
+    tempVar = false;
+
+    for (fldIx = 0; fldIx < fields.length; fldIx ++) {
+        field = fields[fldIx];
+
+        javaName = field.javaName;
+
+        if (!first)
+            res.needEmptyLine = true;
+
+        res.line(first ? 'int res = ' + javaName + ' != null ? ' + javaName + '.hashCode() : 0;'
+            : 'res = 31 * res + (' + javaName + ' != null ? ' + javaName + '.hashCode() : 0);');
+
+        first = false;
+    }
+
+    res.needEmptyLine = true;
+    res.line('return res;');
+    res.endBlock('}');
+    res.needEmptyLine = true;
+
+    // Generate toString() method.
+    res.line('/** {@inheritDoc} */');
+    res.startBlock('@Override public String toString() {');
+
+    field = fields[0];
+
+    if (fields.length > 0) {
+        res.startBlock('return \"' + type + ' [' + field.javaName + '=\" + ' + field.javaName + ' +', type);
+
+        for (fldIx = 0; fldIx < fields.length; fldIx++) {
+            field = fields[fldIx];
+
+            var javaName = field.javaName;
+
+            res.line('\", ' + javaName + '=\" + ' + field.javaName + ' +');
+        }
+    }
+
+    res.line('\']\';');
+    res.endBlock();
+    res.endBlock('}');
+
+    res.endBlock('}');
+    res.needEmptyLine = true;
+
+    return res.asString();
+};
+
+/**
+ * Generate source code for type by its metadata.
+ *
+ * @param meta Metadata object.
+ * @param constructor {@code true} if empty and full constructors should be generated.
+ * @param includeKeys {@code true} if key fields should be included into value class.
+ * @throws IOException If failed to write generated code into file.
+ */
+$generatorJava.pojos = function (caches, includeKeys) {
+    var metadataNames = [];
+
+    $generatorJava.metadatas = [];
+
+    for (var cacheIx = 0; cacheIx < caches.length; cacheIx ++) {
+        var cache = caches[cacheIx];
+
+        for (var metaIx = 0; metaIx < cache.metadatas.length; metaIx ++) {
+            var meta = cache.metadatas[metaIx];
+
+            var pkg = meta.valueType.substring(0, meta.valueType.lastIndexOf('.'));
+
+            // Skip already generated classes.
+            if (metadataNames.indexOf(meta.valueType) < 0) {
+                // Skip metadata without value fields.
+                if ($commonUtils.isDefined(meta.valueFields) && meta.valueFields.length > 0) {
+                    var metadata = {};
+
+                    // Key class generation only if key is not build in java class.
+                    if ($commonUtils.isDefined(meta.keyFields) && meta.keyFields.length > 0) {
+                        metadata.keyType = meta.keyType;
+                        metadata.keyClass = $generatorJava.javaClassCode(meta, true, pkg);
+                    }
+
+                    metadata.valueType = meta.valueType;
+                    metadata.valueClass = $generatorJava.javaClassCode(meta, false, pkg);
+
+                    $generatorJava.metadatas.push(metadata);
+                }
+
+                metadataNames.push(meta.valueType);
+            }
+        }
+    }
+};
+
+/**
+ * @param str Source string.
+ * @return String with first letters in upper case.
+ */
+$generatorJava.capitalizeFirst = function(str) {
+    return str.charAt(0).toUpperCase() + str.substring(1);
+};
+
+/**
+ * @param type Full type name.
+ * @return Field java type name.
+ */
+$generatorJava.javaTypeName = function(type) {
+    var ix = $generatorJava.javaBuildInClasses.indexOf(type);
+
+    var resType = ix >= 0 ? $generatorJava.javaBuildInFullNameClasses[ix] : type;
+
+    return resType.indexOf("java.lang.") >= 0 ? resType.substring(10) : resType;
+};
+
+/**
+ * Generate class header.
+ *
+ * @param pkg Package name.
+ * @param imports Optional imports.
+ * @param desc Class description.
+ * @param cls Class declaration.
+ */
+$generatorJava.header = function(res, pkg, imports, desc, cls) {
+    // License.
+    res.line('/*');
+    res.line(' * Licensed to the Apache Software Foundation (ASF) under one or more');
+    res.line(' * contributor license agreements.  See the NOTICE file distributed with');
+    res.line(' * this work for additional information regarding copyright ownership.');
+    res.line(' * The ASF licenses this file to You under the Apache License, Version 2.0');
+    res.line(' * (the \'License\'); you may not use this file except in compliance with');
+    res.line(' * the License.  You may obtain a copy of the License at');
+    res.line(' *');
+    res.line(' *      http://www.apache.org/licenses/LICENSE-2.0');
+    res.line(' *');
+    res.line(' * Unless required by applicable law or agreed to in writing, software');
+    res.line(' * distributed under the License is distributed on an \'AS IS\' BASIS,');
+    res.line(' * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.');
+    res.line(' * See the License for the specific language governing permissions and');
+    res.line(' * limitations under the License.');
+    res.line(' */');
+    res.needEmptyLine = true;
+
+    // Package.
+    res.line('package ' + pkg + ';');
+    res.needEmptyLine = true;
+
+    // Imports.
+    if (imports.length > 0) {
+        var impLst = imports.split(';');
+
+        for (var impIx = 0; impIx < impLst.length; impIx ++) {
+            var imp = impLst[impIx];
+
+            if (imp == '')
+                res.needEmptyLine = true;
+            else
+                res.line('import ' + imp + ';');
+        }
+
+        res.needEmptyLine = true;
+    }
+
+    // Class.
+    res.line('/**');
+    res.line(' * ' + desc + ' definition.');
+    res.line(' *');
+    res.line(' * ' + $generatorCommon.mainComment());
+    res.line(' */');
+    res.startBlock('public class ' + cls + ' {');
 };
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9824da79/modules/control-center-web/src/main/js/routes/public.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/public.js b/modules/control-center-web/src/main/js/routes/public.js
index 1609263..1b76cae 100644
--- a/modules/control-center-web/src/main/js/routes/public.js
+++ b/modules/control-center-web/src/main/js/routes/public.js
@@ -159,7 +159,7 @@ router.post('/password/forgot', function(req, res) {
                 'http://' + req.headers.host + '/password/reset/' + token + '\n\n' +
                 'If you did not request this, please ignore this email and your password will remain unchanged.\n\n' +
                 '--------------\n' +
-                'Apache Ignite Web Control Center\n'
+                'Apache Ignite Web Console\n'
             };
 
             mailer.sendMail(mailOptions, function(err){
@@ -212,7 +212,7 @@ router.post('/password/reset', function(req, res) {
                     'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n\n' +
                     'Now you can login: http://' + req.headers.host + '\n\n' +
                     '--------------\n' +
-                    'Apache Ignite Web Control Center\n'
+                    'Apache Ignite Web Console\n'
                 };
 
                 mailer.sendMail(mailOptions, function (err) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/9824da79/modules/control-center-web/src/main/js/routes/summary.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/summary.js b/modules/control-center-web/src/main/js/routes/summary.js
index eca0140..01895c0 100644
--- a/modules/control-center-web/src/main/js/routes/summary.js
+++ b/modules/control-center-web/src/main/js/routes/summary.js
@@ -78,8 +78,22 @@ router.post('/download', function (req, res) {
             .append($generatorJava.cluster(cluster, false, clientNearConfiguration),
                 {name: cluster.name + '.snippet.java'})
             .append($generatorJava.cluster(cluster, true, clientNearConfiguration),
-                {name: 'ConfigurationFactory.java'})
-            .finalize();
+                {name: 'ConfigurationFactory.java'});
+
+        $generatorJava.pojos(cluster.caches);
+
+        var metadatas = $generatorJava.metadatas;
+
+        for (var metaIx = 0; metaIx < metadatas.length; metaIx ++) {
+            var meta = metadatas[metaIx];
+
+            if (meta.keyClass)
+                zip.append(meta.keyClass, {name: meta.keyType.replace(/\./g, '/') + '.java'});
+
+            zip.append(meta.valueClass, {name: meta.valueType.replace(/\./g, '/') + '.java'});
+        }
+
+        zip.finalize();
     });
 });
 


[2/2] ignite git commit: Merge remote-tracking branch 'origin/ignite-843' into ignite-843

Posted by ak...@apache.org.
Merge remote-tracking branch 'origin/ignite-843' into ignite-843


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

Branch: refs/heads/ignite-843
Commit: 5d2b9a7f733c2ab1015be8b53c47440eb007458f
Parents: 9824da7 ee0fd43
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Sep 18 14:37:56 2015 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Sep 18 14:37:56 2015 +0700

----------------------------------------------------------------------
 .../src/main/js/controllers/sql-controller.js   | 32 ++++++++++++--------
 .../src/main/js/public/stylesheets/style.scss   |  4 +++
 .../src/main/js/routes/agent.js                 | 23 +++++++-------
 .../src/main/js/views/sql/cache-metadata.jade   |  6 +++-
 .../src/main/js/views/sql/sql.jade              |  2 +-
 5 files changed, 42 insertions(+), 25 deletions(-)
----------------------------------------------------------------------