You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ma...@apache.org on 2015/08/28 23:56:00 UTC

[1/4] incubator-ranger git commit: RANGER-595: updated tag-store implementation; replaced externalId references with guid; service.tagVersion incremented on changes to tagging for the service-resources

Repository: incubator-ranger
Updated Branches:
  refs/heads/tag-policy 83cb21e0b -> 303f7b702


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
new file mode 100644
index 0000000..503df82
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapService.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.ranger.common.SearchField;
+import org.apache.ranger.common.SearchField.DATA_TYPE;
+import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.ranger.entity.XXTagResourceMap;
+import org.apache.ranger.plugin.model.RangerTagResourceMap;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RangerTagResourceMapService extends RangerTagResourceMapServiceBase<XXTagResourceMap, RangerTagResourceMap> {
+
+	public RangerTagResourceMapService() {
+		searchFields.add(new SearchField(SearchFilter.TAG_DEF_ID, "obj.id", DATA_TYPE.INTEGER, SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField(SearchFilter.TAG_RESOURCE_ID, "obj.resourceId", DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField(SearchFilter.TAG_ID, "obj.tagId", DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
+	}
+	
+	@Override
+	protected void validateForCreate(RangerTagResourceMap vObj) {
+
+	}
+
+	@Override
+	protected void validateForUpdate(RangerTagResourceMap vObj, XXTagResourceMap entityObj) {
+
+	}
+
+	@Override
+	public RangerTagResourceMap postCreate(XXTagResourceMap tagResMap) {
+		RangerTagResourceMap ret = super.postCreate(tagResMap);
+
+		daoMgr.getXXTagResourceMap().updateServiceForTagUpdate(tagResMap.getTagId(), tagResMap.getUpdateTime());
+
+		return ret;
+	}
+
+	@Override
+	public RangerTagResourceMap postUpdate(XXTagResourceMap tagResMap) {
+		RangerTagResourceMap ret = super.postUpdate(tagResMap);
+
+		daoMgr.getXXTagResourceMap().updateServiceForTagUpdate(tagResMap.getTagId(), tagResMap.getUpdateTime());
+
+		return ret;
+	}
+
+	@Override
+	protected XXTagResourceMap preDelete(Long id) {
+		XXTagResourceMap tagResMap = super.preDelete(id);
+
+		if (tagResMap != null) {
+			daoMgr.getXXTagResourceMap().updateServiceForTagUpdate(tagResMap.getTagId(), tagResMap.getUpdateTime());
+		}
+
+		return tagResMap;
+	}
+
+	public RangerTagResourceMap getPopulatedViewObject(XXTagResourceMap xObj) {
+		return populateViewBean(xObj);
+	}
+
+
+	public List<RangerTagResourceMap> getByTagId(Long tagId) {
+		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xxTagResourceMaps = daoMgr.getXXTagResourceMap().findByTagId(tagId);
+		
+		if(CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
+			for(XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
+				RangerTagResourceMap tagResourceMap = populateViewBean(xxTagResourceMap);
+
+				ret.add(tagResourceMap);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagResourceMap> getByTagGuid(String tagGuid) {
+		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xxTagResourceMaps = daoMgr.getXXTagResourceMap().findByTagGuid(tagGuid);
+		
+		if(CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
+			for(XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
+				RangerTagResourceMap tagResourceMap = populateViewBean(xxTagResourceMap);
+
+				ret.add(tagResourceMap);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagResourceMap> getByResourceId(Long resourceId) {
+		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xxTagResourceMaps = daoMgr.getXXTagResourceMap().findByResourceId(resourceId);
+		
+		if(CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
+			for(XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
+				RangerTagResourceMap tagResourceMap = populateViewBean(xxTagResourceMap);
+
+				ret.add(tagResourceMap);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagResourceMap> getByResourceGuid(String resourceGuid) {
+		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xxTagResourceMaps = daoMgr.getXXTagResourceMap().findByResourceGuid(resourceGuid);
+		
+		if(CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
+			for(XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
+				RangerTagResourceMap tagResourceMap = populateViewBean(xxTagResourceMap);
+
+				ret.add(tagResourceMap);
+			}
+		}
+
+		return ret;
+	}
+	
+	public RangerTagResourceMap getByTagAndResourceId(Long tagId, Long resourceId) {
+		RangerTagResourceMap ret = null;
+
+		XXTagResourceMap xxTagResourceMap = daoMgr.getXXTagResourceMap().findByTagAndResourceId(tagId, resourceId);
+
+		if(xxTagResourceMap != null) {
+			ret = populateViewBean(xxTagResourceMap);
+		}
+
+		return ret;
+	}
+
+	public RangerTagResourceMap getByTagAndResourceGuid(String tagGuid, String resourceGuid) {
+		RangerTagResourceMap ret = null;
+
+		XXTagResourceMap xxTagResourceMap = daoMgr.getXXTagResourceMap().findByTagAndResourceGuid(tagGuid, resourceGuid);
+
+		if(xxTagResourceMap != null) {
+			ret = populateViewBean(xxTagResourceMap);
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagResourceMap> getTagResourceMapsByServiceId(Long serviceId) {
+		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xxTagResourceMaps = daoMgr.getXXTagResourceMap().findByServiceId(serviceId);
+		
+		if(CollectionUtils.isNotEmpty(xxTagResourceMaps)) {
+			for(XXTagResourceMap xxTagResourceMap : xxTagResourceMaps) {
+				RangerTagResourceMap tagResourceMap = populateViewBean(xxTagResourceMap);
+
+				ret.add(tagResourceMap);
+			}
+		}
+
+		return ret;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapServiceBase.java
new file mode 100644
index 0000000..727cb79
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagResourceMapServiceBase.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.ranger.common.GUIDUtil;
+import org.apache.ranger.entity.XXTagResourceMap;
+import org.apache.ranger.plugin.model.RangerTagResourceMap;
+import org.apache.ranger.plugin.store.PList;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class RangerTagResourceMapServiceBase<T extends XXTagResourceMap, V extends RangerTagResourceMap> extends RangerBaseModelService<T, V> {
+
+	@Autowired
+	GUIDUtil guidUtil;
+
+	@Override
+	@SuppressWarnings("unchecked")
+	protected XXTagResourceMap mapViewToEntityBean(RangerTagResourceMap vObj, XXTagResourceMap xObj, int operationContext) {
+		String guid = (StringUtils.isEmpty(vObj.getGuid())) ? guidUtil.genGUID() : vObj.getGuid();
+
+		xObj.setGuid(guid);
+		xObj.setTagId(vObj.getTagId());
+		xObj.setResourceId(vObj.getResourceId());
+
+		return xObj;
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	protected RangerTagResourceMap mapEntityToViewBean(RangerTagResourceMap vObj, XXTagResourceMap xObj) {
+		vObj.setGuid(xObj.getGuid());
+		vObj.setTagId(xObj.getTagId());
+		vObj.setResourceId(xObj.getResourceId());
+
+		return vObj;
+	}
+
+	@SuppressWarnings("unchecked")
+	public PList<RangerTagResourceMap> searchRangerTaggedResources(SearchFilter searchFilter) {
+		PList<RangerTagResourceMap> retList = new PList<RangerTagResourceMap>();
+		List<RangerTagResourceMap> taggedResList = new ArrayList<RangerTagResourceMap>();
+
+		List<XXTagResourceMap> xTaggedResList = (List<XXTagResourceMap>) searchRangerObjects(searchFilter, searchFields, sortFields, (PList<V>) retList);
+
+		for (XXTagResourceMap xTaggedRes : xTaggedResList) {
+			RangerTagResourceMap taggedRes = populateViewBean((T) xTaggedRes);
+			taggedResList.add(taggedRes);
+		}
+		retList.setList(taggedResList);
+		return retList;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
index b5cb303..1251454 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagService.java
@@ -1,14 +1,15 @@
 package org.apache.ranger.service;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.entity.XXTag;
 import org.apache.ranger.plugin.model.RangerTag;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.springframework.stereotype.Service;
 
-/**
- * Created by akulkarni on 8/19/15.
- */
 
 @Service
 public class RangerTagService extends RangerTagServiceBase<XXTag, RangerTag> {
@@ -32,4 +33,79 @@ public class RangerTagService extends RangerTagServiceBase<XXTag, RangerTag> {
 		return populateViewBean(xObj);
 	}
 
+	public RangerTag getTagByGuid(String guid) {
+		RangerTag ret = null;
+
+		XXTag xxTag = daoMgr.getXXTag().findByGuid(guid);
+		
+		if(xxTag != null) {
+			ret = populateViewBean(xxTag);
+		}
+
+		return ret;
+	}
+
+	public List<RangerTag> getTagsByName(String name) {
+		List<RangerTag> ret = new ArrayList<RangerTag>();
+
+		List<XXTag> xxTags = daoMgr.getXXTag().findByName(name);
+		
+		if(CollectionUtils.isNotEmpty(xxTags)) {
+			for(XXTag xxTag : xxTags) {
+				RangerTag tag = populateViewBean(xxTag);
+
+				ret.add(tag);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTag> getTagsForResourceId(Long resourceId) {
+		List<RangerTag> ret = new ArrayList<RangerTag>();
+
+		List<XXTag> xxTags = daoMgr.getXXTag().findForResourceId(resourceId);
+		
+		if(CollectionUtils.isNotEmpty(xxTags)) {
+			for(XXTag xxTag : xxTags) {
+				RangerTag tag = populateViewBean(xxTag);
+
+				ret.add(tag);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTag> getTagsForResourceGuid(String resourceGuid) {
+		List<RangerTag> ret = new ArrayList<RangerTag>();
+
+		List<XXTag> xxTags = daoMgr.getXXTag().findForResourceGuid(resourceGuid);
+		
+		if(CollectionUtils.isNotEmpty(xxTags)) {
+			for(XXTag xxTag : xxTags) {
+				RangerTag tag = populateViewBean(xxTag);
+
+				ret.add(tag);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTag> getTagsByServiceId(Long serviceId) {
+		List<RangerTag> ret = new ArrayList<RangerTag>();
+
+		List<XXTag> xxTags = daoMgr.getXXTag().findByServiceId(serviceId);
+		
+		if(CollectionUtils.isNotEmpty(xxTags)) {
+			for(XXTag xxTag : xxTags) {
+				RangerTag tag = populateViewBean(xxTag);
+
+				ret.add(tag);
+			}
+		}
+
+		return ret;
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTagServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagServiceBase.java
index 7a9c9da..359e7ae 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTagServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagServiceBase.java
@@ -20,16 +20,18 @@
 package org.apache.ranger.service;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.common.GUIDUtil;
 import org.apache.ranger.common.RangerConfigUtil;
 import org.apache.ranger.entity.XXDBBase;
-import org.apache.ranger.entity.XXTagAttributeDef;
+import org.apache.ranger.entity.XXTagAttribute;
 import org.apache.ranger.entity.XXTag;
 import org.apache.ranger.plugin.model.RangerTag;
-import org.apache.ranger.plugin.model.RangerTagDef;
 import org.apache.ranger.plugin.store.PList;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,8 +54,6 @@ public abstract class RangerTagServiceBase<T extends XXTag, V extends RangerTag>
 		String guid = (StringUtils.isEmpty(vObj.getGuid())) ? guidUtil.genGUID() : vObj.getGuid();
 
 		xObj.setGuid(guid);
-		xObj.setVersion(vObj.getVersion());
-		xObj.setIsEnabled(vObj.getIsEnabled());
 		xObj.setName(vObj.getName());
 		return xObj;
 	}
@@ -63,22 +63,25 @@ public abstract class RangerTagServiceBase<T extends XXTag, V extends RangerTag>
 	protected RangerTag mapEntityToViewBean(RangerTag vObj, XXTag xObj) {
 
 		vObj.setGuid(xObj.getGuid());
-		vObj.setVersion(xObj.getVersion());
-		vObj.setIsEnabled(xObj.getIsEnabled());
 		vObj.setName(xObj.getName());
 
+		Map<String, String> attributeValues = getAttributeValuesForTag(xObj);
+		vObj.setAttributeValues(attributeValues);
+
 		return vObj;
 	}
 
-	/**
-	 * @param xObj
-	 * @return
-	 */
-	public RangerTagDef.RangerTagAttributeDef populateRangerTagAttributeDef(XXTagAttributeDef xObj) {
-		RangerTagDef.RangerTagAttributeDef attrDef = new RangerTagDef.RangerTagAttributeDef();
-		attrDef.setName(xObj.getName());
-		attrDef.setType(xObj.getType());
-		return attrDef;
+	public Map<String, String> getAttributeValuesForTag(XXTag xtag) {
+		List<XXTagAttribute> tagAttrList = daoMgr.getXXTagAttribute().findByTagId(xtag.getId());
+		Map<String, String>  ret         = new HashMap<String, String>();
+
+		if(CollectionUtils.isNotEmpty(tagAttrList)) {
+			for (XXTagAttribute tagAttr : tagAttrList) {
+				ret.put(tagAttr.getName(), tagAttr.getValue());
+			}
+		}
+
+		return ret;
 	}
 
 	@SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceService.java
deleted file mode 100644
index 327a6b8..0000000
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.service;
-
-import org.apache.ranger.common.SearchField;
-import org.apache.ranger.common.SearchField.DATA_TYPE;
-import org.apache.ranger.common.SearchField.SEARCH_TYPE;
-import org.apache.ranger.entity.XXTaggedResource;
-import org.apache.ranger.plugin.model.RangerServiceResource;
-import org.apache.ranger.plugin.util.SearchFilter;
-import org.springframework.stereotype.Service;
-
-@Service
-public class RangerTaggedResourceService extends RangerTaggedResourceServiceBase<XXTaggedResource, RangerServiceResource> {
-
-	public RangerTaggedResourceService() {
-		searchFields.add(new SearchField(SearchFilter.TAG_RESOURCE_ID, "obj.id", DATA_TYPE.INTEGER, SEARCH_TYPE.FULL));
-	}
-
-	@Override
-	protected void validateForCreate(RangerServiceResource vObj) {
-
-	}
-
-	@Override
-	protected void validateForUpdate(RangerServiceResource vObj, XXTaggedResource entityObj) {
-
-	}
-	
-	public RangerServiceResource getPopulatedViewObject(XXTaggedResource xObj) {
-		return populateViewBean(xObj);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceServiceBase.java
deleted file mode 100644
index 5f97001..0000000
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTaggedResourceServiceBase.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.service;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.ranger.common.GUIDUtil;
-import org.apache.ranger.common.MessageEnums;
-import org.apache.ranger.entity.XXResourceDef;
-import org.apache.ranger.entity.XXService;
-import org.apache.ranger.entity.XXTaggedResource;
-import org.apache.ranger.entity.XXTaggedResourceValue;
-import org.apache.ranger.plugin.model.RangerPolicy;
-import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
-import org.apache.ranger.plugin.model.RangerServiceResource;
-import org.apache.ranger.plugin.store.PList;
-import org.apache.ranger.plugin.util.SearchFilter;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public abstract class RangerTaggedResourceServiceBase<T extends XXTaggedResource, V extends RangerServiceResource> extends RangerBaseModelService<T, V> {
-
-	@Autowired
-	GUIDUtil guidUtil;
-
-	@Override
-	@SuppressWarnings("unchecked")
-	protected XXTaggedResource mapViewToEntityBean(RangerServiceResource vObj, XXTaggedResource xObj, int operationContext) {
-		String guid = (StringUtils.isEmpty(vObj.getGuid())) ? guidUtil.genGUID() : vObj.getGuid();
-
-		xObj.setGuid(guid);
-		xObj.setVersion(vObj.getVersion());
-		xObj.setIsEnabled(vObj.getIsEnabled());
-
-		XXService xService = daoMgr.getXXService().findByName(vObj.getServiceName());
-		if (xService == null) {
-			throw restErrorUtil.createRESTException("Error Populating XXTaggedResource. No Service found with name: " + vObj.getServiceName(), MessageEnums.INVALID_INPUT_DATA);
-		}
-
-		xObj.setServiceId(xService.getId());
-
-		return xObj;
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	protected RangerServiceResource mapEntityToViewBean(RangerServiceResource vObj, XXTaggedResource xObj) {
-		vObj.setGuid(xObj.getGuid());
-		vObj.setVersion(xObj.getVersion());
-		vObj.setIsEnabled(xObj.getIsEnabled());
-
-		XXService xService = daoMgr.getXXService().getById(xObj.getServiceId());
-
-		vObj.setServiceName(xService.getName());
-
-		List<XXTaggedResourceValue> resValueList = daoMgr.getXXTaggedResourceValue().findByTaggedResId(xObj.getId());
-		Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = new HashMap<String, RangerPolicy.RangerPolicyResource>();
-
-		for (XXTaggedResourceValue resValue : resValueList) {
-			List<String> resValueMapList = daoMgr.getXXTaggedResourceValueMap().findValuesByResValueId(resValue.getId());
-
-			XXResourceDef xResDef = daoMgr.getXXResourceDef().getById(resValue.getResDefId());
-
-			RangerPolicyResource policyRes = new RangerPolicyResource();
-			policyRes.setIsExcludes(resValue.getIsExcludes());
-			policyRes.setIsRecursive(resValue.getIsRecursive());
-			policyRes.setValues(resValueMapList);
-
-			resourceSpec.put(xResDef.getName(), policyRes);
-		}
-
-		vObj.setResourceSpec(resourceSpec);
-
-		return vObj;
-	}
-
-	@SuppressWarnings("unchecked")
-	public PList<RangerServiceResource> searchRangerTaggedResources(SearchFilter searchFilter) {
-		PList<RangerServiceResource> retList = new PList<RangerServiceResource>();
-		List<RangerServiceResource> taggedResList = new ArrayList<RangerServiceResource>();
-
-		List<XXTaggedResource> xTaggedResList = (List<XXTaggedResource>) searchRangerObjects(searchFilter, searchFields, sortFields, (PList<V>) retList);
-
-		for (XXTaggedResource xTaggedRes : xTaggedResList) {
-			RangerServiceResource taggedRes = populateViewBean((T) xTaggedRes);
-			taggedResList.add(taggedRes);
-		}
-		retList.setList(taggedResList);
-		return retList;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 555dfb0..b8fd003 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
@@ -534,51 +534,125 @@
 	</named-query>
 	
 	<!-- Start ==> JPA Queries for Tag Based Policies  -->
-
-	<named-query name="XXTagAttributeDef.findByTagDefId">
-		<query>select obj from XXTagAttributeDef obj where obj.tagDefId = :tagDefId</query>
+	
+	<named-query name="XXServiceResourceElement.findByResourceId">
+		<query>select obj from XXServiceResourceElement obj where obj.resourceId = :resourceId</query>
 	</named-query>
 	
-	<named-query name="XXTaggedResourceValue.findByTaggedResId">
-		<query>select obj from XXTaggedResourceValue obj where obj.taggedResourceId = :taggedResId</query>
+	<named-query name="XXServiceResourceElementValue.findByResElementId">
+		<query>select obj from XXServiceResourceElementValue obj where obj.resElementId = :resElementId</query>
+	</named-query>
+
+	<named-query name="XXServiceResourceElementValue.findValuesByResElementId">
+		<query>select obj.value from XXServiceResourceElementValue obj where obj.resElementId = :resElementId</query>
+	</named-query>
+
+	<named-query name="XXTagResourceMap.findByResourceId">
+		<query>select obj from XXTagResourceMap obj where obj.resourceId = :resourceId</query>
+	</named-query>
+
+	<named-query name="XXTagResourceMap.findByResourceGuid">
+		<query>select obj from XXTagResourceMap obj, XXServiceResource res where res.guid = :resourceGuid and obj.resourceId = res.id</query>
 	</named-query>
 	
-	<named-query name="XXTaggedResourceValueMap.findByResValueId">
-		<query>select obj from XXTaggedResourceValueMap obj where obj.resValueId = :resValueId</query>
+	<named-query name="XXTagResourceMap.findByTagId">
+		<query>select obj from XXTagResourceMap obj where obj.tagId = :tagId</query>
+	</named-query>
+
+	<named-query name="XXTagResourceMap.findByTagGuid">
+		<query>select obj from XXTagResourceMap obj, XXTag tag where tag.guid = :tagGuid and obj.tagId = tag.id</query>
 	</named-query>
 
-	<named-query name="XXTaggedResourceValueMap.findValuesByResValueId">
-		<query>select obj.value from XXTaggedResourceValueMap obj where obj.resValueId = :resValueId</query>
+	<named-query name="XXTagResourceMap.findByTagAndResourceId">
+		<query>select obj from XXTagResourceMap obj where obj.resourceId = :resourceId and obj.tagId = :tagId</query>
 	</named-query>
 
-	<named-query name="XXTag.findByTaggedResource">
-		<query>select obj from XXTag obj, XXTagResourceMap tagResMap where 
-		tagResMap.taggedResId = :taggedResId and obj.id = tagResMap.tagId</query>
+	<named-query name="XXTagResourceMap.findByTagAndResourceGuid">
+		<query>select obj from XXTagResourceMap obj, XXTag tag, XXServiceResource res where tag.guid = :tagGuid and res.guid = :resourceGuid and obj.tagId = tag.id and obj.resourceId = res.id</query>
 	</named-query>
+
+	<named-query name="XXTagResourceMap.findByServiceId">
+		<query>select obj from XXTagResourceMap obj, XXServiceResource res
+				where obj.resourceId = res.id and res.serviceId = :serviceId
+				order by obj.resourceId</query>
+	</named-query>
+
+	<named-query name="XXTagResourceMap.updateTagVersionInService">
+		<query>update XXService obj set obj.tagVersion = obj.tagVersion + 1, obj.tagUpdateTime = :tagUpdateTime
+				where obj.id in (select res.serviceId from XXServiceResource res, XXTagResourceMap tagRes, XXTag tag
+								  where res.id = tagRes.resourceId and tagRes.tagId = tag.id and tag.id = :tagId)</query>
+	</named-query>	
 	
-	<named-query name="XXTagAttribute.findByTagId">
-		<query>select obj from XXTagAttribute obj where obj.tagId = :tagId</query>
+	<named-query name="XXTagDef.findByGuid">
+		<query>select obj from XXTagDef obj where obj.guid = :guid</query>
+	</named-query>
+	
+	<named-query name="XXTagDef.findByName">
+		<query>select obj from XXTagDef obj where obj.name = :name</query>
+	</named-query>
+	
+	<named-query name="XXTagDef.findByServiceId">
+		<query>select obj from XXTagDef obj where obj.name in
+				(select tag.name from XXTag tag, XXTagResourceMap tagRes, XXServiceResource resource where tag.id = tagRes.tagId and tagRes.resourceId = resource.id and resource.serviceId = :serviceId)</query>
+	</named-query>
+
+	<named-query name="XXTagDef.updateTagVersionInService">
+		<query>update XXService obj set obj.tagVersion = obj.tagVersion + 1, obj.tagUpdateTime = :tagUpdateTime
+				where obj.id in (select res.serviceId from XXServiceResource res, XXTagResourceMap tagRes, XXTag tag, XXTagDef tagDef
+								  where res.id = tagRes.resourceId and tagRes.tagId = tag.id and tag.name = tagDef.name and tagDef.id = :tagDefId)</query>
+	</named-query>	
+
+	<named-query name="XXTagAttributeDef.findByTagDefId">
+		<query>select obj from XXTagAttributeDef obj where obj.tagDefId = :tagDefId</query>
+	</named-query>
+
+	
+	<named-query name="XXTag.findByGuid">
+		<query>select obj from XXTag obj where obj.guid = :guid</query>
 	</named-query>
 	
-	<named-query name="XXTaggedResource.findByServiceId">
-		<query>select obj from XXTaggedResource obj where obj.serviceId = :serviceId</query>
+	<named-query name="XXTag.findByName">
+		<query>select obj from XXTag obj where obj.name = :name</query>
+	</named-query>
+
+	<named-query name="XXTag.findByResourceId">
+		<query>select obj from XXTag obj, XXTagResourceMap tagResMap where tagResMap.resourceId = :resourceId and obj.id = tagResMap.tagId</query>
+	</named-query>
+
+	<named-query name="XXTag.findByResourceGuid">
+		<query>select obj from XXTag obj, XXTagResourceMap tagRes, XXServiceResource res where res.guid = :resourceGuid and res.id = tagRes.resourceId and tagRes.tagId = obj.id</query>
 	</named-query>
 
 	<named-query name="XXTag.findTagNamesByServiceId">
-		<query>select obj.name from XXTag obj, XXTaggedResource tRes, XXTagResourceMap tResMap where 
-		tRes.serviceId = :serviceId and obj.id = tResMap.tagId and tRes.id = tResMap.taggedResId </query>
+		<query>select obj.name from XXTag obj, XXServiceResource tRes, XXTagResourceMap tResMap where 
+		tRes.serviceId = :serviceId and obj.id = tResMap.tagId and tRes.id = tResMap.resourceId </query>
 	</named-query>	
 	
-	<named-query name="XXTagResourceMap.findByTaggedResourceId">
-		<query>select obj from XXTagResourceMap obj where obj.taggedResId = :taggedResId</query>
+	<named-query name="XXTag.findByServiceId">
+		<query>select obj from XXTag obj where obj.id in
+			(select tagRes.tagId from XXTagResourceMap tagRes, XXServiceResource resource where tagRes.resourceId = resource.id and resource.serviceId = :serviceId)</query>
+	</named-query>
+	
+	<named-query name="XXTagAttribute.findByTagId">
+		<query>select obj from XXTagAttribute obj where obj.tagId = :tagId</query>
+	</named-query>
+
+
+	<named-query name="XXServiceResource.findByGuid">
+		<query>select obj from XXServiceResource obj where obj.guid = :guid</query>
 	</named-query>
 	
-	<named-query name="XXTag.findTagsByExternalId">
-		<query>select obj from XXTag obj where obj.externalId = :externalId</query>
+	<named-query name="XXServiceResource.findByServiceId">
+		<query>select obj from XXServiceResource obj where obj.serviceId = :serviceId</query>
 	</named-query>
 	
-	<named-query name="XXTagDef.findByName">
-		<query>select obj from XXTagDef obj where obj.name = :name</query>
+	<named-query name="XXServiceResource.findTaggedResourcesInServiceId">
+		<query>select obj from XXServiceResource obj where obj.serviceId = :serviceId and obj.id in
+					(select tagResMap.resourceId from XXTagResourceMap tagResMap)</query>
+	</named-query>
+
+	<named-query name="XXServiceResource.findByServiceIdAndResourceSignature">
+		<query>select obj from XXServiceResource obj where obj.serviceId = :serviceId and obj.resourceSignature = :resourceSignature</query>
 	</named-query>
 
 	<!-- End <== JPA Queries for Tag Based Policies  -->


[3/4] incubator-ranger git commit: RANGER-595: updated tag-store implementation; replaced externalId references with guid; service.tagVersion incremented on changes to tagging for the service-resources

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/db/mysql/patches/016-updated-schema-for-tag-based-policy.sql
----------------------------------------------------------------------
diff --git a/security-admin/db/mysql/patches/016-updated-schema-for-tag-based-policy.sql b/security-admin/db/mysql/patches/016-updated-schema-for-tag-based-policy.sql
index 4f6fe02..629d1c4 100644
--- a/security-admin/db/mysql/patches/016-updated-schema-for-tag-based-policy.sql
+++ b/security-admin/db/mysql/patches/016-updated-schema-for-tag-based-policy.sql
@@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS `x_tag_def` (
   `is_enabled` TINYINT NULL DEFAULT 1,
   PRIMARY KEY (`id`),
   UNIQUE INDEX `guid_UNIQUE` (`guid` ASC),
+  INDEX `fk_X_TAG_DEF_NAME` (`name` ASC),
   INDEX `fk_X_TAG_DEF_ADDED_BY_ID` (`added_by_id` ASC),
   INDEX `fk_X_TAG_DEF_UPD_BY_ID` (`upd_by_id` ASC),
   CONSTRAINT `fk_X_TAG_DEF_ADDED_BY_ID`
@@ -61,17 +62,14 @@ CREATE TABLE IF NOT EXISTS `x_tag` (
   `update_time` DATETIME NULL,
   `added_by_id` BIGINT(20) NULL,
   `upd_by_id` BIGINT(20) NULL,
-  `tag_def_id` BIGINT(20) NULL,
-  `external_id` VARCHAR(512) NULL,
   `name` VARCHAR(512) NOT NULL,
   PRIMARY KEY (`id`),
-  INDEX `fk_X_TAG_DEF_ID` (`tag_def_id` ASC),
+  INDEX `fk_X_TAG_NAME` (`name` ASC),
   INDEX `fk_X_TAG_ADDED_BY_ID` (`added_by_id` ASC),
   INDEX `fk_X_TAG_UPD_BY_ID` (`upd_by_id` ASC),
-  KEY `external_id` (`external_id`),
-  CONSTRAINT `fk_X_TAG_DEF_ID`
-    FOREIGN KEY (`tag_def_id`)
-    REFERENCES `x_tag_def` (`id`)
+  CONSTRAINT `fk_X_TAG_NAME`
+    FOREIGN KEY (`name`)
+    REFERENCES `x_tag_def` (`name`)
     ON DELETE NO ACTION
     ON UPDATE NO ACTION,
   CONSTRAINT `fk_X_TAG_ADDED_BY_ID`
@@ -89,11 +87,11 @@ ENGINE = InnoDB;
 
 
 -- -----------------------------------------------------
--- Table `x_tagged_resource`
+-- Table `x_service_resource`
 -- -----------------------------------------------------
-DROP TABLE IF EXISTS `x_tagged_resource` ;
+DROP TABLE IF EXISTS `x_service_resource` ;
 
-CREATE TABLE IF NOT EXISTS `x_tagged_resource` (
+CREATE TABLE IF NOT EXISTS `x_service_resource` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `guid` VARCHAR(512) NOT NULL,
   `create_time` DATETIME NULL,
@@ -101,24 +99,23 @@ CREATE TABLE IF NOT EXISTS `x_tagged_resource` (
   `added_by_id` BIGINT(20) NULL,
   `upd_by_id` BIGINT(20) NULL,
   `version` BIGINT(20) NULL,
-  `external_id` VARCHAR(512) NULL,
   `service_id` BIGINT(20) NOT NULL,
+  `resource_signature` varchar(128) DEFAULT NULL,
   `is_enabled` TINYINT NULL DEFAULT 1,
   PRIMARY KEY (`id`),
-  INDEX `fk_X_TAGGED_RESOURCE_ADDED_BY_ID` (`added_by_id` ASC),
-  INDEX `fk_X_TAGGED_RESOURCE_UPD_BY_ID` (`upd_by_id` ASC),
-  KEY `external_id` (`external_id`),
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_SERVICE_ID`
+  INDEX `fk_X_SERVICE_RESOURCE_ADDED_BY_ID` (`added_by_id` ASC),
+  INDEX `fk_X_SERVICE_RESOURCE_UPD_BY_ID` (`upd_by_id` ASC),
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_SERVICE_ID`
     FOREIGN KEY (`service_id`)
     REFERENCES `x_service` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_ADDED_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_ADDED_BY_ID`
     FOREIGN KEY (`added_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_UPD_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_UPD_BY_ID`
     FOREIGN KEY (`upd_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
@@ -127,40 +124,40 @@ ENGINE = InnoDB;
 
 
 -- -----------------------------------------------------
--- Table `x_tagged_resource_value`
+-- Table `x_service_resource_element`
 -- -----------------------------------------------------
-DROP TABLE IF EXISTS `x_tagged_resource_value` ;
+DROP TABLE IF EXISTS `x_service_resource_element` ;
 
-CREATE TABLE IF NOT EXISTS `x_tagged_resource_value` (
+CREATE TABLE IF NOT EXISTS `x_service_resource_element` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `guid` VARCHAR(512) NOT NULL,
   `create_time` DATETIME NULL,
   `update_time` DATETIME NULL,
   `added_by_id` BIGINT(20) NULL,
   `upd_by_id` BIGINT(20) NULL,
-  `tagged_res_id` BIGINT(20) NOT NULL,
+  `res_id` BIGINT(20) NOT NULL,
   `res_def_id` BIGINT(20) NOT NULL,
   `is_excludes` TINYINT(1) NULL DEFAULT false,
   `is_recursive` TINYINT(1) NULL DEFAULT false,
   PRIMARY KEY (`id`),
-  INDEX `fk_X_TAGGED_RESOURCE_VALUE_ADDED_BY_ID` (`added_by_id` ASC),
-  INDEX `fk_X_TAGGED_RESOURCE_VALUE_UPD_BY_ID` (`upd_by_id` ASC),
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_VALUE_res_def_id` 
+  INDEX `fk_X_SERVICE_RESOURCE_ELEMENT_ADDED_BY_ID` (`added_by_id` ASC),
+  INDEX `fk_X_SERVICE_RESOURCE_ELEMENT_UPD_BY_ID` (`upd_by_id` ASC),
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_ELEMENT_res_def_id` 
     FOREIGN KEY (`res_def_id`) 
     REFERENCES `x_resource_def` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_VALUE_tagged_res_id` 
-    FOREIGN KEY (`tagged_res_id`) 
-    REFERENCES `x_tagged_resource` (`id`)
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_ELEMENT_res_id` 
+    FOREIGN KEY (`res_id`) 
+    REFERENCES `x_service_resource` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_VALUE_ADDED_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_ELEMENT_ADDED_BY_ID`
     FOREIGN KEY (`added_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RESOURCE_VALUE_UPD_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RESOURCE_ELEMENT_UPD_BY_ID`
     FOREIGN KEY (`upd_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
@@ -254,10 +251,10 @@ CREATE TABLE IF NOT EXISTS `x_tag_resource_map` (
   `added_by_id` BIGINT(20) NULL,
   `upd_by_id` BIGINT(20) NULL,
   `tag_id` BIGINT(20) NOT NULL,
-  `tagged_res_id` BIGINT(20) NOT NULL,
+  `res_id` BIGINT(20) NOT NULL,
   PRIMARY KEY (`id`),
   INDEX `fk_X_TAG_ID` (`tag_id` ASC),
-  INDEX `fk_X_TAGGED_RES_ID` (`tagged_res_id` ASC),
+  INDEX `fk_X_SERVICE_RES_ID` (`res_id` ASC),
   INDEX `fk_X_TAG_RES_MAP_ADDED_BY_ID` (`added_by_id` ASC),
   INDEX `fk_X_TAG_RES_MAP_UPD_BY_ID` (`upd_by_id` ASC),
   CONSTRAINT `fk_X_TAG_RES_MAP_TAG_ID`
@@ -265,9 +262,9 @@ CREATE TABLE IF NOT EXISTS `x_tag_resource_map` (
     REFERENCES `x_tag` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAG_RES_MAP_TAGGED_RES_ID`
-    FOREIGN KEY (`tagged_res_id`)
-    REFERENCES `x_tagged_resource` (`id`)
+  CONSTRAINT `fk_X_TAG_RES_MAP_SERVICE_RES_ID`
+    FOREIGN KEY (`res_id`)
+    REFERENCES `x_service_resource` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
   CONSTRAINT `fk_X_TAG_RES_MAP_ADDED_BY_ID`
@@ -284,35 +281,35 @@ ENGINE = InnoDB;
 
 
 -- -----------------------------------------------------
--- Table `x_tagged_resource_value_map`
+-- Table `x_service_resource_element_value`
 -- -----------------------------------------------------
-DROP TABLE IF EXISTS `x_tagged_resource_value_map` ;
+DROP TABLE IF EXISTS `x_service_resource_element_value` ;
 
-CREATE TABLE IF NOT EXISTS `x_tagged_resource_value_map` (
+CREATE TABLE IF NOT EXISTS `x_service_resource_element_value` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `guid` VARCHAR(512) NOT NULL,
   `create_time` DATETIME NULL,
   `update_time` DATETIME NULL,
   `added_by_id` BIGINT(20) NULL,
   `upd_by_id` BIGINT(20) NULL,
-  `res_value_id` BIGINT(20) NOT NULL,
+  `res_element_id` BIGINT(20) NOT NULL,
   `value` VARCHAR(512) NOT NULL,
   `sort_order` INT NULL,
   PRIMARY KEY (`id`),
-  INDEX `fk_X_RESOURCE_VALUE_ID` (`res_value_id` ASC),
-  INDEX `fk_X_TAGGED_RES_VAL_MAP_ADDED_BY_ID` (`added_by_id` ASC),
-  INDEX `fk_X_TAGGED_RES_VAL_MAP_UPD_BY_ID` (`upd_by_id` ASC),
-  CONSTRAINT `fk_X_RESOURCE_VALUE_ID`
-    FOREIGN KEY (`res_value_id`)
-    REFERENCES `x_tagged_resource_value` (`id`)
+  INDEX `fk_X_RESOURCE_ELEMENT_ID` (`res_element_id` ASC),
+  INDEX `fk_X_SERVICE_RES_VAL_MAP_ADDED_BY_ID` (`added_by_id` ASC),
+  INDEX `fk_X_SERVICE_RES_VAL_MAP_UPD_BY_ID` (`upd_by_id` ASC),
+  CONSTRAINT `fk_X_RESOURCE_ELEMENT_ID`
+    FOREIGN KEY (`res_element_id`)
+    REFERENCES `x_service_resource_element` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RES_VAL_MAP_ADDED_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RES_VAL_MAP_ADDED_BY_ID`
     FOREIGN KEY (`added_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
     ON UPDATE RESTRICT,
-  CONSTRAINT `fk_X_TAGGED_RES_VAL_MAP_UPD_BY_ID`
+  CONSTRAINT `fk_X_SERVICE_RES_VAL_MAP_UPD_BY_ID`
     FOREIGN KEY (`upd_by_id`)
     REFERENCES `x_portal_user` (`id`)
     ON DELETE RESTRICT
@@ -324,4 +321,6 @@ ENGINE = InnoDB;
 -- ranger database add column in x_service_def and x_service table
 -- ----------------------------------------------------------------
 alter table x_service_def add column `options` VARCHAR(1024) DEFAULT NULL NULL;
-alter table x_service add column `tag_service` BIGINT DEFAULT NULL NULL;
\ No newline at end of file
+alter table x_service add column `tag_service` BIGINT DEFAULT NULL NULL,
+                      add column `tag_version` BIGINT DEFAULT 0 NOT NULL,
+                      add column `tag_update_time` DATETIME DEFAULT NULL NULL;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 f50687a..08a632c 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
@@ -20,16 +20,12 @@
 package org.apache.ranger.biz;
 
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -41,33 +37,27 @@ import org.apache.ranger.entity.XXDBBase;
 import org.apache.ranger.entity.XXResourceDef;
 import org.apache.ranger.entity.XXService;
 import org.apache.ranger.entity.XXServiceDef;
-import org.apache.ranger.entity.XXTag;
 import org.apache.ranger.entity.XXTagAttribute;
 import org.apache.ranger.entity.XXTagAttributeDef;
-import org.apache.ranger.entity.XXTagResourceMap;
-import org.apache.ranger.entity.XXTaggedResource;
-import org.apache.ranger.entity.XXTaggedResourceValue;
-import org.apache.ranger.entity.XXTaggedResourceValueMap;
+import org.apache.ranger.entity.XXServiceResourceElement;
+import org.apache.ranger.entity.XXServiceResourceElementValue;
 import org.apache.ranger.plugin.model.*;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.model.RangerTagDef.RangerTagAttributeDef;
-import org.apache.ranger.plugin.model.RangerTag;
-import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
 import org.apache.ranger.plugin.store.AbstractTagStore;
 import org.apache.ranger.plugin.store.PList;
-import org.apache.ranger.plugin.store.ServiceStore;
-import org.apache.ranger.plugin.store.TagStore;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServiceTags;
 import org.apache.ranger.service.RangerAuditFields;
 import org.apache.ranger.service.RangerTagDefService;
+import org.apache.ranger.service.RangerTagResourceMapService;
 import org.apache.ranger.service.RangerTagService;
-import org.apache.ranger.service.RangerTaggedResourceService;
+import org.apache.ranger.service.RangerServiceResourceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
-public class TagDBStore implements TagStore {
+public class TagDBStore extends AbstractTagStore {
 	private static final Log LOG = LogFactory.getLog(TagDBStore.class);
 
 	@Autowired
@@ -77,7 +67,10 @@ public class TagDBStore implements TagStore {
 	RangerTagService rangerTagService;
 
 	@Autowired
-	RangerTaggedResourceService rangerTaggedResourceService;
+	RangerServiceResourceService rangerServiceResourceService;
+
+	@Autowired
+	RangerTagResourceMapService rangerTagResourceMapService;
 
 	@Autowired
 	RangerDaoManager daoManager;
@@ -91,41 +84,25 @@ public class TagDBStore implements TagStore {
 	@Autowired
 	GUIDUtil guidUtil;
 
-	@Autowired
-	ServiceDBStore serviceDBStore;
-
 	@Override
 	public void init() throws Exception {
-
-	}
-
-	@Override
-	public void setServiceStore(ServiceStore svcStore) {
-
+		super.init();
 	}
 
 	@Override
 	public RangerTagDef createTagDef(RangerTagDef tagDef) throws Exception {
-
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagDBStore.createTagDef(" + tagDef + ")");
 		}
 
-		RangerTagDef ret;
-
-		try {
-			ret = rangerTagDefService.create(tagDef);
-
-			createTagAttributeDefs(ret.getId(), tagDef.getAttributeDefs());
+		RangerTagDef ret = rangerTagDefService.create(tagDef);
 
-			ret = rangerTagDefService.read(ret.getId());
+		createTagAttributeDefs(ret.getId(), tagDef.getAttributeDefs());
 
-		} catch (Exception e) {
-			throw errorUtil.createRESTException("failed to save tag-def [" + tagDef.getName() + "]", MessageEnums.ERROR_CREATING_OBJECT);
-		}
+		ret = rangerTagDefService.read(ret.getId());
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagDBStore.createTagDef(" + tagDef + ")");
+			LOG.debug("<== TagDBStore.createTagDef(" + tagDef + "): id=" + (ret == null ? null : ret.getId()));
 		}
 
 		return ret;
@@ -133,627 +110,925 @@ public class TagDBStore implements TagStore {
 
 	@Override
 	public RangerTagDef updateTagDef(RangerTagDef tagDef) throws Exception {
-
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagDBStore.updateTagDef(" + tagDef + ")");
 		}
 
 		RangerTagDef existing = rangerTagDefService.read(tagDef.getId());
-		RangerTagDef ret = null;
+
 		if (existing == null) {
-			throw errorUtil.createRESTException("failed to update tag-def [" + tagDef.getName() + "], Reason: No TagDef found with id: [" + tagDef.getId() + "]",
-					MessageEnums.DATA_NOT_UPDATABLE);
+			throw errorUtil.createRESTException("failed to update tag-def [" + tagDef.getName() + "], Reason: No TagDef found with id: [" + tagDef.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
 		}
 
 		if (StringUtils.isEmpty(tagDef.getCreatedBy())) {
 			tagDef.setCreatedBy(existing.getCreatedBy());
 		}
+
 		if (tagDef.getCreateTime() == null) {
 			tagDef.setCreateTime(existing.getCreateTime());
 		}
+
 		if (StringUtils.isEmpty(tagDef.getGuid())) {
 			tagDef.setGuid(existing.getGuid());
 		}
 
-		ret = rangerTagDefService.update(tagDef);
+		RangerTagDef ret = rangerTagDefService.update(tagDef);
 
+		// TODO: delete attributes might fail; so instead of delete+create, following should be updated to deal with only attributes that changed
 		deleteTagAttributeDefs(ret.getId());
-
 		createTagAttributeDefs(ret.getId(), tagDef.getAttributeDefs());
 
-		return rangerTagDefService.read(ret.getId());
-	}
-
-	private List<XXTagAttributeDef> createTagAttributeDefs(Long tagDefId, List<RangerTagAttributeDef> tagAttrDefList) {
-
-		if (tagDefId == null) {
-			throw errorUtil.createRESTException("TagDBStore.createTagAttributeDefs(): Error creating tag-attr def. tagDefId can not be null.", MessageEnums.ERROR_CREATING_OBJECT);
-		}
-
-		if (CollectionUtils.isEmpty(tagAttrDefList)) {
-			return null;
-		}
-
-		List<XXTagAttributeDef> xTagAttrDefList = new ArrayList<XXTagAttributeDef>();
-		for (RangerTagDef.RangerTagAttributeDef attrDef : tagAttrDefList) {
-			XXTagAttributeDef xAttrDef = new XXTagAttributeDef();
-
-			xAttrDef.setGuid(guidUtil.genGUID());
-			xAttrDef.setTagDefId(tagDefId);
-			xAttrDef.setName(attrDef.getName());
-			xAttrDef.setType(attrDef.getType());
-			xAttrDef = (XXTagAttributeDef) rangerAuditFields.populateAuditFieldsForCreate(xAttrDef);
+		ret = rangerTagDefService.read(ret.getId());
 
-			xAttrDef = daoManager.getXXTagAttributeDef().create(xAttrDef);
-
-			xTagAttrDefList.add(xAttrDef);
-		}
-		return xTagAttrDefList;
-	}
-
-	private void deleteTagAttributeDefs(Long tagDefId) {
-		if (tagDefId == null) {
-			return;
-		}
-		List<XXTagAttributeDef> tagAttrDefList = daoManager.getXXTagAttributeDef().findByTagDefId(tagDefId);
-
-		if (CollectionUtils.isEmpty(tagAttrDefList)) {
-			return;
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.updateTagDef(" + tagDef + "): " + ret);
 		}
 
-		for (XXTagAttributeDef xAttrDef : tagAttrDefList) {
-			if (LOG.isDebugEnabled()) {
-				LOG.debug("Deleting tag-attribute def [" + xAttrDef.getName() + "]");
-			}
-			daoManager.getXXTagAttributeDef().remove(xAttrDef);
-		}
+		return ret;
 	}
 
 	@Override
 	public void deleteTagDef(String name) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.deleteTagDef(" + name + ")");
+		}
 
 		if (StringUtils.isNotBlank(name)) {
-			return;
-		}
+			List<RangerTagDef> tagDefs = getTagDefsByName(name);
 
-		List<RangerTagDef> ret;
+			if(CollectionUtils.isNotEmpty(tagDefs)) {
+				for (RangerTagDef tagDef : tagDefs) {
+					if(LOG.isDebugEnabled()) {
+						LOG.debug("Deleting tag-def [name=" + name + "; id=" + tagDef.getId() + "]");
+					}
 
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("Deleting all tag-defs with name [" + name + "]");
+					rangerTagDefService.delete(tagDef);
+				}
+			}
 		}
 
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_NAME, name);
-		ret = getTagDefs(filter);
-
-		for (RangerTagDef tagDef : ret) {
-			LOG.info("Deleting tag-def with name [" + name + "]");
-			rangerTagDefService.delete(tagDef);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteTagDef(" + name + ")");
 		}
 	}
 
 	@Override
 	public void deleteTagDefById(Long id) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("Deleting tag-def [" + id + "]");
+			LOG.debug("==> TagDBStore.deleteTagDefById(" + id + ")");
 		}
 
-		RangerTagDef tagDef = rangerTagDefService.read(id);
-
-		rangerTagDefService.delete(tagDef);
-	}
+		if(id != null) {
+			RangerTagDef tagDef = rangerTagDefService.read(id);
 
-	@Override
-	public List<RangerTagDef> getTagDef(String name) throws Exception {
+			if(tagDef != null) {
+				rangerTagDefService.delete(tagDef);
+			}
+		}
 
-		List<RangerTagDef> ret;
-		if (StringUtils.isNotBlank(name)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_NAME, name);
-			ret = getTagDefs(filter);
-		} else {
-			ret = null;
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteTagDefById(" + id + ")");
 		}
-		return ret;
 	}
 
 	@Override
 	public RangerTagDef getTagDefById(Long id) throws Exception {
-		return rangerTagDefService.read(id);
-	}
-
-	@Override
-	public List<RangerTagDef> getTagDefs(SearchFilter filter) throws Exception {
-		return getPaginatedTagDefs(filter).getList();
-	}
-
-	@Override
-	public PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception {
-		return rangerTagDefService.searchRangerTagDefs(filter);
-	}
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagDefById(" + id + ")");
+		}
 
-	/*
-	private XXTag createTagAttributes(RangerTag tag) {
-		XXTag xTag = new XXTag();
+		RangerTagDef ret = rangerTagDefService.read(id);
 
-		xTag.setExternalId(tag.getExternalId());
-		xTag.setName(tag.getName());
-		xTag.setGuid(guidUtil.genGUID());
-		xTag = (XXTag) rangerAuditFields.populateAuditFieldsForCreate(xTag);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagDefById(" + id + "): " + ret);
+		}
 
-		xTag = daoManager.getXXTag().create(xTag);
+		return ret;
+	}
 
-		for (Entry<String, String> attr : tag.getAttributeValues().entrySet()) {
-			XXTagAttribute xTagAttr = new XXTagAttribute();
+	@Override
+	public RangerTagDef getTagDefByGuid(String guid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagDefByGuid(" + guid + ")");
+		}
 
-			xTagAttr.setTagId(xTag.getId());
-			xTagAttr.setName(attr.getKey());
-			xTagAttr.setValue(attr.getValue());
-			xTagAttr.setGuid(guidUtil.genGUID());
-			xTagAttr = (XXTagAttribute) rangerAuditFields.populateAuditFieldsForCreate(xTagAttr);
+		RangerTagDef ret = rangerTagDefService.getTagDefByGuid(guid);
 
-			xTagAttr = daoManager.getXXTagAttribute().create(xTagAttr);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagDefByGuid(" + guid + "): " + ret);
 		}
 
-		return xTag;
+		return ret;
 	}
 
-	private void deleteTagAttributes(Long tagId) {
-		List<XXTagAttribute> tagAttrList = daoManager.getXXTagAttribute().findByTagId(tagId);
-		for (XXTagAttribute tagAttr : tagAttrList) {
-			daoManager.getXXTagAttribute().remove(tagAttr);
+	@Override
+	public List<RangerTagDef> getTagDefsByName(String name) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagDefsByName(" + name + ")");
 		}
-	}
-
-	private void createResourceSpecForResource(RangerServiceResource resource) {
 
-		String serviceName = resource.getServiceName();
+		List<RangerTagDef> ret = null;
 
-		XXService xService = daoManager.getXXService().findByName(serviceName);
-		if (xService == null) {
-			throw errorUtil.createRESTException("No Service found with name: " + serviceName, MessageEnums.ERROR_CREATING_OBJECT);
+		if (StringUtils.isNotBlank(name)) {
+			ret = rangerTagDefService.getTagDefsByName(name);
 		}
 
-		XXServiceDef xServiceDef = daoManager.getXXServiceDef().getById(xService.getType());
-		if (xServiceDef == null) {
-			throw errorUtil.createRESTException("No Service-Def found with ID: " + xService.getType(), MessageEnums.ERROR_CREATING_OBJECT);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagDefsByName(" + name + "): count=" + (ret == null ? 0 : ret.size()));
 		}
 
-		Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = resource.getResourceSpec();
-
-		for (Entry<String, RangerPolicyResource> resSpec : resourceSpec.entrySet()) {
-			XXResourceDef xResDef = daoManager.getXXResourceDef().findByNameAndServiceDefId(resSpec.getKey(), xServiceDef.getId());
-
-			if (xResDef == null) {
-				LOG.error("TagDBStore.createResource: ResourceType is not valid [" + resSpec.getKey() + "]");
-				throw errorUtil.createRESTException("Resource Type is not valid [" + resSpec.getKey() + "]", MessageEnums.DATA_NOT_FOUND);
-			}
-
-			RangerPolicyResource policyRes = resSpec.getValue();
-
-			XXTaggedResourceValue taggedResValue = new XXTaggedResourceValue();
-			taggedResValue.setIsExcludes(policyRes.getIsExcludes());
-			taggedResValue.setIsRecursive(policyRes.getIsRecursive());
-			taggedResValue.setResDefId(xResDef.getId());
-			taggedResValue.setTaggedResourceId(resource.getId());
-			taggedResValue.setGuid(guidUtil.genGUID());
-
-			taggedResValue = (XXTaggedResourceValue) rangerAuditFields.populateAuditFieldsForCreate(taggedResValue);
-
-			taggedResValue = daoManager.getXXTaggedResourceValue().create(taggedResValue);
-
-			int sortOrder = 1;
-			for (String resVal : policyRes.getValues()) {
-				XXTaggedResourceValueMap taggedResValueMap = new XXTaggedResourceValueMap();
-				taggedResValueMap.setResValueId(taggedResValue.getId());
-				taggedResValueMap.setValue(resVal);
-				taggedResValueMap.setSortOrder(sortOrder);
-				taggedResValueMap.setGuid(guidUtil.genGUID());
-				taggedResValueMap = (XXTaggedResourceValueMap) rangerAuditFields.populateAuditFieldsForCreate(taggedResValueMap);
-
-				taggedResValueMap = daoManager.getXXTaggedResourceValueMap().create(taggedResValueMap);
-				sortOrder++;
-			}
-		}
+		return ret;
 	}
 
-	private void deleteResourceValue(Long resourceId) {
-		List<XXTaggedResourceValue> taggedResValueList = daoManager.getXXTaggedResourceValue().findByTaggedResId(resourceId);
-		for (XXTaggedResourceValue taggedResValue : taggedResValueList) {
-			List<XXTaggedResourceValueMap> taggedResValueMapList = daoManager.getXXTaggedResourceValueMap().findByResValueId(taggedResValue.getId());
-			for (XXTaggedResourceValueMap taggedResValueMap : taggedResValueMapList) {
-				daoManager.getXXTaggedResourceValueMap().remove(taggedResValueMap);
-			}
-			daoManager.getXXTaggedResourceValue().remove(taggedResValue);
+	@Override
+	public List<RangerTagDef> getTagDefs(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagDefs(" + filter + ")");
 		}
-	}
 
-	private void updateResourceSpecForResource(RangerServiceResource updResource) {
+		List<RangerTagDef> ret = getPaginatedTagDefs(filter).getList();
 
-		if (updResource != null) {
-			deleteResourceValue(updResource.getId());
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagDefs(" + filter + "): " + ret);
 		}
 
-		createResourceSpecForResource(updResource);
+		return ret;
 	}
-	*/
 
 	@Override
-	public RangerTag createTag(RangerTag tag) throws Exception
-	{
-		throw new Exception("Not implemented");
-
-		/*
+	public PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagDBStore.createTag(" + tag + ")");
+			LOG.debug("==> TagDBStore.getPaginatedTagDefs(" + filter + ")");
 		}
 
-		throw new Exception("Not implemented");
-
+		PList<RangerTagDef> ret = rangerTagDefService.searchRangerTagDefs(filter);
 
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getPaginatedTagDefs(" + filter + "): " + ret);
+		}
 
-		RangerTag ret = null;
+		return ret;
+	}
 
 
-		try {
+	@Override
+	public RangerTag createTag(RangerTag tag) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.createTag(" + tag + ")");
+		}
 
-			ret = rangerTagService.getPopulatedViewObject(createTagAttributes(tag));
+		RangerTag ret = rangerTagService.create(tag);
 
-		} catch (Exception e) {
-			throw errorUtil.createRESTException("failed to save tag [" + tag.getName() + "]", MessageEnums.ERROR_CREATING_OBJECT);
-		}
+		createTagAttributes(ret.getId(), tag.getAttributeValues());
 
+		ret = rangerTagService.read(ret.getId());
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagDBStore.createTag(" + tag + ")");
+			LOG.debug("<== TagDBStore.createTag(" + tag + "): " + ret);
 		}
 
 		return ret;
-		*/
 	}
-
+	
 	@Override
-	public RangerTag updateTag(RangerTag tag) throws Exception
-	{
-
-		throw new Exception("Not implemented");
-
-		/*
+	public RangerTag updateTag(RangerTag tag) throws Exception {
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagDBStore.updateTag(" + tag + ")");
 		}
 
-		throw new Exception("Not implemented");
-
-		RangerTag ret = null;
-
-
 		RangerTag existing = rangerTagService.read(tag.getId());
 
 		if (existing == null) {
-			throw errorUtil.createRESTException("failed to update tag [" + tag.getName() + "], Reason: No Tag found with id: [" + tag.getId() + "]",
-					MessageEnums.DATA_NOT_UPDATABLE);
+			throw errorUtil.createRESTException("failed to update tag [" + tag.getName() + "], Reason: No Tag found with id: [" + tag.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
 		}
 
 		if (StringUtils.isEmpty(tag.getCreatedBy())) {
 			tag.setCreatedBy(existing.getCreatedBy());
 		}
+
 		if (tag.getCreateTime() == null) {
 			tag.setCreateTime(existing.getCreateTime());
 		}
+
 		if (StringUtils.isEmpty(tag.getGuid())) {
 			tag.setGuid(existing.getGuid());
 		}
 
-		deleteTagAttributes(existing.getId());
+		RangerTag ret = rangerTagService.update(tag);
 
-		createTagAttributes(tag);
-
-		ret = rangerTagService.update(tag);
+		deleteTagAttributes(existing.getId());
+		createTagAttributes(existing.getId(), tag.getAttributeValues());
 
 		ret = rangerTagService.read(ret.getId());
 
-
-
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("<== TagDBStore.updateTag(" + tag + ") : " + ret);
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
 	public void deleteTagById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.deleteTagById(" + id + ")");
+		}
 
-		throw new Exception("Not implemented");
-
-		/*
 		RangerTag tag = rangerTagService.read(id);
+
 		deleteTagAttributes(id);
+
 		rangerTagService.delete(tag);
-		*/
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteTagById(" + id + ")");
+		}
 	}
 
 	@Override
 	public RangerTag getTagById(Long id) throws Exception {
-		throw new Exception("Not implemented");
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagById(" + id + ")");
+		}
 
-		/*
-		RangerTag ret = null;
+		RangerTag ret = rangerTagService.read(id);
 
-		ret = rangerTagService.read(id);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagById(" + id + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public RangerTag getTagByGuid(String guid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagByGuid(" + guid + ")");
+		}
+
+		RangerTag ret = rangerTagService.getTagByGuid(guid);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagByGuid(" + guid + "): " + ret);
+		}
 
 		return ret;
-		*/
 	}
 
 	@Override
 	public List<RangerTag> getTagsByName(String name) throws Exception {
-		throw new Exception("Not implemented");
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagsByName(" + name + ")");
+		}
 
-		/*
 		List<RangerTag> ret = null;
 
 		if (StringUtils.isNotBlank(name)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_NAME, name);
-			ret = getTags(filter);
-		} else {
-			ret = null;
+			ret = rangerTagService.getTagsByName(name);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagsByName(" + name + "): count=" + (ret == null ? 0 : ret.size()));
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
-	public List<RangerTag> getTagsByExternalId(String externalId) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTag> getTagsForResourceId(Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagsForResourceId(" + resourceId + ")");
+		}
 
-		/*
 		List<RangerTag> ret = null;
 
-		if (StringUtils.isNotBlank(externalId)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_EXTERNAL_ID, externalId);
-			ret = getTags(filter);
-		} else {
-			ret = null;
+		if (resourceId != null) {
+			ret = rangerTagService.getTagsForResourceId(resourceId);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
-	public List<RangerTag> getTags(SearchFilter filter) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTag> getTagsForResourceGuid(String resourceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagsForResourceGuid(" + resourceGuid + ")");
+		}
 
-		/*
 		List<RangerTag> ret = null;
 
-		ret = rangerTagService.searchRangerTags(filter).getList();
+		if (resourceGuid != null) {
+			ret = rangerTagService.getTagsForResourceGuid(resourceGuid);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagsForResourceGuid(" + resourceGuid + "): count=" + (ret == null ? 0 : ret.size()));
+		}
 
 		return ret;
-		*/
 	}
 
-
 	@Override
-	public RangerServiceResource createServiceResource(RangerServiceResource resource) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTag> getTags(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTags(" + filter + ")");
+		}
+
+		List<RangerTag> ret = rangerTagService.searchRangerTags(filter).getList();
 
-		/*
 		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTags(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
 
-			LOG.debug("==> TagDBStore.createResource(" + resource + ")");
+	@Override
+	public PList<RangerTag> getPaginatedTags(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getPaginatedTags(" + filter + ")");
 		}
-		throw new Exception("Not implemented");
 
-		RangerServiceResource ret = null;
+		PList<RangerTag> ret = rangerTagService.searchRangerTags(filter);
 
-		try {
-			ret = rangerTaggedResourceService.create(resource);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getPaginatedTags(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
 
-			ret = rangerTaggedResourceService.read(ret.getId());
+		return ret;
+	}
 
-			createResourceSpecForResource(ret);
 
-		} catch (Exception e) {
-			throw errorUtil.createRESTException("failed to save resource [" + resource.getId() + "]", MessageEnums.ERROR_CREATING_OBJECT);
+	@Override
+	public RangerServiceResource createServiceResource(RangerServiceResource resource) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.createServiceResource(" + resource + ")");
 		}
 
+		// TODO: update resource signature
+		RangerServiceResource ret = rangerServiceResourceService.create(resource);
+
+		createResourceSpecForResource(ret.getId(), resource);
+
+		ret = rangerServiceResourceService.read(ret.getId());
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagDBStore.createResource(" + resource + ")");
+			LOG.debug("<== TagDBStore.createServiceResource(" + resource + ")");
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
 	public RangerServiceResource updateServiceResource(RangerServiceResource resource) throws Exception {
-		throw new Exception("Not implemented");
-
-		/*
-
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagDBStore.updateResource(" + resource + ")");
 		}
 
-		throw new Exception("Not implemented");
-
-		RangerServiceResource ret = null;
-
-		RangerServiceResource existing = rangerTaggedResourceService.read(resource.getId());
-
+		RangerServiceResource existing = rangerServiceResourceService.read(resource.getId());
 
 		if (existing == null) {
-			throw errorUtil.createRESTException("failed to update tag [" + resource.getId() + "], Reason: No resource found with id: [" + resource.getId() + "]",
-					MessageEnums.DATA_NOT_UPDATABLE);
+			throw errorUtil.createRESTException("failed to update tag [" + resource.getId() + "], Reason: No resource found with id: [" + resource.getId() + "]", MessageEnums.DATA_NOT_UPDATABLE);
 		}
 
 		if (StringUtils.isEmpty(resource.getCreatedBy())) {
 			resource.setCreatedBy(existing.getCreatedBy());
 		}
+
 		if (resource.getCreateTime() == null) {
 			resource.setCreateTime(existing.getCreateTime());
 		}
+
 		if (StringUtils.isEmpty(resource.getGuid())) {
 			resource.setGuid(existing.getGuid());
 		}
 
-		ret = rangerTaggedResourceService.update(resource);
-
-		ret = rangerTaggedResourceService.read(ret.getId());
-
-		updateResourceSpecForResource(ret);
+		// TODO: update resource signature
+		rangerServiceResourceService.update(resource);
+		deleteResourceSpecForResource(existing.getId());
+		createResourceSpecForResource(existing.getId(), resource);
 
+		RangerServiceResource ret = rangerServiceResourceService.read(existing.getId());
 
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("<== TagDBStore.updateResource(" + resource + ") : " + ret);
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
 	public void deleteServiceResourceById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.deleteServiceResourceById(" + id + ")");
+		}
 
-		throw new Exception("Not implemented");
+		RangerServiceResource resource = getServiceResourceById(id);
 
-		/*
-		XXTaggedResource taggedRes = daoManager.getXXTaggedResource().getById(id);
-		if (taggedRes == null) {
-			throw errorUtil.createRESTException("No Resource exists with Id: " + id, MessageEnums.DATA_NOT_FOUND);
+		if(resource != null) {
+			deleteResourceSpecForResource(resource.getId());
+			rangerServiceResourceService.delete(resource);
 		}
 
-		// Remove taggedResourceValue
-		deleteResourceValue(id);
-
-		// Remove taggedResource
-		daoManager.getXXTaggedResource().remove(id);
-		*/
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteServiceResourceById(" + id + ")");
+		}
 	}
 
 	@Override
-	public List<RangerServiceResource> getServiceResourcesByExternalId(String externalId) throws Exception {
-
-		throw new Exception("Not implemented");
-
-		/*
-		List<RangerServiceResource> ret = null;
+	public RangerServiceResource getServiceResourceById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getServiceResourceById(" + id + ")");
+		}
 
+		RangerServiceResource ret = rangerServiceResourceService.read(id);
 
-		if (StringUtils.isNotBlank(externalId)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_EXTERNAL_ID, externalId);
-			ret = getServiceResources(filter);
-		} else {
-			ret = null;
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getServiceResourceById(" + id + "): " + ret);
 		}
 
 		return ret;
-		*/
 	}
 
 	@Override
-	public RangerServiceResource getServiceResourceById(Long id) throws Exception {
+	public RangerServiceResource getServiceResourceByGuid(String guid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getServiceResourceByGuid(" + guid + ")");
+		}
 
-		throw new Exception("Not implemented");
+		RangerServiceResource ret = rangerServiceResourceService.getServiceResourceByGuid(guid);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getServiceResourceByGuid(" + guid + "): " + ret);
+		}
 
-		/*
-		RangerServiceResource ret = null;
-		ret = rangerTaggedResourceService.read(id);
 		return ret;
-		*/
 	}
 
+	@Override
+	public List<RangerServiceResource> getServiceResourcesByServiceAndResourceSpec(String serviceName, Map<String, RangerPolicyResource> resourceSpec) throws Exception {
+		// TODO Auto-generated method stub
+		return null;
+	}
 
 	@Override
-	public List<RangerServiceResource> getServiceResourcesByServiceAndResourceSpec(String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerServiceResource> getServiceResources(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getServiceResources(" + filter + ")");
+		}
+
+		List<RangerServiceResource> ret = rangerServiceResourceService.searchServiceResources(filter).getList();
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getServiceResources(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
-	public List<RangerServiceResource> getServiceResources(SearchFilter filter) throws Exception{
+	public PList<RangerServiceResource> getPaginatedServiceResources(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getPaginatedServiceResources(" + filter + ")");
+		}
 
-		throw new Exception("Not implemented");
+		PList<RangerServiceResource> ret = rangerServiceResourceService.searchServiceResources(filter);
 
-		/*
-		List<RangerServiceResource> ret = null;
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getPaginatedServiceResources(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
 
-		ret = rangerTaggedResourceService.searchRangerTaggedResources(filter).getList();
 		return ret;
-		*/
 	}
 
+
 	@Override
 	public RangerTagResourceMap createTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception {
-		throw new Exception("Not implemented");
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.createTagResourceMap(" + tagResourceMap + ")");
+		}
+
+		RangerTagResourceMap ret = rangerTagResourceMapService.create(tagResourceMap);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.createTagResourceMap(" + tagResourceMap + "): " + ret);
+		}
+
+		return ret;
 	}
 
 	@Override
 	public void deleteTagResourceMapById(Long id) throws Exception {
-		throw new Exception("Not implemented");
-	}
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.deleteTagResourceMapById(" + id + ")");
+		}
 
-	@Override
-	public List<RangerTagResourceMap> getTagResourceMap(String externalResourceId, String externalTagId) throws Exception {
-		throw new Exception("Not implemented");
+		RangerTagResourceMap tagResourceMap = rangerTagResourceMapService.read(id);
+
+		rangerTagResourceMapService.delete(tagResourceMap);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteTagResourceMapById(" + id + ")");
+		}
 	}
 
 	@Override
 	public RangerTagResourceMap getTagResourceMapById(Long id) throws Exception {
-		throw new Exception("Not implemented");
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapById(" + id + ")");
+		}
+
+		RangerTagResourceMap ret = rangerTagResourceMapService.read(id);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapById(" + id + ")");
+		}
+
+		return ret;
 	}
 
+	@Override
+	public List<RangerTagResourceMap> getTagResourceMapsForTagId(Long tagId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapsForTagId(" + tagId + ")");
+		}
+
+		List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByTagId(tagId);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapsForTagId(" + tagId + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
 
 	@Override
-	public List<RangerTagResourceMap> getTagResourceMaps(SearchFilter filter) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTagResourceMap> getTagResourceMapsForTagGuid(String tagGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapsForTagGuid(" + tagGuid + ")");
+		}
+
+		List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByTagGuid(tagGuid);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapsForTagGuid(" + tagGuid + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
-	public ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTagResourceMap> getTagResourceMapsForResourceId(Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapsForResourceId(" + resourceId + ")");
+		}
+
+		List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByResourceId(resourceId);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
-	public PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTagResourceMap> getTagResourceMapsForResourceGuid(String resourceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapsForResourceGuid(" + resourceGuid + ")");
+		}
+
+		List<RangerTagResourceMap> ret = rangerTagResourceMapService.getByResourceGuid(resourceGuid);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapsForResourceGuid(" + resourceGuid + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
-	public List<String> getTags(String serviceName) throws Exception {
-		throw new Exception("Not implemented");
+	public RangerTagResourceMap getTagResourceMapForTagAndResourceId(Long tagId, Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapsForTagAndResourceId(" + tagId + ", " + resourceId + ")");
+		}
+
+		RangerTagResourceMap ret = rangerTagResourceMapService.getByTagAndResourceId(tagId, resourceId);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapsForTagAndResourceId(" + tagId + ", " + resourceId + "): " + ret);
+		}
+
+		return ret;
 	}
 
 	@Override
-	public List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception {
-		throw new Exception("Not implemented");
+	public RangerTagResourceMap getTagResourceMapForTagAndResourceGuid(String tagGuid, String resourceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resourceGuid + ")");
+		}
+
+		RangerTagResourceMap ret = rangerTagResourceMapService.getByTagAndResourceGuid(tagGuid, resourceGuid);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resourceGuid + "): " + ret);
+		}
+
+		return ret;
 	}
 
+
 	@Override
-	public List<RangerTag> getTagsForServiceResource(Long resourceId) throws Exception {
-		throw new Exception("Not implemented");
+	public List<RangerTagResourceMap> getTagResourceMaps(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getTagResourceMaps(" + filter+ ")");
+		}
+
+		List<RangerTagResourceMap> ret = rangerTagResourceMapService.searchRangerTaggedResources(filter).getList();
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getTagResourceMaps(" + filter + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
-	public List<RangerTag> getTagsForServiceResourceByExtId(String resourceExtId) throws Exception {
-		throw new Exception("Not implemented");
+	public PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getPaginatedTagResourceMaps(" + filter+ ")");
+		}
+
+		PList<RangerTagResourceMap> ret = rangerTagResourceMapService.searchRangerTaggedResources(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getPaginatedTagResourceMaps(" + filter + "): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
+
+		return ret;
 	}
 
+
 	@Override
-	public List<RangerTagDef> getTagDefsByExternalId(String extId) throws Exception {
-		throw new Exception("Not implemented");
+	public ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + ")");
+		}
+
+		ServiceTags ret = null;
+
+		XXService xxService = daoManager.getXXService().findByName(serviceName);
+
+		if(xxService == null) {
+			throw new Exception("service does not exist. name=" + serviceName);
+		}
+
+		if(lastKnownVersion == null || xxService.getTagVersion() == null || !lastKnownVersion.equals(xxService.getTagVersion())) {
+			RangerServiceDef serviceDef = svcStore.getServiceDef(xxService.getType());
+
+			if(serviceDef == null) {
+				throw new Exception("service-def does not exist. id=" + xxService.getType());
+			}
+
+			List<RangerTagDef>          tagDefs         = rangerTagDefService.getTagDefsByServiceId(xxService.getId());
+			List<RangerTag>             tags            = rangerTagService.getTagsByServiceId(xxService.getId());
+			List<RangerServiceResource> resources       = rangerServiceResourceService.getTaggedResourcesInServiceId(xxService.getId());
+			List<RangerTagResourceMap>  tagResourceMaps = rangerTagResourceMapService.getTagResourceMapsByServiceId(xxService.getId());
+
+			Map<Long, RangerTagDef> tagDefMap        = new HashMap<Long, RangerTagDef>();
+			Map<Long, RangerTag>    tagMap           = new HashMap<Long, RangerTag>();
+			Map<Long, List<Long>>   resourceToTagIds = new HashMap<Long, List<Long>>();
+			
+			if(CollectionUtils.isNotEmpty(tagDefs)) {
+				for(RangerTagDef tagDef : tagDefs) {
+					tagDefMap.put(tagDef.getId(), tagDef);
+				}
+			}
+
+			if(CollectionUtils.isNotEmpty(tags)) {
+				for(RangerTag tag : tags) {
+					tagMap.put(tag.getId(), tag);
+				}
+			}
+
+			if(CollectionUtils.isNotEmpty(tagResourceMaps)) {
+				Long       resourceId = null;
+				List<Long> tagIds     = null;
+
+				for(RangerTagResourceMap tagResourceMap : tagResourceMaps) {
+					if(! tagResourceMap.getResourceId().equals(resourceId)) {
+						if(resourceId != null) {
+							resourceToTagIds.put(resourceId, tagIds);
+						}
+
+						resourceId = tagResourceMap.getResourceId();
+						tagIds     = new ArrayList<Long>();
+					}
+
+					tagIds.add(tagResourceMap.getTagId());
+				}
+				
+				if(resourceId != null) {
+					resourceToTagIds.put(resourceId, tagIds);
+				}
+			}
+
+			ret = new ServiceTags();
+			ret.setServiceName(xxService.getName());
+			ret.setTagVersion(xxService.getTagVersion());
+			ret.setTagUpdateTime(xxService.getTagUpdateTime());
+			ret.setTagDefinitions(tagDefMap);
+			ret.setTags(tagMap);
+			ret.setServiceResources(resources);
+			ret.setResourceToTagIds(resourceToTagIds);
+		}
+
+		if(LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + ")");
+		}
+
+		return ret;
 	}
 
 	@Override
-	public List<RangerTagResourceMap> getTagResourceMapsByTagId(Long tagId) throws Exception {
+	public List<String> getTags(String serviceName) throws Exception {
 		throw new Exception("Not implemented");
 	}
 
 	@Override
-	public List<RangerTagResourceMap> getTagResourceMapsByResourceId(Long resourceId) throws Exception {
+	public List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception {
 		throw new Exception("Not implemented");
 	}
+
+	private List<XXTagAttributeDef> createTagAttributeDefs(Long tagDefId, List<RangerTagAttributeDef> tagAttrDefList) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.createTagAttributeDefs(" + tagDefId + ", attributeDefCount=" + (tagAttrDefList == null ? 0 : tagAttrDefList.size()) + ")");
+		}
+
+		if (tagDefId == null) {
+			throw errorUtil.createRESTException("TagDBStore.createTagAttributeDefs(): Error creating tag-attr def. tagDefId can not be null.", MessageEnums.ERROR_CREATING_OBJECT);
+		}
+
+		List<XXTagAttributeDef> ret = new ArrayList<XXTagAttributeDef>();
+
+		if (CollectionUtils.isNotEmpty(tagAttrDefList)) {
+			for (RangerTagDef.RangerTagAttributeDef attrDef : tagAttrDefList) {
+				XXTagAttributeDef xAttrDef = new XXTagAttributeDef();
+
+				xAttrDef.setGuid(guidUtil.genGUID());
+				xAttrDef.setTagDefId(tagDefId);
+				xAttrDef.setName(attrDef.getName());
+				xAttrDef.setType(attrDef.getType());
+				xAttrDef = (XXTagAttributeDef) rangerAuditFields.populateAuditFieldsForCreate(xAttrDef);
+
+				xAttrDef = daoManager.getXXTagAttributeDef().create(xAttrDef);
+
+				ret.add(xAttrDef);
+			}
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.createTagAttributeDefs(" + tagDefId + ", attributeDefCount=" + (tagAttrDefList == null ? 0 : tagAttrDefList.size()) + "): retCount=" + ret.size());
+		}
+
+		return ret;
+	}
+
+	private void deleteTagAttributeDefs(Long tagDefId) {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagDBStore.deleteTagAttributeDefs(" + tagDefId + ")");
+		}
+
+		if (tagDefId != null) {
+			List<XXTagAttributeDef> tagAttrDefList = daoManager.getXXTagAttributeDef().findByTagDefId(tagDefId);
+
+			if (CollectionUtils.isNotEmpty(tagAttrDefList)) {
+				for (XXTagAttributeDef xAttrDef : tagAttrDefList) {
+					if (LOG.isDebugEnabled()) {
+						LOG.debug("Deleting tag-attribute def [name=" + xAttrDef.getName() + "; id=" + xAttrDef.getId() + "]");
+					}
+					daoManager.getXXTagAttributeDef().remove(xAttrDef);
+				}
+			}
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagDBStore.deleteTagAttributeDefs(" + tagDefId + ")");
+		}
+	}
+
+	private List<XXTagAttribute> createTagAttributes(Long tagId, Map<String, String> attributeValues) {
+		List<XXTagAttribute> ret = new ArrayList<XXTagAttribute>();
+
+		if(MapUtils.isNotEmpty(attributeValues)) {
+			for (Map.Entry<String, String> attr : attributeValues.entrySet()) {
+				XXTagAttribute xTagAttr = new XXTagAttribute();
+
+				xTagAttr.setTagId(tagId);
+				xTagAttr.setName(attr.getKey());
+				xTagAttr.setValue(attr.getValue());
+				xTagAttr.setGuid(guidUtil.genGUID());
+				xTagAttr = (XXTagAttribute) rangerAuditFields.populateAuditFieldsForCreate(xTagAttr);
+
+				xTagAttr = daoManager.getXXTagAttribute().create(xTagAttr);
+
+				ret.add(xTagAttr);
+			}
+		}
+
+		return ret;
+	}
+
+	private void deleteTagAttributes(Long tagId) {
+		List<XXTagAttribute> tagAttrList = daoManager.getXXTagAttribute().findByTagId(tagId);
+		for (XXTagAttribute tagAttr : tagAttrList) {
+			daoManager.getXXTagAttribute().remove(tagAttr);
+		}
+	}
+
+	private void deleteResourceSpecForResource(Long resourceId) {
+		List<XXServiceResourceElement> resElements = daoManager.getXXServiceResourceElement().findByResourceId(resourceId);
+		
+		if(CollectionUtils.isNotEmpty(resElements)) {
+			for(XXServiceResourceElement resElement : resElements) {
+				List<XXServiceResourceElementValue> elementValues = daoManager.getXXServiceResourceElementValue().findByResValueId(resElement.getId());
+				
+				if(CollectionUtils.isNotEmpty(elementValues)) {
+					for(XXServiceResourceElementValue elementValue : elementValues) {
+						daoManager.getXXServiceResourceElementValue().remove(elementValue.getId());
+					}
+				}
+				
+				daoManager.getXXServiceResourceElement().remove(resElement.getId());
+			}
+		}
+	}
+
+	private void createResourceSpecForResource(Long resourceId, RangerServiceResource resource) {
+		String serviceName = resource.getServiceName();
+
+		XXService xService = daoManager.getXXService().findByName(serviceName);
+
+		if (xService == null) {
+			throw errorUtil.createRESTException("No Service found with name: " + serviceName, MessageEnums.ERROR_CREATING_OBJECT);
+		}
+
+		XXServiceDef xServiceDef = daoManager.getXXServiceDef().getById(xService.getType());
+
+		if (xServiceDef == null) {
+			throw errorUtil.createRESTException("No Service-Def found with ID: " + xService.getType(), MessageEnums.ERROR_CREATING_OBJECT);
+		}
+
+		Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = resource.getResourceSpec();
+
+		for (Map.Entry<String, RangerPolicyResource> resSpec : resourceSpec.entrySet()) {
+			XXResourceDef xResDef = daoManager.getXXResourceDef().findByNameAndServiceDefId(resSpec.getKey(), xServiceDef.getId());
+
+			if (xResDef == null) {
+				LOG.error("TagDBStore.createResource: ResourceType is not valid [" + resSpec.getKey() + "]");
+				throw errorUtil.createRESTException("Resource Type is not valid [" + resSpec.getKey() + "]", MessageEnums.DATA_NOT_FOUND);
+			}
+
+			RangerPolicyResource policyRes = resSpec.getValue();
+
+			XXServiceResourceElement resourceElement = new XXServiceResourceElement();
+			resourceElement.setIsExcludes(policyRes.getIsExcludes());
+			resourceElement.setIsRecursive(policyRes.getIsRecursive());
+			resourceElement.setResDefId(xResDef.getId());
+			resourceElement.setResourceId(resourceId);
+			resourceElement.setGuid(guidUtil.genGUID());
+
+			resourceElement = (XXServiceResourceElement) rangerAuditFields.populateAuditFieldsForCreate(resourceElement);
+
+			resourceElement = daoManager.getXXServiceResourceElement().create(resourceElement);
+
+			int sortOrder = 1;
+			for (String resVal : policyRes.getValues()) {
+				XXServiceResourceElementValue resourceElementValue = new XXServiceResourceElementValue();
+				resourceElementValue.setResElementId(resourceElement.getId());
+				resourceElementValue.setValue(resVal);
+				resourceElementValue.setSortOrder(sortOrder);
+				resourceElementValue.setGuid(guidUtil.genGUID());
+				resourceElementValue = (XXServiceResourceElementValue) rangerAuditFields.populateAuditFieldsForCreate(resourceElementValue);
+
+				resourceElementValue = daoManager.getXXServiceResourceElementValue().create(resourceElementValue);
+				sortOrder++;
+			}
+		}
+	}
+
+	private void deleteResourceValue(Long resourceId) {
+		List<XXServiceResourceElement> taggedResValueList = daoManager.getXXServiceResourceElement().findByResourceId(resourceId);
+		for (XXServiceResourceElement taggedResValue : taggedResValueList) {
+			List<XXServiceResourceElementValue> taggedResValueMapList = daoManager.getXXServiceResourceElementValue().findByResValueId(taggedResValue.getId());
+			for (XXServiceResourceElementValue taggedResValueMap : taggedResValueMapList) {
+				daoManager.getXXServiceResourceElementValue().remove(taggedResValueMap);
+			}
+			daoManager.getXXServiceResourceElement().remove(taggedResValue);
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
index 21facb0..488ba8f 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
@@ -552,17 +552,17 @@ public class AppConstants extends RangerCommonEnums {
 	 */
 	public static final int CLASS_TYPE_XA_TAG_ATTR_DEF = 1042;
 	/**
-	 * Class type of XXTaggedResource
+	 * Class type of XXServiceResource
 	 */
-	public static final int CLASS_TYPE_XA_TAGGED_RESOURCE = 1043;
+	public static final int CLASS_TYPE_XA_SERVICE_RESOURCE = 1043;
 	/**
-	 * Class type of XXTaggedResourceValue
+	 * Class type of XXServiceResourceElement
 	 */
-	public static final int CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE = 1044;
+	public static final int CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT = 1044;
 	/**
-	 * Class type of XXTaggedResourceValueMap
+	 * Class type of XXServiceResourceElementValue
 	 */
-	public static final int CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE_MAP = 1045;
+	public static final int CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT_VALUE = 1045;
 	/**
 	 * Class type of XXTag
 	 */

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
index da01853..d9cf87a 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/RangerDaoManagerBase.java
@@ -29,8 +29,6 @@ import org.apache.log4j.Logger;
 import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.db.BaseDao;
-import org.apache.ranger.entity.XXTagDef;
-import org.apache.ranger.entity.XXTaggedResource;
 import org.springframework.beans.factory.annotation.Autowired;
 
 
@@ -170,14 +168,14 @@ public abstract class RangerDaoManagerBase {
 		if (classType == AppConstants.CLASS_TYPE_XA_TAG_ATTR_DEF) {
 			return getXXTagAttributeDef();
 		}
-		if (classType == AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE) {
-			return getXXTaggedResource();
+		if (classType == AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE) {
+			return getXXServiceResource();
 		}
-		if (classType == AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE) {
-			return getXXTaggedResourceValue();
+		if (classType == AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT) {
+			return getXXServiceResourceElement();
 		}
-		if (classType == AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE_MAP) {
-			return getXXTaggedResourceValueMap();
+		if (classType == AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT_VALUE) {
+			return getXXServiceResourceElementValue();
 		}
 		if (classType == AppConstants.CLASS_TYPE_XA_TAG) {
 			return getXXTag();
@@ -324,14 +322,14 @@ public abstract class RangerDaoManagerBase {
 		if (className.equals("XXTagAttributeDef")) {
 			return getXXTagAttributeDef();
 		}
-		if (className.equals("XXTaggedResource")) {
-			return getXXTaggedResource();
+		if (className.equals("XXServiceResource")) {
+			return getXXServiceResource();
 		}
-		if (className.equals("XXTaggedResourceValue")) {
-			return getXXTaggedResourceValue();
+		if (className.equals("XXServiceResourceElement")) {
+			return getXXServiceResourceElement();
 		}
-		if (className.equals("XXTaggedResourceValueMap")) {
-			return getXXTaggedResourceValueMap();
+		if (className.equals("XXServiceResourceElementValue")) {
+			return getXXServiceResourceElementValue();
 		}
 		if (className.equals("XXTag")) {
 			return getXXTag();
@@ -526,16 +524,16 @@ public abstract class RangerDaoManagerBase {
 		return new XXTagAttributeDefDao(this);
 	}
 
-	public XXTaggedResourceDao getXXTaggedResource() {
-		return new XXTaggedResourceDao(this);
+	public XXServiceResourceDao getXXServiceResource() {
+		return new XXServiceResourceDao(this);
 	}
 
-	public XXTaggedResourceValueDao getXXTaggedResourceValue() {
-		return new XXTaggedResourceValueDao(this);
+	public XXServiceResourceElementDao getXXServiceResourceElement() {
+		return new XXServiceResourceElementDao(this);
 	}
 
-	public XXTaggedResourceValueMapDao getXXTaggedResourceValueMap() {
-		return new XXTaggedResourceValueMapDao(this);
+	public XXServiceResourceElementValueDao getXXServiceResourceElementValue() {
+		return new XXServiceResourceElementValueDao(this);
 	}
 
 	public XXTagDao getXXTag() {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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
new file mode 100644
index 0000000..63cdc6e
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceDao.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.db;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.NoResultException;
+
+import org.apache.ranger.authorization.utils.StringUtil;
+import org.apache.ranger.common.db.BaseDao;
+import org.apache.ranger.entity.XXServiceResource;
+
+public class XXServiceResourceDao extends BaseDao<XXServiceResource> {
+
+	public XXServiceResourceDao(RangerDaoManagerBase daoManager) {
+		super(daoManager);
+	}
+
+	public XXServiceResource findByGuid(String guid) {
+		if (StringUtil.isEmpty(guid)) {
+			return null;
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResource.findByGuid", tClass)
+					.setParameter("guid", guid).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
+	public List<XXServiceResource> findByServiceId(Long serviceId) {
+		if (serviceId == null) {
+			return new ArrayList<XXServiceResource>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResource.findByServiceId", tClass)
+					.setParameter("serviceId", serviceId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXServiceResource>();
+		}
+	}
+
+	public XXServiceResource findByServiceIdAndResourceSignature(Long serviceId, String resourceSignature) {
+		if (serviceId == null || StringUtil.isEmpty(resourceSignature)) {
+			return null;
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResource.findByServiceIdAndResourceSignature", tClass)
+					.setParameter("serviceId", serviceId)
+					.setParameter("resourceSignature", resourceSignature).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
+	public List<XXServiceResource> findTaggedResourcesInServiceId(Long serviceId) {
+		if (serviceId == null) {
+			return new ArrayList<XXServiceResource>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResource.findTaggedResourcesInServiceId", tClass)
+					.setParameter("serviceId", serviceId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXServiceResource>();
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java
new file mode 100644
index 0000000..8e2baab
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementDao.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.db;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.NoResultException;
+
+import org.apache.ranger.common.db.BaseDao;
+import org.apache.ranger.entity.XXServiceResourceElement;
+
+public class XXServiceResourceElementDao extends BaseDao<XXServiceResourceElement> {
+
+	public XXServiceResourceElementDao(RangerDaoManagerBase daoManager) {
+		super(daoManager);
+	}
+
+	public List<XXServiceResourceElement> findByResourceId(Long resourceId) {
+		if (resourceId == null) {
+			return new ArrayList<XXServiceResourceElement>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResourceElement.findByResourceId", tClass)
+					.setParameter("resourceId", resourceId)
+					.getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXServiceResourceElement>();
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java
new file mode 100644
index 0000000..04942a7
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceResourceElementValueDao.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.db;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.NoResultException;
+
+import org.apache.ranger.common.db.BaseDao;
+import org.apache.ranger.entity.XXServiceResourceElementValue;
+
+public class XXServiceResourceElementValueDao extends BaseDao<XXServiceResourceElementValue> {
+
+	public XXServiceResourceElementValueDao(RangerDaoManagerBase daoManager) {
+		super(daoManager);
+	}
+
+	public List<XXServiceResourceElementValue> findByResValueId(Long resElementId) {
+		if (resElementId == null) {
+			return new ArrayList<XXServiceResourceElementValue>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResourceElementValue.findByResElementId", tClass)
+					.setParameter("resElementId", resElementId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXServiceResourceElementValue>();
+		}
+	}
+	
+	@SuppressWarnings("unchecked")
+	public List<String> findValuesByResElementId(Long resElementId) {
+		if (resElementId == null) {
+			return new ArrayList<String>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXServiceResourceElementValue.findValuesByResElementId")
+					.setParameter("resElementId", resElementId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<String>();
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 d8562d2..667238f 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
@@ -20,10 +20,13 @@
 package org.apache.ranger.db;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.NoResultException;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXTag;
 
@@ -33,13 +36,13 @@ public class XXTagDao extends BaseDao<XXTag> {
 		super(daoManager);
 	}
 
-	public List<XXTag> findByTaggedResource(Long taggedResId) {
-		if (taggedResId == null) {
+	public List<XXTag> findByResourceId(Long resourceId) {
+		if (resourceId == null) {
 			return new ArrayList<XXTag>();
 		}
 		try {
-			return getEntityManager().createNamedQuery("XXTag.findByTaggedResource", tClass)
-					.setParameter("taggedResId", taggedResId).getResultList();
+			return getEntityManager().createNamedQuery("XXTag.findByResourceId", tClass)
+					.setParameter("resourceId", resourceId).getResultList();
 		} catch (NoResultException e) {
 			return new ArrayList<XXTag>();
 		}
@@ -58,16 +61,67 @@ public class XXTagDao extends BaseDao<XXTag> {
 		}
 	}
 
-	public List<XXTag> findTagsByExternalId(String externalId) {
-		if (externalId == null) {
+	public XXTag findByGuid(String guid) {
+		if (StringUtil.isEmpty(guid)) {
+			return null;
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTag.findByGuid", tClass)
+					.setParameter("guid", guid).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
+	public List<XXTag> findByName(String name) {
+		if (StringUtils.isEmpty(name)) {
+			return new ArrayList<XXTag>();
+		}
+
+		try {
+			return getEntityManager().createNamedQuery("XXTag.findByName", tClass)
+					.setParameter("name", name).getResultList();
+		} catch (NoResultException e) {
 			return new ArrayList<XXTag>();
 		}
+	}
+
+	public List<XXTag> findForResourceId(Long resourceId) {
+		if (resourceId == null) {
+			return new ArrayList<XXTag>();
+		}
+
 		try {
-			return getEntityManager().createNamedQuery("XXTag.findTagsByExternalId", tClass)
-					.setParameter("externalId", externalId).getResultList();
+			return getEntityManager().createNamedQuery("XXTag.findByResourceId", tClass)
+					.setParameter("resourceId", resourceId).getResultList();
 		} catch (NoResultException e) {
 			return new ArrayList<XXTag>();
 		}
 	}
 
+	public List<XXTag> findForResourceGuid(String resourceGuid) {
+		if (StringUtils.isEmpty(resourceGuid)) {
+			return new ArrayList<XXTag>();
+		}
+
+		try {
+			return getEntityManager().createNamedQuery("XXTag.findByResourceGuid", tClass)
+					.setParameter("resourceGuid", resourceGuid).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTag>();
+		}
+	}
+
+	public List<XXTag> findByServiceId(Long serviceId) {
+		if (serviceId == null) {
+			return new ArrayList<XXTag>();
+		}
+
+		try {
+			return getEntityManager().createNamedQuery("XXTag.findByServiceId", tClass)
+					.setParameter("serviceId", serviceId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTag>();
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java
index 971b589..f18fea8 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagDefDao.java
@@ -20,6 +20,7 @@
 package org.apache.ranger.db;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.NoResultException;
@@ -34,6 +35,19 @@ public class XXTagDefDao extends BaseDao<XXTagDef> {
 		super(daoManager);
 	}
 
+	public XXTagDef findByGuid(String guid) {
+		if (StringUtils.isEmpty(guid)) {
+			return null;
+		}
+
+		try {
+			return getEntityManager().createNamedQuery("XXTagDef.findByGuid", tClass)
+					.setParameter("guid", guid).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
 	public List<XXTagDef> findByName(String name) {
 		if (StringUtils.isEmpty(name)) {
 			return new ArrayList<XXTagDef>();
@@ -47,4 +61,35 @@ public class XXTagDefDao extends BaseDao<XXTagDef> {
 		}
 	}
 
+	public List<XXTagDef> findByServiceId(Long serviceId) {
+		if (serviceId == null) {
+			return new ArrayList<XXTagDef>();
+		}
+
+		try {
+			return getEntityManager().createNamedQuery("XXTagDef.findByServiceId", tClass)
+					.setParameter("serviceId", serviceId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTagDef>();
+		}
+	}
+
+	public void updateServiceForTagDefUpdate(Long tagDefId, Date updateTime) {
+		if (tagDefId == null) {
+			return;
+		}
+
+		if(updateTime == null) {
+			updateTime = new Date();
+		}
+
+		try {
+			getEntityManager().createNamedQuery("XXTagDef.updateTagVersionInService", tClass)
+					.setParameter("tagDefId", tagDefId)
+					.setParameter("tagUpdateTime", updateTime)
+					.executeUpdate();
+		} catch (NoResultException e) {
+			return;
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXTagResourceMapDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTagResourceMapDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTagResourceMapDao.java
index 57ac5e8..1db0cef 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTagResourceMapDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXTagResourceMapDao.java
@@ -20,10 +20,12 @@
 package org.apache.ranger.db;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.NoResultException;
 
+import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.common.db.BaseDao;
 import org.apache.ranger.entity.XXTagResourceMap;
 
@@ -33,16 +35,108 @@ public class XXTagResourceMapDao extends BaseDao<XXTagResourceMap> {
 		super(daoManager);
 	}
 
-	public List<XXTagResourceMap> findByTaggedResourceId(Long taggedResId) {
-		if (taggedResId == null) {
+	public List<XXTagResourceMap> findByResourceId(Long resourceId) {
+		if (resourceId == null) {
 			return new ArrayList<XXTagResourceMap>();
 		}
 		try {
-			return getEntityManager().createNamedQuery("XXTagResourceMap.findByTaggedResourceId", tClass)
-					.setParameter("taggedResId", taggedResId).getResultList();
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByResourceId", tClass)
+					.setParameter("resourceId", resourceId).getResultList();
 		} catch (NoResultException e) {
 			return new ArrayList<XXTagResourceMap>();
 		}
 	}
 
+	public List<XXTagResourceMap> findByResourceGuid(String resourceGuid) {
+		if (StringUtil.isEmpty(resourceGuid)) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByResourceGuid", tClass)
+					.setParameter("resourceGuid", resourceGuid).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+	}
+
+	public List<XXTagResourceMap> findByTagId(Long tagId) {
+		if (tagId == null) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByTagId", tClass)
+					.setParameter("tagId", tagId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+	}
+
+	public List<XXTagResourceMap> findByTagGuid(String tagGuid) {
+		if (StringUtil.isEmpty(tagGuid)) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByTagGuid", tClass)
+					.setParameter("tagGuid", tagGuid).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+	}
+
+	public XXTagResourceMap findByTagAndResourceId(Long tagId, Long resourceId) {
+		if (tagId == null || resourceId == null) {
+			return null;
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByTagAndResourceId", tClass)
+					.setParameter("tagId", tagId)
+					.setParameter("resourceId", resourceId).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
+	public XXTagResourceMap findByTagAndResourceGuid(String tagGuid, String resourceGuid) {
+		if (tagGuid == null || resourceGuid == null) {
+			return null;
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByTagAndResourceGuid", tClass)
+					.setParameter("tagGuid", tagGuid)
+					.setParameter("resourceGuid", resourceGuid).getSingleResult();
+		} catch (NoResultException e) {
+			return null;
+		}
+	}
+
+	public List<XXTagResourceMap> findByServiceId(Long serviceId) {
+		if (serviceId == null) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+		try {
+			return getEntityManager().createNamedQuery("XXTagResourceMap.findByServiceId", tClass)
+					.setParameter("serviceId", serviceId).getResultList();
+		} catch (NoResultException e) {
+			return new ArrayList<XXTagResourceMap>();
+		}
+	}
+
+	public void updateServiceForTagUpdate(Long tagId, Date updateTime) {
+		if (tagId == null) {
+			return;
+		}
+
+		if(updateTime == null) {
+			updateTime = new Date();
+		}
+
+		try {
+			getEntityManager().createNamedQuery("XXTagResourceMap.updateTagVersionInService", tClass)
+					.setParameter("tagId", tagId)
+					.setParameter("tagUpdateTime", updateTime)
+					.executeUpdate();
+		} catch (NoResultException e) {
+			return;
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceDao.java
deleted file mode 100644
index b7c2b3e..0000000
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceDao.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.db;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.NoResultException;
-
-import org.apache.ranger.common.db.BaseDao;
-import org.apache.ranger.entity.XXTaggedResource;
-
-public class XXTaggedResourceDao extends BaseDao<XXTaggedResource> {
-
-	public XXTaggedResourceDao(RangerDaoManagerBase daoManager) {
-		super(daoManager);
-	}
-
-	public List<XXTaggedResource> findByServiceId(Long serviceId) {
-		if (serviceId == null) {
-			return new ArrayList<XXTaggedResource>();
-		}
-		try {
-			return getEntityManager().createNamedQuery("XXTaggedResource.findByServiceId", tClass)
-					.setParameter("serviceId", serviceId).getResultList();
-		} catch (NoResultException e) {
-			return new ArrayList<XXTaggedResource>();
-		}
-
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueDao.java
deleted file mode 100644
index 6f72a3c..0000000
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueDao.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.db;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.NoResultException;
-
-import org.apache.ranger.common.db.BaseDao;
-import org.apache.ranger.entity.XXTaggedResourceValue;
-
-public class XXTaggedResourceValueDao extends BaseDao<XXTaggedResourceValue> {
-
-	public XXTaggedResourceValueDao(RangerDaoManagerBase daoManager) {
-		super(daoManager);
-	}
-
-	public List<XXTaggedResourceValue> findByTaggedResId(Long taggedResId) {
-		if (taggedResId == null) {
-			return new ArrayList<XXTaggedResourceValue>();
-		}
-		try {
-			return getEntityManager().createNamedQuery("XXTaggedResourceValue.findByTaggedResId", tClass)
-					.setParameter("taggedResId", taggedResId)
-					.getResultList();
-		} catch (NoResultException e) {
-			return new ArrayList<XXTaggedResourceValue>();
-		}
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueMapDao.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueMapDao.java b/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueMapDao.java
deleted file mode 100644
index 016766f..0000000
--- a/security-admin/src/main/java/org/apache/ranger/db/XXTaggedResourceValueMapDao.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.db;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.NoResultException;
-
-import org.apache.ranger.common.db.BaseDao;
-import org.apache.ranger.entity.XXTaggedResourceValue;
-import org.apache.ranger.entity.XXTaggedResourceValueMap;
-
-public class XXTaggedResourceValueMapDao extends BaseDao<XXTaggedResourceValueMap> {
-
-	public XXTaggedResourceValueMapDao(RangerDaoManagerBase daoManager) {
-		super(daoManager);
-	}
-
-	public List<XXTaggedResourceValueMap> findByResValueId(Long resValueId) {
-		if (resValueId == null) {
-			return new ArrayList<XXTaggedResourceValueMap>();
-		}
-		try {
-			return getEntityManager().createNamedQuery("XXTaggedResourceValueMap.findByResValueId", tClass)
-					.setParameter("resValueId", resValueId).getResultList();
-		} catch (NoResultException e) {
-			return new ArrayList<XXTaggedResourceValueMap>();
-		}
-	}
-	
-	@SuppressWarnings("unchecked")
-	public List<String> findValuesByResValueId(Long resValueId) {
-		if (resValueId == null) {
-			return new ArrayList<String>();
-		}
-		try {
-			return getEntityManager().createNamedQuery("XXTaggedResourceValueMap.findValuesByResValueId")
-					.setParameter("resValueId", resValueId).getResultList();
-		} catch (NoResultException e) {
-			return new ArrayList<String>();
-		}
-	}
-
-}


[4/4] incubator-ranger git commit: RANGER-595: updated tag-store implementation; replaced externalId references with guid; service.tagVersion incremented on changes to tagging for the service-resources

Posted by ma...@apache.org.
RANGER-595: updated tag-store implementation; replaced externalId references with guid; service.tagVersion incremented on changes to tagging for the service-resources


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

Branch: refs/heads/tag-policy
Commit: 303f7b7023f2e20464186babf97c461ea598062c
Parents: 83cb21e
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Fri Aug 28 02:48:17 2015 -0700
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Fri Aug 28 14:54:02 2015 -0700

----------------------------------------------------------------------
 .../admin/client/RangerAdminRESTClient.java     |    2 +-
 .../plugin/model/RangerServiceResource.java     |   10 +-
 .../apache/ranger/plugin/model/RangerTag.java   |    7 +-
 .../ranger/plugin/model/RangerTagDef.java       |    1 +
 .../ranger/plugin/store/AbstractTagStore.java   |  324 +-----
 .../ranger/plugin/store/TagPredicateUtil.java   |   91 +-
 .../apache/ranger/plugin/store/TagStore.java    |   48 +-
 .../ranger/plugin/store/TagValidator.java       |  124 +--
 .../ranger/plugin/store/file/TagFileStore.java  |  866 ++++++++++++---
 .../apache/ranger/plugin/util/SearchFilter.java |   28 +-
 .../apache/ranger/plugin/util/ServiceTags.java  |   14 +-
 .../ranger/plugin/store/TestTagStore.java       |   24 +-
 .../016-updated-schema-for-tag-based-policy.sql |   93 +-
 .../java/org/apache/ranger/biz/TagDBStore.java  | 1011 +++++++++++-------
 .../org/apache/ranger/common/AppConstants.java  |   12 +-
 .../apache/ranger/db/RangerDaoManagerBase.java  |   38 +-
 .../apache/ranger/db/XXServiceResourceDao.java  |   85 ++
 .../ranger/db/XXServiceResourceElementDao.java  |   49 +
 .../db/XXServiceResourceElementValueDao.java    |   61 ++
 .../java/org/apache/ranger/db/XXTagDao.java     |   70 +-
 .../java/org/apache/ranger/db/XXTagDefDao.java  |   45 +
 .../apache/ranger/db/XXTagResourceMapDao.java   |  102 +-
 .../apache/ranger/db/XXTaggedResourceDao.java   |   49 -
 .../ranger/db/XXTaggedResourceValueDao.java     |   49 -
 .../ranger/db/XXTaggedResourceValueMapDao.java  |   62 --
 .../org/apache/ranger/entity/XXServiceBase.java |   74 ++
 .../apache/ranger/entity/XXServiceResource.java |  245 +++++
 .../ranger/entity/XXServiceResourceElement.java |  245 +++++
 .../entity/XXServiceResourceElementValue.java   |  220 ++++
 .../java/org/apache/ranger/entity/XXTag.java    |   86 --
 .../apache/ranger/entity/XXTagResourceMap.java  |   28 +-
 .../apache/ranger/entity/XXTaggedResource.java  |  245 -----
 .../ranger/entity/XXTaggedResourceValue.java    |  245 -----
 .../ranger/entity/XXTaggedResourceValueMap.java |  220 ----
 .../java/org/apache/ranger/rest/TagREST.java    |  174 ++-
 .../apache/ranger/rest/TagRESTConstants.java    |   31 +-
 .../ranger/service/RangerServiceDefService.java |    9 -
 .../service/RangerServiceResourceService.java   |   96 ++
 .../RangerServiceResourceServiceBase.java       |  112 ++
 .../ranger/service/RangerTagDefService.java     |   60 ++
 .../service/RangerTagResourceMapService.java    |  190 ++++
 .../RangerTagResourceMapServiceBase.java        |   75 ++
 .../apache/ranger/service/RangerTagService.java |   82 +-
 .../ranger/service/RangerTagServiceBase.java    |   33 +-
 .../service/RangerTaggedResourceService.java    |   51 -
 .../RangerTaggedResourceServiceBase.java        |  112 --
 .../resources/META-INF/jpa_named_queries.xml    |  122 ++-
 47 files changed, 3611 insertions(+), 2409 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java b/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
index 3f0c5dd..5ec7996 100644
--- a/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
+++ b/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
@@ -222,7 +222,7 @@ public class RangerAdminRESTClient implements RangerAdminClient {
 		}
 
 		if(LOG.isDebugEnabled()) {
-			LOG.debug("<==> RangerAdminRESTClient.getTaggedResources(" + lastKnownVersion + "): ");
+			LOG.debug("<== RangerAdminRESTClient.getServiceTagsIfUpdated(" + lastKnownVersion + "): ");
 		}
 
 		return ret;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceResource.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceResource.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceResource.java
index 3728f6d..c9e07eb 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceResource.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceResource.java
@@ -43,15 +43,15 @@ public class RangerServiceResource extends RangerBaseModelObject {
 	private String resourceSignature = null;
 
 
-	public RangerServiceResource(String externalId, String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec, String resourceSignature) {
+	public RangerServiceResource(String guid, String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec, String resourceSignature) {
 		super();
-		setGuid(externalId);
+		setGuid(guid);
 		setServiceName(serviceName);
 		setResourceSpec(resourceSpec);
 		setResourceSignature(resourceSignature);
 	}
-	public RangerServiceResource(String externalId, String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) {
-		this(externalId, serviceName, resourceSpec, null);
+	public RangerServiceResource(String guid, String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) {
+		this(guid, serviceName, resourceSpec, null);
 	}
 	public RangerServiceResource(String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) {
 		this(null, serviceName, resourceSpec, null);
@@ -94,7 +94,7 @@ public class RangerServiceResource extends RangerBaseModelObject {
 
 		sb.append("{ ");
 
-		sb.append("externalId={").append(getGuid()).append("} ");
+		sb.append("guid={").append(getGuid()).append("} ");
 		sb.append("serviceName={").append(serviceName).append("} ");
 
 		sb.append("resourceSpec={");

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 25dc24d..6e4685a 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
@@ -38,11 +38,12 @@ import java.util.Map;
 public  class RangerTag extends RangerBaseModelObject {
 	private static final long serialVersionUID = 1L;
 
-	private String name;
+	private String              name;
 	private Map<String, String> attributeValues;
 
 	public RangerTag(String guid, String name, Map<String, String> attributeValues) {
 		super();
+
 		setGuid(guid);
 		setName(name);
 		setAttributeValues(attributeValues);
@@ -82,10 +83,10 @@ public  class RangerTag extends RangerBaseModelObject {
 	}
 
 	public StringBuilder toString(StringBuilder sb) {
+		sb.append("RangerTag={");
 
-		sb.append("{ ");
+		super.toString(sb);
 
-		sb.append("guid={").append(getGuid()).append("} ");
 		sb.append("name={").append(name).append("} ");
 
 		sb.append("attributeValues={");

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java
index 0f58c96..bd9bbfa 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerTagDef.java
@@ -102,6 +102,7 @@ public class RangerTagDef extends RangerBaseModelObject {
     @XmlAccessorType(XmlAccessType.FIELD)
 
     public static class RangerTagAttributeDef implements java.io.Serializable {
+        private static final long serialVersionUID = 1L;
 
         private String name = null;
         private String type = null;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 43d25a7..ed1b64d 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
@@ -19,14 +19,9 @@
 
 package org.apache.ranger.plugin.store;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.plugin.model.*;
-import org.apache.ranger.plugin.util.SearchFilter;
-import org.apache.ranger.plugin.util.ServiceTags;
 
 import java.util.*;
 
@@ -48,9 +43,11 @@ public abstract class AbstractTagStore implements TagStore {
 
 	protected void preCreate(RangerBaseModelObject obj) throws Exception {
 		obj.setId(0L);
+
 		if(obj.getGuid() == null) {
 			obj.setGuid(UUID.randomUUID().toString());
 		}
+
 		obj.setCreateTime(new Date());
 		obj.setUpdateTime(obj.getCreateTime());
 		obj.setVersion(1L);
@@ -88,7 +85,6 @@ public abstract class AbstractTagStore implements TagStore {
 	}
 
 	protected void preDelete(RangerBaseModelObject obj) throws Exception {
-		// TODO:
 	}
 
 	protected void postDelete(RangerBaseModelObject obj) throws Exception {
@@ -106,322 +102,6 @@ public abstract class AbstractTagStore implements TagStore {
 		}
 		return ret;
 	}
-
-	@Override
-	public PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception {
-		List<RangerTagDef> list = getTagDefs(filter);
-
-		return new PList<RangerTagDef>(list, 0, list.size(),
-				(long)list.size(), list.size(), filter.getSortType(), filter.getSortBy());
-	}
-
-	@Override
-	public PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception {
-		List<RangerTagResourceMap> list = getTagResourceMaps(filter);
-
-		return new PList<RangerTagResourceMap>(list, 0, list.size(),
-				(long)list.size(), list.size(), filter.getSortType(), filter.getSortBy());
-	}
-
-
-	@Override
-	public List<RangerTagDef> getTagDefsByExternalId(String externalId) throws Exception {
-
-		List<RangerTagDef> ret;
-
-		if (StringUtils.isNotBlank(externalId)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_EXTERNAL_ID, externalId);
-
-			ret = getTagDefs(filter);
-
-		} else {
-			ret = null;
-		}
-
-		return ret;
-	}
-
-	@Override
-	public RangerTag getTagById(Long id) throws Exception {
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> AbstractTagStore.getTagById(" + id + ")");
-		}
-
-		RangerTag ret = null;
-
-		if (id != null) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_ID, id.toString());
-
-			List<RangerTag> tags = getTags(filter);
-
-			if (CollectionUtils.isNotEmpty(tags) && CollectionUtils.size(tags) == 1) {
-				ret = tags.get(0);
-			}
-		}
-
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== AbstractTagStore.getTagDefById(" + id + "): " + ret);
-		}
-
-		return ret;
-	}
-
-	@Override
-	public List<RangerTag> getTagsByName(String name) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_NAME, name);
-
-		return getTags(filter);
-	}
-
-	@Override
-	public List<RangerTag> getTagsByExternalId(String externalId) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_EXTERNAL_ID, externalId);
-
-		return getTags(filter);
-	}
-
-
-	@Override
-	public RangerServiceResource getServiceResourceById(Long id) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_ID, id.toString());
-
-		List<RangerServiceResource> resources = getServiceResources(filter);
-		if (CollectionUtils.isEmpty(resources) || resources.size() > 1) {
-			throw new Exception("Not exactly one resource found with id=" + id);
-		}
-
-		return resources.get(0);
-	}
-
-	@Override
-	public List<RangerServiceResource> getServiceResourcesByExternalId(String externalId) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_EXTERNAL_ID, externalId);
-
-		return getServiceResources(filter);
-	}
-
-	@Override
-	public List<RangerServiceResource> getServiceResourcesByServiceAndResourceSpec(String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception {
-		List<RangerServiceResource> ret = null;
-
-		RangerService service;
-		try {
-			service = svcStore.getServiceByName(serviceName);
-		} catch (Exception excp) {
-			LOG.error("AbstractTagStore.getTaggedResource - failed to get service " + serviceName);
-			throw new Exception("Invalid service: " + serviceName);
-		}
-
-		if (MapUtils.isNotEmpty(resourceSpec)) {
-
-			RangerServiceResource resource = new RangerServiceResource(serviceName, resourceSpec);
-			ret = getServiceResources(resource);
-		}
-
-		return ret;
-	}
-
-	private List<RangerServiceResource> getServiceResources(RangerServiceResource resource) throws Exception {
-
-		List<RangerServiceResource> ret = null;
-
-		RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
-		String signature = serializer.getSignature();
-
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_SIGNATURE, signature);
-
-		ret = getServiceResources(filter);
-
-		return ret;
-	}
-
-	@Override
-	public List<RangerTagResourceMap> getTagResourceMap(String externalResourceId, String externalTagId) throws Exception {
-		List<RangerTagResourceMap> ret = null;
-
-		SearchFilter serviceResourceFilter = new SearchFilter();
-		SearchFilter tagFilter = new SearchFilter();
-
-		serviceResourceFilter.setParam(SearchFilter.TAG_RESOURCE_EXTERNAL_ID, externalResourceId);
-		List<RangerServiceResource> serviceResources = getServiceResources(serviceResourceFilter);
-
-		tagFilter.setParam(SearchFilter.TAG_EXTERNAL_ID, externalTagId);
-		List<RangerTag> tags = getTags(tagFilter);
-
-		if (CollectionUtils.isNotEmpty(serviceResources) && CollectionUtils.isNotEmpty(tags)) {
-
-			for (RangerServiceResource serviceResource : serviceResources) {
-
-				Long resourceId = serviceResource.getId();
-
-				for (RangerTag tag : tags) {
-
-					Long tagId = tag.getId();
-
-					SearchFilter mapFilter = new SearchFilter();
-
-					mapFilter.setParam(SearchFilter.TAG_MAP_TAG_ID, tagId.toString());
-
-					mapFilter.setParam(SearchFilter.TAG_MAP_RESOURCE_ID, resourceId.toString());
-
-					ret = getTagResourceMaps(mapFilter);
-
-					if (CollectionUtils.isNotEmpty(ret)) {
-						break;
-					}
-				}
-			}
-		}
-
-		return ret;
-	}
-
-	@Override
-	public RangerTagResourceMap getTagResourceMapById(Long id) throws Exception {
-		SearchFilter filter = new SearchFilter();
-
-		filter.setParam(SearchFilter.TAG_MAP_ID, id.toString());
-
-		List<RangerTagResourceMap> list = getTagResourceMaps(filter);
-
-		if (CollectionUtils.isEmpty(list) || CollectionUtils.size(list) != 1)  {
-			throw new Exception("Cannot find unique tagResourceMap object with id=" + id);
-		}
-		return list.get(0);
-	}
-
-	@Override
-	public ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
-
-		ServiceTags ret = new ServiceTags();
-
-		boolean tagsChanged = true;
-
-		RangerService service = null;
-
-		try {
-			service = svcStore.getServiceByName(serviceName);
-			ret.setServiceName(serviceName);
-		} catch (Exception exception) {
-			LOG.error("Cannot find service for serviceName=" + serviceName);
-			tagsChanged = false;
-		}
-
-		if (lastKnownVersion != null
-				&& service != null && service.getTagVersion() != null
-				&& lastKnownVersion.compareTo(service.getTagVersion()) >= 0 ) {
-			tagsChanged = false;
-		}
-
-		if (tagsChanged) {
-			SearchFilter filter = new SearchFilter();
-
-			filter.setParam(SearchFilter.TAG_RESOURCE_SERVICE_NAME, serviceName);
-
-			List<RangerServiceResource> serviceResources = getServiceResources(filter);
-
-			Map<Long, RangerTag> tagsMap = new HashMap<Long, RangerTag>();
-			Map<Long, List<Long>> resourceToTagIdsMap = new HashMap<Long, List<Long>>();
-
-			for (RangerServiceResource serviceResource : serviceResources) {
-				List<RangerTag> tagList = getTagsForServiceResourceObject(serviceResource);
-
-				if (CollectionUtils.isNotEmpty(tagList)) {
-					List<Long> tagIdList = new ArrayList<Long>();
-					for (RangerTag tag : tagList) {
-						tagsMap.put(tag.getId(), tag);
-						tagIdList.add(tag.getId());
-					}
-					resourceToTagIdsMap.put(serviceResource.getId(), tagIdList);
-				}
-			}
-
-			if (MapUtils.isEmpty(resourceToTagIdsMap)) {
-				serviceResources.clear();
-			}
-
-			ret.setServiceResources(serviceResources);
-			ret.setResourceToTagIds(resourceToTagIdsMap);
-			ret.setTags(tagsMap);
-
-			if (service != null && service.getTagVersion() != null) {
-				ret.setTagVersion(service.getTagVersion());
-			}
-			if (service != null && service.getTagUpdateTime() != null) {
-				ret.setTagUpdateTime(service.getTagUpdateTime());
-			}
-			if (LOG.isDebugEnabled()) {
-				LOG.debug("Changes to tagVersion detected, tagVersion in service=" + (service == null ? null : service.getTagVersion())
-						+ ", Plugin-provided lastKnownVersion=" + lastKnownVersion);
-			}
-		} else {
-			if (LOG.isDebugEnabled()) {
-				LOG.debug("No changes to tagVersion detected, tagVersion in service=" + (service == null ? null : service.getTagVersion())
-				+ ", Plugin-provided lastKnownVersion=" + lastKnownVersion);
-			}
-			ret.setTagVersion(lastKnownVersion);
-		}
-
-		return ret;
-
-	}
-
-	@Override
-	public List<RangerTag> getTagsForServiceResource(Long resourceId) throws Exception {
-		RangerServiceResource serviceResource = getServiceResourceById(resourceId);
-
-		List<RangerTag> tagList = getTagsForServiceResourceObject(serviceResource);
-
-		return tagList;
-	}
-
-	@Override
-	public List<RangerTag> getTagsForServiceResourceByExtId(String resourceExtId) throws Exception {
-		List<RangerTag> tagList = new ArrayList<RangerTag>();
-
-		List<RangerServiceResource> serviceResources = getServiceResourcesByExternalId(resourceExtId);
-		for (RangerServiceResource serviceResource : serviceResources) {
-			List<RangerTag> tmp = getTagsForServiceResourceObject(serviceResource);
-			tagList.addAll(tmp);
-		}
-		return tagList;
-	}
-
-	private List<RangerTag> getTagsForServiceResourceObject(RangerServiceResource serviceResource) throws Exception {
-
-		List<RangerTag> tagList = new ArrayList<RangerTag>();
-
-		if (serviceResource != null) {
-			SearchFilter mapFilter = new SearchFilter();
-			mapFilter.setParam(SearchFilter.TAG_MAP_RESOURCE_ID, serviceResource.getId().toString());
-
-			List<RangerTagResourceMap> associations = getTagResourceMaps(mapFilter);
-			if (CollectionUtils.isNotEmpty(associations)) {
-
-				for (RangerTagResourceMap association : associations) {
-					RangerTag tag = getTagById(association.getTagId());
-					if (tag != null) {
-						tagList.add(tag);
-					}
-				}
-			}
-		}
-		return tagList;
-	}
-
-	@Override
-	public List<RangerTagResourceMap> getTagResourceMapsByResourceId(Long tagId) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_MAP_RESOURCE_ID, tagId.toString());
-		List<RangerTagResourceMap> associations = getTagResourceMaps(filter);
-		return associations;
-	}
-
-	@Override
-	public List<RangerTagResourceMap> getTagResourceMapsByTagId(Long tagId) throws Exception {
-		SearchFilter filter = new SearchFilter(SearchFilter.TAG_MAP_TAG_ID, tagId.toString());
-		List<RangerTagResourceMap> associations = getTagResourceMaps(filter);
-		return associations;
-	}
 }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java
index 950969e..de48240 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagPredicateUtil.java
@@ -38,21 +38,19 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 		super.addPredicates(filter, predicates);
 
 		addPredicateForTagDefId(filter.getParam(SearchFilter.TAG_DEF_ID), predicates);
-		addPredicateForTagDefExternalId(filter.getParam(SearchFilter.TAG_DEF_EXTERNAL_ID), predicates);
+		addPredicateForTagDefGuid(filter.getParam(SearchFilter.TAG_DEF_GUID), predicates);
 		addPredicateForTagDefName(filter.getParam(SearchFilter.TAG_DEF_NAME), predicates);
 
 		addPredicateForTagId(filter.getParam(SearchFilter.TAG_ID), predicates);
-		addPredicateForTagExternalId(filter.getParam(SearchFilter.TAG_EXTERNAL_ID), predicates);
+		addPredicateForTagGuid(filter.getParam(SearchFilter.TAG_GUID), predicates);
 		addPredicateForTagName(filter.getParam(SearchFilter.TAG_NAME), predicates);
 
 		addPredicateForResourceId(filter.getParam(SearchFilter.TAG_RESOURCE_ID), predicates);
-		addPredicateForResourceExternalId(filter.getParam(SearchFilter.TAG_RESOURCE_EXTERNAL_ID), predicates);
+		addPredicateForResourceGuid(filter.getParam(SearchFilter.TAG_RESOURCE_GUID), predicates);
 		addPredicateForServiceResourceServiceName(filter.getParam(SearchFilter.TAG_RESOURCE_SERVICE_NAME), predicates);
 		addPredicateForResourceSignature(filter.getParam(SearchFilter.TAG_RESOURCE_SIGNATURE), predicates);
 
 		addPredicateForTagResourceMapId(filter.getParam(SearchFilter.TAG_MAP_ID), predicates);
-		addPredicateForTagResourceMapResourceId(filter.getParam(SearchFilter.TAG_MAP_RESOURCE_ID), predicates);
-		addPredicateForTagResourceMapTagId(filter.getParam(SearchFilter.TAG_MAP_TAG_ID), predicates);
 	}
 
 	private Predicate addPredicateForTagDefId(final String id, List<Predicate> predicates) {
@@ -87,8 +85,8 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 		return ret;
 	}
 
-	private Predicate addPredicateForTagDefExternalId(final String externalId, List<Predicate> predicates) {
-		if (externalId == null || StringUtils.isEmpty(externalId)) {
+	private Predicate addPredicateForTagDefGuid(final String guid, List<Predicate> predicates) {
+		if (StringUtils.isEmpty(guid)) {
 			return null;
 		}
 
@@ -105,7 +103,7 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 				if (object instanceof RangerTagDef) {
 					RangerTagDef tagDef = (RangerTagDef) object;
 
-					ret = StringUtils.equals(externalId, tagDef.getGuid());
+					ret = StringUtils.equals(guid, tagDef.getGuid());
 				}
 
 				return ret;
@@ -170,6 +168,9 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 					RangerTag tag = (RangerTag) object;
 
 					ret = StringUtils.equals(id, tag.getId().toString());
+				} else if (object instanceof RangerTagResourceMap) {
+					RangerTagResourceMap tagResourceMap = (RangerTagResourceMap) object;
+					ret = StringUtils.equals(id, tagResourceMap.getTagId().toString());
 				}
 
 				return ret;
@@ -183,8 +184,8 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 		return ret;
 	}
 
-	private Predicate addPredicateForTagExternalId(final String externalId, List<Predicate> predicates) {
-		if (StringUtils.isEmpty(externalId)) {
+	private Predicate addPredicateForTagGuid(final String guid, List<Predicate> predicates) {
+		if (StringUtils.isEmpty(guid)) {
 			return null;
 		}
 
@@ -201,7 +202,7 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 				if (object instanceof RangerTag) {
 					RangerTag tag = (RangerTag) object;
 
-					ret = StringUtils.equals(externalId, tag.getGuid());
+					ret = StringUtils.equals(guid, tag.getGuid());
 				}
 
 				return ret;
@@ -266,6 +267,10 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 					RangerServiceResource resource = (RangerServiceResource) object;
 
 					ret = StringUtils.equals(id, resource.getId().toString());
+				} else if(object instanceof RangerTagResourceMap) {
+					RangerTagResourceMap tagResourceMap = (RangerTagResourceMap)object;
+
+					ret = StringUtils.equals(id, tagResourceMap.getId().toString());
 				}
 
 				return ret;
@@ -279,7 +284,7 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 		return ret;
 	}
 
-	private Predicate addPredicateForResourceExternalId(final String id, List<Predicate> predicates) {
+	private Predicate addPredicateForResourceGuid(final String id, List<Predicate> predicates) {
 		if (StringUtils.isEmpty(id)) {
 			return null;
 		}
@@ -404,66 +409,4 @@ public class TagPredicateUtil extends AbstractPredicateUtil {
 
 		return ret;
 	}
-
-	private Predicate addPredicateForTagResourceMapResourceId(final String resourceId, List<Predicate> predicates) {
-		if (StringUtils.isEmpty(resourceId)) {
-			return null;
-		}
-
-		Predicate ret = new Predicate() {
-			@Override
-			public boolean evaluate(Object object) {
-
-				boolean ret = false;
-
-				if (object == null) {
-					return ret;
-				}
-
-				if (object instanceof RangerTagResourceMap) {
-					RangerTagResourceMap tagResourceMap = (RangerTagResourceMap) object;
-					ret = StringUtils.equals(resourceId, tagResourceMap.getResourceId().toString());
-				}
-
-				return ret;
-			}
-		};
-
-		if (predicates != null) {
-			predicates.add(ret);
-		}
-
-		return ret;
-	}
-
-	private Predicate addPredicateForTagResourceMapTagId(final String tagId, List<Predicate> predicates) {
-		if (StringUtils.isEmpty(tagId)) {
-			return null;
-		}
-
-		Predicate ret = new Predicate() {
-			@Override
-			public boolean evaluate(Object object) {
-
-				boolean ret = false;
-
-				if (object == null) {
-					return ret;
-				}
-
-				if (object instanceof RangerTagResourceMap) {
-					RangerTagResourceMap tagResourceMap = (RangerTagResourceMap) object;
-					ret = StringUtils.equals(tagId, tagResourceMap.getTagId().toString());
-				}
-
-				return ret;
-			}
-		};
-
-		if (predicates != null) {
-			predicates.add(ret);
-		}
-
-		return ret;
-	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 aaa70c6..f9d1086 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
@@ -35,6 +35,7 @@ public interface TagStore {
 
     void setServiceStore(ServiceStore svcStore);
 
+
     RangerTagDef createTagDef(RangerTagDef tagDef) throws Exception;
 
     RangerTagDef updateTagDef(RangerTagDef TagDef) throws Exception;
@@ -43,14 +44,17 @@ public interface TagStore {
 
 	void deleteTagDefById(Long id) throws Exception;
 
-	List<RangerTagDef> getTagDef(String name) throws Exception;
-
     RangerTagDef getTagDefById(Long id) throws Exception;
 
+    RangerTagDef getTagDefByGuid(String guid) throws Exception;
+
+	List<RangerTagDef> getTagDefsByName(String name) throws Exception;
+
     List<RangerTagDef> getTagDefs(SearchFilter filter) throws Exception;
 
     PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception;
 
+
     RangerTag createTag(RangerTag tag) throws Exception;
 
     RangerTag updateTag(RangerTag tag) throws Exception;
@@ -59,52 +63,62 @@ public interface TagStore {
 
     RangerTag getTagById(Long id) throws Exception;
 
+    RangerTag getTagByGuid(String guid) throws Exception;
+
     List<RangerTag> getTagsByName(String name) throws Exception;
 
-    List<RangerTag> getTagsByExternalId(String externalId) throws Exception;
+    List<RangerTag> getTagsForResourceId(Long resourceId) throws Exception;
+
+    List<RangerTag> getTagsForResourceGuid(String resourceGuid) throws Exception;
 
     List<RangerTag> getTags(SearchFilter filter) throws Exception;
 
+    PList<RangerTag> getPaginatedTags(SearchFilter filter) throws Exception;
+
+
     RangerServiceResource createServiceResource(RangerServiceResource resource) throws Exception;
 
     RangerServiceResource updateServiceResource(RangerServiceResource resource) throws Exception;
 
     void deleteServiceResourceById(Long id) throws Exception;
 
-    List<RangerServiceResource> getServiceResourcesByExternalId(String externalId) throws Exception;
-
     RangerServiceResource getServiceResourceById(Long id) throws Exception;
 
+    RangerServiceResource getServiceResourceByGuid(String guid) throws Exception;
+
     List<RangerServiceResource> getServiceResourcesByServiceAndResourceSpec(String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception;
 
     List<RangerServiceResource> getServiceResources(SearchFilter filter) throws Exception;
 
+    PList<RangerServiceResource> getPaginatedServiceResources(SearchFilter filter) throws Exception;
+
+
     RangerTagResourceMap createTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception;
 
     void deleteTagResourceMapById(Long id) throws Exception;
 
-    List<RangerTagResourceMap> getTagResourceMap(String externalResourceId, String externalTagId) throws Exception;
-
     RangerTagResourceMap getTagResourceMapById(Long id) throws Exception;
 
-    List<RangerTagResourceMap> getTagResourceMapsByTagId(Long tagId) throws Exception;
+    List<RangerTagResourceMap> getTagResourceMapsForTagId(Long tagId) throws Exception;
 
-    List<RangerTagResourceMap> getTagResourceMapsByResourceId(Long resourceId) throws Exception;
+    List<RangerTagResourceMap> getTagResourceMapsForTagGuid(String tagGuid) throws Exception;
 
-    List<RangerTagResourceMap> getTagResourceMaps(SearchFilter filter) throws Exception;
+    List<RangerTagResourceMap> getTagResourceMapsForResourceId(Long resourceId) throws Exception;
 
-    ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception;
+    List<RangerTagResourceMap> getTagResourceMapsForResourceGuid(String resourceGuid) throws Exception;
 
-    PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception;
+    RangerTagResourceMap getTagResourceMapForTagAndResourceId(Long tagId, Long resourceId) throws Exception;
 
-    List<String> getTags(String serviceName) throws Exception;
+    RangerTagResourceMap getTagResourceMapForTagAndResourceGuid(String tagGuid, String resourceGuid) throws Exception;
 
-    List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception;
+    List<RangerTagResourceMap> getTagResourceMaps(SearchFilter filter) throws Exception;
+
+    PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception;
 
-    List<RangerTag> getTagsForServiceResource(Long resourceId) throws Exception;
 
-    List<RangerTag> getTagsForServiceResourceByExtId(String resourceExtId) throws Exception;
+    ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception;
 
-    List<RangerTagDef> getTagDefsByExternalId(String extId) throws Exception;
+    List<String> getTags(String serviceName) throws Exception;
 
+    List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/plugin/store/TagValidator.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagValidator.java b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagValidator.java
index ada5dd2..8c2b230 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/TagValidator.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/TagValidator.java
@@ -57,21 +57,18 @@ public class TagValidator {
 		tag.setId(exist.getId());
 	}
 
-	public void preUpdateTagByExternalId(String externalId, final RangerTag tag) throws Exception {
+	public void preUpdateTagByGuid(String guid, final RangerTag tag) throws Exception {
 		if (StringUtils.isBlank(tag.getName())) {
 			throw new Exception("Tag has no name");
 		}
 
-		List<RangerTag> exist = tagStore.getTagsByExternalId(externalId);
-		if (CollectionUtils.isEmpty(exist) || CollectionUtils.size(exist) != 1) {
-			throw new Exception("Attempt to update nonexistent or multiple tags, externalId=" + externalId);
+		RangerTag existing = tagStore.getTagByGuid(guid);
+		if (existing == null) {
+			throw new Exception("Attempt to update nonexistent tag, guid=" + guid);
 		}
 
-		RangerTag onlyTag = exist.get(0);
-
-		tag.setId(onlyTag.getId());
-		tag.setGuid(externalId);
-
+		tag.setId(existing.getId());
+		tag.setGuid(existing.getGuid());
 	}
 
 	public void preUpdateTagByName(String name, final RangerTag tag) throws Exception {
@@ -98,26 +95,24 @@ public class TagValidator {
 			throw new Exception("Attempt to delete nonexistent tag, id=" + id);
 		}
 
-		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsByTagId(exist.getId());
+		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsForTagId(exist.getId());
 		if (CollectionUtils.isNotEmpty(associations)) {
 			throw new Exception("Attempt to delete tag which is associated with a service-resource, id=" + id);
 		}
 		return exist;
 	}
 
-	public RangerTag preDeleteTagByExternalId(String externalId) throws Exception {
-		List<RangerTag> exist;
-		exist = tagStore.getTagsByExternalId(externalId);
-		if (CollectionUtils.isEmpty(exist) || CollectionUtils.size(exist) != 1) {
-			throw new Exception("Attempt to delete nonexistent or multiple tags, externalId=" + externalId);
+	public RangerTag preDeleteTagByGuid(String guid) throws Exception {
+		RangerTag exiting = tagStore.getTagByGuid(guid);
+		if (exiting == null) {
+			throw new Exception("Attempt to delete nonexistent tag, guid=" + guid);
 		}
 
-		RangerTag ret = exist.get(0);
-		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsByTagId(ret.getId());
+		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsForTagId(exiting.getId());
 		if (CollectionUtils.isNotEmpty(associations)) {
-			throw new Exception("Attempt to delete tag which is associated with a service-resource, externalId=" + externalId);
+			throw new Exception("Attempt to delete tag which is associated with a service-resource, guid=" + guid);
 		}
-		return ret;
+		return exiting;
 	}
 
 	public RangerTag preDeleteTagByName(String name) throws Exception {
@@ -127,7 +122,7 @@ public class TagValidator {
 			throw new Exception("Attempt to delete nonexistent or multiple tags, name=" + name);
 		}
 		RangerTag ret = exist.get(0);
-		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsByTagId(ret.getId());
+		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsForTagId(ret.getId());
 		if (CollectionUtils.isNotEmpty(associations)) {
 			throw new Exception("Attempt to delete tag which is associated with a service-resource, name=" + name);
 		}
@@ -173,23 +168,20 @@ public class TagValidator {
 
 	}
 
-	public void preUpdateServiceResourceByExternalId(String externalId, RangerServiceResource resource) throws Exception {
+	public void preUpdateServiceResourceByGuid(String guid, RangerServiceResource resource) throws Exception {
 		if (StringUtils.isBlank(resource.getServiceName())
 				|| resource.getResourceSpec() == null
 				|| CollectionUtils.size(resource.getResourceSpec()) == 0) {
 			throw new Exception("No serviceName or resourceSpec in RangerServiceResource");
 		}
 
-		List<RangerServiceResource> exist;
-		exist = tagStore.getServiceResourcesByExternalId(externalId);
-		if (CollectionUtils.isEmpty(exist) || CollectionUtils.size(exist) != 1) {
-			throw new Exception("Attempt to update nonexistent or multiple resources, externalId=" + externalId);
+		RangerServiceResource existing = tagStore.getServiceResourceByGuid(guid);
+		if (existing == null) {
+			throw new Exception("Attempt to update nonexistent resource, guid=" + guid);
 		}
 
-		RangerServiceResource onlyResource = exist.get(0);
-
-		resource.setId(onlyResource.getId());
-		resource.setGuid(externalId);
+		resource.setId(existing.getId());
+		resource.setGuid(guid);
 
 		RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
 		resource.setResourceSignature(serializer.getSignature());
@@ -201,60 +193,60 @@ public class TagValidator {
 		if (exist == null) {
 			throw new Exception("Attempt to delete nonexistent resource, id=" + id);
 		}
-		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsByResourceId(exist.getId());
+		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsForResourceId(exist.getId());
 		if (CollectionUtils.isNotEmpty(associations)) {
 			throw new Exception("Attempt to delete serviceResource which is associated with a tag, id=" + id);
 		}
 		return exist;
 	}
 
-	public RangerServiceResource preDeleteServiceResourceByExternalId(String externalId) throws Exception {
-		List<RangerServiceResource> exist;
-		exist = tagStore.getServiceResourcesByExternalId(externalId);
-		if (CollectionUtils.isEmpty(exist) || CollectionUtils.size(exist) != 1) {
-			throw new Exception("Attempt to delete nonexistent or multiple resources, externalId=" + externalId);
+	public RangerServiceResource preDeleteServiceResourceByGuid(String guid) throws Exception {
+		RangerServiceResource existing = tagStore.getServiceResourceByGuid(guid);
+		if (existing == null) {
+			throw new Exception("Attempt to delete nonexistent resource, guid=" + guid);
 		}
-		RangerServiceResource ret = exist.get(0);
-		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsByResourceId(ret.getId());
+		List<RangerTagResourceMap> associations = tagStore.getTagResourceMapsForResourceId(existing.getId());
 		if (CollectionUtils.isNotEmpty(associations)) {
-			throw new Exception("Attempt to delete serviceResource which is associated with a tag, externalId=" + externalId);
+			throw new Exception("Attempt to delete serviceResource which is associated with a tag, guid=" + guid);
 		}
-		return ret;
+		return existing;
 	}
 
-	public RangerTagResourceMap preCreateTagResourceMap(String externalResourceId, String externalTagId) throws Exception {
-		if (StringUtils.isBlank(externalResourceId) || StringUtils.isBlank(externalTagId)) {
-			throw new Exception("Both externalResourceId and internalResourceId need to be non-empty");
+	public RangerTagResourceMap preCreateTagResourceMap(String tagGuid, String resourceGuid) throws Exception {
+		if (StringUtils.isBlank(resourceGuid) || StringUtils.isBlank(tagGuid)) {
+			throw new Exception("Both resourceGuid and resourceId need to be non-empty");
 		}
 
-		List<RangerTagResourceMap> exist;
-		exist = tagStore.getTagResourceMap(externalResourceId, externalTagId);
-		if (CollectionUtils.isNotEmpty(exist)) {
-			throw new Exception("Attempt to create existing association between resourceId=" + externalResourceId + " and tagId=" + externalTagId);
+		RangerTagResourceMap exist = tagStore.getTagResourceMapForTagAndResourceGuid(tagGuid, resourceGuid);
+		if (exist != null) {
+			throw new Exception("Attempt to create existing association between resourceId=" + resourceGuid + " and tagId=" + tagGuid);
+		}
+
+		RangerServiceResource existingServiceResource = tagStore.getServiceResourceByGuid(resourceGuid);
+
+		if(existingServiceResource == null) {
+			throw new Exception("No resource found for guid=" + resourceGuid);
 		}
-		List<RangerServiceResource> existingServiceResources = tagStore.getServiceResourcesByExternalId(externalResourceId);
-		List<RangerTag> existingTags = tagStore.getTagsByExternalId(externalTagId);
-
-		if (CollectionUtils.isNotEmpty(existingServiceResources) && CollectionUtils.size(existingServiceResources) == 1) {
-			if (CollectionUtils.isNotEmpty(existingTags) && CollectionUtils.size(existingTags) == 1) {
-				RangerTagResourceMap newTagResourceMap = new RangerTagResourceMap();
-				newTagResourceMap.setResourceId(existingServiceResources.get(0).getId());
-				newTagResourceMap.setTagId(existingTags.get(0).getId());
-				return newTagResourceMap;
-			} else {
-				throw new Exception("No unique tag found for externalId=" + externalTagId);
-			}
-		} else {
-			throw new Exception("No unique resource found for externalId=" + externalResourceId);
+
+		RangerTag existingTag = tagStore.getTagByGuid(tagGuid);
+
+		if(existingTag == null) {
+			throw new Exception("No tag found for guid=" + tagGuid);
 		}
+
+		RangerTagResourceMap newTagResourceMap = new RangerTagResourceMap();
+		newTagResourceMap.setResourceId(existingServiceResource.getId());
+		newTagResourceMap.setTagId(existingTag.getId());
+
+		return newTagResourceMap;
 	}
 
-	public RangerTagResourceMap preDeleteTagResourceMap(String externalResourceId, String externalTagId) throws Exception {
-		List<RangerTagResourceMap> exist;
-		exist = tagStore.getTagResourceMap(externalResourceId, externalTagId);
-		if (CollectionUtils.isEmpty(exist) || CollectionUtils.size(exist) != 1) {
-			throw new Exception("Attempt to create nonexistent association between resourceId=" + externalResourceId + " and tagId=" + externalTagId);
+	public RangerTagResourceMap preDeleteTagResourceMap(String tagGuid, String resourceGuid) throws Exception {
+		RangerTagResourceMap existing = tagStore.getTagResourceMapForTagAndResourceGuid(tagGuid, resourceGuid);
+		if (existing == null) {
+			throw new Exception("Attempt to delete nonexistent association between resourceId=" + resourceGuid + " and tagId=" + tagGuid);
 		}
-		return exist.get(0);
+
+		return existing;
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 8a63f72..6117034 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
@@ -20,6 +20,7 @@
 package org.apache.ranger.plugin.store.file;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -28,9 +29,12 @@ import org.apache.hadoop.fs.Path;
 import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.plugin.model.*;
 import org.apache.ranger.plugin.store.AbstractTagStore;
+import org.apache.ranger.plugin.store.PList;
+import org.apache.ranger.plugin.store.RangerServiceResourceSignature;
 import org.apache.ranger.plugin.store.TagPredicateUtil;
 import org.apache.ranger.plugin.store.TagStore;
 import org.apache.ranger.plugin.util.SearchFilter;
+import org.apache.ranger.plugin.util.ServiceTags;
 
 import java.util.*;
 import java.util.regex.Matcher;
@@ -40,20 +44,20 @@ public class TagFileStore extends AbstractTagStore {
 	private static final Log LOG = LogFactory.getLog(TagFileStore.class);
 
 	public static final String PROPERTY_TAG_FILE_STORE_DIR = "ranger.tag.store.file.dir";
-	protected static final String FILE_PREFIX_TAG_DEF = "ranger-tagdef-";
-	protected static final String FILE_PREFIX_TAG = "ranger-tag-";
-	protected static final String FILE_PREFIX_RESOURCE = "ranger-serviceresource-";
-	protected static final String FILE_PREFIX_TAG_RESOURCE_MAP = "ranger-tagresourcemap-";
 
-	private String tagDataDir = null;
-	private long nextTagDefId = 0;
-	private long nextTagId = 0;
-	private long nextServiceResourceId = 0;
-	private long nextTagResourceMapId = 0;
+	protected static final String FILE_PREFIX_TAG_DEF          = "ranger-tagdef-";
+	protected static final String FILE_PREFIX_TAG              = "ranger-tag-";
+	protected static final String FILE_PREFIX_RESOURCE         = "ranger-serviceresource-";
+	protected static final String FILE_PREFIX_TAG_RESOURCE_MAP = "ranger-tagresourcemap-";
 
+	private String tagDataDir            = null;
+	private long   nextTagDefId          = 0;
+	private long   nextTagId             = 0;
+	private long   nextServiceResourceId = 0;
+	private long   nextTagResourceMapId  = 0;
 
 	private TagPredicateUtil predicateUtil = null;
-	private FileStoreUtil fileStoreUtil = null;
+	private FileStoreUtil    fileStoreUtil = null;
 
 	private volatile static TagFileStore instance = null;
 
@@ -78,9 +82,7 @@ public class TagFileStore extends AbstractTagStore {
 		fileStoreUtil = new FileStoreUtil();
 		predicateUtil = new TagPredicateUtil();
 
-		if (LOG.isDebugEnabled())
-
-		{
+		if (LOG.isDebugEnabled()) {
 			LOG.debug("<== TagFileStore.TagFileStore()");
 		}
 	}
@@ -103,6 +105,7 @@ public class TagFileStore extends AbstractTagStore {
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagFileStore.initStore()");
 		}
+
 		fileStoreUtil.initStore(tagDataDir);
 
 		if (LOG.isDebugEnabled()) {
@@ -116,13 +119,13 @@ public class TagFileStore extends AbstractTagStore {
 			LOG.debug("==> TagFileStore.createTagDef(" + tagDef + ")");
 		}
 
-		List<RangerTagDef> existing = getTagDef(tagDef.getName());
+		List<RangerTagDef> existing = getTagDefsByName(tagDef.getName());
 
 		if (CollectionUtils.isNotEmpty(existing)) {
 			throw new Exception(tagDef.getName() + ": tag-def already exists (id=" + existing.get(0).getId() + ")");
 		}
 
-		RangerTagDef ret;
+		RangerTagDef ret = null;
 
 		try {
 			preCreate(tagDef);
@@ -154,11 +157,13 @@ public class TagFileStore extends AbstractTagStore {
 		RangerTagDef existing = null;
 
 		if(tagDef.getId() == null) {
-			List<RangerTagDef> existingDefs = getTagDef(tagDef.getName());
+			List<RangerTagDef> existingDefs = getTagDefsByName(tagDef.getName());
 
 			if (CollectionUtils.isEmpty(existingDefs)) {
 				throw new Exception("tag-def does not exist: name=" + tagDef.getName());
 			}
+			
+			existing = existingDefs.get(0);
 		} else {
 			existing = this.getTagDefById(tagDef.getId());
 
@@ -167,8 +172,7 @@ public class TagFileStore extends AbstractTagStore {
 			}
 		}
 
-
-		RangerTagDef ret;
+		RangerTagDef ret = null;
 
 		try {
 			preUpdate(existing);
@@ -198,77 +202,106 @@ public class TagFileStore extends AbstractTagStore {
 			LOG.debug("==> TagFileStore.deleteTagDef(" + name + ")");
 		}
 
-		List<RangerTagDef> existingDefs = getTagDef(name);
+		List<RangerTagDef> existingDefs = getTagDefsByName(name);
 
-		if (CollectionUtils.isEmpty(existingDefs)) {
-			throw new Exception("no tag-def exists with name=" + name);
+		if (CollectionUtils.isNotEmpty(existingDefs)) {
+			try {
+				for(RangerTagDef existing : existingDefs) {
+					deleteTagDef(existing);
+				}
+			} catch (Exception excp) {
+				throw new Exception("failed to delete tag-def with ID=" + name, excp);
+			}
 		}
 
-		try {
-			for(RangerTagDef existing : existingDefs) {
-				Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_DEF, existing.getId()));
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.deleteTagDef(" + name + ")");
+		}
+	}
 
-				preDelete(existing);
+	@Override
+	public void deleteTagDefById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.deleteTagDefById(" + id + ")");
+		}
 
-				fileStoreUtil.deleteFile(filePath);
+		RangerTagDef existing = getTagDefById(id);
 
-				postDelete(existing);
-			}
-		} catch (Exception excp) {
-			throw new Exception("failed to delete tag-def with ID=" + name, excp);
+		if(existing != null) {
+			deleteTagDef(existing);
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.deleteTagDef(" + name + ")");
+			LOG.debug("<== TagFileStore.deleteTagDefById(" + id + ")");
+		}
+	}
+	
+	@Override
+	public RangerTagDef getTagDefById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagDefById(" + id + ")");
+		}
+
+		RangerTagDef ret = null;
+
+		if (id != null) {
+			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_ID, id.toString());
+
+			List<RangerTagDef> tagDefs = getTagDefs(filter);
+
+			ret = CollectionUtils.isEmpty(tagDefs) ? null : tagDefs.get(0);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagDefById(" + id + "): " + ret);
 		}
 
+		return ret;
 	}
 
 	@Override
-	public List<RangerTagDef> getTagDef(String name) throws Exception {
+	public RangerTagDef getTagDefByGuid(String guid) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.getTagDef(" + name + ")");
+			LOG.debug("==> TagFileStore.getTagDefByGuid(" + guid + ")");
 		}
 
-		List<RangerTagDef> ret;
+		RangerTagDef ret = null;
 
-		if (StringUtils.isNotBlank(name)) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_NAME, name);
+		if (StringUtils.isNotBlank(guid)) {
+			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_GUID, guid);
 
 			List<RangerTagDef> tagDefs = getTagDefs(filter);
 
-			ret = CollectionUtils.isEmpty(tagDefs) ? null : tagDefs;
-		} else {
-			ret = null;
+			if(CollectionUtils.isNotEmpty(tagDefs)) {
+				ret = tagDefs.get(0);
+			}
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.getTagDef(" + name + "): " + ret);
+			LOG.debug("<== TagFileStore.getTagDefByGuid(" + guid + "): " + ret);
 		}
 
 		return ret;
 	}
 
 	@Override
-	public RangerTagDef getTagDefById(Long id) throws Exception {
+	public List<RangerTagDef> getTagDefsByName(String name) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.getTagDefById(" + id + ")");
+			LOG.debug("==> TagFileStore.getTagDef(" + name + ")");
 		}
 
-		RangerTagDef ret;
+		List<RangerTagDef> ret = null;
 
-		if (id != null) {
-			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_ID, id.toString());
+		if (StringUtils.isNotBlank(name)) {
+			SearchFilter filter = new SearchFilter(SearchFilter.TAG_DEF_NAME, name);
 
 			List<RangerTagDef> tagDefs = getTagDefs(filter);
 
-			ret = CollectionUtils.isEmpty(tagDefs) ? null : tagDefs.get(0);
-		} else {
-			ret = null;
+			ret = CollectionUtils.isEmpty(tagDefs) ? null : tagDefs;
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.getTagDefById(" + id + "): " + ret);
+			LOG.debug("<== TagFileStore.getTagDef(" + name + "): " + ret);
 		}
 
 		return ret;
@@ -276,7 +309,6 @@ public class TagFileStore extends AbstractTagStore {
 
 	@Override
 	public List<RangerTagDef> getTagDefs(SearchFilter filter) throws Exception {
-
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagFileStore.getTagDefs()");
 		}
@@ -285,25 +317,43 @@ public class TagFileStore extends AbstractTagStore {
 
 		if (CollectionUtils.isNotEmpty(ret) && filter != null && !filter.isEmpty()) {
 			CollectionUtils.filter(ret, predicateUtil.getPredicate(filter));
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagDefs(): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
+
+	@Override
+	public PList<RangerTagDef> getPaginatedTagDefs(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getPaginatedTagDefs()");
+		}
 
-			//Comparator<RangerBaseModelObject> comparator = getSorter(filter);
+		PList<RangerTagDef> ret = null;
 
-			//if(comparator != null) {
-			//Collections.sort(ret, comparator);
-			//}
+		List<RangerTagDef> list = getTagDefs(filter);
+
+		if(list != null) {
+			ret = new PList<RangerTagDef>(list, 0, list.size(), list.size(), list.size(), filter.getSortType(), filter.getSortBy());
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.getTagDefs(): count=" + (ret == null ? 0 : ret.size()));
+			LOG.debug("<== TagFileStore.getPaginatedTagDefs(): count=" + (ret == null ? 0 : ret.getPageSize()));
 		}
 
 		return ret;
 	}
 
 	@Override
-	public RangerTag createTag(RangerTag tag) throws Exception
-	{
-		RangerTag ret;
+	public RangerTag createTag(RangerTag tag) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.createTag(" + tag + ")");
+		}
+
+		RangerTag ret = null;
 
 		try {
 			preCreate(tag);
@@ -320,16 +370,19 @@ public class TagFileStore extends AbstractTagStore {
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.createTag(" + tag + ")");
+			LOG.debug("<== TagFileStore.createTag(" + tag + "): " + ret);
 		}
 
 		return ret;
 	}
 
 	@Override
-	public RangerTag updateTag(RangerTag tag) throws Exception
-	{
-		RangerTag ret;
+	public RangerTag updateTag(RangerTag tag) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.updateTag(" + tag + ")");
+		}
+
+		RangerTag ret = null;
 
 		try {
 			preUpdate(tag);
@@ -344,7 +397,7 @@ public class TagFileStore extends AbstractTagStore {
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.updateTag(" + tag + ")");
+			LOG.debug("<== TagFileStore.updateTag(" + tag + "): " + ret);
 		}
 
 		return ret;
@@ -353,33 +406,126 @@ public class TagFileStore extends AbstractTagStore {
 	@Override
 	public void deleteTagById(Long id) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.deleteTag(" + id + ")");
+			LOG.debug("==> TagFileStore.deleteTagById(" + id + ")");
 		}
 
 		try {
 			RangerTag tag = getTagById(id);
 
-			Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG, tag.getId()));
+			deleteTag(tag);
+		} catch (Exception excp) {
+			throw new Exception("failed to delete tag with ID=" + id, excp);
+		}
 
-			preDelete(tag);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.deleteTagById(" + id + ")");
+		}
+	}
 
-			fileStoreUtil.deleteFile(filePath);
+	@Override
+	public RangerTag getTagById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagById(" + id + ")");
+		}
 
-			postDelete(tag);
+		RangerTag ret = null;
 
-		} catch (Exception excp) {
-			throw new Exception("failed to delete tag with ID=" + id, excp);
+		if (id != null) {
+			SearchFilter filter = new SearchFilter(SearchFilter.TAG_ID, id.toString());
+
+			List<RangerTag> tags = getTags(filter);
+
+			if (CollectionUtils.isNotEmpty(tags) && CollectionUtils.size(tags) == 1) {
+				ret = tags.get(0);
+			}
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.deleteTag(" + id + ")");
+			LOG.debug("<== TagFileStore.getTagDefById(" + id + "): " + ret);
 		}
+
+		return ret;
 	}
 
 	@Override
-	public List<RangerTag> getTags(SearchFilter filter) throws Exception {
+	public RangerTag getTagByGuid(String guid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagByGuid(" + guid + ")");
+		}
+
+		RangerTag ret = null;
+
+		if (guid != null) {
+			SearchFilter filter = new SearchFilter(SearchFilter.TAG_GUID, guid);
+
+			List<RangerTag> tags = getTags(filter);
+
+			if (CollectionUtils.isNotEmpty(tags) && CollectionUtils.size(tags) == 1) {
+				ret = tags.get(0);
+			}
+		}
 
 		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagByGuid(" + guid + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTag> getTagsByName(String name) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagsByName(" + name + ")");
+		}
+
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_NAME, name);
+
+		List<RangerTag> ret = getTags(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagsByName(" + name + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTag> getTagsForResourceId(Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagsForResourceId(" + resourceId + ")");
+		}
+
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_ID, resourceId.toString());
+
+		List<RangerTag> ret = getTags(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagsForResourceId(" + resourceId + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTag> getTagsForResourceGuid(String resourceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagsForResourceGuid(" + resourceGuid + ")");
+		}
+
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_GUID, resourceGuid);
+
+		List<RangerTag> ret = getTags(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagsForResourceGuid(" + resourceGuid + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTag> getTags(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagFileStore.getTags()");
 		}
 
@@ -396,10 +542,35 @@ public class TagFileStore extends AbstractTagStore {
 		return ret;
 	}
 
+	@Override
+	public PList<RangerTag> getPaginatedTags(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getPaginatedTags()");
+		}
+
+		PList<RangerTag> ret = null;
+
+		List<RangerTag> list = getTags(filter);
+
+		if(list != null) {
+			ret = new PList<RangerTag>(list, 0, list.size(), list.size(), list.size(), filter.getSortType(), filter.getSortBy());
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getPaginatedTags(): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
+
+		return ret;
+	}
+
 
 	@Override
 	public RangerServiceResource createServiceResource(RangerServiceResource resource) throws Exception {
-		RangerServiceResource ret;
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.createServiceResource(" + resource + ")");
+		}
+
+		RangerServiceResource ret = null;
 
 		try {
 			preCreate(resource);
@@ -416,7 +587,7 @@ public class TagFileStore extends AbstractTagStore {
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.createServiceResource(" + resource + ")");
+			LOG.debug("<== TagFileStore.createServiceResource(" + resource + "): " + ret);
 		}
 
 		return ret;
@@ -427,7 +598,8 @@ public class TagFileStore extends AbstractTagStore {
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagFileStore.updateServiceResource(" + resource + ")");
 		}
-		RangerServiceResource ret;
+
+		RangerServiceResource ret = null;
 
 		try {
 			preUpdate(resource);
@@ -442,7 +614,7 @@ public class TagFileStore extends AbstractTagStore {
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.updateServiceResource(" + resource + ")");
+			LOG.debug("<== TagFileStore.updateServiceResource(" + resource + "): " + ret);
 		}
 
 		return ret;
@@ -452,27 +624,87 @@ public class TagFileStore extends AbstractTagStore {
 	@Override
 	public void deleteServiceResourceById(Long id) throws Exception {
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.deleteServiceResource(" + id + ")");
+			LOG.debug("==> TagFileStore.deleteServiceResourceById(" + id + ")");
 		}
 
 		try {
 			RangerServiceResource resource = getServiceResourceById(id);
 
-			Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_RESOURCE, resource.getId()));
+			deleteServiceResource(resource);
+		} catch (Exception excp) {
+			throw new Exception("failed to delete service-resource with ID=" + id, excp);
+		}
 
-			preDelete(resource);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.deleteServiceResourceById(" + id + ")");
+		}
+	}
 
-			fileStoreUtil.deleteFile(filePath);
+	@Override
+	public RangerServiceResource getServiceResourceById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getServiceResourceById(" + id + ")");
+		}
 
-			postDelete(resource);
+		RangerServiceResource ret = null;
 
-		} catch (Exception excp) {
-			throw new Exception("failed to delete service-resource with ID=" + id, excp);
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_ID, id.toString());
+
+		List<RangerServiceResource> resources = getServiceResources(filter);
+
+		if (CollectionUtils.isNotEmpty(resources)) {
+			ret = resources.get(0);
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.deleteServiceResource(" + id + ")");
+			LOG.debug("<== TagFileStore.getServiceResourceById(" + id + "): " + ret);
 		}
+
+		return ret;
+	}
+
+	@Override
+	public RangerServiceResource getServiceResourceByGuid(String guid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getServiceResourcesByGuid(" + guid + ")");
+		}
+
+		RangerServiceResource ret = null;
+
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_GUID, guid);
+
+		List<RangerServiceResource> resources = getServiceResources(filter);
+
+		if (CollectionUtils.isNotEmpty(resources)) {
+			ret = resources.get(0);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getServiceResourcesByGuid(" + guid + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerServiceResource> getServiceResourcesByServiceAndResourceSpec(String serviceName, Map<String, RangerPolicy.RangerPolicyResource> resourceSpec) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getServiceResourcesByServiceAndResourceSpec(" + serviceName + ", " + resourceSpec + ")");
+		}
+
+		List<RangerServiceResource> ret = null;
+
+		if (MapUtils.isNotEmpty(resourceSpec)) {
+			RangerServiceResource resource = new RangerServiceResource(serviceName, resourceSpec);
+
+			ret = getServiceResources(resource);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getServiceResourcesByServiceAndResourceSpec(" + serviceName + ", " + resourceSpec + "): count=" + (ret == null ? 0 : ret.size()));
+		}
+
+		return ret;
 	}
 
 	@Override
@@ -495,18 +727,45 @@ public class TagFileStore extends AbstractTagStore {
 	}
 
 	@Override
-	public RangerTagResourceMap createTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception {
+	public PList<RangerServiceResource> getPaginatedServiceResources(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getPaginatedServiceResources()");
+		}
+
+		PList<RangerServiceResource> ret = null;
 
-		RangerTagResourceMap ret;
+		List<RangerServiceResource> list = getServiceResources(filter);
+
+		if(list != null) {
+			ret = new PList<RangerServiceResource>(list, 0, list.size(), list.size(), list.size(), filter.getSortType(), filter.getSortBy());
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getPaginatedServiceResources(): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
+
+		return ret;
+	}
+
+
+	@Override
+	public RangerTagResourceMap createTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.createTagResourceMap(" + tagResourceMap + ")");
+		}
 
 		preCreate(tagResourceMap);
 
 		tagResourceMap.setId(nextTagResourceMapId);
 
-		ret = fileStoreUtil.saveToFile(tagResourceMap, new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_RESOURCE_MAP, nextTagResourceMapId++)), false);
+		RangerTagResourceMap ret = fileStoreUtil.saveToFile(tagResourceMap, new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_RESOURCE_MAP, nextTagResourceMapId++)), false);
 
 		postCreate(ret);
 
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.createTagResourceMap(" + tagResourceMap + "): " + ret);
+		}
+
 		return ret;
 	}
 
@@ -519,21 +778,178 @@ public class TagFileStore extends AbstractTagStore {
 		try {
 			RangerTagResourceMap tagResourceMap = getTagResourceMapById(id);
 
-			Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_RESOURCE_MAP, tagResourceMap.getId()));
+			deleteTagResourceMap(tagResourceMap);
+		} catch (Exception excp) {
+			throw new Exception("failed to delete tagResourceMap with ID=" + id, excp);
+		}
 
-			preDelete(tagResourceMap);
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.deleteTagResourceMapById(" + id + ")");
+		}
+	}
 
-			fileStoreUtil.deleteFile(filePath);
+	@Override
+	public RangerTagResourceMap getTagResourceMapById(Long id) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapById(" + id + ")");
+		}
 
-			postDelete(tagResourceMap);
+		RangerTagResourceMap ret = null;
 
-		} catch (Exception excp) {
-			throw new Exception("failed to delete tagResourceMap with ID=" + id, excp);
+		SearchFilter filter = new SearchFilter();
+
+		filter.setParam(SearchFilter.TAG_MAP_ID, id.toString());
+
+		List<RangerTagResourceMap> list = getTagResourceMaps(filter);
+
+		if (CollectionUtils.isNotEmpty(list))  {
+			ret = list.get(0);
 		}
 
 		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.deleteTagResourceMapById(" + id + ")");
+			LOG.debug("<== TagFileStore.getTagResourceMapById(" + id + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTagResourceMap> getTagResourceMapsForTagId(Long tagId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapsForTagId(" + tagId + ")");
+		}
+
+		SearchFilter filter = new SearchFilter();
+
+		filter.setParam(SearchFilter.TAG_ID, tagId.toString());
+
+		List<RangerTagResourceMap> ret = getTagResourceMaps(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapsForTagId(" + tagId + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTagResourceMap> getTagResourceMapsForTagGuid(String tagGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapsForTagGuid(" + tagGuid + ")");
+		}
+
+		List<RangerTagResourceMap> ret = null;
+
+		RangerTag tag = getTagByGuid(tagGuid);
+
+		if(tag != null) {
+			SearchFilter filter = new SearchFilter();
+			filter.setParam(SearchFilter.TAG_ID, tag.getId().toString());
+
+			ret = getTagResourceMaps(filter);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapsForTagGuid(" + tagGuid + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTagResourceMap> getTagResourceMapsForResourceId(Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapById(" + resourceId + ")");
+		}
+
+		SearchFilter filter = new SearchFilter();
+
+		filter.setParam(SearchFilter.TAG_RESOURCE_ID, resourceId.toString());
+
+		List<RangerTagResourceMap> ret = getTagResourceMaps(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapById(" + resourceId + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<RangerTagResourceMap> getTagResourceMapsForResourceGuid(String resourceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapsForResourceGuid(" + resourceGuid + ")");
+		}
+
+		SearchFilter filter = new SearchFilter();
+
+		RangerServiceResource resource = getServiceResourceByGuid(resourceGuid);
+		filter.setParam(SearchFilter.TAG_RESOURCE_ID, resource.getId().toString());
+
+		List<RangerTagResourceMap> ret = getTagResourceMaps(filter);
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapsForResourceGuid(" + resourceGuid + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public RangerTagResourceMap getTagResourceMapForTagAndResourceId(Long tagId, Long resourceId) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapForTagAndResourceId(" + tagId + ", " + resourceId + ")");
+		}
+
+		RangerTagResourceMap ret = null;
+
+		SearchFilter filter = new SearchFilter();
+
+		filter.setParam(SearchFilter.TAG_ID, tagId.toString());
+		filter.setParam(SearchFilter.TAG_RESOURCE_ID, resourceId.toString());
+
+		List<RangerTagResourceMap> tagResourceMaps = getTagResourceMaps(filter);
+
+		if(CollectionUtils.isNotEmpty(tagResourceMaps)) {
+			ret = tagResourceMaps.get(0);
 		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapForTagAndResourceId(" + tagId + ", " + resourceId + "): " + ret);
+		}
+
+		return ret;
+	}
+
+	@Override
+	public RangerTagResourceMap getTagResourceMapForTagAndResourceGuid(String tagGuid, String resrouceGuid) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resrouceGuid + ")");
+		}
+
+		RangerTagResourceMap ret = null;
+
+		SearchFilter filter = new SearchFilter();
+		
+		RangerTag             tag      = getTagByGuid(tagGuid);
+		RangerServiceResource resource = getServiceResourceByGuid(resrouceGuid);
+		
+		if(tag != null && resource != null) {
+			filter.setParam(SearchFilter.TAG_ID, tag.getId().toString());
+			filter.setParam(SearchFilter.TAG_RESOURCE_ID, resource.getId().toString());
+
+			List<RangerTagResourceMap> tagResourceMaps = getTagResourceMaps(filter);
+
+			if(CollectionUtils.isNotEmpty(tagResourceMaps)) {
+				ret = tagResourceMaps.get(0);
+			}
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTagResourceMapForTagAndResourceGuid(" + tagGuid + ", " + resrouceGuid + "): " + ret);
+		}
+
+		return ret;
 	}
 
 	@Override
@@ -556,6 +972,190 @@ public class TagFileStore extends AbstractTagStore {
 
 	}
 
+	@Override
+	public PList<RangerTagResourceMap> getPaginatedTagResourceMaps(SearchFilter filter) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getPaginatedTagResourceMaps()");
+		}
+
+		PList<RangerTagResourceMap> ret = null;
+
+		List<RangerTagResourceMap> list = getTagResourceMaps(filter);
+		
+		if(CollectionUtils.isNotEmpty(list)) {
+			ret = new PList<RangerTagResourceMap>(list, 0, list.size(), list.size(), list.size(), filter.getSortType(), filter.getSortBy());
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getPaginatedTagResourceMaps(): count=" + (ret == null ? 0 : ret.getPageSize()));
+		}
+
+		return ret;
+	}
+
+
+	@Override
+	public ServiceTags getServiceTagsIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + ")");
+		}
+
+		ServiceTags ret = new ServiceTags();
+
+		boolean tagsChanged = true;
+
+		RangerService service = null;
+
+		try {
+			service = svcStore.getServiceByName(serviceName);
+			ret.setServiceName(serviceName);
+		} catch (Exception exception) {
+			LOG.error("Cannot find service for serviceName=" + serviceName);
+			tagsChanged = false;
+		}
+
+		if (lastKnownVersion != null
+				&& service != null && service.getTagVersion() != null
+				&& lastKnownVersion.compareTo(service.getTagVersion()) >= 0 ) {
+			tagsChanged = false;
+		}
+
+		if (tagsChanged) {
+			SearchFilter filter = new SearchFilter();
+
+			filter.setParam(SearchFilter.TAG_RESOURCE_SERVICE_NAME, serviceName);
+
+			List<RangerServiceResource> serviceResources = getServiceResources(filter);
+
+			Map<Long, RangerTag> tagsMap = new HashMap<Long, RangerTag>();
+			Map<Long, List<Long>> resourceToTagIdsMap = new HashMap<Long, List<Long>>();
+
+			for (RangerServiceResource serviceResource : serviceResources) {
+				List<RangerTag> tagList = getTagsForServiceResourceObject(serviceResource);
+
+				if (CollectionUtils.isNotEmpty(tagList)) {
+					List<Long> tagIdList = new ArrayList<Long>();
+					for (RangerTag tag : tagList) {
+						tagsMap.put(tag.getId(), tag);
+						tagIdList.add(tag.getId());
+					}
+					resourceToTagIdsMap.put(serviceResource.getId(), tagIdList);
+				}
+			}
+
+			if (MapUtils.isEmpty(resourceToTagIdsMap)) {
+				serviceResources.clear();
+			}
+
+			ret.setServiceResources(serviceResources);
+			ret.setResourceToTagIds(resourceToTagIdsMap);
+			ret.setTags(tagsMap);
+
+			if (service != null && service.getTagVersion() != null) {
+				ret.setTagVersion(service.getTagVersion());
+			}
+			if (service != null && service.getTagUpdateTime() != null) {
+				ret.setTagUpdateTime(service.getTagUpdateTime());
+			}
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("Changes to tagVersion detected, tagVersion in service=" + (service == null ? null : service.getTagVersion())
+						+ ", Plugin-provided lastKnownVersion=" + lastKnownVersion);
+			}
+		} else {
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("No changes to tagVersion detected, tagVersion in service=" + (service == null ? null : service.getTagVersion())
+				+ ", Plugin-provided lastKnownVersion=" + lastKnownVersion);
+			}
+			ret.setTagVersion(lastKnownVersion);
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getServiceTagsIfUpdated(" + serviceName + ", " + lastKnownVersion + "): " + ret);
+		}
+
+		return ret;
+
+	}
+
+	@Override
+	public List<String> getTags(String serviceName) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.getTags(" + serviceName + ")");
+		}
+
+		List<String> ret = new ArrayList<String>();
+
+		// Ignore serviceName
+		List<RangerTag> allTags = getAllTags();
+
+		for (RangerTag tag : allTags) {
+			ret.add(tag.getName());
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.getTags(" + serviceName + "): count=" + ret.size());
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception {
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("==> TagFileStore.lookupTags(" + serviceName + ", " + tagNamePattern + ")");
+		}
+
+		List<String> ret  = new ArrayList<String>();
+		List<String> tags = getTags(serviceName);
+
+		if (CollectionUtils.isNotEmpty(tags)) {
+			Pattern p = Pattern.compile(tagNamePattern);
+			for (String tagName : tags) {
+				Matcher m = p.matcher(tagName);
+
+				if (LOG.isDebugEnabled()) {
+					LOG.debug("TagFileStore.lookupTags) - Trying to match .... tagNamePattern=" + tagNamePattern + ", tagName=" + tagName);
+				}
+
+				if (m.matches()) {
+					if (LOG.isDebugEnabled()) {
+						LOG.debug("TagFileStore.lookupTags) - Match found.... tagNamePattern=" + tagNamePattern + ", tagName=" + tagName);
+					}
+
+					ret.add(tagName);
+				}
+			}
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("<== TagFileStore.lookupTags(" + serviceName + ", " + tagNamePattern + "): count=" + ret.size());
+		}
+
+		return ret;
+	}
+
+	private List<RangerTag> getTagsForServiceResourceObject(RangerServiceResource serviceResource) throws Exception {
+
+		List<RangerTag> tagList = new ArrayList<RangerTag>();
+
+		if (serviceResource != null) {
+			SearchFilter mapFilter = new SearchFilter();
+			mapFilter.setParam(SearchFilter.TAG_RESOURCE_ID, serviceResource.getId().toString());
+
+			List<RangerTagResourceMap> associations = getTagResourceMaps(mapFilter);
+			if (CollectionUtils.isNotEmpty(associations)) {
+
+				for (RangerTagResourceMap association : associations) {
+					RangerTag tag = getTagById(association.getTagId());
+					if (tag != null) {
+						tagList.add(tag);
+					}
+				}
+			}
+		}
+		return tagList;
+	}
+
 	private List<RangerTagDef> getAllTagDefs() throws Exception {
 		if (LOG.isDebugEnabled()) {
 			LOG.debug("==> TagFileStore.getAllTagDefs()");
@@ -712,62 +1312,58 @@ public class TagFileStore extends AbstractTagStore {
 		return ret;
 	}
 
-	@Override
-	public List<String> getTags(String serviceName) throws Exception {
+	private void deleteTagDef(RangerTagDef tagDef) throws Exception {
+		Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_DEF, tagDef.getId()));
 
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.getTags(" + serviceName + ")");
-		}
+		preDelete(tagDef);
 
-		// Ignore serviceName
-		List<RangerTag> allTags = getAllTags();
+		fileStoreUtil.deleteFile(filePath);
 
-		List<String> ret = new ArrayList<String>();
+		postDelete(tagDef);
+	}
 
-		for (RangerTag tag : allTags) {
-			ret.add(tag.getName());
-		}
+	private void deleteTag(RangerTag tag) throws Exception {
+		Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG, tag.getId()));
 
-		return ret;
+		preDelete(tag);
+
+		fileStoreUtil.deleteFile(filePath);
+
+		postDelete(tag);
 	}
 
-	@Override
-	public List<String> lookupTags(String serviceName, String tagNamePattern) throws Exception {
+	private void deleteServiceResource(RangerServiceResource resource) throws Exception {
+		Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_RESOURCE, resource.getId()));
 
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("==> TagFileStore.lookupTags(" + serviceName + ", " + tagNamePattern + ")");
-		}
+		preDelete(resource);
 
-		List<String> tagNameList = getTags(serviceName);
-		List<String> matchedTagList = new ArrayList<String>();
+		fileStoreUtil.deleteFile(filePath);
 
-		if (CollectionUtils.isNotEmpty(tagNameList)) {
-			Pattern p = Pattern.compile(tagNamePattern);
-			for (String tagName : tagNameList) {
-				Matcher m = p.matcher(tagName);
-				if (LOG.isDebugEnabled()) {
-					LOG.debug("TagFileStore.lookupTags) - Trying to match .... tagNamePattern=" + tagNamePattern + ", tagName=" + tagName);
-				}
-				if (m.matches()) {
-					if (LOG.isDebugEnabled()) {
-						LOG.debug("TagFileStore.lookupTags) - Match found.... tagNamePattern=" + tagNamePattern + ", tagName=" + tagName);
-					}
-					matchedTagList.add(tagName);
-				}
-			}
-		}
+		postDelete(resource);
+	}
 
-		if (LOG.isDebugEnabled()) {
-			LOG.debug("<== TagFileStore.lookupTags(" + serviceName + ", " + tagNamePattern + ")");
-		}
+	private void deleteTagResourceMap(RangerTagResourceMap tagResourceMap) throws Exception {
+		Path filePath = new Path(fileStoreUtil.getDataFile(FILE_PREFIX_TAG_RESOURCE_MAP, tagResourceMap.getId()));
+
+		preDelete(tagResourceMap);
+
+		fileStoreUtil.deleteFile(filePath);
 
-		return matchedTagList;
+		postDelete(tagResourceMap);
 	}
 
-	@Override
-	public void deleteTagDefById(Long id) throws Exception {
-		// TODO Auto-generated method stub
+	private List<RangerServiceResource> getServiceResources(RangerServiceResource resource) throws Exception {
+
+		List<RangerServiceResource> ret = null;
+
+		RangerServiceResourceSignature serializer = new RangerServiceResourceSignature(resource);
+		String signature = serializer.getSignature();
 
+		SearchFilter filter = new SearchFilter(SearchFilter.TAG_RESOURCE_SIGNATURE, signature);
+
+		ret = getServiceResources(filter);
+
+		return ret;
 	}
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
----------------------------------------------------------------------
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
index 9dc4994..743df88 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
@@ -51,23 +51,17 @@ public class SearchFilter {
 	public static final String RESOURCE_SIGNATURE = "resourceSignature:";     // search
 	public static final String POLICY_TYPE = "policyType"; // search
 
-	public static final String TAG_DEF_ID       = "tagDefId"; // search
-	public static final String TAG_DEF_EXTERNAL_ID       = "tagDefExtId"; // search
-	public static final String TAG_DEF_NAME     = "tagDefName"; // search
-
-	public static final String TAG_ID     = "tagId"; // search
-	public static final String TAG_EXTERNAL_ID     = "tagExternalId"; // search
-	public static final String TAG_NAME     = "tagName"; // search
-
-	public static final String TAG_RESOURCE_ID  = "resourceId"; // search
-	public static final String TAG_RESOURCE_EXTERNAL_ID     = "externalResourceId"; // search
-	public static final String TAG_RESOURCE_SERVICE_NAME = "resourceServiceName";  // search
-	public static final String TAG_RESOURCE_SIGNATURE = "resourceSignature";  // search
-
-
-	public static final String TAG_MAP_ID     = "tagResourceMapId"; // search
-	public static final String TAG_MAP_RESOURCE_ID     = "tagResourceMapResourceId"; // search
-	public static final String TAG_MAP_TAG_ID     = "tagResourceMapTagId"; // search
+	public static final String TAG_DEF_ID                = "tagDefId";            // search
+	public static final String TAG_DEF_GUID              = "tagDefGuid";          // search
+	public static final String TAG_DEF_NAME              = "tagDefName";          // search
+	public static final String TAG_ID                    = "tagId";               // search
+	public static final String TAG_GUID                  = "tagGuid";             // search
+	public static final String TAG_NAME                  = "tagName";             // search
+	public static final String TAG_RESOURCE_ID           = "resourceId";          // search
+	public static final String TAG_RESOURCE_GUID         = "resourceGuid";        // search
+	public static final String TAG_RESOURCE_SERVICE_NAME = "resourceServiceName"; // search
+	public static final String TAG_RESOURCE_SIGNATURE    = "resourceSignature";   // search
+	public static final String TAG_MAP_ID                = "tagResourceMapId";    // search
 
 	private Map<String, String> params     = null;
 	private int                 startIndex = 0;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 3159b2b..e56e942 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
@@ -44,13 +44,13 @@ import org.codehaus.jackson.map.annotate.JsonSerialize;
 public class ServiceTags implements java.io.Serializable {
 	private static final long serialVersionUID = 1L;
 
-	private String serviceName;
-	private Long               tagVersion;
-	private Date               tagUpdateTime;
-	Map<Long, RangerTagDef> tagDefinitions;
-	Map<Long, RangerTag> tags;
-	List<RangerServiceResource> serviceResources;
-	Map<Long, List<Long>> resourceToTagIds;
+	private String                      serviceName;
+	private Long                        tagVersion;
+	private Date                        tagUpdateTime;
+	private Map<Long, RangerTagDef>     tagDefinitions;
+	private Map<Long, RangerTag>        tags;
+	private List<RangerServiceResource> serviceResources;
+	private Map<Long, List<Long>>       resourceToTagIds;
 
 	/**
 	 * @return the serviceName

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 797b083..e0f4865 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
@@ -35,14 +35,10 @@ import org.apache.hadoop.fs.*;
 import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.plugin.model.*;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
-import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
-import org.apache.ranger.plugin.policyengine.RangerAccessResource;
 import org.apache.ranger.plugin.store.file.ServiceFileStore;
 import org.apache.ranger.plugin.store.file.TagFileStore;
-import org.apache.ranger.plugin.store.rest.ServiceRESTStore;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServiceTags;
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -201,8 +197,8 @@ public class TestTagStore {
 	@Test
 	public void testTagStore_serviceresource() throws Exception {
 
-		String externalId = "GUID_SERVICERESOURCE_TEST";
-		String newExternalId = "NEW_GUID_SERVICERESOURCE_TEST";
+		String guid = "GUID_SERVICERESOURCE_TEST";
+		String newGuid = "NEW_GUID_SERVICERESOURCE_TEST";
 
 		Map<String, RangerPolicyResource> resourceResources = new HashMap<String, RangerPolicyResource>();
 
@@ -217,7 +213,7 @@ public class TestTagStore {
 		RangerServiceResource serviceResource = new RangerServiceResource();
 		serviceResource.setServiceName(serviceName);
 		serviceResource.setResourceSpec(resourceResources);
-		serviceResource.setGuid(externalId);
+		serviceResource.setGuid(guid);
 
 		validator.preCreateServiceResource(serviceResource);
 		RangerServiceResource createdServiceResource = tagStore.createServiceResource(serviceResource);
@@ -229,7 +225,7 @@ public class TestTagStore {
 
 		assertEquals("createServiceResource() failed", initServiceResourceCount + 1, serviceResources == null ? 0 : serviceResources.size());
 
-		createdServiceResource.setGuid(newExternalId);
+		createdServiceResource.setGuid(newGuid);
 		validator.preUpdateServiceResourceById(createdServiceResource.getId(), createdServiceResource);
 		RangerServiceResource updatedServiceResource = tagStore.updateServiceResource(createdServiceResource);
 
@@ -259,15 +255,15 @@ public class TestTagStore {
 
 		String tagName = "ssn";
 
-		String externalResourceId = "GUID_SERVICERESOURCE_TEST";
-		String externalTagId = "GUID_TAG_TEST";
+		String resourceGuid = "GUID_SERVICERESOURCE_TEST";
+		String tagGuid = "GUID_TAG_TEST";
 
 		List<RangerTag> tags = tagStore.getTags(filter);
 
 		int initTagCount = tags == null ? 0 : tags.size();
 
 		RangerTag tag = new RangerTag(tagName, new HashMap<String, String>());
-		tag.setGuid(externalTagId);
+		tag.setGuid(tagGuid);
 
 		validator.preCreateTag(tag);
 		RangerTag createdTag = tagStore.createTag(tag);
@@ -291,7 +287,7 @@ public class TestTagStore {
 		serviceResource.setServiceName(serviceName);
 		serviceResource.setResourceSpec(resourceResources);
 
-		serviceResource.setGuid(externalResourceId);
+		serviceResource.setGuid(resourceGuid);
 		validator.preCreateServiceResource(serviceResource);
 		RangerServiceResource createdServiceResource = tagStore.createServiceResource(serviceResource);
 
@@ -303,7 +299,7 @@ public class TestTagStore {
 
 		// Now create map
 
-		RangerTagResourceMap tagResourceMap = validator.preCreateTagResourceMap(externalResourceId, externalTagId);
+		RangerTagResourceMap tagResourceMap = validator.preCreateTagResourceMap(tagGuid, resourceGuid);
 
 		RangerTagResourceMap createdTagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
 
@@ -315,7 +311,7 @@ public class TestTagStore {
 		assertTrue("No tagged resources found!", CollectionUtils.isNotEmpty(resourceList) && CollectionUtils.size(resourceList) == 1);
 
 		// Delete all created entities
-		RangerTagResourceMap map = validator.preDeleteTagResourceMap(externalResourceId, externalTagId);
+		RangerTagResourceMap map = validator.preDeleteTagResourceMap(tagGuid, resourceGuid);
 		tagStore.deleteTagResourceMapById(map.getId());
 
 		validator.preDeleteServiceResourceById(createdServiceResource.getId());



[2/4] incubator-ranger git commit: RANGER-595: updated tag-store implementation; replaced externalId references with guid; service.tagVersion incremented on changes to tagging for the service-resources

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
index 087eb8d..69c4e4d 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceBase.java
@@ -96,6 +96,25 @@ public abstract class XXServiceBase extends XXDBBase {
 	protected Date policyUpdateTime;
 
 	/**
+	 * tagVersion of the XXService
+	 * <ul>
+	 * </ul>
+	 *
+	 */
+	@Column(name = "tag_version")
+	protected Long tagVersion;
+
+	/**
+	 * tagUpdateTime of the XXService
+	 * <ul>
+	 * </ul>
+	 *
+	 */
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name = "tag_update_time")
+	protected Date tagUpdateTime;
+
+	/**
 	 * description of the XXService
 	 * <ul>
 	 * </ul>
@@ -248,6 +267,46 @@ public abstract class XXServiceBase extends XXDBBase {
 	}
 
 	/**
+	 * This method sets the value to the member attribute <b> tagVersion</b>
+	 * . You cannot set null to the attribute.
+	 * 
+	 * @param tagVersion
+	 *            Value to set member attribute <b> tagVersion</b>
+	 */
+	public void setTagVersion(Long tagVersion) {
+		this.tagVersion = tagVersion;
+	}
+
+	/**
+	 * Returns the value for the member attribute <b>tagVersion</b>
+	 * 
+	 * @return Long - value of member attribute <b>tagVersion</b> .
+	 */
+	public Long getTagVersion() {
+		return this.tagVersion;
+	}
+
+	/**
+	 * This method sets the value to the member attribute <b>
+	 * tagUpdateTime</b> . You cannot set null to the attribute.
+	 * 
+	 * @param tagUpdateTime
+	 *            Value to set member attribute <b> tagUpdateTime</b>
+	 */
+	public void setTagUpdateTime(Date tagUpdateTime) {
+		this.tagUpdateTime = tagUpdateTime;
+	}
+
+	/**
+	 * Returns the value for the member attribute <b>tagUpdateTime</b>
+	 * 
+	 * @return Date - value of member attribute <b>tagUpdateTime</b> .
+	 */
+	public Date getTagUpdateTime() {
+		return this.tagUpdateTime;
+	}
+
+	/**
 	 * This method sets the value to the member attribute <b> description</b> .
 	 * You cannot set null to the attribute.
 	 * 
@@ -346,6 +405,20 @@ public abstract class XXServiceBase extends XXDBBase {
 		} else if (!policyVersion.equals(other.policyVersion)) {
 			return false;
 		}
+		if (tagUpdateTime == null) {
+			if (other.tagUpdateTime != null) {
+				return false;
+			}
+		} else if (!tagUpdateTime.equals(other.tagUpdateTime)) {
+			return false;
+		}
+		if (tagVersion == null) {
+			if (other.tagVersion != null) {
+				return false;
+			}
+		} else if (!tagVersion.equals(other.tagVersion)) {
+			return false;
+		}
 		if (type == null) {
 			if (other.type != null) {
 				return false;
@@ -379,6 +452,7 @@ public abstract class XXServiceBase extends XXDBBase {
 	public String toString() {
 		return "XXServiceBase [" + super.toString() + " guid=" + guid + ", version=" + version + ", type=" + type
 				+ ", name=" + name + ", tagService=" + tagService + ", policyVersion=" + policyVersion + ", policyUpdateTime=" + policyUpdateTime
+				+ ", tagVersion=" + tagVersion + ", tagUpdateTime=" + tagUpdateTime
 				+ ", description=" + description + ", isEnabled=" + isEnabled + "]";
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResource.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResource.java b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResource.java
new file mode 100644
index 0000000..8fd3866
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResource.java
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.AppConstants;
+
+@Entity
+@Cacheable
+@Table(name="x_service_resource")
+@XmlRootElement
+public class XXServiceResource extends XXDBBase implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@SequenceGenerator(name = "XXServiceResourceSEQ", sequenceName = "XXServiceResourceSEQ", allocationSize = 1)
+	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXServiceResourceSEQ")
+	@Column(name = "id")
+	protected Long id;
+
+	@Column(name = "guid", unique = true, nullable = false, length = 512)
+	protected String guid;
+
+	@Column(name = "version")
+	protected Long version;
+
+	@Column(name = "is_enabled")
+	protected Boolean isEnabled;
+
+	@Column(name = "resource_signature")
+	protected String resourceSignature;
+
+	@Column(name = "service_id")
+	protected Long serviceId;
+
+	@Override
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @return the guid
+	 */
+	public String getGuid() {
+		return guid;
+	}
+
+	/**
+	 * @param guid
+	 *            the guid to set
+	 */
+	public void setGuid(String guid) {
+		this.guid = guid;
+	}
+
+	/**
+	 * @return the serviceId
+	 */
+	public Long getServiceId() {
+		return serviceId;
+	}
+
+	/**
+	 * @param serviceId
+	 *            the serviceId to set
+	 */
+	public void setServiceId(Long serviceId) {
+		this.serviceId = serviceId;
+	}
+
+	/**
+	 * @return the resourceSignature
+	 */
+	public String getResourceSignature() {
+		return resourceSignature;
+	}
+
+	/**
+	 * @param resourceSignature
+	 *            the resourceSignature to set
+	 */
+	public void setResourceSignature(String resourceSignature) {
+		this.resourceSignature = resourceSignature;
+	}
+
+	/**
+	 * @return the version
+	 */
+	public Long getVersion() {
+		return version;
+	}
+
+	/**
+	 * @param version
+	 *            the version to set
+	 */
+	public void setVersion(Long version) {
+		this.version = version;
+	}
+
+	/**
+	 * @return the isEnabled
+	 */
+	public Boolean getIsEnabled() {
+		return isEnabled;
+	}
+
+	/**
+	 * @param isEnabled
+	 *            the isEnabled to set
+	 */
+	public void setIsEnabled(Boolean isEnabled) {
+		this.isEnabled = isEnabled;
+	}
+
+	@Override
+	public int getMyClassType() {
+		return AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
+		result = prime * result + ((version == null) ? 0 : version.hashCode());
+		result = prime * result + ((isEnabled == null) ? 0 : isEnabled.hashCode());
+		result = prime * result + ((resourceSignature == null) ? 0 : resourceSignature.hashCode());
+		result = prime * result + ((serviceId == null) ? 0 : serviceId.hashCode());
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		XXServiceResource other = (XXServiceResource) obj;
+		if (resourceSignature == null) {
+			if (other.resourceSignature != null)
+				return false;
+		} else if (!resourceSignature.equals(other.resourceSignature))
+			return false;
+		if (guid == null) {
+			if (other.guid != null)
+				return false;
+		} else if (!guid.equals(other.guid))
+			return false;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		if (isEnabled == null) {
+			if (other.isEnabled != null)
+				return false;
+		} else if (!isEnabled.equals(other.isEnabled))
+			return false;
+		if (serviceId == null) {
+			if (other.serviceId != null)
+				return false;
+		} else if (!serviceId.equals(other.serviceId))
+			return false;
+		if (version == null) {
+			if (other.version != null)
+				return false;
+		} else if (!version.equals(other.version))
+			return false;
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		toString(sb);
+		return sb.toString();
+	}
+
+	public StringBuilder toString(StringBuilder sb) {
+		sb.append("{ ");
+		sb.append(super.toString() + "} ");
+		sb.append("id={").append(id).append("} ");
+		sb.append("guid={").append(guid).append("} ");
+		sb.append("version={").append(version).append("} ");
+		sb.append("isEnabled={").append(isEnabled).append("} ");
+		sb.append("resourceSignature={").append(resourceSignature).append("} ");
+		sb.append("serviceId={").append(serviceId).append("} ");
+		sb.append(" }");
+
+		return sb;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElement.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElement.java b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElement.java
new file mode 100644
index 0000000..a545133
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElement.java
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.AppConstants;
+
+@Entity
+@Cacheable
+@Table(name="x_service_resource_element")
+@XmlRootElement
+public class XXServiceResourceElement extends XXDBBase implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@SequenceGenerator(name = "XXServiceResourceElementSEQ", sequenceName = "XXServiceResourceElementSEQ", allocationSize = 1)
+	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXServiceResourceElementSEQ")
+	@Column(name = "id")
+	protected Long id;
+
+	@Column(name = "guid", unique = true, nullable = false, length = 512)
+	protected String guid;
+
+	@Column(name = "res_def_id")
+	protected Long resDefId;
+
+	@Column(name = "res_id")
+	protected Long resourceId;
+
+	@Column(name = "is_excludes")
+	protected Boolean isExcludes;
+
+	@Column(name = "is_recursive")
+	protected Boolean isRecursive;
+
+	@Override
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @return the guid
+	 */
+	public String getGuid() {
+		return guid;
+	}
+
+	/**
+	 * @param guid
+	 *            the guid to set
+	 */
+	public void setGuid(String guid) {
+		this.guid = guid;
+	}
+
+	/**
+	 * @return the resDefId
+	 */
+	public Long getResDefId() {
+		return resDefId;
+	}
+
+	/**
+	 * @param resDefId
+	 *            the resDefId to set
+	 */
+	public void setResDefId(Long resDefId) {
+		this.resDefId = resDefId;
+	}
+
+	/**
+	 * @return the isExcludes
+	 */
+	public Boolean getIsExcludes() {
+		return isExcludes;
+	}
+
+	/**
+	 * @param isExcludes
+	 *            the isExcludes to set
+	 */
+	public void setIsExcludes(Boolean isExcludes) {
+		this.isExcludes = isExcludes;
+	}
+
+	/**
+	 * @return the isRecursive
+	 */
+	public Boolean getIsRecursive() {
+		return isRecursive;
+	}
+
+	/**
+	 * @param isRecursive
+	 *            the isRecursive to set
+	 */
+	public void setIsRecursive(Boolean isRecursive) {
+		this.isRecursive = isRecursive;
+	}
+
+	/**
+	 * @return the resourceId
+	 */
+	public Long getResourceId() {
+		return resourceId;
+	}
+
+	/**
+	 * @param resourceId
+	 *            the resourceId to set
+	 */
+	public void setResourceId(Long resourceId) {
+		this.resourceId = resourceId;
+	}
+
+	@Override
+	public int getMyClassType() {
+		return AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		result = prime * result + ((isExcludes == null) ? 0 : isExcludes.hashCode());
+		result = prime * result + ((isRecursive == null) ? 0 : isRecursive.hashCode());
+		result = prime * result + ((resDefId == null) ? 0 : resDefId.hashCode());
+		result = prime * result + ((resourceId == null) ? 0 : resourceId.hashCode());
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		XXServiceResourceElement other = (XXServiceResourceElement) obj;
+		if (guid == null) {
+			if (other.guid != null)
+				return false;
+		} else if (!guid.equals(other.guid))
+			return false;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		if (isExcludes == null) {
+			if (other.isExcludes != null)
+				return false;
+		} else if (!isExcludes.equals(other.isExcludes))
+			return false;
+		if (isRecursive == null) {
+			if (other.isRecursive != null)
+				return false;
+		} else if (!isRecursive.equals(other.isRecursive))
+			return false;
+		if (resDefId == null) {
+			if (other.resDefId != null)
+				return false;
+		} else if (!resDefId.equals(other.resDefId))
+			return false;
+		if (resourceId == null) {
+			if (other.resourceId != null)
+				return false;
+		} else if (!resourceId.equals(other.resourceId))
+			return false;
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		toString(sb);
+		return sb.toString();
+	}
+
+	public StringBuilder toString(StringBuilder sb) {
+		sb.append("{ ");
+		sb.append(super.toString() + "} ");
+		sb.append("id={").append(id).append("} ");
+		sb.append("guid={").append(guid).append("} ");
+		sb.append("resDefId={").append(resDefId).append("} ");
+		sb.append("resourceId={").append(resourceId).append("} ");
+		sb.append("isExcludes={").append(isExcludes).append("} ");
+		sb.append("isRecursive={").append(isRecursive).append("} ");
+		sb.append(" }");
+
+		return sb;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElementValue.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElementValue.java b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElementValue.java
new file mode 100644
index 0000000..23b17b9
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXServiceResourceElementValue.java
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.AppConstants;
+
+@Entity
+@Cacheable
+@Table(name="x_service_resource_element_value")
+@XmlRootElement
+public class XXServiceResourceElementValue extends XXDBBase implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@SequenceGenerator(name = "XXServiceResourceElementValueSEQ", sequenceName = "XXServiceResourceElementValueSEQ", allocationSize = 1)
+	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXServiceResourceElementValueSEQ")
+	@Column(name = "id")
+	protected Long id;
+
+	@Column(name = "guid", unique = true, nullable = false, length = 512)
+	protected String guid;
+
+	@Column(name = "res_element_id")
+	protected Long resElementId;
+
+	@Column(name = "value")
+	protected String value;
+
+	@Column(name = "sort_order")
+	protected Integer sortOrder;
+
+	@Override
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	/**
+	 * @return the guid
+	 */
+	public String getGuid() {
+		return guid;
+	}
+
+	/**
+	 * @param guid
+	 *            the guid to set
+	 */
+	public void setGuid(String guid) {
+		this.guid = guid;
+	}
+
+	/**
+	 * @return the resElementId
+	 */
+	public Long getResElementId() {
+		return resElementId;
+	}
+
+	/**
+	 * @param resElementId
+	 *            the resElementId to set
+	 */
+	public void setResElementId(Long resElementId) {
+		this.resElementId = resElementId;
+	}
+
+	/**
+	 * @return the value
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * @param value
+	 *            the value to set
+	 */
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	/**
+	 * @return the sortOrder
+	 */
+	public Integer getSortOrder() {
+		return sortOrder;
+	}
+
+	/**
+	 * @param sortOrder
+	 *            the sortOrder to set
+	 */
+	public void setSortOrder(Integer sortOrder) {
+		this.sortOrder = sortOrder;
+	}
+
+	@Override
+	public int getMyClassType() {
+		return AppConstants.CLASS_TYPE_XA_SERVICE_RESOURCE_ELEMENT_VALUE;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		result = prime * result + ((resElementId == null) ? 0 : resElementId.hashCode());
+		result = prime * result + ((sortOrder == null) ? 0 : sortOrder.hashCode());
+		result = prime * result + ((value == null) ? 0 : value.hashCode());
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		XXServiceResourceElementValue other = (XXServiceResourceElementValue) obj;
+		if (guid == null) {
+			if (other.guid != null)
+				return false;
+		} else if (!guid.equals(other.guid))
+			return false;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		if (resElementId == null) {
+			if (other.resElementId != null)
+				return false;
+		} else if (!resElementId.equals(other.resElementId))
+			return false;
+		if (sortOrder == null) {
+			if (other.sortOrder != null)
+				return false;
+		} else if (!sortOrder.equals(other.sortOrder))
+			return false;
+		if (value == null) {
+			if (other.value != null)
+				return false;
+		} else if (!value.equals(other.value))
+			return false;
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		toString(sb);
+		return sb.toString();
+	}
+
+	public StringBuilder toString(StringBuilder sb) {
+		sb.append("{ ");
+		sb.append(super.toString() + "} ");
+		sb.append("id={").append(id).append("} ");
+		sb.append("guid={").append(guid).append("} ");
+		sb.append("resElementId={").append(resElementId).append("} ");
+		sb.append("value={").append(value).append("} ");
+		sb.append("sortOrder={").append(sortOrder).append("} ");
+		sb.append(" }");
+
+		return sb;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 46b760b..1d8493a 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
@@ -49,18 +49,6 @@ public class XXTag extends XXDBBase implements Serializable {
 	@Column(name = "guid", unique = true, nullable = false, length = 512)
 	protected String guid;
 
-	@Column(name = "version")
-	protected Long version;
-
-	@Column(name = "is_enabled")
-	protected Boolean isEnabled;
-
-	@Column(name = "tag_def_id")
-	protected Long tagDefId;
-
-	@Column(name = "external_id")
-	protected String externalId;
-
 	@Column(name = "name")
 	protected String name;
 
@@ -90,51 +78,6 @@ public class XXTag extends XXDBBase implements Serializable {
 	}
 
 	/**
-	 * @return the version
-	 */
-	public Long getVersion() {
-		return version;
-	}
-
-	/**
-	 * @param version
-	 *            the version to set
-	 */
-	public void setVersion(Long version) {
-		this.version = version;
-	}
-
-	/**
-	 * @return the isEnabled
-	 */
-	public Boolean getIsEnabled() {
-		return isEnabled;
-	}
-
-	/**
-	 * @param isEnabled
-	 *            the isEnabled to set
-	 */
-	public void setIsEnabled(Boolean isEnabled) {
-		this.isEnabled = isEnabled;
-	}
-
-	/**
-	 * @return the tagDefId
-	 */
-	public Long getTagDefId() {
-		return tagDefId;
-	}
-
-	/**
-	 * @param tagDefId
-	 *            the tagDefId to set
-	 */
-	public void setTagDefId(Long tagDefId) {
-		this.tagDefId = tagDefId;
-	}
-
-	/**
 	 * @return the name
 	 */
 	public String getName() {
@@ -149,21 +92,6 @@ public class XXTag extends XXDBBase implements Serializable {
 		this.name = name;
 	}
 
-	/**
-	 * @return the externalId
-	 */
-	public String getExternalId() {
-		return externalId;
-	}
-
-	/**
-	 * @param externalId
-	 *            the externalId to set
-	 */
-	public void setExternalId(String externalId) {
-		this.externalId = externalId;
-	}
-
 	@Override
 	public int getMyClassType() {
 		return AppConstants.CLASS_TYPE_XA_TAG;
@@ -178,11 +106,9 @@ public class XXTag extends XXDBBase implements Serializable {
 	public int hashCode() {
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + ((externalId == null) ? 0 : externalId.hashCode());
 		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
 		result = prime * result + ((id == null) ? 0 : id.hashCode());
 		result = prime * result + ((name == null) ? 0 : name.hashCode());
-		result = prime * result + ((tagDefId == null) ? 0 : tagDefId.hashCode());
 		return result;
 	}
 
@@ -200,11 +126,6 @@ public class XXTag extends XXDBBase implements Serializable {
 		if (getClass() != obj.getClass())
 			return false;
 		XXTag other = (XXTag) obj;
-		if (externalId == null) {
-			if (other.externalId != null)
-				return false;
-		} else if (!externalId.equals(other.externalId))
-			return false;
 		if (guid == null) {
 			if (other.guid != null)
 				return false;
@@ -220,11 +141,6 @@ public class XXTag extends XXDBBase implements Serializable {
 				return false;
 		} else if (!name.equals(other.name))
 			return false;
-		if (tagDefId == null) {
-			if (other.tagDefId != null)
-				return false;
-		} else if (!tagDefId.equals(other.tagDefId))
-			return false;
 		return true;
 	}
 
@@ -245,8 +161,6 @@ public class XXTag extends XXDBBase implements Serializable {
 		sb.append(super.toString() + "} ");
 		sb.append("id={").append(id).append("} ");
 		sb.append("guid={").append(guid).append("} ");
-		sb.append("tagDefId={").append(tagDefId).append("} ");
-		sb.append("externalId={").append(externalId).append("} ");
 		sb.append("name={").append(name).append("} ");
 		sb.append(" }");
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXTagResourceMap.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTagResourceMap.java b/security-admin/src/main/java/org/apache/ranger/entity/XXTagResourceMap.java
index 953df6b..98f2355 100644
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTagResourceMap.java
+++ b/security-admin/src/main/java/org/apache/ranger/entity/XXTagResourceMap.java
@@ -52,8 +52,8 @@ public class XXTagResourceMap extends XXDBBase implements Serializable {
 	@Column(name = "tag_id")
 	protected Long tagId;
 
-	@Column(name = "tagged_res_id")
-	protected Long taggedResId;
+	@Column(name = "res_id")
+	protected Long resourceId;
 
 	@Override
 	public void setId(Long id) {
@@ -96,18 +96,18 @@ public class XXTagResourceMap extends XXDBBase implements Serializable {
 	}
 
 	/**
-	 * @return the taggedResId
+	 * @return the resourceId
 	 */
-	public Long getTaggedResId() {
-		return taggedResId;
+	public Long getResourceId() {
+		return resourceId;
 	}
 
 	/**
-	 * @param taggedResId
-	 *            the taggedResId to set
+	 * @param resourceId
+	 *            the resourceId to set
 	 */
-	public void setTaggedResId(Long taggedResId) {
-		this.taggedResId = taggedResId;
+	public void setResourceId(Long resourceId) {
+		this.resourceId = resourceId;
 	}
 
 	@Override
@@ -127,7 +127,7 @@ public class XXTagResourceMap extends XXDBBase implements Serializable {
 		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
 		result = prime * result + ((id == null) ? 0 : id.hashCode());
 		result = prime * result + ((tagId == null) ? 0 : tagId.hashCode());
-		result = prime * result + ((taggedResId == null) ? 0 : taggedResId.hashCode());
+		result = prime * result + ((resourceId == null) ? 0 : resourceId.hashCode());
 		return result;
 	}
 
@@ -160,10 +160,10 @@ public class XXTagResourceMap extends XXDBBase implements Serializable {
 				return false;
 		} else if (!tagId.equals(other.tagId))
 			return false;
-		if (taggedResId == null) {
-			if (other.taggedResId != null)
+		if (resourceId == null) {
+			if (other.resourceId != null)
 				return false;
-		} else if (!taggedResId.equals(other.taggedResId))
+		} else if (!resourceId.equals(other.resourceId))
 			return false;
 		return true;
 	}
@@ -186,7 +186,7 @@ public class XXTagResourceMap extends XXDBBase implements Serializable {
 		sb.append("id={").append(id).append("} ");
 		sb.append("guid={").append(guid).append("} ");
 		sb.append("tagId={").append(tagId).append("} ");
-		sb.append("taggedResId={").append(taggedResId).append("} ");
+		sb.append("resourceId={").append(resourceId).append("} ");
 		sb.append(" }");
 
 		return sb;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResource.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResource.java b/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResource.java
deleted file mode 100644
index 9487bc7..0000000
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResource.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.entity;
-
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.apache.ranger.common.AppConstants;
-
-@Entity
-@Cacheable
-@Table(name="x_tagged_resource")
-@XmlRootElement
-public class XXTaggedResource extends XXDBBase implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@SequenceGenerator(name = "XXTaggedResourceSEQ", sequenceName = "XXTaggedResourceSEQ", allocationSize = 1)
-	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXTaggedResourceSEQ")
-	@Column(name = "id")
-	protected Long id;
-
-	@Column(name = "guid", unique = true, nullable = false, length = 512)
-	protected String guid;
-
-	@Column(name = "version")
-	protected Long version;
-
-	@Column(name = "is_enabled")
-	protected Boolean isEnabled;
-
-	@Column(name = "external_id")
-	protected String externalId;
-
-	@Column(name = "service_id")
-	protected Long serviceId;
-
-	@Override
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	@Override
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * @return the guid
-	 */
-	public String getGuid() {
-		return guid;
-	}
-
-	/**
-	 * @param guid
-	 *            the guid to set
-	 */
-	public void setGuid(String guid) {
-		this.guid = guid;
-	}
-
-	/**
-	 * @return the serviceId
-	 */
-	public Long getServiceId() {
-		return serviceId;
-	}
-
-	/**
-	 * @param serviceId
-	 *            the serviceId to set
-	 */
-	public void setServiceId(Long serviceId) {
-		this.serviceId = serviceId;
-	}
-
-	/**
-	 * @return the externalId
-	 */
-	public String getExternalId() {
-		return externalId;
-	}
-
-	/**
-	 * @param externalId
-	 *            the externalId to set
-	 */
-	public void setExternalId(String externalId) {
-		this.externalId = externalId;
-	}
-
-	/**
-	 * @return the version
-	 */
-	public Long getVersion() {
-		return version;
-	}
-
-	/**
-	 * @param version
-	 *            the version to set
-	 */
-	public void setVersion(Long version) {
-		this.version = version;
-	}
-
-	/**
-	 * @return the isEnabled
-	 */
-	public Boolean getIsEnabled() {
-		return isEnabled;
-	}
-
-	/**
-	 * @param isEnabled
-	 *            the isEnabled to set
-	 */
-	public void setIsEnabled(Boolean isEnabled) {
-		this.isEnabled = isEnabled;
-	}
-
-	@Override
-	public int getMyClassType() {
-		return AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((externalId == null) ? 0 : externalId.hashCode());
-		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		result = prime * result + ((isEnabled == null) ? 0 : isEnabled.hashCode());
-		result = prime * result + ((serviceId == null) ? 0 : serviceId.hashCode());
-		result = prime * result + ((version == null) ? 0 : version.hashCode());
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!super.equals(obj))
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		XXTaggedResource other = (XXTaggedResource) obj;
-		if (externalId == null) {
-			if (other.externalId != null)
-				return false;
-		} else if (!externalId.equals(other.externalId))
-			return false;
-		if (guid == null) {
-			if (other.guid != null)
-				return false;
-		} else if (!guid.equals(other.guid))
-			return false;
-		if (id == null) {
-			if (other.id != null)
-				return false;
-		} else if (!id.equals(other.id))
-			return false;
-		if (isEnabled == null) {
-			if (other.isEnabled != null)
-				return false;
-		} else if (!isEnabled.equals(other.isEnabled))
-			return false;
-		if (serviceId == null) {
-			if (other.serviceId != null)
-				return false;
-		} else if (!serviceId.equals(other.serviceId))
-			return false;
-		if (version == null) {
-			if (other.version != null)
-				return false;
-		} else if (!version.equals(other.version))
-			return false;
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		toString(sb);
-		return sb.toString();
-	}
-
-	public StringBuilder toString(StringBuilder sb) {
-		sb.append("{ ");
-		sb.append(super.toString() + "} ");
-		sb.append("id={").append(id).append("} ");
-		sb.append("guid={").append(guid).append("} ");
-		sb.append("version={").append(version).append("} ");
-		sb.append("isEnabled={").append(isEnabled).append("} ");
-		sb.append("externalId={").append(externalId).append("} ");
-		sb.append("serviceId={").append(serviceId).append("} ");
-		sb.append(" }");
-
-		return sb;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValue.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValue.java b/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValue.java
deleted file mode 100644
index 977d1f5..0000000
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValue.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.entity;
-
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.apache.ranger.common.AppConstants;
-
-@Entity
-@Cacheable
-@Table(name="x_tagged_resource_value")
-@XmlRootElement
-public class XXTaggedResourceValue extends XXDBBase implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@SequenceGenerator(name = "XXTaggedResourceValueSEQ", sequenceName = "XXTaggedResourceValueSEQ", allocationSize = 1)
-	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXTaggedResourceValueSEQ")
-	@Column(name = "id")
-	protected Long id;
-
-	@Column(name = "guid", unique = true, nullable = false, length = 512)
-	protected String guid;
-
-	@Column(name = "res_def_id")
-	protected Long resDefId;
-
-	@Column(name = "tagged_res_id")
-	protected Long taggedResourceId;
-
-	@Column(name = "is_excludes")
-	protected Boolean isExcludes;
-
-	@Column(name = "is_recursive")
-	protected Boolean isRecursive;
-
-	@Override
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	@Override
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * @return the guid
-	 */
-	public String getGuid() {
-		return guid;
-	}
-
-	/**
-	 * @param guid
-	 *            the guid to set
-	 */
-	public void setGuid(String guid) {
-		this.guid = guid;
-	}
-
-	/**
-	 * @return the resDefId
-	 */
-	public Long getResDefId() {
-		return resDefId;
-	}
-
-	/**
-	 * @param resDefId
-	 *            the resDefId to set
-	 */
-	public void setResDefId(Long resDefId) {
-		this.resDefId = resDefId;
-	}
-
-	/**
-	 * @return the isExcludes
-	 */
-	public Boolean getIsExcludes() {
-		return isExcludes;
-	}
-
-	/**
-	 * @param isExcludes
-	 *            the isExcludes to set
-	 */
-	public void setIsExcludes(Boolean isExcludes) {
-		this.isExcludes = isExcludes;
-	}
-
-	/**
-	 * @return the isRecursive
-	 */
-	public Boolean getIsRecursive() {
-		return isRecursive;
-	}
-
-	/**
-	 * @param isRecursive
-	 *            the isRecursive to set
-	 */
-	public void setIsRecursive(Boolean isRecursive) {
-		this.isRecursive = isRecursive;
-	}
-
-	/**
-	 * @return the taggedResourceId
-	 */
-	public Long getTaggedResourceId() {
-		return taggedResourceId;
-	}
-
-	/**
-	 * @param taggedResourceId
-	 *            the taggedResourceId to set
-	 */
-	public void setTaggedResourceId(Long taggedResourceId) {
-		this.taggedResourceId = taggedResourceId;
-	}
-
-	@Override
-	public int getMyClassType() {
-		return AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		result = prime * result + ((isExcludes == null) ? 0 : isExcludes.hashCode());
-		result = prime * result + ((isRecursive == null) ? 0 : isRecursive.hashCode());
-		result = prime * result + ((resDefId == null) ? 0 : resDefId.hashCode());
-		result = prime * result + ((taggedResourceId == null) ? 0 : taggedResourceId.hashCode());
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!super.equals(obj))
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		XXTaggedResourceValue other = (XXTaggedResourceValue) obj;
-		if (guid == null) {
-			if (other.guid != null)
-				return false;
-		} else if (!guid.equals(other.guid))
-			return false;
-		if (id == null) {
-			if (other.id != null)
-				return false;
-		} else if (!id.equals(other.id))
-			return false;
-		if (isExcludes == null) {
-			if (other.isExcludes != null)
-				return false;
-		} else if (!isExcludes.equals(other.isExcludes))
-			return false;
-		if (isRecursive == null) {
-			if (other.isRecursive != null)
-				return false;
-		} else if (!isRecursive.equals(other.isRecursive))
-			return false;
-		if (resDefId == null) {
-			if (other.resDefId != null)
-				return false;
-		} else if (!resDefId.equals(other.resDefId))
-			return false;
-		if (taggedResourceId == null) {
-			if (other.taggedResourceId != null)
-				return false;
-		} else if (!taggedResourceId.equals(other.taggedResourceId))
-			return false;
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		toString(sb);
-		return sb.toString();
-	}
-
-	public StringBuilder toString(StringBuilder sb) {
-		sb.append("{ ");
-		sb.append(super.toString() + "} ");
-		sb.append("id={").append(id).append("} ");
-		sb.append("guid={").append(guid).append("} ");
-		sb.append("resDefId={").append(resDefId).append("} ");
-		sb.append("taggedResourceId={").append(taggedResourceId).append("} ");
-		sb.append("isExcludes={").append(isExcludes).append("} ");
-		sb.append("isRecursive={").append(isRecursive).append("} ");
-		sb.append(" }");
-
-		return sb;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValueMap.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValueMap.java b/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValueMap.java
deleted file mode 100644
index 62e875f..0000000
--- a/security-admin/src/main/java/org/apache/ranger/entity/XXTaggedResourceValueMap.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ranger.entity;
-
-import java.io.Serializable;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.apache.ranger.common.AppConstants;
-
-@Entity
-@Cacheable
-@Table(name="x_tagged_resource_value_map")
-@XmlRootElement
-public class XXTaggedResourceValueMap extends XXDBBase implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@SequenceGenerator(name = "XXTaggedResourceValueMapSEQ", sequenceName = "XXTaggedResourceValueMapSEQ", allocationSize = 1)
-	@GeneratedValue(strategy = GenerationType.AUTO, generator = "XXTaggedResourceValueMapSEQ")
-	@Column(name = "id")
-	protected Long id;
-
-	@Column(name = "guid", unique = true, nullable = false, length = 512)
-	protected String guid;
-
-	@Column(name = "res_value_id")
-	protected Long resValueId;
-
-	@Column(name = "value")
-	protected String value;
-
-	@Column(name = "sort_order")
-	protected Integer sortOrder;
-
-	@Override
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	@Override
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * @return the guid
-	 */
-	public String getGuid() {
-		return guid;
-	}
-
-	/**
-	 * @param guid
-	 *            the guid to set
-	 */
-	public void setGuid(String guid) {
-		this.guid = guid;
-	}
-
-	/**
-	 * @return the resValueId
-	 */
-	public Long getResValueId() {
-		return resValueId;
-	}
-
-	/**
-	 * @param resValueId
-	 *            the resValueId to set
-	 */
-	public void setResValueId(Long resValueId) {
-		this.resValueId = resValueId;
-	}
-
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * @param value
-	 *            the value to set
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * @return the sortOrder
-	 */
-	public Integer getSortOrder() {
-		return sortOrder;
-	}
-
-	/**
-	 * @param sortOrder
-	 *            the sortOrder to set
-	 */
-	public void setSortOrder(Integer sortOrder) {
-		this.sortOrder = sortOrder;
-	}
-
-	@Override
-	public int getMyClassType() {
-		return AppConstants.CLASS_TYPE_XA_TAGGED_RESOURCE_VALUE_MAP;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((guid == null) ? 0 : guid.hashCode());
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		result = prime * result + ((resValueId == null) ? 0 : resValueId.hashCode());
-		result = prime * result + ((sortOrder == null) ? 0 : sortOrder.hashCode());
-		result = prime * result + ((value == null) ? 0 : value.hashCode());
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!super.equals(obj))
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		XXTaggedResourceValueMap other = (XXTaggedResourceValueMap) obj;
-		if (guid == null) {
-			if (other.guid != null)
-				return false;
-		} else if (!guid.equals(other.guid))
-			return false;
-		if (id == null) {
-			if (other.id != null)
-				return false;
-		} else if (!id.equals(other.id))
-			return false;
-		if (resValueId == null) {
-			if (other.resValueId != null)
-				return false;
-		} else if (!resValueId.equals(other.resValueId))
-			return false;
-		if (sortOrder == null) {
-			if (other.sortOrder != null)
-				return false;
-		} else if (!sortOrder.equals(other.sortOrder))
-			return false;
-		if (value == null) {
-			if (other.value != null)
-				return false;
-		} else if (!value.equals(other.value))
-			return false;
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		toString(sb);
-		return sb.toString();
-	}
-
-	public StringBuilder toString(StringBuilder sb) {
-		sb.append("{ ");
-		sb.append(super.toString() + "} ");
-		sb.append("id={").append(id).append("} ");
-		sb.append("guid={").append(guid).append("} ");
-		sb.append("resValueId={").append(resValueId).append("} ");
-		sb.append("value={").append(value).append("} ");
-		sb.append("sortOrder={").append(sortOrder).append("} ");
-		sb.append(" }");
-
-		return sb;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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 b667777..0b0d4ca 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
@@ -20,24 +20,21 @@
 package org.apache.ranger.rest;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.ListUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.biz.ServiceDBStore;
-//import org.apache.ranger.biz.TagDBStore;
+import org.apache.ranger.biz.TagDBStore;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.plugin.model.RangerServiceResource;
 import org.apache.ranger.plugin.model.RangerTag;
 import org.apache.ranger.plugin.model.RangerTagResourceMap;
 import org.apache.ranger.plugin.model.RangerTagDef;
-import org.apache.ranger.plugin.store.TagStore;
 import org.apache.ranger.plugin.store.TagValidator;
-
-import org.apache.ranger.plugin.store.file.TagFileStore;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServiceTags;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -46,11 +43,9 @@ import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.*;
 
-import java.util.ArrayList;
 import java.util.List;
 
 @Path(TagRESTConstants.TAGDEF_NAME_AND_VERSION)
-
 @Component
 @Scope("request")
 @Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -64,13 +59,8 @@ public class TagREST {
 	@Autowired
 	ServiceDBStore svcStore;
 
-	//@Autowired
-	//TagDBStore tagStore;
-
-    TagStore tagStore;
-
-    //@Autowired
-    //TagValidator validator;
+	@Autowired
+	TagDBStore tagStore;
 
     TagValidator validator;
 
@@ -79,16 +69,16 @@ public class TagREST {
 
 	@PostConstruct
 	public void initStore() {
-        tagStore = TagFileStore.getInstance();
+		validator = new TagValidator();
+
         tagStore.setServiceStore(svcStore);
-        validator = new TagValidator();
         validator.setTagStore(tagStore);
 	}
 
     @POST
     @Path(TagRESTConstants.TAGDEFS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTagDef createTagDef(RangerTagDef tagDef) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.createTagDef(" + tagDef + ")");
@@ -116,8 +106,7 @@ public class TagREST {
     @PUT
     @Path(TagRESTConstants.TAGDEF_RESOURCE + "/{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTagDef updateTagDef(@PathParam("id") Long id, RangerTagDef tagDef) {
 
         if(LOG.isDebugEnabled()) {
@@ -147,7 +136,7 @@ public class TagREST {
     @DELETE
     @Path(TagRESTConstants.TAGDEF_RESOURCE + "/{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public void deleteTagDef(@PathParam("id") Long id) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.deleteTagDef(" + id + ")");
@@ -171,6 +160,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGDEF_RESOURCE+"/{name}")
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<RangerTagDef> getTagDefByName(@PathParam("name") String name) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getTagDefByName(" + name + ")");
@@ -179,7 +169,7 @@ public class TagREST {
         List<RangerTagDef> ret;
 
         try {
-            ret = tagStore.getTagDef(name);
+            ret = tagStore.getTagDefsByName(name);
         } catch(Exception excp) {
             LOG.error("getTagDefByName(" + name + ") failed", excp);
 
@@ -200,6 +190,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGDEFS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<RangerTagDef> getTagDefs() {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getTagDefs()");
@@ -229,7 +220,7 @@ public class TagREST {
     @POST
     @Path(TagRESTConstants.TAGS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTag createTag(RangerTag tag) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.createTag(" + tag + ")");
@@ -256,8 +247,7 @@ public class TagREST {
     @PUT
     @Path(TagRESTConstants.TAG_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTag updateTagById(@PathParam("id") Long id, RangerTag tag) {
 
         RangerTag ret;
@@ -277,27 +267,26 @@ public class TagREST {
     }
 
     @PUT
-    @Path(TagRESTConstants.TAG_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.TAG_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
-    public RangerTag updateTagByExternalId(@PathParam("externalId") String externalId, RangerTag tag) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public RangerTag updateTagByGuid(@PathParam("guid") String guid, RangerTag tag) {
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.updateTagByExternalId(" + externalId + ")");
+            LOG.debug("==> TagREST.updateTagByGuid(" + guid + ")");
         }
 
         RangerTag ret;
 
         try {
-            validator.preUpdateTagByExternalId(externalId, tag);
+            validator.preUpdateTagByGuid(guid, tag);
             ret = tagStore.updateTag(tag);
         } catch (Exception excp) {
-            LOG.error("updateTagByExternalId(" + externalId + ") failed", excp);
+            LOG.error("updateTagByGuid(" + guid + ") failed", excp);
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.updateTagByExternalId(" + externalId + "): " + ret);
+            LOG.debug("<== TagREST.updateTagByGuid(" + guid + "): " + ret);
         }
 
         return ret;
@@ -306,8 +295,7 @@ public class TagREST {
     @PUT
     @Path(TagRESTConstants.TAG_RESOURCE + "name/{name}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTag updateTagByName(@PathParam("name") String name, RangerTag tag) {
 
         if(LOG.isDebugEnabled()) {
@@ -333,8 +321,7 @@ public class TagREST {
     @DELETE
     @Path(TagRESTConstants.TAG_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public void deleteTagById(@PathParam("id") Long id) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.deleteTagById(" + id +")");
@@ -354,32 +341,32 @@ public class TagREST {
     }
 
     @DELETE
-    @Path(TagRESTConstants.TAG_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.TAG_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-    public void deleteTagByExternalId(@PathParam("externalId") String externalId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public void deleteTagByGuid(@PathParam("guid") String guid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.deleteTagByExternalId(" + externalId + ")");
+            LOG.debug("==> TagREST.deleteTagByGuid(" + guid + ")");
         }
 
         try {
-            RangerTag exist = validator.preDeleteTagByExternalId(externalId);
+            RangerTag exist = validator.preDeleteTagByGuid(guid);
             tagStore.deleteTagById(exist.getId());
         } catch(Exception excp) {
-            LOG.error("deleteTagByExternalId(" + externalId + ") failed", excp);
+            LOG.error("deleteTagByGuid(" + guid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.deleteTagByExternalId(" + externalId + ")");
+            LOG.debug("<== TagREST.deleteTagByGuid(" + guid + ")");
         }
     }
 
     @DELETE
     @Path(TagRESTConstants.TAG_RESOURCE + "name/{name}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public void deleteTagByName(@PathParam("name") String name) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.deleteTagByName(" + name + ")");
@@ -402,6 +389,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGS_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerTag getTagById(@PathParam("id") Long id) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getTagById(" + id + ")");
@@ -424,24 +412,25 @@ public class TagREST {
     }
 
     @GET
-    @Path(TagRESTConstants.TAGS_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.TAGS_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    public List<RangerTag> getTagsByExternalId(@PathParam("externalId") String externalId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public RangerTag getTagByGuid(@PathParam("guid") String guid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.getTagsByExternalId(" + externalId + ")");
+            LOG.debug("==> TagREST.getTagByGuid(" + guid + ")");
         }
-        List<RangerTag> ret;
+        RangerTag ret;
 
         try {
-            ret = tagStore.getTagsByExternalId(externalId);
+            ret = tagStore.getTagByGuid(guid);
         } catch(Exception excp) {
-            LOG.error("getTagsByExternalId(" + externalId + ") failed", excp);
+            LOG.error("getTagByGuid(" + guid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.getTagsByExternalId(" + externalId + "): " + ret);
+            LOG.debug("<== TagREST.getTagByGuid(" + guid + "): " + ret);
         }
 
         return ret;
@@ -450,6 +439,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGS_RESOURCE + "name/{name}")
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<RangerTag> getTagsByName(@PathParam("name") String name) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getTagsByName(" + name + ")");
@@ -474,6 +464,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<RangerTag> getAllTags() {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getAllTags()");
@@ -504,7 +495,7 @@ public class TagREST {
     @POST
     @Path(TagRESTConstants.RESOURCES_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerServiceResource createServiceResource(RangerServiceResource resource) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.createServiceResource(" + resource + ")");
@@ -531,8 +522,7 @@ public class TagREST {
     @PUT
     @Path(TagRESTConstants.RESOURCE_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerServiceResource updateServiceResourceById(@PathParam("id") Long id, RangerServiceResource resource) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.updateServiceResourceById(" + id + ")");
@@ -555,25 +545,24 @@ public class TagREST {
     }
 
     @PUT
-    @Path(TagRESTConstants.RESOURCE_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.RESOURCE_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-
-    public RangerServiceResource updateServiceResourceByExternalId(@PathParam("externalId") String externalId, RangerServiceResource resource) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public RangerServiceResource updateServiceResourceByGuid(@PathParam("guid") String guid, RangerServiceResource resource) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.updateServiceResourceByExternalId(" + externalId + ", " + resource + ")");
+            LOG.debug("==> TagREST.updateServiceResourceByGuid(" + guid + ", " + resource + ")");
         }
         RangerServiceResource ret;
         try {
-            validator.preUpdateServiceResourceByExternalId(externalId, resource);
+            validator.preUpdateServiceResourceByGuid(guid, resource);
             ret = tagStore.updateServiceResource(resource);
         } catch(Exception excp) {
-            LOG.error("updateServiceResourceByExternalId(" + externalId + ", " + resource + ") failed", excp);
+            LOG.error("updateServiceResourceByGuid(" + guid + ", " + resource + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.updateServiceResourceByExternalId(" + externalId + ", " + resource + "): " + ret);
+            LOG.debug("<== TagREST.updateServiceResourceByGuid(" + guid + ", " + resource + "): " + ret);
         }
         return ret;
     }
@@ -581,7 +570,7 @@ public class TagREST {
     @DELETE
     @Path(TagRESTConstants.RESOURCE_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public void deleteServiceResourceById(@PathParam("id") Long id) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.deleteServiceResourceById(" + id + ")");
@@ -601,31 +590,32 @@ public class TagREST {
     }
 
     @DELETE
-    @Path(TagRESTConstants.RESOURCE_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.RESOURCE_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-    public void deleteServiceResourceByExternalId(@PathParam("externalId") String externalId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public void deleteServiceResourceByGuid(@PathParam("guid") String guid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.deleteServiceResourceByExternalId(" + externalId + ")");
+            LOG.debug("==> TagREST.deleteServiceResourceByGuid(" + guid + ")");
         }
 
         try {
-            RangerServiceResource exist = validator.preDeleteServiceResourceByExternalId(externalId);
+            RangerServiceResource exist = validator.preDeleteServiceResourceByGuid(guid);
             tagStore.deleteServiceResourceById(exist.getId());
         } catch(Exception excp) {
-            LOG.error("deleteServiceResourceByExternalId(" + externalId + ") failed", excp);
+            LOG.error("deleteServiceResourceByGuid(" + guid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.deleteServiceResourceByExternalId(" + externalId + ")");
+            LOG.debug("<== TagREST.deleteServiceResourceByGuid(" + guid + ")");
         }
     }
 
     @GET
     @Path(TagRESTConstants.RESOURCES_RESOURCE + "{id}")
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public RangerServiceResource getServiceResourceById(@PathParam("id") Long id) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> TagREST.getServiceResourceById(" + id + ")");
@@ -645,22 +635,23 @@ public class TagREST {
     }
 
     @GET
-    @Path(TagRESTConstants.RESOURCES_RESOURCE + "externalId/{externalId}")
+    @Path(TagRESTConstants.RESOURCES_RESOURCE + "guid/{guid}")
     @Produces({ "application/json", "application/xml" })
-    public List<RangerServiceResource> getServiceResourcesByExternalId(@PathParam("externalId") String externalId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public RangerServiceResource getServiceResourceByGuid(@PathParam("guid") String guid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.getServiceResourceByExternalId(" + externalId + ")");
+            LOG.debug("==> TagREST.getServiceResourceByGuid(" + guid + ")");
         }
-        List<RangerServiceResource> ret;
+        RangerServiceResource ret;
         try {
-            ret = tagStore.getServiceResourcesByExternalId(externalId);
+            ret = tagStore.getServiceResourceByGuid(guid);
         } catch(Exception excp) {
-            LOG.error("getServiceResourceByExternalId(" + externalId + ") failed", excp);
+            LOG.error("getServiceResourceByGuid(" + guid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
         if(LOG.isDebugEnabled()) {
-            LOG.debug("<== TagREST.getServiceResourceByExternalId(" + externalId + "): " + ret);
+            LOG.debug("<== TagREST.getServiceResourceByGuid(" + guid + "): " + ret);
         }
         return ret;
     }
@@ -668,26 +659,25 @@ public class TagREST {
     @POST
     @Path(TagRESTConstants.TAGRESOURCEMAPS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-    public RangerTagResourceMap createTagResourceMap(@QueryParam("externalResourceId") String externalResourceId,
-                                                     @QueryParam("externalTagId") String externalTagId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public RangerTagResourceMap createTagResourceMap(@QueryParam("tagGuid") String tagGuid, @QueryParam("resourceGuid") String resourceGuid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.createTagResourceMap(" + externalResourceId + ", " + externalTagId + ")");
+            LOG.debug("==> TagREST.createTagResourceMap(" + tagGuid + ", " +  resourceGuid + ")");
         }
 
         RangerTagResourceMap tagResourceMap;
 
         try {
-            tagResourceMap = validator.preCreateTagResourceMap(externalResourceId, externalTagId);
+            tagResourceMap = validator.preCreateTagResourceMap(tagGuid, resourceGuid);
             tagResourceMap = tagStore.createTagResourceMap(tagResourceMap);
         } catch(Exception excp) {
-            LOG.error("createTagResourceMap(" + externalResourceId + ", " + externalTagId + ") failed", excp);
+            LOG.error("createTagResourceMap(" + tagGuid + ", " +  resourceGuid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.createTagResourceMap(" + externalResourceId + ", " + externalTagId + ")");
+            LOG.debug("==> TagREST.createTagResourceMap(" + tagGuid + ", " + resourceGuid + ")");
         }
 
         return tagResourceMap;
@@ -696,24 +686,23 @@ public class TagREST {
     @DELETE
     @Path(TagRESTConstants.TAGRESOURCEMAPS_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
-    public void deleteTagResourceMap(@QueryParam("externalResourceId") String externalResourceId,
-                                     @QueryParam("externalTagId") String externalTagId) {
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    public void deleteTagResourceMap(@QueryParam("tagGuid") String tagGuid, @QueryParam("resourceGuid") String resourceGuid) {
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.deleteTagResourceMap(" + externalResourceId + ", " + externalTagId + ")");
+            LOG.debug("==> TagREST.deleteTagResourceMap(" + tagGuid + ", " + resourceGuid + ")");
         }
 
         try {
-            RangerTagResourceMap exist = validator.preDeleteTagResourceMap(externalResourceId, externalTagId);
+            RangerTagResourceMap exist = validator.preDeleteTagResourceMap(tagGuid, resourceGuid);
             tagStore.deleteTagResourceMapById(exist.getId());
         } catch(Exception excp) {
-            LOG.error("deleteTagResourceMap(" + externalResourceId + ", " + externalTagId + ") failed", excp);
+            LOG.error("deleteTagResourceMap(" + tagGuid + ", " +  resourceGuid + ") failed", excp);
 
             throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, excp.getMessage(), true);
         }
 
         if(LOG.isDebugEnabled()) {
-            LOG.debug("==> TagREST.deleteTagResourceMap(" + externalResourceId + ", " + externalTagId + ")");
+            LOG.debug("==> TagREST.deleteTagResourceMap(" + tagGuid + ", " + resourceGuid + ")");
         }
     }
 
@@ -727,7 +716,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.RESOURCES_RESOURCE)
     @Produces({ "application/json", "application/xml" })
-    //@PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<RangerServiceResource> getServiceResources(RangerServiceResource resource) throws Exception {
 
         List<RangerServiceResource> ret = null;
@@ -776,6 +765,7 @@ public class TagREST {
     @GET
     @Path(TagRESTConstants.TAGNAMES_RESOURCE)
     @Produces({ "application/json", "application/xml" })
+    @PreAuthorize("hasRole('ROLE_SYS_ADMIN')")
     public List<String> getTagNames(@QueryParam(TagRESTConstants.SERVICE_NAME_PARAM) String serviceName) {
 
         if(LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java b/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java
index 915ff13..07a559c 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/TagRESTConstants.java
@@ -22,25 +22,18 @@ package org.apache.ranger.rest;
 public class TagRESTConstants {
 	public static final String TAGDEF_NAME_AND_VERSION = "tags";
 
-	static final String TAGDEFS_RESOURCE = "/tagdefs/";
-	static final String TAGDEF_RESOURCE = "/tagdef/";
-
-	static final String TAGS_RESOURCE = "/tags/";
-	static final String TAG_RESOURCE = "/tag/";
-
-	static final String RESOURCES_RESOURCE = "/resources/";
-	static final String RESOURCE_RESOURCE = "/resource/";
-
+	static final String TAGDEFS_RESOURCE         = "/tagdefs/";
+	static final String TAGDEF_RESOURCE          = "/tagdef/";
+	static final String TAGS_RESOURCE            = "/tags/";
+	static final String TAG_RESOURCE             = "/tag/";
+	static final String RESOURCES_RESOURCE       = "/resources/";
+	static final String RESOURCE_RESOURCE        = "/resource/";
 	static final String TAGRESOURCEMAPS_RESOURCE = "/tagresourcemaps/";
+	static final String TAGNAMES_RESOURCE        = "/tags/names/";
+	static final String LOOKUP_TAGS_RESOURCE     = "/tags/lookup/";
+	static final String TAGS_DOWNLOAD            = "/download/";
 
-
-	static final String TAGNAMES_RESOURCE = "/tags/names/";
-	static final String LOOKUP_TAGS_RESOURCE = "/tags/lookup/";
-
-	static final String TAGS_DOWNLOAD = "/download/";
-
-	public static final String SERVICE_NAME_PARAM = "serviceName";
-	public static final String LAST_KNOWN_TAG_VERSION_PARAM = "tagVersion";
-	public static final String PATTERN_PARAM = "pattern";
-
+	public static final String SERVICE_NAME_PARAM           = "serviceName";
+	public static final String LAST_KNOWN_TAG_VERSION_PARAM = "lastKnownVersion";
+	public static final String PATTERN_PARAM                = "pattern";
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java
index e80ba01..9f9761c 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceDefService.java
@@ -20,15 +20,6 @@ package org.apache.ranger.service;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.ranger.common.SearchField.DATA_TYPE;
-import org.apache.ranger.common.SearchField.SEARCH_TYPE;
-import org.apache.ranger.common.UserSessionBase;
-import org.apache.ranger.entity.XXContextEnricherDef;
-import org.apache.ranger.entity.XXAccessTypeDef;
-import org.apache.ranger.entity.XXEnumDef;
-import org.apache.ranger.entity.XXPolicyConditionDef;
-import org.apache.ranger.entity.XXResourceDef;
-import org.apache.ranger.entity.XXServiceConfigDef;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.entity.XXServiceDefBase;
 import org.apache.ranger.plugin.model.RangerServiceDef;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/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
new file mode 100644
index 0000000..3bbd344
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceService.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.ranger.common.SearchField;
+import org.apache.ranger.common.SearchField.DATA_TYPE;
+import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.ranger.entity.XXServiceResource;
+import org.apache.ranger.plugin.model.RangerServiceResource;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RangerServiceResourceService extends RangerServiceResourceServiceBase<XXServiceResource, RangerServiceResource> {
+
+	public RangerServiceResourceService() {
+		searchFields.add(new SearchField(SearchFilter.TAG_RESOURCE_ID, "obj.id", DATA_TYPE.INTEGER, SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField(SearchFilter.TAG_SERVICE_ID, "obj.serviceId", DATA_TYPE.INTEGER, SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField(SearchFilter.TAG_RESOURCE_SIGNATURE, "obj.resourceSignature", DATA_TYPE.STRING, SEARCH_TYPE.FULL));
+	}
+
+	@Override
+	protected void validateForCreate(RangerServiceResource vObj) {
+
+	}
+
+	@Override
+	protected void validateForUpdate(RangerServiceResource vObj, XXServiceResource entityObj) {
+
+	}
+	
+	public RangerServiceResource getPopulatedViewObject(XXServiceResource xObj) {
+		return populateViewBean(xObj);
+	}
+
+	public RangerServiceResource getServiceResourceByGuid(String guid) {
+		RangerServiceResource ret = null;
+
+		XXServiceResource xxServiceResource = daoMgr.getXXServiceResource().findByGuid(guid);
+		
+		if(xxServiceResource != null) {
+			ret = populateViewBean(xxServiceResource);
+		}
+
+		return ret;
+	}
+
+	public RangerServiceResource getServiceResourceByServiceIdAndResourceSignature(Long serviceId, String resourceSignature) {
+		RangerServiceResource ret = null;
+
+		XXServiceResource xxServiceResource = daoMgr.getXXServiceResource().findByServiceIdAndResourceSignature(serviceId, resourceSignature);
+		
+		if(xxServiceResource != null) {
+			ret = populateViewBean(xxServiceResource);
+		}
+
+		return ret;
+	}
+
+	public List<RangerServiceResource> getTaggedResourcesInServiceId(Long serviceId) {
+		List<RangerServiceResource> ret = new ArrayList<RangerServiceResource>();
+
+		List<XXServiceResource> xxServiceResources = daoMgr.getXXServiceResource().findTaggedResourcesInServiceId(serviceId);
+		
+		if(CollectionUtils.isNotEmpty(xxServiceResources)) {
+			for(XXServiceResource xxServiceResource : xxServiceResources) {
+				RangerServiceResource serviceResource = populateViewBean(xxServiceResource);
+
+				ret.add(serviceResource);
+			}
+		}
+
+		return ret;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceServiceBase.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceServiceBase.java b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceServiceBase.java
new file mode 100644
index 0000000..f6a1dca
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerServiceResourceServiceBase.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ranger.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.ranger.common.GUIDUtil;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.entity.XXResourceDef;
+import org.apache.ranger.entity.XXService;
+import org.apache.ranger.entity.XXServiceResource;
+import org.apache.ranger.entity.XXServiceResourceElement;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
+import org.apache.ranger.plugin.model.RangerServiceResource;
+import org.apache.ranger.plugin.store.PList;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class RangerServiceResourceServiceBase<T extends XXServiceResource, V extends RangerServiceResource> extends RangerBaseModelService<T, V> {
+
+	@Autowired
+	GUIDUtil guidUtil;
+
+	@Override
+	@SuppressWarnings("unchecked")
+	protected XXServiceResource mapViewToEntityBean(RangerServiceResource vObj, XXServiceResource xObj, int operationContext) {
+		String guid = (StringUtils.isEmpty(vObj.getGuid())) ? guidUtil.genGUID() : vObj.getGuid();
+
+		xObj.setGuid(guid);
+		xObj.setVersion(vObj.getVersion());
+		xObj.setIsEnabled(vObj.getIsEnabled());
+
+		XXService xService = daoMgr.getXXService().findByName(vObj.getServiceName());
+		if (xService == null) {
+			throw restErrorUtil.createRESTException("Error Populating XXServiceResource. No Service found with name: " + vObj.getServiceName(), MessageEnums.INVALID_INPUT_DATA);
+		}
+
+		xObj.setServiceId(xService.getId());
+
+		return xObj;
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	protected RangerServiceResource mapEntityToViewBean(RangerServiceResource vObj, XXServiceResource xObj) {
+		vObj.setGuid(xObj.getGuid());
+		vObj.setVersion(xObj.getVersion());
+		vObj.setIsEnabled(xObj.getIsEnabled());
+
+		XXService xService = daoMgr.getXXService().getById(xObj.getServiceId());
+
+		vObj.setServiceName(xService.getName());
+
+		List<XXServiceResourceElement> resElementList = daoMgr.getXXServiceResourceElement().findByResourceId(xObj.getId());
+		Map<String, RangerPolicy.RangerPolicyResource> resourceSpec = new HashMap<String, RangerPolicy.RangerPolicyResource>();
+
+		for (XXServiceResourceElement resElement : resElementList) {
+			List<String> resValueMapList = daoMgr.getXXServiceResourceElementValue().findValuesByResElementId(resElement.getId());
+
+			XXResourceDef xResDef = daoMgr.getXXResourceDef().getById(resElement.getResDefId());
+
+			RangerPolicyResource policyRes = new RangerPolicyResource();
+			policyRes.setIsExcludes(resElement.getIsExcludes());
+			policyRes.setIsRecursive(resElement.getIsRecursive());
+			policyRes.setValues(resValueMapList);
+
+			resourceSpec.put(xResDef.getName(), policyRes);
+		}
+
+		vObj.setResourceSpec(resourceSpec);
+
+		return vObj;
+	}
+
+	@SuppressWarnings("unchecked")
+	public PList<RangerServiceResource> searchServiceResources(SearchFilter searchFilter) {
+		PList<RangerServiceResource> retList = new PList<RangerServiceResource>();
+		List<RangerServiceResource> resourceList = new ArrayList<RangerServiceResource>();
+
+		List<XXServiceResource> xResourceList = (List<XXServiceResource>) searchRangerObjects(searchFilter, searchFields, sortFields, (PList<V>) retList);
+
+		for (XXServiceResource xResource : xResourceList) {
+			RangerServiceResource taggedRes = populateViewBean((T) xResource);
+			resourceList.add(taggedRes);
+		}
+		retList.setList(resourceList);
+		return retList;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/303f7b70/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
index bd61ff1..462b781 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerTagDefService.java
@@ -19,11 +19,17 @@
 
 package org.apache.ranger.service;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SearchField.DATA_TYPE;
 import org.apache.ranger.common.SearchField.SEARCH_TYPE;
 import org.apache.ranger.entity.XXTagDef;
+import org.apache.ranger.entity.XXTagResourceMap;
 import org.apache.ranger.plugin.model.RangerTagDef;
+import org.apache.ranger.plugin.model.RangerTagResourceMap;
 import org.apache.ranger.plugin.util.SearchFilter;
 import org.springframework.stereotype.Service;
 
@@ -32,6 +38,7 @@ public class RangerTagDefService extends RangerTagDefServiceBase<XXTagDef, Range
 
 	public RangerTagDefService() {
 		searchFields.add(new SearchField(SearchFilter.TAG_DEF_ID, "obj.id", DATA_TYPE.INTEGER, SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField(SearchFilter.TAG_DEF_GUID, "obj.guid", DATA_TYPE.STRING, SEARCH_TYPE.FULL));
 		searchFields.add(new SearchField(SearchFilter.TAG_DEF_NAME, "obj.name", DATA_TYPE.STRING, SEARCH_TYPE.FULL));
 	}
 	
@@ -45,8 +52,61 @@ public class RangerTagDefService extends RangerTagDefServiceBase<XXTagDef, Range
 
 	}
 
+	@Override
+	public RangerTagDef postUpdate(XXTagDef tagDef) {
+		RangerTagDef ret = super.postUpdate(tagDef);
+
+		daoMgr.getXXTagDef().updateServiceForTagDefUpdate(tagDef.getId(), tagDef.getUpdateTime());
+
+		return ret;
+	}
+
 	public RangerTagDef getPopulatedViewObject(XXTagDef xObj) {
 		return populateViewBean(xObj);
 	}
 
+	public RangerTagDef getTagDefByGuid(String guid) {
+		RangerTagDef ret = null;
+
+		XXTagDef xxTagDef = daoMgr.getXXTagDef().findByGuid(guid);
+		
+		if(xxTagDef != null) {
+			ret = populateViewBean(xxTagDef);
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagDef> getTagDefsByName(String name) {
+		List<RangerTagDef> ret = new ArrayList<RangerTagDef>();
+
+		List<XXTagDef> xxTagDefs = daoMgr.getXXTagDef().findByName(name);
+		
+		if(CollectionUtils.isNotEmpty(xxTagDefs)) {
+			for(XXTagDef xxTagDef : xxTagDefs) {
+				RangerTagDef tagDef = populateViewBean(xxTagDef);
+				
+				ret.add(tagDef);
+			}
+		}
+
+		return ret;
+	}
+
+	public List<RangerTagDef> getTagDefsByServiceId(Long serviceId) {
+		List<RangerTagDef> ret = new ArrayList<RangerTagDef>();
+
+		List<XXTagDef> xxTagDefs = daoMgr.getXXTagDef().findByServiceId(serviceId);
+		
+		if(CollectionUtils.isNotEmpty(xxTagDefs)) {
+			for(XXTagDef xxTagDef : xxTagDefs) {
+				RangerTagDef tagDef = populateViewBean(xxTagDef);
+				
+				ret.add(tagDef);
+			}
+		}
+
+		return ret;
+	}
+	
 }