Repository: incubator-ranger
Updated Branches:
  refs/heads/master 62fa3616a -> 5df9aa645


RANGER-358 : Show previous/next version of policy in Policy View popup

Signed-off-by: Madhan Neethiraj <[email protected]>


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

Branch: refs/heads/master
Commit: 5df9aa6457776e411525fe83d269455be7861ab6
Parents: 62fa361
Author: Gautam Borad <[email protected]>
Authored: Wed Apr 1 23:33:11 2015 +0530
Committer: Madhan Neethiraj <[email protected]>
Committed: Wed Apr 1 21:21:48 2015 -0700

----------------------------------------------------------------------
 .../org/apache/ranger/biz/ServiceDBStore.java   | 67 +++++++++++++-------
 .../org/apache/ranger/db/XXDataHistDao.java     | 31 ++++++++-
 .../org/apache/ranger/rest/ServiceREST.java     | 21 ++++--
 .../ranger/service/RangerBaseModelService.java  | 10 ++-
 .../ranger/service/RangerDataHistService.java   |  2 -
 .../resources/META-INF/jpa_named_queries.xml    | 10 +++
 .../main/webapp/scripts/models/RangerPolicy.js  | 24 ++++++-
 .../scripts/modules/globalize/message/en.js     |  4 ++
 .../scripts/views/policies/RangerPolicyRO.js    | 57 +++++++++++++++--
 .../webapp/scripts/views/reports/AuditLayout.js | 12 +++-
 security-admin/src/main/webapp/styles/xa.css    | 32 ++++++++++
 .../templates/policies/RangerPolicyRO_tmpl.html | 40 ++++++++++--
 .../service/ConfigurationItem_tmpl.html         |  4 +-
 13 files changed, 265 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/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 e6513b3..9fa9160 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
@@ -107,6 +107,7 @@ 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.VXString;
 import org.apache.ranger.view.VXUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -538,9 +539,17 @@ public class ServiceDBStore implements ServiceStore {
                } else {
                        version = new Long(version.longValue() + 1);
                }
-               
+
                service.setVersion(version);
-               service = svcService.update(service);
+
+               if(populateExistingBaseFields) {
+                       svcService.setPopulateExistingBaseFields(true);
+                       service = svcService.update(service);
+                       svcService.setPopulateExistingBaseFields(false);
+               } else {
+                       service = svcService.update(service);
+               }
+
                XXService xUpdService = 
daoMgr.getXXService().getById(service.getId());
                
                List<XXServiceConfigMap> dbConfigMaps = 
