http://git-wip-us.apache.org/repos/asf/ranger/blob/c84b98fb/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 ceee8ce..a3e0261 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
@@ -19,6 +19,12 @@
 
 package org.apache.ranger.biz;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.UnknownHostException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,18 +33,11 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.StringTokenizer;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.UnknownHostException;
-import java.text.SimpleDateFormat;
 
 import javax.annotation.PostConstruct;
 import javax.servlet.ServletOutputStream;
@@ -50,22 +49,30 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.security.SecureClientLogin;
+import org.apache.hadoop.security.authentication.util.KerberosName;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.ranger.audit.provider.MiscUtil;
 import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.MessageEnums;
-import org.apache.ranger.common.RangerCommonEnums;
+import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher;
-import org.apache.ranger.plugin.resourcematcher.RangerAbstractResourceMatcher;
-import org.apache.ranger.plugin.service.RangerBaseService;
 import org.apache.ranger.plugin.store.ServiceStore;
 import org.apache.ranger.plugin.util.PasswordUtils;
 import org.apache.ranger.common.JSONUtil;
 import org.apache.ranger.common.PropertiesUtil;
 import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.RangerConstants;
 import org.apache.ranger.common.RangerFactory;
 import org.apache.ranger.common.RangerServicePoliciesCache;
 import org.apache.ranger.common.RangerVersionInfo;
@@ -79,15 +86,6 @@ import org.apache.ranger.db.XXDataMaskTypeDefDao;
 import org.apache.ranger.db.XXEnumDefDao;
 import org.apache.ranger.db.XXEnumElementDefDao;
 import org.apache.ranger.db.XXPolicyConditionDefDao;
-import org.apache.ranger.db.XXPolicyItemAccessDao;
-import org.apache.ranger.db.XXPolicyItemConditionDao;
-import org.apache.ranger.db.XXPolicyItemDao;
-import org.apache.ranger.db.XXPolicyItemDataMaskInfoDao;
-import org.apache.ranger.db.XXPolicyItemGroupPermDao;
-import org.apache.ranger.db.XXPolicyItemRowFilterInfoDao;
-import org.apache.ranger.db.XXPolicyItemUserPermDao;
-import org.apache.ranger.db.XXPolicyResourceDao;
-import org.apache.ranger.db.XXPolicyResourceMapDao;
 import org.apache.ranger.db.XXResourceDefDao;
 import org.apache.ranger.db.XXServiceConfigDefDao;
 import org.apache.ranger.db.XXServiceConfigMapDao;
@@ -101,18 +99,11 @@ import org.apache.ranger.entity.XXDataHist;
 import org.apache.ranger.entity.XXDataMaskTypeDef;
 import org.apache.ranger.entity.XXEnumDef;
 import org.apache.ranger.entity.XXEnumElementDef;
-import org.apache.ranger.entity.XXGroup;
 import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXPolicyConditionDef;
-import org.apache.ranger.entity.XXPolicyItem;
-import org.apache.ranger.entity.XXPolicyItemAccess;
-import org.apache.ranger.entity.XXPolicyItemCondition;
-import org.apache.ranger.entity.XXPolicyItemDataMaskInfo;
-import org.apache.ranger.entity.XXPolicyItemGroupPerm;
-import org.apache.ranger.entity.XXPolicyItemRowFilterInfo;
-import org.apache.ranger.entity.XXPolicyItemUserPerm;
-import org.apache.ranger.entity.XXPolicyResource;
-import org.apache.ranger.entity.XXPolicyResourceMap;
+import org.apache.ranger.entity.XXPolicyRefAccessType;
+import org.apache.ranger.entity.XXPolicyRefCondition;
+import org.apache.ranger.entity.XXPolicyRefResource;
 import org.apache.ranger.entity.XXResourceDef;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceConfigDef;
@@ -123,13 +114,11 @@ import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.entity.XXUser;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerDataMaskPolicyItem;
-import org.apache.ranger.plugin.model.RangerPolicy.RangerRowFilterPolicyItem;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemAccess;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemCondition;
-import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemDataMaskInfo;
-import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemRowFilterInfo;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerRowFilterPolicyItem;
 import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.model.RangerServiceDef;
@@ -144,7 +133,6 @@ import 
org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerRowFilterDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
-import org.apache.ranger.plugin.policyevaluator.RangerPolicyItemEvaluator;
 import org.apache.ranger.plugin.store.AbstractServiceStore;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
 import org.apache.ranger.plugin.store.PList;
@@ -161,15 +149,14 @@ import org.apache.ranger.service.RangerServiceDefService;
 import org.apache.ranger.service.RangerServiceDefWithAssignedIdService;
 import org.apache.ranger.service.RangerServiceService;
 import org.apache.ranger.service.RangerServiceWithAssignedIdService;
-import org.apache.ranger.service.XGroupService;
 import org.apache.ranger.service.XUserService;
 import org.apache.ranger.view.RangerExportPolicyList;
 import org.apache.ranger.view.RangerPolicyList;
 import org.apache.ranger.view.RangerServiceDefList;
 import org.apache.ranger.view.RangerServiceList;
-import org.apache.ranger.view.VXGroup;
 import org.apache.ranger.view.VXString;
 import org.apache.ranger.view.VXUser;
+import org.codehaus.jettison.json.JSONException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
@@ -177,14 +164,6 @@ import 
org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.support.TransactionCallback;
 import org.springframework.transaction.support.TransactionTemplate;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.codehaus.jettison.json.JSONException;
 
 import com.google.gson.Gson;
 
