AMBARI-19742. User preference like opened tabs/work in-progress should not be available to a different user. (Venkata Sairam via gauravn7)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fb951387 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fb951387 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fb951387 Branch: refs/heads/branch-dev-patch-upgrade Commit: fb951387706387651f3b31d34f4c16c9b4c9ec4a Parents: cc30798 Author: Gaurav Nagar <grv...@gmail.com> Authored: Fri Jan 27 19:26:33 2017 +0530 Committer: Gaurav Nagar <grv...@gmail.com> Committed: Fri Jan 27 19:29:25 2017 +0530 ---------------------------------------------------------------------- .../ui/app/components/bundle-config.js | 27 ++++++--- .../resources/ui/app/components/coord-config.js | 64 +++++++++++--------- .../ui/app/components/designer-workspace.js | 25 ++++---- .../ui/app/components/flow-designer.js | 12 ++-- .../main/resources/ui/app/services/user-info.js | 56 +++++++++++++++++ .../ui/app/services/workspace-manager.js | 61 ++++++++++++++----- .../ui/tests/unit/services/user-info-test.js | 29 +++++++++ 7 files changed, 207 insertions(+), 67 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js index e29935c..8b4c3d8 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/bundle-config.js @@ -48,23 +48,19 @@ export default Ember.Component.extend(Ember.Evented, Validations, { fileBrowser : Ember.inject.service('file-browser'), workspaceManager : Ember.inject.service('workspace-manager'), initialize : function(){ - var draftBundle = this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')); - if(draftBundle){ - this.set('bundle', JSON.parse(draftBundle)); - }else{ - this.set('bundle', this.createBundle()); - } + var self = this; + this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')).promise.then(function(draftBundle){ + self.loadBundle(draftBundle); + }.bind(this)).catch(function(data){ + self.loadBundle(); + }.bind(this)); this.get('fileBrowser').on('fileBrowserOpened',function(context){ this.get('fileBrowser').setContext(context); }.bind(this)); this.on('fileSelected',function(fileName){ this.set(this.get('filePathModel'), fileName); }.bind(this)); - if(Ember.isBlank(this.get('bundle.name'))){ - this.set('bundle.name', Ember.copy(this.get('tabInfo.name'))); - } this.set('showErrorMessage', false); - this.schedulePersistWorkInProgress(); }.on('init'), onDestroy : function(){ Ember.run.cancel(this.schedulePersistWorkInProgress); @@ -92,6 +88,17 @@ export default Ember.Component.extend(Ember.Evented, Validations, { bundleFilePath : Ember.computed('tabInfo.filePath', function(){ return this.get('tabInfo.filePath'); }), + loadBundle(draftBundle){ + if(draftBundle){ + this.set('bundle', JSON.parse(draftBundle)); + }else{ + this.set('bundle', this.createBundle()); + } + if(Ember.isBlank(this.get('bundle.name'))){ + this.set('bundle.name', Ember.copy(this.get('tabInfo.name'))); + } + this.schedulePersistWorkInProgress(); + }, schedulePersistWorkInProgress (){ Ember.run.later(function(){ this.persistWorkInProgress(); http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js index fa664c7..57dbeb0 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/coord-config.js @@ -75,22 +75,13 @@ export default Ember.Component.extend(Validations, Ember.Evented, { this.persistWorkInProgress(); }.on('willDestroyElement'), initialize : function(){ - var draftCoordinator = this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')); - if(draftCoordinator){ - this.set('coordinator', JSON.parse(draftCoordinator)); - }else{ - this.set('coordinator', this.createNewCoordinator()); - } - this.set('timeUnitOptions',Ember.A([])); - this.get('timeUnitOptions').pushObject({value:'',displayName:'Select'}); - this.get('timeUnitOptions').pushObject({value:'months',displayName:'Months'}); - this.get('timeUnitOptions').pushObject({value:'endOfMonths',displayName:'End of Months'}); - this.get('timeUnitOptions').pushObject({value:'days',displayName:'Days'}); - this.get('timeUnitOptions').pushObject({value:'endOfDays',displayName:'End of Days'}); - this.get('timeUnitOptions').pushObject({value:'hours',displayName:'Hours'}); - this.get('timeUnitOptions').pushObject({value:'minutes',displayName:'Minutes'}); - this.get('timeUnitOptions').pushObject({value:'cron',displayName:'Cron'}); - this.set('coordinator.slaInfo', SlaInfo.create({})); + var self = this; + + this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')).promise.then(function(draftCoordinator){ + self.loadCoordinator(draftCoordinator); + }.bind(this)).catch(function(data){ + self.loadCoordinator(); + }.bind(this)); this.get('fileBrowser').on('fileBrowserOpened',function(context){ this.get('fileBrowser').setContext(context); @@ -98,18 +89,7 @@ export default Ember.Component.extend(Validations, Ember.Evented, { this.on('fileSelected',function(fileName){ this.set(this.get('filePathModel'), fileName); }.bind(this)); - this.set('coordinatorControls',[ - {'name':'timeout', 'displayName':'Timeout', 'value':''}, - {'name':'concurrency', 'displayName':'Concurrency', 'value':''}, - {'name':'execution', 'displayName':'Execution', 'value':''}, - {'name':'throttle', 'displayName':'Throttle', 'value':''} - ]); - this.set('timezoneList', Ember.copy(Constants.timezoneList)); - if(Ember.isBlank(this.get('coordinator.name'))){ - this.set('coordinator.name', Ember.copy(this.get('tabInfo.name'))); - } - this.schedulePersistWorkInProgress(); - this.set('childComponents', new Map()); + }.on('init'), conditionalDataInExists :false, elementsInserted : function(){ @@ -141,6 +121,34 @@ export default Ember.Component.extend(Validations, Ember.Evented, { this.sendAction('changeTabName', this.get('tabInfo'), this.get('coordinator.name')); } }), + loadCoordinator(draftCoordinator){ + if(draftCoordinator){ + this.set('coordinator', JSON.parse(draftCoordinator)); + }else{ + this.set('coordinator', this.createNewCoordinator()); + } + this.set('timeUnitOptions',Ember.A([])); + this.get('timeUnitOptions').pushObject({value:'',displayName:'Select'}); + this.get('timeUnitOptions').pushObject({value:'months',displayName:'Months'}); + this.get('timeUnitOptions').pushObject({value:'endOfMonths',displayName:'End of Months'}); + this.get('timeUnitOptions').pushObject({value:'days',displayName:'Days'}); + this.get('timeUnitOptions').pushObject({value:'endOfDays',displayName:'End of Days'}); + this.get('timeUnitOptions').pushObject({value:'hours',displayName:'Hours'}); + this.get('timeUnitOptions').pushObject({value:'minutes',displayName:'Minutes'}); + this.get('timeUnitOptions').pushObject({value:'cron',displayName:'Cron'}); + this.set('coordinator.slaInfo', SlaInfo.create({})); + this.set('coordinatorControls',[ + {'name':'timeout', 'displayName':'Timeout', 'value':''}, + {'name':'concurrency', 'displayName':'Concurrency', 'value':''}, + {'name':'execution', 'displayName':'Execution', 'value':''}, + {'name':'throttle', 'displayName':'Throttle', 'value':''} + ]); + this.set('timezoneList', Ember.copy(Constants.timezoneList)); + if(Ember.isBlank(this.get('coordinator.name'))){ + this.set('coordinator.name', Ember.copy(this.get('tabInfo.name'))); + } + this.schedulePersistWorkInProgress(); + }, coordinatorFilePath : Ember.computed('tabInfo.filePath', function(){ return this.get('tabInfo.filePath'); }), http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js index 53fd27d..5b517af 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js @@ -19,6 +19,7 @@ import CommonUtils from "../utils/common-utils"; import Constants from '../utils/constants'; export default Ember.Component.extend({ workspaceManager : Ember.inject.service('workspace-manager'), + userInfo : Ember.inject.service('user-info'), xmlAppPath : null, appPath : null, type : 'wf', @@ -42,18 +43,20 @@ export default Ember.Component.extend({ this.get('tabCounter').set('wf', 0); this.get('tabCounter').set('coord', 0); this.get('tabCounter').set('bundle', 0); - var tabs = this.get('workspaceManager').restoreTabs(); - if(tabs){ - this.set('tabs', tabs); - } - this.get('tabs').forEach((tab)=>{ - this.get('tabCounter').set(tab.type, (this.get('tabCounter').get(tab.type)) + 1); - }, this); - - Ember.getOwner(this).lookup('route:design').on('openNewTab', function(path){ - this.createNewTab('wf', path); - }.bind(this)); + var tabsData = this.get('workspaceManager').restoreTabs(); + tabsData.promise.then(function(tabs){ + if(tabs){ + this.set('tabs', tabs); + } + this.get('tabs').forEach((tab)=>{ + this.get('tabCounter').set(tab.type, (this.get('tabCounter').get(tab.type)) + 1); + }, this); + Ember.getOwner(this).lookup('route:design').on('openNewTab', function(path){ + this.createNewTab('wf', path); + }.bind(this)); + }.bind(this)).catch(function(data){ + }); }.on('init'), elementsInserted : function(){ this.$('.nav-tabs a[data-toggle="tab"]').on('shown.bs.tab', function (e) { http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js index 0a0d2f2..1292832 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js @@ -586,10 +586,14 @@ export default Ember.Component.extend(FindNodeMixin, Validations, { }, getDraftWorkflow(){ var deferred = Ember.RSVP.defer(); - var drafWorkflowJson = this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')); - var workflowImporter=WorkflowJsonImporter.create({}); - var workflow=workflowImporter.importWorkflow(drafWorkflowJson); - deferred.resolve(workflow); + + this.get('workspaceManager').restoreWorkInProgress(this.get('tabInfo.id')).promise.then(function(drafWorkflowJson){ + var workflowImporter=WorkflowJsonImporter.create({}); + var workflow=workflowImporter.importWorkflow(drafWorkflowJson); + deferred.resolve(workflow); + }.bind(this)).catch(function(data){ + deferred.resolve(""); + }); return deferred; }, createSnapshot() { http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/services/user-info.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/services/user-info.js b/contrib/views/wfmanager/src/main/resources/ui/app/services/user-info.js new file mode 100644 index 0000000..7c59f40 --- /dev/null +++ b/contrib/views/wfmanager/src/main/resources/ui/app/services/user-info.js @@ -0,0 +1,56 @@ +/* +* 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. +*/ + +import Ember from 'ember'; + +export default Ember.Service.extend({ + data:null, + userName: null, + init() { + }, + getUserData(){ + var url = Ember.ENV.API_URL + "/getCurrentUserName", self = this; + var deferred = Ember.RSVP.defer(); + if(self.get("userName") !== null && self.get("userName") !== undefined){ + deferred.resolve(self.get("userName")); + } else{ + Ember.$.ajax({ + url: url, + method: 'GET', + dataType: "text", + beforeSend: function (xhr) { + xhr.setRequestHeader("X-XSRF-HEADER", Math.round(Math.random()*100000)); + xhr.setRequestHeader("X-Requested-By", "Ambari"); + } + }).done(function(data){ + self.set("userName", data); + deferred.resolve(data); + }).fail(function(data){ + self.set("userName", ""); + deferred.reject(data); + }); + } + return deferred; + }, + setUserData(data){ + this.set("data", data); + }, + getUserName(){ + var res = this.getUserData(); + return res; + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/app/services/workspace-manager.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/services/workspace-manager.js b/contrib/views/wfmanager/src/main/resources/ui/app/services/workspace-manager.js index 24ab53c..c377ecc 100644 --- a/contrib/views/wfmanager/src/main/resources/ui/app/services/workspace-manager.js +++ b/contrib/views/wfmanager/src/main/resources/ui/app/services/workspace-manager.js @@ -20,18 +20,36 @@ import Ember from 'ember'; export default Ember.Service.extend({ tabsInfo : {}, workInProgress : {}, + userInfo : Ember.inject.service('user-info'), setLastActiveTab(tabId){ - console.log("setting last active tabId "+tabId); - localStorage.setItem('lastActiveTab', tabId); + this.get("userInfo").getUserData().promise.then(function(data){ + localStorage.setItem(data+"-lastActiveTab", tabId); + }.bind(this)).catch(function(e){ + console.error(e); + }); }, getLastActiveTab(){ - console.log("get last active "+localStorage.getItem('lastActiveTab')); - return localStorage.getItem('lastActiveTab'); + this.get("userInfo").getUserData().promise.then(function(data){ + return localStorage.getItem(data+"-lastActiveTab"); + }.bind(this)).catch(function(e){ + console.error(e); + }); }, restoreTabs(){ - var tabs = localStorage.getItem('tabsInfo'); - console.log("Restoring tabs "+tabs); - return JSON.parse(tabs); + var deferred = Ember.RSVP.defer(); + + this.get("userInfo").getUserData().promise.then(function(data){ + var tabs = localStorage.getItem(data+'-tabsInfo'); + console.log("Restoring tabs "+tabs); + deferred.resolve(JSON.parse(tabs)); + + //return JSON.parse(tabs); + + }.bind(this)).catch(function(e){ + deferred.resolve(""); + console.error(e); + }); + return deferred; }, saveTabs(tabs){ if(!tabs){ @@ -46,18 +64,33 @@ export default Ember.Service.extend({ filePath : tab.filePath }); }); - console.log("Saving tabs "+JSON.stringify(tabArray)); - localStorage.setItem('tabsInfo', JSON.stringify(tabArray)); + this.get("userInfo").getUserData().promise.then(function(data){ + localStorage.setItem(data+'-tabsInfo', JSON.stringify(tabArray)); + }.bind(this)).catch(function(e){ + console.error(e); + }); }, restoreWorkInProgress(id){ - console.log("Restoring workInProgress "+id); - return localStorage.getItem(id); + var deferred = Ember.RSVP.defer(); + this.get("userInfo").getUserData().promise.then(function(data){ + deferred.resolve(localStorage.getItem(data+"-"+id)); + }.bind(this)).catch(function(data){ + deferred.resolve(""); + }); + return deferred; }, saveWorkInProgress(id, workInProgress){ - console.log("Restoring workInProgress "+id); - localStorage.setItem(id, workInProgress); + this.get("userInfo").getUserData().promise.then(function(data){ + localStorage.setItem(data+"-"+id, workInProgress); + }.bind(this)).catch(function(e){ + console.error(e); + }); }, deleteWorkInProgress(id){ - localStorage.removeItem(id); + this.get("userInfo").getUserData().promise.then(function(data){ + localStorage.removeItem(data+"-"+id); + }.bind(this)).catch(function(e){ + console.error(e); + }); } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/fb951387/contrib/views/wfmanager/src/main/resources/ui/tests/unit/services/user-info-test.js ---------------------------------------------------------------------- diff --git a/contrib/views/wfmanager/src/main/resources/ui/tests/unit/services/user-info-test.js b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/services/user-info-test.js new file mode 100644 index 0000000..b8acb3e --- /dev/null +++ b/contrib/views/wfmanager/src/main/resources/ui/tests/unit/services/user-info-test.js @@ -0,0 +1,29 @@ +/* +* 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. +*/ + +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:user-info', 'Unit | Service | user info', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +});