You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ab...@apache.org on 2018/10/19 02:28:42 UTC

[6/8] ranger git commit: RANGER-2203, RANGER-2219: Review and update database schema for ranger policies and tag objects to minimize database queries/updates; back-port of RANGER-2186, RANGER-2195

http://git-wip-us.apache.org/repos/asf/ranger/blob/c84b98fb/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
index 53683ec..09494fc 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerTagDBRetriever.java
@@ -19,61 +19,63 @@
 
 package org.apache.ranger.biz;
 
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.entity.*;
 import org.apache.ranger.plugin.model.*;
-import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.util.RangerPerfTracer;
+import org.apache.ranger.service.RangerServiceResourceService;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.support.TransactionCallback;
 import org.springframework.transaction.support.TransactionTemplate;
 
-
 public class RangerTagDBRetriever {
 	static final Log LOG = LogFactory.getLog(RangerTagDBRetriever.class);
 	static final Log PERF_LOG = RangerPerfTracer.getPerfLogger("db.RangerTagDBRetriever");
 	public static final String OPTION_RANGER_FILTER_TAGS_FOR_SERVICE_PLUGIN = "ranger.filter.tags.for.service.plugin";
 
+	public static final Type subsumedDataType = new TypeToken<List<RangerTagDef.RangerTagAttributeDef>>() {}.getType();
+
+	public static final Gson gsonBuilder = new GsonBuilder().setDateFormat("yyyyMMdd-HH:mm:ss.SSS-Z")
+			.create();
+
 	private final RangerDaoManager daoMgr;
-	private final XXService xService;
 	private final LookupCache lookupCache;
 
-	private final PlatformTransactionManager  txManager;
-	private final TransactionTemplate         txTemplate;
-
 	private List<RangerServiceResource> serviceResources;
 	private Map<Long, RangerTagDef> tagDefs;
-	private Map<Long, RangerTag> tags;
-	private List<RangerTagResourceMap> tagResourceMaps;
 
-	private boolean filterForServicePlugin;
+	RangerTagDBRetriever(final RangerDaoManager daoMgr, final PlatformTransactionManager txManager, final XXService xService) {
 
-	public RangerTagDBRetriever(final RangerDaoManager daoMgr, final PlatformTransactionManager txManager, final XXService xService) {
 		this.daoMgr = daoMgr;
-		this.txManager = txManager;
-		if (this.txManager != null) {
-			this.txTemplate = new TransactionTemplate(this.txManager);
-			this.txTemplate.setReadOnly(true);
+
+		final TransactionTemplate txTemplate;
+
+		if (txManager != null) {
+			txTemplate = new TransactionTemplate(txManager);
+			txTemplate.setReadOnly(true);
 		} else {
-			this.txTemplate = null;
+			txTemplate = null;
 		}
-		this.xService = xService;
 		this.lookupCache = new LookupCache();
 
 
-		if (this.daoMgr != null && this.xService != null) {
+		if (this.daoMgr != null && xService != null) {
 
 			RangerPerfTracer perf = null;
 
@@ -81,13 +83,11 @@ public class RangerTagDBRetriever {
 				perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "RangerTagDBReceiver.getTags(serviceName=" + xService.getName());
 			}
 
-			filterForServicePlugin = RangerConfiguration.getInstance().getBoolean(OPTION_RANGER_FILTER_TAGS_FOR_SERVICE_PLUGIN, false);
-
-			if (this.txTemplate == null) {
+			if (txTemplate == null) {
 				if (LOG.isDebugEnabled()) {
 					LOG.debug("Load Tags in the same thread and using an existing transaction");
 				}
-				if (initializeTagCache(xService) == false) {
+				if (!initializeTagCache(xService)) {
 					LOG.error("Failed to get tags for service:[" + xService.getName() + "] in the same thread and using an existing transaction");
 				}
 			} else {
@@ -110,20 +110,48 @@ public class RangerTagDBRetriever {
 		}
 	}
 
-	public List<RangerTagResourceMap> getTagResourceMaps() {
-		return tagResourceMaps;
-	}
-
-	public List<RangerServiceResource> getServiceResources() {
+	List<RangerServiceResource> getServiceResources() {
 		return serviceResources;
 	}
 
-	public Map<Long, RangerTagDef> getTagDefs() {
+	Map<Long, RangerTagDef> getTagDefs() {
 		return tagDefs;
 	}
 
-	public Map<Long, RangerTag> getTags() {
-		return tags;
+	Map<Long, RangerTag> getTags() {
+
+		Map<Long, RangerTag> ret = new HashMap<>();
+
+		if (CollectionUtils.isNotEmpty(serviceResources)) {
+			for (RangerServiceResource serviceResource : serviceResources) {
+				List<RangerTag> tags = lookupCache.serviceResourceToTags.get(serviceResource.getId());
+				if (CollectionUtils.isNotEmpty(tags)) {
+					for (RangerTag tag : tags) {
+						ret.put(tag.getId(), tag);
+					}
+				}
+			}
+		}
+
+		return ret;
+	}
+
+	Map<Long, List<Long>> getResourceToTagIds() {
+		Map<Long, List<Long>> ret = new HashMap<>();
+
+		if (CollectionUtils.isNotEmpty(serviceResources)) {
+			for (RangerServiceResource serviceResource : serviceResources) {
+				List<RangerTag> tags = lookupCache.serviceResourceToTags.get(serviceResource.getId());
+				if (CollectionUtils.isNotEmpty(tags)) {
+					List<Long> tagIds = new ArrayList<>();
+					ret.put(serviceResource.getId(), tagIds);
+					for (RangerTag tag : tags) {
+						tagIds.add(tag.getId());
+					}
+				}
+			}
+		}
+		return ret;
 	}
 
 	private boolean initializeTagCache(XXService xService) {
@@ -131,69 +159,23 @@ public class RangerTagDBRetriever {
 		try {
 			TagRetrieverServiceResourceContext  serviceResourceContext  = new TagRetrieverServiceResourceContext(xService);
 			TagRetrieverTagDefContext           tagDefContext           = new TagRetrieverTagDefContext(xService);
-			TagRetrieverTagContext              tagContext              = new TagRetrieverTagContext(xService);
 
 			serviceResources    = serviceResourceContext.getAllServiceResources();
 			tagDefs             = tagDefContext.getAllTagDefs();
-			tags                = tagContext.getAllTags();
-
-			tagResourceMaps     = getAllTagResourceMaps();
 
 			ret = true;
 		} catch (Exception ex) {
-			LOG.error("Failed to get tags for service:[" + xService.getName() + "]");
+			LOG.error("Failed to get tags for service:[" + xService.getName() + "]", ex);
 			serviceResources    = null;
 			tagDefs             = null;
-			tags                = null;
-			tagResourceMaps     = null;
 			ret = false;
 		}
 		return ret;
 	}
-	private List<RangerTagResourceMap> getAllTagResourceMaps() {
-
-		List<XXTagResourceMap> xTagResourceMaps = filterForServicePlugin ? daoMgr.getXXTagResourceMap().findForServicePlugin(xService.getId()) : daoMgr.getXXTagResourceMap().findByServiceId(xService.getId());
-
-		ListIterator<XXTagResourceMap> iterTagResourceMap = xTagResourceMaps.listIterator();
-
-		List<RangerTagResourceMap> ret = new ArrayList<RangerTagResourceMap>();
-
-		while (iterTagResourceMap.hasNext()) {
-
-			XXTagResourceMap xTagResourceMap = iterTagResourceMap.next();
-
-			if (xTagResourceMap != null) {
-
-				RangerTagResourceMap tagResourceMap = new RangerTagResourceMap();
-
-				tagResourceMap.setId(xTagResourceMap.getId());
-				tagResourceMap.setGuid(xTagResourceMap.getGuid());
-				tagResourceMap.setCreatedBy(lookupCache.getUserScreenName(xTagResourceMap.getAddedByUserId()));
-				tagResourceMap.setUpdatedBy(lookupCache.getUserScreenName(xTagResourceMap.getUpdatedByUserId()));
-				tagResourceMap.setCreateTime(xTagResourceMap.getCreateTime());
-				tagResourceMap.setUpdateTime(xTagResourceMap.getUpdateTime());
-				tagResourceMap.setResourceId(xTagResourceMap.getResourceId());
-				tagResourceMap.setTagId(xTagResourceMap.getTagId());
-
-				ret.add(tagResourceMap);
-			}
-		}
-		return ret;
-	}
-
-	static <T> List<T> asList(T obj) {
-		List<T> ret = new ArrayList<T>();
-
-		if (obj != null) {
-			ret.add(obj);
-		}
-
-		return ret;
-	}
 
 	private class LookupCache {
-		final Map<Long, String> userScreenNames = new HashMap<Long, String>();
-		final Map<Long, String> resourceDefs = new HashMap<Long, String>();
+		final Map<Long, String> userScreenNames = new HashMap<>();
+		final Map<Long, List<RangerTag>> serviceResourceToTags = new HashMap<>();
 
 		String getUserScreenName(Long userId) {
 			String ret = null;
@@ -229,25 +211,6 @@ public class RangerTagDBRetriever {
 			return ret;
 		}
 
-		String getResourceName(Long resourceDefId) {
-			String ret = null;
-
-			if (resourceDefId != null) {
-				ret = resourceDefs.get(resourceDefId);
-
-				if (ret == null) {
-					XXResourceDef xResourceDef = daoMgr.getXXResourceDef().getById(resourceDefId);
-
-					if (xResourceDef != null) {
-						ret = xResourceDef.getName();
-
-						resourceDefs.put(resourceDefId, ret);
-					}
-				}
-			}
-
-			return ret;
-		}
 	}
 
 	private class TagLoaderThread extends Thread {
@@ -287,39 +250,19 @@ public class RangerTagDBRetriever {
 
 		final XXService service;
 		final ListIterator<XXServiceResource> iterServiceResource;
-		final ListIterator<XXServiceResourceElement> iterServiceResourceElement;
-		final ListIterator<XXServiceResourceElementValue> iterServiceResourceElementValue;
 
 		TagRetrieverServiceResourceContext(XXService xService) {
 			Long serviceId = xService == null ? null : xService.getId();
-
-			List<XXServiceResource> xServiceResources = filterForServicePlugin ? daoMgr.getXXServiceResource().findForServicePlugin(serviceId) : daoMgr.getXXServiceResource().findTaggedResourcesInServiceId(serviceId);
-			List<XXServiceResourceElement> xServiceResourceElements = filterForServicePlugin ? daoMgr.getXXServiceResourceElement().findForServicePlugin(serviceId) : daoMgr.getXXServiceResourceElement().findTaggedResourcesInServiceId(serviceId);
-			List<XXServiceResourceElementValue> xServiceResourceElementValues = filterForServicePlugin ? daoMgr.getXXServiceResourceElementValue().findForServicePlugin(serviceId) : daoMgr.getXXServiceResourceElementValue().findTaggedResourcesInServiceId(serviceId);
-
 			this.service = xService;
-			this.iterServiceResource = xServiceResources.listIterator();
-			this.iterServiceResourceElement = xServiceResourceElements.listIterator();
-			this.iterServiceResourceElementValue = xServiceResourceElementValues.listIterator();
-
-		}
 
-		TagRetrieverServiceResourceContext(XXServiceResource xServiceResource, XXService xService) {
-			Long resourceId = xServiceResource == null ? null : xServiceResource.getId();
+			List<XXServiceResource> xServiceResources = daoMgr.getXXServiceResource().findTaggedResourcesInServiceId(serviceId);
 
-			List<XXServiceResource> xServiceResources = asList(xServiceResource);
-			List<XXServiceResourceElement> xServiceResourceElements = daoMgr.getXXServiceResourceElement().findByResourceId(resourceId);
-			List<XXServiceResourceElementValue> xServiceResourceElementValues = daoMgr.getXXServiceResourceElementValue().findByResourceId(resourceId);
-
-			this.service = xService;
 			this.iterServiceResource = xServiceResources.listIterator();
-			this.iterServiceResourceElement = xServiceResourceElements.listIterator();
-			this.iterServiceResourceElementValue = xServiceResourceElementValues.listIterator();
 
 		}
 
 		List<RangerServiceResource> getAllServiceResources() {
-			List<RangerServiceResource> ret = new ArrayList<RangerServiceResource>();
+			List<RangerServiceResource> ret = new ArrayList<>();
 
 			while (iterServiceResource.hasNext()) {
 				RangerServiceResource serviceResource = getNextServiceResource();
@@ -329,12 +272,6 @@ public class RangerTagDBRetriever {
 				}
 			}
 
-			if (!hasProcessedAll()) {
-				LOG.warn("getAllServiceResources(): perhaps one or more serviceResources got updated during retrieval. Using fallback ... ");
-
-				ret = getServiceResourcesBySecondary();
-			}
-
 			return ret;
 		}
 
@@ -344,7 +281,7 @@ public class RangerTagDBRetriever {
 			if (iterServiceResource.hasNext()) {
 				XXServiceResource xServiceResource = iterServiceResource.next();
 
-				if (xServiceResource != null) {
+				if (xServiceResource != null && StringUtils.isNotEmpty(xServiceResource.getTags())) {
 					ret = new RangerServiceResource();
 
 					ret.setId(xServiceResource.getId());
@@ -357,108 +294,35 @@ public class RangerTagDBRetriever {
 					ret.setVersion(xServiceResource.getVersion());
 					ret.setResourceSignature(xServiceResource.getResourceSignature());
 
-					getServiceResourceElements(ret);
-				}
-			}
-
-			return ret;
-		}
-
-		void getServiceResourceElements(RangerServiceResource serviceResource) {
-			while (iterServiceResourceElement.hasNext()) {
-				XXServiceResourceElement xServiceResourceElement = iterServiceResourceElement.next();
-
-				if (xServiceResourceElement.getResourceId().equals(serviceResource.getId())) {
-					RangerPolicyResource resource = new RangerPolicyResource();
-
-					resource.setIsExcludes(xServiceResourceElement.getIsExcludes());
-					resource.setIsRecursive(xServiceResourceElement.getIsRecursive());
-
-					while (iterServiceResourceElementValue.hasNext()) {
-						XXServiceResourceElementValue xServiceResourceElementValue = iterServiceResourceElementValue.next();
+					Map<String, RangerPolicy.RangerPolicyResource> serviceResourceElements = gsonBuilder.fromJson(xServiceResource.getServiceResourceElements(), RangerServiceResourceService.subsumedDataType);
+					ret.setResourceElements(serviceResourceElements);
 
-						if (xServiceResourceElementValue.getResElementId().equals(xServiceResourceElement.getId())) {
-							resource.getValues().add(xServiceResourceElementValue.getValue());
-						} else {
-							if (iterServiceResourceElementValue.hasPrevious()) {
-								iterServiceResourceElementValue.previous();
-							}
-							break;
-						}
-					}
-
-					serviceResource.getResourceElements().put(lookupCache.getResourceName(xServiceResourceElement.getResDefId()), resource);
-				} else if (xServiceResourceElement.getResourceId().compareTo(serviceResource.getId()) > 0) {
-					if (iterServiceResourceElement.hasPrevious()) {
-						iterServiceResourceElement.previous();
-					}
-					break;
+					List<RangerTag> tags = gsonBuilder.fromJson(xServiceResource.getTags(), RangerServiceResourceService.duplicatedDataType);
+					lookupCache.serviceResourceToTags.put(xServiceResource.getId(), tags);
 				}
 			}
-		}
 
-		boolean hasProcessedAll() {
-			boolean moreToProcess = iterServiceResource.hasNext()
-					|| iterServiceResourceElement.hasNext()
-					|| iterServiceResourceElementValue.hasNext();
-			return !moreToProcess;
-		}
-
-		List<RangerServiceResource> getServiceResourcesBySecondary() {
-			List<RangerServiceResource> ret = null;
-
-			if (service != null) {
-				List<XXServiceResource> xServiceResources = filterForServicePlugin ? daoMgr.getXXServiceResource().findForServicePlugin(service.getId()) : daoMgr.getXXServiceResource().findTaggedResourcesInServiceId(service.getId());
-
-				if (CollectionUtils.isNotEmpty(xServiceResources)) {
-					ret = new ArrayList<RangerServiceResource>(xServiceResources.size());
-
-					for (XXServiceResource xServiceResource : xServiceResources) {
-						TagRetrieverServiceResourceContext ctx = new TagRetrieverServiceResourceContext(xServiceResource, service);
-
-						RangerServiceResource serviceResource = ctx.getNextServiceResource();
-
-						if (serviceResource != null) {
-							ret.add(serviceResource);
-						}
-					}
-				}
-			}
 			return ret;
 		}
+
 	}
 
 	private class TagRetrieverTagDefContext {
 
 		final XXService service;
 		final ListIterator<XXTagDef> iterTagDef;
-		final ListIterator<XXTagAttributeDef> iterTagAttributeDef;
-
 
 		TagRetrieverTagDefContext(XXService xService) {
 			Long serviceId = xService == null ? null : xService.getId();
 
-			List<XXTagDef> xTagDefs = filterForServicePlugin ? daoMgr.getXXTagDef().findForServicePlugin(serviceId) : daoMgr.getXXTagDef().findByServiceId(serviceId);
-			List<XXTagAttributeDef> xTagAttributeDefs = filterForServicePlugin ? daoMgr.getXXTagAttributeDef().findForServicePlugin(serviceId) : daoMgr.getXXTagAttributeDef().findByServiceId(serviceId);
-
-			this.service = xService;
-			this.iterTagDef = xTagDefs.listIterator();
-			this.iterTagAttributeDef = xTagAttributeDefs.listIterator();
-		}
-
-		TagRetrieverTagDefContext(XXTagDef xTagDef, XXService xService) {
-			Long tagDefId = xTagDef == null ? null : xTagDef.getId();
-
-			List<XXTagDef> xTagDefs = asList(xTagDef);
-			List<XXTagAttributeDef> xTagAttributeDefs = daoMgr.getXXTagAttributeDef().findByTagDefId(tagDefId);
+			List<XXTagDef> xTagDefs = daoMgr.getXXTagDef().findByServiceId(serviceId);
 
 			this.service = xService;
 			this.iterTagDef = xTagDefs.listIterator();
-			this.iterTagAttributeDef = xTagAttributeDefs.listIterator();
 		}
 
 		Map<Long, RangerTagDef> getAllTagDefs() {
-			Map<Long, RangerTagDef> ret = new HashMap<Long, RangerTagDef>();
+			Map<Long, RangerTagDef> ret = new HashMap<>();
 
 			while (iterTagDef.hasNext()) {
 				RangerTagDef tagDef = getNextTagDef();
@@ -468,13 +332,6 @@ public class RangerTagDBRetriever {
 				}
 			}
 
-			if (!hasProcessedAllTagDefs()) {
-				LOG.warn("getAllTagDefs(): perhaps one or more tag-definitions got updated during retrieval.  Using fallback ... ");
-
-				ret = getTagDefsBySecondary();
-
-			}
-
 			return ret;
 		}
 
@@ -497,192 +354,15 @@ public class RangerTagDBRetriever {
 					ret.setVersion(xTagDef.getVersion());
 					ret.setName(xTagDef.getName());
 					ret.setSource(xTagDef.getSource());
-
-					getTagAttributeDefs(ret);
+					List<RangerTagDef.RangerTagAttributeDef> attributeDefs = gsonBuilder.fromJson(xTagDef.getTagAttrDefs(), RangerTagDBRetriever.subsumedDataType);
+					ret.setAttributeDefs(attributeDefs);
 				}
 			}
 
 			return ret;
 		}
 
-		void getTagAttributeDefs(RangerTagDef tagDef) {
-			while (iterTagAttributeDef.hasNext()) {
-				XXTagAttributeDef xTagAttributeDef = iterTagAttributeDef.next();
-
-				if (xTagAttributeDef.getTagDefId().equals(tagDef.getId())) {
-					RangerTagDef.RangerTagAttributeDef tagAttributeDef = new RangerTagDef.RangerTagAttributeDef();
-
-					tagAttributeDef.setName(xTagAttributeDef.getName());
-					tagAttributeDef.setType(xTagAttributeDef.getType());
-
-					tagDef.getAttributeDefs().add(tagAttributeDef);
-				} else if (xTagAttributeDef.getTagDefId().compareTo(tagDef.getId()) > 0) {
-					if (iterTagAttributeDef.hasPrevious()) {
-						iterTagAttributeDef.previous();
-					}
-					break;
-				}
-			}
-		}
-
-		boolean hasProcessedAllTagDefs() {
-			boolean moreToProcess = iterTagAttributeDef.hasNext();
-			return !moreToProcess;
-		}
-
-		Map<Long, RangerTagDef> getTagDefsBySecondary() {
-			Map<Long, RangerTagDef> ret = null;
-
-			if (service != null) {
-				List<XXTagDef> xTagDefs = daoMgr.getXXTagDef().findByServiceId(service.getId());
-
-				if (CollectionUtils.isNotEmpty(xTagDefs)) {
-					ret = new HashMap<Long, RangerTagDef>(xTagDefs.size());
-
-					for (XXTagDef xTagDef : xTagDefs) {
-						TagRetrieverTagDefContext ctx = new TagRetrieverTagDefContext(xTagDef, service);
-
-						RangerTagDef tagDef = ctx.getNextTagDef();
-
-						if (tagDef != null) {
-							ret.put(tagDef.getId(), tagDef);
-						}
-					}
-				}
-			}
-			return ret;
-		}
 	}
 
-	private class TagRetrieverTagContext {
-
-		final XXService service;
-		final ListIterator<XXTag> iterTag;
-		final ListIterator<XXTagAttribute> iterTagAttribute;
-
-		TagRetrieverTagContext(XXService xService) {
-			Long serviceId = xService == null ? null : xService.getId();
-
-			List<XXTag> xTags = filterForServicePlugin ? daoMgr.getXXTag().findForServicePlugin(serviceId) : daoMgr.getXXTag().findByServiceId(serviceId);
-			List<XXTagAttribute> xTagAttributes = filterForServicePlugin ? daoMgr.getXXTagAttribute().findForServicePlugin(serviceId) : daoMgr.getXXTagAttribute().findByServiceId(serviceId);
-
-			this.service = xService;
-			this.iterTag = xTags.listIterator();
-			this.iterTagAttribute = xTagAttributes.listIterator();
-
-		}
-
-		TagRetrieverTagContext(XXTag xTag, XXService xService) {
-			Long tagId = xTag == null ? null : xTag.getId();
-
-			List<XXTag> xTags = asList(xTag);
-			List<XXTagAttribute> xTagAttributes = daoMgr.getXXTagAttribute().findByTagId(tagId);
-
-			this.service = xService;
-			this.iterTag = xTags.listIterator();
-			this.iterTagAttribute = xTagAttributes.listIterator();
-		}
-
-
-		Map<Long, RangerTag> getAllTags() {
-			Map<Long, RangerTag> ret = new HashMap<Long, RangerTag>();
-
-			while (iterTag.hasNext()) {
-				RangerTag tag = getNextTag();
-
-				if (tag != null) {
-					ret.put(tag.getId(), tag);
-				}
-			}
-
-			if (!hasProcessedAllTags()) {
-				LOG.warn("getAllTags(): perhaps one or more tags got updated during retrieval. Using fallback ... ");
-
-				ret = getTagsBySecondary();
-			}
-
-			return ret;
-		}
-
-		RangerTag getNextTag() {
-			RangerTag ret = null;
-
-			if (iterTag.hasNext()) {
-				XXTag xTag = iterTag.next();
-
-				if (xTag != null) {
-					ret = new RangerTag();
-
-					ret.setId(xTag.getId());
-					ret.setGuid(xTag.getGuid());
-					ret.setOwner(xTag.getOwner());
-					ret.setCreatedBy(lookupCache.getUserScreenName(xTag.getAddedByUserId()));
-					ret.setUpdatedBy(lookupCache.getUserScreenName(xTag.getUpdatedByUserId()));
-					ret.setCreateTime(xTag.getCreateTime());
-					ret.setUpdateTime(xTag.getUpdateTime());
-					ret.setVersion(xTag.getVersion());
-
-					Map<Long, RangerTagDef> tagDefs = getTagDefs();
-					if (tagDefs != null) {
-						RangerTagDef tagDef = tagDefs.get(xTag.getType());
-						if (tagDef != null) {
-							ret.setType(tagDef.getName());
-						}
-					}
-
-					getTagAttributes(ret);
-				}
-			}
-
-			return ret;
-		}
-
-		void getTagAttributes(RangerTag tag) {
-			while (iterTagAttribute.hasNext()) {
-				XXTagAttribute xTagAttribute = iterTagAttribute.next();
-
-				if (xTagAttribute.getTagId().equals(tag.getId())) {
-					String attributeName = xTagAttribute.getName();
-					String attributeValue = xTagAttribute.getValue();
-
-
-					tag.getAttributes().put(attributeName, attributeValue);
-				} else if (xTagAttribute.getTagId().compareTo(tag.getId()) > 0) {
-					if (iterTagAttribute.hasPrevious()) {
-						iterTagAttribute.previous();
-					}
-					break;
-				}
-			}
-		}
-
-		boolean hasProcessedAllTags() {
-			boolean moreToProcess = iterTagAttribute.hasNext();
-			return !moreToProcess;
-		}
-
-		Map<Long, RangerTag> getTagsBySecondary() {
-			Map<Long, RangerTag> ret = null;
-
-			if (service != null) {
-				List<XXTag> xTags = daoMgr.getXXTag().findByServiceId(service.getId());
-
-				if (CollectionUtils.isNotEmpty(xTags)) {
-					ret = new HashMap<Long, RangerTag>(xTags.size());
-
-					for (XXTag xTag : xTags) {
-						TagRetrieverTagContext ctx = new TagRetrieverTagContext(xTag, service);
-
-						RangerTag tag = ctx.getNextTag();
-
-						if (tag != null) {
-							ret.put(tag.getId(), tag);
-						}
-					}
-				}
-			}
-			return ret;
-		}
-	}
 }