Repository: incubator-ranger
Updated Branches:
  refs/heads/master e474d3ed0 -> 38b79e725


RANGER-903 Optimize updates to tag objects

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


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

Branch: refs/heads/master
Commit: 38b79e7253a6ad8dd5a38f4775ec1ac5b70b05b1
Parents: e474d3e
Author: Abhay Kulkarni <[email protected]>
Authored: Wed Mar 30 15:04:50 2016 -0700
Committer: Madhan Neethiraj <[email protected]>
Committed: Mon Apr 4 23:59:34 2016 -0700

----------------------------------------------------------------------
 .../apache/ranger/plugin/model/RangerTag.java   |  10 +-
 .../ranger/plugin/store/AbstractTagStore.java   |  19 +-
 .../apache/ranger/plugin/store/TagStore.java    |   4 +-
 .../ranger/plugin/store/file/TagFileStore.java  |  15 +-
 .../apache/ranger/plugin/util/ServiceTags.java  |  25 +-
 .../ranger/plugin/store/TestTagStore.java       |   5 +-
 .../patches/021-update-tag-for-owner.sql        |   1 +
 .../apache/ranger/biz/RangerTagDBRetriever.java |   1 +
 .../java/org/apache/ranger/biz/TagDBStore.java  |  50 +++-
 .../ranger/common/RangerServiceTagsCache.java   |   1 -
 .../apache/ranger/db/XXServiceResourceDao.java  |   7 +-
 .../org/apache/ranger/db/XXTagAttributeDao.java |  13 +
 .../java/org/apache/ranger/db/XXTagDao.java     |  15 +
 .../java/org/apache/ranger/entity/XXTag.java    |   2 +-
 .../org/apache/ranger/rest/ServiceREST.java     |   2 +-
 .../ranger/rest/ServiceTagsProcessor.java       | 295 ++++++++++++-------
 .../java/org/apache/ranger/rest/TagREST.java    |  13 +-
 .../service/RangerServiceResourceService.java   |   4 +-
 .../resources/META-INF/jpa_named_queries.xml    |  20 +-
 tagsync/samples/tags.json                       |  17 +-
 .../source/atlas/AtlasNotificationMapper.java   |   3 +-
 .../main/resources/etc/ranger/data/tags.json    |   4 +-
 22 files changed, 341 insertions(+), 185 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTag.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTag.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTag.java
