You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2015/06/23 12:46:04 UTC

[1/6] incubator-ignite git commit: # IGNITE-843 Extract 'generatorXml' and 'generatorJava' modules.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-843 94ff76bf7 -> 196710a6f


# IGNITE-843 Extract 'generatorXml' and 'generatorJava' modules.


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

Branch: refs/heads/ignite-843
Commit: 95d9f0a0aa0acb84b169188dac69206f01ddceed
Parents: de85e69
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 09:41:59 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 09:41:59 2015 +0300

----------------------------------------------------------------------
 .../webconfig/nodejs/routes/configGenerator.js  | 367 +------------------
 modules/webconfig/nodejs/utils/generatorJava.js |  22 ++
 .../webconfig/nodejs/utils/generatorUtils.js    | 105 ++++++
 modules/webconfig/nodejs/utils/generatorXml.js  | 291 +++++++++++++++
 4 files changed, 431 insertions(+), 354 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/95d9f0a0/modules/webconfig/nodejs/routes/configGenerator.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/routes/configGenerator.js b/modules/webconfig/nodejs/routes/configGenerator.js
index 36e86db..89034e4 100644
--- a/modules/webconfig/nodejs/routes/configGenerator.js
+++ b/modules/webconfig/nodejs/routes/configGenerator.js
@@ -19,6 +19,9 @@ var db = require('../db');
 
 var router = require('express').Router();
 
+var generatorXml = require('./../utils/generatorXml');
+var generatorJava = require('./../utils/generatorJava');
+
 router.get('/', function(req, res) {
     var lang = req.query.lang;
     var name = req.query.name;
@@ -46,365 +49,21 @@ router.get('/', function(req, res) {
 
             var cluster = clusters[0];
 
-            try {
-                switch (lang) {
-                    case 'xml':
-                        res.send(generateXml(cluster));
-                        break;
+            switch (lang) {
+                case 'xml':
+                    res.send(generatorXml.generate(cluster));
+                    break;
 
-                    case 'java':
-                        res.send(generateJava(cluster));
-                        break;
+                case 'java':
+                    res.send(generatorJava.generate(cluster));
+                    break;
 
-                    default:
-                        res.status(404).send("Unknown language: " + lang);
-                        break;
-                }
-            }
-            catch (e) {
-                res.status(500).send(e);
+                default:
+                    res.status(404).send("Unknown language: " + lang);
+                    break;
             }
         });
     });
 });
 