@@ -192,26 +171,38 @@ import com.google.gson.Gson;
 public class ServiceDBStore extends AbstractServiceStore {
        private static final Log LOG = LogFactory.getLog(ServiceDBStore.class);
 
+       public static final String RANGER_TAG_EXPIRY_CONDITION_NAME = 
"accessed-after-expiry";
+
+       private static final String ADMIN_USER_PRINCIPAL      = 
"ranger.admin.kerberos.principal";
+       private static final String ADMIN_USER_KEYTAB         = 
"ranger.admin.kerberos.keytab";
+       private static final String LOOKUP_PRINCIPAL          = 
"ranger.lookup.kerberos.principal";
+       private static final String LOOKUP_KEYTAB             = 
"ranger.lookup.kerberos.keytab";
+       private static final String RANGER_AUTH_TYPE          = 
"hadoop.security.authentication";
+       private static final String AMBARI_SERVICE_CHECK_USER = 
"ambari.service.check.user";
+
+       private static final String KERBEROS_TYPE             = "kerberos";
+
        private static final String POLICY_ALLOW_EXCLUDE = "Policy 
Allow:Exclude";
-       //private static final String POLICY_ALLOW_INCLUDE = "Policy 
Allow:Include";
-       private static final String POLICY_DENY_EXCLUDE = "Policy Deny:Exclude";
-       private static final String POLICY_DENY_INCLUDE = "Policy Deny:Include";
-       
-       private static String LOCAL_HOSTNAME = "unknown";
-       private static final String HOSTNAME = "Host name";
-       private static final String USER_NAME = "Exported by";
+       private static final String POLICY_ALLOW_INCLUDE = "Policy 
Allow:Include";
+       private static final String POLICY_DENY_EXCLUDE  = "Policy 
Deny:Exclude";
+       private static final String POLICY_DENY_INCLUDE  = "Policy 
Deny:Include";
+
+       private static       String LOCAL_HOSTNAME = "unknown";
+       private static final String HOSTNAME       = "Host name";
+       private static final String USER_NAME      = "Exported by";
        private static final String RANGER_VERSION = "Ranger apache version";
-       private static final String TIMESTAMP = "Export time";
+       private static final String TIMESTAMP      = "Export time";
 
-       private static final String AMBARI_SERVICE_CHECK_USER = 
"ambari.service.check.user";
-       private static final String SERVICE_ADMIN_USERS = "service.admin.users";
-       
-        public static final String CRYPT_ALGO = 
PropertiesUtil.getProperty("ranger.password.encryption.algorithm", 
PasswordUtils.DEFAULT_CRYPT_ALGO);
-        public static final String ENCRYPT_KEY = 
PropertiesUtil.getProperty("ranger.password.encryption.key", 
PasswordUtils.DEFAULT_ENCRYPT_KEY);
-        public static final String SALT = 
PropertiesUtil.getProperty("ranger.password.salt", PasswordUtils.DEFAULT_SALT);
-        public static final Integer ITERATION_COUNT = 
PropertiesUtil.getIntProperty("ranger.password.iteration.count", 
PasswordUtils.DEFAULT_ITERATION_COUNT);
+       private static final String AUDITTOHDFS_KMS_PATH    = 
"/ranger/audit/kms";
+       private static final String AUDITTOHDFS_POLICY_NAME = "kms-audit-path";
+       private static final String SERVICE_ADMIN_USERS     = 
"service.admin.users";
 
-    static {
+       public static final String  CRYPT_ALGO      = 
PropertiesUtil.getProperty("ranger.password.encryption.algorithm", 
PasswordUtils.DEFAULT_CRYPT_ALGO);
+       public static final String  ENCRYPT_KEY     = 
PropertiesUtil.getProperty("ranger.password.encryption.key", 
PasswordUtils.DEFAULT_ENCRYPT_KEY);
+       public static final String  SALT            = 
PropertiesUtil.getProperty("ranger.password.salt", PasswordUtils.DEFAULT_SALT);
+       public static final Integer ITERATION_COUNT = 
PropertiesUtil.getIntProperty("ranger.password.iteration.count", 
PasswordUtils.DEFAULT_ITERATION_COUNT);
+       
+       static {
                try {
                        LOCAL_HOSTNAME = 
java.net.InetAddress.getLocalHost().getCanonicalHostName();
                } catch (UnknownHostException e) {
@@ -247,7 +238,7 @@ public class ServiceDBStore extends AbstractServiceStore {
        XUserMgr xUserMgr;
 
        @Autowired
-       XGroupService xGroupService;
+       PolicyRefUpdater policyRefUpdater;
 
        @Autowired
        RangerDataHistService dataHistService;
@@ -277,7 +268,14 @@ public class ServiceDBStore extends AbstractServiceStore {
        @Autowired
        ServiceMgr serviceMgr;
 
+        @Autowired
+        AssetMgr assetMgr;
+
+       @Autowired
+       RangerTransactionSynchronizationAdapter 
transactionSynchronizationAdapter;
+
        private static volatile boolean legacyServiceDefsInitDone = false;
+
        private Boolean populateExistingBaseFields = false;
        
        public static final String HIDDEN_PASSWORD_STR = "*****";
@@ -288,7 +286,6 @@ public class ServiceDBStore extends AbstractServiceStore {
 
        private ServicePredicateUtil predicateUtil = null;
 
-
        @Override
        public void init() throws Exception {
                if (LOG.isDebugEnabled()) {
@@ -735,8 +732,8 @@ public class ServiceDBStore extends AbstractServiceStore {
                                }
                        }
                        if (!found) {
-                               List<XXPolicyResource> policyResList = 
daoMgr.getXXPolicyResource().findByResDefId(xRes.getId());
-                               if (!stringUtil.isEmpty(policyResList)) {
+                               List<XXPolicyRefResource> xxPolicyRefResource = 
daoMgr.getXXPolicyRefResource().findByResourceDefID(xRes.getId());
+                               if (!stringUtil.isEmpty(xxPolicyRefResource)) {
                                        throw 
restErrorUtil.createRESTException("Policy/Policies are referring to this 
resource: "
                                                        + xRes.getName() + ". 
Please remove such references from policy before updating service-def.",
                                                        
MessageEnums.DATA_NOT_UPDATABLE);
@@ -822,8 +819,8 @@ public class ServiceDBStore extends AbstractServiceStore {
                                }
                        }
                        if (!found) {
-                               List<XXPolicyItemAccess> polItemAccessList = 
daoMgr.getXXPolicyItemAccess().findByType(xAccess.getId());
-                               if(!stringUtil.isEmpty(polItemAccessList)) {
+                               List<XXPolicyRefAccessType> 
policyRefAccessTypeList = 
daoMgr.getXXPolicyRefAccessType().findByAccessTypeDefId(xAccess.getId());
+                               
if(!stringUtil.isEmpty(policyRefAccessTypeList)) {
                                        throw 
restErrorUtil.createRESTException("Policy/Policies are referring to this 
access-type: "
                                                        + xAccess.getName() + 
". Please remove such references from policy before updating service-def.",
                                                        
MessageEnums.DATA_NOT_UPDATABLE);
@@ -865,15 +862,14 @@ public class ServiceDBStore extends AbstractServiceStore {
                                }
                        }
                        if(!found) {
-                               List<XXPolicyItemCondition> policyItemCondList 
= daoMgr.getXXPolicyItemCondition()
-                                               
.findByPolicyConditionDefId(xCondition.getId());
-                               if(!stringUtil.isEmpty(policyItemCondList)) {
+                               List<XXPolicyRefCondition> 
xxPolicyRefConditions = 
daoMgr.getXXPolicyRefCondition().findByConditionDefId(xCondition.getId());
+                               if(!stringUtil.isEmpty(xxPolicyRefConditions)) {
                                        throw 
restErrorUtil.createRESTException("Policy/Policies are referring to this 
policy-condition: "
                                                        + xCondition.getName() 
+ ". Please remove such references from policy before updating service-def.",
                                                        
MessageEnums.DATA_NOT_UPDATABLE);
                                }
-                               for(XXPolicyItemCondition policyItemCond : 
policyItemCondList) {
-                                       
daoMgr.getXXPolicyItemCondition().remove(policyItemCond);
+                               for(XXPolicyRefCondition xxPolicyRefCondition : 
xxPolicyRefConditions) {
+                                       
daoMgr.getXXPolicyRefCondition().remove(xxPolicyRefCondition);
                                }
                                xxPolCondDao.remove(xCondition);
                        }
@@ -1206,9 +1202,9 @@ public class ServiceDBStore extends AbstractServiceStore {
                List<XXPolicyConditionDef> policyCondList = 
policyCondDao.findByServiceDefId(serviceDefId);
                
                for (XXPolicyConditionDef policyCond : policyCondList) {
-                       List<XXPolicyItemCondition> policyItemCondList = 
daoMgr.getXXPolicyItemCondition().findByPolicyConditionDefId(policyCond.getId());
-                       for (XXPolicyItemCondition policyItemCond : 
policyItemCondList) {
-                               
daoMgr.getXXPolicyItemCondition().remove(policyItemCond);
+                       List<XXPolicyRefCondition> xxPolicyRefConditions = 
daoMgr.getXXPolicyRefCondition().findByConditionDefId(policyCond.getId());
+                       for (XXPolicyRefCondition XXPolicyRefCondition : 
xxPolicyRefConditions) {
+                               
daoMgr.getXXPolicyRefCondition().remove(XXPolicyRefCondition);
                        }
                        policyCondDao.remove(policyCond);
                }
@@ -1258,37 +1254,25 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                        daoMgr.getXXAccessTypeDefGrants().remove(atdGrant);
                }
 
-               List<XXPolicyItemAccess> policyItemAccessList = 
daoMgr.getXXPolicyItemAccess().findByType(xAccess.getId());
-               for (XXPolicyItemAccess policyItemAccess : 
policyItemAccessList) {
-                       daoMgr.getXXPolicyItemAccess().remove(policyItemAccess);
+               List<XXPolicyRefAccessType> policyRefAccessTypeList = 
daoMgr.getXXPolicyRefAccessType().findByAccessTypeDefId(xAccess.getId());
+               for (XXPolicyRefAccessType xxPolicyRefAccessType : 
policyRefAccessTypeList) {
+                       
daoMgr.getXXPolicyRefAccessType().remove(xxPolicyRefAccessType);
                }
                daoMgr.getXXAccessTypeDef().remove(xAccess);
        }
 
        public void deleteXXResourceDef(XXResourceDef xRes) {
-
                List<XXResourceDef> xChildObjs = 
daoMgr.getXXResourceDef().findByParentResId(xRes.getId());
                for(XXResourceDef childRes : xChildObjs) {
                        deleteXXResourceDef(childRes);
                }
-
-               List<XXPolicyResource> xxResources = 
daoMgr.getXXPolicyResource().findByResDefId(xRes.getId());
-               for (XXPolicyResource xPolRes : xxResources) {
-                       deleteXXPolicyResource(xPolRes);
+               List<XXPolicyRefResource> xxPolicyRefResources = 
daoMgr.getXXPolicyRefResource().findByResourceDefID(xRes.getId());
+               for (XXPolicyRefResource xPolRefRes : xxPolicyRefResources) {
+                       daoMgr.getXXPolicyRefResource().remove(xPolRefRes);
                }
-
                daoMgr.getXXResourceDef().remove(xRes);
        }
 
-       public void deleteXXPolicyResource(XXPolicyResource xPolRes) {
-               List<XXPolicyResourceMap> polResMapList = 
daoMgr.getXXPolicyResourceMap().findByPolicyResId(xPolRes.getId());
-               XXPolicyResourceMapDao polResMapDao = 
daoMgr.getXXPolicyResourceMap();
-               for (XXPolicyResourceMap xxPolResMap : polResMapList) {
-                       polResMapDao.remove(xxPolResMap);
-               }
-               daoMgr.getXXPolicyResource().remove(xPolRes);
-       }
-
        @Override
        public RangerServiceDef getServiceDef(Long id) throws Exception {
                if (LOG.isDebugEnabled()) {
@@ -1439,10 +1423,7 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                        xConfMap.setServiceId(xCreatedService.getId());
                        xConfMap.setConfigkey(configKey);
                        xConfMap.setConfigvalue(configValue);
-                       xConfMapDao.create(xConfMap);
-               }
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("vXUser:[" + vXUser + "]");
+                       xConfMap = xConfMapDao.create(xConfMap);
                }
                RangerService createdService = 
svcService.getPopulatedViewObject(xCreatedService);
 
@@ -1457,7 +1438,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                bizUtil.createTrxLog(trxLogList);
 
                if (createDefaultPolicy) {
-                       createDefaultPolicies(createdService);
+                       createDefaultPolicies(xCreatedService, vXUser);
                }
 
                return createdService;
@@ -1599,25 +1580,21 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                                                                + userName + "] 
please use existing user", MessageEnums.OPER_NO_PERMISSION);
                                        }
                                        vXUser = 
xUserMgr.createServiceConfigUser(userName);
+                                       if (LOG.isDebugEnabled()) {
+                                               LOG.debug("Service config user 
created:[" + vXUser + "]");
+                                       }
                                }
                        }
-                       
+
                        if (StringUtils.equalsIgnoreCase(configKey, 
CONFIG_KEY_PASSWORD)) {
                                if (StringUtils.equalsIgnoreCase(configValue, 
HIDDEN_PASSWORD_STR)) {
-                                       String[] crypt_algo_array = null;
-                                       if (configValue.contains(",")) {
-                                               crypt_algo_array = 
configValue.split(",");
-                                       }
-                                        if (oldPassword != null && 
oldPassword.contains(",")) {
-                                                String encryptKey = null;
-                                                String salt = null;
-                                                int iterationCount = 0;
-                                               crypt_algo_array = 
oldPassword.split(",");
-                                               String OLD_CRYPT_ALGO = 
crypt_algo_array[0];
-                                                encryptKey = 
crypt_algo_array[1];
-                                                salt = crypt_algo_array[2];
-                                                iterationCount = 
Integer.parseInt(crypt_algo_array[3]);
-                                               
+                                       if (oldPassword != null && 
oldPassword.contains(",")) {
+                                               String[] crypt_algo_array = 
oldPassword.split(",");
+                                               String   OLD_CRYPT_ALGO   = 
crypt_algo_array[0];
+                                               String   encryptKey       = 
crypt_algo_array[1];
+                                               String   salt             = 
crypt_algo_array[2];
+                                               int      iterationCount   = 
Integer.parseInt(crypt_algo_array[3]);
+
                                                if 
(!OLD_CRYPT_ALGO.equalsIgnoreCase(CRYPT_ALGO)) {
                                                        String decryptedPwd = 
PasswordUtils.decryptPassword(oldPassword);
                                                         String paddingString = 
CRYPT_ALGO + "," +  encryptKey + "," + salt + "," + iterationCount;
@@ -1642,15 +1619,13 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                                        }
                                }
                        }
+
                        XXServiceConfigMap xConfMap = new XXServiceConfigMap();
                        xConfMap = (XXServiceConfigMap) 
rangerAuditFields.populateAuditFields(xConfMap, xUpdService);
                        xConfMap.setServiceId(service.getId());
                        xConfMap.setConfigkey(configKey);
                        xConfMap.setConfigvalue(configValue);
-                       xConfMapDao.create(xConfMap);
-               }
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("vXUser:[" + vXUser + "]");
+                       xConfMap = xConfMapDao.create(xConfMap);
                }
                RangerService updService = 
svcService.getPopulatedViewObject(xUpdService);
                dataHistService.createObjectDataHistory(updService, 
RangerDataHistService.ACTION_UPDATE);
@@ -1672,11 +1647,11 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                }
 
                List<XXPolicy> policies = 
daoMgr.getXXPolicy().findByServiceId(service.getId());
-               RangerPolicy rangerPolicy =null;
+               //RangerPolicy rangerPolicy =null;
                for(XXPolicy policy : policies) {
                        LOG.info("Deleting Policy, policyName: " + 
policy.getName());
-                       rangerPolicy = getPolicy(policy.getId());
-                       deletePolicy(rangerPolicy);
+                       //rangerPolicy = getPolicy(policy.getId());
+                       deletePolicy(policy.getId());
                }
 
                XXServiceConfigMapDao configDao = 
daoMgr.getXXServiceConfigMap();
@@ -1834,14 +1809,6 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                        throw new Exception("policy already exists: 
ServiceName=" + policy.getService() + "; PolicyName=" + policy.getName() + ". 
ID=" + existing.getId());
                }
 
-               Map<String, RangerPolicyResource> resources = 
policy.getResources();
-               List<RangerPolicyItem> policyItems     = 
policy.getPolicyItems();
-               List<RangerPolicyItem> denyPolicyItems = 
policy.getDenyPolicyItems();
-               List<RangerPolicyItem> allowExceptions = 
policy.getAllowExceptions();
-               List<RangerPolicyItem> denyExceptions  = 
policy.getDenyExceptions();
-               List<RangerDataMaskPolicyItem> dataMaskItems  = 
policy.getDataMaskPolicyItems();
-               List<RangerRowFilterPolicyItem> rowFilterItems = 
policy.getRowFilterPolicyItems();
-
                policy.setVersion(Long.valueOf(1));
                updatePolicySignature(policy);
 
@@ -1859,14 +1826,8 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                }
 
                XXPolicy xCreatedPolicy = 
daoMgr.getXXPolicy().getById(policy.getId());
+               policyRefUpdater.createNewPolMappingForRefTable(policy, 
xCreatedPolicy, xServiceDef);
 
-               createNewResourcesForPolicy(policy, xCreatedPolicy, resources);
-               createNewPolicyItemsForPolicy(policy, xCreatedPolicy, 
policyItems, xServiceDef, RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ALLOW);
-               createNewPolicyItemsForPolicy(policy, xCreatedPolicy, 
denyPolicyItems, xServiceDef, RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DENY);
-               createNewPolicyItemsForPolicy(policy, xCreatedPolicy, 
allowExceptions, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ALLOW_EXCEPTIONS);
-               createNewPolicyItemsForPolicy(policy, xCreatedPolicy, 
denyExceptions, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DENY_EXCEPTIONS);
-               createNewDataMaskPolicyItemsForPolicy(policy, xCreatedPolicy, 
dataMaskItems, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DATAMASK);
-               createNewRowFilterPolicyItemsForPolicy(policy, xCreatedPolicy, 
rowFilterItems, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ROWFILTER);
                handlePolicyUpdate(service, true);
                RangerPolicy createdPolicy = 
policyService.getPopulatedViewObject(xCreatedPolicy);
                dataHistService.createObjectDataHistory(createdPolicy, 
RangerDataHistService.ACTION_CREATE);
@@ -1877,29 +1838,6 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                return createdPolicy;
        }
 
-        private boolean validatePolicyItem(List<RangerPolicyItem> policyItems) 
{
-                boolean isPolicyItemValid=true;
-                for (RangerPolicyItem policyItem : policyItems) {
-                        if (policyItem != null) {
-                                if 
(CollectionUtils.isEmpty(policyItem.getUsers())
-                                                || (policyItem.getUsers() != 
null) && policyItem.getUsers().contains(null)
-                                                || 
(policyItem.getUsers().contains(""))) {
-                                        if 
(CollectionUtils.isEmpty(policyItem.getGroups())
-                                                        || 
(policyItem.getGroups() != null) && policyItem.getGroups().contains(null)
-                                                        || 
(policyItem.getGroups().contains(""))) {
-
-                                                isPolicyItemValid = false;
-                                        }
-                                }
-                                if 
(CollectionUtils.isEmpty(policyItem.getAccesses())
-                                                || (policyItem.getAccesses() 
!= null) && policyItem.getAccesses().contains(null)) {
-                                        isPolicyItemValid = false;
-                                }
-                        }
-                }
-                return isPolicyItemValid;
-        }
-
        @Override
        public RangerPolicy updatePolicy(RangerPolicy policy) throws Exception {
                if(LOG.isDebugEnabled()) {
@@ -1937,14 +1875,7 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                                throw new Exception("another policy already 
exists with name '" + policy.getName() + "'. ID=" + newNamePolicy.getId());
                        }
                }
-               Map<String, RangerPolicyResource> newResources = 
policy.getResources();
-               List<RangerPolicyItem> policyItems     = 
policy.getPolicyItems();
-               List<RangerPolicyItem> denyPolicyItems = 
policy.getDenyPolicyItems();
-               List<RangerPolicyItem> allowExceptions = 
policy.getAllowExceptions();
-               List<RangerPolicyItem> denyExceptions  = 
policy.getDenyExceptions();
-               List<RangerDataMaskPolicyItem> dataMaskPolicyItems = 
policy.getDataMaskPolicyItems();
-               List<RangerRowFilterPolicyItem> rowFilterItems = 
policy.getRowFilterPolicyItems();
-
+               
                policy.setCreateTime(xxExisting.getCreateTime());
                policy.setGuid(xxExisting.getGuid());
                policy.setVersion(xxExisting.getVersion());
@@ -1958,26 +1889,19 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                        isTagVersionUpdateNeeded = existing.getIsEnabled() ? 
!policy.getIsEnabled() : policy.getIsEnabled();
                        isTagVersionUpdateNeeded = isTagVersionUpdateNeeded || 
!StringUtils.equals(existing.getResourceSignature(), 
policy.getResourceSignature());
                }
+
                policy = policyService.update(policy);
                XXPolicy newUpdPolicy = 
daoMgr.getXXPolicy().getById(policy.getId());
 
-               deleteExistingPolicyResources(policy);
-               deleteExistingPolicyItems(policy);
-               
-               createNewResourcesForPolicy(policy, newUpdPolicy, newResources);
-               createNewPolicyItemsForPolicy(policy, newUpdPolicy, 
policyItems, xServiceDef, RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ALLOW);
-               createNewPolicyItemsForPolicy(policy, newUpdPolicy, 
denyPolicyItems, xServiceDef, RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DENY);
-               createNewPolicyItemsForPolicy(policy, newUpdPolicy, 
allowExceptions, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ALLOW_EXCEPTIONS);
-               createNewPolicyItemsForPolicy(policy, newUpdPolicy, 
denyExceptions, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DENY_EXCEPTIONS);
-               createNewDataMaskPolicyItemsForPolicy(policy, newUpdPolicy, 
dataMaskPolicyItems, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_DATAMASK);
-               createNewRowFilterPolicyItemsForPolicy(policy, newUpdPolicy, 
rowFilterItems, xServiceDef, 
RangerPolicyItemEvaluator.POLICY_ITEM_TYPE_ROWFILTER);
-
-               handlePolicyUpdate(service, isTagVersionUpdateNeeded);
+               policyRefUpdater.cleanupRefTables(policy);
+               policyRefUpdater.createNewPolMappingForRefTable(policy, 
newUpdPolicy, xServiceDef);
+
+        handlePolicyUpdate(service, isTagVersionUpdateNeeded);
                RangerPolicy updPolicy = 
policyService.getPopulatedViewObject(newUpdPolicy);
                dataHistService.createObjectDataHistory(updPolicy, 
RangerDataHistService.ACTION_UPDATE);
                
                bizUtil.createTrxLog(trxLogList);
-               
+
                return updPolicy;
        }
 
@@ -2011,10 +1935,7 @@ public class ServiceDBStore extends AbstractServiceStore 
{
                policy.setVersion(version);
                
                List<XXTrxLog> trxLogList = 
policyService.getTransactionLog(policy, 
RangerPolicyService.OPERATION_DELETE_CONTEXT);
-               
-               deleteExistingPolicyItems(policy);
-               deleteExistingPolicyResources(policy);
-               
+               policyRefUpdater.cleanupRefTables(policy);
                policyService.delete(policy);
                handlePolicyUpdate(service, true);
                
@@ -2024,7 +1945,7 @@ public class ServiceDBStore extends AbstractServiceStore {
                
                LOG.info("Policy Deleted Successfully. PolicyName : " + 
policyName);
        }
-
+/*
        public void deletePolicy(RangerPolicy policy) throws Exception {
                if(policy == null) {
                        return;
@@ -2045,13 +1966,11 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                }
                policy.setVersion(version);
                List<XXTrxLog> trxLogList = 
policyService.getTransactionLog(policy, 
RangerPolicyService.OPERATION_DELETE_CONTEXT);
-               deleteExistingPolicyItemsNative(policy);
-               deleteExistingPolicyResourcesNative(policy);
                
daoMgr.getXXPolicy().deletePolicyIDReference("id",policy.getId());
                handlePolicyUpdate(service, true);
                dataHistService.createObjectDataHistory(policy, 
RangerDataHistService.ACTION_DELETE);
                bizUtil.createTrxLog(trxLogList);
-       }
+       }*/
 
        @Override
        public RangerPolicy getPolicy(Long id) throws Exception {
@@ -2087,7 +2006,6 @@ public class ServiceDBStore extends AbstractServiceStore {
                return ret;
        }
 
-
        public void getPoliciesInExcel(List<RangerPolicy> policies, 
HttpServletResponse response) throws Exception {
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> ServiceDBStore.getPoliciesInExcel()");
@@ -2570,134 +2488,428 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                return ret;
        }
 
-       void createDefaultPolicies(RangerService createdService) throws 
Exception {
+       void createDefaultPolicies(XXService createdService, VXUser vXUser) 
throws Exception {
+               RangerServiceDef serviceDef = 
getServiceDef(createdService.getType());
+
+               if 
(serviceDef.getName().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME))
 {
+                       createDefaultTagPolicy(createdService);
+               } else {
+                       // we need to create one policy for each resource 
hierarchy
+                       RangerServiceDefHelper serviceDefHelper = new 
RangerServiceDefHelper(serviceDef);
+                       for (List<RangerResourceDef> aHierarchy : 
serviceDefHelper.getResourceHierarchies(RangerPolicy.POLICY_TYPE_ACCESS)) {
+                               RangerPolicy policy = new RangerPolicy();
+                               createDefaultPolicy(policy, createdService, 
vXUser, aHierarchy);
+                               policy = createPolicy(policy);
+                               RangerPolicy policyAudit = new RangerPolicy();
+                               createPolicyForKeyAdmin(policyAudit, 
serviceDef, aHierarchy, createdService);
+                       }
+               }
+       }
+
+       private void createPolicyForKeyAdmin(RangerPolicy policyAudit, 
RangerServiceDef serviceDef, List<RangerResourceDef> aHierarchy, XXService 
createdService) {
+               if 
(serviceDef.getName().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_HDFS_NAME))
 {
+                       try {
+                // we need to create one policy for keyadmin user for audit to 
HDFS
+                RangerPolicy policy = getPolicyForKMSAudit(aHierarchy , 
createdService.getName(), serviceDef);
+                               if (policy != null) {
+                                       createPolicy(policy);
+                               }
+                       } catch (Exception e) {
+                LOG.error("Error creating policy for keyadmin for audit to 
HDFS : " + serviceDef.getName(), e);
+                       }
+               }
+       }
+
+       private RangerPolicy getPolicyForKMSAudit(List<RangerResourceDef> 
resourceHierarchy, String serviceName, RangerServiceDef serviceDef) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> ServiceDBStore.getPolicyForKMSAudit()");
+           }
 
-               RangerBaseService svc = 
serviceMgr.getRangerServiceByService(createdService, this);
+           RangerPolicy policy = new RangerPolicy();
 
-               if (svc != null) {
+           policy.setIsEnabled(true);
+           policy.setVersion(1L);
+           policy.setName(AUDITTOHDFS_POLICY_NAME);
+               policy.setService(serviceName);
+           policy.setDescription("Policy for " + AUDITTOHDFS_POLICY_NAME);
+           policy.setIsAuditEnabled(true);
+           policy.setResources(createKMSAuditResource(resourceHierarchy));
 
-                       List<String> serviceCheckUsers = 
getServiceCheckUsers(createdService);
+           List<RangerPolicy.RangerPolicyItem> policyItems = new 
ArrayList<RangerPolicy.RangerPolicyItem>();
+           //Create policy item for keyadmin
+           RangerPolicy.RangerPolicyItem policyItem = new 
RangerPolicy.RangerPolicyItem();
+           List<String> userKeyAdmin = new ArrayList<String>();
+           userKeyAdmin.add("keyadmin");
+           policyItem.setUsers(userKeyAdmin);
+           policyItem.setAccesses(getAndAllowAllAccesses(serviceDef));
+           policyItem.setDelegateAdmin(false);
 
-                       List<RangerPolicy.RangerPolicyItemAccess> allAccesses = 
svc.getAndAllowAllAccesses();
+           policyItems.add(policyItem);
+           policy.setPolicyItems(policyItems);
 
-                       List<RangerPolicy> defaultPolicies = 
svc.getDefaultRangerPolicies();
+           if (LOG.isDebugEnabled()) {
+                   LOG.debug("<== ServiceDBStore.getPolicyForKMSAudit()" + 
policy);
+           }
 
-                       if (CollectionUtils.isNotEmpty(defaultPolicies)) {
+           return policy;
+       }
 
-                               
createDefaultPolicyUsersAndGroups(defaultPolicies);
+       public List<RangerPolicy.RangerPolicyItemAccess> 
getAndAllowAllAccesses(RangerServiceDef serviceDef) {
+               List<RangerPolicy.RangerPolicyItemAccess> ret = new 
ArrayList<RangerPolicy.RangerPolicyItemAccess>();
+
+               for (RangerServiceDef.RangerAccessTypeDef accessTypeDef : 
serviceDef.getAccessTypes()) {
+                       RangerPolicy.RangerPolicyItemAccess access = new 
RangerPolicy.RangerPolicyItemAccess();
+                       access.setType(accessTypeDef.getName());
+                       access.setIsAllowed(true);
+                       ret.add(access);
+               }
+               return ret;
+       }
 
-                               for (RangerPolicy defaultPolicy : 
defaultPolicies) {
-                                        List<RangerPolicyItem> policyItems = 
defaultPolicy.getPolicyItems();
-                                       if 
(CollectionUtils.isNotEmpty(serviceCheckUsers)
-                                                       && 
StringUtils.equalsIgnoreCase(defaultPolicy.getService(), 
createdService.getName())) {
+       private Map<String, RangerPolicyResource> createKMSAuditResource(
+                       List<RangerServiceDef.RangerResourceDef> 
resourceHierarchy) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> 
ServiceDBStore.createKMSAuditResource()");
+               }
+               Map<String, RangerPolicy.RangerPolicyResource> resourceMap = 
new HashMap<>();
 
-                                               RangerPolicy.RangerPolicyItem 
policyItem = new RangerPolicy.RangerPolicyItem();
+               for (RangerServiceDef.RangerResourceDef resourceDef : 
resourceHierarchy) {
+                       RangerPolicy.RangerPolicyResource polRes = new 
RangerPolicy.RangerPolicyResource();
 
-                                               
policyItem.setUsers(serviceCheckUsers);
-                                               
policyItem.setAccesses(allAccesses);
-                                               
policyItem.setDelegateAdmin(true);
+                       polRes.setIsExcludes(false);
+                       
polRes.setIsRecursive(resourceDef.getRecursiveSupported());
+                       polRes.setValue(AUDITTOHDFS_KMS_PATH);
 
-                                               
defaultPolicy.getPolicyItems().add(policyItem);
-                                       }
-                                        boolean 
isPolicyItemValid=validatePolicyItem(policyItems);
-                                        if (isPolicyItemValid) {
-                                                createPolicy(defaultPolicy);
-                                        } else {
-                                                LOG.warn("Default policy won't 
be created,since policyItems not valid-either users/groups not present or 
access not present in policy.");
-                                        }
+                       resourceMap.put(resourceDef.getName(), polRes);
+               }
 
-                               }
-                       }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== ServiceDBStore.createKMSAuditResource():"
+                                       + resourceMap);
                }
+               return resourceMap;
        }
 
-       void createDefaultPolicyUsersAndGroups(List<RangerPolicy> 
defaultPolicies) {
-               Set<String> defaultPolicyUsers = new HashSet<String>();
-               Set<String> defaultPolicyGroups = new HashSet<String>();
+       private void createDefaultTagPolicy(XXService createdService) throws 
Exception {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> ServiceDBStore.createDefaultTagPolicy() 
");
+               }
 
-               for (RangerPolicy defaultPolicy : defaultPolicies) {
+               String tagResourceDefName = null;
+               boolean isConditionDefFound = false;
 
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getPolicyItems()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
-                       }
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getAllowExceptions()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
-                       }
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getDenyPolicyItems()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
+               RangerServiceDef tagServiceDef = 
getServiceDef(createdService.getType());
+               List<RangerResourceDef> tagResourceDef = 
tagServiceDef.getResources();
+               if (tagResourceDef != null && tagResourceDef.size() > 0) {
+                       // Assumption : First (and perhaps the only) 
resourceDef is the name of the tag resource
+                       RangerResourceDef theTagResourceDef = 
tagResourceDef.get(0);
+                       tagResourceDefName = theTagResourceDef.getName();
+               } else {
+                       LOG.error("ServiceDBStore.createService() - Cannot 
create default TAG policy: Cannot get tagResourceDef Name.");
+               }
+
+               List<RangerPolicyConditionDef> policyConditionDefs = 
tagServiceDef.getPolicyConditions();
+
+               if (CollectionUtils.isNotEmpty(policyConditionDefs)) {
+                       for (RangerPolicyConditionDef conditionDef : 
policyConditionDefs) {
+                               if 
(conditionDef.getName().equals(RANGER_TAG_EXPIRY_CONDITION_NAME)) {
+                                       isConditionDefFound = true;
+                                       break;
+                               }
                        }
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getDenyExceptions()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
+               }
+               if (!isConditionDefFound) {
+                       LOG.error("ServiceDBStore.createService() - Cannot 
create default TAG policy: Cannot get tagPolicyConditionDef with name=" + 
RANGER_TAG_EXPIRY_CONDITION_NAME);
+               }
+
+               if (tagResourceDefName != null && isConditionDefFound) {
+
+                       String tagType = "EXPIRES_ON";
+
+                       String policyName = tagType;
+
+                       RangerPolicy policy = new RangerPolicy();
+
+                       policy.setIsEnabled(true);
+                       policy.setVersion(1L);
+                       policy.setName(StringUtils.trim(policyName));
+                       policy.setService(createdService.getName());
+                       policy.setDescription("Policy for data with " + tagType 
+ " tag");
+                       policy.setIsAuditEnabled(true);
+
+                       Map<String, RangerPolicyResource> resourceMap = new 
HashMap<String, RangerPolicyResource>();
+
+                       RangerPolicyResource polRes = new 
RangerPolicyResource();
+                       polRes.setIsExcludes(false);
+                       polRes.setIsRecursive(false);
+                       polRes.setValue(tagType);
+                       resourceMap.put(tagResourceDefName, polRes);
+
+                       policy.setResources(resourceMap);
+
+                       List<RangerPolicyItem> policyItems = new 
ArrayList<RangerPolicyItem>();
+
+                       RangerPolicyItem policyItem = new RangerPolicyItem();
+
+                       List<String> groups = new ArrayList<String>();
+                       groups.add(RangerConstants.GROUP_PUBLIC);
+                       policyItem.setGroups(groups);
+
+                       List<XXAccessTypeDef> accessTypeDefs = 
daoMgr.getXXAccessTypeDef().findByServiceDefId(createdService.getType());
+                       List<RangerPolicyItemAccess> accesses = new 
ArrayList<RangerPolicyItemAccess>();
+                       for (XXAccessTypeDef accessTypeDef : accessTypeDefs) {
+                               RangerPolicyItemAccess access = new 
RangerPolicyItemAccess();
+                               access.setType(accessTypeDef.getName());
+                               access.setIsAllowed(true);
+                               accesses.add(access);
                        }
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getDataMaskPolicyItems()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
+                       policyItem.setAccesses(accesses);
+
+                       List<RangerPolicyItemCondition> policyItemConditions = 
new ArrayList<RangerPolicyItemCondition>();
+                       List<String> values = new ArrayList<String>();
+                       values.add("yes");
+                       RangerPolicyItemCondition policyItemCondition = new 
RangerPolicyItemCondition(RANGER_TAG_EXPIRY_CONDITION_NAME, values);
+                       policyItemConditions.add(policyItemCondition);
+
+                       policyItem.setConditions(policyItemConditions);
+                       policyItem.setDelegateAdmin(Boolean.FALSE);
+
+                       policyItems.add(policyItem);
+
+                       policy.setDenyPolicyItems(policyItems);
+
+                       policy = createPolicy(policy);
+               } else {
+                       LOG.error("ServiceDBStore.createService() - Cannot 
create default TAG policy, tagResourceDefName=" + tagResourceDefName +
+                                       ", tagPolicyConditionName=" + 
RANGER_TAG_EXPIRY_CONDITION_NAME);
+               }
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== 
ServiceDBStore.createDefaultTagPolicy()");
+               }
+       }
+
+       private String buildPolicyName(List<RangerResourceDef> 
resourceHierarchy) {
+               String ret = "all";
+               if (CollectionUtils.isNotEmpty(resourceHierarchy)) {
+                       int resourceDefCount = 0;
+                       for (RangerResourceDef resourceDef : resourceHierarchy) 
{
+                               if (resourceDefCount > 0) {
+                                       ret += ", ";
+                               } else {
+                                       ret += " - ";
+                               }
+                               ret += resourceDef.getName();
+                               resourceDefCount++;
                        }
-                       for (RangerPolicyItem defaultPolicyItem : 
defaultPolicy.getRowFilterPolicyItems()) {
-                               
defaultPolicyUsers.addAll(defaultPolicyItem.getUsers());
-                               
defaultPolicyGroups.addAll(defaultPolicyItem.getGroups());
+               }
+               return ret;
+       }
+
+       void createDefaultPolicy(RangerPolicy policy, XXService createdService, 
VXUser vXUser, List<RangerResourceDef> resourceHierarchy) throws Exception {
+
+               String policyName=buildPolicyName(resourceHierarchy);
+
+               policy.setIsEnabled(true);
+               policy.setVersion(1L);
+               policy.setName(StringUtils.trim(policyName));
+               policy.setService(createdService.getName());
+               policy.setDescription("Policy for " + policyName);
+               policy.setIsAuditEnabled(true);
+               policy.setPolicyType(policy.getPolicyType() == null ? 
RangerPolicy.POLICY_TYPE_ACCESS : policy.getPolicyType());
+
+               
policy.setResources(createDefaultPolicyResource(resourceHierarchy));
+
+               if (vXUser != null) {
+                       List<RangerPolicyItem> policyItems = new 
ArrayList<RangerPolicyItem>();
+                       List<XXAccessTypeDef> accessTypeDefs = 
daoMgr.getXXAccessTypeDef().findByServiceDefId(createdService.getType());
+                       //Create Default policy item for the service user
+                       RangerPolicyItem policyItem = 
createDefaultPolicyItem(createdService, vXUser, accessTypeDefs);
+                       policyItems.add(policyItem);
+                       // For KMS add default policies for HDFS & HIVE users.
+                       XXServiceDef xServiceDef = 
daoMgr.getXXServiceDef().getById(createdService.getType());
+                       if 
(EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(xServiceDef.getImplclassname()))
 {
+                               List<XXAccessTypeDef> hdfsAccessTypeDefs = new 
ArrayList<XXAccessTypeDef>();
+                               List<XXAccessTypeDef> hiveAccessTypeDefs = new 
ArrayList<XXAccessTypeDef>();
+                               for(XXAccessTypeDef accessTypeDef : 
accessTypeDefs) {
+                                       if 
(accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_GET_METADATA)) {
+                                               
hdfsAccessTypeDefs.add(accessTypeDef);
+                                               
hiveAccessTypeDefs.add(accessTypeDef);
+                                       } else if 
(accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_GENERATE_EEK)) {
+                                               
hdfsAccessTypeDefs.add(accessTypeDef);
+                                       } else if 
(accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_DECRYPT_EEK)) {
+                                               
hiveAccessTypeDefs.add(accessTypeDef);
+                                       }
+                               }
+
+                               String hdfsUser = 
PropertiesUtil.getProperty("ranger.kms.service.user.hdfs", "hdfs");
+                               if (hdfsUser != null && !hdfsUser.isEmpty()) {
+                                       XXUser xxUser = 
daoMgr.getXXUser().findByUserName(hdfsUser);
+                                       if (xxUser != null) {
+                                               vXUser = 
xUserService.populateViewBean(xxUser);
+                                       } else {
+                                               vXUser = 
xUserMgr.createServiceConfigUser(hdfsUser);
+                                       }
+                                       if (vXUser != null) {
+                                               LOG.info("Creating default KMS 
policy item for " + hdfsUser);
+                                               policyItem = 
createDefaultPolicyItem(createdService, vXUser, hdfsAccessTypeDefs);
+                                               policyItems.add(policyItem);
+                                       }
+                               }
+
+                               String hiveUser = 
PropertiesUtil.getProperty("ranger.kms.service.user.hive", "hive");
+                               if (hiveUser != null && !hiveUser.isEmpty()) {
+                                       XXUser xxUser = 
daoMgr.getXXUser().findByUserName(hiveUser);
+                                       if (xxUser != null) {
+                                               vXUser = 
xUserService.populateViewBean(xxUser);
+                                       } else {
+                                               vXUser = 
xUserMgr.createServiceConfigUser(hiveUser);
+                                       }
+                                       if (vXUser != null) {
+                                               LOG.info("Creating default KMS 
policy item for " + hiveUser);
+                                               policyItem = 
createDefaultPolicyItem(createdService, vXUser, hiveAccessTypeDefs);
+                                               policyItems.add(policyItem);
+                                       }
+                               }
                        }
+                       policy.setPolicyItems(policyItems);
                }
-               for (String policyUser : defaultPolicyUsers) {
-                       if (LOG.isDebugEnabled()) {
-                               LOG.debug("Checking policyUser:[" + policyUser 
+ "] for existence");
+       }
+
+       private RangerPolicyItem createDefaultPolicyItem(XXService 
createdService, VXUser vXUser, List<XXAccessTypeDef> accessTypeDefs) throws 
Exception {
+               String adminPrincipal = 
PropertiesUtil.getProperty(ADMIN_USER_PRINCIPAL);
+               String adminKeytab = 
PropertiesUtil.getProperty(ADMIN_USER_KEYTAB);
+               String authType = 
PropertiesUtil.getProperty(RANGER_AUTH_TYPE,"simple");
+               String lookupPrincipal = 
PropertiesUtil.getProperty(LOOKUP_PRINCIPAL);
+               String lookupKeytab = PropertiesUtil.getProperty(LOOKUP_KEYTAB);
+
+               RangerPolicyItem policyItem = new RangerPolicyItem();
+
+               List<String> users = new ArrayList<String>();
+               users.add(vXUser.getName());
+               VXUser vXLookupUser = getLookupUser(authType, lookupPrincipal, 
lookupKeytab);
+
+               XXService xService = 
daoMgr.getXXService().findByName(createdService.getName());
+               XXServiceDef xServiceDef = 
daoMgr.getXXServiceDef().getById(xService.getType());
+               if (StringUtils.equals(xServiceDef.getImplclassname(), 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME)){
+                       VXUser vXAdminUser = getLookupUser(authType, 
adminPrincipal, adminKeytab);
+                       if(vXAdminUser != null){
+                               users.add(vXAdminUser.getName());
+                       }       
+               }else if(vXLookupUser != null){
+                       users.add(vXLookupUser.getName());
+               }else{
+                       // do nothing
+               }
+
+               if (StringUtils.equals(xServiceDef.getImplclassname(), 
EmbeddedServiceDefsUtil.ATLAS_IMPL_CLASS_NAME)){
+                       VXUser vXUserAdmin = chkAdminUserExists("admin");
+                       if(vXUserAdmin != null){
+                               users.add(vXUserAdmin.getName());
                        }
-                       if (StringUtils.isNotBlank(policyUser) && 
!StringUtils.equals(policyUser, RangerPolicyEngine.USER_CURRENT)
-                                       && !StringUtils.equals(policyUser, 
RangerPolicyEngine.RESOURCE_OWNER)) {
-                               XXUser xxUser = 
daoMgr.getXXUser().findByUserName(policyUser);
-                               if (xxUser == null) {
-                                       UserSessionBase usb = 
ContextUtil.getCurrentUserSession();
-                                       if (usb != null && !usb.isKeyAdmin() && 
!usb.isUserAdmin() && !usb.isSpnegoEnabled()) {
-                                               throw 
restErrorUtil.createRESTException("User does not exist with given username: ["
-                                                               + policyUser + 
"] please use existing user", MessageEnums.OPER_NO_PERMISSION);
+               }
+
+               RangerService rangerService = 
getServiceByName(createdService.getName());
+               if (rangerService != null){
+                       Map<String, String> map = rangerService.getConfigs();
+                       if (map != null && 
map.containsKey(AMBARI_SERVICE_CHECK_USER)){
+                               String userNames = 
map.get(AMBARI_SERVICE_CHECK_USER);
+                               String[] userList = userNames.split(",");
+                               if(userList != null){
+                                       for (String userName : userList) {
+                                               
if(!StringUtils.isEmpty(userName)){
+                                                       XXUser xxUser = 
daoMgr.getXXUser().findByUserName(userName);
+                                                       if (xxUser != null) {
+                                                               vXUser = 
xUserService.populateViewBean(xxUser);
+                                                       } else {
+                                                               vXUser = 
xUserMgr.createServiceConfigUser(userName);
+                                                               
LOG.info("Creating Ambari Service Check User : "+vXUser.getName());
+                                                       }
+                                                       if(vXUser != null){
+                                                               
users.add(vXUser.getName());
+                                                       }
+                                               }
                                        }
-                                       
xUserMgr.createServiceConfigUser(policyUser);
                                }
                        }
                }
-               for (String policyGroup : defaultPolicyGroups) {
-                       if (LOG.isDebugEnabled()) {
-                               LOG.debug("Checking policyGroup:[" + 
policyGroup + "] for existence");
+               policyItem.setUsers(users);
+
+               List<RangerPolicyItemAccess> accesses = new 
ArrayList<RangerPolicyItemAccess>();
+               for(XXAccessTypeDef accessTypeDef : accessTypeDefs) {
+                       RangerPolicyItemAccess access = new 
RangerPolicyItemAccess();
+                       access.setType(accessTypeDef.getName());
+                       access.setIsAllowed(true);
+                       accesses.add(access);
+               }
+               policyItem.setAccesses(accesses);
+
+               policyItem.setDelegateAdmin(true);
+               return policyItem;
+       }
+
+       private VXUser chkAdminUserExists(String adminUser) {
+               VXUser vXUser = null;
+               if(!StringUtils.isEmpty(adminUser)){
+                       XXUser xxUser = 
daoMgr.getXXUser().findByUserName(adminUser);
+                       if (xxUser != null) {
+                               vXUser = xUserService.populateViewBean(xxUser);
                        }
-                       if (StringUtils.isNotBlank(policyGroup)) {
-                               XXGroup xxGroup = 
daoMgr.getXXGroup().findByGroupName(policyGroup);
-                               if (xxGroup == null) {
-                                       UserSessionBase usb = 
ContextUtil.getCurrentUserSession();
-                                       if (usb != null && !usb.isKeyAdmin() && 
!usb.isUserAdmin() && !usb.isSpnegoEnabled()) {
-                                               throw 
restErrorUtil.createRESTException("Group does not exist with given groupname: ["
-                                                               + policyGroup + 
"] please use existing group", MessageEnums.OPER_NO_PERMISSION);
+               }
+               return vXUser;
+       }
+
+       private VXUser getLookupUser(String authType, String lookupPrincipal, 
String lookupKeytab) {
+               VXUser vXUser = null;
+               if(!StringUtils.isEmpty(authType) && 
authType.equalsIgnoreCase(KERBEROS_TYPE)){
+                       
if(SecureClientLogin.isKerberosCredentialExists(lookupPrincipal, lookupKeytab)){
+                               KerberosName krbName = new 
KerberosName(lookupPrincipal);
+                               String lookupUser=null;
+                               try {
+                                       lookupUser = krbName.getShortName();
+                               } catch (IOException e) {
+                                       throw 
restErrorUtil.createRESTException("Please provide proper value of lookup user 
principal : "+ lookupPrincipal, MessageEnums.INVALID_INPUT_DATA);
+                               }
+                               
+                               if(LOG.isDebugEnabled()){
+                                       LOG.debug("Checking for Lookup User : 
"+lookupUser);
+                               }
+                               if(!StringUtils.isEmpty(lookupUser)){
+                                       XXUser xxUser = 
daoMgr.getXXUser().findByUserName(lookupUser);
+                                       if (xxUser != null) {
+                                               vXUser = 
xUserService.populateViewBean(xxUser);
+                                       } else {
+                                               vXUser = 
xUserMgr.createServiceConfigUser(lookupUser);
+                                               LOG.info("Creating Lookup User 
: "+vXUser.getName());
                                        }
-                                       VXGroup vXGroup = new VXGroup();
-                                       vXGroup.setName(policyGroup);
-                                       vXGroup.setDescription(policyGroup);
-                                       
vXGroup.setGroupSource(RangerCommonEnums.GROUP_INTERNAL);
-                                       
vXGroup.setIsVisible(RangerCommonEnums.IS_VISIBLE);
-                                       xGroupService.createResource(vXGroup);
                                }
                        }
                }
+               return vXUser;
        }
 
-       List<String> getServiceCheckUsers(RangerService createdService) {
-               List<String> ret = new ArrayList<String>();
 
-               Map<String, String> serviceConfig = createdService.getConfigs();
+       Map<String, RangerPolicyResource> 
createDefaultPolicyResource(List<RangerResourceDef> resourceHierarchy) throws 
Exception {
+               Map<String, RangerPolicyResource> resourceMap = new HashMap<>();
 
-               if (serviceConfig.containsKey(AMBARI_SERVICE_CHECK_USER)) {
-                       String userNames = 
serviceConfig.get(AMBARI_SERVICE_CHECK_USER);
-                       String[] userList = userNames.split(",");
-                       for (String userName : userList) {
-                               if (!StringUtils.isEmpty(userName)) {
-                                       ret.add(userName);
-                               }
+               for (RangerResourceDef resourceDef : resourceHierarchy) {
+                       RangerPolicyResource polRes = new 
RangerPolicyResource();
+                       polRes.setIsExcludes(false);
+                       polRes.setIsRecursive(false);
+
+                       String value = "*";
+                       if("path".equalsIgnoreCase(resourceDef.getName())) {
+                               value = "/*";
                        }
-               }
 
-               return ret;
+                       if(resourceDef.getRecursiveSupported()) {
+                               polRes.setIsRecursive(Boolean.TRUE);
+                       }
+
+                       polRes.setValue(value);
+                       resourceMap.put(resourceDef.getName(), polRes);
+               }
+               return resourceMap;
        }
 
        private Map<String, String> validateRequiredConfigParams(RangerService 
service, Map<String, String> configs) {
@@ -2732,381 +2944,77 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                updatePolicyVersion(service, isTagVersionUpdateNeeded);
        }
 
+       public enum VERSION_TYPE { POLICY_VERSION, TAG_VERSION, 
POLICY_AND_TAG_VERSION }
+
        private void updatePolicyVersion(RangerService service, boolean 
isTagVersionUpdateNeeded) throws Exception {
                if(service == null || service.getId() == null) {
                        return;
                }
 
-               boolean filterForServicePlugin = 
RangerConfiguration.getInstance().getBoolean(RangerTagDBRetriever.OPTION_RANGER_FILTER_TAGS_FOR_SERVICE_PLUGIN,
 false);
-
                XXServiceDao serviceDao = daoMgr.getXXService();
 
-               XXService serviceDbObj = serviceDao.getById(service.getId());
+               final XXService serviceDbObj = 
serviceDao.getById(service.getId());
                if(serviceDbObj == null) {
                        LOG.warn("updatePolicyVersion(serviceId=" + 
service.getId() + "): service not found");
 
                        return;
                }
 
-               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
-
-               XXServiceVersionInfo serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(service.getId());
+               final RangerDaoManager daoManager  = daoMgr;
+               final Long                         serviceId   = 
serviceDbObj.getId();
+               final VERSION_TYPE     versionType = 
VERSION_TYPE.POLICY_VERSION;
 
-               if(serviceVersionInfoDbObj != null) {
-                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
-                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-
-                       serviceVersionInfoDao.update(serviceVersionInfoDbObj);
-
-               } else {
-                       LOG.warn("updatePolicyVersion(service=" + 
serviceDbObj.getName() + "): serviceVersionInfo not found, creating it..");
-
-                       serviceVersionInfoDbObj = new XXServiceVersionInfo();
-                       
serviceVersionInfoDbObj.setServiceId(serviceDbObj.getId());
-                       
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceDbObj.getPolicyVersion()));
-                       serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-                       
serviceVersionInfoDbObj.setTagVersion(serviceDbObj.getTagVersion());
-                       
serviceVersionInfoDbObj.setTagUpdateTime(serviceDbObj.getTagUpdateTime());
-
-                       serviceVersionInfoDao.create(serviceVersionInfoDbObj);
-               }
+               Runnable serviceVersionUpdater = new 
ServiceVersionUpdater(daoManager, serviceId, versionType);
+               
transactionSynchronizationAdapter.executeOnTransactionCommit(serviceVersionUpdater);
 
                // if this is a tag service, update all services that refer to 
this tag service
                // so that next policy-download from plugins will get updated 
tag policies
                boolean isTagService = serviceDbObj.getType() == 
EmbeddedServiceDefsUtil.instance().getTagServiceDefId();
                if(isTagService) {
-                       List<XXService> referringServices = 
serviceDao.findByTagServiceId(serviceDbObj.getId());
+                       List<XXService> referringServices = 
serviceDao.findByTagServiceId(serviceId);
 
                        if(CollectionUtils.isNotEmpty(referringServices)) {
                                for(XXService referringService : 
referringServices) {
-                                       serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
-                                       if (serviceVersionInfoDbObj != null) {
-
-                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
-                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
+                                       final Long                  
referringServiceId    = referringService.getId();
+                                       final VERSION_TYPE  
tagServiceversionType = VERSION_TYPE.POLICY_VERSION;
 
-                                               if (filterForServicePlugin && 
isTagVersionUpdateNeeded) {
-                                                       
serviceVersionInfoDbObj.setTagVersion(getNextVersion(serviceVersionInfoDbObj.getTagVersion()));
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(new Date());
-                                               }
-                                               
serviceVersionInfoDao.update(serviceVersionInfoDbObj);
-                                       } else {
-                                               
LOG.warn("updatePolicyVersion(service=" + referringService.getName() + "): 
serviceVersionInfo not found, creating it..");
-                                               serviceVersionInfoDbObj = new 
XXServiceVersionInfo();
-                                               
serviceVersionInfoDbObj.setServiceId(referringService.getId());
-                                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                               
serviceVersionInfoDbObj.setPolicyUpdateTime(new Date());
-                                               if (filterForServicePlugin && 
isTagVersionUpdateNeeded) {
-                                                       
serviceVersionInfoDbObj.setTagVersion(getNextVersion(referringService.getTagVersion()));
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(new Date());
-                                               } else {
-                                                       
serviceVersionInfoDbObj.setTagVersion(referringService.getTagVersion());
-                                                       
serviceVersionInfoDbObj.setTagUpdateTime(referringService.getTagUpdateTime());
-                                               }
-                                               
serviceVersionInfoDao.create(serviceVersionInfoDbObj);
-                                       }
+                                       Runnable tagServiceVersionUpdater = new 
ServiceVersionUpdater(daoManager, referringServiceId, tagServiceversionType);
+                                       
transactionSynchronizationAdapter.executeOnTransactionCommit(tagServiceVersionUpdater);
                                }
                        }
                }
        }
 
-       private XXPolicyItem createNewPolicyItemForPolicy(RangerPolicy policy, 
XXPolicy xPolicy, RangerPolicyItem policyItem, XXServiceDef xServiceDef, int 
itemOrder, int policyItemType) throws Exception {
-               XXPolicyItem xPolicyItem = new XXPolicyItem();
-
-               xPolicyItem = (XXPolicyItem) 
rangerAuditFields.populateAuditFields(xPolicyItem, xPolicy);
-
-               xPolicyItem.setDelegateAdmin(policyItem.getDelegateAdmin());
-               xPolicyItem.setItemType(policyItemType);
-               xPolicyItem.setIsEnabled(Boolean.TRUE);
-               xPolicyItem.setComments(null);
-               xPolicyItem.setPolicyId(policy.getId());
-               xPolicyItem.setOrder(itemOrder);
-               xPolicyItem = daoMgr.getXXPolicyItem().create(xPolicyItem);
-
-               List<RangerPolicyItemAccess> accesses = 
policyItem.getAccesses();
-               for (int i = 0; i < accesses.size(); i++) {
-                       RangerPolicyItemAccess access = accesses.get(i);
-
-                       XXAccessTypeDef xAccTypeDef = 
daoMgr.getXXAccessTypeDef()
-                                       
.findByNameAndServiceId(access.getType(),
-                                                       xPolicy.getService());
-                       if (xAccTypeDef == null) {
-                               throw new Exception(access.getType() + ": is 
not a valid access-type. policy='" + policy.getName() + "' service='" + 
policy.getService() + "'");
-                       }
-
-                       XXPolicyItemAccess xPolItemAcc = new 
XXPolicyItemAccess();
-
-                       xPolItemAcc = (XXPolicyItemAccess) 
rangerAuditFields.populateAuditFields(xPolItemAcc, xPolicyItem);
-                       xPolItemAcc.setIsAllowed(access.getIsAllowed());
-                       xPolItemAcc.setType(xAccTypeDef.getId());
-                       xPolItemAcc.setPolicyitemid(xPolicyItem.getId());
-                       xPolItemAcc.setOrder(i);
-
-                       daoMgr.getXXPolicyItemAccess().create(xPolItemAcc);
-               }
-
-               List<String> users = policyItem.getUsers();
-               for(int i = 0; i < users.size(); i++) {
-                       String user = users.get(i);
-                       if (StringUtils.isBlank(user)) {
-                               continue;
-                       }
-                       XXUser xUser = daoMgr.getXXUser().findByUserName(user);
-                       if(xUser == null) {
-                               throw new Exception(user + ": user does not 
exist. policy='"+  policy.getName() + "' service='"+ policy.getService() + "' 
user='" + user +"'");
-                       }
-                       XXPolicyItemUserPerm xUserPerm = new 
XXPolicyItemUserPerm();
-                       xUserPerm = (XXPolicyItemUserPerm) 
rangerAuditFields.populateAuditFields(xUserPerm, xPolicyItem);
-                       xUserPerm.setUserId(xUser.getId());
-                       xUserPerm.setPolicyItemId(xPolicyItem.getId());
-                       xUserPerm.setOrder(i);
-                       xUserPerm = 
daoMgr.getXXPolicyItemUserPerm().create(xUserPerm);
-               }
-
-               List<String> groups = policyItem.getGroups();
-               for(int i = 0; i < groups.size(); i++) {
-                       String group = groups.get(i);
-                       if (StringUtils.isBlank(group)) {
-                               continue;
-                       }
-                       XXGroup xGrp = 
daoMgr.getXXGroup().findByGroupName(group);
-                       if(xGrp == null) {
-                               throw new Exception(group + ": group does not 
exist. policy='"+  policy.getName() + "' service='"+ policy.getService() + "' 
group='" + group + "'");
-                       }
-                       XXPolicyItemGroupPerm xGrpPerm = new 
XXPolicyItemGroupPerm();
-                       xGrpPerm = (XXPolicyItemGroupPerm) 
rangerAuditFields.populateAuditFields(xGrpPerm, xPolicyItem);
-                       xGrpPerm.setGroupId(xGrp.getId());
-                       xGrpPerm.setPolicyItemId(xPolicyItem.getId());
-                       xGrpPerm.setOrder(i);
-                       xGrpPerm = 
daoMgr.getXXPolicyItemGroupPerm().create(xGrpPerm);
-               }
-
-               List<RangerPolicyItemCondition> conditions = 
policyItem.getConditions();
-               for(RangerPolicyItemCondition condition : conditions) {
-                       XXPolicyConditionDef xPolCond = daoMgr
-                                       
.getXXPolicyConditionDef().findByServiceDefIdAndName(
-                                                       xServiceDef.getId(), 
condition.getType());
-
-                       if(xPolCond == null) {
-                               throw new Exception(condition.getType() + ": is 
not a valid condition-type. policy='"+  xPolicy.getName() + "' service='"+ 
xPolicy.getService() + "'");
-                       }
-
-                       for(int i = 0; i < condition.getValues().size(); i++) {
-                               String value = condition.getValues().get(i);
-                               XXPolicyItemCondition xPolItemCond = new 
XXPolicyItemCondition();
-                               xPolItemCond = (XXPolicyItemCondition) 
rangerAuditFields.populateAuditFields(xPolItemCond, xPolicyItem);
-                               
xPolItemCond.setPolicyItemId(xPolicyItem.getId());
-                               xPolItemCond.setType(xPolCond.getId());
-                               xPolItemCond.setValue(value);
-                               xPolItemCond.setOrder(i);
-
-                               
daoMgr.getXXPolicyItemCondition().create(xPolItemCond);
-                       }
-               }
-
-               return xPolicyItem;
-       }
-
-       private void createNewPolicyItemsForPolicy(RangerPolicy policy, 
XXPolicy xPolicy, List<RangerPolicyItem> policyItems, XXServiceDef xServiceDef, 
int policyItemType) throws Exception {
-               if(CollectionUtils.isNotEmpty(policyItems)) {
-                       for (int itemOrder = 0; itemOrder < policyItems.size(); 
itemOrder++) {
-                               RangerPolicyItem policyItem = 
policyItems.get(itemOrder);
-                               createNewPolicyItemForPolicy(policy, xPolicy, 
policyItem, xServiceDef, itemOrder, policyItemType);
-                       }
-               }
-       }
-
-       private void createNewDataMaskPolicyItemsForPolicy(RangerPolicy policy, 
XXPolicy xPolicy, List<RangerDataMaskPolicyItem> policyItems, XXServiceDef 
xServiceDef, int policyItemType) throws Exception {
-               if(CollectionUtils.isNotEmpty(policyItems)) {
-                       for (int itemOrder = 0; itemOrder < policyItems.size(); 
itemOrder++) {
-                               RangerDataMaskPolicyItem policyItem = 
policyItems.get(itemOrder);
-
-                               XXPolicyItem xPolicyItem = 
createNewPolicyItemForPolicy(policy, xPolicy, policyItem, xServiceDef, 
itemOrder, policyItemType);
-
-                               RangerPolicyItemDataMaskInfo dataMaskInfo = 
policyItem.getDataMaskInfo();
-
-                               if(dataMaskInfo != null) {
-                                       XXDataMaskTypeDef dataMaskDef = 
daoMgr.getXXDataMaskTypeDef().findByNameAndServiceId(dataMaskInfo.getDataMaskType(),
 xPolicy.getService());
-
-                                       if(dataMaskDef == null) {
-                                               throw new 
Exception(dataMaskInfo.getDataMaskType() + ": is not a valid datamask-type. 
policy='" + policy.getName() + "' service='" + policy.getService() + "'");
-                                       }
-
-                                       XXPolicyItemDataMaskInfo xxDataMaskInfo 
= new XXPolicyItemDataMaskInfo();
-
-                                       
xxDataMaskInfo.setPolicyItemId(xPolicyItem.getId());
-                                       
xxDataMaskInfo.setType(dataMaskDef.getId());
-                                       
xxDataMaskInfo.setConditionExpr(dataMaskInfo.getConditionExpr());
-                                       
xxDataMaskInfo.setValueExpr(dataMaskInfo.getValueExpr());
-
-                                       
daoMgr.getXXPolicyItemDataMaskInfo().create(xxDataMaskInfo);
-                               }
-                       }
-               }
-       }
-
-       private void createNewRowFilterPolicyItemsForPolicy(RangerPolicy 
policy, XXPolicy xPolicy, List<RangerRowFilterPolicyItem> policyItems, 
XXServiceDef xServiceDef, int policyItemType) throws Exception {
-               if(CollectionUtils.isNotEmpty(policyItems)) {
-                       for (int itemOrder = 0; itemOrder < policyItems.size(); 
itemOrder++) {
-                               RangerRowFilterPolicyItem policyItem = 
policyItems.get(itemOrder);
-
-                               XXPolicyItem xPolicyItem = 
createNewPolicyItemForPolicy(policy, xPolicy, policyItem, xServiceDef, 
itemOrder, policyItemType);
-
-                               RangerPolicyItemRowFilterInfo dataMaskInfo = 
policyItem.getRowFilterInfo();
-
-                               if(dataMaskInfo != null) {
-                                       XXPolicyItemRowFilterInfo 
xxRowFilterInfo = new XXPolicyItemRowFilterInfo();
-
-                                       
xxRowFilterInfo.setPolicyItemId(xPolicyItem.getId());
-                                       
xxRowFilterInfo.setFilterExpr(dataMaskInfo.getFilterExpr());
-
-                                       xxRowFilterInfo = 
daoMgr.getXXPolicyItemRowFilterInfo().create(xxRowFilterInfo);
-                               }
-                       }
-               }
-       }
+       public static void persistVersionChange(RangerDaoManager daoMgr, Long 
id, VERSION_TYPE versionType) {
+               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
 
-       private void createNewResourcesForPolicy(RangerPolicy policy, XXPolicy 
xPolicy, Map<String, RangerPolicyResource> resources) throws Exception {
-               
-               for (Entry<String, RangerPolicyResource> resource : 
resources.entrySet()) {
-                       RangerPolicyResource policyRes = resource.getValue();
-
-                       XXResourceDef xResDef = daoMgr.getXXResourceDef()
-                                       
.findByNameAndPolicyId(resource.getKey(), policy.getId());
-                       if (xResDef == null) {
-                               throw new Exception(resource.getKey() + ": is 
not a valid resource-type. policy='"+  policy.getName() + "' service='"+ 
policy.getService() + "'");
-                       }
-
-                       XXPolicyResource xPolRes = new XXPolicyResource();
-                       xPolRes = (XXPolicyResource) 
rangerAuditFields.populateAuditFields(xPolRes, xPolicy);
-
-                       xPolRes.setIsExcludes(policyRes.getIsExcludes());
-                       xPolRes.setIsRecursive(policyRes.getIsRecursive());
-                       xPolRes.setPolicyId(policy.getId());
-                       xPolRes.setResDefId(xResDef.getId());
-                       xPolRes = daoMgr.getXXPolicyResource().create(xPolRes);
-
-                       List<String> values = policyRes.getValues();
-                       if (CollectionUtils.isNotEmpty(values)) {
-                               Set<String> uniqueValues = new 
LinkedHashSet<String>(values);
-                               int i = 0;
-                               if (CollectionUtils.isNotEmpty(uniqueValues)) {
-                                       for (String uniqValue : uniqueValues) {
-                                               if 
(!StringUtils.isEmpty(uniqValue)) {
-                                                       XXPolicyResourceMap 
xPolResMap = new XXPolicyResourceMap();
-                                                       xPolResMap = 
(XXPolicyResourceMap) rangerAuditFields.populateAuditFields(xPolResMap,xPolRes);
-                                                       
xPolResMap.setResourceId(xPolRes.getId());
-                                                       
xPolResMap.setValue(uniqValue);
-                                                       xPolResMap.setOrder(i);
-                                                       xPolResMap = 
daoMgr.getXXPolicyResourceMap().create(xPolResMap);
-                                                       i++;
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
+               XXServiceVersionInfo serviceVersionInfoDbObj = 
serviceVersionInfoDao.findByServiceId(id);
 
-       private Boolean deleteExistingPolicyItems(RangerPolicy policy) {
-               if(policy == null) {
-                       return false;
-               }
-               
-               XXPolicyItemDao policyItemDao = daoMgr.getXXPolicyItem();
-               List<XXPolicyItem> policyItems = 
policyItemDao.findByPolicyId(policy.getId());
-               for(XXPolicyItem policyItem : policyItems) {
-                       Long polItemId = policyItem.getId();
-                       
-                       XXPolicyItemConditionDao polCondDao = 
daoMgr.getXXPolicyItemCondition();
-                       List<XXPolicyItemCondition> conditions = 
polCondDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemCondition condition : conditions) {
-                               polCondDao.remove(condition);
-                       }
-                       
-                       XXPolicyItemGroupPermDao grpPermDao = 
daoMgr.getXXPolicyItemGroupPerm();
-                       List<XXPolicyItemGroupPerm> groups = 
grpPermDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemGroupPerm group : groups) {
-                               grpPermDao.remove(group);
-                       }
-                       
-                       XXPolicyItemUserPermDao userPermDao = 
daoMgr.getXXPolicyItemUserPerm();
-                       List<XXPolicyItemUserPerm> users = 
userPermDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemUserPerm user : users) {
-                               userPermDao.remove(user);
+               if(serviceVersionInfoDbObj != null) {
+                       if (versionType == VERSION_TYPE.POLICY_VERSION || 
versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) {
+                               
serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion()));
+                               serviceVersionInfoDbObj.setPolicyUpdateTime(new 
Date());
                        }
-                       
-                       XXPolicyItemAccessDao polItemAccDao = 
daoMgr.getXXPolicyItemAccess();
-                       List<XXPolicyItemAccess> accesses = 
polItemAccDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemAccess access : accesses) {
-                               polItemAccDao.remove(access);
+                       if (versionType == VERSION_TYPE.TAG_VERSION || 
versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) {
+                               
serviceVersionInfoDbObj.setTagVersion(getNextVersion(serviceVersionInfoDbObj.getTagVersion()));
+                               serviceVersionInfoDbObj.setTagUpdateTime(new 
Date());
                        }
 
-                       XXPolicyItemDataMaskInfoDao polItemDataMaskInfoDao = 
daoMgr.getXXPolicyItemDataMaskInfo();
-                       List<XXPolicyItemDataMaskInfo> dataMaskInfos = 
polItemDataMaskInfoDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemDataMaskInfo dataMaskInfo : 
dataMaskInfos) {
-                               polItemDataMaskInfoDao.remove(dataMaskInfo);
-                       }
-
-                       XXPolicyItemRowFilterInfoDao polItemRowFilterInfoDao = 
daoMgr.getXXPolicyItemRowFilterInfo();
-                       List<XXPolicyItemRowFilterInfo> rowFilterInfos = 
polItemRowFilterInfoDao.findByPolicyItemId(polItemId);
-                       for(XXPolicyItemRowFilterInfo rowFilterInfo : 
rowFilterInfos) {
-                               polItemRowFilterInfoDao.remove(rowFilterInfo);
-                       }
+                       serviceVersionInfoDao.update(serviceVersionInfoDbObj);
 
-                       policyItemDao.remove(policyItem);
-               }
-               return true;
-       }
+               } else {
+                       XXService service = daoMgr.getXXService().getById(id);
+                       if (service != null) {
+                               serviceVersionInfoDbObj = new 
XXServiceVersionInfo();
+                               
serviceVersionInfoDbObj.setServiceId(service.getId());
+                               serviceVersionInfoDbObj.setPolicyVersion(1L);
+                               serviceVersionInfoDbObj.setPolicyUpdateTime(new 
Date());
+                               serviceVersionInfoDbObj.setTagVersion(1L);
+                               serviceVersionInfoDbObj.setTagUpdateTime(new 
Date());
 
-       private Boolean deleteExistingPolicyResources(RangerPolicy policy) {
-               if(policy == null) {
-                       return false;
-               }
-               
-               List<XXPolicyResource> resources = 
daoMgr.getXXPolicyResource().findByPolicyId(policy.getId());
-               
-               XXPolicyResourceDao resDao = daoMgr.getXXPolicyResource();
-               for(XXPolicyResource resource : resources) {
-                       List<XXPolicyResourceMap> resMapList = 
daoMgr.getXXPolicyResourceMap().findByPolicyResId(resource.getId());
-                       
-                       XXPolicyResourceMapDao resMapDao = 
daoMgr.getXXPolicyResourceMap();
-                       for(XXPolicyResourceMap resMap : resMapList) {
-                               resMapDao.remove(resMap);
+                               
serviceVersionInfoDao.create(serviceVersionInfoDbObj);
                        }
-                       resDao.remove(resource);
                }
-               return true;
-       }
-
-       private Boolean deleteExistingPolicyItemsNative(RangerPolicy policy) {
-               if(policy == null) {
-                       return false;
-               }
-               XXPolicyItemDao policyItemDao = daoMgr.getXXPolicyItem();
-               List<XXPolicyItem> policyItems = 
policyItemDao.findByPolicyId(policy.getId());
-               for(XXPolicyItem policyItem : policyItems) {
-                       Long polItemId = policyItem.getId();
-                       
daoMgr.getXXPolicyItemRowFilterInfo().deletePolicyIDReference("policy_item_id", 
polItemId);
-                       
daoMgr.getXXPolicyItemDataMaskInfo().deletePolicyIDReference("policy_item_id", 
polItemId);
-                       
daoMgr.getXXPolicyItemGroupPerm().deletePolicyIDReference("policy_item_id", 
polItemId);
-                       
daoMgr.getXXPolicyItemUserPerm().deletePolicyIDReference("policy_item_id", 
polItemId);
-                       
daoMgr.getXXPolicyItemCondition().deletePolicyIDReference("policy_item_id", 
polItemId);
-                       
daoMgr.getXXPolicyItemAccess().deletePolicyIDReference("policy_item_id", 
polItemId);
-               }
-               daoMgr.getXXPolicyItem().deletePolicyIDReference("policy_id", 
policy.getId());
-               return true;
-       }
-
-       private Boolean deleteExistingPolicyResourcesNative(RangerPolicy 
policy) {
-               if(policy == null) {
-                       return false;
-               }
-               List<XXPolicyResource> resources = 
daoMgr.getXXPolicyResource().findByPolicyId(policy.getId());
-               for(XXPolicyResource resource : resources) {
-                       
daoMgr.getXXPolicyResourceMap().deletePolicyIDReference("resource_id", 
resource.getId());
-                       
daoMgr.getXXPolicyResource().deletePolicyIDReference("id", resource.getId());
-               }
-               return true;
        }
 
        @Override
@@ -3177,55 +3085,34 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                        return;
                }
 
+               final RangerDaoManager daoManager = daoMgr;
+
                boolean isTagServiceDef = 
StringUtils.equals(serviceDef.getName(), 
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME);
 
                XXServiceDao serviceDao = daoMgr.getXXService();
-               XXServiceVersionInfoDao serviceVersionInfoDao = 
daoMgr.getXXServiceVersionInfo();
 
                List<XXService> services = 
serviceDao.findByServiceDefId(serviceDef.getId());
 
                if(CollectionUtils.isNotEmpty(services)) {
                        for(XXService service : services) {
-                               XXServiceVersionInfo serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(service.getId());
-                               if (serviceVersionInfo != null) {
-                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
-                                       
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
 
-                                       
serviceVersionInfoDao.update(serviceVersionInfo);
-                               } else {
-                                       
LOG.warn("updateServicesForServiceDefUpdate(service=" + service.getName() + "): 
serviceVersionInfo not found, creating it..");
-                                       serviceVersionInfo = new 
XXServiceVersionInfo();
-                                       
serviceVersionInfo.setServiceId(service.getId());
-                                       
serviceVersionInfo.setPolicyVersion(getNextVersion(service.getPolicyVersion()));
-                                       
serviceVersionInfo.setTagVersion(service.getTagVersion());
-                                       
serviceVersionInfo.setPolicyUpdateTime(new Date());
-                                       
serviceVersionInfo.setTagUpdateTime(service.getTagUpdateTime());
+                               final Long                  serviceId   = 
service.getId();
+                               final VERSION_TYPE  versionType = 
VERSION_TYPE.POLICY_VERSION;
 
-                                       
serviceVersionInfoDao.create(serviceVersionInfo);
-                               }
+                               Runnable serviceVersionUpdater = new 
ServiceVersionUpdater(daoManager, serviceId, versionType);
+                               
transactionSynchronizationAdapter.executeOnTransactionCommit(serviceVersionUpdater);
 
                                if(isTagServiceDef) {
-                                       List<XXService> referrringServices = 
serviceDao.findByTagServiceId(service.getId());
+                                       List<XXService> referringServices = 
serviceDao.findByTagServiceId(service.getId());
 
-                                       
if(CollectionUtils.isNotEmpty(referrringServices)) {
-                                               for(XXService referringService 
: referrringServices) {
-                                                       serviceVersionInfo = 
serviceVersionInfoDao.findByServiceId(referringService.getId());
-                                                       if (serviceVersionInfo 
!= null) {
-                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(serviceVersionInfo.getPolicyVersion()));
-                                                               
serviceVersionInfo.setPolicyUpdateTime(serviceDef.getUpdateTime());
+                                       
if(CollectionUtils.isNotEmpty(referringServices)) {
+                                               for(XXService referringService 
: referringServices) {
 
-                                                               
serviceVersionInfoDao.update(serviceVersionInfo);
-                                                       } else {
-                                                               
LOG.warn("updateServicesForServiceDefUpdate(service=" + 
referringService.getName() + "): serviceVersionInfo not found, creating it..");
-                                                               
serviceVersionInfo = new XXServiceVersionInfo();
-                                                               
serviceVersionInfo.setServiceId(referringService.getId());
-                                                               
serviceVersionInfo.setPolicyVersion(getNextVersion(referringService.getPolicyVersion()));
-                                                               
serviceVersionInfo.setTagVersion(referringService.getTagVersion());
-                                                               
serviceVersionInfo.setPolicyUpdateTime(new Date());
-                                                               
serviceVersionInfo.setTagUpdateTime(referringService.getTagUpdateTime());
-
-                                                               
serviceVersionInfoDao.create(serviceVersionInfo);
-                                                       }
+                                                       final Long              
    referringServiceId    = referringService.getId();
+                                                       final VERSION_TYPE  
tagServiceVersionType = VERSION_TYPE.POLICY_VERSION;
+
+                                                       Runnable 
tagServiceVersionUpdater = new ServiceVersionUpdater(daoManager, 
referringServiceId, tagServiceVersionType);
+                                                       
transactionSynchronizationAdapter.executeOnTransactionCommit(tagServiceVersionUpdater);
                                                }
                                        }
                                }
@@ -3711,10 +3598,6 @@ public class ServiceDBStore extends AbstractServiceStore 
{
 
        private void writeBookForPolicyItems(RangerPolicy policy, 
RangerPolicyItem policyItem,
                        RangerDataMaskPolicyItem dataMaskPolicyItem, 
RangerRowFilterPolicyItem rowFilterPolicyItem, Row row, String 
policyConditonType) {
-               if (LOG.isDebugEnabled()) {
-                       // To avoid PMD violation
-                       LOG.debug("policyConditonType:[" + policyConditonType + 
"]");
-               }
                List<String> groups = new ArrayList<String>();
                List<String> users = new ArrayList<String>();
                String groupNames = "";
@@ -3995,18 +3878,34 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                xUserService.createXUserWithOutLogin(genericUser);
        }
 
-    public boolean isServiceAdminUser(String serviceName, String userName) {
-        boolean ret=false;
-        XXServiceConfigMap cfgSvcAdminUsers = 
daoMgr.getXXServiceConfigMap().findByServiceNameAndConfigKey(serviceName, 
SERVICE_ADMIN_USERS);
-        String svcAdminUsers = cfgSvcAdminUsers != null ? 
cfgSvcAdminUsers.getConfigvalue() : null;
-        if (svcAdminUsers != null) {
-            for (String svcAdminUser : svcAdminUsers.split(",")) {
-                if (userName.equals(svcAdminUser)) {
-                    ret=true;
-                    break;
-                }
-            }
-        }
-        return ret;
-    }
+       public boolean isServiceAdminUser(String serviceName, String userName) {
+               boolean ret=false;
+               XXServiceConfigMap cfgSvcAdminUsers = 
daoMgr.getXXServiceConfigMap().findByServiceNameAndConfigKey(serviceName, 
SERVICE_ADMIN_USERS);
+               String svcAdminUsers = cfgSvcAdminUsers != null ? 
cfgSvcAdminUsers.getConfigvalue() : null;
+               if (svcAdminUsers != null) {
+                       for (String svcAdminUser : svcAdminUsers.split(",")) {
+                               if (userName.equals(svcAdminUser)) {
+                                       ret=true;
+                                       break;
+                               }
+                       }
+               }
+               return ret;
+       }
+
+       public static class ServiceVersionUpdater implements Runnable {
+               final Long                         serviceId;
+               final RangerDaoManager daoManager;
+               final VERSION_TYPE     versionType;
+
+               public ServiceVersionUpdater(RangerDaoManager daoManager, Long 
serviceId, VERSION_TYPE versionType ) {
+                       this.serviceId   = serviceId;
+                       this.daoManager  = daoManager;
+                       this.versionType = versionType;
+               }
+               @Override
+               public void run() {
+                       ServiceDBStore.persistVersionChange(this.daoManager, 
this.serviceId, this.versionType);
+               }
+       }
 }

Reply via email to