index 78040ba..f19cc60 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTag.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTag.java
@@ -41,24 +41,26 @@ public class RangerTag extends RangerBaseModelObject {
        public static final short OWNER_GLOBAL          = 1;
 
        private String              type;
-       private Short               owner = OWNER_SERVICERESOURCE;
+    private Short               owner = OWNER_SERVICERESOURCE;
+
        private Map<String, String> attributes;
 
-       public RangerTag(String guid, String type, Short owner, Map<String, 
String> attributes) {
+       public RangerTag(String guid, String type, Map<String, String> 
attributes, Short owner) {
                super();
 
                setGuid(guid);
                setType(type);
                setOwner(owner);
                setAttributes(attributes);
+               setOwner(owner);
        }
 
        public RangerTag(String type, Map<String, String> attributes) {
-               this(null, type, OWNER_SERVICERESOURCE, attributes);
+               this(null, type, attributes, OWNER_SERVICERESOURCE);
        }
 
        public RangerTag() {
-               this(null, null, OWNER_SERVICERESOURCE, null);
+               this(null, null, null, OWNER_SERVICERESOURCE);
        }
 
        public String getType() {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java
index 7d2e130..ebf7d6e 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractTagStore.java
@@ -104,31 +104,21 @@ public abstract class AbstractTagStore implements 
TagStore {
        }
 
        @Override
-       public void deleteAllTagObjectsForService(String serviceName, boolean 
isResourePrivateTag) throws Exception {
+       public void deleteAllTagObjectsForService(String serviceName) throws 
Exception {
 
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("==> 
AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + ", 
isResourcePrivateTag=" + isResourePrivateTag + ")");
+                       LOG.debug("==> 
AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + 
")");
                }
 
                List<RangerServiceResource> serviceResources = 
getServiceResourcesByService(serviceName);
 
                if (serviceResources != null) {
 
-                       Set<Long> tagsToDelete = new HashSet<Long>();
-
-
                        for (RangerServiceResource serviceResource : 
serviceResources) {
                                Long resourceId = serviceResource.getId();
 
                                List<RangerTagResourceMap> 
tagResourceMapsForService = getTagResourceMapsForResourceId(resourceId);
 
-                               if (isResourePrivateTag) {
-                                       for (RangerTagResourceMap 
tagResourceMap : tagResourceMapsForService) {
-                                               Long tagId = 
tagResourceMap.getTagId();
-                                               RangerTag tag = getTag(tagId);
-                                               tagsToDelete.add(tag.getId());
-                                       }
-                               }
                                for (RangerTagResourceMap tagResourceMap : 
tagResourceMapsForService) {
                                        
deleteTagResourceMap(tagResourceMap.getId());
                                }
@@ -138,13 +128,10 @@ public abstract class AbstractTagStore implements 
TagStore {
                                deleteServiceResource(serviceResource.getId());
                        }
 
-                       for (Long tagId : tagsToDelete) {
-                               deleteTag(tagId);
-                       }
                }
 
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("<== 
AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + ", 
isResourcePrivateTag=" + isResourePrivateTag + ")");
+                       LOG.debug("<== 
AbstractTagStore.deleteAllTagObjectsForService(serviceName=" + serviceName + 
")");
                }
 
        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java
index 69bd628..b135423 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagStore.java
@@ -91,7 +91,7 @@ public interface TagStore {
 
     List<RangerServiceResource> getServiceResourcesByService(String 
serviceName) throws Exception;
 
-    RangerServiceResource getServiceResourceByResourceSignature(String 
resourceSignature) throws Exception;
+    RangerServiceResource 
getServiceResourceByServiceAndResourceSignature(String serviceName, String 
resourceSignature) throws Exception;
 
     List<RangerServiceResource> getServiceResources(SearchFilter filter) 
throws Exception;
 
@@ -128,5 +128,5 @@ public interface TagStore {
 
     Long getTagVersion(String serviceName);
 
-    void deleteAllTagObjectsForService(String serviceName, boolean 
isResourePrivateTag) throws Exception;
+    void deleteAllTagObjectsForService(String serviceName) throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java
index 58052cf..5f22f0d 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/file/TagFileStore.java
@@ -732,15 +732,17 @@ public class TagFileStore extends AbstractTagStore {
        }
 
        @Override
-       public RangerServiceResource 
getServiceResourceByResourceSignature(String resourceSignature) throws 
Exception {
+       public RangerServiceResource 
getServiceResourceByServiceAndResourceSignature(String serviceName, String 
resourceSignature) throws Exception {
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("==> 
TagFileStore.getServiceResourceByResourceSignature(" + resourceSignature + ")");
+                       LOG.debug("==> 
TagFileStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + 
", " + resourceSignature + ")");
                }
 
                RangerServiceResource ret = null;
 
                if (StringUtils.isNotBlank(resourceSignature)) {
-                       SearchFilter filter = new 
SearchFilter(SearchFilter.TAG_RESOURCE_SIGNATURE, resourceSignature);
+                       SearchFilter filter = new SearchFilter();
+                       filter.setParam(SearchFilter.TAG_RESOURCE_SERVICE_NAME, 
serviceName);
+                       filter.setParam(SearchFilter.TAG_RESOURCE_SIGNATURE, 
resourceSignature);
 
                        List<RangerServiceResource> resources = 
getServiceResources(filter);
 
@@ -748,7 +750,7 @@ public class TagFileStore extends AbstractTagStore {
                }
 
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("<== 
TagFileStore.getServiceResourceByResourceSignature(" + resourceSignature + "): 
" + ret);
+                       LOG.debug("<== 
TagFileStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + 
", " + resourceSignature + "): " + ret);
                }
 
                return ret;
@@ -824,8 +826,13 @@ public class TagFileStore extends AbstractTagStore {
 
                try {
                        RangerTagResourceMap tagResourceMap = 
getTagResourceMap(id);
+                       Long tagId = tagResourceMap.getTagId();
+                       RangerTag tag = getTag(tagId);
 
                        deleteTagResourceMap(tagResourceMap);
+                       if (tag.getOwner() == RangerTag.OWNER_SERVICERESOURCE) {
+                               deleteTag(tagId);
+                       }
                } catch (Exception excp) {
                        throw new Exception("failed to delete tagResourceMap 
with ID=" + id, excp);
                }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceTags.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceTags.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceTags.java
index 738a947..3c685e9 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceTags.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceTags.java
@@ -50,11 +50,7 @@ public class ServiceTags implements java.io.Serializable {
        public static final String OP_DELETE        = "delete";
        public static final String OP_REPLACE       = "replace";
 
-       public static final String TAGMODEL_SHARED        = "shared";
-       public static final String TAGMODEL_RESOURCE_PRIVATE        = 
"resource_private";
-
        private String                      op = OP_ADD_OR_UPDATE;
-       private String                      tagModel = TAGMODEL_SHARED;
        private String                      serviceName;
        private Long                        tagVersion;
        private Date                        tagUpdateTime;
@@ -64,13 +60,12 @@ public class ServiceTags implements java.io.Serializable {
        private Map<Long, List<Long>>       resourceToTagIds;
 
        public ServiceTags() {
-               this(OP_ADD_OR_UPDATE, TAGMODEL_SHARED, null, 0L, null, null, 
null, null, null);
+               this(OP_ADD_OR_UPDATE, null, 0L, null, null, null, null, null);
        }
 
-       public ServiceTags(String op, String tagModel, String serviceName, Long 
tagVersion, Date tagUpdateTime, Map<Long, RangerTagDef> tagDefinitions,
+       public ServiceTags(String op, String serviceName, Long tagVersion, Date 
tagUpdateTime, Map<Long, RangerTagDef> tagDefinitions,
                                           Map<Long, RangerTag> tags, 
List<RangerServiceResource> serviceResources, Map<Long, List<Long>> 
resourceToTagIds) {
                setOp(op);
-               setTagModel(tagModel);
                setServiceName(serviceName);
                setTagVersion(tagVersion);
                setTagUpdateTime(tagUpdateTime);
@@ -87,13 +82,6 @@ public class ServiceTags implements java.io.Serializable {
        }
 
        /**
-        * @return the tagModel
-        */
-       public String getTagModel() {
-               return tagModel;
-       }
-
-       /**
         * @return the serviceName
         */
        public String getServiceName() {
@@ -107,14 +95,6 @@ public class ServiceTags implements java.io.Serializable {
                this.op = op;
        }
 
-
-       /**
-        * @param tagModel the tagModel to set
-        */
-       public void setTagModel(String tagModel) {
-               this.tagModel = tagModel;
-       }
-
        /**
         * @param serviceName the serviceName to set
         */
@@ -194,7 +174,6 @@ public class ServiceTags implements java.io.Serializable {
        public StringBuilder toString(StringBuilder sb) {
                sb.append("ServiceTags={")
                                .append("op=").append(op).append(", ")
-                               .append("tagModel=").append(tagModel).append(", 
")
                                
.append("serviceName=").append(serviceName).append(", ")
                                
.append("tagVersion=").append(tagVersion).append(", ")
                                
.append("tagUpdateTime={").append(tagUpdateTime).append("}")

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java 
b/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java
index aaace89..eb2f17e 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/store/TestTagStore.java
@@ -309,8 +309,9 @@ public class TestTagStore {
                
validator.preDeleteServiceResource(createdServiceResource.getId());
                tagStore.deleteServiceResource(createdServiceResource.getId());
 
-               validator.preDeleteTag(createdTag.getId());
-               tagStore.deleteTag(createdTag.getId());
+               // private tags are deleted when TagResourceMap is deleted.. No 
need for deleting it here
+               //validator.preDeleteTag(createdTag.getId());
+               //tagStore.deleteTag(createdTag.getId());
 
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/db/sqlserver/patches/021-update-tag-for-owner.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/sqlserver/patches/021-update-tag-for-owner.sql 
b/security-admin/db/sqlserver/patches/021-update-tag-for-owner.sql
index dabe841..d07babc 100644
--- a/security-admin/db/sqlserver/patches/021-update-tag-for-owner.sql
+++ b/security-admin/db/sqlserver/patches/021-update-tag-for-owner.sql
@@ -19,4 +19,5 @@ BEGIN
        ALTER TABLE [dbo].[x_tag] ADD [owned_by] [smallint] DEFAULT 0 NOT NULL;
 END
 GO
+
 exit

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
index 3b7555e..256db42 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
@@ -525,6 +525,7 @@ public class RangerTagDBRetriever {
 
                                        ret.setId(xTag.getId());
                                        ret.setGuid(xTag.getGuid());
+                                       ret.setOwner(xTag.getOwner());
                                        
ret.setCreatedBy(lookupCache.getUserScreenName(xTag.getAddedByUserId()));
                                        
ret.setUpdatedBy(lookupCache.getUserScreenName(xTag.getUpdatedByUserId()));
                                        ret.setCreateTime(xTag.getCreateTime());

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
index cc2386e..28d7bf6 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/TagDBStore.java
@@ -39,6 +39,7 @@ import org.apache.ranger.entity.XXResourceDef;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.entity.XXServiceResource;
+import org.apache.ranger.entity.XXTag;
 import org.apache.ranger.entity.XXTagAttribute;
 import org.apache.ranger.entity.XXTagAttributeDef;
 import org.apache.ranger.entity.XXServiceResourceElement;
@@ -581,15 +582,21 @@ public class TagDBStore extends AbstractTagStore {
        }
 
        @Override
-       public RangerServiceResource 
getServiceResourceByResourceSignature(String resourceSignature) throws 
Exception {
+       public RangerServiceResource 
getServiceResourceByServiceAndResourceSignature(String serviceName, String 
resourceSignature) throws Exception {
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("==> 
TagDBStore.getServiceResourceByResourceSignature(" + resourceSignature + ")");
+                       LOG.debug("==> 
TagDBStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", 
" + resourceSignature + ")");
                }
 
-               RangerServiceResource ret = 
rangerServiceResourceService.getByResourceSignature(resourceSignature);
+               RangerServiceResource ret = null;
+
+               XXService service = 
daoManager.getXXService().findByName(serviceName);
+
+               if (service != null) {
+                       ret = 
rangerServiceResourceService.getByServiceAndResourceSignature(service.getId(), 
resourceSignature);
+               }
 
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("<== 
TagDBStore.getServiceResourceByResourceSignature(" + resourceSignature + "): " 
+ ret);
+                       LOG.debug("<== 
TagDBStore.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", 
" + resourceSignature + "): " + ret);
                }
 
                return ret;
@@ -648,9 +655,15 @@ public class TagDBStore extends AbstractTagStore {
                }
 
                RangerTagResourceMap tagResourceMap = 
rangerTagResourceMapService.read(id);
+               Long tagId = tagResourceMap.getTagId();
+               RangerTag tag = getTag(tagId);
 
                rangerTagResourceMapService.delete(tagResourceMap);
 
+               if (tag.getOwner() == RangerTag.OWNER_SERVICERESOURCE) {
+                       deleteTag(tagId);
+               }
+
                if (LOG.isDebugEnabled()) {
                        LOG.debug("<== TagDBStore.deleteTagResourceMap(" + id + 
")");
                }
@@ -1088,7 +1101,7 @@ public class TagDBStore extends AbstractTagStore {
        }
 
        @Override
-       public void deleteAllTagObjectsForService(String serviceName, boolean 
isResourcePrivateFlag) throws Exception {
+       public void deleteAllTagObjectsForService(String serviceName) throws 
Exception {
 
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> 
TagDBStore.deleteAllTagObjectsForService(" + serviceName + ")");
@@ -1099,6 +1112,10 @@ public class TagDBStore extends AbstractTagStore {
                if (service != null) {
                        Long serviceId = service.getId();
 
+                       List<XXTagAttribute> xxTagAttributes = 
daoManager.getXXTagAttribute().findByServiceIdAndOwner(serviceId, 
RangerTag.OWNER_SERVICERESOURCE);
+
+                       List<XXTag> xxTags = 
daoManager.getXXTag().findByServiceIdAndOwner(serviceId, 
RangerTag.OWNER_SERVICERESOURCE);
+
                        List<XXTagResourceMap> xxTagResourceMaps = 
daoManager.getXXTagResourceMap().findByServiceId(serviceId);
 
                        if (CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
@@ -1112,6 +1129,28 @@ public class TagDBStore extends AbstractTagStore {
                                }
                        }
 
+                       if (CollectionUtils.isNotEmpty(xxTagAttributes)) {
+                               for (XXTagAttribute xxTagAttribute : 
xxTagAttributes) {
+                                       try {
+                                               
daoManager.getXXTagAttribute().remove(xxTagAttribute);
+                                       } catch (Exception e) {
+                                               LOG.error("Error deleting 
RangerTagAttribute with id=" + xxTagAttribute.getId(), e);
+                                               throw e;
+                                       }
+                               }
+                       }
+
+                       if (CollectionUtils.isNotEmpty(xxTags)) {
+                               for (XXTag xxTag : xxTags) {
+                                       try {
+                                               
daoManager.getXXTag().remove(xxTag);
+                                       } catch (Exception e) {
+                                               LOG.error("Error deleting 
RangerTag with id=" + xxTag.getId(), e);
+                                               throw e;
+                                       }
+                               }
+                       }
+
                        List<XXServiceResourceElementValue> 
xxServiceResourceElementValues = 
daoManager.getXXServiceResourceElementValue().findByServiceId(serviceId);
 
                        if 
(CollectionUtils.isNotEmpty(xxServiceResourceElementValues)) {
@@ -1150,6 +1189,7 @@ public class TagDBStore extends AbstractTagStore {
                                        }
                                }
                        }
+
                }
 
                if (LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/common/RangerServiceTagsCache.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/RangerServiceTagsCache.java
 
b/security-admin/src/main/java/org/apache/ranger/common/RangerServiceTagsCache.java
index cdc44e0..15af0f0 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/common/RangerServiceTagsCache.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/common/RangerServiceTagsCache.java
@@ -252,7 +252,6 @@ public class RangerServiceTagsCache {
                private void pruneUnusedAttributes() {
                        if (serviceTags != null) {
                                serviceTags.setOp(null);
-                               serviceTags.setTagModel(null);
                                serviceTags.setTagUpdateTime(null);
 
                                serviceTags.setTagDefinitions(null);

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java
index c990ae7..9257aaa 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java
@@ -59,13 +59,14 @@ public class XXServiceResourceDao extends 
BaseDao<XXServiceResource> {
                }
        }
 
-       public XXServiceResource findByResourceSignature(String 
resourceSignature) {
+       public XXServiceResource findByServiceAndResourceSignature(Long 
serviceId, String resourceSignature) {
                if (StringUtils.isBlank(resourceSignature)) {
                        return null;
                }
                try {
-                       return 
getEntityManager().createNamedQuery("XXServiceResource.findByResourceSignature",
 tClass)
-                                       .setParameter("resourceSignature", 
resourceSignature).getSingleResult();
+                       return 
getEntityManager().createNamedQuery("XXServiceResource.findByServiceAndResourceSignature",
 tClass)
+                                       .setParameter("serviceId", 
serviceId).setParameter("resourceSignature", resourceSignature)
+                                       .getSingleResult();
                } catch (NoResultException e) {
                        return null;
                }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java
index c993477..a30e543 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagAttributeDao.java
@@ -57,6 +57,19 @@ public class XXTagAttributeDao extends 
BaseDao<XXTagAttribute> {
                }
        }
 
+       public List<XXTagAttribute> findByServiceIdAndOwner(Long serviceId, 
Short owner) {
+               if (serviceId == null) {
+                       return new ArrayList<XXTagAttribute>();
+               }
+               try {
+                       return 
getEntityManager().createNamedQuery("XXTagAttribute.findByServiceIdAndOwner", 
tClass)
+                                       .setParameter("serviceId", serviceId)
+                                       .setParameter("owner", owner)
+                                       .getResultList();
+               } catch (NoResultException e) {
+                       return new ArrayList<XXTagAttribute>();
+               }
+       }
        public List<XXTagAttribute> findByResourceId(Long resourceId) {
                if (resourceId == null) {
                        return new ArrayList<XXTagAttribute>();

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/db/XXTagDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXTagDao.java
index 3c9370b..a3fde2c 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTagDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagDao.java
@@ -123,4 +123,19 @@ public class XXTagDao extends BaseDao<XXTag> {
                        return new ArrayList<XXTag>();
                }
        }
+
+       public List<XXTag> findByServiceIdAndOwner(Long serviceId, Short owner) 
{
+               if (serviceId == null) {
+                       return new ArrayList<XXTag>();
+               }
+
+               try {
+                       return 
getEntityManager().createNamedQuery("XXTag.findByServiceIdAndOwner", tClass)
+                                       .setParameter("serviceId", serviceId)
+                                       .setParameter("owner", owner)
+                                       .getResultList();
+               } catch (NoResultException e) {
+                       return new ArrayList<XXTag>();
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/entity/XXTag.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTag.java 
b/security-admin/src/main/java/org/apache/ranger/entity/XXTag.java
index 526557e..2ed6f73 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTag.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXTag.java
@@ -200,7 +200,7 @@ public class XXTag extends XXDBBase implements Serializable 
{
                sb.append("id={").append(id).append("} ");
                sb.append("guid={").append(guid).append("} ");
                sb.append("type={").append(type).append("} ");
-               sb.append("owner={").append(owner).append("} ");
+               sb.append("owned_by={").append(owner).append("} ");
                sb.append(" }");
 
                return sb;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 0dbd042..8f01bfc 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -539,7 +539,7 @@ public class ServiceREST {
                        XXServiceDef xxServiceDef = 
daoManager.getXXServiceDef().getById(service.getType());
                        bizUtil.hasKMSPermissions("Service", 
xxServiceDef.getImplclassname());
 
-                       
tagStore.deleteAllTagObjectsForService(service.getName(), false);
+                       
tagStore.deleteAllTagObjectsForService(service.getName());
 
                        svcStore.deleteService(id);
                } catch(WebApplicationException excp) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/rest/ServiceTagsProcessor.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceTagsProcessor.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceTagsProcessor.java
index ebe71eb..7e6900e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceTagsProcessor.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceTagsProcessor.java
@@ -32,6 +32,7 @@ import 
org.apache.ranger.plugin.store.RangerServiceResourceSignature;
 import org.apache.ranger.plugin.store.TagStore;
 import org.apache.ranger.plugin.util.ServiceTags;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -53,7 +54,6 @@ public class ServiceTagsProcessor {
                if (tagStore != null && serviceTags != null) {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("serviceTags: op=" + 
serviceTags.getOp());
-                               LOG.debug("serviceTags: tagModel=" + 
serviceTags.getTagModel());
                        }
                        String op = serviceTags.getOp();
 
@@ -88,11 +88,8 @@ public class ServiceTagsProcessor {
                }
 
                Map<Long, RangerTagDef>          tagDefsInStore   = new 
HashMap<Long, RangerTagDef>();
-               Map<Long, RangerTag>             tagsInStore      = new 
HashMap<Long, RangerTag>();
                Map<Long, RangerServiceResource> resourcesInStore = new 
HashMap<Long, RangerServiceResource>();
 
-               boolean createOrUpdate = true;
-
                if (MapUtils.isNotEmpty(serviceTags.getTagDefinitions())) {
                        RangerTagDef tagDef = null;
 
@@ -102,14 +99,12 @@ public class ServiceTagsProcessor {
 
                                        RangerTagDef existing = null;
 
-                                       if(createOrUpdate) {
-                                               
if(StringUtils.isNotEmpty(tagDef.getGuid())) {
-                                                       existing = 
tagStore.getTagDefByGuid(tagDef.getGuid());
-                                               }
+                                       
if(StringUtils.isNotEmpty(tagDef.getGuid())) {
+                                               existing = 
tagStore.getTagDefByGuid(tagDef.getGuid());
+                                       }
 
-                                               if(existing == null && 
StringUtils.isNotEmpty(tagDef.getName())) {
-                                                       existing = 
tagStore.getTagDefByName(tagDef.getName());
-                                               }
+                                       if(existing == null && 
StringUtils.isNotEmpty(tagDef.getName())) {
+                                               existing = 
tagStore.getTagDefByName(tagDef.getName());
                                        }
 
                                        RangerTagDef tagDefInStore = null;
@@ -123,9 +118,7 @@ public class ServiceTagsProcessor {
                                                tagDefInStore = existing;
                                        }
 
-                                       if(tagDefsInStore != null) {
-                                               
tagDefsInStore.put(entry.getKey(), tagDefInStore);
-                                       }
+                                       tagDefsInStore.put(entry.getKey(), 
tagDefInStore);
                                }
                        } catch (Exception exception) {
                                LOG.error("createTagDef failed, tagDef=" + 
tagDef, exception);
@@ -133,42 +126,6 @@ public class ServiceTagsProcessor {
                        }
                }
 
-               if (MapUtils.isNotEmpty(serviceTags.getTags())) {
-                       RangerTag tag = null;
-
-                       try {
-                               for (Map.Entry<Long, RangerTag> entry : 
serviceTags.getTags().entrySet()) {
-                                       tag = entry.getValue();
-
-                                       RangerTag existing = null;
-
-                                       if(createOrUpdate) {
-                                               
if(StringUtils.isNotEmpty(tag.getGuid())) {
-                                                       existing = 
tagStore.getTagByGuid(tag.getGuid());
-                                               }
-                                       }
-
-                                       RangerTag tagInStore = null;
-
-                                       if(existing == null) {
-                                               tagInStore = 
tagStore.createTag(tag);
-                                       } else {
-                                               tag.setId(existing.getId());
-                                               tag.setGuid(existing.getGuid());
-
-                                               tagInStore = 
tagStore.updateTag(tag);
-                                       }
-
-                                       if(tagsInStore != null) {
-                                               tagsInStore.put(entry.getKey(), 
tagInStore);
-                                       }
-                               }
-                       } catch (Exception exception) {
-                               LOG.error("createTag failed, tag=" + tag, 
exception);
-                               throw exception;
-                       }
-               }
-
                List<RangerServiceResource> resources = 
serviceTags.getServiceResources();
                if (CollectionUtils.isNotEmpty(resources)) {
                        RangerServiceResource resource = null;
@@ -181,24 +138,22 @@ public class ServiceTagsProcessor {
                                        String                resourceSignature 
= null;
                                        Long                  resourceId        
= resource.getId();
 
-                                       if(createOrUpdate) {
-                                               
if(StringUtils.isNotEmpty(resource.getGuid())) {
-                                                       existing = 
tagStore.getServiceResourceByGuid(resource.getGuid());
-                                               }
+                                       
if(StringUtils.isNotEmpty(resource.getGuid())) {
+                                               existing = 
tagStore.getServiceResourceByGuid(resource.getGuid());
+                                       }
 
-                                               if(existing == null) {
-                                                       
if(MapUtils.isNotEmpty(resource.getResourceElements())) {
-                                                               
RangerServiceResourceSignature serializer = new 
RangerServiceResourceSignature(resource);
+                                       if(existing == null) {
+                                               
if(MapUtils.isNotEmpty(resource.getResourceElements())) {
+                                                       
RangerServiceResourceSignature serializer = new 
RangerServiceResourceSignature(resource);
 
-                                                               
resourceSignature = serializer.getSignature();
+                                                       resourceSignature = 
serializer.getSignature();
 
-                                                               existing = 
tagStore.getServiceResourceByResourceSignature(resourceSignature);
-                                                       }
+                                                       existing = 
tagStore.getServiceResourceByServiceAndResourceSignature(resource.getServiceName(),
 resourceSignature);
                                                }
+                                       }
 
-                                               if(existing != null) {
-                                                       resourceSignature = 
existing.getResourceSignature();
-                                               }
+                                       if(existing != null) {
+                                               resourceSignature = 
existing.getResourceSignature();
                                        }
 
                                        
if(StringUtils.isEmpty(resourceSignature)) {
@@ -243,70 +198,141 @@ public class ServiceTagsProcessor {
                                }
 
                                // Get all tags associated with this resourceId
-                               List<Long> tagsToDelete = null;
+                               List<RangerTag> associatedTags = null;
+
                                try {
-                                       tagsToDelete = 
tagStore.getTagIdsForResourceId(resourceInStore.getId());
+                                       associatedTags = 
tagStore.getTagsForResourceId(resourceInStore.getId());
                                } catch (Exception exception) {
                                        LOG.error("RangerTags cannot be 
retrieved for resource with guid=" + resourceInStore.getGuid());
                                        throw exception;
                                }
 
+                               List<RangerTag> tagsToRetain = new 
ArrayList<RangerTag>();
+
                                List<Long> tagIds = entry.getValue();
                                try {
                                        for (Long tagId : tagIds) {
-                                               RangerTag tagInStore = 
tagsInStore.get(tagId);
+                                               RangerTag incomingTag = 
MapUtils.isNotEmpty(serviceTags.getTags()) ? serviceTags.getTags().get(tagId) : 
null;
 
-                                               if (tagInStore == null) {
+                                               if (incomingTag == null) {
                                                        LOG.error("Tag (id=" + 
tagId + ") not found. Skipping addition of this tag for resource (id=" + 
resourceId + ")");
                                                        continue;
                                                }
 
-                                               RangerTagResourceMap existing = 
null;
-
-                                               if(createOrUpdate) {
-                                                       existing = 
tagStore.getTagResourceMapForTagAndResourceId(tagInStore.getId(), 
resourceInStore.getId());
-                                               }
+                                               RangerTag matchingTag = 
findMatchingTag(incomingTag, associatedTags);
+                                               if (matchingTag == null) {
+                                                       if 
(LOG.isDebugEnabled()) {
+                                                               LOG.debug("Did 
not find matching tag for tagId=" + tagId);
+                                                       }
+                                                       // create new tag from 
incoming tag and associate it with service-resource
+                                                       RangerTag newTag = 
tagStore.createTag(incomingTag);
 
-                                               if(existing == null) {
                                                        RangerTagResourceMap 
tagResourceMap = new RangerTagResourceMap();
 
-                                                       
tagResourceMap.setTagId(tagInStore.getId());
+                                                       
tagResourceMap.setTagId(newTag.getId());
                                                        
tagResourceMap.setResourceId(resourceInStore.getId());
 
                                                        tagResourceMap = 
tagStore.createTagResourceMap(tagResourceMap);
+
+                                                       
associatedTags.add(newTag);
+                                                       
tagsToRetain.add(newTag);
+
+                                                       continue;
+
+                                               }
+
+                                               if (LOG.isDebugEnabled()) {
+                                                       LOG.debug("Found 
matching tag for tagId=" + tagId + ", matchingTag=" + matchingTag);
                                                }
 
-                                               if(tagsToDelete != null) {
-                                                       
tagsToDelete.remove((Long)tagInStore.getId());
+                                               if 
(isResourcePrivateTag(incomingTag)) {
+                                                       if 
(!isResourcePrivateTag(matchingTag)) {
+                                                               // create new 
tag from incoming tag and associate it with service-resource
+                                                               RangerTag 
newTag = tagStore.createTag(incomingTag);
+
+                                                               
RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
+
+                                                               
tagResourceMap.setTagId(newTag.getId());
+                                                               
tagResourceMap.setResourceId(resourceInStore.getId());
+
+                                                               tagResourceMap 
= tagStore.createTagResourceMap(tagResourceMap);
+
+                                                               
associatedTags.add(newTag);
+                                                               
tagsToRetain.add(newTag);
+
+                                                       } else {
+                                                               // Keep this 
tag, but update it with attribute-values from incoming tag
+                                                               
tagsToRetain.add(matchingTag);
+
+                                                               if 
(StringUtils.equals(incomingTag.getGuid(), matchingTag.getGuid())) {
+                                                                       // 
matching tag was found because of Guid match
+                                                                       if 
(LOG.isDebugEnabled()) {
+                                                                               
LOG.debug("Updating existing private tag with id=" + matchingTag.getId());
+                                                                       }
+                                                                       // 
update private tag with new values
+                                                                       
incomingTag.setId(matchingTag.getId());
+                                                                       
tagStore.updateTag(incomingTag);
+                                                               }
+                                                       }
+                                               } else { // shared model
+                                                       if 
(isResourcePrivateTag(matchingTag)) {
+                                                               // create new 
tag from incoming tag and associate it with service-resource
+                                                               RangerTag 
newTag = tagStore.createTag(incomingTag);
+
+                                                               
RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
+
+                                                               
tagResourceMap.setTagId(newTag.getId());
+                                                               
tagResourceMap.setResourceId(resourceInStore.getId());
+
+                                                               tagResourceMap 
= tagStore.createTagResourceMap(tagResourceMap);
+
+                                                               
associatedTags.add(newTag);
+                                                               
tagsToRetain.add(newTag);
+
+                                                       } else {
+                                                               // Keep this 
tag, but update it with attribute-values from incoming tag
+                                                               
tagsToRetain.add(matchingTag);
+
+                                                               // Update 
shared tag with new values
+                                                               
incomingTag.setId(matchingTag.getId());
+                                                               
tagStore.updateTag(incomingTag);
+
+                                                               // associate 
with service-resource if not already associated
+                                                               if 
(findTagInList(matchingTag, associatedTags) == null) {
+                                                                       
RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
+
+                                                                       
tagResourceMap.setTagId(matchingTag.getId());
+                                                                       
tagResourceMap.setResourceId(resourceInStore.getId());
+
+                                                                       
tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
+                                                               }
+
+                                                       }
                                                }
+
                                        }
                                } catch (Exception exception) {
                                        LOG.error("createRangerTagResourceMap 
failed", exception);
                                        throw exception;
                                }
 
-                               if (CollectionUtils.isNotEmpty(tagsToDelete)) {
+                               if (CollectionUtils.isNotEmpty(associatedTags)) 
{
                                        Long tagId = null;
 
                                        try {
-                                               for(int i = 0; i < 
tagsToDelete.size(); i++) {
-                                                       tagId = 
tagsToDelete.get(i);
+                                               for (RangerTag associatedTag : 
associatedTags) {
+                                                       if 
(findTagInList(associatedTag, tagsToRetain) == null) {
 
-                                                       RangerTagResourceMap 
tagResourceMap = tagStore.getTagResourceMapForTagAndResourceId(tagId, 
resourceInStore.getId());
+                                                               tagId = 
associatedTag.getId();
 
-                                                       if(tagResourceMap != 
null) {
-                                                               
tagStore.deleteTagResourceMap(tagResourceMap.getId());
-                                                       }
+                                                               
RangerTagResourceMap tagResourceMap = 
tagStore.getTagResourceMapForTagAndResourceId(tagId, resourceInStore.getId());
 
-                                                       if 
(LOG.isDebugEnabled()) {
-                                                               
LOG.debug("Deleted tagResourceMap(tagId=" + tagId + ", resourceId=" + 
resourceInStore.getId());
-                                                       }
-
-                                                       if 
(StringUtils.equals(serviceTags.getTagModel(), 
ServiceTags.TAGMODEL_RESOURCE_PRIVATE)) {
-                                                               
tagStore.deleteTag(tagId);
+                                                               if 
(tagResourceMap != null) {
+                                                                       
tagStore.deleteTagResourceMap(tagResourceMap.getId());
+                                                               }
 
                                                                if 
(LOG.isDebugEnabled()) {
-                                                                       
LOG.debug("Deleted tag(tagId=" + tagId + ") as tagModel=" + 
ServiceTags.TAGMODEL_RESOURCE_PRIVATE);
+                                                                       
LOG.debug("Deleted tagResourceMap(tagId=" + tagId + ", resourceId=" + 
resourceInStore.getId());
                                                                }
                                                        }
                                                }
@@ -323,6 +349,84 @@ public class ServiceTagsProcessor {
                }
        }
 
+       private RangerTag findTagInList(RangerTag object, List<RangerTag> list) 
{
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> ServiceTagsProcessor.findTagInList(): 
object=" + (object == null ? null : object.getId()));
+               }
+               RangerTag ret = null;
+               if (object != null) {
+                       for (RangerTag tag : list) {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("==> 
ServiceTagsProcessor.findTagInList(): tag=" + tag.getId());
+                               }
+                               if (tag.getId().equals(object.getId())) {
+                                       ret = tag;
+                                       if (LOG.isDebugEnabled()) {
+                                               LOG.debug("==> 
ServiceTagsProcessor.findTagInList(): found tag=" + tag.getId());
+                                       }
+                                       break;
+                               }
+                       }
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== ServiceTagsProcessor.findTagInList(): 
ret=" + (ret == null ? null : ret.getId()));
+               }
+               return ret;
+       }
+       private boolean isResourcePrivateTag(RangerTag tag) {
+               return tag.getOwner() == RangerTag.OWNER_SERVICERESOURCE;
+       }
+
+       private RangerTag findMatchingTag(RangerTag incomingTag, 
List<RangerTag> existingTags) throws Exception {
+
+               RangerTag ret = null;
+
+               if(StringUtils.isNotEmpty(incomingTag.getGuid())) {
+                       ret = tagStore.getTagByGuid(incomingTag.getGuid());
+               }
+
+               if (ret == null) {
+
+                       if (isResourcePrivateTag(incomingTag)) {
+
+                               for (RangerTag existingTag : existingTags) {
+
+                                       if 
(StringUtils.equals(incomingTag.getType(), existingTag.getType())) {
+
+                                               // Check attribute values
+                                               Map<String, String> 
incomingTagAttributes = incomingTag.getAttributes();
+                                               Map<String, String> 
existingTagAttributes = existingTag.getAttributes();
+
+                                               if 
(CollectionUtils.isEqualCollection(incomingTagAttributes.keySet(), 
existingTagAttributes.keySet())) {
+
+                                                       boolean matched = true;
+
+                                                       for (Map.Entry<String, 
String> entry : incomingTagAttributes.entrySet()) {
+
+                                                               String key = 
entry.getKey();
+                                                               String value = 
entry.getValue();
+
+                                                               if 
(!StringUtils.equals(value, existingTagAttributes.get(key))) {
+                                                                       matched 
= false;
+                                                                       break;
+                                                               }
+
+                                                       }
+                                                       if (matched) {
+                                                               ret = 
existingTag;
+                                                               break;
+                                                       }
+                                               }
+
+                                       }
+                               }
+                       }
+
+               }
+
+               return ret;
+       }
+
        private void delete(ServiceTags serviceTags) throws Exception {
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> ServiceTagsProcessor.delete()");
@@ -332,7 +436,6 @@ public class ServiceTagsProcessor {
 
                List<RangerServiceResource> serviceResources = 
serviceTags.getServiceResources();
                if (CollectionUtils.isNotEmpty(serviceResources)) {
-                       boolean isResourePrivateTag = 
StringUtils.equals(serviceTags.getTagModel(), 
ServiceTags.TAGMODEL_RESOURCE_PRIVATE) ? true : false;
 
                        for (RangerServiceResource serviceResource : 
serviceResources) {
                                try {
@@ -344,13 +447,7 @@ public class ServiceTagsProcessor {
 
                                                if 
(CollectionUtils.isNotEmpty(tagResourceMaps)) {
                                                        for 
(RangerTagResourceMap tagResourceMap : tagResourceMaps) {
-                                                               long tagId = 
tagResourceMap.getTagId();
-
                                                                
tagStore.deleteTagResourceMap(tagResourceMap.getId());
-
-                                                               
if(isResourePrivateTag) {
-                                                                       
tagStore.deleteTag(tagId);
-                                                               }
                                                        }
                                                }
 
@@ -408,9 +505,7 @@ public class ServiceTagsProcessor {
                        LOG.debug("==> ServiceTagsProcessor.replace()");
                }
 
-               boolean isResourePrivateTag = 
StringUtils.equals(serviceTags.getTagModel(), 
ServiceTags.TAGMODEL_RESOURCE_PRIVATE) ? true : false;
-
-               
tagStore.deleteAllTagObjectsForService(serviceTags.getServiceName(), 
isResourePrivateTag);
+               
tagStore.deleteAllTagObjectsForService(serviceTags.getServiceName());
 
                addOrUpdate(serviceTags);
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java
index 378ff0b..c69ceed 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/TagREST.java
@@ -778,26 +778,27 @@ public class TagREST {
     }
 
     @GET
-    @Path(TagRESTConstants.RESOURCE_RESOURCE + "signature/{resourceSignature}")
+    @Path(TagRESTConstants.RESOURCE_RESOURCE + 
"service/{serviceName}/signature/{resourceSignature}")
     @Produces({ "application/json", "application/xml" })
     @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-    public RangerServiceResource 
getServiceResourceByResourceSignature(@PathParam("resourceSignature") String 
resourceSignature) {
+    public RangerServiceResource 
getServiceResourceByServiceAndResourceSignature(@PathParam("serviceName") 
String serviceName,
+                                                                       
@PathParam("resourceSignature") String resourceSignature) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.getServiceResourceByResourceSignature(" + 
resourceSignature + ")");
+            LOG.debug("==> 
TagREST.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", " 
+ resourceSignature + ")");
         }
 
         RangerServiceResource ret = null;
 
         try {
-            ret = 
tagStore.getServiceResourceByResourceSignature(resourceSignature);
+            ret = 
tagStore.getServiceResourceByServiceAndResourceSignature(serviceName, 
resourceSignature);
         } catch(Exception excp) {
-            LOG.error("getServiceResourceByResourceSignature(" + 
resourceSignature + ") failed", excp);
+            LOG.error("getServiceResourceByServiceAndResourceSignature(" + 
serviceName + ", " + resourceSignature + ") failed", excp);
 
             throw 
restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, 
excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.getServiceResourceByResourceSignature(" + 
resourceSignature + "): " + ret);
+            LOG.debug("<== 
TagREST.getServiceResourceByServiceAndResourceSignature(" + serviceName + ", " 
+ resourceSignature + "): " + ret);
         }
 
         return ret;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
index 5cf26c9..abaeac8 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
@@ -91,10 +91,10 @@ public class RangerServiceResourceService extends 
RangerServiceResourceServiceBa
                return ret;
        }
 
-       public RangerServiceResource getByResourceSignature(String 
resourceSignature) {
+       public RangerServiceResource getByServiceAndResourceSignature(Long 
serviceId, String resourceSignature) {
                RangerServiceResource ret = null;
 
-               XXServiceResource xxServiceResource = 
daoMgr.getXXServiceResource().findByResourceSignature(resourceSignature);
+               XXServiceResource xxServiceResource = 
daoMgr.getXXServiceResource().findByServiceAndResourceSignature(serviceId, 
resourceSignature);
                
                if(xxServiceResource != null) {
                        ret = populateViewBean(xxServiceResource);

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
----------------------------------------------------------------------
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 2bb66ca..739b5ca 100644
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -891,6 +891,13 @@
                </query>
        </named-query>
 
+       <named-query name="XXTag.findByServiceIdAndOwner">
+               <query>select obj from XXTag obj where obj.owner = :owner and 
obj.id in
+                       (select tagRes.tagId from XXTagResourceMap tagRes, 
XXServiceResource resource where tagRes.resourceId = resource.id and 
resource.serviceId = :serviceId)
+                       order by obj.id
+               </query>
+       </named-query>
+
        <named-query name="XXTagAttribute.findByTagId">
                <query>select obj from XXTagAttribute obj where obj.tagId = 
:tagId</query>
        </named-query>
@@ -902,6 +909,15 @@
                </query>
        </named-query>
 
+       <named-query name="XXTagAttribute.findByServiceIdAndOwner">
+               <query>select obj from XXTagAttribute obj where obj.tagId in
+                       (select tag.id from XXTag tag where tag.owner = :owner 
and tag.id in
+                               (select tagRes.tagId from XXTagResourceMap 
tagRes, XXServiceResource resource where tagRes.resourceId = resource.id and 
resource.serviceId = :serviceId)
+                       )
+                       order by obj.tagId
+               </query>
+       </named-query>
+
        <named-query name="XXTagAttribute.findByResourceId">
                <query>select obj from XXTagAttribute obj where obj.tagId in
                        (select tagRes.tagId from XXTagResourceMap tagRes where 
tagRes.resourceId = :resourceId)
@@ -926,8 +942,8 @@
                </query>
        </named-query>
 
-       <named-query name="XXServiceResource.findByResourceSignature">
-               <query>select obj from XXServiceResource obj where 
obj.resourceSignature = :resourceSignature</query>
+       <named-query name="XXServiceResource.findByServiceAndResourceSignature">
+               <query>select obj from XXServiceResource obj where 
obj.serviceId = :serviceId and obj.resourceSignature = 
:resourceSignature</query>
        </named-query>
 
        <!-- End <== JPA Queries for Tag Based Policies  -->

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/tagsync/samples/tags.json
----------------------------------------------------------------------
diff --git a/tagsync/samples/tags.json b/tagsync/samples/tags.json
index 3028f9d..fe57135 100644
--- a/tagsync/samples/tags.json
+++ b/tagsync/samples/tags.json
@@ -1,20 +1,19 @@
 {
   "op": "add_or_update",
-  "tagModel": "resource_private",
   "serviceName": "cl1_hive",
   "tagVersion": 1,
   "tagUpdateTime": "20150924-22:26:33.000-+0000",
   "tagDefinitions": {
-     "1":{"id":1, "guid":"tagdef-1", "name":"PII",        "attributeDefs":[]},
-     "2":{"id":2, "guid":"tagdef-2", "name":"EXPIRES_ON", 
"attributeDefs":[{"name":"expiry_date", "type":"date"}]},
-     "3":{"id":3, "guid":"tagdef-3", "name":"FINANCE",    "attributeDefs":[]},
-     "4":{"id":4, "guid":"tagdef-4", "name":"AUDIT",      "attributeDefs":[]}
+     "1":{"id":1, "guid":"tagdef-1", "name":"PII",        "attributeDefs":[], 
"owner":0},
+     "2":{"id":2, "guid":"tagdef-2", "name":"EXPIRES_ON", 
"attributeDefs":[{"name":"expiry_date", "type":"date"}], "owner":0},
+     "3":{"id":3, "guid":"tagdef-3", "name":"FINANCE",    "attributeDefs":[], 
"owner":0},
+     "4":{"id":4, "guid":"tagdef-4", "name":"AUDIT",      "attributeDefs":[], 
"owner":0}
    },
   "tags": {
-     "1":{"id":1, "guid":"tag-1", "type":"PII",        "attributes":{}},
-     "2":{"id":2, "guid":"tag-2", "type":"EXPIRES_ON", 
"attributes":{"expiry_date":"2015/08/31"}},
-     "3":{"id":3, "guid":"tag-3", "type":"FINANCE",    "attributes":{}},
-     "4":{"id":4, "guid":"tag-4", "type":"AUDIT",      "attributes":{}}
+     "1":{"id":1, "guid":"tag-1", "type":"PII",        "attributes":{}, 
"owner":0},
+     "2":{"id":2, "guid":"tag-2", "type":"EXPIRES_ON", 
"attributes":{"expiry_date":"2015/08/31"}, "owner":0},
+     "3":{"id":3, "guid":"tag-3", "type":"FINANCE",    "attributes":{}, 
"owner":0},
+     "4":{"id":4, "guid":"tag-4", "type":"AUDIT",      "attributes":{}, 
"owner":0}
    },
    "serviceResources": [
      {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/tagsync/src/main/java/org/apache/ranger/tagsync/source/atlas/AtlasNotificationMapper.java
----------------------------------------------------------------------
diff --git 
a/tagsync/src/main/java/org/apache/ranger/tagsync/source/atlas/AtlasNotificationMapper.java
 
b/tagsync/src/main/java/org/apache/ranger/tagsync/source/atlas/AtlasNotificationMapper.java
index 2168983..a9316b5 100644
--- 
a/tagsync/src/main/java/org/apache/ranger/tagsync/source/atlas/AtlasNotificationMapper.java
+++ 
b/tagsync/src/main/java/org/apache/ranger/tagsync/source/atlas/AtlasNotificationMapper.java
@@ -201,7 +201,6 @@ public class AtlasNotificationMapper {
                        }
 
                        ret.setOp(ServiceTags.OP_ADD_OR_UPDATE);
-                       ret.setTagModel(ServiceTags.TAGMODEL_RESOURCE_PRIVATE);
                        ret.setServiceName(serviceName);
                }
 
@@ -232,7 +231,7 @@ public class AtlasNotificationMapper {
                                        LOG.error("Could not get values for 
trait:" + trait.getTypeName(), exception);
                                }
 
-                               ret.add(new RangerTag(trait.getTypeName(), 
tagAttrs));
+                               ret.add(new RangerTag(null, 
trait.getTypeName(), tagAttrs, RangerTag.OWNER_SERVICERESOURCE));
                        }
                }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/38b79e72/tagsync/src/main/resources/etc/ranger/data/tags.json
----------------------------------------------------------------------
diff --git a/tagsync/src/main/resources/etc/ranger/data/tags.json 
b/tagsync/src/main/resources/etc/ranger/data/tags.json
index b4cd736..8861e03 100644
--- a/tagsync/src/main/resources/etc/ranger/data/tags.json
+++ b/tagsync/src/main/resources/etc/ranger/data/tags.json
@@ -1,6 +1,5 @@
 {
     "op":"add_or_update",
-    "tagModel": "resource_private",
     "serviceName": "cl1_hive",
     "tagDefinitions": {
       "1": {
@@ -23,7 +22,8 @@
           "expiry_date": "2014/12/31"
         },
         "id": 1,
-        "guid": "tag-1-guid"
+        "guid": "tag-1-guid",
+        "owner":0
       }
     },
     "serviceResources": [

Reply via email to