-function generateJava(cluster) {
-    return "java";
-}
-
-function builder() {
-    var res = [];
-
-    res.deep = 0;
-    res.lineStart = true;
-
-    res.append = function(s) {
-        if (this.lineStart) {
-            for (var i = 0; i < this.deep; i++)
-                this.push('    ');
-
-            this.lineStart = false;
-        }
-        
-        this.push(s);
-
-        return this;
-    };
-
-    res.line = function(s) {
-        if (s)
-            this.append(s);
-        
-        this.push('\n');
-        this.lineStart = true;
-        
-        return this;
-    };
-
-    res.startBlock = function(s) {
-        if (s)
-            this.append(s);
-        
-        this.push('\n');
-        this.lineStart = true;
-        this.deep++;
-        
-        return this;
-    };
-
-    res.endBlock = function(s) {
-        this.deep--;
-        
-        if (s)
-            this.append(s);
-        
-        this.push('\n');
-        this.lineStart = true;
-        
-        return this;
-    };
-    
-    res.emptyLineIfNeeded = function() {
-        if (this.needEmptyLine) {
-            this.line();
-
-            this.needEmptyLine = false;
-        }
-    };
-    
-    return res;
-}
-
-function addProperty(res, obj, propName, newLine) {
-    var val = obj[propName];
-    
-    if (val) {
-        res.emptyLineIfNeeded();
-        
-        res.line('<property name="' + propName + '" value="' + escapeAttr(val) + '"/>');
-    }
-}
-
-function addBeanWithProperties(res, obj, beanPropName, beanClass, props) {
-    var bean = obj[beanPropName];
-
-    if (bean) {
-        var hasProp = false;
-        
-        for (var i = 0; i < props.length; i++) {
-            if (bean[props[i]]) {
-                hasProp = true;
-                
-                break;
-            } 
-        }
-        
-        if (hasProp) {
-            res.emptyLineIfNeeded();
-
-            res.startBlock('<property name="' + beanPropName + '">');
-            res.startBlock('<bean class="' + beanClass + '">');
-
-            for (i = 0; i < props.length; i++) {
-                addProperty(res, bean, props[i]);
-            }
-
-            res.endBlock('</bean>');
-            res.endBlock('</property>');
-        }
-    }
-}
-
-function addListProperty(res, obj, propName) {
-    var val = obj[propName];
-    
-    if (val && val.length > 0) {
-        res.emptyLineIfNeeded();
-        
-        res.startBlock('<property name="' + propName + '">');
-        res.startBlock('<list>');
-        
-        for (var i = 0; i < val.length; i++)
-            res.line('<value>' + escape(val[i]) + '</value>');
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-    }
-}
-
-
-
-function escapeAttr(s) {
-    if (typeof(s) != 'string')
-        return s;
-    
-    return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-}
-
-function escape(s) {
-    if (typeof(s) != 'string')
-        return s;
-    
-    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
-}
-
-function generateXml(cluster) {
-    var res = builder();
-
-    res.push('' +
-        '<?xml version="1.0" encoding="UTF-8"?>\n' +
-        '<beans xmlns="http://www.springframework.org/schema/beans"\n' +
-        '       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' +
-        '       xsi:schemaLocation="http://www.springframework.org/schema/beans\n' +
-        '                           http://www.springframework.org/schema/beans/spring-beans.xsd">\n' +
-        '    <bean class="org.apache.ignite.configuration.IgniteConfiguration">\n');
-
-    res.deep = 2;
-    
-    if (cluster.discovery) {
-        res.startBlock('<property name="discoverySpi">');
-        res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">');
-        res.startBlock('<property name="ipFinder">');
-
-        var className;
-        
-        var d = cluster.discovery;
-        
-        switch (d.kind) {
-            case 'Multicast':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
-
-                addProperty(res, d.Multicast, 'multicastGroup');
-                addProperty(res, d.Multicast, 'multicastPort');
-                addProperty(res, d.Multicast, 'responseWaitTime');
-                addProperty(res, d.Multicast, 'addressRequestAttempts');
-                addProperty(res, d.Multicast, 'localAddress');
-                
-                res.endBlock('</bean>');
-                
-                break;
-            
-            case 'Vm':
-                if (d.Vm.addresses.length > 0) {
-                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
-
-                    addListProperty(res, d.Vm, 'addresses');
-
-                    res.endBlock('</bean>');
-                }
-                else {
-                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"/>');
-                }
-                
-                break;
-            
-            case 'S3':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">');
-                
-                if (d.S3 && d.S3.bucketName)
-                    res.line('<property name="bucketName" value="' + escapeAttr(d.S3.bucketName) + '" />');
-                
-                res.endBlock('</bean>');
-                
-                break;
-            
-            case 'Cloud':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder">');
-
-                addProperty(res, d.Cloud, 'credential');
-                addProperty(res, d.Cloud, 'credentialPath');
-                addProperty(res, d.Cloud, 'identity');
-                addProperty(res, d.Cloud, 'provider');
-                
-                res.endBlock('</bean>');
-
-                break;
-            
-            case 'GoogleStorage':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder">');
-
-                addProperty(res, d.GoogleStorage, 'projectName');
-                addProperty(res, d.GoogleStorage, 'bucketName');
-                addProperty(res, d.GoogleStorage, 'serviceAccountP12FilePath');
-
-                //if (d.GoogleStorage.addrReqAttempts) todo ????
-                //    res.line('<property name="serviceAccountP12FilePath" value="' + escapeAttr(d.GoogleStorage.addrReqAttempts) + '"/>');
-
-                res.endBlock('</bean>');
-
-                break;
-            
-            case 'Jdbc':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder">');
-                res.line('<property name="initSchema" value="' + (d.Jdbc.initSchema != null || d.Jdbc.initSchema) + '"/>');
-                res.endBlock('</bean>');
-
-                break;
-            
-            case 'SharedFs':
-                if (d.SharedFs.initSchema != null) {
-                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">');
-                    addProperty(res, d.SharedFs, 'path');
-                    res.endBlock('</bean>');
-                }
-                else {
-                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder"/>');
-                }
-
-                break;
-            
-            default:
-                throw "Unknown discovery kind: " + d.kind;
-        }
-
-        res.endBlock('</property>');
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-        
-        res.needEmptyLine = true
-    }
-
-    addBeanWithProperties(res, cluster, 'atomicConfiguration', 'org.apache.ignite.configuration.AtomicConfiguration',
-        ['backups', 'cacheMode', 'atomicSequenceReserveSize']);
-    res.needEmptyLine = true;
-
-    addProperty(res, cluster, 'clockSyncSamples');
-    addProperty(res, cluster, 'clockSyncFrequency');
-    res.needEmptyLine = true;
-    addListProperty(res, cluster, 'includeEventTypes');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'igfsThreadPoolSize');
-    addProperty(res, cluster, 'publicThreadPoolSize');
-    addProperty(res, cluster, 'systemThreadPoolSize');
-    addProperty(res, cluster, 'utilityCachePoolSize');
-    addProperty(res, cluster, 'managementThreadPoolSize');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'marshalLocalJobs');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'marshCacheKeepAliveTime');
-    addProperty(res, cluster, 'marshCachePoolSize');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'cacheSanityCheckEnabled');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'metricsExpireTime');
-    addProperty(res, cluster, 'metricsHistorySize');
-    addProperty(res, cluster, 'metricsLogFrequency');
-    addProperty(res, cluster, 'metricsUpdateFrequency');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'networkTimeout');
-    addProperty(res, cluster, 'networkSendRetryDelay');
-    addProperty(res, cluster, 'networkSendRetryCount');
-    addProperty(res, cluster, 'discoveryStartupDelay');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'deploymentMode');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'peerClassLoadingEnabled');
-    addListProperty(res, cluster, 'peerClassLoadingLocalClassPathExclude');
-    addProperty(res, cluster, 'peerClassLoadingMissedResourcesCacheSize');
-    addProperty(res, cluster, 'peerClassLoadingThreadPoolSize');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'segmentCheckFrequency');
-    addProperty(res, cluster, 'segmentationPolicy');
-    addProperty(res, cluster, 'allSegmentationResolversPassRequired');
-    addProperty(res, cluster, 'segmentationResolveAttempts');
-    addProperty(res, cluster, 'waitForSegmentOnStart');
-    res.needEmptyLine = true;
-
-    //addBeanWithProperties(res, cluster, 'swapSpaceSpi', 'org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi',
-    //['baseDirectory', 'readStripesNumber', 'maximumSparsity', 'maxWriteQueueSize', 'writeBufferSize']);
-    //res.emptyLineIfNeeded();
-    
-    if (cluster.swapSpaceSpi) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="swapSpaceSpi">');
-        res.startBlock('<bean class="org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi">');
-
-        addProperty(res, cluster.swapSpaceSpi, 'baseDirectory');
-        addProperty(res, cluster.swapSpaceSpi, 'readStripesNumber');
-        addProperty(res, cluster.swapSpaceSpi, 'maximumSparsity');
-        addProperty(res, cluster.swapSpaceSpi, 'maxWriteQueueSize');
-        addProperty(res, cluster.swapSpaceSpi, 'writeBufferSize');
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-    
-    addBeanWithProperties(res, cluster, 'transactionConfiguration', 'org.apache.ignite.configuration.TransactionConfiguration',
-    ['defaultTxConcurrency', 'transactionIsolation', 'defaultTxTimeout', 'pessimisticTxLogLinger', 
-        'pessimisticTxLogSize', 'txSerializableEnabled']);
-
-    addProperty(res, cluster, 'timeServerPortBase');
-    addProperty(res, cluster, 'timeServerPortRange');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'utilityCacheKeepAliveTime');
-    
-    res.push('    </bean>\n');
-    res.push('</beans>');
-
-    return res.join('');
-}
-
 module.exports = router;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/95d9f0a0/modules/webconfig/nodejs/utils/generatorJava.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorJava.js b/modules/webconfig/nodejs/utils/generatorJava.js
