Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 35A82189C9 for ; Thu, 9 Jul 2015 06:02:13 +0000 (UTC) Received: (qmail 6958 invoked by uid 500); 9 Jul 2015 06:02:13 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 6922 invoked by uid 500); 9 Jul 2015 06:02:13 -0000 Mailing-List: contact commits-help@ignite.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.incubator.apache.org Delivered-To: mailing list commits@ignite.incubator.apache.org Received: (qmail 6910 invoked by uid 99); 9 Jul 2015 06:02:13 -0000 Received: from Unknown (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 09 Jul 2015 06:02:13 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 85CEA181A36 for ; Thu, 9 Jul 2015 06:02:12 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.771 X-Spam-Level: * X-Spam-Status: No, score=1.771 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01, WEIRD_QUOTING=0.001] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id ijcoqnAC5VFq for ; Thu, 9 Jul 2015 06:02:00 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with SMTP id 9752743BB0 for ; Thu, 9 Jul 2015 06:01:59 +0000 (UTC) Received: (qmail 6653 invoked by uid 99); 9 Jul 2015 06:01:59 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 09 Jul 2015 06:01:59 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 83251E494E; Thu, 9 Jul 2015 06:01:58 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: anovikov@apache.org To: commits@ignite.incubator.apache.org Date: Thu, 09 Jul 2015 06:01:59 -0000 Message-Id: <73df748366cc460d80154975f563183e@git.apache.org> In-Reply-To: <5e550f2a50ec4d91b28dcab988db6270@git.apache.org> References: <5e550f2a50ec4d91b28dcab988db6270@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/6] incubator-ignite git commit: # ignite-843 Refactor http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/36063e13/modules/web-control-center/nodejs/public/javascripts/xeditable.min.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/public/javascripts/xeditable.min.js b/modules/web-control-center/nodejs/public/javascripts/xeditable.min.js deleted file mode 100644 index 6dbc447..0000000 --- a/modules/web-control-center/nodejs/public/javascripts/xeditable.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -angular-xeditable - 0.1.8 -Edit-in-place for angular.js -Build date: 2014-01-10 -*/ -angular.module("xeditable",[]).value("editableOptions",{theme:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus"}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory",function(a){return a({directiveName:"editableBsdate",inputTpl:''})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(a){return a({directiveName:"editableBstime",inputTpl:"",render:function(){this.parent.render.call(this);var a=angular.element('
');a.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(a.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(a)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(a){return a({directiveName:"editableCheckbox",inputT pl:'',render:function(){this.parent.render.call(this),this.attrs.eTitle&&(this.inputEl.wrap(""),this.inputEl.after(angular.element("").text(this.attrs.eTitle)))},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableChecklist",inputTpl:"",useCopy:!0,render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)}})}]),function(){var a="text|email|tel|number|url|searc h|color|date|datetime|time|month|week".split("|");angular.forEach(a,function(a){var b="editable"+a.charAt(0).toUpperCase()+a.slice(1);angular.module("xeditable").directive(b,["editableDirectiveFactory",function(c){return c({directiveName:b,inputTpl:''})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory",function(a){return a({directiveName:"editableRange",inputTpl:'',render:function(){this.parent.render.call(this),this.inputEl.after("{{$data}}")}})}])}(),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableRadiolist",inputTpl:"",render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(a){return a({directiveName:"editableSelect",inputTpl:"",autosubmit:function(){var a=this;a.inputEl.bind("change",function(){a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(a){return a({directiveName:"editableTextarea",inputTpl:"",addListeners:function(){var a=this;a.parent.addListeners.call(a),a.single&&"no"!==a.buttons&&a.autosubmit()},autosubmit:function(){var a=this;a.inputEl.bind("keydown",function(b){(b.ctrlKey||b.metaKey)&&13===b.keyCode&&a.scope.$apply(function(){a.sco pe.$form.$submit()})})}})}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(a,b){function c(a,c,d,e,f,g,h,i,j){var k,l,m=this;m.scope=a,m.elem=d,m.attrs=c,m.inputEl=null,m.editorEl=null,m.single=!0,m.error="",m.theme=f[g.theme]||f["default"],m.parent={},m.inputTpl="",m.directiveName="",m.useCopy=!1,m.single=null,m.buttons="right",m.init=function(b){if(m.single=b,m.name=c.eName||c[m.directiveName],!c[m.directiveName])throw"You should provide value for `"+m.directiveName+"` in editable element!";k=e(c[m.directiveName]),m.buttons=m.single?m.attrs.buttons||g.buttons:"no",c.eName&&m.scope.$watch("$data",function(a){m.scope.$form.$data[c.eName]=a}),c.onshow&&(m.onshow=function(){return m.catchError(e(c.onshow)(a))}),c.onhide&&(m.onhide=function(){return e(c.onhide)(a)}),c.oncancel&&(m.oncancel=function(){return e(c.oncancel)(a)}),c.onbeforesave&&(m.onbeforesave=function(){return m.catchError(e(c.onbeforesave)(a))}),c.onaftersave&&(m.onaftersave=fun ction(){return m.catchError(e(c.onaftersave)(a))}),a.$parent.$watch(c[m.directiveName],function(){m.handleEmpty()})},m.render=function(){var a=m.theme;m.inputEl=angular.element(m.inputTpl),m.controlsEl=angular.element(a.controlsTpl),m.controlsEl.append(m.inputEl),"no"!==m.buttons&&(m.buttonsEl=angular.element(a.buttonsTpl),m.submitEl=angular.element(a.submitTpl),m.cancelEl=angular.element(a.cancelTpl),m.buttonsEl.append(m.submitEl).append(m.cancelEl),m.controlsEl.append(m.buttonsEl),m.inputEl.addClass("editable-has-buttons")),m.errorEl=angular.element(a.errorTpl),m.controlsEl.append(m.errorEl),m.editorEl=angular.element(m.single?a.formTpl:a.noformTpl),m.editorEl.append(m.controlsEl);for(var d in c.$attr)if(!(d.length<=1)){var e=!1,f=d.substring(1,2);if("e"===d.substring(0,1)&&f===f.toUpperCase()&&(e=d.substring(1),"Form"!==e&&"NgSubmit"!==e)){e=e.substring(0,1).toLowerCase()+b.camelToDash(e.substring(1));var h=""===c[d]?e:c[d];m.inputEl.attr(e,h)}}m.inputEl.addClass("editable-input" ),m.inputEl.attr("ng-model","$data"),m.editorEl.addClass(b.camelToDash(m.directiveName)),m.single&&(m.editorEl.attr("editable-form","$form"),m.editorEl.attr("blur",m.attrs.blur||("no"===m.buttons?"cancel":g.blurElem))),angular.isFunction(a.postrender)&&a.postrender.call(m)},m.setLocalValue=function(){m.scope.$data=m.useCopy?angular.copy(k(a.$parent)):k(a.$parent)},m.show=function(){return m.setLocalValue(),m.render(),d.after(m.editorEl),i(m.editorEl)(a),m.addListeners(),d.addClass("editable-hide"),m.onshow()},m.hide=function(){return m.editorEl.remove(),d.removeClass("editable-hide"),m.onhide()},m.cancel=function(){m.oncancel()},m.addListeners=function(){m.inputEl.bind("keyup",function(a){if(m.single)switch(a.keyCode){case 27:m.scope.$apply(function(){m.scope.$form.$cancel()})}}),m.single&&"no"===m.buttons&&m.autosubmit(),m.editorEl.bind("click",function(a){1===a.which&&m.scope.$form.$visible&&(m.scope.$form._clicked=!0)})},m.setWaiting=function(a){a?(l=!m.inputEl.attr("disabled")&& !m.inputEl.attr("ng-disabled")&&!m.inputEl.attr("ng-enabled"),l&&(m.inputEl.attr("disabled","disabled"),m.buttonsEl&&m.buttonsEl.find("button").attr("disabled","disabled"))):l&&(m.inputEl.removeAttr("disabled"),m.buttonsEl&&m.buttonsEl.find("button").removeAttr("disabled"))},m.activate=function(){setTimeout(function(){var a=m.inputEl[0];"focus"===g.activate&&a.focus&&a.focus(),"select"===g.activate&&a.select&&a.select()},0)},m.setError=function(b){angular.isObject(b)||(a.$error=b,m.error=b)},m.catchError=function(a,b){return angular.isObject(a)&&b!==!0?j.when(a).then(angular.bind(this,function(a){this.catchError(a,!0)}),angular.bind(this,function(a){this.catchError(a,!0)})):b&&angular.isObject(a)&&a.status&&200!==a.status&&a.data&&angular.isString(a.data)?(this.setError(a.data),a=a.data):angular.isString(a)&&this.setError(a),a},m.save=function(){k.assign(a.$parent,angular.copy(m.scope.$data))},m.handleEmpty=function(){var b=k(a.$parent),c=null===b||void 0===b||""===b||angular.isArra y(b)&&0===b.length;d.toggleClass("editable-empty",c)},m.autosubmit=angular.noop,m.onshow=angular.noop,m.onhide=angular.noop,m.oncancel=angular.noop,m.onbeforesave=angular.noop,m.onaftersave=angular.noop}return c.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableOptions","$rootScope","$compile","$q"],c}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController",function(a,b,c,d,e,f,g){return function(b){return{restrict:"A",scope:!0,require:[b.directiveName,"?^form"],controller:f,link:function(c,f,h,i){var j,k=i[0],l=!1;if(i[1])j=i[1],l=!0;else if(h.eForm){var m=a(h.eForm)(c);if(m)j=m,l=!0;else for(var n=0;n=0&&a.splice(c,1),b},camelToDash:function(a){var b=/[A-Z]/g;return a.replace(b,function(a,b){return (b?"-":"")+a.toLowerCase()})},dashToCamel:function(a){var b=/([\:\-\_]+(.))/g,c=/^moz([A-Z])/;return a.replace(b,function(a,b,c,d){return d?c.toUpperCase():c}).replace(c,"Moz$1")}}}]),angular.module("xeditable").factory("editableNgOptionsParser",[function(){function a(a){var c;if(!(c=a.match(b)))throw"ng-options parse error";var d,e=c[2]||c[1],f=c[4]||c[6],g=c[5],h=(c[3]||"",c[2]?c[1]:f),i=c[7],j=c[8],k=j?c[8]:null;return void 0===g?(d=f+" in "+i,void 0!==j&&(d+=" track by "+k)):d="("+g+", "+f+") in "+i,{ngRepeat:d,locals:{valueName:f,keyName:g,valueFn:h,displayFn:e}}}var b=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;return a}]),angular.module("xeditable").factory("editableThemes",function(){var a={"default":{formTpl:'
',noformTpl:'',controlsTpl:'' ,inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs2:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs3:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:'',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableTime":case"editableMonth":case"editableWeek":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-l g"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}}};return a}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/36063e13/modules/web-control-center/nodejs/public/libs/xeditable.min.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/public/libs/xeditable.min.js b/modules/web-control-center/nodejs/public/libs/xeditable.min.js new file mode 100644 index 0000000..6dbc447 --- /dev/null +++ b/modules/web-control-center/nodejs/public/libs/xeditable.min.js @@ -0,0 +1,6 @@ +/*! +angular-xeditable - 0.1.8 +Edit-in-place for angular.js +Build date: 2014-01-10 +*/ +angular.module("xeditable",[]).value("editableOptions",{theme:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus"}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory",function(a){return a({directiveName:"editableBsdate",inputTpl:''})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(a){return a({directiveName:"editableBstime",inputTpl:"",render:function(){this.parent.render.call(this);var a=angular.element('
');a.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(a.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(a)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(a){return a({directiveName:"editableCheckbox",inputT pl:'',render:function(){this.parent.render.call(this),this.attrs.eTitle&&(this.inputEl.wrap(""),this.inputEl.after(angular.element("").text(this.attrs.eTitle)))},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableChecklist",inputTpl:"",useCopy:!0,render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)}})}]),function(){var a="text|email|tel|number|url|searc h|color|date|datetime|time|month|week".split("|");angular.forEach(a,function(a){var b="editable"+a.charAt(0).toUpperCase()+a.slice(1);angular.module("xeditable").directive(b,["editableDirectiveFactory",function(c){return c({directiveName:b,inputTpl:''})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory",function(a){return a({directiveName:"editableRange",inputTpl:'',render:function(){this.parent.render.call(this),this.inputEl.after("{{$data}}")}})}])}(),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableRadiolist",inputTpl:"",render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(a){return a({directiveName:"editableSelect",inputTpl:"",autosubmit:function(){var a=this;a.inputEl.bind("change",function(){a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(a){return a({directiveName:"editableTextarea",inputTpl:"",addListeners:function(){var a=this;a.parent.addListeners.call(a),a.single&&"no"!==a.buttons&&a.autosubmit()},autosubmit:function(){var a=this;a.inputEl.bind("keydown",function(b){(b.ctrlKey||b.metaKey)&&13===b.keyCode&&a.scope.$apply(function(){a.sco pe.$form.$submit()})})}})}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(a,b){function c(a,c,d,e,f,g,h,i,j){var k,l,m=this;m.scope=a,m.elem=d,m.attrs=c,m.inputEl=null,m.editorEl=null,m.single=!0,m.error="",m.theme=f[g.theme]||f["default"],m.parent={},m.inputTpl="",m.directiveName="",m.useCopy=!1,m.single=null,m.buttons="right",m.init=function(b){if(m.single=b,m.name=c.eName||c[m.directiveName],!c[m.directiveName])throw"You should provide value for `"+m.directiveName+"` in editable element!";k=e(c[m.directiveName]),m.buttons=m.single?m.attrs.buttons||g.buttons:"no",c.eName&&m.scope.$watch("$data",function(a){m.scope.$form.$data[c.eName]=a}),c.onshow&&(m.onshow=function(){return m.catchError(e(c.onshow)(a))}),c.onhide&&(m.onhide=function(){return e(c.onhide)(a)}),c.oncancel&&(m.oncancel=function(){return e(c.oncancel)(a)}),c.onbeforesave&&(m.onbeforesave=function(){return m.catchError(e(c.onbeforesave)(a))}),c.onaftersave&&(m.onaftersave=fun ction(){return m.catchError(e(c.onaftersave)(a))}),a.$parent.$watch(c[m.directiveName],function(){m.handleEmpty()})},m.render=function(){var a=m.theme;m.inputEl=angular.element(m.inputTpl),m.controlsEl=angular.element(a.controlsTpl),m.controlsEl.append(m.inputEl),"no"!==m.buttons&&(m.buttonsEl=angular.element(a.buttonsTpl),m.submitEl=angular.element(a.submitTpl),m.cancelEl=angular.element(a.cancelTpl),m.buttonsEl.append(m.submitEl).append(m.cancelEl),m.controlsEl.append(m.buttonsEl),m.inputEl.addClass("editable-has-buttons")),m.errorEl=angular.element(a.errorTpl),m.controlsEl.append(m.errorEl),m.editorEl=angular.element(m.single?a.formTpl:a.noformTpl),m.editorEl.append(m.controlsEl);for(var d in c.$attr)if(!(d.length<=1)){var e=!1,f=d.substring(1,2);if("e"===d.substring(0,1)&&f===f.toUpperCase()&&(e=d.substring(1),"Form"!==e&&"NgSubmit"!==e)){e=e.substring(0,1).toLowerCase()+b.camelToDash(e.substring(1));var h=""===c[d]?e:c[d];m.inputEl.attr(e,h)}}m.inputEl.addClass("editable-input" ),m.inputEl.attr("ng-model","$data"),m.editorEl.addClass(b.camelToDash(m.directiveName)),m.single&&(m.editorEl.attr("editable-form","$form"),m.editorEl.attr("blur",m.attrs.blur||("no"===m.buttons?"cancel":g.blurElem))),angular.isFunction(a.postrender)&&a.postrender.call(m)},m.setLocalValue=function(){m.scope.$data=m.useCopy?angular.copy(k(a.$parent)):k(a.$parent)},m.show=function(){return m.setLocalValue(),m.render(),d.after(m.editorEl),i(m.editorEl)(a),m.addListeners(),d.addClass("editable-hide"),m.onshow()},m.hide=function(){return m.editorEl.remove(),d.removeClass("editable-hide"),m.onhide()},m.cancel=function(){m.oncancel()},m.addListeners=function(){m.inputEl.bind("keyup",function(a){if(m.single)switch(a.keyCode){case 27:m.scope.$apply(function(){m.scope.$form.$cancel()})}}),m.single&&"no"===m.buttons&&m.autosubmit(),m.editorEl.bind("click",function(a){1===a.which&&m.scope.$form.$visible&&(m.scope.$form._clicked=!0)})},m.setWaiting=function(a){a?(l=!m.inputEl.attr("disabled")&& !m.inputEl.attr("ng-disabled")&&!m.inputEl.attr("ng-enabled"),l&&(m.inputEl.attr("disabled","disabled"),m.buttonsEl&&m.buttonsEl.find("button").attr("disabled","disabled"))):l&&(m.inputEl.removeAttr("disabled"),m.buttonsEl&&m.buttonsEl.find("button").removeAttr("disabled"))},m.activate=function(){setTimeout(function(){var a=m.inputEl[0];"focus"===g.activate&&a.focus&&a.focus(),"select"===g.activate&&a.select&&a.select()},0)},m.setError=function(b){angular.isObject(b)||(a.$error=b,m.error=b)},m.catchError=function(a,b){return angular.isObject(a)&&b!==!0?j.when(a).then(angular.bind(this,function(a){this.catchError(a,!0)}),angular.bind(this,function(a){this.catchError(a,!0)})):b&&angular.isObject(a)&&a.status&&200!==a.status&&a.data&&angular.isString(a.data)?(this.setError(a.data),a=a.data):angular.isString(a)&&this.setError(a),a},m.save=function(){k.assign(a.$parent,angular.copy(m.scope.$data))},m.handleEmpty=function(){var b=k(a.$parent),c=null===b||void 0===b||""===b||angular.isArra y(b)&&0===b.length;d.toggleClass("editable-empty",c)},m.autosubmit=angular.noop,m.onshow=angular.noop,m.onhide=angular.noop,m.oncancel=angular.noop,m.onbeforesave=angular.noop,m.onaftersave=angular.noop}return c.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableOptions","$rootScope","$compile","$q"],c}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController",function(a,b,c,d,e,f,g){return function(b){return{restrict:"A",scope:!0,require:[b.directiveName,"?^form"],controller:f,link:function(c,f,h,i){var j,k=i[0],l=!1;if(i[1])j=i[1],l=!0;else if(h.eForm){var m=a(h.eForm)(c);if(m)j=m,l=!0;else for(var n=0;n=0&&a.splice(c,1),b},camelToDash:function(a){var b=/[A-Z]/g;return a.replace(b,function(a,b){return (b?"-":"")+a.toLowerCase()})},dashToCamel:function(a){var b=/([\:\-\_]+(.))/g,c=/^moz([A-Z])/;return a.replace(b,function(a,b,c,d){return d?c.toUpperCase():c}).replace(c,"Moz$1")}}}]),angular.module("xeditable").factory("editableNgOptionsParser",[function(){function a(a){var c;if(!(c=a.match(b)))throw"ng-options parse error";var d,e=c[2]||c[1],f=c[4]||c[6],g=c[5],h=(c[3]||"",c[2]?c[1]:f),i=c[7],j=c[8],k=j?c[8]:null;return void 0===g?(d=f+" in "+i,void 0!==j&&(d+=" track by "+k)):d="("+g+", "+f+") in "+i,{ngRepeat:d,locals:{valueName:f,keyName:g,valueFn:h,displayFn:e}}}var b=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;return a}]),angular.module("xeditable").factory("editableThemes",function(){var a={"default":{formTpl:'
',noformTpl:'',controlsTpl:'' ,inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs2:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:''},bs3:{formTpl:'
',noformTpl:'',controlsTpl:'
',inputTpl:"",errorTpl:'
',buttonsTpl:'',submitTpl:'',cancelTpl:'',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableTime":case"editableMonth":case"editableWeek":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-l g"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}}};return a}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/36063e13/modules/web-control-center/nodejs/routes/admin.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/routes/admin.js b/modules/web-control-center/nodejs/routes/admin.js index 87719b2..b15443e 100644 --- a/modules/web-control-center/nodejs/routes/admin.js +++ b/modules/web-control-center/nodejs/routes/admin.js @@ -17,12 +17,16 @@ var router = require('express').Router(); var db = require('../db'); -var uiUtils = require('../utils/ui-utils'); +var uiUtils = require('../helpers/ui-utils'); + +router.get('/', function(req, res) { + res.render('admin/index'); +}); /** * Get list of user accounts. */ -router.get('/ajax/list', function(req, res) { +router.post('/list', function(req, res) { db.Account.find({}, function (err, users) { if (err) return res.status(500).send(err.message); @@ -37,7 +41,7 @@ router.get('/ajax/list', function(req, res) { }); }); -router.get('/ajax/remove', function(req, res) { +router.post('/remove', function(req, res) { var userId = req.query.userId; db.Account.findByIdAndRemove(userId, function(err) { @@ -48,7 +52,7 @@ router.get('/ajax/remove', function(req, res) { }); }); -router.get('/ajax/setAdmin', function(req, res) { +router.post('/save', function(req, res) { var userId = req.query.userId; var adminFlag = req.query.adminFlag; @@ -60,12 +64,8 @@ router.get('/ajax/setAdmin', function(req, res) { }); }); -router.get('/userList', function(req, res) { - res.render('admin/userList'); -}); - -router.get('/become', function(req, res) { - var viewedUserId = req.query.viewedUserId; +router.post('/become', function(req, res) { + var viewedUserId = req.body.viewedUserId; if (!viewedUserId) { req.session.viewedUser = null; @@ -76,9 +76,8 @@ router.get('/become', function(req, res) { } db.Account.findById(viewedUserId, function(err, viewedUser) { - if (err) { + if (err) return res.sendStatus(404); - } req.session.viewedUser = {_id: viewedUser._id, username: viewedUser.username}; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/36063e13/modules/web-control-center/nodejs/routes/generator/common.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/routes/generator/common.js b/modules/web-control-center/nodejs/routes/generator/common.js new file mode 100644 index 0000000..763088c --- /dev/null +++ b/modules/web-control-center/nodejs/routes/generator/common.js @@ -0,0 +1,287 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var _ = require('lodash'); + +exports.mainComment = function() { + return 'This configuration was generated by Ignite Control Center (' + + formatDate(new Date()) + ')'; +}; + +function addLeadingZero(numberStr, minSize) { + if (typeof (numberStr) != 'string') + numberStr = '' + numberStr; + + while (numberStr.length < minSize) { + numberStr = '0' + numberStr; + } + + return numberStr; +} + +exports.formatDate = formatDate; + +function formatDate(date) { + var dd = addLeadingZero(date.getDate(), 2); + var mm = addLeadingZero(date.getMonth() + 1, 2); + + var yyyy = date.getFullYear(); + + return mm + '/' + dd + '/' + yyyy + ' ' + addLeadingZero(date.getHours(), 2) + ':' + addLeadingZero(date.getMinutes(), 2); +} + +exports.builder = function () { + var res = []; + + res.deep = 0; + res.lineStart = true; + + res.append = function(s) { + if (this.lineStart) { + for (var i = 0; i < this.deep; i++) + this.push(' '); + + this.lineStart = false; + } + + this.push(s); + + return this; + }; + + res.line = function(s) { + if (s) + this.append(s); + + this.push('\n'); + this.lineStart = true; + + return this; + }; + + res.startBlock = function(s) { + if (s) + this.append(s); + + this.push('\n'); + this.lineStart = true; + this.deep++; + + return this; + }; + + res.endBlock = function(s) { + this.deep--; + + if (s) + this.append(s); + + this.push('\n'); + this.lineStart = true; + + return this; + }; + + res.emptyLineIfNeeded = function() { + if (this.needEmptyLine) { + this.line(); + + this.needEmptyLine = false; + + return true; + } + + return false; + }; + + res.imports = {}; + + res.importClass = function(fullClassName) { + var dotIdx = fullClassName.lastIndexOf('.'); + + var shortName; + + if (dotIdx > 0) + shortName = fullClassName.substr(dotIdx + 1); + else + shortName = fullClassName; + + if (this.imports[shortName]) { + if (this.imports[shortName] != fullClassName) + throw "Class name conflict: " + this.imports[shortName] + ' and ' + fullClassName; + } + else { + this.imports[shortName] = fullClassName; + } + + return shortName; + }; + + res.generateImports = function() { + var res = []; + + for (var clsName in this.imports) { + if (this.imports.hasOwnProperty(clsName)) + res.push('import ' + this.imports[clsName] + ';'); + } + + return res.join('\n') + }; + + return res; +}; + +function ClassDescriptor(className, fields) { + this.className = className; + + this.fields = fields; +} + +exports.evictionPolicies = { + 'LRU': new ClassDescriptor('org.apache.ignite.cache.eviction.lru.LruEvictionPolicy', + {batchSize: null, maxMemorySize: null, maxSize: null}), + 'RND': new ClassDescriptor('org.apache.ignite.cache.eviction.random.RandomEvictionPolicy', {maxSize: null}), + 'FIFO': new ClassDescriptor('org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy', + {batchSize: null, maxMemorySize: null, maxSize: null}), + 'SORTED': new ClassDescriptor('org.apache.ignite.cache.eviction.sorted.SortedEvictionPolicy', + {batchSize: null, maxMemorySize: null, maxSize: null}) +}; + +exports.knownClasses = { + Oracle: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.OracleDialect', {}), + DB2: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.DB2Dialect', {}), + SQLServer: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.SQLServerDialect', {}), + MySQL: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.MySQLDialect', {}), + PostgreSQL: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect', {}), + H2: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.dialect.H2Dialect', {}) +}; + +exports.dataSources = { + Oracle: 'oracle.jdbc.pool.OracleDataSource', + DB2: 'com.ibm.db2.jcc.DB2ConnectionPoolDataSource', + SQLServer: 'com.microsoft.sqlserver.jdbc.SQLServerDataSource', + MySQL: 'com.mysql.jdbc.jdbc2.optional.MysqlDataSource', + PostgreSQL: 'org.postgresql.ds.PGPoolingDataSource', + H2: 'org.h2.jdbcx.JdbcDataSource' +}; + +exports.storeFactories = { + CacheJdbcPojoStoreFactory: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory', { + dataSourceBean: null, + dialect: {type: 'className'} + }), + + CacheJdbcBlobStoreFactory: new ClassDescriptor('org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStoreFactory', { + user: null, + dataSourceBean: null, + initSchema: null, + createTableQuery: null, + loadQuery: null, + insertQuery: null, + updateQuery: null, + deleteQuery: null + }), + + CacheHibernateBlobStoreFactory: new ClassDescriptor('org.apache.ignite.cache.store.hibernate.CacheHibernateBlobStoreFactory', { + hibernateProperties: {type: 'propertiesAsList', propVarName: 'props'} + }) +}; + +exports.atomicConfiguration = new ClassDescriptor('org.apache.ignite.configuration.AtomicConfiguration', { + backups: null, + cacheMode: {type: 'enum', enumClass: 'CacheMode'}, + atomicSequenceReserveSize: null +}); + +exports.swapSpaceSpi = new ClassDescriptor('org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi', { + baseDirectory: null, + readStripesNumber: null, + maximumSparsity: {type: 'float'}, + maxWriteQueueSize: null, + writeBufferSize: null +}); + +exports.transactionConfiguration = new ClassDescriptor('org.apache.ignite.configuration.TransactionConfiguration', { + defaultTxConcurrency: {type: 'enum', enumClass: 'TransactionConcurrency'}, + transactionIsolation: {type: 'TransactionIsolation', setterName: 'defaultTxIsolation'}, + defaultTxTimeout: null, + pessimisticTxLogLinger: null, + pessimisticTxLogSize: null, + txSerializableEnabled: null +}); + +exports.hasProperty = function(obj, props) { + for (var propName in props) { + if (props.hasOwnProperty(propName)) { + if (obj[propName]) + return true; + } + } + + return false; +}; + +/** + * Convert some name to valid java name. + * + * @param name to convert. + * @returns {string} Valid java name. + */ +exports.toJavaName = function(name) { + var javaName = name.replace(/[^A-Za-z_0-9]+/, '_'); + + return javaName.charAt(0).toLocaleUpperCase() + javaName.slice(1); +}; + +/** + * Generate properties file with properties stubs for stores data sources. + * + * @param cluster Configuration to process. + * @returns {string} Generated content. + */ +exports.generateProperties = function(cluster) { + var res = builder(); + + 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); + + 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(); + } + } + } + }); + } + + if (datasources.length > 0) + return '# ' + mainComment() + '\n\n' + res.join(); + + return ''; +}; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/36063e13/modules/web-control-center/nodejs/routes/generator/java.js ---------------------------------------------------------------------- diff --git a/modules/web-control-center/nodejs/routes/generator/java.js b/modules/web-control-center/nodejs/routes/generator/java.js new file mode 100644 index 0000000..037df10 --- /dev/null +++ b/modules/web-control-center/nodejs/routes/generator/java.js @@ -0,0 +1,608 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var _ = require('lodash'); + +var generatorUtils = require("./common"); + +exports.generateClusterConfiguration = function(cluster, generateJavaClass) { + var res = generatorUtils.builder(); + + res.datasourceBeans = []; + + if (generateJavaClass) { + res.line('/**'); + res.line(' * ' + generatorUtils.mainComment()); + res.line(' */'); + res.startBlock('public class ConfigurationFactory {'); + res.line('/**'); + res.line(' * Configure grid.'); + res.line(' */'); + res.startBlock('public IgniteConfiguration createConfiguration() {'); + } + + res.importClass('org.apache.ignite.configuration.IgniteConfiguration'); + + res.line('IgniteConfiguration cfg = new IgniteConfiguration();'); + res.line(); + + if (cluster.discovery) { + var d = cluster.discovery; + + res.importClass('org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi'); + res.line('TcpDiscoverySpi discovery = new TcpDiscoverySpi();'); + + switch (d.kind) { + case 'Multicast': + addBeanWithProperties(res, d.Multicast, 'discovery', 'ipFinder', 'ipFinder', + 'org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder', { + multicastGroup: null, + multicastPort: null, + responseWaitTime: null, + addressRequestAttempts: null, + localAddress: null + }, true); + + break; + + case 'Vm': + addBeanWithProperties(res, d.Vm, 'discovery', 'ipFinder', 'ipFinder', + 'org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder', { + addresses: {type: 'list'} + }, true); + + break; + + case 'S3': + if (d.S3) { + addBeanWithProperties(res, d.S3, 'discovery', 'ipFinder', 'ipFinder', + 'org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder', {bucketName: null}, + true); + } + else { + res.importClass('org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder'); + + res.line('discovery.setIpFinder(new TcpDiscoveryS3IpFinder());'); + } + + break; + + case 'Cloud': + addBeanWithProperties(res, d.Cloud, 'discovery', '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': + addBeanWithProperties(res, d.GoogleStorage, 'discovery', 'ipFinder', 'ipFinder', + 'org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder', { + projectName: null, + bucketName: null, + serviceAccountP12FilePath: null + }, true); + + //if (d.GoogleStorage.addrReqAttempts) todo ???? + // res.line(''); + + break; + + case 'Jdbc': + res.importClass('org.apache.ignite.spi.discovery.tcp.ipfinder.jdbc.TcpDiscoveryJdbcIpFinder'); + + res.line(); + res.line('TcpDiscoveryJdbcIpFinder ipFinder = new TcpDiscoveryJdbcIpFinder();'); + res.line('ipFinder.setInitSchema(' + (d.Jdbc.initSchema != null || d.Jdbc.initSchema) + ');'); + res.line('discovery.setIpFinder(ipFinder);'); + res.needEmptyLine = true; + + break; + + case 'SharedFs': + addBeanWithProperties(res, d.SharedFs, 'discovery', 'ipFinder', 'ipFinder', + 'org.apache.ignite.spi.discovery.tcp.ipfinder.sharedfs.TcpDiscoverySharedFsIpFinder', {path: null}, + true); + + break; + + default: + throw "Unknown discovery kind: " + d.kind; + } + + res.emptyLineIfNeeded(); + + res.line('cfg.setDiscoverySpi(discovery);'); + + res.needEmptyLine = true; + } + + if (cluster.caches && cluster.caches.length > 0) { + res.emptyLineIfNeeded(); + + var names = []; + + for (var i = 0; i < cluster.caches.length; i++) { + res.emptyLineIfNeeded(); + + var cache = cluster.caches[i]; + + var cacheName = 'cache' + generatorUtils.toJavaName(cache.name); + + names.push(cacheName); + + generateCacheConfiguration(cache, cacheName, res); + + res.needEmptyLine = true; + } + + res.emptyLineIfNeeded(); + + res.append('cfg.setCacheConfiguration('); + + for (i = 0; i < names.length; i++) { + if (i > 0) + res.append(', '); + + res.append(names[i]); + } + + res.line(');'); + + res.needEmptyLine = true; + } + + addBeanWithProperties(res, cluster.atomicConfiguration, 'cfg', 'atomicConfiguration', 'atomicCfg', + generatorUtils.atomicConfiguration.className, generatorUtils.atomicConfiguration.fields); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'networkTimeout'); + addProperty(res, cluster, 'cfg', 'networkSendRetryDelay'); + addProperty(res, cluster, 'cfg', 'networkSendRetryCount'); + addProperty(res, cluster, 'cfg', 'segmentCheckFrequency'); + addProperty(res, cluster, 'cfg', 'waitForSegmentOnStart'); + addProperty(res, cluster, 'cfg', 'discoveryStartupDelay'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'deploymentMode', 'DeploymentMode'); + + res.needEmptyLine = true; + + 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'); + + for (i = 1; i < cluster.includeEventTypes.length; i++) { + res.line(); + + res.append(' + EventType.' + cluster.includeEventTypes[i] + '.length'); + } + + res.line('];'); + res.line(); + res.line('int k = 0;'); + + for (i = 0; i < cluster.includeEventTypes.length; i++) { + res.line(); + + var e = cluster.includeEventTypes[i]; + + res.line('System.arraycopy(EventType.' + e + ', 0, events, k, EventType.' + e + '.length);'); + res.line('k += EventType.' + e + '.length;'); + } + + res.line(); + res.line('cfg.setIncludeEventTypes(events);'); + } + + res.needEmptyLine = true; + } + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'marshalLocalJobs'); + addProperty(res, cluster, 'cfg', 'marshCacheKeepAliveTime'); + addProperty(res, cluster, 'cfg', 'marshCachePoolSize'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'metricsExpireTime'); + addProperty(res, cluster, 'cfg', 'metricsHistorySize'); + addProperty(res, cluster, 'cfg', 'metricsLogFrequency'); + addProperty(res, cluster, 'cfg', 'metricsUpdateFrequency'); + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'peerClassLoadingEnabled'); + addMultiparamProperty(res, cluster, 'cfg', 'peerClassLoadingLocalClassPathExclude'); + addProperty(res, cluster, 'cfg', 'peerClassLoadingMissedResourcesCacheSize'); + addProperty(res, cluster, 'cfg', 'peerClassLoadingThreadPoolSize'); + res.needEmptyLine = true; + + if (cluster.swapSpaceSpi && cluster.swapSpaceSpi.kind == 'FileSwapSpaceSpi') { + addBeanWithProperties(res, cluster.swapSpaceSpi.FileSwapSpaceSpi, 'cfg', 'swapSpaceSpi', 'swapSpi', + generatorUtils.swapSpaceSpi.className, generatorUtils.swapSpaceSpi.fields, true); + + res.needEmptyLine = true; + } + + addProperty(res, cluster, 'cfg', 'clockSyncSamples'); + addProperty(res, cluster, 'cfg', 'clockSyncFrequency'); + addProperty(res, cluster, 'cfg', 'timeServerPortBase'); + addProperty(res, cluster, 'cfg', 'timeServerPortRange'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'publicThreadPoolSize'); + addProperty(res, cluster, 'cfg', 'systemThreadPoolSize'); + addProperty(res, cluster, 'cfg', 'managementThreadPoolSize'); + addProperty(res, cluster, 'cfg', 'igfsThreadPoolSize'); + + res.needEmptyLine = true; + + addBeanWithProperties(res, cluster.transactionConfiguration, 'cfg', 'transactionConfiguration', + 'transactionConfiguration', generatorUtils.transactionConfiguration.className, + generatorUtils.transactionConfiguration.fields); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'cacheSanityCheckEnabled'); + + res.needEmptyLine = true; + + addProperty(res, cluster, 'cfg', 'utilityCacheKeepAliveTime'); + addProperty(res, cluster, 'cfg', 'utilityCachePoolSize'); + + if (generateJavaClass) { + res.line(); + res.line('return cfg;'); + res.endBlock('}'); + res.endBlock('}'); + + return res.generateImports() + '\n\n' + res.join('') + } + + return res.join(''); +}; + +function createEvictionPolicy(res, evictionPolicy, varName, propertyName) { + if (evictionPolicy && evictionPolicy.kind) { + var e = generatorUtils.evictionPolicies[evictionPolicy.kind]; + + var obj = evictionPolicy[evictionPolicy.kind.toUpperCase()]; + + addBeanWithProperties(res, obj, varName, propertyName, propertyName, e.className, e.fields, true); + } +} + +exports.generateCacheConfiguration = generateCacheConfiguration; + +/** + * Generate java code for cache configuration. + * + * @param cacheCfg Cache config. + * @param varName Variable name. + * @param res Result builder. + * @returns {*} Append generated java code to builder and return it. + */ +function generateCacheConfiguration(cacheCfg, varName, res) { + if (!res) + res = generatorUtils.builder(); + + res.emptyLineIfNeeded(); + + res.importClass('org.apache.ignite.configuration.CacheConfiguration'); + + res.line('CacheConfiguration ' + varName + ' = new CacheConfiguration();'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'name'); + + addProperty(res, cacheCfg, varName, 'mode', 'CacheMode', 'cacheMode'); + + addProperty(res, cacheCfg, varName, 'atomicityMode', 'CacheAtomicityMode'); + addProperty(res, cacheCfg, varName, 'backups'); + addProperty(res, cacheCfg, varName, 'startSize'); + addProperty(res, cacheCfg, varName, 'readFromBackup'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'memoryMode', 'CacheMemoryMode'); + addProperty(res, cacheCfg, varName, 'offHeapMaxMemory'); + addProperty(res, cacheCfg, varName, 'swapEnabled'); + addProperty(res, cacheCfg, varName, 'copyOnRead'); + + res.needEmptyLine = true; + + createEvictionPolicy(res, cacheCfg.evictionPolicy, varName, 'evictionPolicy'); + + if (cacheCfg.nearConfiguration && (cacheCfg.nearConfiguration.nearStartSize || cacheCfg.nearConfiguration.nearEvictionPolicy.kind)) { + res.needEmptyLine = true; + + addBeanWithProperties(res, cacheCfg.nearConfiguration, varName, 'nearConfiguration', 'nearConfiguration', + 'org.apache.ignite.configuration.NearCacheConfiguration', + {nearStartSize: null, atomicSequenceReserveSize: null}, true); + + if (cacheCfg.nearConfiguration && cacheCfg.nearConfiguration.nearEvictionPolicy && cacheCfg.nearConfiguration.nearEvictionPolicy.kind) { + createEvictionPolicy(res, cacheCfg.nearConfiguration.nearEvictionPolicy, 'nearConfiguration', 'nearEvictionPolicy'); + } + } + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'sqlEscapeAll'); + addProperty(res, cacheCfg, varName, 'sqlOnheapRowCacheSize'); + addProperty(res, cacheCfg, varName, 'longQueryWarningTimeout'); + + if (cacheCfg.indexedTypes && cacheCfg.indexedTypes.length > 0) { + res.emptyLineIfNeeded(); + + res.append(varName + '.setIndexedTypes('); + + for (var i = 0; i < cacheCfg.indexedTypes.length; i++) { + if (i > 0) + res.append(', '); + + var pair = cacheCfg.indexedTypes[i]; + + res.append(toJavaCode(pair.keyClass, 'class')).append(', ').append(toJavaCode(pair.valueClass, 'class')) + } + + res.line(');'); + } + + addMultiparamProperty(res, cacheCfg, varName, 'sqlFunctionClasses', 'class'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'rebalanceMode', 'CacheRebalanceMode'); + addProperty(res, cacheCfg, varName, 'rebalanceThreadPoolSize'); + addProperty(res, cacheCfg, varName, 'rebalanceBatchSize'); + addProperty(res, cacheCfg, varName, 'rebalanceOrder'); + addProperty(res, cacheCfg, varName, 'rebalanceDelay'); + addProperty(res, cacheCfg, varName, 'rebalanceTimeout'); + addProperty(res, cacheCfg, varName, 'rebalanceThrottle'); + + res.needEmptyLine = true; + + if (cacheCfg.cacheStoreFactory && cacheCfg.cacheStoreFactory.kind) { + var storeFactory = cacheCfg.cacheStoreFactory[cacheCfg.cacheStoreFactory.kind]; + var data = generatorUtils.storeFactories[cacheCfg.cacheStoreFactory.kind]; + + var sfVarName = 'storeFactory' + generatorUtils.toJavaName(cacheCfg.name); + var dsVarName = 'none'; + + if (storeFactory.dialect) { + var dataSourceBean = storeFactory.dataSourceBean; + + dsVarName = 'dataSource' + generatorUtils.toJavaName(dataSourceBean); + + if (!_.contains(res.datasourceBeans, dataSourceBean)) { + res.datasourceBeans.push(dataSourceBean); + + var dataSource = generatorUtils.dataSources[storeFactory.dialect]; + + res.line(); + res.line(dataSource.className + ' ' + dsVarName + ' = new ' + dataSource.className + '();'); + res.line(dsVarName + '.setURL(_URL_);'); + res.line(dsVarName + '.setUsername(_User_Name_);'); + res.line(dsVarName + '.setPassword(_Password_);'); + } + } + + addBeanWithProperties(res, storeFactory, varName, 'cacheStoreFactory', sfVarName, data.className, + data.fields, true); + + if (dsVarName != 'none') + res.line(sfVarName + '.setDataSource(' + dsVarName + ');'); + } + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'loadPreviousValue'); + addProperty(res, cacheCfg, varName, 'readThrough'); + addProperty(res, cacheCfg, varName, 'writeThrough'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'invalidate'); + addProperty(res, cacheCfg, varName, 'defaultLockTimeout'); + addProperty(res, cacheCfg, varName, 'transactionManagerLookupClassName'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'writeBehindEnabled'); + addProperty(res, cacheCfg, varName, 'writeBehindBatchSize'); + addProperty(res, cacheCfg, varName, 'writeBehindFlushSize'); + addProperty(res, cacheCfg, varName, 'writeBehindFlushFrequency'); + addProperty(res, cacheCfg, varName, 'writeBehindFlushThreadCount'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'statisticsEnabled'); + addProperty(res, cacheCfg, varName, 'managementEnabled'); + + res.needEmptyLine = true; + + addProperty(res, cacheCfg, varName, 'maxConcurrentAsyncOperations'); + + return res; +} + +function toJavaCode(val, type) { + if (val == null) + return 'null'; + + if (type == 'float') + return val + 'f'; + + if (type == 'class') + return val + '.class'; + + if (type) + return type + '.' + val; + + if (typeof(val) == 'string') + return '"' + val.replace('"', '\\"') + '"'; + + if (typeof(val) == 'number' || typeof(val) == 'boolean') + return '' + val; + + throw "Unknown type: " + typeof(val) + ' (' + val + ')'; +} + +function addProperty(res, obj, objVariableName, propName, enumType, setterName) { + var val = obj[propName]; + + if (val) { + res.emptyLineIfNeeded(); + + res.line(objVariableName + '.' + getSetterName(setterName ? setterName : propName) + + '(' + toJavaCode(val, enumType) + ');'); + } +} + +function getSetterName(propName) { + return 'set' + propName.charAt(0).toLocaleUpperCase() + propName.slice(1); +} + +function addListProperty(res, obj, objVariableName, propName, enumType, setterName) { + var val = obj[propName]; + + if (val && val.length > 0) { + res.append(objVariableName + '.' + getSetterName(setterName ? setterName : propName) + '(Arrays.asList('); + + for (var i = 0; i < val.length; i++) { + if (i > 0) + res.append(', '); + + res.append(toJavaCode(val[i], enumType)); + } + + res.line('));'); + } +} + +function addMultiparamProperty(res, obj, objVariableName, propName, type, setterName) { + var val = obj[propName]; + + if (val && val.length > 0) { + res.append(objVariableName + '.' + getSetterName(setterName ? setterName : propName) + '('); + + for (var i = 0; i < val.length; i++) { + if (i > 0) + res.append(', '); + + res.append(toJavaCode(val[i], type)); + } + + res.line(');'); + } +} + +function addBeanWithProperties(res, bean, objVarName, beanPropName, beanVarName, beanClass, props, createBeanAlthoughNoProps) { + if (!bean) + return; + + if (generatorUtils.hasProperty(bean, props)) { + if (!res.emptyLineIfNeeded()) { + res.line(); + } + + res.line(beanClass + ' ' + beanVarName + ' = new ' + beanClass + '();'); + + for (var propName in props) { + if (props.hasOwnProperty(propName)) { + var descr = props[propName]; + + if (descr) { + switch (descr.type) { + case 'list': + addListProperty(res, bean, beanVarName, propName, descr.elementsType, descr.setterName); + break; + + case 'enum': + addProperty(res, bean, beanVarName, propName, descr.enumClass, descr.setterName); + break; + + case 'float': + addProperty(res, bean, beanVarName, propName, 'float', descr.setterName); + break; + + case 'propertiesAsList': + var val = bean[propName]; + + if (val && val.length > 0) { + res.line('Properties ' + descr.propVarName + ' = new Properties();'); + + for (var i = 0; i < val.length; i++) { + var nameAndValue = val[i]; + + var eqIndex = nameAndValue.indexOf('='); + if (eqIndex >= 0) { + res.line(descr.propVarName + '.setProperty(' + + nameAndValue.substring(0, eqIndex) + ', ' + + nameAndValue.substr(eqIndex + 1) + ');'); + } + + } + + res.line(beanVarName + '.' + getSetterName(propName) + '(' + descr.propVarName + ');'); + } + break; + + case 'className': + if (bean[propName]) { + res.line(beanVarName + '.' + getSetterName(propName) + '(new ' + generatorUtils.knownClasses[bean[propName]].className + '());'); + } + + break; + + default: + addProperty(res, bean, beanVarName, propName, null, descr.setterName); + } + } + else { + addProperty(res, bean, beanVarName, propName); + } + } + } + + res.line(objVarName + '.' + getSetterName(beanPropName) + '(' + beanVarName + ');'); + + res.needEmptyLine = true; + } + else if (createBeanAlthoughNoProps) { + res.emptyLineIfNeeded(); + + res.line(objVarName + '.' + getSetterName(beanPropName) + '(new ' + beanClass + '());'); + } +}