You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/11/10 07:57:47 UTC
[5/7] ignite git commit: IGNITE-1857 Generate configuration zip on
client side.
http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-java.js b/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
new file mode 100644
index 0000000..cda5db7
--- /dev/null
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
@@ -0,0 +1,1941 @@
+/*
+ * 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.
+ */
+
+// Java generation entry point.
+$generatorJava = {};
+
+/**
+ * Translate some value to valid java code.
+ *
+ * @param val Value to convert.
+ * @param type Value type.
+ * @returns {*} String with value that will be valid for java.
+ */
+$generatorJava.toJavaCode = function (val, type) {
+ if (val == null)
+ return 'null';
+
+ if (type == 'raw')
+ return val;
+
+ if (type == 'class')
+ return val + '.class';
+
+ if (type == 'float')
+ return val + 'f';
+
+ if (type == 'path')
+ return '"' + val.replace(/\\/g, '\\\\') + '"';
+
+ 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 + ')';
+};
+
+/**
+ * @param propName Property name.
+ * @param setterName Optional concrete setter name.
+ * @returns Property setter with name by java conventions.
+ */
+$generatorJava.setterName = function (propName, setterName) {
+ return setterName ? setterName : $commonUtils.toJavaName('set', propName);
+};
+
+/**
+ * Add variable declaration.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param varFullType Variable full class name to be added to imports.
+ * @param varFullActualType Variable actual full class name to be added to imports.
+ * @param varFullGenericType1 Optional full class name of first generic.
+ * @param varFullGenericType2 Optional full class name of second generic.
+ */
+$generatorJava.declareVariable = function (res, varName, varFullType, varFullActualType, varFullGenericType1, varFullGenericType2) {
+ res.emptyLineIfNeeded();
+
+ var varType = res.importClass(varFullType);
+
+ var varNew = !res.vars[varName];
+
+ if (varNew)
+ res.vars[varName] = true;
+
+ if (varFullActualType && varFullGenericType1) {
+ var varActualType = res.importClass(varFullActualType);
+ var varGenericType1 = res.importClass(varFullGenericType1);
+
+ if (varFullGenericType2)
+ var varGenericType2 = res.importClass(varFullGenericType2);
+
+ res.line((varNew ? (varType + '<' + varGenericType1 + (varGenericType2 ? ', ' + varGenericType2 : '') + '> ') : '') + varName + ' = new ' + varActualType + '<>();');
+ }
+ else
+ res.line((varNew ? (varType + ' ') : '') + varName + ' = new ' + varType + '();');
+
+ res.needEmptyLine = true;
+};
+
+/**
+ * Add property via setter / property name.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param obj Source object with data.
+ * @param propName Property name to take from source object.
+ * @param dataType Optional info about property data type.
+ * @param setterName Optional special setter name.
+ * @param dflt Optional default value.
+ */
+$generatorJava.property = function (res, varName, obj, propName, dataType, setterName, dflt) {
+ 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)) {
+ res.emptyLineIfNeeded();
+
+ res.line(varName + '.' + $generatorJava.setterName(propName, setterName)
+ + '(' + $generatorJava.toJavaCode(val, dataType) + ');');
+
+ return true;
+ }
+ }
+
+ return false;
+};
+
+/**
+ * Add property via setter assuming that it is a 'Class'.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param obj Source object with data.
+ * @param propName Property name to take from source object.
+ */
+$generatorJava.classNameProperty = function (res, varName, obj, propName) {
+ var val = obj[propName];
+
+ if ($commonUtils.isDefined(val)) {
+ res.emptyLineIfNeeded();
+
+ res.line(varName + '.' + $generatorJava.setterName(propName) + '(' + res.importClass(val) + '.class);');
+ }
+};
+
+/**
+ * Add list property.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param obj Source object with data.
+ * @param propName Property name to take from source object.
+ * @param dataType Optional data type.
+ * @param setterName Optional setter name.
+ */
+$generatorJava.listProperty = function (res, varName, obj, propName, dataType, setterName) {
+ var val = obj[propName];
+
+ if (val && val.length > 0) {
+ res.emptyLineIfNeeded();
+
+ res.importClass('java.util.Arrays');
+
+ res.line(varName + '.' + $generatorJava.setterName(propName, setterName) +
+ '(Arrays.asList(' +
+ _.map(val, function (v) {
+ return $generatorJava.toJavaCode(v, dataType)
+ }).join(', ') +
+ '));');
+
+ res.needEmptyLine = true;
+ }
+};
+
+/**
+ * Add array property.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param obj Source object with data.
+ * @param propName Property name to take from source object.
+ * @param setterName Optional setter name.
+ */
+$generatorJava.arrayProperty = function (res, varName, obj, propName, setterName) {
+ var val = obj[propName];
+
+ if (val && val.length > 0) {
+ res.emptyLineIfNeeded();
+
+ res.line(varName + '.' + $generatorJava.setterName(propName, setterName) + '({ ' +
+ _.map(val, function (v) {
+ return 'new ' + res.importClass(v) + '()'
+ }).join(', ') +
+ ' });');
+
+ res.needEmptyLine = true;
+ }
+};
+
+/**
+ * Add multi-param property (setter with several arguments).
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param obj Source object with data.
+ * @param propName Property name to take from source object.
+ * @param dataType Optional data type.
+ * @param setterName Optional setter name.
+ */
+$generatorJava.multiparamProperty = function (res, varName, obj, propName, dataType, setterName) {
+ var val = obj[propName];
+
+ if (val && val.length > 0) {
+ res.emptyLineIfNeeded();
+
+ res.append(varName + '.' + $generatorJava.setterName(propName, setterName) + '(');
+
+ _.forEach(val, function(v, ix) {
+ if (ix > 0)
+ res.append(', ');
+
+ res.append($generatorJava.toJavaCode(v, dataType));
+ });
+
+ res.line(');');
+ }
+};
+
+/**
+ * Add complex bean.
+ * @param res Resulting output with generated code.
+ * @param varName Variable name.
+ * @param bean
+ * @param beanPropName
+ * @param beanVarName
+ * @param beanClass
+ * @param props
+ * @param createBeanAlthoughNoProps If 'true' then create empty bean.
+ */
+$generatorJava.beanProperty = function (res, varName, bean, beanPropName, beanVarName, beanClass, props, createBeanAlthoughNoProps) {
+ if (bean && $commonUtils.hasProperty(bean, props)) {
+ res.emptyLineIfNeeded();
+
+ $generatorJava.declareVariable(res, beanVarName, beanClass);
+
+ _.forIn(props, function(descr, propName) {
+ if (props.hasOwnProperty(propName)) {
+ if (descr) {
+ switch (descr.type) {
+ case 'list':
+ $generatorJava.listProperty(res, beanVarName, bean, propName, descr.elementsType, descr.setterName);
+ break;
+
+ case 'array':
+ $generatorJava.arrayProperty(res, beanVarName, bean, propName, descr.setterName);
+ break;
+
+ case 'enum':
+ $generatorJava.property(res, beanVarName, bean, propName, res.importClass(descr.enumClass), descr.setterName);
+ break;
+
+ case 'float':
+ $generatorJava.property(res, beanVarName, bean, propName, 'float', descr.setterName);
+ break;
+
+ case 'path':
+ $generatorJava.property(res, beanVarName, bean, propName, 'path', descr.setterName);
+ break;
+
+ case 'raw':
+ $generatorJava.property(res, beanVarName, bean, propName, 'raw', descr.setterName);
+ break;
+
+ case 'propertiesAsList':
+ var val = bean[propName];
+
+ if (val && val.length > 0) {
+ res.line('Properties ' + descr.propVarName + ' = new Properties();');
+
+ _.forEach(val, function(nameAndValue) {
+ var eqIndex = nameAndValue.indexOf('=');
+
+ if (eqIndex >= 0) {
+ res.line(descr.propVarName + '.setProperty('
+ + nameAndValue.substring(0, eqIndex) + ', '
+ + nameAndValue.substr(eqIndex + 1) + ');');
+ }
+ });
+
+ res.line(beanVarName + '.' + $generatorJava.setterName(propName) + '(' + descr.propVarName + ');');
+ }
+ break;
+
+ case 'bean':
+ if ($commonUtils.isDefinedAndNotEmpty(bean[propName]))
+ res.line(beanVarName + '.' + $generatorJava.setterName(propName) + '(new ' + res.importClass(bean[propName]) + '());');
+
+ break;
+
+ default:
+ $generatorJava.property(res, beanVarName, bean, propName, null, descr.setterName, descr.dflt);
+ }
+ }
+ else {
+ $generatorJava.property(res, beanVarName, bean, propName);
+ }
+ }
+ });
+
+ res.needEmptyLine = true;
+
+ res.line(varName + '.' + $generatorJava.setterName(beanPropName) + '(' + beanVarName + ');');
+
+ res.needEmptyLine = true;
+ }
+ else if (createBeanAlthoughNoProps) {
+ res.emptyLineIfNeeded();
+ res.line(varName + '.' + $generatorJava.setterName(beanPropName) + '(new ' + res.importClass(beanClass) + '());');
+
+ res.needEmptyLine = true;
+ }
+};
+
+/**
+ * Add eviction policy.
+ *
+ * @param res Resulting output with generated code.
+ * @param varName Current using variable name.
+ * @param evtPlc Data to add.
+ * @param propName Name in source data.
+ */
+$generatorJava.evictionPolicy = function (res, varName, evtPlc, propName) {
+ if (evtPlc && evtPlc.kind) {
+ var evictionPolicyDesc = $generatorCommon.EVICTION_POLICIES[evtPlc.kind];
+
+ var obj = evtPlc[evtPlc.kind.toUpperCase()];
+
+ $generatorJava.beanProperty(res, varName, obj, propName, propName,
+ evictionPolicyDesc.className, evictionPolicyDesc.fields, true);
+ }
+};
+
+// Generate cluster general group.
+$generatorJava.clusterGeneral = function (cluster, clientNearCfg, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.declareVariable(res, 'cfg', 'org.apache.ignite.configuration.IgniteConfiguration');
+
+ $generatorJava.property(res, 'cfg', cluster, 'name', null, 'setGridName');
+ res.needEmptyLine = true;
+
+ if (clientNearCfg) {
+ res.line('cfg.setClientMode(true);');
+
+ res.needEmptyLine = true;
+ }
+
+ if (cluster.discovery) {
+ var d = cluster.discovery;
+
+ $generatorJava.declareVariable(res, 'discovery', 'org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi');
+
+ switch (d.kind) {
+ case 'Multicast':
+ $generatorJava.beanProperty(res, 'discovery', d.Multicast, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder',
+ {
+ multicastGroup: null,
+ multicastPort: null,
+ responseWaitTime: null,
+ addressRequestAttempts: null,
+ localAddress: null,
+ addresses: {type: 'list'}
+ }, true);
+
+ break;
+
+ case 'Vm':
+ $generatorJava.beanProperty(res, 'discovery', d.Vm, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder',
+ {addresses: {type: 'list'}}, true);
+
+ break;
+
+ case 'S3':
+ $generatorJava.beanProperty(res, 'discovery', d.S3, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder', {bucketName: null}, true);
+
+ break;
+
+ case 'Cloud':
+ $generatorJava.beanProperty(res, 'discovery', d.Cloud, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder',
+ {
+ credential: null,
+ credentialPath: null,
+ identity: null,
+ provider: null,
+ regions: {type: 'list'},
+ zones: {type: 'list'}
+ }, true);
+
+ break;
+
+ case 'GoogleStorage':
+ $generatorJava.beanProperty(res, 'discovery', d.GoogleStorage, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder',
+ {
+ projectName: null,
+ bucketName: null,
+ serviceAccountP12FilePath: null,
+ serviceAccountId: null
+ }, true);
+
+ break;
+
+ case 'Jdbc':
+ $generatorJava.beanProperty(res, 'discovery', d.Jdbc, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder', {initSchema: null}, true);
+
+ break;
+
+ case 'SharedFs':
+ $generatorJava.beanProperty(res, 'discovery', d.SharedFs, 'ipFinder', 'ipFinder',
+ 'org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder', {path: null}, true);
+
+ break;
+
+ default:
+ res.line('Unknown discovery kind: ' + d.kind);
+ }
+
+ res.needEmptyLine = false;
+
+ $generatorJava.clusterDiscovery(d, res);
+
+ res.emptyLineIfNeeded();
+
+ res.line('cfg.setDiscoverySpi(discovery);');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate atomics group.
+$generatorJava.clusterAtomics = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ var atomics = cluster.atomicConfiguration;
+
+ if ($commonUtils.hasAtLeastOneProperty(atomics, ['cacheMode', 'atomicSequenceReserveSize', 'backups'])) {
+ res.startSafeBlock();
+
+ $generatorJava.declareVariable(res, 'atomicCfg', 'org.apache.ignite.configuration.AtomicConfiguration');
+
+ $generatorJava.property(res, 'atomicCfg', atomics, 'cacheMode');
+
+ var cacheMode = atomics.cacheMode ? atomics.cacheMode : 'PARTITIONED';
+
+ var hasData = cacheMode != 'PARTITIONED';
+
+ hasData = $generatorJava.property(res, 'atomicCfg', atomics, 'atomicSequenceReserveSize') || hasData;
+
+ if (cacheMode == 'PARTITIONED')
+ hasData = $generatorJava.property(res, 'atomicCfg', atomics, 'backups') || hasData;
+
+ res.needEmptyLine = true;
+
+ res.line('cfg.setAtomicConfiguration(atomicCfg);');
+
+ res.needEmptyLine = true;
+
+ if (!hasData)
+ res.rollbackSafeBlock();
+ }
+
+ return res;
+};
+
+// Generate communication group.
+$generatorJava.clusterCommunication = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ var cfg = $generatorCommon.COMMUNICATION_CONFIGURATION;
+
+ $generatorJava.beanProperty(res, 'cfg', cluster.communication, 'communicationSpi', 'commSpi', cfg.className, cfg.fields);
+
+ res.needEmptyLine = false;
+
+ $generatorJava.property(res, 'cfg', cluster, 'networkTimeout', null, null, 5000);
+ $generatorJava.property(res, 'cfg', cluster, 'networkSendRetryDelay', null, null, 1000);
+ $generatorJava.property(res, 'cfg', cluster, 'networkSendRetryCount', null, null, 3);
+ $generatorJava.property(res, 'cfg', cluster, 'segmentCheckFrequency');
+ $generatorJava.property(res, 'cfg', cluster, 'waitForSegmentOnStart', null, null, false);
+ $generatorJava.property(res, 'cfg', cluster, 'discoveryStartupDelay', null, null, 600000);
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate REST access group.
+$generatorJava.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'};
+ }
+
+ $generatorJava.beanProperty(res, 'cfg', cluster.connector, 'connectorConfiguration', 'clientCfg',
+ cfg.className, cfg.fields, true);
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate deployment group.
+$generatorJava.clusterDeployment = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'cfg', cluster, 'deploymentMode', null, null, 'SHARED');
+
+ res.needEmptyLine = true;
+
+ var p2pEnabled = cluster.peerClassLoadingEnabled;
+
+ if ($commonUtils.isDefined(p2pEnabled)) {
+ $generatorJava.property(res, 'cfg', cluster, 'peerClassLoadingEnabled', null, null, false);
+
+ if (p2pEnabled) {
+ $generatorJava.property(res, 'cfg', cluster, 'peerClassLoadingMissedResourcesCacheSize');
+ $generatorJava.property(res, 'cfg', cluster, 'peerClassLoadingThreadPoolSize');
+ $generatorJava.multiparamProperty(res, 'cfg', cluster, 'peerClassLoadingLocalClassPathExclude');
+ }
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate discovery group.
+$generatorJava.clusterDiscovery = function (disco, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'discovery', disco, 'localAddress');
+ $generatorJava.property(res, 'discovery', disco, 'localPort', null, null, 47500);
+ $generatorJava.property(res, 'discovery', disco, 'localPortRange', null, null, 100);
+
+ if ($commonUtils.isDefinedAndNotEmpty(disco.addressResolver)) {
+ $generatorJava.beanProperty(res, 'discovery', disco, 'addressResolver', 'addressResolver', disco.addressResolver, {}, true);
+ res.needEmptyLine = false;
+ }
+
+ $generatorJava.property(res, 'discovery', disco, 'socketTimeout', null, null, 5000);
+ $generatorJava.property(res, 'discovery', disco, 'ackTimeout', null, null, 5000);
+ $generatorJava.property(res, 'discovery', disco, 'maxAckTimeout', null, null, 600000);
+ $generatorJava.property(res, 'discovery', disco, 'networkTimeout', null, null, 5000);
+ $generatorJava.property(res, 'discovery', disco, 'joinTimeout', null, null, 0);
+ $generatorJava.property(res, 'discovery', disco, 'threadPriority', null, null, 10);
+ $generatorJava.property(res, 'discovery', disco, 'heartbeatFrequency', null, null, 2000);
+ $generatorJava.property(res, 'discovery', disco, 'maxMissedHeartbeats', null, null, 1);
+ $generatorJava.property(res, 'discovery', disco, 'maxMissedClientHeartbeats', null, null, 5);
+ $generatorJava.property(res, 'discovery', disco, 'topHistorySize', null, null, 100);
+
+ if ($commonUtils.isDefinedAndNotEmpty(disco.listener)) {
+ $generatorJava.beanProperty(res, 'discovery', disco, 'listener', 'listener', disco.listener, {}, true);
+ res.needEmptyLine = false;
+ }
+
+ if ($commonUtils.isDefinedAndNotEmpty(disco.dataExchange)) {
+ $generatorJava.beanProperty(res, 'discovery', disco, 'dataExchange', 'dataExchange', disco.dataExchange, {}, true);
+ res.needEmptyLine = false;
+ }
+
+ if ($commonUtils.isDefinedAndNotEmpty(disco.metricsProvider)) {
+ $generatorJava.beanProperty(res, 'discovery', disco, 'metricsProvider', 'metricsProvider', disco.metricsProvider, {}, true);
+ res.needEmptyLine = false;
+ }
+
+ $generatorJava.property(res, 'discovery', disco, 'reconnectCount', null, null, 10);
+ $generatorJava.property(res, 'discovery', disco, 'statisticsPrintFrequency', null, null, 0);
+ $generatorJava.property(res, 'discovery', disco, 'ipFinderCleanFrequency', null, null, 60000);
+
+ if ($commonUtils.isDefinedAndNotEmpty(disco.authenticator)) {
+ $generatorJava.beanProperty(res, 'discovery', disco, 'authenticator', 'authenticator', disco.authenticator, {}, true);
+ res.needEmptyLine = false;
+ }
+
+ $generatorJava.property(res, 'discovery', disco, 'forceServerMode', null, null, false);
+ $generatorJava.property(res, 'discovery', disco, 'clientReconnectDisabled', null, null, false);
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate events group.
+$generatorJava.clusterEvents = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cluster.includeEventTypes && cluster.includeEventTypes.length > 0) {
+ res.emptyLineIfNeeded();
+
+ if (cluster.includeEventTypes.length == 1) {
+ res.importClass('org.apache.ignite.events.EventType');
+
+ res.line('cfg.setIncludeEventTypes(EventType.' + cluster.includeEventTypes[0] + ');');
+ }
+ else {
+ res.append('int[] events = new int[EventType.' + cluster.includeEventTypes[0] + '.length');
+
+ _.forEach(cluster.includeEventTypes, function(e, ix) {
+ if (ix > 0) {
+ res.needEmptyLine = true;
+
+ res.append(' + EventType.' + e + '.length');
+ }
+ });
+
+ res.line('];');
+
+ res.needEmptyLine = true;
+
+ res.line('int k = 0;');
+
+ _.forEach(cluster.includeEventTypes, function(e) {
+ res.needEmptyLine = true;
+
+ res.line('System.arraycopy(EventType.' + e + ', 0, events, k, EventType.' + e + '.length);');
+ res.line('k += EventType.' + e + '.length;');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('cfg.setIncludeEventTypes(events);');
+ }
+
+ res.needEmptyLine = true;
+ }
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate marshaller group.
+$generatorJava.clusterMarshaller = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ var marshaller = cluster.marshaller;
+
+ if (marshaller && marshaller.kind) {
+ var marshallerDesc = $generatorCommon.MARSHALLERS[marshaller.kind];
+
+ $generatorJava.beanProperty(res, 'cfg', marshaller[marshaller.kind], 'marshaller', 'marshaller',
+ marshallerDesc.className, marshallerDesc.fields, true);
+
+ $generatorJava.beanProperty(res, 'marshaller', marshaller[marshaller.kind], marshallerDesc.className, marshallerDesc.fields, true);
+ }
+
+ $generatorJava.property(res, 'cfg', cluster, 'marshalLocalJobs', null, null, false);
+ $generatorJava.property(res, 'cfg', cluster, 'marshallerCacheKeepAliveTime');
+ $generatorJava.property(res, 'cfg', cluster, 'marshallerCacheThreadPoolSize');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate metrics group.
+$generatorJava.clusterMetrics = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'cfg', cluster, 'metricsExpireTime');
+ $generatorJava.property(res, 'cfg', cluster, 'metricsHistorySize');
+ $generatorJava.property(res, 'cfg', cluster, 'metricsLogFrequency');
+ $generatorJava.property(res, 'cfg', cluster, 'metricsUpdateFrequency');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate swap group.
+$generatorJava.clusterSwap = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cluster.swapSpaceSpi && cluster.swapSpaceSpi.kind == 'FileSwapSpaceSpi') {
+ $generatorJava.beanProperty(res, 'cfg', cluster.swapSpaceSpi.FileSwapSpaceSpi, 'swapSpaceSpi', 'swapSpi',
+ $generatorCommon.SWAP_SPACE_SPI.className, $generatorCommon.SWAP_SPACE_SPI.fields, true);
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate time group.
+$generatorJava.clusterTime = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'cfg', cluster, 'clockSyncSamples');
+ $generatorJava.property(res, 'cfg', cluster, 'clockSyncFrequency');
+ $generatorJava.property(res, 'cfg', cluster, 'timeServerPortBase');
+ $generatorJava.property(res, 'cfg', cluster, 'timeServerPortRange');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate thread pools group.
+$generatorJava.clusterPools = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'cfg', cluster, 'publicThreadPoolSize');
+ $generatorJava.property(res, 'cfg', cluster, 'systemThreadPoolSize');
+ $generatorJava.property(res, 'cfg', cluster, 'managementThreadPoolSize');
+ $generatorJava.property(res, 'cfg', cluster, 'igfsThreadPoolSize');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate transactions group.
+$generatorJava.clusterTransactions = function (cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.beanProperty(res, 'cfg', cluster.transactionConfiguration, 'transactionConfiguration',
+ 'transactionConfiguration', $generatorCommon.TRANSACTION_CONFIGURATION.className,
+ $generatorCommon.TRANSACTION_CONFIGURATION.fields);
+
+ return res;
+};
+
+// Generate cache general group.
+$generatorJava.cacheGeneral = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, cache, 'name');
+
+ res.importClass('org.apache.ignite.cache.CacheAtomicityMode');
+ res.importClass('org.apache.ignite.cache.CacheMode');
+
+ $generatorJava.property(res, varName, cache, 'cacheMode', 'CacheMode');
+ $generatorJava.property(res, varName, cache, 'atomicityMode', 'CacheAtomicityMode');
+
+ if (cache.cacheMode == 'PARTITIONED')
+ $generatorJava.property(res, varName, cache, 'backups');
+
+ $generatorJava.property(res, varName, cache, 'readFromBackup');
+ $generatorJava.property(res, varName, cache, 'copyOnRead');
+ $generatorJava.property(res, varName, cache, 'invalidate');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate cache memory group.
+$generatorJava.cacheMemory = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, cache, 'memoryMode', 'CacheMemoryMode');
+ $generatorJava.property(res, varName, cache, 'offHeapMaxMemory');
+
+ res.needEmptyLine = true;
+
+ $generatorJava.evictionPolicy(res, varName, cache.evictionPolicy, 'evictionPolicy');
+
+ $generatorJava.property(res, varName, cache, 'swapEnabled');
+ $generatorJava.property(res, varName, cache, 'startSize');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate cache query & indexing group.
+$generatorJava.cacheQuery = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, cache, 'sqlOnheapRowCacheSize');
+ $generatorJava.property(res, varName, cache, 'longQueryWarningTimeout');
+
+ if (cache.indexedTypes && cache.indexedTypes.length > 0) {
+ res.emptyLineIfNeeded();
+
+ res.startBlock(varName + '.setIndexedTypes(');
+
+ var len = cache.indexedTypes.length - 1;
+
+ _.forEach(cache.indexedTypes, function(pair, ix) {
+ res.line($generatorJava.toJavaCode(res.importClass(pair.keyClass), 'class') + ', ' +
+ $generatorJava.toJavaCode(res.importClass(pair.valueClass), 'class') + (ix < len ? ',' : ''));
+ });
+
+ res.endBlock(');');
+ }
+
+ $generatorJava.multiparamProperty(res, varName, cache, 'sqlFunctionClasses', 'class');
+
+ $generatorJava.property(res, varName, cache, 'sqlEscapeAll');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+/**
+ * Generate cache store group.
+ *
+ * @param cache Cache descriptor.
+ * @param cacheVarName Cache variable name.
+ * @param res Resulting output with generated code.
+ * @returns {*} Java code for cache store configuration.
+ */
+$generatorJava.cacheStore = function (cache, cacheVarName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind) {
+ var factoryKind = cache.cacheStoreFactory.kind;
+
+ var storeFactory = cache.cacheStoreFactory[factoryKind];
+
+ if (storeFactory) {
+ var storeFactoryDesc = $generatorCommon.STORE_FACTORIES[factoryKind];
+
+ var dataSourceFound = false;
+
+ if (storeFactory.dialect) {
+ var dataSourceBean = storeFactory.dataSourceBean;
+
+ dataSourceFound = true;
+
+ if (!_.contains(res.datasources, dataSourceBean)) {
+ res.datasources.push(dataSourceBean);
+
+ var dsClsName = $generatorCommon.dataSourceClassName(storeFactory.dialect);
+
+ res.needEmptyLine = true;
+
+ $generatorJava.declareVariable(res, 'dataSource', dsClsName);
+
+ switch (storeFactory.dialect) {
+ case 'DB2':
+ res.line('dataSource.setServerName(props.getProperty("' + dataSourceBean + '.jdbc.server_name"));');
+ res.line('dataSource.setPortNumber(Integer.valueOf(props.getProperty("' + dataSourceBean + '.jdbc.port_number")));');
+ res.line('dataSource.setDatabaseName(props.getProperty("' + dataSourceBean + '.jdbc.database_name"));');
+ res.line('dataSource.setDriverType(Integer.valueOf(props.getProperty("' + dataSourceBean + '.jdbc.driver_type")));');
+ break;
+
+ default:
+ res.line('dataSource.setURL(props.getProperty("' + dataSourceBean + '.jdbc.url"));');
+ }
+
+ res.line('dataSource.setUser(props.getProperty("' + dataSourceBean + '.jdbc.username"));');
+ res.line('dataSource.setPassword(props.getProperty("' + dataSourceBean + '.jdbc.password"));');
+ }
+ }
+
+ if (factoryKind == 'CacheJdbcPojoStoreFactory') {
+ // Generate POJO store factory.
+ $generatorJava.declareVariable(res, 'storeFactory', 'org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory');
+
+ $generatorJava.declareVariable(res, 'storeFactoryCfg', 'org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreConfiguration');
+
+ if (dataSourceFound)
+ res.line('storeFactoryCfg.setDataSource(dataSource);');
+
+ res.line('storeFactoryCfg.setDialect(new ' +
+ res.importClass($generatorCommon.jdbcDialectClassName(storeFactory.dialect)) + '());');
+
+ res.needEmptyLine = true;
+
+ if (cache.metadatas && cache.metadatas.length > 0) {
+ $generatorJava.declareVariable(res, 'jdbcTypes', 'java.util.Collection', 'java.util.ArrayList', 'org.apache.ignite.cache.store.jdbc.JdbcType');
+
+ res.needEmptyLine = true;
+
+ _.forEach(cache.metadatas, function (meta) {
+ $generatorJava.declareVariable(res, 'jdbcType', 'org.apache.ignite.cache.store.jdbc.JdbcType');
+
+ res.needEmptyLine = true;
+
+ $generatorJava.metadataStore(meta, true, res);
+
+ res.needEmptyLine = true;
+
+ res.line('jdbcTypes.add(jdbcType);');
+
+ res.needEmptyLine = true;
+ });
+
+ res.line('storeFactoryCfg.setTypes(jdbcTypes);');
+
+ res.needEmptyLine = true;
+ }
+
+ res.line('storeFactory.setConfiguration(storeFactoryCfg);');
+ }
+ else {
+ $generatorJava.beanProperty(res, cacheVarName, storeFactory, 'cacheStoreFactory', 'storeFactory',
+ storeFactoryDesc.className, storeFactoryDesc.fields, true);
+
+ if (dataSourceFound)
+ res.line('storeFactory.setDataSource(dataSource);');
+ }
+
+ res.needEmptyLine = true;
+ }
+
+ res.line(cacheVarName + '.setStoreFactory(storeFactory);');
+
+ res.needEmptyLine = true;
+ }
+
+ $generatorJava.property(res, cacheVarName, cache, 'loadPreviousValue');
+ $generatorJava.property(res, cacheVarName, cache, 'readThrough');
+ $generatorJava.property(res, cacheVarName, cache, 'writeThrough');
+
+ res.needEmptyLine = true;
+
+ $generatorJava.property(res, cacheVarName, cache, 'writeBehindEnabled');
+ $generatorJava.property(res, cacheVarName, cache, 'writeBehindBatchSize');
+ $generatorJava.property(res, cacheVarName, cache, 'writeBehindFlushSize');
+ $generatorJava.property(res, cacheVarName, cache, 'writeBehindFlushFrequency');
+ $generatorJava.property(res, cacheVarName, cache, 'writeBehindFlushThreadCount');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate cache concurrency group.
+$generatorJava.cacheConcurrency = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, cache, 'maxConcurrentAsyncOperations');
+ $generatorJava.property(res, varName, cache, 'defaultLockTimeout');
+ $generatorJava.property(res, varName, cache, 'atomicWriteOrderMode', res.importClass('org.apache.ignite.cache.CacheAtomicWriteOrderMode'));
+ $generatorJava.property(res, varName, cache, 'writeSynchronizationMode', res.importClass('org.apache.ignite.cache.CacheWriteSynchronizationMode'));
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate cache rebalance group.
+$generatorJava.cacheRebalance = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cache.cacheMode != 'LOCAL') {
+ $generatorJava.property(res, varName, cache, 'rebalanceMode', 'CacheRebalanceMode');
+ $generatorJava.property(res, varName, cache, 'rebalanceThreadPoolSize');
+ $generatorJava.property(res, varName, cache, 'rebalanceBatchSize');
+ $generatorJava.property(res, varName, cache, 'rebalanceOrder');
+ $generatorJava.property(res, varName, cache, 'rebalanceDelay');
+ $generatorJava.property(res, varName, cache, 'rebalanceTimeout');
+ $generatorJava.property(res, varName, cache, 'rebalanceThrottle');
+
+ res.needEmptyLine = true;
+ }
+
+ if (cache.igfsAffinnityGroupSize) {
+ res.line(varName + '.setAffinityMapper(new ' + res.importClass('org.apache.ignite.igfs.IgfsGroupDataBlocksKeyMapper') + '(' + cache.igfsAffinnityGroupSize + '));');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate cache server near cache group.
+$generatorJava.cacheServerNearCache = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cache.cacheMode == 'PARTITIONED' && cache.nearCacheEnabled) {
+ res.needEmptyLine = true;
+
+ res.importClass('org.apache.ignite.configuration.NearCacheConfiguration');
+
+ $generatorJava.beanProperty(res, varName, cache.nearConfiguration, 'nearConfiguration', 'nearConfiguration',
+ 'NearCacheConfiguration', {nearStartSize: null}, true);
+
+ if (cache.nearConfiguration && cache.nearConfiguration.nearEvictionPolicy && cache.nearConfiguration.nearEvictionPolicy.kind) {
+ $generatorJava.evictionPolicy(res, 'nearConfiguration', cache.nearConfiguration.nearEvictionPolicy, 'nearEvictionPolicy');
+ }
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate cache statistics group.
+$generatorJava.cacheStatistics = function (cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, cache, 'statisticsEnabled');
+ $generatorJava.property(res, varName, cache, 'managementEnabled');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate metadata query fields.
+$generatorJava.metadataQueryFields = function (res, meta) {
+ var fields = meta.fields;
+
+ if (fields && fields.length > 0) {
+ $generatorJava.declareVariable(res, 'fields', 'java.util.LinkedHashMap', 'java.util.LinkedHashMap', 'java.lang.String', 'java.lang.String');
+
+ _.forEach(fields, function (field) {
+ res.line('fields.put("' + field.name + '", "' + $dataStructures.fullClassName(field.className) + '");');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('queryMeta.setFields(fields);');
+
+ res.needEmptyLine = true;
+ }
+};
+
+// Generate metadata query aliases.
+$generatorJava.metadataQueryAliases = function (res, meta) {
+ var aliases = meta.aliases;
+
+ if (aliases && aliases.length > 0) {
+ $generatorJava.declareVariable(res, 'aliases', 'java.util.Map', 'java.util.HashMap', 'java.lang.String', 'java.lang.String');
+
+ _.forEach(aliases, function (alias) {
+ res.line('aliases.put("' + alias.field + '", "' + alias.alias + '");');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('queryMeta.setAliases(aliases);');
+
+ res.needEmptyLine = true;
+ }
+};
+
+// Generate metadata indexes.
+$generatorJava.metadataQueryIndexes = function (res, meta) {
+ var indexes = meta.indexes;
+
+ if (indexes && indexes.length > 0) {
+ res.needEmptyLine = true;
+
+ $generatorJava.declareVariable(res, 'indexes', 'java.util.Map', 'java.util.LinkedHashMap', 'String', 'org.apache.ignite.cache.store.QueryEntityIndex');
+
+ _.forEach(indexes, function (index) {
+ res.needEmptyLine = true;
+
+ $generatorJava.declareVariable(res, 'index', 'org.apache.ignite.cache.store.QueryEntityIndex');
+
+ $generatorJava.property(res, 'index', index, 'name');
+ $generatorJava.property(res, 'index', index, 'type', 'org.apache.ignite.cache.store.QueryEntityIndex.Type');
+
+ var fields = index.fields;
+
+ if (fields && fields.length > 0) {
+ $generatorJava.declareVariable(res, 'indFlds', 'java.util.LinkedHashMap', 'java.util.LinkedHashMap', 'String', 'Boolean');
+
+ _.forEach(fields, function(field) {
+ res.line('indFlds.put("' + field.name + '", ' + field.direction + ');');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('index.setFields(indFlds);');
+
+ res.needEmptyLine = true;
+ }
+
+ res.line('indexes.add(index);');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('queryMeta.setIndexes(indexes);');
+
+ res.needEmptyLine = true;
+ }
+};
+
+// Generate metadata db fields.
+$generatorJava.metadataDatabaseFields = function (res, meta, fieldProperty) {
+ var dbFields = meta[fieldProperty];
+
+ if (dbFields && dbFields.length > 0) {
+ res.needEmptyLine = true;
+
+ res.importClass('java.sql.Types');
+
+ res.startBlock('jdbcType.' + $commonUtils.toJavaName('set', fieldProperty) + '(');
+
+ var lastIx = dbFields.length - 1;
+
+ _.forEach(dbFields, function (field, ix) {
+ res.line('new JdbcTypeField(' +
+ 'Types.' + field.databaseType + ', ' + '"' + field.databaseName + '", ' +
+ res.importClass(field.javaType) + '.class, ' + '"' + field.javaName + '"'+ ')' + (ix < lastIx ? ',' : ''));
+ });
+
+ res.endBlock(');');
+
+ res.needEmptyLine = true;
+ }
+};
+
+// Generate metadata general group.
+$generatorJava.metadataGeneral = function (meta, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.classNameProperty(res, 'typeMeta', meta, 'keyType');
+ $generatorJava.classNameProperty(res, 'typeMeta', meta, 'valueType');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate metadata for query group.
+$generatorJava.metadataQuery = function (meta, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.metadataQueryFields(res, meta);
+
+ $generatorJava.metadataQueryAliases(res, meta);
+
+ $generatorJava.metadataQueryIndexes(res, meta);
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate metadata for store group.
+$generatorJava.metadataStore = function (meta, withTypes, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, 'jdbcType', meta, 'databaseSchema');
+ $generatorJava.property(res, 'jdbcType', meta, 'databaseTable');
+ $generatorJava.property(res, 'jdbcType', meta, 'keepSerialized', null, null, false);
+
+ if (withTypes) {
+ $generatorJava.property(res, 'jdbcType', meta, 'keyType');
+ $generatorJava.property(res, 'jdbcType', meta, 'valueType');
+ }
+
+ $generatorJava.metadataDatabaseFields(res, meta, 'keyFields');
+
+ $generatorJava.metadataDatabaseFields(res, meta, 'valueFields');
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+// Generate cache type metadata config.
+$generatorJava.cacheMetadata = function(meta, res) {
+ $generatorJava.declareVariable(res, 'typeMeta', 'org.apache.ignite.cache.CacheTypeMetadata');
+
+ $generatorJava.metadataGeneral(meta, res);
+
+ res.emptyLineIfNeeded();
+ res.line('types.add(typeMeta);');
+
+ res.needEmptyLine = true;
+};
+
+// Generate cache type metadata config.
+$generatorJava.cacheQueryMetadata = function(meta, res) {
+ $generatorJava.declareVariable(res, 'queryMeta', 'org.apache.ignite.cache.store.QueryEntity');
+
+ $generatorJava.classNameProperty(res, 'queryMeta', meta, 'keyType');
+ $generatorJava.classNameProperty(res, 'queryMeta', meta, 'valueType');
+
+ res.needEmptyLine = true;
+
+ $generatorJava.metadataQuery(meta, res);
+
+ res.emptyLineIfNeeded();
+ res.line('queryEntities.add(queryMeta);');
+
+ res.needEmptyLine = true;
+};
+
+// Generate cache type metadata configs.
+$generatorJava.cacheMetadatas = function (metadatas, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ // Generate cache type metadata configs.
+ if (metadatas && metadatas.length > 0) {
+ $generatorJava.declareVariable(res, 'types', 'java.util.Collection', 'java.util.ArrayList', 'org.apache.ignite.cache.CacheTypeMetadata');
+
+ _.forEach(metadatas, function (meta) {
+ $generatorJava.cacheMetadata(meta, res);
+ });
+
+ res.line(varName + '.setTypeMetadata(types);');
+
+ res.needEmptyLine = true;
+
+ $generatorJava.declareVariable(res, 'queryEntities', 'java.util.Collection', 'java.util.ArrayList', 'org.apache.ignite.cache.store.QueryEntity');
+
+ _.forEach(metadatas, function (meta) {
+ $generatorJava.cacheQueryMetadata(meta, res);
+ });
+
+ res.line(varName + '.setQueryEntities(queryEntities);');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+// Generate cache configs.
+$generatorJava.cache = function(cache, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.cacheGeneral(cache, varName, res);
+
+ $generatorJava.cacheMemory(cache, varName, res);
+
+ $generatorJava.cacheQuery(cache, varName, res);
+
+ $generatorJava.cacheStore(cache, varName, res);
+
+ $generatorJava.cacheConcurrency(cache, varName, res);
+
+ $generatorJava.cacheRebalance(cache, varName, res);
+
+ $generatorJava.cacheServerNearCache(cache, varName, res);
+
+ $generatorJava.cacheStatistics(cache, varName, res);
+
+ $generatorJava.cacheMetadatas(cache.metadatas, varName, res);
+};
+
+// Generate cluster caches.
+$generatorJava.clusterCaches = function (caches, igfss, res) {
+ function clusterCache(res, cache, names) {
+ res.emptyLineIfNeeded();
+
+ var cacheName = $commonUtils.toJavaName('cache', cache.name);
+
+ $generatorJava.declareVariable(res, cacheName, 'org.apache.ignite.configuration.CacheConfiguration');
+
+ $generatorJava.cache(cache, cacheName, res);
+
+ names.push(cacheName);
+
+ res.needEmptyLine = true;
+ }
+
+ if (!res)
+ res = $generatorCommon.builder();
+
+ var names = [];
+
+ if (caches && caches.length > 0) {
+ res.emptyLineIfNeeded();
+
+ _.forEach(caches, function (cache) {
+ clusterCache(res, cache, names);
+ });
+
+ res.needEmptyLine = true;
+ }
+
+ if (igfss && igfss.length > 0) {
+ res.emptyLineIfNeeded();
+
+ _.forEach(igfss, function (igfs) {
+ clusterCache(res, $generatorCommon.igfsDataCache(igfs), names);
+ clusterCache(res, $generatorCommon.igfsMetaCache(igfs), names);
+ });
+
+ res.needEmptyLine = true;
+ }
+
+ if (names.length > 0) {
+ res.line('cfg.setCacheConfiguration(' + names.join(', ') + ');');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Generate java class code.
+ *
+ * @param meta Metadata object.
+ * @param key If 'true' then key class should be generated.
+ * @param pkg Package name.
+ * @param useConstructor If 'true' then empty and full constructors should be generated.
+ * @param includeKeyFields If 'true' then include key fields into value POJO.
+ * @param res Resulting output with generated code.
+ */
+$generatorJava.javaClassCode = function (meta, key, pkg, useConstructor, includeKeyFields, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ var type = (key ? meta.keyType : meta.valueType);
+ type = type.substring(type.lastIndexOf('.') + 1);
+
+ // Class comment.
+ res.line('/**');
+ res.line(' * ' + type + ' definition.');
+ res.line(' *');
+ res.line(' * ' + $generatorCommon.mainComment());
+ res.line(' */');
+
+ res.startBlock('public class ' + type + ' implements ' + res.importClass('java.io.Serializable') + ' {');
+
+ res.line('/** */');
+ res.line('private static final long serialVersionUID = 0L;');
+ res.needEmptyLine = true;
+
+ var allFields = (key || includeKeyFields) ? meta.keyFields.slice() : [];
+
+ if (!key)
+ _.forEach(meta.valueFields, function (valFld) {
+ if (_.findIndex(allFields, function(fld) {
+ return fld.javaName == valFld.javaName;
+ }) < 0)
+ allFields.push(valFld);
+ });
+
+ // Generate allFields declaration.
+ _.forEach(allFields, function (field) {
+ var fldName = field.javaName;
+
+ res.line('/** Value for ' + fldName + '. */');
+
+ res.line('private ' + res.importClass(field.javaType) + ' ' + fldName + ';');
+
+ res.needEmptyLine = true;
+ });
+
+ // Generate constructors.
+ if (useConstructor) {
+ res.line('/**');
+ res.line(' * Empty constructor.');
+ res.line(' */');
+ res.startBlock('public ' + type + '() {');
+ res.line('// No-op.');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+
+ res.line('/**');
+ res.line(' * Full constructor.');
+ res.line(' */');
+ res.startBlock('public ' + type + '(');
+
+ _.forEach(allFields, function(field) {
+ res.line(res.importClass(field.javaType) + ' ' + field.javaName + (fldIx < allFields.length - 1 ? ',' : ''))
+ });
+
+ res.endBlock(') {');
+
+ res.startBlock();
+
+ _.forEach(allFields, function (field) {
+ res.line('this.' + field.javaName +' = ' + field.javaName + ';');
+ });
+
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+ }
+
+ // Generate getters and setters methods.
+ _.forEach(allFields, function (field) {
+ var fldName = field.javaName;
+
+ var fldType = res.importClass(field.javaType);
+
+ res.line('/**');
+ res.line(' * Gets ' + fldName + '.');
+ res.line(' *');
+ res.line(' * @return Value for ' + fldName + '.');
+ res.line(' */');
+ res.startBlock('public ' + fldType + ' ' + $commonUtils.toJavaName('get', fldName) + '() {');
+ res.line('return ' + fldName + ';');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+
+ res.line('/**');
+ res.line(' * Sets ' + fldName + '.');
+ res.line(' *');
+ res.line(' * @param ' + fldName + ' New value for ' + fldName + '.');
+ res.line(' */');
+ res.startBlock('public void ' + $commonUtils.toJavaName('set', fldName) + '(' + fldType + ' ' + fldName + ') {');
+ res.line('this.' + fldName + ' = ' + fldName + ';');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+ });
+
+ // Generate equals() method.
+ res.line('/** {@inheritDoc} */');
+ res.startBlock('@Override public boolean equals(Object o) {');
+ res.startBlock('if (this == o)');
+ res.line('return true;');
+ res.endBlock();
+ res.append('');
+
+ res.startBlock('if (!(o instanceof ' + type + '))');
+ res.line('return false;');
+ res.endBlock();
+
+ res.needEmptyLine = true;
+
+ res.line(type + ' that = (' + type + ')o;');
+
+ _.forEach(allFields, function (field) {
+ res.needEmptyLine = true;
+
+ var javaName = field.javaName;
+
+ res.startBlock('if (' + javaName + ' != null ? !' + javaName + '.equals(that.' + javaName + ') : that.' + javaName + ' != null)');
+
+ res.line('return false;');
+ res.endBlock()
+ });
+
+ res.needEmptyLine = true;
+
+ res.line('return true;');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+
+ // Generate hashCode() method.
+ res.line('/** {@inheritDoc} */');
+ res.startBlock('@Override public int hashCode() {');
+
+ var first = true;
+
+ _.forEach(allFields, function (field) {
+ var javaName = field.javaName;
+
+ if (!first)
+ res.needEmptyLine = true;
+
+ res.line(first ? 'int res = ' + javaName + ' != null ? ' + javaName + '.hashCode() : 0;'
+ : 'res = 31 * res + (' + javaName + ' != null ? ' + javaName + '.hashCode() : 0);');
+
+ first = false;
+ });
+
+ res.needEmptyLine = true;
+ res.line('return res;');
+ res.endBlock('}');
+ res.needEmptyLine = true;
+
+ // Generate toString() method.
+ res.line('/** {@inheritDoc} */');
+ res.startBlock('@Override public String toString() {');
+
+ if (allFields.length > 0) {
+ field = allFields[0];
+
+ res.startBlock('return \"' + type + ' [' + field.javaName + '=\" + ' + field.javaName + ' +', type);
+
+ for (fldIx = 1; fldIx < allFields.length; fldIx ++) {
+ field = allFields[fldIx];
+
+ var javaName = field.javaName;
+
+ res.line('\", ' + javaName + '=\" + ' + field.javaName + ' +');
+ }
+ }
+
+ res.line('\']\';');
+ res.endBlock();
+ res.endBlock('}');
+
+ res.endBlock('}');
+
+ return 'package ' + pkg + ';' + '\n\n' + res.generateImports() + '\n\n' + res.asString();
+};
+
+/**
+ * Generate source code for type by its metadata.
+ *
+ * @param caches List of caches to generate POJOs for.
+ * @param useConstructor If 'true' then generate constructors.
+ * @param includeKeyFields If 'true' then include key fields into value POJO.
+ */
+$generatorJava.pojos = function (caches, useConstructor, includeKeyFields) {
+ var metadataNames = [];
+
+ var metadatas = [];
+
+ _.forEach(caches, function(cache) {
+ _.forEach(cache.metadatas, function(meta) {
+ // Skip already generated classes.
+ if (!_.find(metadatas, {valueType: meta.valueType}) &&
+ // Skip metadata without value fields.
+ $commonUtils.isDefined(meta.valueFields) && meta.valueFields.length > 0) {
+ var metadata = {};
+
+ // Key class generation only if key is not build in java class.
+ if ($commonUtils.isDefined(meta.keyFields) && meta.keyFields.length > 0) {
+ metadata.keyType = meta.keyType;
+ metadata.keyClass = $generatorJava.javaClassCode(meta, true,
+ meta.keyType.substring(0, meta.keyType.lastIndexOf('.')), useConstructor, includeKeyFields);
+ }
+
+ metadata.valueType = meta.valueType;
+ metadata.valueClass = $generatorJava.javaClassCode(meta, false,
+ meta.valueType.substring(0, meta.valueType.lastIndexOf('.')), useConstructor, includeKeyFields);
+
+ metadatas.push(metadata);
+ }
+ });
+ });
+
+ return metadatas;
+};
+
+/**
+ * @param type Full type name.
+ * @return Field java type name.
+ */
+$generatorJava.javaTypeName = function(type) {
+ var ix = $generatorJava.javaBuildInClasses.indexOf(type);
+
+ var resType = ix >= 0 ? $generatorJava.javaBuildInFullNameClasses[ix] : type;
+
+ return resType.indexOf("java.lang.") >= 0 ? resType.substring(10) : resType;
+};
+
+/**
+ * Java code 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
+ */
+$generatorJava.clusterSsl = function(cluster, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (cluster.sslEnabled && $commonUtils.isDefined(cluster.sslContextFactory)) {
+
+ cluster.sslContextFactory.keyStorePassword = $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.keyStoreFilePath) ?
+ 'props.getProperty("ssl.key.storage.password").toCharArray()' : undefined;
+
+ cluster.sslContextFactory.trustStorePassword = $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.trustStoreFilePath) ?
+ 'props.getProperty("ssl.trust.storage.password").toCharArray()' : undefined;
+
+ var propsDesc = $commonUtils.isDefinedAndNotEmpty(cluster.sslContextFactory.trustManagers) ?
+ $generatorCommon.SSL_CONFIGURATION_TRUST_MANAGER_FACTORY.fields :
+ $generatorCommon.SSL_CONFIGURATION_TRUST_FILE_FACTORY.fields;
+
+ $generatorJava.beanProperty(res, 'cfg', cluster.sslContextFactory, 'sslContextFactory', 'sslContextFactory',
+ 'org.apache.ignite.ssl.SslContextFactory', propsDesc, true);
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Java code generator for cluster's IGFS configurations.
+ *
+ * @param igfss List of configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfss = function(igfss, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if ($commonUtils.isDefinedAndNotEmpty(igfss)) {
+ res.emptyLineIfNeeded();
+
+ var arrayName = 'fileSystems';
+ var igfsInst = 'igfs';
+
+ res.line(res.importClass('org.apache.ignite.configuration.FileSystemConfiguration') + '[] ' + arrayName + ' = new FileSystemConfiguration[' + igfss.length + '];');
+
+ _.forEach(igfss, function(igfs, ix) {
+ $generatorJava.declareVariable(res, igfsInst, 'org.apache.ignite.configuration.FileSystemConfiguration');
+
+ $generatorJava.igfsGeneral(igfs, igfsInst, res);
+ $generatorJava.igfsIPC(igfs, igfsInst, res);
+ $generatorJava.igfsFragmentizer(igfs, igfsInst, res);
+ $generatorJava.igfsDualMode(igfs, igfsInst, res);
+ $generatorJava.igfsSecondFS(igfs, igfsInst, res);
+ $generatorJava.igfsMisc(igfs, igfsInst, res);
+
+ res.line(arrayName + '[' + ix + '] = ' + igfsInst + ';');
+
+ res.needEmptyLine = true;
+ });
+
+ res.line(varName + '.' + 'setFileSystemConfiguration(' + arrayName + ');');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Java code generator for IGFS IPC configuration.
+ *
+ * @param igfs Configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfsIPC = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (igfs.ipcEndpointEnabled) {
+ var desc = $generatorCommon.IGFS_IPC_CONFIGURATION;
+
+ $generatorJava.beanProperty(res, varName, igfs.ipcEndpointConfiguration, 'ipcEndpointConfiguration', 'ipcEndpointCfg',
+ desc.className, desc.fields, true);
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Java code generator for IGFS fragmentizer configuration.
+ *
+ * @param igfs Configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfsFragmentizer = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (igfs.fragmentizerEnabled) {
+ $generatorJava.property(res, varName, igfs, 'fragmentizerConcurrentFiles', null, null, 0);
+ $generatorJava.property(res, varName, igfs, 'fragmentizerThrottlingBlockLength', null, null, 16777216);
+ $generatorJava.property(res, varName, igfs, 'fragmentizerThrottlingDelay', null, null, 200);
+
+ res.needEmptyLine = true;
+ }
+ else
+ $generatorJava.property(res, varName, igfs, 'fragmentizerEnabled');
+
+ return res;
+};
+
+/**
+ * Java code generator for IGFS dual mode configuration.
+ *
+ * @param igfs Configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfsDualMode = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, igfs, 'dualModeMaxPendingPutsSize', null, null, 0);
+
+ if ($commonUtils.isDefinedAndNotEmpty(igfs.dualModePutExecutorService))
+ res.line(varName + '.' + $generatorJava.setterName('dualModePutExecutorService') + '(new ' + res.importClass(igfs.dualModePutExecutorService) + '());');
+
+ $generatorJava.property(res, varName, igfs, 'dualModePutExecutorServiceShutdown', null, null, false);
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+$generatorJava.igfsSecondFS = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if (igfs.secondaryFileSystemEnabled) {
+ var secondFs = igfs.secondaryFileSystem || {};
+
+ var uriDefined = $commonUtils.isDefinedAndNotEmpty(secondFs.uri);
+ var nameDefined = $commonUtils.isDefinedAndNotEmpty(secondFs.userName);
+ var cfgDefined = $commonUtils.isDefinedAndNotEmpty(secondFs.cfgPath);
+
+ res.line(varName + '.setSecondaryFileSystem(new ' +
+ res.importClass('org.apache.ignite.hadoop.fs.IgniteHadoopIgfsSecondaryFileSystem') + '(' +
+ (uriDefined ? '"' + secondFs.uri + '"' : 'null') +
+ (cfgDefined || nameDefined ? (cfgDefined ? ', "' + secondFs.cfgPath + '"' : ', null') : '') +
+ (nameDefined ? ', "' + secondFs.userName + '"' : '') +
+ '));');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Java code generator for IGFS general configuration.
+ *
+ * @param igfs Configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfsGeneral = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ if ($commonUtils.isDefinedAndNotEmpty(igfs.name)) {
+ igfs.dataCacheName = $generatorCommon.igfsDataCache(igfs).name;
+ igfs.metaCacheName = $generatorCommon.igfsMetaCache(igfs).name;
+
+ $generatorJava.property(res, varName, igfs, 'name');
+ $generatorJava.property(res, varName, igfs, 'dataCacheName');
+ $generatorJava.property(res, varName, igfs, 'metaCacheName');
+
+ res.needEmptyLine = true;
+ }
+
+ return res;
+};
+
+/**
+ * Java code generator for IGFS misc configuration.
+ *
+ * @param igfs Configured IGFS.
+ * @param varName Name of IGFS configuration variable.
+ * @param res Optional configuration presentation builder object.
+ * @returns Configuration presentation builder object.
+ */
+$generatorJava.igfsMisc = function(igfs, varName, res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ $generatorJava.property(res, varName, igfs, 'blockSize', null, null, 65536);
+ $generatorJava.property(res, varName, igfs, 'streamBufferSize', null, null, 65536);
+ $generatorJava.property(res, varName, igfs, 'defaultMode', res.importClass('org.apache.ignite.igfs.IgfsMode'), undefined, "DUAL_ASYNC");
+ $generatorJava.property(res, varName, igfs, 'maxSpaceSize', null, null, 0);
+ $generatorJava.property(res, varName, igfs, 'maximumTaskRangeLength', null, null, 0);
+ $generatorJava.property(res, varName, igfs, 'managementPort', null, null, 11400);
+
+ if (igfs.pathModes && igfs.pathModes.length > 0) {
+ res.needEmptyLine = true;
+
+ $generatorJava.declareVariable(res, 'pathModes', 'java.util.Map', 'java.util.HashMap', 'String', 'org.apache.ignite.igfs.IgfsMode');
+
+ _.forEach(igfs.pathModes, function (pair) {
+ res.line('pathModes.put("' + pair.path + '", IgfsMode.' + pair.mode +');');
+ });
+
+ res.needEmptyLine = true;
+
+ res.line(varName + '.setPathModes(pathModes);');
+ }
+
+ $generatorJava.property(res, varName, igfs, 'perNodeBatchSize', null, null, 100);
+ $generatorJava.property(res, varName, igfs, 'perNodeParallelBatchCount', null, null, 8);
+ $generatorJava.property(res, varName, igfs, 'prefetchBlocks', null, null, 0);
+ $generatorJava.property(res, varName, igfs, 'sequentialReadsBeforePrefetch', null, null, 0);
+ $generatorJava.property(res, varName, igfs, 'trashPurgeTimeout', null, null, 1000);
+
+ res.needEmptyLine = true;
+
+ return res;
+};
+
+/**
+ * Function to generate java code for cluster configuration.
+ *
+ * @param cluster Cluster to process.
+ * @param javaClass Class name for generate factory class otherwise generate code snippet.
+ * @param clientNearCfg Near cache configuration for client node.
+ */
+$generatorJava.cluster = function (cluster, javaClass, clientNearCfg) {
+ var res = $generatorCommon.builder();
+
+ if (cluster) {
+ if (javaClass) {
+ res.line('/**');
+ res.line(' * ' + $generatorCommon.mainComment());
+ res.line(' */');
+ res.startBlock('public class ' + javaClass + ' {');
+ res.line('/**');
+ res.line(' * Configure grid.');
+ res.line(' *');
+ res.line(' * @return Ignite configuration.');
+ res.line(' * @throws Exception If failed to construct Ignite configuration instance.');
+ res.line(' */');
+ res.startBlock('public static IgniteConfiguration createConfiguration() throws Exception {');
+ }
+
+ var haveDS = _.findIndex(cluster.caches, function(cache) {
+ if (cache.cacheStoreFactory && cache.cacheStoreFactory.kind) {
+ var factory = cache.cacheStoreFactory[cache.cacheStoreFactory.kind];
+
+ if (factory && factory.dialect)
+ return true;
+ }
+
+ return false;
+ }) >= 0;
+
+ if (haveDS || cluster.sslEnabled) {
+ res.line(res.importClass('java.net.URL') + ' res = IgniteConfiguration.class.getResource("/secret.properties");');
+
+ res.needEmptyLine = true;
+
+ res.line(res.importClass('java.io.File') + ' propsFile = new File(res.toURI());');
+
+ res.needEmptyLine = true;
+
+ res.line(res.importClass('java.util.Properties') + ' props = new Properties();');
+
+ res.needEmptyLine = true;
+
+ res.startBlock('try (' + res.importClass('java.io.InputStream') + ' in = new ' + res.importClass('java.io.FileInputStream') + '(propsFile)) {');
+ res.line('props.load(in);');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+ }
+
+ $generatorJava.clusterGeneral(cluster, clientNearCfg, res);
+
+ $generatorJava.clusterAtomics(cluster, res);
+
+ $generatorJava.clusterCommunication(cluster, res);
+
+ $generatorJava.clusterConnector(cluster, res);
+
+ $generatorJava.clusterDeployment(cluster, res);
+
+ $generatorJava.clusterEvents(cluster, res);
+
+ $generatorJava.clusterMarshaller(cluster, res);
+
+ $generatorJava.clusterMetrics(cluster, res);
+
+ $generatorJava.clusterSwap(cluster, res);
+
+ $generatorJava.clusterTime(cluster, res);
+
+ $generatorJava.clusterPools(cluster, res);
+
+ $generatorJava.clusterTransactions(cluster, res);
+
+ $generatorJava.clusterCaches(cluster.caches, cluster.igfss, res);
+
+ $generatorJava.clusterSsl(cluster, res);
+
+ $generatorJava.igfss(cluster.igfss, 'cfg', res);
+
+ if (javaClass) {
+ res.importClass('org.apache.ignite.Ignite');
+ res.importClass('org.apache.ignite.Ignition');
+
+ res.line('return cfg;');
+ res.endBlock('}');
+
+ res.needEmptyLine = true;
+
+ res.line('/**');
+ res.line(' * Sample usage of ' + javaClass + '.');
+ res.line(' *');
+ res.line(' * @param args Command line arguments, none required.');
+ res.line(' * @throws Exception If sample execution failed.');
+ res.line(' */');
+
+ res.startBlock('public static void main(String[] args) throws Exception {');
+ res.startBlock('try (Ignite ignite = Ignition.start(' + javaClass + '.createConfiguration())) {');
+ res.line('System.out.println("Write some code here...");');
+ res.endBlock('}');
+ res.endBlock('}');
+
+ res.endBlock('}');
+
+ return res.generateImports() + '\n\n' + res.asString();
+ }
+ }
+
+ return res.asString();
+};
http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js b/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
new file mode 100644
index 0000000..20ed535
--- /dev/null
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ */
+
+// 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;
+};
http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/helpers/generator/generator-properties.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-properties.js b/modules/control-center-web/src/main/js/helpers/generator/generator-properties.js
new file mode 100644
index 0000000..06328c6
--- /dev/null
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-properties.js
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ */
+
+// 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;
+};
http://git-wip-us.apache.org/repos/asf/ignite/blob/ce945056/modules/control-center-web/src/main/js/helpers/generator/generator-readme.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-readme.js b/modules/control-center-web/src/main/js/helpers/generator/generator-readme.js
new file mode 100644
index 0000000..434b639
--- /dev/null
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-readme.js
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ */
+
+// README.txt generation entry point.
+$generatorReadme = {};
+
+/**
+ * Generate README.txt.
+ *
+ * @param res Resulting output with generated readme.
+ * @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;
+};
+
+/**
+ * Generate README.txt for jdbc folder.
+ *
+ * @param res Resulting output with generated readme.
+ * @returns {string} Generated content.
+ */
+$generatorReadme.readmeJdbc = function (res) {
+ if (!res)
+ res = $generatorCommon.builder();
+
+ res.line('Copy proprietary JDBC drivers to this folder.');
+
+ return res;
+};