new file mode 100644
index 0000000..6ab62bf
--- /dev/null
+++ b/modules/webconfig/nodejs/utils/generatorJava.js
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+var generatorUtils = require("./generatorUtils");
+
+exports.generate = function(cluster) {
+    return 'java'
+};

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/95d9f0a0/modules/webconfig/nodejs/utils/generatorUtils.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorUtils.js b/modules/webconfig/nodejs/utils/generatorUtils.js
new file mode 100644
index 0000000..dd26314
--- /dev/null
+++ b/modules/webconfig/nodejs/utils/generatorUtils.js
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ */
+
+exports.mainComment = 'This configuration was generated by automatically by Ignite ($date)';
+
+function addLeadingZero(numberStr, minSize) {
+    if (typeof (numberStr) != 'string')
+        numberStr = '' + numberStr;
+    
+    while (numberStr.length < minSize) {
+        numberStr = '0' + numberStr;
+    }
+    
+    return numberStr;
+}
+
+exports.formatDate = function (date) {
+    var dd = addLeadingZero(date.getDate(), 2);
+    var mm = addLeadingZero(date.getMonth() + 1, 2);
+    
+    var yyyy = date.getFullYear();
+
+    return mm + '/' + dd + '/' + yyyy + ' ' + addLeadingZero(date.getHours(), 2) + ':' + addLeadingZero(date.getMinutes(), 2);
+};
+
+exports.builder = function () {
+    var res = [];
+
+    res.deep = 0;
+    res.lineStart = true;
+
+    res.append = function(s) {
+        if (this.lineStart) {
+            for (var i = 0; i < this.deep; i++)
+                this.push('    ');
+
+            this.lineStart = false;
+        }
+
+        this.push(s);
+
+        return this;
+    };
+
+    res.line = function(s) {
+        if (s)
+            this.append(s);
+
+        this.push('\n');
+        this.lineStart = true;
+
+        return this;
+    };
+
+    res.startBlock = function(s) {
+        if (s)
+            this.append(s);
+
+        this.push('\n');
+        this.lineStart = true;
+        this.deep++;
+
+        return this;
+    };
+
+    res.endBlock = function(s) {
+        this.deep--;
+
+        if (s)
+            this.append(s);
+
+        this.push('\n');
+        this.lineStart = true;
+
+        return this;
+    };
+
+    res.emptyLineIfNeeded = function() {
+        if (this.needEmptyLine) {
+            this.line();
+
+            this.needEmptyLine = false;
+        }
+    };
+
+    return res;
+};
+
+exports.writeProperties = function(writer, cluster) {
+    
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/95d9f0a0/modules/webconfig/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorXml.js b/modules/webconfig/nodejs/utils/generatorXml.js
new file mode 100644
index 0000000..3112754
--- /dev/null
+++ b/modules/webconfig/nodejs/utils/generatorXml.js
@@ -0,0 +1,291 @@
+/*
+ * 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.
+ */
+
+var generatorUtils = require("./generatorUtils");
+
+exports.generate = function(cluster) {
+    var res = generatorUtils.builder();
+
+    res.push('' +
+        '<?xml version="1.0" encoding="UTF-8"?>\n' +
+        '\n' +
+        '<!-- ' + (generatorUtils.mainComment.replace('$date', generatorUtils.formatDate(new Date()))) + ' -->\n' +    
+        '<beans xmlns="http://www.springframework.org/schema/beans"\n' +
+        '       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' +
+        '       xsi:schemaLocation="http://www.springframework.org/schema/beans\n' +
+        '                           http://www.springframework.org/schema/beans/spring-beans.xsd">\n' +
+        '    <bean class="org.apache.ignite.configuration.IgniteConfiguration">\n');
+
+    res.deep = 2;
+
+    if (cluster.discovery) {
+        res.startBlock('<property name="discoverySpi">');
+        res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">');
+        res.startBlock('<property name="ipFinder">');
+
+        var className;
+
+        var d = cluster.discovery;
+
+        switch (d.kind) {
+            case 'Multicast':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
+
+                addProperty(res, d.Multicast, 'multicastGroup');
+                addProperty(res, d.Multicast, 'multicastPort');
+                addProperty(res, d.Multicast, 'responseWaitTime');
+                addProperty(res, d.Multicast, 'addressRequestAttempts');
+                addProperty(res, d.Multicast, 'localAddress');
+
+                res.endBlock('</bean>');
+
+                break;
+
+            case 'Vm':
+                if (d.Vm.addresses.length > 0) {
+                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
+
+                    addListProperty(res, d.Vm, 'addresses');
+
+                    res.endBlock('</bean>');
+                }
+                else {
+                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"/>');
+                }
+
+                break;
+
+            case 'S3':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">');
+
+                if (d.S3 && d.S3.bucketName)
+                    res.line('<property name="bucketName" value="' + escapeAttr(d.S3.bucketName) + '" />');
+
+                res.endBlock('</bean>');
+
+                break;
+
+            case 'Cloud':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder">');
+
+                addProperty(res, d.Cloud, 'credential');
+                addProperty(res, d.Cloud, 'credentialPath');
+                addProperty(res, d.Cloud, 'identity');
+                addProperty(res, d.Cloud, 'provider');
+
+                res.endBlock('</bean>');
+
+                break;
+
+            case 'GoogleStorage':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder">');
+
+                addProperty(res, d.GoogleStorage, 'projectName');
+                addProperty(res, d.GoogleStorage, 'bucketName');
+                addProperty(res, d.GoogleStorage, 'serviceAccountP12FilePath');
+
+                //if (d.GoogleStorage.addrReqAttempts) todo ????
+                //    res.line('<property name="serviceAccountP12FilePath" value="' + escapeAttr(d.GoogleStorage.addrReqAttempts) + '"/>');
+
+                res.endBlock('</bean>');
+
+                break;
+
+            case 'Jdbc':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder">');
+                res.line('<property name="initSchema" value="' + (d.Jdbc.initSchema != null || d.Jdbc.initSchema) + '"/>');
+                res.endBlock('</bean>');
+
+                break;
+
+            case 'SharedFs':
+                if (d.SharedFs.initSchema != null) {
+                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">');
+                    addProperty(res, d.SharedFs, 'path');
+                    res.endBlock('</bean>');
+                }
+                else {
+                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder"/>');
+                }
+
+                break;
+
+            default:
+                throw "Unknown discovery kind: " + d.kind;
+        }
+
+        res.endBlock('</property>');
+        res.endBlock('</bean>');
+        res.endBlock('</property>');
+
+        res.needEmptyLine = true
+    }
+
+    addBeanWithProperties(res, cluster, 'atomicConfiguration', 'org.apache.ignite.configuration.AtomicConfiguration',
+        ['backups', 'cacheMode', 'atomicSequenceReserveSize']);
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'clockSyncSamples');
+    addProperty(res, cluster, 'clockSyncFrequency');
+    res.needEmptyLine = true;
+    addListProperty(res, cluster, 'includeEventTypes');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'igfsThreadPoolSize');
+    addProperty(res, cluster, 'publicThreadPoolSize');
+    addProperty(res, cluster, 'systemThreadPoolSize');
+    addProperty(res, cluster, 'utilityCachePoolSize');
+    addProperty(res, cluster, 'managementThreadPoolSize');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'marshalLocalJobs');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'marshCacheKeepAliveTime');
+    addProperty(res, cluster, 'marshCachePoolSize');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'cacheSanityCheckEnabled');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'metricsExpireTime');
+    addProperty(res, cluster, 'metricsHistorySize');
+    addProperty(res, cluster, 'metricsLogFrequency');
+    addProperty(res, cluster, 'metricsUpdateFrequency');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'networkTimeout');
+    addProperty(res, cluster, 'networkSendRetryDelay');
+    addProperty(res, cluster, 'networkSendRetryCount');
+    addProperty(res, cluster, 'discoveryStartupDelay');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'deploymentMode');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'peerClassLoadingEnabled');
+    addListProperty(res, cluster, 'peerClassLoadingLocalClassPathExclude');
+    addProperty(res, cluster, 'peerClassLoadingMissedResourcesCacheSize');
+    addProperty(res, cluster, 'peerClassLoadingThreadPoolSize');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'segmentCheckFrequency');
+    addProperty(res, cluster, 'segmentationPolicy');
+    addProperty(res, cluster, 'allSegmentationResolversPassRequired');
+    addProperty(res, cluster, 'segmentationResolveAttempts');
+    addProperty(res, cluster, 'waitForSegmentOnStart');
+    res.needEmptyLine = true;
+
+    //addBeanWithProperties(res, cluster, 'swapSpaceSpi', 'org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi',
+    //['baseDirectory', 'readStripesNumber', 'maximumSparsity', 'maxWriteQueueSize', 'writeBufferSize']);
+    //res.emptyLineIfNeeded();
+
+    if (cluster.swapSpaceSpi) {
+        res.emptyLineIfNeeded();
+
+        res.startBlock('<property name="swapSpaceSpi">');
+        res.startBlock('<bean class="org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi">');
+
+        addProperty(res, cluster.swapSpaceSpi, 'baseDirectory');
+        addProperty(res, cluster.swapSpaceSpi, 'readStripesNumber');
+        addProperty(res, cluster.swapSpaceSpi, 'maximumSparsity');
+        addProperty(res, cluster.swapSpaceSpi, 'maxWriteQueueSize');
+        addProperty(res, cluster.swapSpaceSpi, 'writeBufferSize');
+
+        res.endBlock('</bean>');
+        res.endBlock('</property>');
+
+        res.needEmptyLine = true;
+    }
+
+    addBeanWithProperties(res, cluster, 'transactionConfiguration', 'org.apache.ignite.configuration.TransactionConfiguration',
+        ['defaultTxConcurrency', 'transactionIsolation', 'defaultTxTimeout', 'pessimisticTxLogLinger',
+            'pessimisticTxLogSize', 'txSerializableEnabled']);
+
+    addProperty(res, cluster, 'timeServerPortBase');
+    addProperty(res, cluster, 'timeServerPortRange');
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'utilityCacheKeepAliveTime');
+
+    res.push('    </bean>\n');
+    res.push('</beans>');
+
+    return res.join('');
+};
+
+
+function addProperty(res, obj, propName) {
+    var val = obj[propName];
+
+    if (val) {
+        res.emptyLineIfNeeded();
+
+        res.line('<property name="' + propName + '" value="' + escapeAttr(val) + '"/>');
+    }
+}
+
+function addBeanWithProperties(res, obj, beanPropName, beanClass, props) {
+    var bean = obj[beanPropName];
+
+    if (bean) {
+        var hasProp = false;
+
+        for (var i = 0; i < props.length; i++) {
+            if (bean[props[i]]) {
+                hasProp = true;
+
+                break;
+            }
+        }
+
+        if (hasProp) {
+            res.emptyLineIfNeeded();
+
+            res.startBlock('<property name="' + beanPropName + '">');
+            res.startBlock('<bean class="' + beanClass + '">');
+
+            for (i = 0; i < props.length; i++) {
+                addProperty(res, bean, props[i]);
+            }
+
+            res.endBlock('</bean>');
+            res.endBlock('</property>');
+        }
+    }
+}
+
+function addListProperty(res, obj, propName) {
+    var val = obj[propName];
+
+    if (val && val.length > 0) {
+        res.emptyLineIfNeeded();
+
+        res.startBlock('<property name="' + propName + '">');
+        res.startBlock('<list>');
+
+        for (var i = 0; i < val.length; i++)
+            res.line('<value>' + escape(val[i]) + '</value>');
+
+        res.endBlock('</list>');
+        res.endBlock('</property>');
+    }
+}
+
+function escapeAttr(s) {
+    if (typeof(s) != 'string')
+        return s;
+
+    return s.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
+}
+
+function escape(s) {
+    if (typeof(s) != 'string')
+        return s;
+
+    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+}


[6/6] incubator-ignite git commit: Merge branch 'ignite-843' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-843

Posted by se...@apache.org.
Merge branch 'ignite-843' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-843


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

Branch: refs/heads/ignite-843
Commit: 196710a6f1c7b9157f7f012fe1d1b6824485ad54
Parents: 8c2fdae 94ff76b
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 13:45:20 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 13:45:20 2015 +0300

----------------------------------------------------------------------
 modules/webconfig/nodejs/db.js                  |  27 +++-
 .../nodejs/public/form-models/caches.json       | 143 +++++++++++++++++++
 .../nodejs/public/form-models/clusters.json     |  20 +--
 .../public/javascripts/controllers/caches.js    |  21 +++
 .../public/javascripts/controllers/clusters.js  |   6 +
 .../public/javascripts/controllers/common.js    |   4 +-
 .../nodejs/public/stylesheets/style.css         |   2 +-
 .../nodejs/public/stylesheets/style.less        |  27 +++-
 modules/webconfig/nodejs/views/caches.jade      |   4 +-
 modules/webconfig/nodejs/views/clusters.jade    |   2 +-
 .../nodejs/views/includes/controls.jade         |  22 ++-
 .../webconfig/nodejs/views/includes/header.jade |   2 +-
 12 files changed, 259 insertions(+), 21 deletions(-)
----------------------------------------------------------------------



[4/6] incubator-ignite git commit: # IGNITE-843 Don't use '!= null' in javascript

Posted by se...@apache.org.
# IGNITE-843 Don't use '!= null' in javascript


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

Branch: refs/heads/ignite-843
Commit: adc1e4d00aa67c16df841ff6f1fe91df50e499f7
Parents: 01d4a35
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 11:53:58 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 11:53:58 2015 +0300

----------------------------------------------------------------------
 modules/webconfig/nodejs/utils/generatorXml.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/adc1e4d0/modules/webconfig/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorXml.js b/modules/webconfig/nodejs/utils/generatorXml.js
index 0315576..d72874d 100644
--- a/modules/webconfig/nodejs/utils/generatorXml.js
+++ b/modules/webconfig/nodejs/utils/generatorXml.js
@@ -113,7 +113,7 @@ exports.generate = function(cluster) {
                 break;
 
             case 'SharedFs':
-                if (d.SharedFs.path != null) {
+                if (d.SharedFs.path) {
                     res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">');
                     addProperty(res, d.SharedFs, 'path');
                     res.endBlock('</bean>');


[3/6] incubator-ignite git commit: # IGNITE-843 Bug fix: wrong property used.

Posted by se...@apache.org.
# IGNITE-843 Bug fix: wrong property used.


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

Branch: refs/heads/ignite-843
Commit: 01d4a353526a8a18091f8a62bc1f863f02e2baac
Parents: d3902e0
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 10:37:58 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 10:37:58 2015 +0300

----------------------------------------------------------------------
 modules/webconfig/nodejs/utils/generatorXml.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/01d4a353/modules/webconfig/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorXml.js b/modules/webconfig/nodejs/utils/generatorXml.js
index 5fc0e9b..0315576 100644
--- a/modules/webconfig/nodejs/utils/generatorXml.js
+++ b/modules/webconfig/nodejs/utils/generatorXml.js
@@ -113,7 +113,7 @@ exports.generate = function(cluster) {
                 break;
 
             case 'SharedFs':
-                if (d.SharedFs.initSchema != null) {
+                if (d.SharedFs.path != null) {
                     res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">');
                     addProperty(res, d.SharedFs, 'path');
                     res.endBlock('</bean>');


[2/6] incubator-ignite git commit: # IGNITE-843 Bug fix: use TcpDiscoveryVmIpFinder instead of TcpDiscoveryMulticastIpFinder.

Posted by se...@apache.org.
# IGNITE-843 Bug fix: use TcpDiscoveryVmIpFinder instead of TcpDiscoveryMulticastIpFinder.


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

Branch: refs/heads/ignite-843
Commit: d3902e020884e8753b537b373fe8a796d5213ab4
Parents: 95d9f0a
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 10:26:30 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 10:26:30 2015 +0300

----------------------------------------------------------------------
 modules/webconfig/nodejs/utils/generatorXml.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d3902e02/modules/webconfig/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorXml.js b/modules/webconfig/nodejs/utils/generatorXml.js
index 3112754..5fc0e9b 100644
--- a/modules/webconfig/nodejs/utils/generatorXml.js
+++ b/modules/webconfig/nodejs/utils/generatorXml.js
@@ -57,14 +57,14 @@ exports.generate = function(cluster) {
 
             case 'Vm':
                 if (d.Vm.addresses.length > 0) {
-                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
+                    res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">');
 
                     addListProperty(res, d.Vm, 'addresses');
 
                     res.endBlock('</bean>');
                 }
                 else {
-                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"/>');
+                    res.line('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"/>');
                 }
 
                 break;


[5/6] incubator-ignite git commit: # IGNITE-843 Implement java code generator

Posted by se...@apache.org.
# IGNITE-843 Implement java code generator


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

Branch: refs/heads/ignite-843
Commit: 8c2fdaee21e320461bef3f19a8cba1ad3083ab4d
Parents: adc1e4d
Author: sevdokimov <se...@jetbrains.com>
Authored: Tue Jun 23 13:44:53 2015 +0300
Committer: sevdokimov <se...@jetbrains.com>
Committed: Tue Jun 23 13:44:53 2015 +0300

----------------------------------------------------------------------
 modules/webconfig/nodejs/utils/generatorJava.js | 300 ++++++++++++++++++-
 .../webconfig/nodejs/utils/generatorUtils.js    |   4 +
 modules/webconfig/nodejs/utils/generatorXml.js  | 149 ++++-----
 3 files changed, 380 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8c2fdaee/modules/webconfig/nodejs/utils/generatorJava.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorJava.js b/modules/webconfig/nodejs/utils/generatorJava.js
index 6ab62bf..64a742c 100644
--- a/modules/webconfig/nodejs/utils/generatorJava.js
+++ b/modules/webconfig/nodejs/utils/generatorJava.js
@@ -17,6 +17,304 @@
 
 var generatorUtils = require("./generatorUtils");
 
+function toJavaCode(val, type) {
+    if (val == null)
+       return 'null';
+
+    if (type == 'f')
+        return val + 'f';
+    
+    if (type)
+        return type + '.' + val;
+    
+    if (typeof(val) == 'string')
+        return '"' + val.replace('"', '\\"') + '"';
+
+    if (typeof(val) == 'number' || typeof(val) == 'boolean')
+        return '' + val;
+
+    throw "Unknown type: " + typeof(val) + ' (' + val + ')';
+}
+
+function addProperty(res, obj, objVariableName, propName, enumType) {
+    var val = obj[propName];
+    
+    if (val) {
+        res.emptyLineIfNeeded();
+        
+        res.line(objVariableName + '.' + getSetterName(propName) + '(' + toJavaCode(val, enumType)  + ');');
+    }
+}
+
+function getSetterName(propName) {
+    return 'set' + propName.charAt(0).toLocaleUpperCase() + propName.slice(1);
+}
+
+function addListProperty(res, obj, objVariableName, propName, enumType) {
+    var val = obj[propName];
+    
+    if (val && val.length > 0) {
+        var setterName = getSetterName(propName);
+        
+        res.append(objVariableName + '.' + setterName + '(Arrays.asList(');
+
+        for (var i = 0; i < val.length; i++) {
+            if (i > 0)
+                res.append(', ');
+            
+            res.append(toJavaCode(val[i], enumType));
+        }
+        
+        res.line('));');
+    }
+}
+
+function addMultiparamProperty(res, obj, objVariableName, propName, enumType) {
+    var val = obj[propName];
+    
+    if (val && val.length > 0) {
+        var setterName = getSetterName(propName);
+        
+        res.append(objVariableName + '.' + setterName + '(');
+
+        for (var i = 0; i < val.length; i++) {
+            if (i > 0)
+                res.append(', ');
+            
+            res.append(toJavaCode(val[i], enumType));
+        }
+        
+        res.line(');');
+    }
+}
+
+function addBeanWithProperties(res, bean, objVarName, beanPropName, beanVarName, beanClass, props, alwaysCreateBean) {
+    if (!bean)
+        return;
+    
+    var hasProps = false;
+    for (var propName in props) {
+        if (props.hasOwnProperty(propName)) {
+            if (bean[propName]) {
+                hasProps = true;
+                break;
+            }
+        }
+    }
+    
+    if (hasProps) {
+        if (!res.emptyLineIfNeeded()) {
+            res.line();
+        }
+        
+        res.line(beanClass + ' ' + beanVarName + ' = new ' + beanClass + '();');
+        for (propName in props) {
+            if (props.hasOwnProperty(propName)) {
+                var val = bean[propName];
+                if (val) {
+                    var type = props[propName];
+                    
+                    if (type == 'list') {
+                        addListProperty(res, bean, beanVarName, propName);
+                    }
+                    else {
+                        addProperty(res, bean, beanVarName, propName, type);
+                    }
+                }
+            }
+        }
+        res.line(objVarName + '.' + getSetterName(beanPropName) + '(' + beanVarName + ');');
+        
+        res.needEmptyLine = true;
+    }
+    else if (alwaysCreateBean) {
+        res.emptyLineIfNeeded();
+        
+        res.line(objVarName + '.' + getSetterName(beanPropName) + '(new ' + beanClass + '());');
+    }
+}
+
 exports.generate = function(cluster) {
-    return 'java'
+    var res = generatorUtils.builder();
+
+    res.line('IgniteConfiguration cfg = new IgniteConfiguration();');
+    res.line();
+
+    if (cluster.discovery) {
+        var d = cluster.discovery;
+
+        res.line('TcpDiscoverySpi discovery = new TcpDiscoverySpi();');
+        switch (d.kind) {
+            case 'Multicast':
+                addBeanWithProperties(res, d.Multicast, 'discovery', 'ipFinder', 'ipFinder',
+                    'TcpDiscoveryMulticastIpFinder', {
+                        multicastGroup: null,
+                        multicastPort: null,
+                        responseWaitTime: null,
+                        addressRequestAttempts: null,
+                        localAddress: null
+                    }, true);
+
+                break;
+
+            case 'Vm':
+                addBeanWithProperties(res, d.Vm, 'discovery', 'ipFinder', 'ipFinder',
+                    'TcpDiscoveryVmIpFinder', {addresses: 'list'}, true);
+
+                break;
+
+            case 'S3':
+                if (d.S3) {
+                    addBeanWithProperties(res, d.S3, 'discovery', 'ipFinder', 'ipFinder',
+                        'TcpDiscoveryS3IpFinder', {bucketName: null}, true);
+                }
+                else {
+                    res.line('discovery.setIpFinder(new TcpDiscoveryS3IpFinder());');
+                }
+                
+                break;
+
+            case 'Cloud':
+                addBeanWithProperties(res, d.Cloud, 'discovery', 'ipFinder', 'ipFinder',
+                    'TcpDiscoveryCloudIpFinder', {
+                        credential: null,
+                        credentialPath: null,
+                        identity: null,
+                        provider: null
+                    }, true);
+
+                break;
+
+            case 'GoogleStorage':
+                addBeanWithProperties(res, d.GoogleStorage, 'discovery', 'ipFinder', 'ipFinder',
+                    'TcpDiscoveryGoogleStorageIpFinder', {
+                        projectName: null,
+                        bucketName: null,
+                        serviceAccountP12FilePath: null
+                    }, true);
+
+                //if (d.GoogleStorage.addrReqAttempts) todo ????
+                //    res.line('<property name="serviceAccountP12FilePath" value="' + escapeAttr(d.GoogleStorage.addrReqAttempts) + '"/>');
+
+                break;
+
+            case 'Jdbc':
+                res.line();
+                res.line('TcpDiscoveryJdbcIpFinder ipFinder = new TcpDiscoveryJdbcIpFinder();');
+                res.line('ipFinder.setInitSchema(' + (d.Jdbc.initSchema != null || d.Jdbc.initSchema) + ');');
+                res.line('discovery.setIpFinder(ipFinder);');
+                res.needEmptyLine = true;
+                
+                break;
+
+            case 'SharedFs':
+                addBeanWithProperties(res, d.SharedFs, 'discovery', 'ipFinder', 'ipFinder',
+                    'TcpDiscoverySharedFsIpFinder', {path: null}, true);
+
+                break;
+
+            default:
+                throw "Unknown discovery kind: " + d.kind;
+        }
+
+        res.emptyLineIfNeeded();
+        
+        res.line('cfg.setDiscoverySpi(discovery);');
+        
+        res.needEmptyLine = true;
+    }
+
+    addBeanWithProperties(res, cluster.atomicConfiguration, 'cfg', 'atomicConfiguration', 'atomicCfg', 'AtomicConfiguration', {
+        backups: null,
+        cacheMode: 'CacheMode',
+        atomicSequenceReserveSize: null});
+
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'networkTimeout');
+    addProperty(res, cluster, 'cfg', 'networkSendRetryDelay');
+    addProperty(res, cluster, 'cfg', 'networkSendRetryCount');
+    addProperty(res, cluster, 'cfg', 'segmentCheckFrequency');
+    addProperty(res, cluster, 'cfg', 'waitForSegmentOnStart');
+    addProperty(res, cluster, 'cfg', 'discoveryStartupDelay');
+    
+    res.needEmptyLine = true;
+    
+    addProperty(res, cluster, 'cfg', 'deploymentMode', 'DeploymentMode');
+
+    res.needEmptyLine = true;
+
+    addListProperty(res, cluster, 'cfg', 'includeEventTypes');
+    
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'marshalLocalJobs');
+    addProperty(res, cluster, 'cfg', 'marshCacheKeepAliveTime');
+    addProperty(res, cluster, 'cfg', 'marshCachePoolSize');
+
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'metricsExpireTime');
+    addProperty(res, cluster, 'cfg', 'metricsHistorySize');
+    addProperty(res, cluster, 'cfg', 'metricsLogFrequency');
+    addProperty(res, cluster, 'cfg', 'metricsUpdateFrequency');
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'peerClassLoadingEnabled');
+    addMultiparamProperty(res, cluster, 'cfg', 'peerClassLoadingLocalClassPathExclude');
+    addProperty(res, cluster, 'cfg', 'peerClassLoadingMissedResourcesCacheSize');
+    addProperty(res, cluster, 'cfg', 'peerClassLoadingThreadPoolSize');
+    res.needEmptyLine = true;
+
+    addBeanWithProperties(res, cluster.swapSpaceSpi.FileSwapSpaceSpi, 'cfg', 'swapSpaceSpi', 'swapSpi', 'FileSwapSpaceSpi', {
+        baseDirectory: null,
+        readStripesNumber: null,
+        maximumSparsity: 'f',
+        maxWriteQueueSize: null,
+        writeBufferSize: null
+    }, true);
+
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'clockSyncSamples');
+    addProperty(res, cluster, 'cfg', 'clockSyncFrequency');
+    addProperty(res, cluster, 'cfg', 'timeServerPortBase');
+    addProperty(res, cluster, 'cfg', 'timeServerPortRange');
+
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'publicThreadPoolSize');
+    addProperty(res, cluster, 'cfg', 'systemThreadPoolSize');
+    addProperty(res, cluster, 'cfg', 'managementThreadPoolSize');
+    addProperty(res, cluster, 'cfg', 'igfsThreadPoolSize');
+    
+    res.needEmptyLine = true;
+
+    addBeanWithProperties(res, cluster.transactionConfiguration, 'cfg', 'transactionConfiguration',
+        'transactionConfiguration', 'TransactionConfiguration', {
+            defaultTxConcurrency: 'TransactionConcurrency',
+            transactionIsolation: 'TransactionIsolation',
+            defaultTxTimeout: null,
+            pessimisticTxLogLinger: null,
+            pessimisticTxLogSize: null,
+            txSerializableEnabled: null
+        });
+
+    res.needEmptyLine = true;
+    
+    addProperty(res, cluster, 'cfg', 'cacheSanityCheckEnabled');
+    
+    res.needEmptyLine = true;
+
+    addProperty(res, cluster, 'cfg', 'segmentationPolicy', 'SegmentationPolicy');
+    addProperty(res, cluster, 'cfg', 'segmentationResolveAttempts');
+    addProperty(res, cluster, 'cfg', 'allSegmentationResolversPassRequired');
+    
+    res.needEmptyLine = true;
+
+    res.needEmptyLine = true;
+    addProperty(res, cluster, 'cfg', 'utilityCacheKeepAliveTime');
+    addProperty(res, cluster, 'cfg', 'utilityCachePoolSize');
+
+    return res.join('');
 };

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8c2fdaee/modules/webconfig/nodejs/utils/generatorUtils.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorUtils.js b/modules/webconfig/nodejs/utils/generatorUtils.js
index dd26314..84e8f62 100644
--- a/modules/webconfig/nodejs/utils/generatorUtils.js
+++ b/modules/webconfig/nodejs/utils/generatorUtils.js
@@ -94,7 +94,11 @@ exports.builder = function () {
             this.line();
 
             this.needEmptyLine = false;
+            
+            return true;
         }
+
+        return false;
     };
 
     return res;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/8c2fdaee/modules/webconfig/nodejs/utils/generatorXml.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/utils/generatorXml.js b/modules/webconfig/nodejs/utils/generatorXml.js
