ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anovi...@apache.org
Subject [1/7] ignite git commit: IGNITE-1857 Generate configuration zip on client side.
Date Tue, 10 Nov 2015 06:57:43 GMT
Repository: ignite
Updated Branches:
  refs/heads/ignite-843-rc1 0a76801ce -> 2dc76991a


http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/routes/generator/generator-pom.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-pom.js b/modules/control-center-web/src/main/js/routes/generator/generator-pom.js
deleted file mode 100644
index b7bd05e..0000000
--- a/modules/control-center-web/src/main/js/routes/generator/generator-pom.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * 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.
- */
-
-// For server side we should load required libraries.
-if (typeof window === 'undefined') {
-    _ = require('lodash');
-
-    $generatorCommon = require('./generator-common');
-}
-
-// pom.xml generation entry point.
-$generatorPom = {};
-
-/**
- * Generate pom.xml.
- *
- * @param caches Collection of caches to take info about used JDBC dialects.
- * @param igniteVersion Ignite version for Ignite dependencies.
- * @param res Resulting output with generated pom.
- * @returns {string} Generated content.
- */
-$generatorPom.pom = function (caches, igniteVersion, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    var dialect = {};
-
-    _.forEach(caches, function (cache) {
-        if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind == 'CacheJdbcPojoStoreFactory') {
-            if (cache.cacheStoreFactory.CacheJdbcPojoStoreFactory) {
-                dialect[cache.cacheStoreFactory.CacheJdbcPojoStoreFactory.dialect] = true;
-            }
-        }
-    });
-
-    function addProperty(tag, val) {
-        res.line('<' + tag + '>' + val + '</' + tag + '>');
-    }
-
-    function addDependency(groupId, artifactId, version, jar) {
-        res.startBlock('<dependency>');
-        addProperty('groupId', groupId);
-        addProperty('artifactId', artifactId);
-        addProperty('version', version);
-
-        if (jar) {
-            addProperty('scope', 'system');
-            addProperty('systemPath', '${project.basedir}/jdbc-drivers/' + jar);
-        }
-
-        res.endBlock('</dependency>');
-    }
-
-    function addResource(dir, exclude) {
-        res.startBlock('<resource>');
-        if (dir)
-            addProperty('directory', dir);
-
-        if (exclude) {
-            res.startBlock('<excludes>');
-            addProperty('exclude', exclude);
-            res.endBlock('</excludes>');
-        }
-
-        res.endBlock('</resource>');
-    }
-
-    res.line('<?xml version="1.0" encoding="UTF-8"?>');
-
-    res.needEmptyLine = true;
-
-    res.line('<!-- ' + $generatorCommon.mainComment() + ' -->');
-
-    res.needEmptyLine = true;
-
-    res.startBlock('<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">');
-
-    res.line('<modelVersion>4.0.0</modelVersion>');
-
-    res.needEmptyLine = true;
-
-    addProperty('groupId', 'org.apache.ignite');
-    addProperty('artifactId', 'ignite-generated-model');
-    addProperty('version', igniteVersion);
-
-    res.needEmptyLine = true;
-
-    res.startBlock('<dependencies>');
-
-    addDependency('org.apache.ignite', 'ignite-core', igniteVersion);
-    addDependency('org.apache.ignite', 'ignite-spring', igniteVersion);
-    addDependency('org.apache.ignite', 'ignite-indexing', igniteVersion);
-    addDependency('org.apache.ignite', 'ignite-rest-http', igniteVersion);
-
-    if (dialect.MySQL)
-        addDependency('mysql', 'mysql-connector-java', '5.1.37');
-
-    if (dialect.PosgreSQL)
-        addDependency('org.postgresql', 'postgresql', '9.4-1204-jdbc42');
-
-    if (dialect.H2)
-        addDependency('com.h2database', 'h2', '1.3.175');
-
-    if (dialect.Oracle)
-        addDependency('oracle', 'jdbc', '11.2', 'ojdbc6.jar');
-
-    if (dialect.DB2)
-        addDependency('ibm', 'jdbc', '4.19.26', 'db2jcc4.jar');
-
-    if (dialect.SQLServer)
-        addDependency('microsoft', 'jdbc', '4.1', 'sqljdbc41.jar');
-
-    res.endBlock('</dependencies>');
-
-    res.needEmptyLine = true;
-
-    res.startBlock('<build>');
-    res.startBlock('<resources>');
-    addResource('src/main/java', '**/*.java');
-    addResource('src/main/resources');
-    res.endBlock('</resources>');
-
-    res.startBlock('<plugins>');
-    res.startBlock('<plugin>');
-    addProperty('artifactId', 'maven-compiler-plugin');
-    addProperty('version', '3.1');
-    res.startBlock('<configuration>');
-    addProperty('source', '1.7');
-    addProperty('target', '1.7');
-    res.endBlock('</configuration>');
-    res.endBlock('</plugin>');
-    res.endBlock('</plugins>');
-    res.endBlock('</build>');
-
-    res.endBlock('</project>');
-
-    return res;
-};
-
-// For server side we should export properties generation entry point.
-if (typeof window === 'undefined') {
-    module.exports = $generatorPom;
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/routes/generator/generator-properties.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-properties.js b/modules/control-center-web/src/main/js/routes/generator/generator-properties.js
deleted file mode 100644
index 5a1dafe..0000000
--- a/modules/control-center-web/src/main/js/routes/generator/generator-properties.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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.
- */
-
-// For server side we should load required libraries.
-if (typeof window === 'undefined') {
-    _ = require('lodash');
-
-    $generatorCommon = require('./generator-common');
-}
-
-// Properties generation entry point.
-$generatorProperties = {};
-
-/**
- * Generate properties file with properties stubs for stores data sources.
- *
- * @param cluster Configuration to process.
- * @param res Resulting output with generated properties.
- * @returns {string} Generated content.
- */
-$generatorProperties.dataSourcesProperties = function (cluster, res) {
-    var datasources = [];
-
-    if (cluster.caches && cluster.caches.length > 0) {
-        _.forEach(cluster.caches, function (cache) {
-            if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind) {
-                var storeFactory = cache.cacheStoreFactory[cache.cacheStoreFactory.kind];
-
-                if (storeFactory.dialect) {
-                    var beanId = storeFactory.dataSourceBean;
-
-                    if (!_.contains(datasources, beanId)) {
-                        datasources.push(beanId);
-
-                        if (!res) {
-                            res = $generatorCommon.builder();
-
-                            res.line('# ' + $generatorCommon.mainComment());
-                        }
-
-                        res.needEmptyLine = true;
-
-                        switch (storeFactory.dialect) {
-                            case 'DB2':
-                                res.line(beanId + '.jdbc.server_name=YOUR_JDBC_SERVER_NAME');
-                                res.line(beanId + '.jdbc.port_number=YOUR_JDBC_PORT_NUMBER');
-                                res.line(beanId + '.jdbc.database_name=YOUR_JDBC_DATABASE_TYPE');
-                                res.line(beanId + '.jdbc.driver_type=YOUR_JDBC_DRIVER_TYPE');
-                                break;
-
-                            default:
-                                res.line(beanId + '.jdbc.url=YOUR_JDBC_URL');
-                        }
-
-                        res.line(beanId + '.jdbc.username=YOUR_USER_NAME');
-                        res.line(beanId + '.jdbc.password=YOUR_PASSWORD');
-                        res.line();
-                    }
-                }
-            }
-        });
-    }
-
-    return res;
-};
-
-/**
- * Generate properties file with properties stubs for cluster SSL configuration.
- *
- * @param cluster Cluster to get SSL configuration.
- * @param res Optional configuration presentation builder object.
- * @returns Configuration presentation builder object
- */
-$generatorProperties.sslProperties = function (cluster, res) {
-    if (cluster.sslEnabled && cluster.sslContextFactory) {
-        if (!res) {
-            res = $generatorCommon.builder();
-
-            res.line('# ' + $generatorCommon.mainComment());
-        }
-
-        res.needEmptyLine = true;
-
-        if ($commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.keyStoreFilePath))
-            res.line('ssl.key.storage.password=YOUR_SSL_KEY_STORAGE_PASSWORD');
-
-        if ($commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.trustStoreFilePath))
-            res.line('ssl.trust.storage.password=YOUR_SSL_TRUST_STORAGE_PASSWORD');
-    }
-
-    return res;
-};
-
-// For server side we should export properties generation entry point.
-if (typeof window === 'undefined') {
-    module.exports = $generatorProperties;
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/routes/generator/generator-readme.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-readme.js b/modules/control-center-web/src/main/js/routes/generator/generator-readme.js
deleted file mode 100644
index 5278e7f..0000000
--- a/modules/control-center-web/src/main/js/routes/generator/generator-readme.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-
-// For server side we should load required libraries.
-if (typeof window === 'undefined') {
-    $generatorCommon = require('./generator-common');
-}
-
-// README.txt generation entry point.
-$generatorReadme = {};
-
-/**
- * Generate README.txt.
- *
- * @param res Resulting output with generated pom.
- * @returns {string} Generated content.
- */
-$generatorReadme.readme = function (res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    res.line('Content of this folder was generated by Apache Ignite Web Console');
-    res.line('=================================================================');
-
-    res.needEmptyLine = true;
-
-    res.line('Ignite ships with CacheJdbcPojoStore, which is out-of-the-box JDBC');
-    res.line('implementation of the IgniteCacheStore interface, and automatically');
-    res.line('handles all the write-through and read-through logic.');
-
-    res.needEmptyLine = true;
-
-    res.line('You can use generated configuration and POJO classes as part of your application.');
-
-    res.needEmptyLine = true;
-
-    res.line('Note, in case of using proprietary JDBC drivers (Oracle, IBM DB2, Microsoft SQL Server)');
-    res.line('you should download them and copy into ./jdbc-drivers folder.');
-
-    return res;
-};
-
-// For server side we should export properties generation entry point.
-if (typeof window === 'undefined') {
-    module.exports = $generatorReadme;
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/routes/generator/generator-xml.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/generator/generator-xml.js b/modules/control-center-web/src/main/js/routes/generator/generator-xml.js
deleted file mode 100644
index 38885c5..0000000
--- a/modules/control-center-web/src/main/js/routes/generator/generator-xml.js
+++ /dev/null
@@ -1,1493 +0,0 @@
-/*
- * 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.
- */
-
-// For server side we should load required libraries.
-if (typeof window === 'undefined') {
-    _ = require('lodash');
-
-    $commonUtils = require('../../helpers/common-utils');
-    $dataStructures = require('../../helpers/data-structures');
-    $generatorCommon = require('./generator-common');
-}
-
-// XML generation entry point.
-$generatorXml = {};
-
-// Do XML escape.
-$generatorXml.escape = function (s) {
-    if (typeof(s) != 'string')
-        return s;
-
-    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
-};
-
-// Add XML element.
-$generatorXml.element = function (res, tag, attr1, val1, attr2, val2) {
-    var elem = '<' + tag;
-
-    if (attr1)
-        elem += ' ' + attr1 + '="' + val1 + '"';
-
-    if (attr2)
-        elem += ' ' + attr2 + '="' + val2 + '"';
-
-    elem += '/>';
-
-    res.emptyLineIfNeeded();
-    res.line(elem);
-};
-
-// Add property.
-$generatorXml.property = function (res, obj, propName, setterName, dflt) {
-    if ($commonUtils.isDefined(obj)) {
-        var val = obj[propName];
-
-        if ($commonUtils.isDefinedAndNotEmpty(val)) {
-            var hasDflt = $commonUtils.isDefined(dflt);
-
-            // Add to result if no default provided or value not equals to default.
-            if (!hasDflt || (hasDflt && val != dflt)) {
-                $generatorXml.element(res, 'property', 'name', setterName ? setterName : propName, 'value', $generatorXml.escape(val));
-
-                return true;
-            }
-        }
-    }
-
-    return false;
-};
-
-// Add property for class name.
-$generatorXml.classNameProperty = function (res, obj, propName) {
-    var val = obj[propName];
-
-    if ($commonUtils.isDefined(val))
-        $generatorXml.element(res, 'property', 'name', propName, 'value', $dataStructures.fullClassName(val));
-};
-
-// Add list property.
-$generatorXml.listProperty = function (res, obj, propName, listType, rowFactory) {
-    var val = obj[propName];
-
-    if (val && val.length > 0) {
-        res.emptyLineIfNeeded();
-
-        if (!listType)
-            listType = 'list';
-
-        if (!rowFactory)
-            rowFactory = function (val) {
-                return '<value>' + $generatorXml.escape(val) + '</value>'
-            };
-
-        res.startBlock('<property name="' + propName + '">');
-        res.startBlock('<' + listType + '>');
-
-        _.forEach(val, function(v) {
-            res.line(rowFactory(v));
-        });
-
-        res.endBlock('</' + listType + '>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-};
-
-// Add array property
-$generatorXml.arrayProperty = function (res, obj, propName, descr, rowFactory) {
-    var val = obj[propName];
-
-    if (val && val.length > 0) {
-        res.emptyLineIfNeeded();
-
-        if (!rowFactory)
-            rowFactory = function (val) {
-                return '<bean class="' + val + '"/>';
-            };
-
-        res.startBlock('<property name="' + propName + '">');
-        res.startBlock('<list>');
-
-        _.forEach(val, function (v) {
-            res.append(rowFactory(v))
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-    }
-};
-
-// Add bean property.
-$generatorXml.beanProperty = function (res, bean, beanPropName, desc, createBeanAlthoughNoProps) {
-    var props = desc.fields;
-
-    if (bean && $commonUtils.hasProperty(bean, props)) {
-        res.startSafeBlock();
-
-        res.emptyLineIfNeeded();
-        res.startBlock('<property name="' + beanPropName + '">');
-        res.startBlock('<bean class="' + desc.className + '">');
-
-        var hasData = false;
-
-        _.forIn(props, function(descr, propName) {
-            if (props.hasOwnProperty(propName)) {
-                if (descr) {
-                    switch (descr.type) {
-                        case 'list':
-                            $generatorXml.listProperty(res, bean, propName, descr.setterName);
-
-                            break;
-
-                        case 'array':
-                            $generatorXml.arrayProperty(res, bean, propName, descr);
-
-                            break;
-
-                        case 'propertiesAsList':
-                            var val = bean[propName];
-
-                            if (val && val.length > 0) {
-                                res.startBlock('<property name="' + propName + '">');
-                                res.startBlock('<props>');
-
-                                _.forEach(val, function(nameAndValue) {
-                                    var eqIndex = nameAndValue.indexOf('=');
-                                    if (eqIndex >= 0) {
-                                        res.line('<prop key="' + $generatorXml.escape(nameAndValue.substring(0, eqIndex)) + '">' +
-                                            $generatorXml.escape(nameAndValue.substr(eqIndex + 1)) + '</prop>');
-                                    }
-                                });
-
-                                res.endBlock('</props>');
-                                res.endBlock('</property>');
-
-                                hasData = true;
-                            }
-
-                            break;
-
-                        case 'bean':
-                            if ($commonUtils.isDefinedAndNotEmpty(bean[propName])) {
-                                res.startBlock('<property name="' + propName + '">');
-                                res.line('<bean class="' + bean[propName] + '"/>');
-                                res.endBlock('</property>');
-
-                                hasData = true;
-                            }
-
-                            break;
-
-                        default:
-                            if ($generatorXml.property(res, bean, propName, descr.setterName, descr.dflt))
-                                hasData = true;
-                    }
-                }
-                else
-                    if ($generatorXml.property(res, bean, propName))
-                        hasData = true;
-            }
-        });
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-
-        if (!hasData)
-            res.rollbackSafeBlock();
-    }
-    else if (createBeanAlthoughNoProps) {
-        res.emptyLineIfNeeded();
-        res.line('<property name="' + beanPropName + '">');
-        res.line('    <bean class="' + desc.className + '"/>');
-        res.line('</property>');
-    }
-};
-
-// Generate eviction policy.
-$generatorXml.evictionPolicy = function (res, evtPlc, propName) {
-    if (evtPlc && evtPlc.kind) {
-        $generatorXml.beanProperty(res, evtPlc[evtPlc.kind.toUpperCase()], propName,
-            $generatorCommon.EVICTION_POLICIES[evtPlc.kind], true);
-    }
-};
-
-// Generate discovery.
-$generatorXml.clusterGeneral = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cluster, 'name', 'gridName');
-
-    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 d = cluster.discovery;
-
-        switch (d.kind) {
-            case 'Multicast':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">');
-
-                if (d.Multicast) {
-                    $generatorXml.property(res, d.Multicast, 'multicastGroup');
-                    $generatorXml.property(res, d.Multicast, 'multicastPort');
-                    $generatorXml.property(res, d.Multicast, 'responseWaitTime');
-                    $generatorXml.property(res, d.Multicast, 'addressRequestAttempts');
-                    $generatorXml.property(res, d.Multicast, 'localAddress');
-                    $generatorXml.listProperty(res, d.Multicast, 'addresses');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'Vm':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">');
-
-                if (d.Vm) {
-                    $generatorXml.listProperty(res, d.Vm, 'addresses');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'S3':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">');
-
-                if (d.S3) {
-                    if (d.S3.bucketName)
-                        res.line('<property name="bucketName" value="' + $generatorXml.escape(d.S3.bucketName) + '" />');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'Cloud':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder">');
-
-                if (d.Cloud) {
-                    $generatorXml.property(res, d.Cloud, 'credential');
-                    $generatorXml.property(res, d.Cloud, 'credentialPath');
-                    $generatorXml.property(res, d.Cloud, 'identity');
-                    $generatorXml.property(res, d.Cloud, 'provider');
-                    $generatorXml.listProperty(res, d.Cloud, 'regions');
-                    $generatorXml.listProperty(res, d.Cloud, 'zones');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'GoogleStorage':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder">');
-
-                if (d.GoogleStorage) {
-                    $generatorXml.property(res, d.GoogleStorage, 'projectName');
-                    $generatorXml.property(res, d.GoogleStorage, 'bucketName');
-                    $generatorXml.property(res, d.GoogleStorage, 'serviceAccountP12FilePath');
-                    $generatorXml.property(res, d.GoogleStorage, 'serviceAccountId');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'Jdbc':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder">');
-
-                if (d.Jdbc) {
-                    res.line('<property name="initSchema" value="' + ($commonUtils.isDefined(d.Jdbc.initSchema) && d.Jdbc.initSchema) + '"/>');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            case 'SharedFs':
-                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder">');
-
-                if (d.SharedFs) {
-                    $generatorXml.property(res, d.SharedFs, 'path');
-                }
-
-                res.endBlock('</bean>');
-
-                break;
-
-            default:
-                throw "Unknown discovery kind: " + d.kind;
-        }
-
-        res.endBlock('</property>');
-
-        $generatorXml.clusterDiscovery(d, res);
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate atomics group.
-$generatorXml.clusterAtomics = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    var atomics = cluster.atomicConfiguration;
-
-    if ($commonUtils.hasAtLeastOneProperty(atomics, ['cacheMode', 'atomicSequenceReserveSize', 'backups'])) {
-        res.startSafeBlock();
-
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="atomicConfiguration">');
-        res.startBlock('<bean class="org.apache.ignite.configuration.AtomicConfiguration">');
-
-        var cacheMode = atomics.cacheMode ? atomics.cacheMode : 'PARTITIONED';
-
-        var hasData = cacheMode != 'PARTITIONED';
-
-        $generatorXml.property(res, atomics, 'cacheMode');
-
-        hasData = $generatorXml.property(res, atomics, 'atomicSequenceReserveSize') || hasData;
-
-        if (cacheMode == 'PARTITIONED')
-            hasData = $generatorXml.property(res, atomics, 'backups') || hasData;
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-
-        if (!hasData)
-            res.rollbackSafeBlock();
-    }
-
-    return res;
-};
-
-// Generate communication group.
-$generatorXml.clusterCommunication = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.beanProperty(res, cluster.communication, 'communicationSpi', $generatorCommon.COMMUNICATION_CONFIGURATION);
-
-    $generatorXml.property(res, cluster, 'networkTimeout', undefined, 5000);
-    $generatorXml.property(res, cluster, 'networkSendRetryDelay', undefined, 1000);
-    $generatorXml.property(res, cluster, 'networkSendRetryCount', undefined, 3);
-    $generatorXml.property(res, cluster, 'segmentCheckFrequency');
-    $generatorXml.property(res, cluster, 'waitForSegmentOnStart', null, false);
-    $generatorXml.property(res, cluster, 'discoveryStartupDelay', undefined, 600000);
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-/**
- * XML generator for cluster's REST access configuration.
- *
- * @param cluster Cluster to get REST configuration.
- * @param res Optional configuration presentation builder object.
- * @returns Configuration presentation builder object
- */
-$generatorXml.clusterConnector = function(cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if ($commonUtils.isDefined(cluster.connector) && cluster.connector.enabled) {
-        var cfg = _.cloneDeep($generatorCommon.CONNECTOR_CONFIGURATION);
-
-        if (cluster.connector.sslEnabled) {
-            cfg.fields.sslClientAuth = {dflt: false};
-            cfg.fields.sslFactory = {type: 'bean'};
-        }
-
-        $generatorXml.beanProperty(res, cluster.connector, 'connectorConfiguration', cfg, true);
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate deployment group.
-$generatorXml.clusterDeployment = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if ($generatorXml.property(res, cluster, 'deploymentMode', null, 'SHARED'))
-        res.needEmptyLine = true;
-
-    var p2pEnabled = cluster.peerClassLoadingEnabled;
-
-    if ($commonUtils.isDefined(p2pEnabled)) {
-        $generatorXml.property(res, cluster, 'peerClassLoadingEnabled', null, false);
-
-        if (p2pEnabled) {
-            $generatorXml.property(res, cluster, 'peerClassLoadingMissedResourcesCacheSize');
-            $generatorXml.property(res, cluster, 'peerClassLoadingThreadPoolSize');
-            $generatorXml.listProperty(res, cluster, 'peerClassLoadingLocalClassPathExclude');
-        }
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate discovery group.
-$generatorXml.clusterDiscovery = function (disco, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, disco, 'localAddress');
-    $generatorXml.property(res, disco, 'localPort', undefined, 47500);
-    $generatorXml.property(res, disco, 'localPortRange', undefined, 100);
-    if ($commonUtils.isDefinedAndNotEmpty(disco.addressResolver))
-        $generatorXml.beanProperty(res, disco, 'addressResolver', {className: disco.addressResolver}, true);
-    $generatorXml.property(res, disco, 'socketTimeout', undefined, 5000);
-    $generatorXml.property(res, disco, 'ackTimeout', undefined, 5000);
-    $generatorXml.property(res, disco, 'maxAckTimeout', undefined, 600000);
-    $generatorXml.property(res, disco, 'discoNetworkTimeout', 'setNetworkTimeout', 5000);
-    $generatorXml.property(res, disco, 'joinTimeout', undefined, 0);
-    $generatorXml.property(res, disco, 'threadPriority', undefined, 10);
-    $generatorXml.property(res, disco, 'heartbeatFrequency', undefined, 2000);
-    $generatorXml.property(res, disco, 'maxMissedHeartbeats', undefined, 1);
-    $generatorXml.property(res, disco, 'maxMissedClientHeartbeats', undefined, 5);
-    $generatorXml.property(res, disco, 'topHistorySize', undefined, 100);
-    if ($commonUtils.isDefinedAndNotEmpty(disco.listener))
-        $generatorXml.beanProperty(res, disco, 'listener', {className: disco.listener}, true);
-    if ($commonUtils.isDefinedAndNotEmpty(disco.dataExchange))
-        $generatorXml.beanProperty(res, disco, 'dataExchange', {className: disco.dataExchange}, true);
-    if ($commonUtils.isDefinedAndNotEmpty(disco.metricsProvider))
-        $generatorXml.beanProperty(res, disco, 'metricsProvider', {className: disco.metricsProvider}, true);
-    $generatorXml.property(res, disco, 'reconnectCount', undefined, 10);
-    $generatorXml.property(res, disco, 'statisticsPrintFrequency', undefined, 0);
-    $generatorXml.property(res, disco, 'ipFinderCleanFrequency', undefined, 60000);
-    if ($commonUtils.isDefinedAndNotEmpty(disco.authenticator))
-        $generatorXml.beanProperty(res, disco, 'authenticator', {className: disco.authenticator}, true);
-    $generatorXml.property(res, disco, 'forceServerMode', undefined, false);
-    $generatorXml.property(res, disco, 'clientReconnectDisabled', undefined, false);
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate events group.
-$generatorXml.clusterEvents = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cluster.includeEventTypes && cluster.includeEventTypes.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="includeEventTypes">');
-
-        if (cluster.includeEventTypes.length == 1)
-            res.line('<util:constant static-field="org.apache.ignite.events.EventType.' + cluster.includeEventTypes[0] + '"/>');
-        else {
-            res.startBlock('<list>');
-
-            _.forEach(cluster.includeEventTypes, function(eventGroup, ix) {
-                if (ix > 0)
-                    res.line();
-
-                res.line('<!-- EventType.' + eventGroup + ' -->');
-
-                var eventList = $dataStructures.EVENT_GROUPS[eventGroup];
-
-                _.forEach(eventList, function(event) {
-                    res.line('<util:constant static-field="org.apache.ignite.events.EventType.' + event + '"/>')
-                });
-            });
-
-            res.endBlock('</list>');
-        }
-
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate marshaller group.
-$generatorXml.clusterMarshaller = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    var marshaller = cluster.marshaller;
-
-    if (marshaller && marshaller.kind) {
-        $generatorXml.beanProperty(res, marshaller[marshaller.kind], 'marshaller', $generatorCommon.MARSHALLERS[marshaller.kind], true);
-
-        res.needEmptyLine = true;
-    }
-
-    $generatorXml.property(res, cluster, 'marshalLocalJobs', null, false);
-    $generatorXml.property(res, cluster, 'marshallerCacheKeepAliveTime');
-    $generatorXml.property(res, cluster, 'marshallerCacheThreadPoolSize');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate metrics group.
-$generatorXml.clusterMetrics = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cluster, 'metricsExpireTime');
-    $generatorXml.property(res, cluster, 'metricsHistorySize');
-    $generatorXml.property(res, cluster, 'metricsLogFrequency');
-    $generatorXml.property(res, cluster, 'metricsUpdateFrequency');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate swap group.
-$generatorXml.clusterSwap = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cluster.swapSpaceSpi && cluster.swapSpaceSpi.kind == 'FileSwapSpaceSpi') {
-        $generatorXml.beanProperty(res, cluster.swapSpaceSpi.FileSwapSpaceSpi, 'swapSpaceSpi',
-            $generatorCommon.SWAP_SPACE_SPI, true);
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate time group.
-$generatorXml.clusterTime = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cluster, 'clockSyncSamples');
-    $generatorXml.property(res, cluster, 'clockSyncFrequency');
-    $generatorXml.property(res, cluster, 'timeServerPortBase');
-    $generatorXml.property(res, cluster, 'timeServerPortRange');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate thread pools group.
-$generatorXml.clusterPools = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cluster, 'publicThreadPoolSize');
-    $generatorXml.property(res, cluster, 'systemThreadPoolSize');
-    $generatorXml.property(res, cluster, 'managementThreadPoolSize');
-    $generatorXml.property(res, cluster, 'igfsThreadPoolSize');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate transactions group.
-$generatorXml.clusterTransactions = function (cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.beanProperty(res, cluster.transactionConfiguration, 'transactionConfiguration', $generatorCommon.TRANSACTION_CONFIGURATION);
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-/**
- * XML generator for cluster's SSL configuration.
- *
- * @param cluster Cluster to get SSL configuration.
- * @param res Optional configuration presentation builder object.
- * @returns Configuration presentation builder object
- */
-$generatorXml.clusterSsl = function(cluster, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cluster.sslEnabled && $commonUtils.isDefined(cluster.sslContextFactory)) {
-        cluster.sslContextFactory.keyStorePassword =
-            $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.keyStoreFilePath) ? '${ssl.key.storage.password}' : undefined;
-
-        cluster.sslContextFactory.trustStorePassword =
-            $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.trustStoreFilePath) ? '${ssl.trust.storage.password}' : undefined;
-
-        var propsDesc = $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.trustManagers) ?
-            $generatorCommon.SSL_CONFIGURATION_TRUST_MANAGER_FACTORY :
-            $generatorCommon.SSL_CONFIGURATION_TRUST_FILE_FACTORY;
-
-        $generatorXml.beanProperty(res, cluster.sslContextFactory, 'sslContextFactory', propsDesc, true);
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate cache general group.
-$generatorXml.cacheGeneral = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cache, 'name');
-
-    $generatorXml.property(res, cache, 'cacheMode');
-    $generatorXml.property(res, cache, 'atomicityMode');
-
-    if (cache.cacheMode == 'PARTITIONED')
-        $generatorXml.property(res, cache, 'backups');
-
-    $generatorXml.property(res, cache, 'readFromBackup');
-    $generatorXml.property(res, cache, 'copyOnRead');
-    $generatorXml.property(res, cache, 'invalidate');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache memory group.
-$generatorXml.cacheMemory = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cache, 'memoryMode');
-    $generatorXml.property(res, cache, 'offHeapMaxMemory');
-
-    res.needEmptyLine = true;
-
-    $generatorXml.evictionPolicy(res, cache.evictionPolicy, 'evictionPolicy');
-
-    res.needEmptyLine = true;
-
-    $generatorXml.property(res, cache, 'swapEnabled');
-    $generatorXml.property(res, cache, 'startSize');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache query & indexing group.
-$generatorXml.cacheQuery = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cache, 'sqlOnheapRowCacheSize');
-    $generatorXml.property(res, cache, 'longQueryWarningTimeout');
-
-    if (cache.indexedTypes && cache.indexedTypes.length > 0) {
-        res.startBlock('<property name="indexedTypes">');
-        res.startBlock('<list>');
-
-        _.forEach(cache.indexedTypes, function(pair) {
-            res.line('<value>' + $dataStructures.fullClassName(pair.keyClass) + '</value>');
-            res.line('<value>' + $dataStructures.fullClassName(pair.valueClass) + '</value>');
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    $generatorXml.listProperty(res, cache, 'sqlFunctionClasses');
-
-    $generatorXml.property(res, cache, 'sqlEscapeAll');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache store group.
-$generatorXml.cacheStore = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind) {
-        var factoryKind = cache.cacheStoreFactory.kind;
-
-        var storeFactory = cache.cacheStoreFactory[factoryKind];
-
-        if (storeFactory) {
-            if (factoryKind == 'CacheJdbcPojoStoreFactory') {
-                res.startBlock('<property name="cacheStoreFactory">');
-                res.startBlock('<bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory">');
-                res.startBlock('<property name="configuration">');
-                res.startBlock('<bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreConfiguration">');
-
-                $generatorXml.property(res, storeFactory, 'dataSourceBean');
-
-                res.startBlock('<property name="dialect">');
-                res.line('<bean class="' + $generatorCommon.jdbcDialectClassName(storeFactory.dialect) + '"/>');
-                res.endBlock('</property>');
-
-                var metadatas = cache.metadatas;
-
-                if (metadatas && metadatas.length > 0) {
-                    res.startBlock('<property name="types">');
-                    res.startBlock('<list>');
-
-                    _.forEach(metadatas, function (meta) {
-                        res.startBlock('<bean class="org.apache.ignite.cache.store.jdbc.JdbcType">');
-
-                        $generatorXml.classNameProperty(res, meta, 'keyType');
-                        $generatorXml.property(res, meta, 'valueType');
-                        $generatorXml.property(res, meta, 'keepSerialized', null, null, false);
-
-                        res.endBlock('</bean>');
-                    });
-
-                    res.endBlock('</list>');
-                    res.endBlock('</property>');
-                }
-
-                res.endBlock('</bean>');
-                res.endBlock("</property>");
-                res.endBlock('</bean>');
-                res.endBlock("</property>")
-            }
-            else {
-                $generatorXml.beanProperty(res, storeFactory, 'cacheStoreFactory', $generatorCommon.STORE_FACTORIES[factoryKind], true);
-
-                if (storeFactory.dialect) {
-                    if (_.findIndex(res.datasources, function (ds) {
-                            return ds.dataSourceBean == storeFactory.dataSourceBean;
-                        }) < 0) {
-                        res.datasources.push({
-                            dataSourceBean: storeFactory.dataSourceBean,
-                            className: $generatorCommon.DATA_SOURCES[storeFactory.dialect],
-                            dialect: storeFactory.dialect
-                        });
-                    }
-                }
-            }
-
-            res.needEmptyLine = true;
-        }
-    }
-
-    $generatorXml.property(res, cache, 'loadPreviousValue');
-    $generatorXml.property(res, cache, 'readThrough');
-    $generatorXml.property(res, cache, 'writeThrough');
-
-    res.needEmptyLine = true;
-
-    $generatorXml.property(res, cache, 'writeBehindEnabled');
-    $generatorXml.property(res, cache, 'writeBehindBatchSize');
-    $generatorXml.property(res, cache, 'writeBehindFlushSize');
-    $generatorXml.property(res, cache, 'writeBehindFlushFrequency');
-    $generatorXml.property(res, cache, 'writeBehindFlushThreadCount');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache concurrency group.
-$generatorXml.cacheConcurrency = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cache, 'maxConcurrentAsyncOperations');
-    $generatorXml.property(res, cache, 'defaultLockTimeout');
-    $generatorXml.property(res, cache, 'atomicWriteOrderMode');
-    $generatorXml.property(res, cache, 'writeSynchronizationMode');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache rebalance group.
-$generatorXml.cacheRebalance = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cache.cacheMode != 'LOCAL') {
-        $generatorXml.property(res, cache, 'rebalanceMode');
-        $generatorXml.property(res, cache, 'rebalanceThreadPoolSize');
-        $generatorXml.property(res, cache, 'rebalanceBatchSize');
-        $generatorXml.property(res, cache, 'rebalanceOrder');
-        $generatorXml.property(res, cache, 'rebalanceDelay');
-        $generatorXml.property(res, cache, 'rebalanceTimeout');
-        $generatorXml.property(res, cache, 'rebalanceThrottle');
-
-        res.needEmptyLine = true;
-    }
-
-    if (cache.igfsAffinnityGroupSize) {
-        res.startBlock('<property name="affinityMapper">');
-        res.startBlock('<bean class="org.apache.ignite.igfs.IgfsGroupDataBlocksKeyMapper">');
-        res.line('<constructor-arg value="' + cache.igfsAffinnityGroupSize + '"/>');
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-    }
-
-    return res;
-};
-
-// Generate cache server near cache group.
-$generatorXml.cacheServerNearCache = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (cache.cacheMode == 'PARTITIONED' && cache.nearCacheEnabled) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="nearConfiguration">');
-        res.startBlock('<bean class="org.apache.ignite.configuration.NearCacheConfiguration">');
-
-        if (cache.nearConfiguration) {
-            if (cache.nearConfiguration.nearStartSize)
-                $generatorXml.property(res, cache.nearConfiguration, 'nearStartSize');
-
-
-            $generatorXml.evictionPolicy(res, cache.nearConfiguration.nearEvictionPolicy, 'nearEvictionPolicy');
-        }
-
-
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-    }
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache statistics group.
-$generatorXml.cacheStatistics = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, cache, 'statisticsEnabled');
-    $generatorXml.property(res, cache, 'managementEnabled');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate metadata query fields.
-$generatorXml.metadataQueryFields = function (res, meta) {
-    var fields = meta.fields;
-
-    if (fields && fields.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="fields">');
-        res.startBlock('<map>');
-
-        _.forEach(fields, function (field) {
-            $generatorXml.element(res, 'entry', 'key', field.name.toUpperCase(), 'value', $dataStructures.fullClassName(field.className));
-        });
-
-        res.endBlock('</map>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-};
-
-// Generate metadata query fields.
-$generatorXml.metadataQueryAliases = function (res, meta) {
-    var aliases = meta.aliases;
-
-    if (aliases && aliases.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="aliases">');
-        res.startBlock('<map>');
-
-        _.forEach(aliases, function (alias) {
-            $generatorXml.element(res, 'entry', 'key', alias.field, 'value', alias.alias);
-        });
-
-        res.endBlock('</map>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-};
-
-// Generate metadata indexes.
-$generatorXml.metadataQueryIndexes = function (res, meta) {
-    var indexes = meta.indexes;
-
-    if (indexes && indexes.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="indexes">');
-        res.startBlock('<list>');
-
-        _.forEach(indexes, function (index) {
-            res.startBlock('<bean class="org.apache.ignite.cache.store.QueryEntityIndex">');
-
-            $generatorXml.property(res, index, 'name');
-            $generatorXml.property(res, index, 'type');
-
-            var fields = index.fields;
-
-            if (fields && fields.length > 0) {
-                res.startBlock('<property name="fields">');
-                res.startBlock('<map>');
-
-                _.forEach(fields, function (field) {
-                    $generatorXml.element(res, 'entry', 'key', field.name, 'value', field.direction);
-                });
-
-                res.endBlock('</map>');
-                res.endBlock('</property>');
-            }
-
-            res.endBlock('</bean>');
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-};
-
-// Generate metadata db fields.
-$generatorXml.metadataDatabaseFields = function (res, meta, fieldProp) {
-    var fields = meta[fieldProp];
-
-    if (fields && fields.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="' + fieldProp + '">');
-
-        res.startBlock('<list>');
-
-        _.forEach(fields, function (field) {
-            res.startBlock('<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">');
-
-            $generatorXml.property(res, field, 'databaseName');
-
-            res.startBlock('<property name="databaseType">');
-            res.line('<util:constant static-field="java.sql.Types.' + field.databaseType + '"/>');
-            res.endBlock('</property>');
-
-            $generatorXml.property(res, field, 'javaName');
-
-            $generatorXml.classNameProperty(res, field, 'javaType');
-
-            res.endBlock('</bean>');
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-};
-
-// Generate metadata general group.
-$generatorXml.metadataGeneral = function(meta, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.classNameProperty(res, meta, 'keyType');
-    $generatorXml.property(res, meta, 'valueType');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate metadata for query group.
-$generatorXml.metadataQuery = function(meta, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.metadataQueryFields(res, meta);
-
-    $generatorXml.metadataQueryAliases(res, meta);
-
-    $generatorXml.metadataQueryIndexes(res, meta);
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate metadata for store group.
-$generatorXml.metadataStore = function(meta, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, meta, 'databaseSchema');
-    $generatorXml.property(res, meta, 'databaseTable');
-    $generatorXml.property(res, meta, 'keepSerialized');
-
-    res.needEmptyLine = true;
-
-    if (!$dataStructures.isJavaBuildInClass(meta.keyType))
-        $generatorXml.metadataDatabaseFields(res, meta, 'keyFields');
-
-    $generatorXml.metadataDatabaseFields(res, meta, 'valueFields');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-$generatorXml.cacheQueryMetadata = function(meta, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    res.startBlock('<bean class="org.apache.ignite.cache.store.QueryEntity">');
-
-    $generatorXml.classNameProperty(res, meta, 'keyType');
-    $generatorXml.property(res, meta, 'valueType');
-
-    $generatorXml.metadataQuery(meta, res);
-
-    res.endBlock('</bean>');
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-// Generate cache type metadata configs.
-$generatorXml.cacheMetadatas = function(metadatas, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (metadatas && metadatas.length > 0) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="queryEntities">');
-        res.startBlock('<list>');
-
-        _.forEach(metadatas, function (meta) {
-            $generatorXml.cacheQueryMetadata(meta, res);
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-    }
-
-    return res;
-};
-
-// Generate cache configs.
-$generatorXml.cache = function(cache, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    res.startBlock('<bean class="org.apache.ignite.configuration.CacheConfiguration">');
-
-    $generatorXml.cacheGeneral(cache, res);
-
-    $generatorXml.cacheMemory(cache, res);
-
-    $generatorXml.cacheQuery(cache, res);
-
-    $generatorXml.cacheStore(cache, res);
-
-    $generatorXml.cacheConcurrency(cache, res);
-
-    $generatorXml.cacheRebalance(cache, res);
-
-    $generatorXml.cacheServerNearCache(cache, res);
-
-    $generatorXml.cacheStatistics(cache, res);
-
-    $generatorXml.cacheMetadatas(cache.metadatas, res);
-
-    res.endBlock('</bean>');
-
-    return res;
-};
-
-// Generate caches configs.
-$generatorXml.clusterCaches = function(caches, igfss, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if ((caches && caches.length > 0) || (igfss && igfss.length > 0)) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="cacheConfiguration">');
-        res.startBlock('<list>');
-
-        _.forEach(caches, function(cache) {
-            $generatorXml.cache(cache, res);
-
-            res.needEmptyLine = true;
-        });
-
-        _.forEach(igfss, function(igfs) {
-            $generatorXml.cache($generatorCommon.igfsDataCache(igfs), res);
-
-            res.needEmptyLine = true;
-
-            $generatorXml.cache($generatorCommon.igfsMetaCache(igfs), res);
-
-            res.needEmptyLine = true;
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate IGFSs configs.
-$generatorXml.igfss = function(igfss, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if ($commonUtils.isDefinedAndNotEmpty(igfss)) {
-        res.emptyLineIfNeeded();
-
-        res.startBlock('<property name="fileSystemConfiguration">');
-        res.startBlock('<list>');
-
-        _.forEach(igfss, function(igfs) {
-            res.startBlock('<bean class="org.apache.ignite.configuration.FileSystemConfiguration">');
-
-            $generatorXml.igfsGeneral(igfs, res);
-            $generatorXml.igfsIPC(igfs, res);
-            $generatorXml.igfsFragmentizer(igfs, res);
-            $generatorXml.igfsDualMode(igfs, res);
-            $generatorXml.igfsSecondFS(igfs, res);
-            $generatorXml.igfsMisc(igfs, res);
-
-            res.endBlock('</bean>');
-
-            res.needEmptyLine = true;
-        });
-
-        res.endBlock('</list>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate IGFS IPC configuration.
-$generatorXml.igfsIPC = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (igfs.ipcEndpointEnabled) {
-        $generatorXml.beanProperty(res, igfs.ipcEndpointConfiguration, 'ipcEndpointConfiguration', $generatorCommon.IGFS_IPC_CONFIGURATION, true);
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate IGFS fragmentizer configuration.
-$generatorXml.igfsFragmentizer = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (igfs.fragmentizerEnabled) {
-        $generatorXml.property(res, igfs, 'fragmentizerConcurrentFiles', undefined, 0);
-        $generatorXml.property(res, igfs, 'fragmentizerThrottlingBlockLength', undefined, 16777216);
-        $generatorXml.property(res, igfs, 'fragmentizerThrottlingDelay', undefined, 200);
-
-        res.needEmptyLine = true;
-    }
-    else
-        $generatorXml.property(res, igfs, 'fragmentizerEnabled');
-
-    return res;
-};
-
-// Generate IGFS dual mode configuration.
-$generatorXml.igfsDualMode = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, igfs, 'dualModeMaxPendingPutsSize', undefined, 0);
-
-    if ($commonUtils.isDefinedAndNotEmpty(igfs.dualModePutExecutorService)) {
-        res.startBlock('<property name="dualModePutExecutorService">');
-        res.line('<bean class="' + igfs.dualModePutExecutorService + '"/>');
-        res.endBlock('</property>');
-    }
-
-    $generatorXml.property(res, igfs, 'dualModePutExecutorServiceShutdown', undefined, false);
-
-    res.needEmptyLine = true;
-
-    return res;
-};
-
-$generatorXml.igfsSecondFS = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if (igfs.secondaryFileSystemEnabled) {
-        var secondFs = igfs.secondaryFileSystem || {};
-
-        res.startBlock('<property name="secondaryFileSystem">');
-
-        res.startBlock('<bean class="org.apache.ignite.hadoop.fs.IgniteHadoopIgfsSecondaryFileSystem">');
-
-        var nameDefined = $commonUtils.isDefinedAndNotEmpty(secondFs.userName);
-        var cfgDefined = $commonUtils.isDefinedAndNotEmpty(secondFs.cfgPath);
-
-        if ($commonUtils.isDefinedAndNotEmpty(secondFs.uri))
-            res.line('<constructor-arg index="0" value="' + secondFs.uri + '"/>');
-        else {
-            res.startBlock('<constructor-arg index="0">');
-            res.line('<null/>');
-            res.endBlock('</constructor-arg>');
-        }
-
-        if (cfgDefined || nameDefined) {
-            if (cfgDefined)
-                res.line('<constructor-arg index="1" value="' + secondFs.cfgPath + '"/>');
-            else {
-                res.startBlock('<constructor-arg index="1">');
-                res.line('<null/>');
-                res.endBlock('</constructor-arg>');
-            }
-        }
-
-        if ($commonUtils.isDefinedAndNotEmpty(secondFs.userName))
-            res.line('<constructor-arg index="2" value="' + secondFs.userName + '"/>');
-
-        res.endBlock('</bean>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate IGFS general configuration.
-$generatorXml.igfsGeneral = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    if ($commonUtils.isDefinedAndNotEmpty(igfs.name)) {
-        igfs.dataCacheName = $generatorCommon.igfsDataCache(igfs).name;
-        igfs.metaCacheName = $generatorCommon.igfsMetaCache(igfs).name;
-
-        $generatorXml.property(res, igfs, 'name');
-        $generatorXml.property(res, igfs, 'dataCacheName');
-        $generatorXml.property(res, igfs, 'metaCacheName');
-
-        res.needEmptyLine = true;
-    }
-
-    return res;
-};
-
-// Generate IGFS misc configuration.
-$generatorXml.igfsMisc = function(igfs, res) {
-    if (!res)
-        res = $generatorCommon.builder();
-
-    $generatorXml.property(res, igfs, 'blockSize', undefined, 65536);
-    $generatorXml.property(res, igfs, 'streamBufferSize', undefined, 65536);
-    $generatorXml.property(res, igfs, 'defaultMode', undefined, "DUAL_ASYNC");
-    $generatorXml.property(res, igfs, 'maxSpaceSize', undefined, 0);
-    $generatorXml.property(res, igfs, 'maximumTaskRangeLength', undefined, 0);
-    $generatorXml.property(res, igfs, 'managementPort', undefined, 11400);
-
-    res.needEmptyLine = true;
-
-    if (igfs.pathModes && igfs.pathModes.length > 0) {
-        res.startBlock('<property name="pathModes">');
-        res.startBlock('<map>');
-
-        _.forEach(igfs.pathModes, function(pair) {
-            res.line('<entry key="' + pair.path + '" value="' + pair.mode + '"/>');
-        });
-
-        res.endBlock('</map>');
-        res.endBlock('</property>');
-
-        res.needEmptyLine = true;
-    }
-
-    $generatorXml.property(res, igfs, 'perNodeBatchSize', undefined, 100);
-    $generatorXml.property(res, igfs, 'perNodeParallelBatchCount', undefined, 8);
-    $generatorXml.property(res, igfs, 'prefetchBlocks', undefined, 0);
-    $generatorXml.property(res, igfs, 'sequentialReadsBeforePrefetch', undefined, 0);
-    $generatorXml.property(res, igfs, 'trashPurgeTimeout', undefined, 1000);
-
-    return res;
-};
-
-// Generate cluster config.
-$generatorXml.cluster = function (cluster, clientNearCfg) {
-    if (cluster) {
-        var res = $generatorCommon.builder();
-
-        res.deep = 1;
-
-        if (clientNearCfg) {
-            res.startBlock('<bean id="nearCacheBean" class="org.apache.ignite.configuration.NearCacheConfiguration">');
-
-            if (clientNearCfg.nearStartSize)
-                $generatorXml.property(res, clientNearCfg, 'nearStartSize');
-
-            if (clientNearCfg.nearEvictionPolicy && clientNearCfg.nearEvictionPolicy.kind)
-                $generatorXml.evictionPolicy(res, clientNearCfg.nearEvictionPolicy, 'nearEvictionPolicy');
-
-            res.endBlock('</bean>');
-
-            res.line();
-        }
-
-        // Generate Ignite Configuration.
-        res.startBlock('<bean class="org.apache.ignite.configuration.IgniteConfiguration">');
-
-        if (clientNearCfg) {
-            res.line('<property name="clientMode" value="true" />');
-
-            res.line();
-        }
-
-        $generatorXml.clusterGeneral(cluster, res);
-
-        $generatorXml.clusterAtomics(cluster, res);
-
-        $generatorXml.clusterCommunication(cluster, res);
-
-        $generatorXml.clusterConnector(cluster, res);
-
-        $generatorXml.clusterDeployment(cluster, res);
-
-        $generatorXml.clusterEvents(cluster, res);
-
-        $generatorXml.clusterMarshaller(cluster, res);
-
-        $generatorXml.clusterMetrics(cluster, res);
-
-        $generatorXml.clusterSwap(cluster, res);
-
-        $generatorXml.clusterTime(cluster, res);
-
-        $generatorXml.clusterPools(cluster, res);
-
-        $generatorXml.clusterTransactions(cluster, res);
-
-        $generatorXml.clusterCaches(cluster.caches, cluster.igfss, res);
-
-        $generatorXml.clusterSsl(cluster, res);
-
-        $generatorXml.igfss(cluster.igfss, res);
-
-        res.endBlock('</bean>');
-
-        // Build final XML:
-        // 1. Add header.
-        var xml = '<?xml version="1.0" encoding="UTF-8"?>\n\n';
-
-        xml += '<!-- ' + $generatorCommon.mainComment() + ' -->\n';
-        xml += '<beans xmlns="http://www.springframework.org/schema/beans"\n';
-        xml += '       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n';
-        xml += '       xmlns:util="http://www.springframework.org/schema/util"\n';
-        xml += '       xsi:schemaLocation="http://www.springframework.org/schema/beans\n';
-        xml += '                           http://www.springframework.org/schema/beans/spring-beans.xsd\n';
-        xml += '                           http://www.springframework.org/schema/util\n';
-        xml += '                           http://www.springframework.org/schema/util/spring-util.xsd">\n';
-
-        // 2. Add external property file
-        if (res.datasources.length > 0 || cluster.sslEnabled) {
-            xml += '    <!-- Load external properties file. -->\n';
-            xml += '    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">\n';
-            xml += '        <property name="location" value="classpath:secret.properties"/>\n';
-            xml += '    </bean>\n\n';
-        }
-
-        // 3. Add data sources.
-        if (res.datasources.length > 0) {
-            xml += '    <!-- Data source beans will be initialized from external properties file. -->\n';
-
-            _.forEach(res.datasources, function (item) {
-                var beanId = item.dataSourceBean;
-
-                xml += '    <bean id="' + beanId + '" class="' + item.className + '">\n';
-                switch (item.dialect) {
-                    case 'DB2':
-                        xml += '        <property name="serverName" value="${' + beanId + '.jdbc.server_name}" />\n';
-                        xml += '        <property name="portNumber" value="${' + beanId + '.jdbc.port_number}" />\n';
-                        xml += '        <property name="databaseName" value="${' + beanId + '.jdbc.database_name}" />\n';
-                        xml += '        <property name="driverType" value="${' + beanId + '.jdbc.driver_type}" />\n';
-                        break;
-
-                    default:
-                        xml += '        <property name="URL" value="${' + beanId + '.jdbc.url}" />\n';
-                }
-
-                xml += '        <property name="user" value="${' + beanId + '.jdbc.username}" />\n';
-                xml += '        <property name="password" value="${' + beanId + '.jdbc.password}" />\n';
-                xml += '    </bean>\n\n';
-            });
-        }
-
-        // 3. Add main content.
-        xml += res.asString();
-
-        // 4. Add footer.
-        xml += '\n</beans>';
-
-        return xml;
-    }
-
-    return '';
-};
-
-// For server side we should export XML generation entry point.
-if (typeof window === 'undefined') {
-    module.exports = $generatorXml;
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/routes/metadata.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/metadata.js b/modules/control-center-web/src/main/js/routes/metadata.js
index f714e12..09d67f4 100644
--- a/modules/control-center-web/src/main/js/routes/metadata.js
+++ b/modules/control-center-web/src/main/js/routes/metadata.js
@@ -16,6 +16,7 @@
  */
 
 var async = require('async');
+var _ = require('lodash');
 var router = require('express').Router();
 var db = require('../db');
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/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 ee39181..0d8f4ce 100644
--- a/modules/control-center-web/src/main/js/routes/summary.js
+++ b/modules/control-center-web/src/main/js/routes/summary.js
@@ -14,18 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-var db = require('../db');
-
 var router = require('express').Router();
 
-var $generatorXml = require('./generator/generator-xml');
-var $generatorJava = require('./generator/generator-java');
-var $generatorDocker = require('./generator/generator-docker');
-var $generatorProperties = require('./generator/generator-properties');
-var $generatorPom = require('./generator/generator-pom');
-var $generatorReadme = require('./generator/generator-readme');
-
 // GET template for summary tabs.
 router.get('/summary-tabs', function (req, res) {
     res.render('configuration/summary-tabs', {});
@@ -36,61 +26,4 @@ router.get('/', function (req, res) {
     res.render('configuration/summary');
 });
 
-router.post('/download', function (req, res) {
-    // Get cluster with all inner objects (caches, metadata).
-    db.Cluster.findById(req.body._id).deepPopulate('caches caches.metadatas igfss').exec(function (err, cluster) {
-        if (err)
-            return res.status(500).send(err.message);
-
-        if (!cluster)
-            return res.sendStatus(404);
-
-        var clientNearConfiguration = JSON.parse(req.body.clientNearConfiguration);
-
-        var JSZip = require('jszip');
-
-        var zip = new JSZip();
-
-        // Set the archive name.
-        res.attachment(cluster.name + '-configuration.zip');
-
-        var builder = $generatorProperties.sslProperties(cluster);
-
-        zip.file('Dockerfile', $generatorDocker.clusterDocker(cluster, req.body.os));
-
-        builder = $generatorProperties.dataSourcesProperties(cluster, builder);
-
-        if (builder)
-            zip.file('src/main/resources/secret.properties', builder.asString());
-
-        var srcPath = 'src/main/java/';
-
-        zip.file('config/' + cluster.name + '-server.xml', $generatorXml.cluster(cluster));
-        zip.file('config/' + cluster.name + '-client.xml', $generatorXml.cluster(cluster, clientNearConfiguration));
-        zip.file(srcPath + 'ServerConfigurationFactory.java', $generatorJava.cluster(cluster, 'ServerConfigurationFactory'));
-        zip.file(srcPath + 'ClientConfigurationFactory.java', $generatorJava.cluster(cluster, 'ClientConfigurationFactory', clientNearConfiguration));
-        zip.file('pom.xml', $generatorPom.pom(cluster.caches, '1.5.0').asString());
-
-        zip.file('README.txt', $generatorReadme.readme().asString());
-        zip.file('jdbc-drivers/README.txt', 'Copy proprietary JDBC drivers to this folder.');
-
-        $generatorJava.pojos(cluster.caches, req.body.useConstructor, req.body.includeKeyFields);
-
-        var metadatas = $generatorJava.metadatas;
-
-        for (var metaIx = 0; metaIx < metadatas.length; metaIx ++) {
-            var meta = metadatas[metaIx];
-
-            if (meta.keyClass)
-                zip.file(srcPath + meta.keyType.replace(/\./g, '/') + '.java', meta.keyClass);
-
-            zip.file(srcPath + meta.valueType.replace(/\./g, '/') + '.java', meta.valueClass);
-        }
-
-        var buffer = zip.generate({type:"nodebuffer"});
-
-        res.send(buffer);
-    });
-});
-
 module.exports = router;

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
index 2208d89..a486f9f 100644
--- a/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/sidebar.jade
@@ -21,9 +21,9 @@ append scripts
     script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-java.js')
 
     script(src='/data-structures.js')
-    script(src='/generator-common.js')
-    script(src='/generator-xml.js')
-    script(src='/generator-java.js')
+    script(src='/generator/generator-common.js')
+    script(src='/generator/generator-xml.js')
+    script(src='/generator/generator-java.js')
 
 mixin sidebar-item(ref, num, txt)
     li

http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/views/configuration/summary.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/configuration/summary.jade b/modules/control-center-web/src/main/js/views/configuration/summary.jade
index 51b7493..a812376 100644
--- a/modules/control-center-web/src/main/js/views/configuration/summary.jade
+++ b/modules/control-center-web/src/main/js/views/configuration/summary.jade
@@ -19,7 +19,14 @@ extends sidebar
 append scripts
     script(src='//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-dockerfile.js')
 
-    script(src='/generator-docker.js')
+    script(src='/js/jszip.min.js')
+    script(src='/js/FileSaver.min.js')
+    script(src='/js/Blob.js')
+
+    script(src='/generator/generator-docker.js')
+    script(src='/generator/generator-properties.js')
+    script(src='/generator/generator-pom.js')
+    script(src='/generator/generator-readme.js')
     script(src='/summary-controller.js')
 
 include ../includes/controls
@@ -57,13 +64,7 @@ block content
             a(href='clusters') here.
         +main-table('Clusters:', 'clusters', 'clusterName', 'selectItem(row)', '{{$index + 1}}) {{row.name}}')
         .padding-top-dflt(bs-affix)
-            form.panel-tip-container(data-placement='bottom' bs-tooltip data-title='Download configuration' method='post' action='summary/download')
-                input(type='hidden' name='_id' value='{{selectedItem._id}}')
-                input(type='hidden' name='os' value='{{os}}')
-                input(type='hidden' name='clientNearConfiguration' value='{{backupItem.nearConfiguration}}')
-                input(type='hidden' name='useConstructor' value='{{configServer.useConstructor}}')
-                input(type='hidden' name='includeKeyFields' value='{{configServer.includeKeyFields}}')
-                button.btn.btn-primary(id='download' type='submit' ng-click='$event.stopPropagation()') Download
+            button.btn.btn-primary(id='download' ng-click='downloadConfiguration()' bs-tooltip data-title='Download configuration' data-placement='bottom') Download
             hr
         div(ng-show='selectedItem && tableVisibleRow(displayedRows, selectedItem)' role='tab')
             .panel-group(bs-collapse ng-init='panels.activePanels=[0,1]' ng-model='panels.activePanels' data-allow-multiple='true')


Mime
View raw message