You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ve...@apache.org on 2015/03/20 09:19:20 UTC

[1/2] incubator-ranger git commit: RANGER-200: Pagination on Analytics Page (Gautam Borad via Velmurugan Periasamy)

Repository: incubator-ranger
Updated Branches:
  refs/heads/master 4bf8a3fae -> 85d5658fc


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js b/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
index de713d9..9e689c0 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
@@ -28,7 +28,9 @@ define(function(require) {'use strict';
 	var XATableLayout		= require('views/common/XATableLayout');
 	var localization		= require('utils/XALangSupport');
 	
-	var VXResourceList 		= require('collections/VXResourceList');
+	var RangerService		= require('models/RangerService');
+	var RangerServiceDefList= require('collections/RangerServiceDefList');
+	var RangerPolicyList	= require('collections/RangerPolicyList');
 	var UseraccesslayoutTmpl= require('hbs!tmpl/reports/UserAccessLayout_tmpl');
 
 	var UserAccessLayout 	= Backbone.Marionette.Layout.extend(
@@ -39,22 +41,21 @@ define(function(require) {'use strict';
 		template : UseraccesslayoutTmpl,
 		breadCrumbs : [XALinks.get('UserAccessReport')],
 		templateHelpers :function(){
-			return {groupList : this.groupList};
+			return {
+				groupList : this.groupList,
+				policyHeaderList : this.policyCollList
+			};
 		},
 
 		/** Layout sub regions */
-		regions : {
-			'rHdfsTableList'	: 'div[data-id="r_hdfsTable"]',
-			'rHiveTableList'	: 'div[data-id="r_hiveTable"]',
-			'rHbaseTableList'	: 'div[data-id="r_hbaseTable"]',
-			'rKnoxTableList'	: 'div[data-id="r_knoxTable"]',
-			'rStormTableList'	: 'div[data-id="r_stormTable"]',
-			'rHdfsTableSpinner' : '[data-id="r_hdfsTableSpinner"]',
-			'rHiveTableSpinner' : '[data-id="r_hiveTableSpinner"]',
-			'rHbaseTableSpinner': '[data-id="r_hbaseTableSpinner"]',
-			'rKnoxTableSpinner' : '[data-id="r_knoxTableSpinner"]',
-			'rStormTableSpinner': '[data-id="r_stormTableSpinner"]'
+		regions :function(){
+			var regions = {};
+			this.initializeRequiredData();
+			_.each(this.policyCollList, function(obj) {
+				regions[obj.collName+'Table'] =  'div[data-id="'+obj.collName+'"]';
+			},this)
 			
+			return regions;
 		},
 
 		/** ui selector cache */
@@ -99,24 +100,169 @@ define(function(require) {'use strict';
 		initialize : function(options) {
 			console.log("initialized a UserAccessLayout Layout");
 			_.extend(this, _.pick(options, 'groupList','userList'));
-			
-			var params = [];
-			this.hdfsResourceList = new VXResourceList();
-			this.hiveResourceList = new VXResourceList();
-			this.hbaseResourceList = new VXResourceList();
-			this.knoxResourceList = new VXResourceList();
-			this.stormResourceList = new VXResourceList();
 			this.bindEvents();
 			
-		},		   
+		},
+		initializeRequiredData : function() {
+			this.policyCollList = [];
+			this.initializeServiceDef();
+			this.serviceDefList.each(function(servDef) {
+				var serviceDefName = servDef.get('name')
+				var collName = serviceDefName +'PolicyList';
+				this[collName] = new RangerPolicyList();
+				this.defaultPageState = this[collName].state;
+				this.policyCollList.push({ 'collName' : collName, 'serviceDefName' : serviceDefName})
+			},this);
+		},
+		initializeServiceDef : function() {
+			   this.serviceDefList = new RangerServiceDefList();
+//			   this.serviceDefList.queryParams.sortBy = 'id';
+			   this.serviceDefList.fetch({
+				   cache : false,
+				   async:false
+			   });
+		},	   
 
 		/** all events binding here */
 		bindEvents : function() {
 			/*this.listenTo(this.model, "change:foo", this.modelChanged, this);*/
 			/*this.listenTo(communicator.vent,'someView:someEvent', this.someEventHandler, this)'*/
-			this.listenTo(this.hiveResourceList, "change:foo", function(){alert();}, this);
+//			this.listenTo(this.hiveResourceList, "change:foo", function(){alert();}, this);
 		},
 
+		onRender : function() {
+			this.initializePlugins();
+			this.setupGroupAutoComplete();
+			//Show policies listing for each service and GET policies for each service
+			_.each(this.policyCollList, function(obj,i){
+				this.renderTable(obj.collName, obj.serviceDefName);
+				this.getResourceLists(obj.collName,obj.serviceDefName);
+			},this);
+		},
+		
+		getResourceLists: function(collName, serviceDefName){
+			var that = this, coll = this[collName];
+			coll.queryParams.serviceType = serviceDefName;
+		/*	if(!_.isUndefined(params)){
+				_.each(params,function(val, attr){ 
+					if(!_.isUndefined(val) && !_.isEmpty(val)) 
+						coll.queryParams[attr] = val;
+				});
+			}*/
+			coll.fetch({
+				cache : false,
+				reset: true,
+				async:false,
+			}).done(function(){
+//				console.log(coll);
+				coll.trigger('sync')
+//				if(coll.queryParams.assetType == XAEnums.AssetType.ASSET_STORM.value){
+//					var totalRecords=0; 
+//					_.each(that.resourceList, function( list ){ totalRecords += list.state.totalRecords; });
+					/*that.$('[data-js="searchResult"]').html('Total '+totalRecords+' records found.');
+					that.$('[data-js="hdfsSearchResult"]').html(that.hdfsResourceList.state.totalRecords +' records found.');
+					that.$('[data-js="hiveSearchResult"]').html(that.hiveResourceList.state.totalRecords  +' records found.');
+					that.$('[data-js="hbaseSearchResult"]').html(that.hbaseResourceList.state.totalRecords +' records found.');
+					that.$('[data-js="knoxSearchResult"]').html(that.knoxResourceList.state.totalRecords +' records found.');
+					that.$('[data-js="stormSearchResult"]').html(that.stormResourceList.state.totalRecords +' records found.');*/
+//				}
+				XAUtil.blockUI('unblock');
+				
+			});
+		},
+		renderTable : function(collName){
+			var that = this, tableRegion  = this[collName+'Table'];
+			tableRegion.show(new XATableLayout({
+				columns: this.getColumns(this[collName]),
+				collection: this[collName],
+				includeFilter : false,
+				scrollToTop : false,
+				paginationCache : false,
+				gridOpts : {
+					row : 	Backgrid.Row.extend({}),
+					emptyText : 'No Policies found!'
+				}
+			}));
+		
+		},
+		getColumns : function(coll){
+			var that = this;
+			var cols = {
+				name : {
+					cell : "uri",
+					href: function(model){
+						var rangerService = new RangerService();
+						rangerService.urlRoot += '/name/'+model.get('service'); 
+						rangerService.fetch({
+						  cache : true,
+						  async : false
+						});
+						return '#!/service/'+rangerService.get('id')+'/policies/'+model.id+'/edit';
+					},
+					label	: localization.tt("lbl.policyName"),
+					editable: false,
+					sortable : false
+				},	
+				isEnabled:{
+					label:localization.tt('lbl.status'),
+					cell :"html",
+					editable:false,
+					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+						fromRaw: function (rawValue) {
+							return rawValue ? '<label class="label label-success">Enabled</label>' : '<label class="label label-important">Disabled</label>';
+						}
+					}),
+					click : false,
+					drag : false,
+					sortable : false
+				},
+				isAuditEnabled:{
+					label:localization.tt('lbl.auditLogging'),
+					cell :"html",
+					editable:false,
+					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+						fromRaw: function (rawValue) {
+							return rawValue ? '<label class="label label-success">Enabled</label>' : '<label class="label label-important">Disabled</label>';
+						}
+					}),
+					click : false,
+					drag : false,
+					sortable : false
+				},
+				policyItems : {
+					reName : 'groupName',
+					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
+					label : localization.tt("lbl.group"),
+					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+						fromRaw: function (rawValue, model) {
+							if(!_.isUndefined(rawValue))
+								return XAUtil.showGroupsOrUsersForPolicy(rawValue, model);
+							else 
+								return '--';
+						}
+					}),
+					editable : false,
+					sortable : false
+				},
+				//Hack for backgrid plugin doesn't allow to have same column name 
+				guid : {
+					reName : 'userName',
+					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
+					label : localization.tt("lbl.users"),
+					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+						fromRaw: function (rawValue, model) {
+							if(!_.isUndefined(rawValue))
+								return XAUtil.showGroupsOrUsersForPolicy(model.get('policyItems'), model, false);
+							else 
+								return '--';
+						}
+					}),
+					editable : false,
+					sortable : false
+				},
+			};
+			return coll.constructor.getTableCols(cols, coll);
+		},
 		/** on render callback */
 		setupGroupAutoComplete : function(){
 			//tags : true,
@@ -128,7 +274,7 @@ define(function(require) {'use strict';
 				return {id : m.id,text : m.get('name')};
 			}),*/
 			this.groupArr = this.groupList.map(function(m){
-				return { id : m.id , text : m.get('name')};
+				return { id : m.get('name') , text : m.get('name')};
 			});
 			var that = this, arr = [];
 			this.ui.userGroup.select2({
@@ -137,14 +283,14 @@ define(function(require) {'use strict';
 			//	maximumSelectionSize : 1,
 				width :'220px',
 				tokenSeparators: [",", " "],
-				tags : this.groupArr,
+				// tags : this.groupArr,
 				initSelection : function (element, callback) {
 					var data = [];
 					console.log(that.groupList);
 					
 					$(element.val().split(",")).each(function () {
 						var obj = _.findWhere(that.groupArr,{id:this});	
-						data.push({id: this, text: obj.text});
+						data.push({id: obj.text, text: obj.text});
 					});
 					callback(data);
 				},
@@ -159,10 +305,10 @@ define(function(require) {'use strict';
 						if(!_.isEmpty(that.ui.userGroup.val()))
 							selectedVals = that.ui.userGroup.val().split(',');
 						if(data.resultSize != "0"){
-								results = data.vXGroups.map(function(m, i){	return {id : (m.id).toString(), text: m.name};	});
-								if(!_.isEmpty(selectedVals))
-									results = XAUtil.filterResultByIds(results, selectedVals);
-								return {results : results};
+							results = data.vXGroups.map(function(m, i){	return {id : m.name, text: m.name};	});
+							if(!_.isEmpty(selectedVals))
+								results = XAUtil.filterResultByIds(results, selectedVals);
+							return {results : results};
 						}
 						return {results : results};
 					}
@@ -189,10 +335,10 @@ define(function(require) {'use strict';
 //				minimumInputLength: 1,
 				closeOnSelect : true,
 				placeholder : 'Select User',
-		//		maximumSelectionSize : 1,
+//				maximumSelectionSize : 1,
 				width :'220px',
 				tokenSeparators: [",", " "],
-				tags : this.userArr, 
+				// tags : this.userArr, 
 				initSelection : function (element, callback) {
 					var data = [];
 					$(element.val().split(",")).each(function () {
@@ -212,10 +358,10 @@ define(function(require) {'use strict';
 						if(!_.isEmpty(that.ui.userName.select2('val')))
 							selectedVals = that.ui.userName.select2('val');
 						if(data.resultSize != "0"){
-								results = data.vXUsers.map(function(m, i){	return {id : m.id+"", text: m.name};	});
-								if(!_.isEmpty(selectedVals))
-									results = XAUtil.filterResultByIds(results, selectedVals);
-								return {results : results};
+							results = data.vXUsers.map(function(m, i){	return {id : m.id+"", text: m.name};	});
+							if(!_.isEmpty(selectedVals))
+								results = XAUtil.filterResultByIds(results, selectedVals);
+							return {results : results};
 						}
 						return {results : results};
 					}
@@ -229,896 +375,8 @@ define(function(require) {'use strict';
 				formatNoMatches: function(result){
 					return 'No user found.';
 				}
-					
-			}).on('select2-focus', XAUtil.select2Focus);
-		},
-		getResourceLists: function(params){
-			var that = this;
-			
-			var resourceList = new VXResourceList();
-			if(!_.isUndefined(params)){
-				XAUtil.blockUI();
-				resourceList.setPageSize(200, {fetch : false});
-				resourceList.fetch({
-					data : params,
-					cache : false,
-					success : function(){
-						XAUtil.blockUI('unblock');
-					},
-					error : function(){XAUtil.blockUI('unblock');}
-				}).done(function(){
-					//console.log(resourceList);
-					XAUtil.blockUI('unblock');
-				//console.log(resourceList);
-				XAUtil.blockUI('unblock');
-				var obj = resourceList.groupBy('assetType');
-					var hdfsList = !_.isUndefined(obj[XAEnums.AssetType.ASSET_HDFS.value]) ? obj[XAEnums.AssetType.ASSET_HDFS.value] : [];
-					that.hdfsResourceList.reset(hdfsList);
-					var hiveList = !_.isUndefined(obj[XAEnums.AssetType.ASSET_HIVE.value]) ? obj[XAEnums.AssetType.ASSET_HIVE.value] :  [];
-					that.hiveResourceList.reset(hiveList);
-					var hbaseList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_HBASE.value]) ? obj[XAEnums.AssetType.ASSET_HBASE.value] : [];
-					that.hbaseResourceList.reset(hbaseList);
-					var knoxList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_KNOX.value]) ? obj[XAEnums.AssetType.ASSET_KNOX.value] : [];
-					that.knoxResourceList.reset(knoxList);
-					var stormList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_STORM.value]) ? obj[XAEnums.AssetType.ASSET_STORM.value] : [];
-					that.stormResourceList.reset(stormList);
-					
-					
-					if(!_.isEmpty(params)){
-						var totalRecords = hdfsList.length + hiveList.length + hbaseList.length + knoxList.length + stormList.length;
-						that.$('[data-js="searchResult"]').html('Total '+totalRecords+' records found.');
-						that.$('[data-js="hdfsSearchResult"]').html(hdfsList.length +' records found.');
-						that.$('[data-js="hiveSearchResult"]').html(hiveList.length  +' records found.');
-						that.$('[data-js="hbaseSearchResult"]').html(hbaseList.length +' records found.');
-						that.$('[data-js="knoxSearchResult"]').html(knoxList.length +' records found.');
-						that.$('[data-js="stormSearchResult"]').html(stormList.length +' records found.');
-					}
-				});			
-			}else{
-				var obj = this.collection.groupBy('assetType');
-				var hdfsList = !_.isUndefined(obj[XAEnums.AssetType.ASSET_HDFS.value]) ? obj[XAEnums.AssetType.ASSET_HDFS.value] : [];
-				that.hdfsResourceList.reset(hdfsList);
-				var hiveList = !_.isUndefined(obj[XAEnums.AssetType.ASSET_HIVE.value]) ? obj[XAEnums.AssetType.ASSET_HIVE.value] :  [];
-				that.hiveResourceList.reset(hiveList);
-				var hbaseList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_HBASE.value]) ? obj[XAEnums.AssetType.ASSET_HBASE.value] : [];
-				that.hbaseResourceList.reset(hbaseList);
-				var knoxList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_KNOX.value]) ? obj[XAEnums.AssetType.ASSET_KNOX.value] : [];
-				that.knoxResourceList.reset(knoxList);
-				var stormList= !_.isUndefined(obj[XAEnums.AssetType.ASSET_STORM.value]) ? obj[XAEnums.AssetType.ASSET_STORM.value] : [];
-				that.stormResourceList.reset(stormList);
-			}
-				
-		},
-		onRender : function() {
-			this.initializePlugins();
-			this.setupGroupAutoComplete();
-			this.getResourceLists();
-			this.renderHdfsTable();
-			this.renderHiveTable();
-			this.renderHbaseTable();
-			this.renderKnoxTable();
-			this.renderStormTable();
-			//this.listenTo(this.hiveResourceList, "reset", function(){alert();}, this);
-		},
-		renderHdfsTable : function(){
-			var that = this;
-
-			this.rHdfsTableList.show(new XATableLayout({
-				columns: this.getHdfsColumns(),
-				collection: this.hdfsResourceList,
-				includeFilter : false,
-				includePagination : false,
-				gridOpts : {
-					row : 	Backgrid.Row.extend({}),
-					header : XABackgrid,
-					emptyText : 'No Policies found!'
-				}
-				/*filterOpts : {
-				  name: ['name'],
-				  placeholder: localization.tt('plcHldr.searchByResourcePath'),
-				  wait: 150
-				}*/
-			}));
-		
-		},
-		renderHiveTable : function(){
-			var that = this;
-
-			this.rHiveTableList.show(new XATableLayout({
-				columns: this.getHiveColumns(),
-				collection: this.hiveResourceList,
-				includeFilter : false,
-				includePagination : false,
-				gridOpts : {
-					//row: TableRow,
-					header : XABackgrid,
-					emptyText : 'No Policies found!'
-				}
-				/*filterOpts : {
-				  name: ['name'],
-				  placeholder: localization.tt('plcHldr.searchByResourcePath'),
-				  wait: 150
-				}*/
-			}));
-		
-		},
-		renderHbaseTable : function(){
-			var that = this;
-
-			this.rHbaseTableList.show(new XATableLayout({
-				columns: this.getHbaseColumns(),
-				collection: this.hbaseResourceList,
-				includeFilter : false,
-				includePagination : false,
-				gridOpts : {
-					//row: TableRow,
-					header : XABackgrid,
-					emptyText : 'No Policies found!'
-				}
-				/*filterOpts : {
-				  name: ['name'],
-				  placeholder: localization.tt('plcHldr.searchByResourcePath'),
-				  wait: 150
-				}*/
-			}));
-		
-		},
-		renderKnoxTable : function(){
-			var that = this;
-
-			this.rKnoxTableList.show(new XATableLayout({
-				columns: this.getKnoxColumns(),
-				collection: this.knoxResourceList,
-				includeFilter : false,
-				includePagination : false,
-				gridOpts : {
-					//row: TableRow,
-					header : XABackgrid,
-					emptyText : 'No Policies found!'
-				}
-				/*filterOpts : {
-				  name: ['name'],
-				  placeholder: localization.tt('plcHldr.searchByResourcePath'),
-				  wait: 150
-				}*/
-			}));
-		
-		},
-		renderStormTable : function(){
-			var that = this;
-
-			this.rStormTableList.show(new XATableLayout({
-				columns: this.getStormColumns(),
-				collection: this.stormResourceList,
-				includeFilter : false,
-				includePagination : false,
-				gridOpts : {
-					//row: TableRow,
-					header : XABackgrid,
-					emptyText : 'No Policies found!'
-				}
-				/*filterOpts : {
-				  name: ['name'],
-				  placeholder: localization.tt('plcHldr.searchByResourcePath'),
-				  wait: 150
-				}*/
-			}));
-		
-		},
-		getHdfsColumns : function(){
-			var that = this;
-			var cols = {
-				policyName : {
-					cell : "uri",
-					href: function(model){
-						return '#!/hdfs/'+model.get('assetId')+'/policy/' + model.id;
-					},
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
-				},	
-				name : {
-					cell : "html",
-					label	: localization.tt("lbl.resourcePath"),
-					editable: false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-				},
-				assetName : {
-					label : localization.tt("lbl.repository"),
-					cell: "String",
-					click : false,
-					drag : false,
-					editable:false,
-					sortable: false
-				},
-				isRecursive:{
-					label:localization.tt('lbl.includesAllPathsRecursively'),
-					cell :"html",
-					editable:false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var status;
-							_.each(_.toArray(XAEnums.BooleanValue),function(m){
-								if(parseInt(rawValue) == m.value){
-									status =  (m.label == XAEnums.BooleanValue.BOOL_TRUE.label) ? true : false;
-								}	
-							});
-							//return status ? "Yes" : "No";
-							return status  ? '<label class="label label-success">YES</label>' : '<label class="label label">NO</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable: false
-				},
-				auditList : {
-					label : localization.tt("lbl.auditLogging"),
-					cell: "html",
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							//return model.has('auditList') ? 'On' : 'Off';
-							return model.has('auditList') ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable: false,
-					editable:false
-				},
-				permMapListUser : {
-					name : 'permMapList',
-					reName : 'userName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.users"),
-				//	canHeaderSearch : true,
-				//	headerSearchStyle  : 'width:85%;',
-					placeholder : 'User(s)',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var showMoreLess = false;
-							if(_.isArray(rawValue))
-								rawValue =  new Backbone.Collection(rawValue);
-							if(!_.isUndefined(rawValue) && rawValue.models.length > 0){
-								var userArr = _.uniq(_.compact(_.map(rawValue.models, function(m, i){
-									if(m.has('userName'))
-										return m.get('userName') ;
-								})));
-								if(userArr.length > 0)
-									var resourceId =rawValue.models[0].attributes.resourceId; 
-								var newUserArr = _.map(userArr, function(name, i){
-									if(i >=  4)
-										return '<span class="label label-info" policy-user-id="'+resourceId+'" style="display:none;">' + name + '</span>';
-									else if(i == 3 && userArr.length > 4){
-										showMoreLess = true;
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-									}
-									else
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-								});
-								if(showMoreLess){
-									newUserArr.push('<span class="pull-left"><a href="javascript:void(0);" data-id="showMoreUsers" class="" policy-user-id="'+resourceId+'"><code> + More..</code></a></span>\
-											<span class="pull-left" ><a href="javascript:void(0);" data-id="showLessUsers" class="" policy-user-id="'+resourceId+'" style="display:none;"><code> - Less..</code></a></span>');
-								}
-								return newUserArr.length ? newUserArr.join(' ') : '--';
-							}else
-								return '--';
-						}
-					}),
-					editable:false,
-					sortable: false
-				},
-				permMapList : {
-					reName : 'groupName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.groups"),
-				//	canHeaderSearch : true,
-				//	headerSearchStyle  : 'width:85%;',
-					placeholder : 'Group Name',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return XAUtil.showGroups(rawValue);
-						}
-					}),
-					sortable: false,
-					editable:false
-				}
-				/*isEncrypt:{
-					label:localization.tt("lbl.encrypted"),
-					cell :"Switch",
-					editable:false,
-				//	canHeaderFilter : true,
-				//	headerFilterList :[{label : 'ON',value : 1},{label :'OFF' ,value:2}],
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var status;
-							_.each(_.toArray(XAEnums.BooleanValue),function(m){
-								if(parseInt(rawValue) == m.value){
-									status =  (m.label == XAEnums.BooleanValue.BOOL_TRUE.label) ? true : false;
-									return ;
-								}	
-							});
-							//You can use rawValue to custom your html, you can change this value using the name parameter.
-							return status;
-						}
-					}),
-					click : false,
-					drag : false,
-					onText : 'ON',
-					offText : 'OFF'
-				},*/
-				/*permissions : {
-					cell :  "html",
-					label : localization.tt("lbl.action"),
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue,model) {
-							return '<a href="#!/policy/'+model.id+'" class="btn btn-mini "><i class="icon-edit icon-large" /></a>\
-									<a href="javascript:void(0);" data-name ="deletePolicy" data-id="'+model.id+'"  class="btn btn-mini  btn-danger"><i class="icon-trash icon-large" /></a>';
-							//You can use rawValue to custom your html, you can change this value using the name parameter.
-						}
-					}),
-					editable:false,
-
-				},
-			*/
-				
-			};
-			return this.hdfsResourceList.constructor.getTableCols(cols, this.hdfsResourceList);
-		},
-		getHiveColumns : function(){
-			var that = this;
-			var cols = {
-				policyName : {
-					cell : "uri",
-					href: function(model){
-						return '#!/hive/'+model.get('assetId')+'/policy/' + model.id;
-					},
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
-				},
-				databases : {
-					cell :'html',
-					label	: localization.tt("lbl.databaseName")+'(s)',
-					editable:false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-				},
-				tables : {
-					label	: localization.tt("lbl.tableName")+'(s)',
-					cell :'html',
-					editable:false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-				},
-				/*views : {
-					label	: localization.tt("lbl.viewName")+'(s)',
-					editable:false,
-					cell :'string',
-					sortable: false,
-					// headerSearchStyle  : 'width:85%;',
-					//headerFilterList :["Student","Teacher","StudentTeacher"],
-					placeholder : 'View Name',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {	return rawValue ? rawValue : '--';}
-					}),
-				},*/
-				udfs : {
-					label	: localization.tt("lbl.udfName")+'(s)',
-					editable:false,
-					cell :'string',
-					sortable: false,
-					// headerSearchStyle  : 'width:85%;',
-					//headerFilterList :["Student","Teacher","StudentTeacher"],
-					placeholder : 'UDF Name',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {	return rawValue ? rawValue : '--';}
-					})
-				},
-				columns : {
-					label	: localization.tt("lbl.columnName")+'(s)',
-					cell :'html',
-					placeholder : 'Column Name',
-					editable:false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-
-				},
-				assetName : {
-					label : localization.tt("lbl.repository"),
-					cell: "String",
-					click : false,
-					drag : false,
-					editable:false,
-					sortable: false
-				},
-				auditList : {
-					label : localization.tt("lbl.auditLogging"),
-					cell: "html",
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							//return model.has('auditList') ? 'On' : 'Off';
-							return model.has('auditList') ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable: false,
-					editable:false
-				},
-				permMapListUser : {
-					name : 'permMapList',
-					reName : 'userName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.users"),
-					placeholder : 'User(s)',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var showMoreLess = false;
-							if(_.isArray(rawValue))
-								rawValue =  new Backbone.Collection(rawValue);
-							if(!_.isUndefined(rawValue) && rawValue.models.length > 0){
-								var userArr = _.uniq(_.compact(_.map(rawValue.models, function(m, i){
-									if(m.has('userName'))
-										return m.get('userName') ;
-								})));
-								if(userArr.length > 0)
-									var resourceId =rawValue.models[0].attributes.resourceId; 
-								var newUserArr = _.map(userArr, function(name, i){
-									if(i >=  4)
-										return '<span class="label label-info" policy-user-id="'+resourceId+'" style="display:none;">' + name + '</span>';
-									else if(i == 3 && userArr.length > 4){
-										showMoreLess = true;
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-									}
-									else
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-								});
-								if(showMoreLess){
-									newUserArr.push('<span class="pull-left"><a href="javascript:void(0);" data-id="showMoreUsers" class="" policy-user-id="'+resourceId+'"><code> + More..</code></a></span>\
-											<span class="pull-left" ><a href="javascript:void(0);" data-id="showLessUsers" class="" policy-user-id="'+resourceId+'" style="display:none;"><code> - Less..</code></a></span>');
-								}
-								return newUserArr.length ? newUserArr.join(' ') : '--';
-							}else
-								return '--';
-						}
-					}),
-					editable:false,
-					sortable: false
-				},
-				permMapList : {
-					reName : 'groupName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.group"),
-			//		headerSearchStyle  : 'width:85%;',
-					placeholder : 'Group Name',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return XAUtil.showGroups(rawValue);
-						}
-					}),
-					sortable: false,
-					editable:false
-				}
-				/*isEncrypt:{
-					label:localization.tt("lbl.encrypted"),
-					cell :"Switch",
-					editable:false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var status;
-							_.each(_.toArray(XAEnums.BooleanValue),function(m){
-								if(parseInt(rawValue) == m.value){
-									status =  (m.label == XAEnums.BooleanValue.BOOL_TRUE.label) ? true : false;
-									return ;
-								}	
-							});
-							//You can use rawValue to custom your html, you can change this value using the name parameter.
-							return status;
-						}
-					}),
-					click : false,
-					drag : false,
-					onText : 'ON',
-					offText : 'OFF'
-				},*/
-				/*permissions : {
-					cell :"uri",
-					label : localization.tt("lbl.action"),
-					href: function(model){
-						return '#!/hive/policy/' + model.id;
-					},
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return 'Edit';
-							//You can use rawValue to custom your html, you can change this value using the name parameter.
-						}
-					}),
-				//	klass : 'btn btn-mini btn-blue',
-					editable:false,
-				//	iconKlass :'icon-edit',
-				//	iconTitle :'Edit'
-					
-
-				}*/
-				
 				
-			};
-			return this.hiveResourceList.constructor.getTableCols(cols, this.hiveResourceList);
-		},
-		getHbaseColumns : function(){
-			var cols = {
-				policyName : {
-					cell : "uri",
-					href: function(model){
-						return '#!/hbase/'+model.get('assetId')+'/policy/' + model.id;
-					},
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
-				},
-				tables : {
-					label	: localization.tt("lbl.tableName")+'(s)',
-					cell :'html',
-					editable:false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-				},
-				columnFamilies : {
-					label	: localization.tt("lbl.columnFamilies")+'(s)',
-					cell :'html',
-					editable:false,
-					sortable : false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return _.isUndefined(rawValue) ? '--': '<span title="'+rawValue+'">'+rawValue+'</span>';  
-						}
-					})
-
-				},
-				assetName : {
-					label : localization.tt("lbl.repository"),
-					cell: "String",
-					click : false,
-					drag : false,
-					editable:false,
-					sortable: false
-				},
-				auditList : {
-					label : localization.tt("lbl.auditLogging"),
-					cell: "html",
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							//return model.has('auditList') ? 'On' : 'Off';
-							return model.has('auditList') ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable: false,
-					editable:false
-				},
-				/*isEncrypt:{
-					label:localization.tt("lbl.encrypted"),
-					cell :"html",
-					editable:false,
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							return model.get('isEncrypt') == XAEnums.BooleanValue.BOOL_TRUE.value ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-							var status;
-							_.each(_.toArray(XAEnums.BooleanValue),function(m){
-								if(parseInt(rawValue) == m.value){
-									status =  (m.label == XAEnums.BooleanValue.BOOL_TRUE.label) ? true : false;
-									return ;
-								}	
-							});
-							//You can use rawValue to custom your html, you can change this value using the name parameter.
-							return status;
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable: false,
-					onText : 'ON',
-					offText : 'OFF'
-				},*/
-				permMapListUser : {
-					name : 'permMapList',
-					reName : 'userName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.users"),
-					placeholder : 'User(s)',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var showMoreLess = false;
-							if(_.isArray(rawValue))
-								rawValue =  new Backbone.Collection(rawValue);
-							if(!_.isUndefined(rawValue) && rawValue.models.length > 0){
-								var userArr = _.uniq(_.compact(_.map(rawValue.models, function(m, i){
-									if(m.has('userName'))
-										return m.get('userName') ;
-								})));
-								if(userArr.length > 0)
-									var resourceId =rawValue.models[0].attributes.resourceId; 
-								var newUserArr = _.map(userArr, function(name, i){
-									if(i >=  4)
-										return '<span class="label label-info" policy-user-id="'+resourceId+'" style="display:none;">' + name + '</span>';
-									else if(i == 3 && userArr.length > 4){
-										showMoreLess = true;
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-									}
-									else
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-								});
-								if(showMoreLess){
-									newUserArr.push('<span class="pull-left"><a href="javascript:void(0);" data-id="showMoreUsers" class="" policy-user-id="'+resourceId+'"><code> + More..</code></a></span>\
-											<span class="pull-left" ><a href="javascript:void(0);" data-id="showLessUsers" class="" policy-user-id="'+resourceId+'" style="display:none;"><code> - Less..</code></a></span>');
-								}
-								return newUserArr.length ? newUserArr.join(' ') : '--';
-							}else
-								return '--';
-						}
-					}),
-					editable:false,
-					sortable: false
-				},
-				permMapList : {
-					reName : 'groupName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.group"),
-					canHeaderSearch : false,
-					// headerSearchStyle  : 'width:70%;',
-					placeholder : 'Group Name',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							return XAUtil.showGroups(rawValue);
-						}
-					}),
-					sortable: false,
-					editable:false
-				}
-				
-				
-			};
-			return this.hbaseResourceList.constructor.getTableCols(cols, this.hbaseResourceList);
-		},
-		getKnoxColumns : function(){
-			var cols = {
-				policyName : {
-					cell : "uri",
-					href: function(model){
-						return '#!/knox/'+model.get('assetId')+'/policy/' + model.id;
-					},
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
-				},	
-				topologies : {
-					label	: localization.tt("lbl.topologyName")+'(s)',
-					/*href: function(model){
-						return '#!/knox/'+model.get('assetId')+'/policy/' + model.id;
-					},*/
-					editable:false,
-					cell :'string',
-					sortable : false
-						
-				},
-				services: {
-					label	: localization.tt("lbl.serivceName")+'(s)',
-					editable:false,
-					cell :'string',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {	return rawValue ? rawValue : '--';}
-					}),
-					sortable : false
-				},
-				assetName : {
-					label : localization.tt("lbl.repository"),
-					cell: "String",
-					click : false,
-					drag : false,
-					editable:false,
-					sortable: false
-				},
-				auditList : {
-					label : localization.tt("lbl.auditLogging"),
-					cell: "html",
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							return model.has('auditList') ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable : false,
-					editable : false
-				},
-				permMapListUser : {
-					name : 'permMapList',
-					reName : 'userName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.users"),
-					placeholder : 'User(s)',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var showMoreLess = false;
-							if(_.isArray(rawValue))
-								rawValue =  new Backbone.Collection(rawValue);
-							if(!_.isUndefined(rawValue) && rawValue.models.length > 0){
-								var userArr = _.uniq(_.compact(_.map(rawValue.models, function(m, i){
-									if(m.has('userName'))
-										return m.get('userName') ;
-								})));
-								if(userArr.length > 0)
-									var resourceId =rawValue.models[0].attributes.resourceId; 
-								var newUserArr = _.map(userArr, function(name, i){
-									if(i >=  4)
-										return '<span class="label label-info" policy-user-id="'+resourceId+'" style="display:none;">' + name + '</span>';
-									else if(i == 3 && userArr.length > 4){
-										showMoreLess = true;
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-									}
-									else
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-								});
-								if(showMoreLess){
-									newUserArr.push('<span class="pull-left"><a href="javascript:void(0);" data-id="showMoreUsers" class="" policy-user-id="'+resourceId+'"><code> + More..</code></a></span>\
-											<span class="pull-left" ><a href="javascript:void(0);" data-id="showLessUsers" class="" policy-user-id="'+resourceId+'" style="display:none;"><code> - Less..</code></a></span>');
-								}
-								return newUserArr.length ? newUserArr.join(' ') : '--';
-							}else
-								return '--';
-						}
-					}),
-					editable:false,
-					sortable: false
-				},
-				permMapList : {
-					reName : 'groupName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.group"),
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							if(!_.isUndefined(rawValue))
-								return XAUtil.showGroups(rawValue);
-							else 
-								return '--';
-						}
-					}),
-					editable : false,
-					sortable : false
-				},
-			};
-			return this.knoxResourceList.constructor.getTableCols(cols, this.knoxResourceList);
-		},
-		getStormColumns : function(){
-			var cols = {
-				policyName : {
-					cell : "uri",
-					href: function(model){
-						return '#!/knox/'+model.get('assetId')+'/policy/' + model.id;
-					},
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
-				},	
-				topologies : {
-					label	: localization.tt("lbl.topologyName")+'(s)',
-					/*href: function(model){
-						return '#!/knox/'+model.get('assetId')+'/policy/' + model.id;
-					},*/
-					editable:false,
-					cell :'string',
-					sortable : false
-						
-				},
-				/*services: {
-					label	: localization.tt("lbl.serivceName")+'(s)',
-					editable:false,
-					cell :'string',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {	return rawValue ? rawValue : '--';}
-					}),
-					sortable : false
-				},*/
-				assetName : {
-					label : localization.tt("lbl.repository"),
-					cell: "String",
-					click : false,
-					drag : false,
-					editable:false,
-					sortable: false
-				},
-				auditList : {
-					label : localization.tt("lbl.auditLogging"),
-					cell: "html",
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue, model) {
-							return model.has('auditList') ? '<label class="label label-success">ON</label>' : '<label class="label label">OFF</label>';
-						}
-					}),
-					click : false,
-					drag : false,
-					sortable : false,
-					editable : false
-				},
-				permMapListUser : {
-					name : 'permMapList',
-					reName : 'userName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.users"),
-					placeholder : 'User(s)',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							var showMoreLess = false;
-							if(_.isArray(rawValue))
-								rawValue =  new Backbone.Collection(rawValue);
-							if(!_.isUndefined(rawValue) && rawValue.models.length > 0){
-								var userArr = _.uniq(_.compact(_.map(rawValue.models, function(m, i){
-									if(m.has('userName'))
-										return m.get('userName') ;
-								})));
-								if(userArr.length > 0)
-									var resourceId =rawValue.models[0].attributes.resourceId; 
-								var newUserArr = _.map(userArr, function(name, i){
-									if(i >=  4)
-										return '<span class="label label-info" policy-user-id="'+resourceId+'" style="display:none;">' + name + '</span>';
-									else if(i == 3 && userArr.length > 4){
-										showMoreLess = true;
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-									}
-									else
-										return '<span class="label label-info" policy-user-id="'+resourceId+'">' + name + '</span>';
-								});
-								if(showMoreLess){
-									newUserArr.push('<span class="pull-left"><a href="javascript:void(0);" data-id="showMoreUsers" class="" policy-user-id="'+resourceId+'"><code> + More..</code></a></span>\
-											<span class="pull-left" ><a href="javascript:void(0);" data-id="showLessUsers" class="" policy-user-id="'+resourceId+'" style="display:none;"><code> - Less..</code></a></span>');
-								}
-								return newUserArr.length ? newUserArr.join(' ') : '--';
-							}else
-								return '--';
-						}
-					}),
-					editable:false,
-					sortable: false
-				},
-				permMapList : {
-					reName : 'groupName',
-					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
-					label : localization.tt("lbl.group"),
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-						fromRaw: function (rawValue) {
-							if(!_.isUndefined(rawValue))
-								return XAUtil.showGroups(rawValue);
-							else 
-								return '--';
-						}
-					}),
-					editable : false,
-					sortable : false
-				},
-			};
-			return this.stormResourceList.constructor.getTableCols(cols, this.stormResourceList);
+			}).on('select2-focus', XAUtil.select2Focus);
 		},
 		/** all post render plugin initialization */
 		initializePlugins : function() {
@@ -1155,14 +413,27 @@ define(function(require) {'use strict';
 			
 		},
 		onSearch : function(e){
-			var that = this;
+			var that = this, type;
+			// XAUtil.blockUI();
+			//Get search values
 			var groups = (this.ui.userGroup.is(':visible')) ? this.ui.userGroup.select2('val'):undefined;
 			var users = (this.ui.userName.is(':visible')) ? this.ui.userName.select2('val'):undefined;
-			var rxName = this.ui.resourceName.val();
-			var policyName = this.ui.policyName.val();
-			var params = {groupId : groups,userId : users,name : rxName, policyName : policyName};
+			var rxName = this.ui.resourceName.val() || undefined;
+			var policyName = this.ui.policyName.val() || undefined;
+			var params = {group : groups, user : users, polResource : rxName, policyNamePartial : policyName};
+			
+			_.each(this.policyCollList, function(obj,i){
+				var coll = this[obj.collName];
+				//clear previous query params
+				_.each(params, function(val, attr){
+					delete coll.queryParams[attr];
+				});
+				//Set default page state
+				coll.state = this.defaultPageState;
+				coll.queryParams = $.extend(coll.queryParams, params)
+            	this.getResourceLists(obj.collName, obj.serviceDefName);
+            },this);
 			
-			this.getResourceLists(params);
 		},
 		autocompleteFilter	: function(e){
 			var $el = $(e.currentTarget);
@@ -1213,32 +484,28 @@ define(function(require) {'use strict';
 			}
 		},
 		onShowMore : function(e){
-			var id = $(e.currentTarget).attr('policy-group-id');
-			var elem = $(e.currentTarget).closest('.showMoreLess').attr('data-id');
-			$('[data-id="'+elem+'"]').find('[policy-group-id="'+id+'"]').show();
-			$('[data-id="showLess"][policy-group-id="'+id+'"]').show();
-			$('[data-id="showMore"][policy-group-id="'+id+'"]').hide();
+			var attrName = 'policy-groups-id';
+			var id = $(e.currentTarget).attr(attrName);
+			if(_.isUndefined(id)){
+				id = $(e.currentTarget).attr('policy-users-id');
+				attrName = 'policy-users-id';
+			}   
+			var $td = $(e.currentTarget).parents('td');
+			$td.find('['+attrName+'="'+id+'"]').show();
+			$td.find('[data-id="showLess"]['+attrName+'="'+id+'"]').show();
+			$td.find('[data-id="showMore"]['+attrName+'="'+id+'"]').hide();
 		},
 		onShowLess : function(e){
-			var id = $(e.currentTarget).attr('policy-group-id');
-			var elem = $(e.currentTarget).closest('.showMoreLess').attr('data-id')
-			$('[data-id="'+elem+'"]').find('[policy-group-id="'+id+'"]').slice(4).hide();
-			$('[data-id="showLess"][policy-group-id="'+id+'"]').hide();
-			$('[data-id="showMore"][policy-group-id="'+id+'"]').show();
-		},
-		onShowMoreUsers : function(e){
-			var id = $(e.currentTarget).attr('policy-user-id');
-			var elem = $(e.currentTarget).closest('.showMoreLess').attr('data-id');
-			$('[data-id="'+elem+'"]').find('[policy-user-id="'+id+'"]').show();
-			$('[data-id="showLessUsers"][policy-user-id="'+id+'"]').show();
-			$('[data-id="showMoreUsers"][policy-user-id="'+id+'"]').hide();
-		},
-		onShowLessUsers : function(e){
-			var id = $(e.currentTarget).attr('policy-user-id');
-			var elem = $(e.currentTarget).closest('.showMoreLess').attr('data-id');
-			$('[data-id="'+elem+'"]').find('[policy-user-id="'+id+'"]').slice(4).hide();
-			$('[data-id="showLessUsers"][policy-user-id="'+id+'"]').hide();
-			$('[data-id="showMoreUsers"][policy-user-id="'+id+'"]').show();
+			var attrName = 'policy-groups-id';
+			var id = $(e.currentTarget).attr(attrName);
+			if(_.isUndefined(id)){
+				id = $(e.currentTarget).attr('policy-users-id');
+				attrName = 'policy-users-id';
+			}
+			var $td = $(e.currentTarget).parents('td');
+			$td.find('['+attrName+'="'+id+'"]').slice(4).hide();
+			$td.find('[data-id="showLess"]['+attrName+'="'+id+'"]').hide();
+			$td.find('[data-id="showMore"]['+attrName+'="'+id+'"]').show();
 		},
 		/** on close */
 		onClose : function() {
@@ -1246,4 +513,4 @@ define(function(require) {'use strict';
 	});
 
 	return UserAccessLayout;
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html b/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
index b931774..58798d1 100644
--- a/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
+++ b/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
@@ -82,12 +82,7 @@
 		</div>
 	</div>
 
-	<!-- <div class="alert alert-success">
-	<a href="#" class="close" data-dismiss="alert">×</a>
-	<label data-js="searchResult"></label>
-	</div> -->
-
-	<div class="clearfix">
+<!-- 	<div class="clearfix">
 		<span class="pull-right">GOTO :&nbsp;&nbsp; 
 			<a href="javascript:;" class="link-tag gotoLink" data-js="gotoHive" style="margin-right: 5px;">
 				<i class=" icon-chevron-down" ></i>
@@ -106,48 +101,18 @@
 				Storm Table
 			</a>
 		</span>
-	</div>
+	</div> -->
 
 	<div class="row-fluid">
-		<h3 class="wrap-header bold reportSearchHeader" data-js="hdfsHeader"> {{tt 'lbl.listOfHDFSPolicies'}}
-			<span class="label label-yellow pull-right" data-js="hdfsSearchResult" ></span>
-		</h3>
-		<div class="wrap well position-relative">
-			<div  data-id="r_hdfsTable" class="hdfs-table showMoreLess"></div>
-			<div data-id="r_hdfsTableSpinner" class="" ></div>
-		</div>
+		{{#each policyHeaderList}}
+			<h3 class="wrap-header bold reportSearchHeader" data-js="hdfsHeader"> {{this.serviceDefName}}
+				<span class="label label-yellow pull-right" data-js="hdfsSearchResult" ></span>
+			</h3>
+			<div class="wrap well position-relative">
+				<div  data-id="{{this.collName}}" class="hdfs-table showMoreLess"></div>
+			</div>
+		{{/each}}	
 
-		<h3  class="wrap-header bold reportSearchHeader" data-js="hiveHeader"> {{tt 'lbl.listOfHIVEPolicies'}}
-			<span class="label label-yellow pull-right" data-js="hiveSearchResult" ></span>
-		</h3>
-		<div class="wrap well position-relative">
-			<div   data-id="r_hiveTable" class="showMoreLess"></div>
-			<div data-id="r_hiveTableSpinner" class="" ></div>
-		</div>
-		
-		<h3  class="wrap-header bold reportSearchHeader" data-js="hbaseHeader"> {{tt 'lbl.listOfHBASEPolicies'}}
-			<span class="label label-yellow pull-right" data-js="hbaseSearchResult" ></span>
-		</h3>
-		<div class="wrap well position-relative">
-			<div   data-id="r_hbaseTable" class="showMoreLess"></div>
-			<div data-id="r_hbaseTableSpinner" class="" ></div>
-		</div>
-		
-		<h3  class="wrap-header bold reportSearchHeader" data-js="knoxHeader"> {{tt 'lbl.listOfKNOXPolicies'}}
-			<span class="label label-yellow pull-right" data-js="knoxSearchResult" ></span>
-		</h3>
-		<div class="wrap well position-relative">
-			<div   data-id="r_knoxTable" class="showMoreLess"></div>
-			<div data-id="r_knoxTableSpinner" class="" ></div>
-		</div>
-		
-		<h3  class="wrap-header bold reportSearchHeader" data-js="stormHeader"> {{tt 'lbl.listOfSTORMPolicies'}}
-			<span class="label label-yellow pull-right" data-js="stormSearchResult" ></span>
-		</h3>
-		<div class="wrap well position-relative">
-			<div   data-id="r_stormTable" class="showMoreLess"></div>
-			<div data-id="r_stormTableSpinner" class="" ></div>
-		</div>
 	</div>
 
 </div>


[2/2] incubator-ranger git commit: RANGER-200: Pagination on Analytics Page (Gautam Borad via Velmurugan Periasamy)

Posted by ve...@apache.org.
RANGER-200: Pagination on Analytics Page (Gautam Borad via Velmurugan Periasamy)


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

Branch: refs/heads/master
Commit: 85d5658fc205a647bb397ee83d81df4cbaa5f53d
Parents: 4bf8a3f
Author: Velmurugan Periasamy <ve...@apache.org>
Authored: Fri Mar 20 04:18:15 2015 -0400
Committer: Velmurugan Periasamy <ve...@apache.org>
Committed: Fri Mar 20 04:18:15 2015 -0400

----------------------------------------------------------------------
 .../apache/ranger/plugin/util/SearchFilter.java |    2 +
 .../org/apache/ranger/biz/ServiceDBStore.java   |  171 ++-
 .../apache/ranger/common/RangerSearchUtil.java  |   86 ++
 .../org/apache/ranger/db/XXDataHistDao.java     |   18 +
 .../org/apache/ranger/rest/ServiceREST.java     |  260 +++-
 .../ranger/service/RangerDataHistService.java   |   19 +-
 .../ranger/service/RangerPolicyService.java     |    4 +
 .../ranger/service/RangerPolicyServiceBase.java |   19 +-
 .../service/RangerServiceDefServiceBase.java    |   20 +-
 .../service/RangerServiceServiceBase.java       |   18 +-
 .../apache/ranger/view/RangerPolicyList.java    |   55 +
 .../ranger/view/RangerServiceDefList.java       |   55 +
 .../apache/ranger/view/RangerServiceList.java   |   55 +
 .../collection_bases/RangerPolicyListBase.js    |    8 +-
 .../RangerServiceDefListBase.js                 |    9 +-
 .../collection_bases/RangerServiceListBase.js   |    8 +-
 .../webapp/scripts/controllers/Controller.js    |   44 +-
 .../scripts/views/common/XATableLayout.js       |   12 +-
 .../scripts/views/policies/PermissionList.js    |   17 +-
 .../scripts/views/policies/RangerPolicyForm.js  |   10 +-
 .../scripts/views/reports/UserAccessLayout.js   | 1175 ++++--------------
 .../reports/UserAccessLayout_tmpl.html          |   55 +-
 22 files changed, 971 insertions(+), 1149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
index c669f23..86e5f7d 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
@@ -39,6 +39,8 @@ public class SearchFilter {
 	public static final String USER            = "user";          // search
 	public static final String GROUP           = "group";         // search
 	public static final String RESOURCE_PREFIX = "resource:";     // search
+	public static final String POL_RESOURCE    = "polResource";   // search
+	public static final String POLICY_NAME_PARTIAL = "policyNamePartial";    // search, sort
 	public static final String CREATE_TIME     = "createTime";    // sort
 	public static final String UPDATE_TIME     = "updateTime";    // sort
 	public static final String START_INDEX     = "startIndex";

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 2a30fd8..844a52e 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -32,6 +32,7 @@ import javax.annotation.PostConstruct;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.DateUtil;
 import org.apache.ranger.common.MessageEnums;
@@ -60,6 +61,7 @@ import org.apache.ranger.entity.XXAccessTypeDef;
 import org.apache.ranger.entity.XXAccessTypeDefGrants;
 import org.apache.ranger.entity.XXContextEnricherDef;
 import org.apache.ranger.entity.XXDBBase;
+import org.apache.ranger.entity.XXDataHist;
 import org.apache.ranger.entity.XXEnumDef;
 import org.apache.ranger.entity.XXEnumElementDef;
 import org.apache.ranger.entity.XXGroup;
@@ -102,6 +104,9 @@ import org.apache.ranger.service.RangerPolicyService;
 import org.apache.ranger.service.RangerServiceDefService;
 import org.apache.ranger.service.RangerServiceService;
 import org.apache.ranger.service.XUserService;
+import org.apache.ranger.view.RangerPolicyList;
+import org.apache.ranger.view.RangerServiceDefList;
+import org.apache.ranger.view.RangerServiceList;
 import org.apache.ranger.view.VXUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -226,6 +231,9 @@ public class ServiceDBStore implements ServiceStore {
 		serviceDef.setCreateTime(null);
 		serviceDef.setUpdateTime(null);
 		
+		// While creating, value of version should be 1.
+		serviceDef.setVersion(new Long(1));
+		
 		serviceDef = serviceDefService.create(serviceDef);
 		Long serviceDefId = serviceDef.getId();
 		XXServiceDef createdSvcDef = daoMgr.getXXServiceDef().getById(serviceDefId);
@@ -377,21 +385,34 @@ public class ServiceDBStore implements ServiceStore {
 
 	@Override
 	public List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception {
-		if(LOG.isDebugEnabled()) {
+		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + ")");
 		}
 
-		List<RangerServiceDef> ret = null;
+		RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter);
+		List<RangerServiceDef> ret = svcDefList.getServiceDefs();
 
-		ret = serviceDefService.searchRangerServiceDefs(filter);
-
-		if(LOG.isDebugEnabled()) {
+		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + "): " + ret);
 		}
 
 		return ret;
 	}
 
+	public RangerServiceDefList getPaginatedServiceDefs(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")");
+		}
+
+		RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")");
+		}
+
+		return svcDefList;
+	}
+
 	@Override
 	public RangerService createService(RangerService service) throws Exception {
 		if (LOG.isDebugEnabled()) {
@@ -413,6 +434,9 @@ public class ServiceDBStore implements ServiceStore {
 						MessageEnums.ERROR_CREATING_OBJECT);
 			}
 
+			// While creating, value of version should be 1.
+			service.setVersion(new Long(1));
+			
 			if(populateExistingBaseFields) {
 				svcService.setPopulateExistingBaseFields(true);
 				service = svcService.create(service);
@@ -506,7 +530,16 @@ public class ServiceDBStore implements ServiceStore {
 		}
 		
 		List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT);
+	
+		Long version = service.getVersion();
+		if(version == null) {
+			version = new Long(1);
+			LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null.");
+		} else {
+			version = new Long(version.longValue() + 1);
+		}
 		
+		service.setVersion(version);
 		service = svcService.update(service);
 		XXService xUpdService = daoMgr.getXXService().getById(service.getId());
 		
@@ -573,7 +606,17 @@ public class ServiceDBStore implements ServiceStore {
 			configDao.remove(configMap);
 		}
 		
+		Long version = service.getVersion();
+		if(version == null) {
+			version = new Long(1);
+			LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null.");
+		} else {
+			version = new Long(version.longValue() + 1);
+		}
+		service.setVersion(version);
+		
 		svcService.delete(service);
+		
 		dataHistService.createObjectDataHistory(service, RangerDataHistService.ACTION_DELETE);
 		
 		List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, RangerServiceService.OPERATION_DELETE_CONTEXT);
@@ -602,11 +645,24 @@ public class ServiceDBStore implements ServiceStore {
 		if(LOG.isDebugEnabled()) {
 			LOG.debug("==> ServiceDBStore.getServices()");
 		}
-		List<RangerService> ret = svcService.searchRangerPolicies(filter);
+		RangerServiceList serviceList = svcService.searchRangerServices(filter);
+		List<RangerService> ret = serviceList.getServices();
 
 		return ret;
 	}
 
+	public RangerServiceList getPaginatedServices(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedServices()");
+		}
+		RangerServiceList serviceList = svcService.searchRangerServices(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceDBStore.getPaginatedServices()");
+		}
+		return serviceList;
+	}
+
 	@Override
 	public RangerPolicy createPolicy(RangerPolicy policy) throws Exception {
 
@@ -631,6 +687,8 @@ public class ServiceDBStore implements ServiceStore {
 		Map<String, RangerPolicyResource> resources = policy.getResources();
 		List<RangerPolicyItem> policyItems = policy.getPolicyItems();
 
+		policy.setVersion(new Long(1));
+		
 		if(populateExistingBaseFields) {
 			policyService.setPopulateExistingBaseFields(true);
 			policy = policyService.create(policy);
@@ -696,6 +754,16 @@ public class ServiceDBStore implements ServiceStore {
 		
 		List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, xxExisting, RangerPolicyService.OPERATION_UPDATE_CONTEXT);
 		
+		Long version = policy.getVersion();
+		if(version == null) {
+			version = new Long(1);
+			LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null.");
+		} else {
+			version = new Long(version.longValue() + 1);
+		}
+		
+		policy.setVersion(version);
+		
 		policy = policyService.update(policy);
 		XXPolicy newUpdPolicy = daoMgr.getXXPolicy().getById(policy.getId());
 
@@ -733,6 +801,16 @@ public class ServiceDBStore implements ServiceStore {
 			throw new Exception("service does not exist - name='" + policy.getService());
 		}
 		
+		Long version = policy.getVersion();
+		if(version == null) {
+			version = new Long(1);
+			LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null.");
+		} else {
+			version = new Long(version.longValue() + 1);
+		}
+		
+		policy.setVersion(version);
+		
 		List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, RangerPolicyService.OPERATION_DELETE_CONTEXT);
 		
 		deleteExistingPolicyItems(policy);
@@ -759,11 +837,30 @@ public class ServiceDBStore implements ServiceStore {
 			LOG.debug("==> ServiceDBStore.getPolicies()");
 		}
 
-		List<RangerPolicy> ret = policyService.searchRangerPolicies(filter);
+		RangerPolicyList policyList = policyService.searchRangerPolicies(filter);
+		List<RangerPolicy> ret = policyList.getPolicies();
 
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceDBStore.getPolicies()");
+		}
+		
 		return ret;
 	}
 
+	public RangerPolicyList getPaginatedPolicies(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedPolicies()");
+		}
+
+		RangerPolicyList policyList = policyService.searchRangerPolicies(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceDBStore.getPaginatedPolicies()");
+		}
+
+		return policyList;
+	}
+
 	@Override
 	public List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception {
 		if(LOG.isDebugEnabled()) {
@@ -781,6 +878,25 @@ public class ServiceDBStore implements ServiceStore {
 		return ret;
 	}
 
+	public RangerPolicyList getPaginatedServicePolicies(Long serviceId, SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")");
+		}
+
+		RangerService service = getService(serviceId);
+
+		if (service == null) {
+			throw new Exception("service does not exist - id='" + serviceId);
+		}
+
+		RangerPolicyList ret = getPaginatedServicePolicies(service.getName(), filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")");
+		}
+		return ret;
+	}
+
 	@Override
 	public List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception {
 		if(LOG.isDebugEnabled()) {
@@ -808,6 +924,33 @@ public class ServiceDBStore implements ServiceStore {
 		return ret;
 	}
 
+	public RangerPolicyList getPaginatedServicePolicies(String serviceName, SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceName + ")");
+		}
+
+		RangerPolicyList ret = null;
+
+		try {
+			if (filter == null) {
+				filter = new SearchFilter();
+			}
+
+			filter.setParam(SearchFilter.SERVICE_NAME, serviceName);
+
+			ret = getPaginatedPolicies(filter);
+		} catch (Exception excp) {
+			LOG.error("ServiceDBStore.getPaginatedServicePolicies(" + serviceName + "): failed to read policies", excp);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceName + "): count="
+					+ ((ret == null) ? 0 : ret.getListSize()));
+		}
+
+		return ret;
+	}
+
 	@Override
 	public ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
 		if(LOG.isDebugEnabled()) {
@@ -870,7 +1013,7 @@ public class ServiceDBStore implements ServiceStore {
 			
 			String value;
 			if("path".equalsIgnoreCase(resDef.getName())) {
-				value = "/*/*";
+				value = "/*";
 			} else {
 				value = "*";
 			}
@@ -1151,4 +1294,14 @@ public class ServiceDBStore implements ServiceStore {
 		this.populateExistingBaseFields = populateExistingBaseFields;
 	}
 
-}
\ No newline at end of file
+	public RangerPolicy getPolicyFromEventTime(Date eventTime, Long policyId) {
+
+		XXDataHist xDataHist = daoMgr.getXXDataHist().findObjByEventTimeClassTypeAndId(eventTime,
+				AppConstants.CLASS_TYPE_RANGER_POLICY, policyId);
+		String content = xDataHist.getContent();
+		RangerPolicy policy = (RangerPolicy) dataHistService.writeJsonToJavaObject(content, RangerPolicy.class);
+
+		return policy;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
index 192734e..205f4f5 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
@@ -21,11 +21,17 @@
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
+import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.springframework.stereotype.Component;
@@ -33,6 +39,86 @@ import org.springframework.stereotype.Component;
 @Component
 public class RangerSearchUtil extends SearchUtil {
 	final static Logger logger = Logger.getLogger(RangerSearchUtil.class);
+	
+	public SearchFilter getSearchFilter(HttpServletRequest request, List<SortField> sortFields) {
+		if (request == null) {
+			return null;
+		}
+
+		SearchFilter ret = new SearchFilter();
+
+		if (MapUtils.isEmpty(request.getParameterMap())) {
+			ret.setParams(new HashMap<String, String>());
+		}
+
+		ret.setParam(SearchFilter.LOGIN_USER, request.getParameter(SearchFilter.LOGIN_USER));
+		ret.setParam(SearchFilter.SERVICE_TYPE, request.getParameter(SearchFilter.SERVICE_TYPE));
+		ret.setParam(SearchFilter.SERVICE_TYPE_ID, request.getParameter(SearchFilter.SERVICE_TYPE_ID));
+		ret.setParam(SearchFilter.SERVICE_NAME, request.getParameter(SearchFilter.SERVICE_NAME));
+		ret.setParam(SearchFilter.SERVICE_ID, request.getParameter(SearchFilter.SERVICE_ID));
+		ret.setParam(SearchFilter.POLICY_NAME, request.getParameter(SearchFilter.POLICY_NAME));
+		ret.setParam(SearchFilter.POLICY_NAME_PARTIAL, request.getParameter(SearchFilter.POLICY_NAME_PARTIAL));
+		ret.setParam(SearchFilter.POLICY_ID, request.getParameter(SearchFilter.POLICY_ID));
+		ret.setParam(SearchFilter.STATUS, request.getParameter(SearchFilter.STATUS));
+		ret.setParam(SearchFilter.USER, request.getParameter(SearchFilter.USER));
+		ret.setParam(SearchFilter.GROUP, request.getParameter(SearchFilter.GROUP));
+		ret.setParam(SearchFilter.POL_RESOURCE, request.getParameter(SearchFilter.POL_RESOURCE));
+
+		for (Map.Entry<String, String[]> e : request.getParameterMap().entrySet()) {
+			String name = e.getKey();
+			String[] values = e.getValue();
+
+			if (!StringUtils.isEmpty(name) && !ArrayUtils.isEmpty(values)
+					&& name.startsWith(SearchFilter.RESOURCE_PREFIX)) {
+				ret.setParam(name, values[0]);
+			}
+		}
+		
+		extractCommonCriteriasForFilter(request, ret, sortFields);
+
+		return ret;
+	}
+
+	public SearchFilter extractCommonCriteriasForFilter(HttpServletRequest request, SearchFilter ret, List<SortField> sortFields) {
+		int startIndex = restErrorUtil.parseInt(request.getParameter(SearchFilter.START_INDEX), 0,
+				"Invalid value for parameter startIndex", MessageEnums.INVALID_INPUT_DATA, null,
+				SearchFilter.START_INDEX);
+		ret.setStartIndex(startIndex);
+
+		int pageSize = restErrorUtil.parseInt(request.getParameter(SearchFilter.PAGE_SIZE),
+				configUtil.getDefaultMaxRows(), "Invalid value for parameter pageSize",
+				MessageEnums.INVALID_INPUT_DATA, null, SearchFilter.PAGE_SIZE);
+		ret.setMaxRows(pageSize);
+
+		ret.setGetCount(restErrorUtil.parseBoolean(request.getParameter("getCount"), true));
+		String sortBy = restErrorUtil.validateString(request.getParameter(SearchFilter.SORT_BY),
+				StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortBy", MessageEnums.INVALID_INPUT_DATA,
+				null, SearchFilter.SORT_BY);
+
+		boolean sortSet = false;
+		if (!StringUtils.isEmpty(sortBy)) {
+			for (SortField sortField : sortFields) {
+				if (sortField.getParamName().equalsIgnoreCase(sortBy)) {
+					ret.setSortBy(sortField.getParamName());
+					String sortType = restErrorUtil.validateString(request.getParameter("sortType"),
+							StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortType",
+							MessageEnums.INVALID_INPUT_DATA, null, "sortType");
+					ret.setSortType(sortType);
+					sortSet = true;
+					break;
+				}
+			}
+		}
+
+		if (!sortSet && !StringUtils.isEmpty(sortBy)) {
+			logger.info("Invalid or unsupported sortBy field passed. sortBy=" + sortBy, new Throwable());
+		}
+		
+		if(ret.getParams() == null) {
+			ret.setParams(new HashMap<String, String>());
+		}
+		return ret;
+	}
 
 	public Query createSearchQuery(EntityManager em, String queryStr, String sortClause,
 			SearchFilter searchCriteria, List<SearchField> searchFields,

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java
index 29c4246..4479145 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXDataHistDao.java
@@ -1,6 +1,9 @@
 package org.apache.ranger.db;
 
+import java.util.Date;
+
 import javax.persistence.NoResultException;
+import javax.persistence.Query;
 
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXDataHist;
@@ -25,5 +28,20 @@ public class XXDataHistDao extends BaseDao<XXDataHist> {
 			return null;
 		}
 	}
+	
+	public XXDataHist findObjByEventTimeClassTypeAndId(Date eventTime, int classType, Long objId) {
+		if (eventTime == null || objId == null) {
+			return null;
+		}
+		try {
+			String queryStr = "select obj.* from x_data_hist obj where obj.obj_class_type = "+classType
+					+ " and obj.obj_id = "+objId + " and obj.create_time <= '" + eventTime + "' ORDER BY obj.id DESC";
+			Query jpaQuery = getEntityManager().createNativeQuery(queryStr, tClass).setMaxResults(1);
+			
+			return (XXDataHist) jpaQuery.getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index ec64e89..1cfaa91 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -21,6 +21,7 @@ package org.apache.ranger.rest;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -40,8 +41,6 @@ import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -49,7 +48,10 @@ import org.apache.ranger.admin.client.datatype.RESTResponse;
 import org.apache.ranger.biz.AssetMgr;
 import org.apache.ranger.biz.ServiceDBStore;
 import org.apache.ranger.biz.ServiceMgr;
+import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.RangerConfigUtil;
+import org.apache.ranger.common.RangerSearchUtil;
 import org.apache.ranger.common.ServiceUtil;
 import org.apache.ranger.entity.XXPolicyExportAudit;
 import org.apache.ranger.plugin.model.RangerPolicy;
@@ -72,6 +74,12 @@ import org.apache.ranger.plugin.service.ResourceLookupContext;
 import org.apache.ranger.plugin.util.GrantRevokeRequest;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServicePolicies;
+import org.apache.ranger.service.RangerPolicyService;
+import org.apache.ranger.service.RangerServiceDefService;
+import org.apache.ranger.service.RangerServiceService;
+import org.apache.ranger.view.RangerPolicyList;
+import org.apache.ranger.view.RangerServiceDefList;
+import org.apache.ranger.view.RangerServiceList;
 import org.apache.ranger.view.VXResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
@@ -103,6 +111,21 @@ public class ServiceREST {
 	@Autowired
 	ServiceUtil serviceUtil;
 	
+	@Autowired
+	RangerConfigUtil configUtil;
+	
+	@Autowired
+	RangerPolicyService policyService;
+	
+	@Autowired
+	RangerServiceService svcService;
+	
+	@Autowired
+	RangerServiceDefService serviceDefService;
+	
+	@Autowired
+	RangerSearchUtil searchUtil;
+	
 	// this indirection for validation via a factory exists only for testability
 	// TODO move the instantiation to DI framework?
 	RangerValidatorFactory validatorFactory = new RangerValidatorFactory(); 
@@ -250,7 +273,7 @@ public class ServiceREST {
 	}
 
 	@GET
-	@Path("/definitions")
+	@Path("/definitions/unpaginated")
 	@Produces({ "application/json", "application/xml" })
 	public List<RangerServiceDef> getServiceDefs(@Context HttpServletRequest request) {
 		if(LOG.isDebugEnabled()) {
@@ -259,7 +282,7 @@ public class ServiceREST {
 
 		List<RangerServiceDef> ret = null;
 
-		SearchFilter filter = getSearchFilter(request);
+		SearchFilter filter = searchUtil.getSearchFilter(request, serviceDefService.sortFields);
 
 		try {
 			ret = svcStore.getServiceDefs(filter);
@@ -417,7 +440,7 @@ public class ServiceREST {
 	}
 
 	@GET
-	@Path("/services")
+	@Path("/services/unpaginated")
 	@Produces({ "application/json", "application/xml" })
 	public List<RangerService> getServices(@Context HttpServletRequest request) {
 		if(LOG.isDebugEnabled()) {
@@ -426,7 +449,7 @@ public class ServiceREST {
 
 		List<RangerService> ret = null;
 
-		SearchFilter filter = getSearchFilter(request);
+		SearchFilter filter = searchUtil.getSearchFilter(request, svcService.sortFields);
 
 		try {
 			ret = svcStore.getServices(filter);
@@ -899,7 +922,7 @@ public class ServiceREST {
 	}
 
 	@GET
-	@Path("/policies")
+	@Path("/policies/unpaginated")
 	@Produces({ "application/json", "application/xml" })
 	public List<RangerPolicy> getPolicies(@Context HttpServletRequest request) {
 		if(LOG.isDebugEnabled()) {
@@ -908,7 +931,8 @@ public class ServiceREST {
 
 		List<RangerPolicy> ret = null;
 
-		SearchFilter filter = getSearchFilter(request);
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
+		
 
 		try {
 			ret = svcStore.getPolicies(filter);
@@ -953,7 +977,7 @@ public class ServiceREST {
 	}
 
 	@GET
-	@Path("/policies/service/{id}")
+	@Path("/policies/service/unpaginated/{id}")
 	@Produces({ "application/json", "application/xml" })
 	public List<RangerPolicy> getServicePolicies(@PathParam("id") Long serviceId, @Context HttpServletRequest request) {
 		if(LOG.isDebugEnabled()) {
@@ -962,7 +986,7 @@ public class ServiceREST {
 
 		List<RangerPolicy> ret = null;
 
-		SearchFilter filter = getSearchFilter(request);
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
 
 		try {
 			ret = svcStore.getServicePolicies(serviceId, filter);
@@ -984,7 +1008,7 @@ public class ServiceREST {
 	}
 
 	@GET
-	@Path("/policies/service/name/{name}")
+	@Path("/policies/service/unpaginated/name/{name}")
 	@Produces({ "application/json", "application/xml" })
 	public List<RangerPolicy> getServicePolicies(@PathParam("name") String serviceName, @Context HttpServletRequest request) {
 		if(LOG.isDebugEnabled()) {
@@ -993,7 +1017,7 @@ public class ServiceREST {
 
 		List<RangerPolicy> ret = null;
 
-		SearchFilter filter = getSearchFilter(request);
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
 
 		try {
 			ret = svcStore.getServicePolicies(serviceName, filter);
@@ -1060,44 +1084,6 @@ public class ServiceREST {
 		return ret;
 	}
 
-
-	private SearchFilter getSearchFilter(HttpServletRequest request) {
-		if(request == null) {
-			return null;
-		}
-		
-		SearchFilter ret = new SearchFilter();
-
-		if(MapUtils.isEmpty(request.getParameterMap())) {
-			ret.setParams(new HashMap<String, String>());
-		}
-
-		ret.setParam(SearchFilter.LOGIN_USER, request.getParameter(SearchFilter.LOGIN_USER));
-		ret.setParam(SearchFilter.SERVICE_TYPE, request.getParameter(SearchFilter.SERVICE_TYPE));
-		ret.setParam(SearchFilter.SERVICE_TYPE_ID, request.getParameter(SearchFilter.SERVICE_TYPE_ID));
-		ret.setParam(SearchFilter.SERVICE_NAME, request.getParameter(SearchFilter.SERVICE_NAME));
-		ret.setParam(SearchFilter.SERVICE_ID, request.getParameter(SearchFilter.SERVICE_ID));
-		ret.setParam(SearchFilter.POLICY_NAME, request.getParameter(SearchFilter.POLICY_NAME));
-		ret.setParam(SearchFilter.POLICY_ID, request.getParameter(SearchFilter.POLICY_ID));
-		ret.setParam(SearchFilter.STATUS, request.getParameter(SearchFilter.STATUS));
-		ret.setParam(SearchFilter.USER, request.getParameter(SearchFilter.USER));
-		ret.setParam(SearchFilter.GROUP, request.getParameter(SearchFilter.GROUP));
-		ret.setParam(SearchFilter.SORT_BY, request.getParameter(SearchFilter.SORT_BY));
-		ret.setParam(SearchFilter.START_INDEX, request.getParameter(SearchFilter.START_INDEX));
-		ret.setParam(SearchFilter.PAGE_SIZE, request.getParameter(SearchFilter.PAGE_SIZE));
-		
-		for(Map.Entry<String, String[]> e : request.getParameterMap().entrySet()) {
-			String   name   = e.getKey();
-			String[] values = e.getValue();
-			
-			if(!StringUtils.isEmpty(name) && !ArrayUtils.isEmpty(values) && name.startsWith(SearchFilter.RESOURCE_PREFIX)) {
-				ret.setParam(name, values[0]);
-			}
-		}
-
-		return ret;
-	}
-
 	private void createPolicyDownloadAudit(String serviceName, Long lastKnownVersion, String pluginId, ServicePolicies policies, int httpRespCode, HttpServletRequest request) {
 		try {
 			String ipAddress = request.getHeader("X-FORWARDED-FOR");
@@ -1347,4 +1333,178 @@ public class ServiceREST {
 
 		return ret;
 	}
+
+	@GET
+	@Path("/definitions")
+	@Produces({ "application/json", "application/xml" })
+	public RangerServiceDefList getPaginatedServiceDefs(@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getPaginatedServiceDefs()");
+		}
+
+		RangerServiceDefList ret = null;
+
+		SearchFilter filter = searchUtil.getSearchFilter(request, serviceDefService.sortFields);
+
+		try {
+			ret = svcStore.getPaginatedServiceDefs(filter);
+		} catch (Exception excp) {
+			LOG.error("getServiceDefs() failed", excp);
+
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getPaginatedServiceDefs(): count=" + (ret == null ? 0 : ret.getListSize()));
+		}
+		return ret;
+	}
+
+	@GET
+	@Path("/services")
+	@Produces({ "application/json", "application/xml" })
+	public RangerServiceList getPaginatedServices(@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getPaginatedServices()");
+		}
+
+		RangerServiceList ret = null;
+
+		SearchFilter filter = searchUtil.getSearchFilter(request, svcService.sortFields);
+
+		try {
+			ret = svcStore.getPaginatedServices(filter);
+		} catch (Exception excp) {
+			LOG.error("getServices() failed", excp);
+
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getPaginatedServices(): count=" + (ret == null ? 0 : ret.getListSize()));
+		}
+		return ret;
+	}
+
+	@GET
+	@Path("/policies")
+	@Produces({ "application/json", "application/xml" })
+	public RangerPolicyList getPaginatedPolicies(@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getPaginatedPolicies()");
+		}
+
+		RangerPolicyList ret = null;
+
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
+
+		try {
+			ret = svcStore.getPaginatedPolicies(filter);
+		} catch (Exception excp) {
+			LOG.error("getPolicies() failed", excp);
+
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getPaginatedPolicies(): count=" + (ret == null ? 0 : ret.getListSize()));
+		}
+		return ret;
+	}
+
+	@GET
+	@Path("/policies/service/{id}")
+	@Produces({ "application/json", "application/xml" })
+	public RangerPolicyList getPaginatedServicePolicies(@PathParam("id") Long serviceId,
+			@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getServicePolicies(" + serviceId + ")");
+		}
+
+		RangerPolicyList ret = null;
+
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
+
+		try {
+			ret = svcStore.getPaginatedServicePolicies(serviceId, filter);
+		} catch (Exception excp) {
+			LOG.error("getServicePolicies(" + serviceId + ") failed", excp);
+
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
+		}
+
+		if (ret == null) {
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, "Not found", true);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getServicePolicies(" + serviceId + "): count="
+					+ (ret == null ? 0 : ret.getListSize()));
+		}
+		return ret;
+	}
+
+	@GET
+	@Path("/policies/service/name/{name}")
+	@Produces({ "application/json", "application/xml" })
+	public RangerPolicyList getPaginatedServicePolicies(@PathParam("name") String serviceName,
+			@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getServicePolicies(" + serviceName + ")");
+		}
+
+		RangerPolicyList ret = null;
+
+		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
+
+		try {
+			ret = svcStore.getPaginatedServicePolicies(serviceName, filter);
+		} catch (Exception excp) {
+			LOG.error("getServicePolicies(" + serviceName + ") failed", excp);
+
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
+		}
+
+		if (ret == null) {
+			throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, "Not found", true);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getServicePolicies(" + serviceName + "): count="
+					+ (ret == null ? 0 : ret.getListSize()));
+		}
+
+		return ret;
+	}
+
+	@GET
+	@Path("/policies/eventTime")
+	@Produces({ "application/json", "application/xml" })
+	public RangerPolicy getPolicyFromEventTime(@Context HttpServletRequest request) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> ServiceREST.getPolicyFromEventTime()");
+		}
+
+		String eventTimeStr = request.getParameter("eventTime");
+		String policyIdStr = request.getParameter("policyId");
+
+		if (StringUtils.isEmpty(eventTimeStr) || StringUtils.isEmpty(policyIdStr)) {
+			throw restErrorUtil.createRESTException("EventTime or policyId cannot be null or empty string.",
+					MessageEnums.INVALID_INPUT_DATA);
+		}
+
+		Long policyId = Long.parseLong(policyIdStr);
+
+		Date eventTime = restErrorUtil.parseDate(eventTimeStr, "Invalid value for" + "Event Time",
+				MessageEnums.INVALID_INPUT_DATA, null, "eventTime", "MM/dd/yyyy");
+
+		RangerPolicy policy = svcStore.getPolicyFromEventTime(eventTime, policyId);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== ServiceREST.getPolicyFromEventTime()");
+		}
+
+		return policy;
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java
index a5aa16e..b75b514 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerDataHistService.java
@@ -122,5 +122,22 @@ public class RangerDataHistService {
 					MessageEnums.INVALID_INPUT_DATA);
 		}
 	}
-	
+
+	public Object writeJsonToJavaObject(String json, Class<?> tClass) {
+		ObjectMapper mapper = new ObjectMapper();
+
+		try {
+			return mapper.readValue(json, tClass);
+		} catch (JsonParseException e) {
+			throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(),
+					MessageEnums.INVALID_INPUT_DATA);
+		} catch (JsonMappingException e) {
+			throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(),
+					MessageEnums.INVALID_INPUT_DATA);
+		} catch (IOException e) {
+			throw restErrorUtil.createRESTException("Invalid input data: " + e.getMessage(),
+					MessageEnums.INVALID_INPUT_DATA);
+		}
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java
index ace800d..1db4779 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyService.java
@@ -88,6 +88,10 @@ public class RangerPolicyService extends RangerPolicyServiceBase<XXPolicy, Range
 		searchFields.add(new SearchField(SearchFilter.GROUP, "xGrp.name", DATA_TYPE.STRING, SEARCH_TYPE.FULL, 
 				"XXGroup xGrp, XXPolicyItem xPolItem, XXPolicyItemGroupPerm grpPerm", "obj.id = xPolItem.policyId "
 						+ "and grpPerm.policyItemId = xPolItem.id and xGrp.id = grpPerm.groupId"));
+		searchFields.add(new SearchField(SearchFilter.POL_RESOURCE, "resMap.value", DATA_TYPE.STRING,
+				SEARCH_TYPE.PARTIAL, "XXPolicyResourceMap resMap, XXPolicyResource polRes",
+				"resMap.resourceId = polRes.id and polRes.policyId = obj.id"));
+		searchFields.add(new SearchField(SearchFilter.POLICY_NAME_PARTIAL, "obj.name", DATA_TYPE.STRING, SEARCH_TYPE.PARTIAL));
 		
 		sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime"));
 		sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime"));

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java
index d19e580..58c2b69 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerPolicyServiceBase.java
@@ -8,10 +8,9 @@ import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXService;
-import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.plugin.model.RangerPolicy;
-import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.util.SearchFilter;
+import org.apache.ranger.view.RangerPolicyList;
 
 public abstract class RangerPolicyServiceBase<T extends XXPolicy, V extends RangerPolicy> extends RangerBaseModelService<T, V> {
 	
@@ -52,17 +51,19 @@ public abstract class RangerPolicyServiceBase<T extends XXPolicy, V extends Rang
 		vObj.setIsAuditEnabled(xObj.getIsAuditEnabled());
 		return vObj;
 	}
-	
+
 	@SuppressWarnings("unchecked")
-	public List<RangerPolicy> searchRangerPolicies(SearchFilter searchFilter) {
+	public RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) {
 		List<RangerPolicy> policyList = new ArrayList<RangerPolicy>();
+		RangerPolicyList retList = new RangerPolicyList();
 		
-		List<XXPolicy> xPolList = (List<XXPolicy>) searchResources(searchFilter, searchFields, sortFields, null);
-		for(XXPolicy xPol : xPolList) {
+		List<XXPolicy> xPolList = (List<XXPolicy>) searchResources(searchFilter, searchFields, sortFields, retList);
+		for (XXPolicy xPol : xPolList) {
 			policyList.add(populateViewBean((T) xPol));
 		}
-		
-		return policyList;
+		retList.setPolicies(policyList);
+
+		return retList;
 	}
-	
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java
index 374217f..afaf2cb 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefServiceBase.java
@@ -27,6 +27,7 @@ import org.apache.ranger.plugin.model.RangerServiceDef.RangerPolicyConditionDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef;
 import org.apache.ranger.plugin.util.SearchFilter;
+import org.apache.ranger.view.RangerServiceDefList;
 import org.springframework.beans.factory.annotation.Autowired;
 
 public abstract class RangerServiceDefServiceBase<T extends XXServiceDef, V extends RangerServiceDef>
@@ -302,17 +303,20 @@ public abstract class RangerServiceDefServiceBase<T extends XXServiceDef, V exte
 		vObj.setRbKeyLabel(xObj.getRbkeylabel());
 		return vObj;
 	}
-	
+
 	@SuppressWarnings("unchecked")
-	public List<RangerServiceDef> searchRangerServiceDefs(SearchFilter searchFilter) {
+	public RangerServiceDefList searchRangerServiceDefs(SearchFilter searchFilter) {
 		List<RangerServiceDef> serviceDefList = new ArrayList<RangerServiceDef>();
-		
-		List<XXServiceDef> xSvcDefList = (List<XXServiceDef>) searchResources(searchFilter, searchFields, sortFields, null);
-		for(XXServiceDef xSvcDef : xSvcDefList) {
+		RangerServiceDefList retList = new RangerServiceDefList();
+
+		List<XXServiceDef> xSvcDefList = (List<XXServiceDef>) searchResources(searchFilter, searchFields, sortFields, retList);
+		for (XXServiceDef xSvcDef : xSvcDefList) {
 			serviceDefList.add(populateViewBean((T) xSvcDef));
 		}
-		
-		return serviceDefList;
+
+		retList.setServiceDefs(serviceDefList);
+
+		return retList;
 	}
-	
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
index 6f484ec..fb6142e 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceServiceBase.java
@@ -10,6 +10,7 @@ import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.util.SearchFilter;
+import org.apache.ranger.view.RangerServiceList;
 
 public abstract class RangerServiceServiceBase<T extends XXService, V extends RangerService> extends RangerBaseModelService<T, V> {
 	
@@ -49,17 +50,18 @@ public abstract class RangerServiceServiceBase<T extends XXService, V extends Ra
 		vObj.setPolicyUpdateTime(xObj.getPolicyUpdateTime());
 		return vObj;
 	}
-	
+
 	@SuppressWarnings("unchecked")
-	public List<RangerService> searchRangerPolicies(SearchFilter searchFilter) {
+	public RangerServiceList searchRangerServices(SearchFilter searchFilter) {
 		List<RangerService> serviceList = new ArrayList<RangerService>();
-		
-		List<XXService> xSvcList = (List<XXService>) searchResources(searchFilter, searchFields, sortFields, null);
-		for(XXService xSvc : xSvcList) {
+		RangerServiceList retList = new RangerServiceList();
+
+		List<XXService> xSvcList = (List<XXService>) searchResources(searchFilter, searchFields, sortFields, retList);
+		for (XXService xSvc : xSvcList) {
 			serviceList.add(populateViewBean((T) xSvc));
 		}
-		
-		return serviceList;
+		retList.setServices(serviceList);
+		return retList;
 	}
-	
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java
new file mode 100644
index 0000000..d4f8b2f
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/view/RangerPolicyList.java
@@ -0,0 +1,55 @@
+package org.apache.ranger.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.view.VList;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RangerPolicyList extends VList {
+	private static final long serialVersionUID = 1L;
+
+	List<RangerPolicy> policies = new ArrayList<RangerPolicy>();
+
+	public RangerPolicyList() {
+		super();
+	}
+
+	public RangerPolicyList(List<RangerPolicy> objList) {
+		super(objList);
+		this.policies = objList;
+	}
+
+	public List<RangerPolicy> getPolicies() {
+		return policies;
+	}
+
+	public void setPolicies(List<RangerPolicy> policies) {
+		this.policies = policies;
+	}
+
+	@Override
+	public int getListSize() {
+		if (policies != null) {
+			return policies.size();
+		}
+		return 0;
+	}
+
+	@Override
+	public List<?> getList() {
+		return policies;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java
new file mode 100644
index 0000000..eba8e9c
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceDefList.java
@@ -0,0 +1,55 @@
+package org.apache.ranger.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.view.VList;
+import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RangerServiceDefList extends VList {
+	private static final long serialVersionUID = 1L;
+
+	List<RangerServiceDef> serviceDefs = new ArrayList<RangerServiceDef>();
+
+	public RangerServiceDefList() {
+		super();
+	}
+
+	public RangerServiceDefList(List<RangerServiceDef> objList) {
+		super(objList);
+		this.serviceDefs = objList;
+	}
+
+	public List<RangerServiceDef> getServiceDefs() {
+		return serviceDefs;
+	}
+
+	public void setServiceDefs(List<RangerServiceDef> serviceDefs) {
+		this.serviceDefs = serviceDefs;
+	}
+
+	@Override
+	public int getListSize() {
+		if (serviceDefs != null) {
+			return serviceDefs.size();
+		}
+		return 0;
+	}
+
+	@Override
+	public List<?> getList() {
+		return serviceDefs;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java
new file mode 100644
index 0000000..94780e5
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/view/RangerServiceList.java
@@ -0,0 +1,55 @@
+package org.apache.ranger.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.view.VList;
+import org.apache.ranger.plugin.model.RangerService;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonAutoDetect(getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RangerServiceList extends VList {
+	private static final long serialVersionUID = 1L;
+
+	List<RangerService> services = new ArrayList<RangerService>();
+
+	public RangerServiceList() {
+		super();
+	}
+
+	public RangerServiceList(List<RangerService> objList) {
+		super(objList);
+		this.services = objList;
+	}
+
+	public List<RangerService> getServices() {
+		return services;
+	}
+
+	public void setServices(List<RangerService> services) {
+		this.services = services;
+	}
+
+	@Override
+	public int getListSize() {
+		if (services != null) {
+			return services.size();
+		}
+		return 0;
+	}
+
+	@Override
+	public List<?> getList() {
+		return services;
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js
index a63e4b2..f81f500 100644
--- a/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js
+++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerPolicyListBase.js
@@ -39,14 +39,8 @@ define(function(require){
 		 */
 		initialize : function() {
 			this.modelName = 'RangerPolicy';
-			this.modelAttrName = 'RangerPolicies';
+			this.modelAttrName = 'policies';
 			this.bindErrorEvents();
-		},
-			/**
-		 * override the parseRecords of PageableCollection for our use
-		 */
-		parseRecords : function(resp, options){
-			return resp;
 		}
 	},{
 		// static class members

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js
index 2754f62..9c57b61 100644
--- a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js
+++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceDefListBase.js
@@ -39,15 +39,10 @@ define(function(require){
 		 */
 		initialize : function() {
 			this.modelName = 'RangerServiceDef';
-			this.modelAttrName = 'RangerServiceDefs';
+			this.modelAttrName = 'serviceDefs';
 			this.bindErrorEvents();
 		},
-			/**
-		 * override the parseRecords of PageableCollection for our use
-		 */
-		parseRecords : function(resp, options){
-			return resp;
-		},
+		
 		comparator: function(def) {
 	        return def.get('id');
 	    }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js
index 99d1533..561d98f 100644
--- a/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js
+++ b/security-admin/src/main/webapp/scripts/collection_bases/RangerServiceListBase.js
@@ -39,15 +39,9 @@ define(function(require){
 		 */
 		initialize : function() {
 			this.modelName = 'RangerService';
-			this.modelAttrName = 'RangerServices';
+			this.modelAttrName = 'services';
 			this.bindErrorEvents();
 		},
-			/**
-		 * override the parseRecords of PageableCollection for our use
-		 */
-		parseRecords : function(resp, options){
-			return resp;
-		}
 	},{
 		// static class members
 		/**

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/controllers/Controller.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/controllers/Controller.js b/security-admin/src/main/webapp/scripts/controllers/Controller.js
index 9915fb5..34a0a94 100644
--- a/security-admin/src/main/webapp/scripts/controllers/Controller.js
+++ b/security-admin/src/main/webapp/scripts/controllers/Controller.js
@@ -58,10 +58,10 @@ define(function(require) {
 	   userAccessReportAction : function(){
 		   MAppState.set({ 'currentTab' : XAGlobals.AppTabs.Analytics.value });
 		   var view				= require('views/reports/UserAccessLayout');
-		   var VXResourceList 	= require('collections/VXResourceList');
+		   var RangerPolicyList 	= require('collections/RangerPolicyList');
 		   var VXGroupList		= require('collections/VXGroupList');
 		   var VXUserList		= require('collections/VXUserList');
-		   var resourceList 	= new VXResourceList([],{
+		   var policyList 	= new RangerPolicyList([],{
 			   queryParams : {
 				   //'resourceType' : XAEnums.AssetType.ASSET_HDFS.value,
 				   //'assetId' : assetId 
@@ -70,29 +70,23 @@ define(function(require) {
 		   var that 		= this;
 		   this.groupList 	= new VXGroupList();
 		   this.userList 	= new VXUserList();
-		   resourceList.setPageSize(200, {fetch : false});
-		   resourceList.fetch({
-			   async:false,
-			   cache : false
-		   }).done(function(){
-				that.groupList.fetch({
-						async:false,
-						cache:false
-					}).done(function(){
-					that.userList.fetch({
-						async:false,
-						cache:false
-					}).done(function(){
-						if(App.rContent.currentView)
-							   App.rContent.currentView.close();
-						App.rContent.show(new view({
-							collection : resourceList,
-							groupList :that.groupList,
-							userList :that.userList
-						}));
-					});
+		   that.groupList.fetch({
+					async:false,
+					cache:false
+				}).done(function(){
+				that.userList.fetch({
+					async:false,
+					cache:false
+				}).done(function(){
+					if(App.rContent.currentView)
+						   App.rContent.currentView.close();
+					App.rContent.show(new view({
+						collection : policyList,
+						groupList :that.groupList,
+						userList :that.userList
+					}));
 				});
-		   });
+			});
 	   },
 	   auditReportAction : function(tab){
 		   MAppState.set({ 'currentTab' : XAGlobals.AppTabs.Audit.value });
@@ -230,7 +224,7 @@ define(function(require) {
 		   var view 				= require('views/policymanager/ServiceLayout');
 		   var RangerServiceDefList	= require('collections/RangerServiceDefList');
 		   var collection 			= new RangerServiceDefList();
-		   collection.queryParams.sortBy = 'id';
+		   collection.queryParams.sortBy = 'serviceTypeId';
 		   collection.fetch({
 			   cache : false,
 			   async:false

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js b/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js
index 5556559..12bd6d7 100644
--- a/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/common/XATableLayout.js
@@ -122,16 +122,19 @@ define(function(require){
 			this.listenTo(this.collection, "sync reset", this.showHidePager);
 			
             this.listenTo(this.collection, 'request', function(){
-				$(this.rTableSpinner.el).addClass('loading');
+//				$(this.rTableSpinner.el).addClass('loading');
+				this.$el.find(this.rTableSpinner.el).addClass('loading');
 			},this);
             this.listenTo(this.collection, 'sync error', function(){
-				$(this.rTableSpinner.el).removeClass('loading');
+//				$(this.rTableSpinner.el).removeClass('loading');
+				this.$el.find(this.rTableSpinner.el).removeClass('loading');
 			},this);
 		},
 
 		/** on render callback */
 		onRender: function() {
 			this.initializePlugins();
+			
 			this.renderTable();
 			if(this.includePagination) {
 				this.renderPagination();
@@ -171,9 +174,10 @@ define(function(require){
 		},
 		showHidePager : function(){
 			if(this.collection.state && this.collection.state.totalRecords > XAGlobals.settings.PAGE_SIZE)	{
-				$(this.rPagination.el).show();
+				this.$el.find(this.rPagination.el).show()
+				//$(this.rPagination.el).show();
 			} else {
-				$(this.rPagination.el).hide();
+				this.$el.find(this.rPagination.el).hide();
 			}
 		},
 		renderFilter : function(){

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
index b938c66..686836b 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
@@ -262,19 +262,16 @@ define(function(require) {
 					if(that.model.has('accesses')){
 							perms = that.model.get('accesses');
 					}
-					//reset isAllowed flag in accesssItems to set newly isAllowed
-					_.each(that.accessItems, function(item){ item.isAllowed = false });
 					
-					_.each(that.accessTypes, function(obj) {
-						if(_.contains(values, obj.name)){
-							var type = obj.name
-							_.each(that.accessItems, function(item){ if(item.type == type) item.isAllowed = true });
+					var items=[];
+					_.each(that.accessItems, function(item){ 
+						if($.inArray( item.type, values) >= 0){
+							item.isAllowed = true;
+							items.push(item) ;
 						}
-					});
+					},this);
 					// Save form data to model
-					
-					if(!_.isEmpty(that.accessItems))
-						that.model.set('accesses', that.accessItems);
+					that.model.set('accesses', items);
 					
 					$(this).html(valArr.join(" "));
 					that.ui.addPermissionsSpan.find('i').attr('class', 'icon-pencil');

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/85d5658f/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
index bcbb3e0..42b5f68 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
@@ -455,14 +455,14 @@ define(function(require){
 						},
 						results: function (data, page) { 
 							var results = [];
-							if(data.length > 0){
-								results = data.map(function(m, i){	return {id : m, text: m};	});
-							}
-							/*if(!_.isUndefined(data)){
+							if(!_.isUndefined(data)){
+								if(_.isArray(data) && data.length > 0){
+									results = data.map(function(m, i){	return {id : m, text: m};	});
+								}
 								if(data.resultSize != "0"){
 									results = data.vXStrings.map(function(m, i){	return {id : m.value, text: m.value};	});
 								}
-							}*/
+							}
 							return { 
 								results : results
 							};