index d72874d..e786612 100644
--- a/modules/webconfig/nodejs/utils/generatorXml.js
+++ b/modules/webconfig/nodejs/utils/generatorXml.js
@@ -135,83 +135,89 @@ exports.generate = function(cluster) {
         res.needEmptyLine = true
     }
 
-    addBeanWithProperties(res, cluster, 'atomicConfiguration', 'org.apache.ignite.configuration.AtomicConfiguration',
-        ['backups', 'cacheMode', 'atomicSequenceReserveSize']);
+    addBeanWithProperties(res, cluster.atomicConfiguration, 'atomicConfiguration', 
+        'org.apache.ignite.configuration.AtomicConfiguration', ['backups', 'cacheMode', 'atomicSequenceReserveSize']);
     res.needEmptyLine = true;
 
-    addProperty(res, cluster, 'clockSyncSamples');
-    addProperty(res, cluster, 'clockSyncFrequency');
+    addProperty(res, cluster, 'networkTimeout');
+    addProperty(res, cluster, 'networkSendRetryDelay');
+    addProperty(res, cluster, 'networkSendRetryCount');
+    addProperty(res, cluster, 'segmentCheckFrequency');
+    addProperty(res, cluster, 'waitForSegmentOnStart');
+    addProperty(res, cluster, 'discoveryStartupDelay');
+    
     res.needEmptyLine = true;
-    addListProperty(res, cluster, 'includeEventTypes');
+    
+    addProperty(res, cluster, 'deploymentMode');
+
     res.needEmptyLine = true;
-    addProperty(res, cluster, 'igfsThreadPoolSize');
-    addProperty(res, cluster, 'publicThreadPoolSize');
-    addProperty(res, cluster, 'systemThreadPoolSize');
-    addProperty(res, cluster, 'utilityCachePoolSize');
-    addProperty(res, cluster, 'managementThreadPoolSize');
+
+    addListProperty(res, cluster, 'includeEventTypes');
+
     res.needEmptyLine = true;
+
     addProperty(res, cluster, 'marshalLocalJobs');
-    res.needEmptyLine = true;
     addProperty(res, cluster, 'marshCacheKeepAliveTime');
     addProperty(res, cluster, 'marshCachePoolSize');
+
     res.needEmptyLine = true;
-    addProperty(res, cluster, 'cacheSanityCheckEnabled');
-    res.needEmptyLine = true;
+
     addProperty(res, cluster, 'metricsExpireTime');
     addProperty(res, cluster, 'metricsHistorySize');
     addProperty(res, cluster, 'metricsLogFrequency');
     addProperty(res, cluster, 'metricsUpdateFrequency');
+
     res.needEmptyLine = true;