daoMgr.getXXServiceConfigMap().findByServiceId(service.getId());
@@ -677,7 +686,7 @@ public class ServiceDBStore implements ServiceStore {
                if(xServiceDef == null) {
                        throw new Exception("service-def does not exist - 
name=" + service.getType());
                }
-               
+
                XXPolicy existing = 
daoMgr.getXXPolicy().findByNameAndServiceId(policy.getName(), service.getId());
 
                if(existing != null) {
@@ -688,7 +697,7 @@ public class ServiceDBStore implements ServiceStore {
                List<RangerPolicyItem> policyItems = policy.getPolicyItems();
 
                policy.setVersion(new Long(1));
-               
+
                if(populateExistingBaseFields) {
                        policyService.setPopulateExistingBaseFields(true);
                        policy = policyService.create(policy);
@@ -701,14 +710,13 @@ public class ServiceDBStore implements ServiceStore {
 
                createNewResourcesForPolicy(policy, xCreatedPolicy, resources);
                createNewPolicyItemsForPolicy(policy, xCreatedPolicy, 
policyItems, xServiceDef);
-
                handlePolicyUpdate(service);
                RangerPolicy createdPolicy = 
policyService.getPopulatedViewObject(xCreatedPolicy);
                dataHistService.createObjectDataHistory(createdPolicy, 
RangerDataHistService.ACTION_CREATE);
 
-                List<XXTrxLog> trxLogList = 
policyService.getTransactionLog(createdPolicy, 
RangerPolicyService.OPERATION_CREATE_CONTEXT);
-                bizUtil.createTrxLog(trxLogList);
-               
+               List<XXTrxLog> trxLogList = 
policyService.getTransactionLog(createdPolicy, 
RangerPolicyService.OPERATION_CREATE_CONTEXT);
+               bizUtil.createTrxLog(trxLogList);
+
                return createdPolicy;
        }
 
@@ -1069,22 +1077,9 @@ public class ServiceDBStore implements ServiceStore {
                }
                Map<String, String> validConfigs = new HashMap<String, 
String>();
                for(Entry<String, String> config : configs.entrySet()) {
-                       validConfigs.put(config.getKey(), config.getValue());
-                       /*String confKey = ;
-                       String confValue = ;
-
-                       boolean found = false;
-                       for(XXServiceConfigDef xConfDef : svcConfDefList) {
-                               
if((xConfDef.getName()).equalsIgnoreCase(confKey)) {
-                                       found = true;
-                                       break;
-                               }
+                       if(!stringUtil.isEmpty(config.getValue())) {
+                               validConfigs.put(config.getKey(), 
config.getValue());
                        }
-                       if(found) {
-                       } else {
-                               LOG.info("Ignoring this config parameter:" + 
confKey
-                                               + ", as its not valid conf 
param for service");
-                       }*/
                }
                return validConfigs;
        }
@@ -1294,7 +1289,7 @@ public class ServiceDBStore implements ServiceStore {
                this.populateExistingBaseFields = populateExistingBaseFields;
        }
 
-       public RangerPolicy getPolicyFromEventTime(Date eventTime, Long 
policyId) {
+       public RangerPolicy getPolicyFromEventTime(String eventTime, Long 
policyId) {
 
                XXDataHist xDataHist = 
daoMgr.getXXDataHist().findObjByEventTimeClassTypeAndId(eventTime,
                                AppConstants.CLASS_TYPE_RANGER_POLICY, 
policyId);
@@ -1311,4 +1306,28 @@ public class ServiceDBStore implements ServiceStore {
                return policy;
        }
 
+       public VXString getPolicyVersionList(Long policyId) {
+               List<Integer> versionList = 
daoMgr.getXXDataHist().getVersionListOfObject(policyId,
+                               AppConstants.CLASS_TYPE_RANGER_POLICY);
+
+               VXString vXString = new VXString();
+               vXString.setValue(StringUtils.join(versionList, ","));
+
+               return vXString;
+       }
+
+       public RangerPolicy getPolicyForVersionNumber(Long policyId, int 
versionNo) {
+               XXDataHist xDataHist = 
daoMgr.getXXDataHist().findObjectByVersionNumber(policyId,
+                               AppConstants.CLASS_TYPE_RANGER_POLICY, 
versionNo);
+
+               if (xDataHist == null) {
+                       throw restErrorUtil.createRESTException("No Policy 
found for given version.", MessageEnums.DATA_NOT_FOUND);
+               }
+
+               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/5df9aa64/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 4479145..f22e198 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,7 @@
 package org.apache.ranger.db;
 
-import java.util.Date;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.persistence.NoResultException;
 import javax.persistence.Query;
@@ -29,7 +30,7 @@ public class XXDataHistDao extends BaseDao<XXDataHist> {
                }
        }
        
-       public XXDataHist findObjByEventTimeClassTypeAndId(Date eventTime, int 
classType, Long objId) {
+       public XXDataHist findObjByEventTimeClassTypeAndId(String eventTime, 
int classType, Long objId) {
                if (eventTime == null || objId == null) {
                        return null;
                }
@@ -44,4 +45,30 @@ public class XXDataHistDao extends BaseDao<XXDataHist> {
                }
        }
 
+       @SuppressWarnings("unchecked")
+       public List<Integer> getVersionListOfObject(Long objId, int classType) {
+               if (objId == null) {
+                       return new ArrayList<Integer>();
+               }
+               try {
+                       return 
getEntityManager().createNamedQuery("XXDataHist.getVersionListOfObject")
+                                       .setParameter("objId", 
objId).setParameter("classType", classType).getResultList();
+               } catch (NoResultException e) {
+                       return new ArrayList<Integer>();
+               }
+       }
+
+       public XXDataHist findObjectByVersionNumber(Long objId, int classType, 
int versionNo) {
+               if (objId == null) {
+                       return null;
+               }
+               try {
+                       return 
getEntityManager().createNamedQuery("XXDataHist.findObjectByVersionNumber", 
tClass)
+                                       .setParameter("objId", 
objId).setParameter("classType", classType)
+                                       .setParameter("version", 
versionNo).getSingleResult();
+               } catch (NoResultException e) {
+                       return null;
+               }
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/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 a0a358b..9d8d277 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,7 +21,6 @@ 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;
@@ -81,6 +80,7 @@ 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.apache.ranger.view.VXString;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -1497,10 +1497,7 @@ public class ServiceREST {
 
                Long policyId = Long.parseLong(policyIdStr);
 
-               Date eventTime = restErrorUtil.parseDate(eventTimeStr, "Invalid 
value for" + "Event Time",
-                               MessageEnums.INVALID_INPUT_DATA, null, 
"eventTime", "MM/dd/yyyy hh:mm:ss");
-
-               RangerPolicy policy = 
svcStore.getPolicyFromEventTime(eventTime, policyId);
+               RangerPolicy policy = 
svcStore.getPolicyFromEventTime(eventTimeStr, policyId);
 
                if (LOG.isDebugEnabled()) {
                        LOG.debug("<== ServiceREST.getPolicyFromEventTime()");
@@ -1509,4 +1506,18 @@ public class ServiceREST {
                return policy;
        }
 
+       @GET
+       @Path("/policy/{policyId}/versionList")
+       public VXString getPolicyVersionList(@PathParam("policyId") Long 
policyId) {
+               return svcStore.getPolicyVersionList(policyId);
+       }
+
+       @GET
+       @Path("/policy/{policyId}/version/{versionNo}")
+       @Produces({ "application/json", "application/xml" })
+       public RangerPolicy getPolicyForVersionNumber(@PathParam("policyId") 
Long policyId,
+                       @PathParam("versionNo") int versionNo) {
+               return svcStore.getPolicyForVersionNumber(policyId, versionNo);
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/java/org/apache/ranger/service/RangerBaseModelService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerBaseModelService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerBaseModelService.java
index 78b846c..2193666 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerBaseModelService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerBaseModelService.java
@@ -228,13 +228,19 @@ public abstract class RangerBaseModelService<T extends 
XXDBBase, V extends Range
                        if (createTime == null) {
                                createTime = DateUtil.getUTCDate();
                        }
-                       updTime = DateUtil.getUTCDate();
 
                        createdById = entityObj.getAddedByUserId();
                        if (createdById == null) {
                                createdById = ContextUtil.getCurrentUserId();
                        }
-                       updById = ContextUtil.getCurrentUserId();
+                       
+                       if(populateExistingBaseFields) {
+                               updTime = entityObj.getUpdateTime();
+                               updById = entityObj.getUpdatedByUserId();
+                       } else {                                
+                               updTime = DateUtil.getUTCDate();
+                               updById = ContextUtil.getCurrentUserId();
+                       }
                } else {
                        throw restErrorUtil.createRESTException(
                                        "Error while populating EntityBean",

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/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 b75b514..dc73d83 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
@@ -49,7 +49,6 @@ public class RangerDataHistService {
                
                Long objectId = baseModelObj.getId();
                String objectGuid = baseModelObj.getGuid();
-               Long version = baseModelObj.getVersion();
                Date currentDate = DateUtil.getUTCDate();
                
                XXDataHist xDataHist = new XXDataHist();;
@@ -93,7 +92,6 @@ public class RangerDataHistService {
                                                                + objectName, 
MessageEnums.DATA_NOT_UPDATABLE);
                        }
                        
-                       prevHist.setVersion(version);
                        prevHist.setUpdateTime(currentDate);
                        prevHist.setToTime(currentDate);
                        prevHist.setObjectName(objectName);

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
----------------------------------------------------------------------
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 7a0fe30..b806dff 100644
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -362,6 +362,16 @@
                                and obj.objectClassType = :classType ORDER BY 
obj.id</query>
        </named-query>
        
+       <named-query name="XXDataHist.getVersionListOfObject">
+               <query>select obj.version from XXDataHist obj where 
obj.objectId = :objId
+                       and obj.objectClassType = :classType GROUP BY 
obj.version </query>
+       </named-query>
+       
+       <named-query name="XXDataHist.findObjectByVersionNumber">
+               <query>select obj from XXDataHist obj where obj.objectClassType 
= :classType and 
+               obj.objectId = :objId and obj.version = :version</query>
+       </named-query>
+       
        <!-- XXTrxLog -->
        <named-query name="XXTrxLog.findLogForMaxIdOfClassType">
                <query>select MAX(obj.objectId) from XXTrxLog obj where 
obj.objectClassType = :classType</query>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/scripts/models/RangerPolicy.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/models/RangerPolicy.js 
b/security-admin/src/main/webapp/scripts/models/RangerPolicy.js
index 2228f23..46e498b 100644
--- a/security-admin/src/main/webapp/scripts/models/RangerPolicy.js
+++ b/security-admin/src/main/webapp/scripts/models/RangerPolicy.js
@@ -89,14 +89,34 @@ define(function(require){
                        queryParams.policyId = this.get('id');
                        if(_.isUndefined(queryParams.eventTime)){
                                throw('eventTime can not be undefined');
-                       }else{
-                               queryParams.eventTime = Globalize.format(new 
Date(queryParams.eventTime),  "MM/dd/yyyy hh:mm:ss")
                        }
 
                        opt.url = 'service/plugins/policies/eventTime';
                        return this.fetch(opt);
                },
 
+               fetchByVersion : function(versionNo, opt){
+                       if(_.isUndefined(versionNo)){
+                               throw('versionNo can not be undefined');
+                       }
+                       opt.url = 
'service/plugins/policy/'+this.get('id')+'/version/'+versionNo;
+                       return this.fetch(opt);
+               },
+
+               fetchVersions : function(){
+                       var versionList;
+                       var url = 
'service/plugins/policy/'+this.get('id')+'/versionList';
+                       $.ajax({
+                               url : url,
+                               async : false,
+                               dataType : 'JSON',
+                               success : function(data){
+                                       versionList = data.value.split(',');
+                               },
+                       });
+                       return versionList;
+               },
+
                /** This models toString() */
                toString : function(){
                        return this.get('name');

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js 
b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index 2231037..9b5b5e8 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -207,6 +207,7 @@ define(function(require) {
                                selectServiceName                               
: 'Select Service Name',
                                topologyName                                    
: 'Topology Name',
                                serivceName                                     
        : 'Service Name',
+                               serivceType                                     
        : 'Service Type',
                                ipAddress                                       
        : 'IP Address',
                                isVisible                       : 'Visible',
                                delegatedAdmin                                  
: 'Delegate Admin',
@@ -253,6 +254,8 @@ define(function(require) {
                                agents                                          
: 'Plugins',
                                repository                                      
: 'Repository',
                                policy                                          
: 'Policy',
+                               policyDetails                           : 
'Policy Details',
+                               userGroupPermissions            : 'User and 
Group Permissions',
                                groups                                          
: 'Groups',
                                admin                                           
: 'Admin',
                                bigData                                         
: 'Big Data',
@@ -294,6 +297,7 @@ define(function(require) {
                                userDoesNotExistAnymore   : 'User does not 
exist anymore..',
                                repoDoesNotExistAnymore   : 'Repository does 
not exist anymore..',
                                policyDisabledMsg                 : 'This 
policy is currently in disabled state.',
+                               noRecordsFound                    : 'No Records 
Found',
                                
                                
                                

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyRO.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyRO.js 
b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyRO.js
index 16f489a..a9ee1b5 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyRO.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyRO.js
@@ -36,7 +36,7 @@ define(function(require) {
                template: RangerPolicyROTmpl,
                templateHelpers: function() {
                        return {
-                               PolicyDetails: this.PolicyDetails,
+                               PolicyDetails: this.policyDetails,
                        };
                },
                breadCrumbs: [],
@@ -58,7 +58,7 @@ define(function(require) {
                },
 
                /**
-                * intialize a new AuditLayout Layout
+                * intialize a new RangerPolicyRO Layout
                 * @constructs
                 */
                initialize: function(options) {
@@ -80,13 +80,15 @@ define(function(require) {
 
                initializePolicyDetailsObj : function(){
                        var self = this;
-                       var details = this.PolicyDetails = {};
+                       var details = this.policyDetails = {};
                        details.id = this.policy.get('id');
                        details.name = this.policy.get('name');
                        details.isEnabled = this.policy.get('isEnabled') ? 
localization.tt('lbl.ActiveStatus_STATUS_ENABLED') : 
localization.tt('lbl.ActiveStatus_STATUS_DISABLED');
                        details.description = this.policy.get('description');
                        details.isAuditEnabled = 
this.policy.get('isAuditEnabled') ? XAEnums.AuditStatus.AUDIT_ENABLED.label : 
XAEnums.AuditStatus.AUDIT_DISABLED.label;
                        details.resources = [];
+                       details.service = this.policy.get('service');
+                       details.serviceType = this.serviceDef.get('name');
                        _.each(this.serviceDef.get('resources'), function(def, 
i){
                                
if(!_.isUndefined(this.policy.get('resources')[def.name])){
                                        var resource = {},
@@ -103,6 +105,10 @@ define(function(require) {
                        }, this);
                        var perm = details.permissions = this.getPermHeaders();
                        perm.policyItems = this.policy.get('policyItems');
+                       details.createdBy = this.policy.get('createdBy');
+                       details.createTime = Globalize.format(new 
Date(this.policy.get('createTime')),  "MM/dd/yyyy hh:mm tt");
+                       details.updatedBy = this.policy.get('updatedBy');
+                       details.updateTime = Globalize.format(new 
Date(this.policy.get('updateTime')),  "MM/dd/yyyy hh:mm tt");
                },
 
                /** all events binding here */
@@ -110,7 +116,10 @@ define(function(require) {
 
                /** on render callback */
                onRender: function() {
-                       this.$el.find('#permissionsDetails table tr 
td:empty').html('-')
+                       this.$el.find('#permissionsDetails table tr 
td:empty').html('-');
+                       if(this.$el.find('#permissionsDetails table tbody 
tr').length == 0){
+                               this.$el.find('#permissionsDetails table 
tbody').append('<tr><td colspan="5">'+ localization.tt("msg.noRecordsFound") 
+'</td></tr>');
+                       }
                },
 
                getPermHeaders : function(){
@@ -130,6 +139,46 @@ define(function(require) {
                        };
                },
 
+               nextVer : function(e){
+                       var $el = $(e.currentTarget);
+                       if($el.hasClass('active')){
+                               var curr = this.policy.get('version');
+                               this.getPolicyByVersion(++curr, e);
+                       }
+               },
+
+               previousVer : function(e){
+                       var $el = $(e.currentTarget);
+                       if($el.hasClass('active')){
+                               var curr = this.policy.get('version');
+                               this.getPolicyByVersion(--curr, e);
+                       }
+               },
+
+               getPolicyByVersion : function(ver, e){
+                       this.policy.fetchByVersion(ver, {
+                               cache : false,
+                               async : false
+                       });
+                       this.initializePolicyDetailsObj();
+                       this.render();
+                       var verEl = $(e.currentTarget).parent();
+                       verEl.find('text').text('Version 
'+this.policy.get('version'));
+                       var prevEl = verEl.find('#preVer'),
+                               nextEl = verEl.find('#nextVer');
+                       if(this.policy.get('version')>1){
+                               prevEl.addClass('active');
+                       }else{
+                               prevEl.removeClass('active');
+                       }
+                       var policyVerIndexAt = 
this.policyVersionList.indexOf(this.policy.get('version').toString());
+                       
if(!_.isUndefined(this.policyVersionList[++policyVerIndexAt])){
+                               nextEl.addClass('active');
+                       }else{
+                               nextEl.removeClass('active');
+                       }
+               },
+
                /** on close */
                onClose: function() {}
        });

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js 
b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
index 26375d8..9a3cbde 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
@@ -735,19 +735,29 @@ define(function(require) {
                                        var policy = new RangerPolicy({
                                                id: policyId
                                        });
+                                       var policyVersionList = 
policy.fetchVersions();
                                        var view = new RangerPolicyRO({
                                                policy: policy,
+                                               policyVersionList : 
policyVersionList,
                                                serviceDef: serviceDef,
                                                eventTime : eventTime
                                        });
                                        var modal = new 
Backbone.BootstrapModal({
                                                animate : true, 
                                                content         : view,
-                                               title: 
localization.tt("h.policy")+': '+policy.get('name'),
+                                               title: 
localization.tt("h.policyDetails"),
                                                okText 
:localization.tt("lbl.ok"),
                                                allowCancel : false,
                                                escape : true
                                        }).open();
+                                       var policyVerEl = 
modal.$el.find('.modal-footer').prepend('<div class="policyVer 
pull-left"></div>').find('.policyVer');
+                                       policyVerEl.append('<i id="preVer" 
class="icon-chevron-left '+ ((policy.get('version')>1) ? 'active' : '') 
+'"></i><text>Version '+ policy.get('version') 
+'</text>').find('#preVer').click(function(e){
+                                               view.previousVer(e);
+                                       });
+                                       var policyVerIndexAt = 
policyVersionList.indexOf(policy.get('version').toString());
+                                       policyVerEl.append('<i id="nextVer" 
class="icon-chevron-right '+ 
(!_.isUndefined(policyVersionList[++policyVerIndexAt])? 'active' : 
'')+'"></i>').find('#nextVer').click(function(e){
+                                               view.nextVer(e);
+                                       });
                                }
                        });
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/styles/xa.css
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/styles/xa.css 
b/security-admin/src/main/webapp/styles/xa.css
index c4f2f71..31e2a46 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -645,6 +645,38 @@ table.backgrid thead tr:hover {
   color: #4F4F4F !important;
   background-color: inherit !important;
 }
+.serviceInfo{
+  margin-top: -5px;
+}
+.updateInfo{
+  margin-top: 10px;
+}
+.updateInfo p {
+  margin-bottom: 0px;
+  margin-top: 0px;
+  font-size: 11px;
+}
+.policyVer{
+  font-size: 23px;
+  padding: 5px 0 0 3px;
+}
+.policyVer i{
+  color : #3C9C11 !important;
+  opacity: 0.4;
+  -webkit-user-select: none;
+}
+.policyVer i.active{
+  color : #3C9C11 !important;
+  cursor : pointer;
+  opacity: 1;
+}
+.policyVer text{
+  padding : 0 10px;
+  color : black;
+  font-size: 14px;
+  position: relative;
+  top: -3px;
+}
 
 .r-path {
   word-break: break-all;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/templates/policies/RangerPolicyRO_tmpl.html
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/templates/policies/RangerPolicyRO_tmpl.html 
b/security-admin/src/main/webapp/templates/policies/RangerPolicyRO_tmpl.html
index b2cec3a..77f7605 100644
--- a/security-admin/src/main/webapp/templates/policies/RangerPolicyRO_tmpl.html
+++ b/security-admin/src/main/webapp/templates/policies/RangerPolicyRO_tmpl.html
@@ -14,9 +14,21 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 --}}
-<div id="policyDetails">
+<div class="serviceInfo row-fluid">
+  <div class="pull-left">
+    <p>
+      <strong>{{tt 'lbl.serivceName'}} :</strong> {{PolicyDetails.service}}
+    </p>
+  </div>
+  <div class="pull-right">
+    <p>
+      <strong>{{tt 'lbl.serivceType'}} :</strong> {{PolicyDetails.serviceType}}
+    </p>
+  </div>
+</div>
+<div id="policyDetails" class="row-fluid">
   <p class="formHeader">
-    Policy Details : 
+    {{tt 'h.policyDetails'}} : 
   </p>
   <table class="table table-bordered table-condensed">
     <tbody>
@@ -25,7 +37,7 @@
           {{tt 'lbl.policyId'}}
         </td>
         <td>
-          <div class="controls"><label class="label 
label-ranger">{{PolicyDetails.id}}</label></div>
+          <div class="controls"><label class="label label-ranger" 
style="cursor: auto;">{{PolicyDetails.id}}</label></div>
         </td>
       </tr>
       <tr>
@@ -69,9 +81,9 @@
     </tbody>
   </table>
 </div>
-<div id="permissionsDetails">
+<div id="permissionsDetails" class="row-fluid">
   <p class="formHeader">
-    User and Group Permissions :
+    {{tt 'h.userGroupPermissions'}} :
   </p>
   <table class="table-permission table-condensed table-read-only" 
style="width:100%">
     <thead>
@@ -110,4 +122,22 @@
       {{/each}}
     </tbody>
   </table>
+</div>
+<div class="updateInfo row-fluid">
+  <div class="pull-left">
+    <p>
+      <strong>{{tt 'lbl.updatedBy'}} :</strong> {{PolicyDetails.updatedBy}}
+    </p>
+    <p>
+      <strong>{{tt 'lbl.updatedOn'}} :</strong> {{PolicyDetails.updateTime}}
+    </p>
+  </div>
+  <div class="pull-right">
+    <p>
+      <strong>{{tt 'lbl.createdBy'}} :</strong> {{PolicyDetails.createdBy}}
+    </p>
+    <p>
+      <strong>{{tt 'lbl.createdOn'}} :</strong> {{PolicyDetails.createTime}}
+    </p>
+  </div>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/5df9aa64/security-admin/src/main/webapp/templates/service/ConfigurationItem_tmpl.html
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/templates/service/ConfigurationItem_tmpl.html 
b/security-admin/src/main/webapp/templates/service/ConfigurationItem_tmpl.html
index a225b1b..6d330c4 100644
--- 
a/security-admin/src/main/webapp/templates/service/ConfigurationItem_tmpl.html
+++ 
b/security-admin/src/main/webapp/templates/service/ConfigurationItem_tmpl.html
@@ -14,8 +14,8 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 --}}
-<td><input type="text" data-js="name" value={{this.name}}></td>
-<td><input type="text" data-js="value" value={{this.value}}></td>
+<td><input type="text" data-js="name" value="{{this.name}}"></td>
+<td><input type="text" data-js="value" value="{{this.value}}"></td>
 <td>
        <button type="button" class="btn btn-small btn-danger" 
data-action="delete">
                <i class="icon-remove"></i>

Reply via email to