-    addProperty(res, cluster, 'networkTimeout');
-    addProperty(res, cluster, 'networkSendRetryDelay');
-    addProperty(res, cluster, 'networkSendRetryCount');
-    addProperty(res, cluster, 'discoveryStartupDelay');
-    res.needEmptyLine = true;
-    addProperty(res, cluster, 'deploymentMode');
-    res.needEmptyLine = true;
+
     addProperty(res, cluster, 'peerClassLoadingEnabled');
     addListProperty(res, cluster, 'peerClassLoadingLocalClassPathExclude');
     addProperty(res, cluster, 'peerClassLoadingMissedResourcesCacheSize');
     addProperty(res, cluster, 'peerClassLoadingThreadPoolSize');
+    
     res.needEmptyLine = true;
-    addProperty(res, cluster, 'segmentCheckFrequency');
-    addProperty(res, cluster, 'segmentationPolicy');
-    addProperty(res, cluster, 'allSegmentationResolversPassRequired');
-    addProperty(res, cluster, 'segmentationResolveAttempts');
-    addProperty(res, cluster, 'waitForSegmentOnStart');
+
+    addBeanWithProperties(res, cluster.swapSpaceSpi.FileSwapSpaceSpi, 'swapSpaceSpi',
+        'org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi', ['baseDirectory', 'readStripesNumber',
+            'maximumSparsity', 'maxWriteQueueSize', 'writeBufferSize'], true);
+
     res.needEmptyLine = true;
+    
+    addProperty(res, cluster, 'clockSyncSamples');
+    addProperty(res, cluster, 'clockSyncFrequency');
+    addProperty(res, cluster, 'timeServerPortBase');
+    addProperty(res, cluster, 'timeServerPortRange');
 
-    //addBeanWithProperties(res, cluster, 'swapSpaceSpi', 'org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi',
-    //['baseDirectory', 'readStripesNumber', 'maximumSparsity', 'maxWriteQueueSize', 'writeBufferSize']);
-    //res.emptyLineIfNeeded();
+    res.needEmptyLine = true;
 
-    if (cluster.swapSpaceSpi) {
-        res.emptyLineIfNeeded();
+    addProperty(res, cluster, 'publicThreadPoolSize');
+    addProperty(res, cluster, 'systemThreadPoolSize');
+    addProperty(res, cluster, 'managementThreadPoolSize');
+    addProperty(res, cluster, 'igfsThreadPoolSize');
 
-        res.startBlock('<property name="swapSpaceSpi">');
-        res.startBlock('<bean class="org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi">');
+    res.needEmptyLine = true;
+    
+    addBeanWithProperties(res, cluster.transactionConfiguration, 'transactionConfiguration',
+        'org.apache.ignite.configuration.TransactionConfiguration', ['defaultTxConcurrency', 'transactionIsolation',
+            'defaultTxTimeout', 'pessimisticTxLogLinger',
+            'pessimisticTxLogSize', 'txSerializableEnabled']);
 
-        addProperty(res, cluster.swapSpaceSpi, 'baseDirectory');
-        addProperty(res, cluster.swapSpaceSpi, 'readStripesNumber');
-        addProperty(res, cluster.swapSpaceSpi, 'maximumSparsity');
-        addProperty(res, cluster.swapSpaceSpi, 'maxWriteQueueSize');
-        addProperty(res, cluster.swapSpaceSpi, 'writeBufferSize');
 
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
+    res.needEmptyLine = true;
 
-        res.needEmptyLine = true;
-    }
+    addProperty(res, cluster, 'segmentationPolicy');
+    addProperty(res, cluster, 'allSegmentationResolversPassRequired');
+    addProperty(res, cluster, 'segmentationResolveAttempts');
+    
+    res.needEmptyLine = true;
 
-    addBeanWithProperties(res, cluster, 'transactionConfiguration', 'org.apache.ignite.configuration.TransactionConfiguration',
-        ['defaultTxConcurrency', 'transactionIsolation', 'defaultTxTimeout', 'pessimisticTxLogLinger',
-            'pessimisticTxLogSize', 'txSerializableEnabled']);
+    addProperty(res, cluster, 'cacheSanityCheckEnabled');
+    
+    res.needEmptyLine = true;
 
-    addProperty(res, cluster, 'timeServerPortBase');
-    addProperty(res, cluster, 'timeServerPortRange');
     res.needEmptyLine = true;
     addProperty(res, cluster, 'utilityCacheKeepAliveTime');
-
+    addProperty(res, cluster, 'utilityCachePoolSize');
+    
     res.push('    </bean>\n');
     res.push('</beans>');
 
@@ -229,36 +235,35 @@ function addProperty(res, obj, propName) {
     }
 }
 
-function addBeanWithProperties(res, obj, beanPropName, beanClass, props) {
-    var bean = obj[beanPropName];
-
-    if (bean) {
-        var hasProp = false;
-
-        for (var i = 0; i < props.length; i++) {
-            if (bean[props[i]]) {
-                hasProp = true;
+function addBeanWithProperties(res, bean, beanPropName, beanClass, props, alwaysCreateBean) {
+    if (!bean)
+        return;
 
-                break;
-            }
+    var hasProp = false;
+    for (var i = 0; i < props.length; i++) {
+        if (bean[props[i]]) {
+            hasProp = true;
+            break;
         }
-
-        if (hasProp) {
-            res.emptyLineIfNeeded();
-
-            res.startBlock('<property name="' + beanPropName + '">');
-            res.startBlock('<bean class="' + beanClass + '">');
-
-            for (i = 0; i < props.length; i++) {
-                addProperty(res, bean, props[i]);
-            }
-
-            res.endBlock('</bean>');
-            res.endBlock('</property>');
+    }
+    
+    if (hasProp) {
+        res.emptyLineIfNeeded();
+        res.startBlock('<property name="' + beanPropName + '">');
+        res.startBlock('<bean class="' + beanClass + '">');
+        for (i = 0; i < props.length; i++) {
+            addProperty(res, bean, props[i]);
         }
+        res.endBlock('</bean>');
+        res.endBlock('</property>');
+    }
+    else if (alwaysCreateBean) {
+        res.emptyLineIfNeeded();
+        res.line('<property name="' + beanPropName + '">');
+        res.line('    <bean class="' + beanClass + '"/>');
+        res.line('</property>');
     }
 }
-
 function addListProperty(res, obj, propName) {
     var val = obj[propName];