This is an automated email from the ASF dual-hosted git repository.

abhay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 74839e3  RANGER-2510: Support for Incremental tag updates to improve 
performance - part 3
74839e3 is described below

commit 74839e3ed04125b312c09543953b100fb103a8bb
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Wed Oct 16 17:45:10 2019 -0700

    RANGER-2510: Support for Incremental tag updates to improve performance - 
part 3
---
 .../RangerServiceResourceMatcher.java              | 13 ++----
 .../plugin/contextenricher/RangerTagEnricher.java  | 51 +++++++++++-----------
 .../validation/RangerZoneResourceMatcher.java      |  8 ++--
 .../policyengine/RangerPolicyRepository.java       | 12 +++--
 .../RangerAbstractPolicyEvaluator.java             |  8 ++--
 .../RangerPolicyResourceEvaluator.java             |  3 +-
 .../ranger/plugin/util/RangerResourceTrie.java     | 35 +++++++++------
 .../apache/ranger/plugin/util/ServiceDefUtil.java  | 18 ++++++++
 8 files changed, 87 insertions(+), 61 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerServiceResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerServiceResourceMatcher.java
index f9bbb12..7b02dd6 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerServiceResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerServiceResourceMatcher.java
@@ -37,12 +37,12 @@ public class RangerServiceResourceMatcher implements 
RangerPolicyResourceEvaluat
 
        private final RangerServiceResource       serviceResource;
        private final RangerPolicyResourceMatcher policyResourceMatcher;
-       private final Integer                     leafResourceLevel;
+       private RangerServiceDef.RangerResourceDef leafResourceDef;
 
        public RangerServiceResourceMatcher(final RangerServiceResource 
serviceResource, RangerPolicyResourceMatcher policyResourceMatcher) {
                this.serviceResource       = serviceResource;
                this.policyResourceMatcher = policyResourceMatcher;
-               this.leafResourceLevel     = 
ServiceDefUtil.getLeafResourceLevel(getServiceDef(), getPolicyResource());
+               this.leafResourceDef   = 
ServiceDefUtil.getLeafResourceDef(policyResourceMatcher.getServiceDef(), 
getPolicyResource());
        }
 
        public RangerServiceResource getServiceResource() { return 
serviceResource; }
@@ -66,18 +66,13 @@ public class RangerServiceResourceMatcher implements 
RangerPolicyResourceEvaluat
        }
 
        @Override
-       public Integer getLeafResourceLevel() {
-               return leafResourceLevel;
+       public boolean isAncestorOf(RangerServiceDef.RangerResourceDef 
resourceDef) {
+               return 
ServiceDefUtil.isAncestorOf(policyResourceMatcher.getServiceDef(), 
leafResourceDef, resourceDef);
        }
 
-
-
        public RangerPolicyResourceMatcher.MatchType 
getMatchType(RangerAccessResource requestedResource, Map<String, Object> 
evalContext) {
                return policyResourceMatcher != null ?  
policyResourceMatcher.getMatchType(requestedResource, evalContext) : 
RangerPolicyResourceMatcher.MatchType.NONE;
        }
-       RangerServiceDef getServiceDef() {
-               return policyResourceMatcher != null ? 
policyResourceMatcher.getServiceDef() : null;
-       }
 
        static class IdComparator implements 
Comparator<RangerServiceResourceMatcher>, Serializable {
                @Override
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
index 7434ec9..4e56f5c 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
@@ -467,41 +467,26 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
 
                for (RangerServiceResource serviceResource : 
changedServiceResources) {
 
-                       if (removeOldServiceResource(serviceResource, 
resourceMatchers, serviceResourceTrie)) {
+                       final boolean removedOldServiceResource = 
MapUtils.isEmpty(serviceResource.getResourceElements()) || 
removeOldServiceResource(serviceResource, resourceMatchers, 
serviceResourceTrie);
+                       if (removedOldServiceResource) {
 
                                if 
(!StringUtils.isEmpty(serviceResource.getResourceSignature())) {
 
                                        RangerServiceResourceMatcher 
resourceMatcher = createRangerServiceResourceMatcher(serviceResource, 
serviceDefHelper, hierarchies);
 
                                        if (resourceMatcher != null) {
-                                               for (String resourceDefName : 
serviceResource.getResourceElements().keySet()) {
-
-                                                       
RangerResourceTrie<RangerServiceResourceMatcher> trie = 
serviceResourceTrie.get(resourceDefName);
-
-                                                       if (trie == null) {
-                                                               
List<RangerServiceDef.RangerResourceDef> resourceDefs = 
serviceDef.getResources();
-                                                               
RangerServiceDef.RangerResourceDef found = null;
-                                                               for 
(RangerServiceDef.RangerResourceDef resourceDef : resourceDefs) {
-                                                                       if 
(StringUtils.equals(resourceDef.getName(), resourceDefName)) {
-                                                                               
found = resourceDef;
-                                                                               
break;
-                                                                       }
-                                                               }
-                                                               if (found != 
null) {
-                                                                       trie = 
new RangerResourceTrie<>(found, new ArrayList<>());
-                                                                       
serviceResourceTrie.put(resourceDefName, trie);
-                                                               }
-                                                       }
+                                               for 
(RangerServiceDef.RangerResourceDef resourceDef : serviceDef.getResources()) {
+
+                                                       
RangerResourceTrie<RangerServiceResourceMatcher> trie = 
serviceResourceTrie.get(resourceDef.getName());
 
                                                        if (trie != null) {
-                                                               
trie.add(serviceResource.getResourceElements().get(resourceDefName), 
resourceMatcher);
+                                                               
trie.add(serviceResource.getResourceElements().get(resourceDef.getName()), 
resourceMatcher);
                                                                if 
(LOG.isDebugEnabled()) {
                                                                        
LOG.debug("Added resource-matcher for service-resource:[" + serviceResource + 
"]");
                                                                }
                                                        } else {
-                                                               
LOG.error("Could not create resource-matcher for resource: [" + serviceResource 
+ "]. Should NOT happen!!");
-                                                               
LOG.error("Setting tagVersion to -1 to ensure that in the next download all 
tags are downloaded");
-                                                               isInError = 
true;
+                                                               trie = new 
RangerResourceTrie<>(resourceDef, Collections.singletonList(resourceMatcher));
+                                                               
serviceResourceTrie.put(resourceDef.getName(), trie);
                                                        }
                                                }
                                                
resourceMatchers.add(resourceMatcher);
@@ -526,6 +511,9 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                        LOG.error("Error in processing tag-deltas. Will 
continue to use old tags");
                        deltas.setTagVersion(-1L);
                } else {
+                       for (Map.Entry<String, 
RangerResourceTrie<RangerServiceResourceMatcher>> entry : 
serviceResourceTrie.entrySet()) {
+                               entry.getValue().wrapUpUpdate();
+                       }
                        enrichedServiceTags = new 
EnrichedServiceTags(allServiceTags, resourceMatchers, serviceResourceTrie);
                }
 
@@ -804,10 +792,13 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
        private static Set<RangerTagForEval> getTagsForServiceResource(final 
ServiceTags serviceTags, final RangerServiceResource serviceResource, final 
RangerPolicyResourceMatcher.MatchType matchType) {
                Set<RangerTagForEval> ret = new HashSet<>();
 
-               final Long resourceId = serviceResource.getId();
-
+               final Long resourceId                        = 
serviceResource.getId();
                final Map<Long, List<Long>> resourceToTagIds = 
serviceTags.getResourceToTagIds();
-               final Map<Long, RangerTag> tags = serviceTags.getTags();
+               final Map<Long, RangerTag> tags              = 
serviceTags.getTags();
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Looking for tags for resource-id:[" + 
resourceId + "] in serviceTags:[" + serviceTags + "]");
+               }
 
                if (resourceId != null && MapUtils.isNotEmpty(resourceToTagIds) 
&& MapUtils.isNotEmpty(tags)) {
 
@@ -823,6 +814,14 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                                                ret.add(new 
RangerTagForEval(tag, matchType));
                                        }
                                }
+                       } else {
+                               if (LOG.isDebugEnabled()) {
+                                       LOG.debug("No tags mapping found for 
resource:[" + resourceId + "]");
+                               }
+                       }
+               } else {
+                       if (LOG.isDebugEnabled()) {
+                               LOG.debug("resourceId is null or 
resourceToTagTds mapping is null or tags mapping is null!");
                        }
                }
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
index c7f5bc4..2b570f6 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
@@ -39,7 +39,7 @@ public class RangerZoneResourceMatcher implements 
RangerPolicyResourceEvaluator
     private final String                                         
securityZoneName;
     private final Map<String, RangerPolicy.RangerPolicyResource> 
policyResource;
     private final RangerPolicyResourceMatcher                    
policyResourceMatcher;
-    private final Integer                                        
leafResourceLevel;
+    private RangerServiceDef.RangerResourceDef                   
leafResourceDef;
 
     public RangerZoneResourceMatcher(final String securityZoneName, final 
Map<String, RangerPolicy.RangerPolicyResource> policyResource, final 
RangerServiceDef serviceDef) {
 
@@ -77,7 +77,7 @@ public class RangerZoneResourceMatcher implements 
RangerPolicyResourceEvaluator
         this.securityZoneName      = securityZoneName;
         this.policyResourceMatcher = matcher;
         this.policyResource        = policyResource;
-        this.leafResourceLevel     = 
ServiceDefUtil.getLeafResourceLevel(serviceDef, policyResource);
+        this.leafResourceDef   = ServiceDefUtil.getLeafResourceDef(serviceDef, 
getPolicyResource());
     }
 
     public String getSecurityZoneName() { return securityZoneName; }
@@ -101,8 +101,8 @@ public class RangerZoneResourceMatcher implements 
RangerPolicyResourceEvaluator
     }
 
     @Override
-    public Integer getLeafResourceLevel() {
-        return leafResourceLevel;
+    public boolean isAncestorOf(RangerServiceDef.RangerResourceDef 
resourceDef) {
+        return 
ServiceDefUtil.isAncestorOf(policyResourceMatcher.getServiceDef(), 
leafResourceDef, resourceDef);
     }
 
     @Override
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
index abc57df..065120f 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
@@ -1118,6 +1118,14 @@ class RangerPolicyRepository {
 
             RangerResourceTrie<RangerPolicyEvaluator> trie = 
trieMap.get(resourceDefName);
 
+            if (trie == null) {
+                if (RangerPolicyDelta.CHANGE_TYPE_POLICY_DELETE == 
policyDeltaType || RangerPolicyDelta.CHANGE_TYPE_POLICY_UPDATE == 
policyDeltaType) {
+                    LOG.warn("policyDeltaType is not for POLICY_CREATE and 
trie for resourceDef:[" + resourceDefName + "] was null! Should not have 
happened!!");
+                }
+                trie = new RangerResourceTrie<>(resourceDef, new 
ArrayList<>(), RangerPolicyEvaluator.EVAL_ORDER_COMPARATOR, true);
+                trieMap.put(resourceDefName, trie);
+            }
+
             if (policyDeltaType == 
RangerPolicyDelta.CHANGE_TYPE_POLICY_CREATE) {
                 addEvaluatorToTrie(newEvaluator, trie, resourceDefName);
             } else if (policyDeltaType == 
RangerPolicyDelta.CHANGE_TYPE_POLICY_DELETE) {
@@ -1137,9 +1145,7 @@ class RangerPolicyRepository {
     private void addEvaluatorToTrie(RangerPolicyEvaluator newEvaluator, 
RangerResourceTrie<RangerPolicyEvaluator> trie, String resourceDefName) {
         if (newEvaluator != null) {
             RangerPolicy.RangerPolicyResource resource = 
newEvaluator.getPolicyResource().get(resourceDefName);
-            if (resource != null) {
-                trie.add(resource, newEvaluator);
-            }
+            trie.add(resource, newEvaluator);
         }
     }
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
index 4d6962f..689985c 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
@@ -37,7 +37,7 @@ public abstract class RangerAbstractPolicyEvaluator 
implements RangerPolicyEvalu
 
        private RangerPolicy     policy;
        private RangerServiceDef serviceDef;
-       private Integer          leafResourceLevel;
+       private RangerServiceDef.RangerResourceDef leafResourceDef;
        private int              evalOrder;
        protected long           usageCount;
        protected boolean        usageCountMutable = true;
@@ -51,7 +51,7 @@ public abstract class RangerAbstractPolicyEvaluator 
implements RangerPolicyEvalu
 
                this.policy            = policy;
                this.serviceDef        = serviceDef;
-               this.leafResourceLevel = 
ServiceDefUtil.getLeafResourceLevel(serviceDef, getPolicyResource());
+               this.leafResourceDef   = 
ServiceDefUtil.getLeafResourceDef(serviceDef, getPolicyResource());
 
                if(LOG.isDebugEnabled()) {
                        LOG.debug("<== RangerAbstractPolicyEvaluator.init(" + 
policy + ", " + serviceDef + ")");
@@ -84,8 +84,8 @@ public abstract class RangerAbstractPolicyEvaluator 
implements RangerPolicyEvalu
        }
 
        @Override
-       public Integer getLeafResourceLevel() {
-               return leafResourceLevel;
+       public boolean isAncestorOf(RangerServiceDef.RangerResourceDef 
resourceDef) {
+               return ServiceDefUtil.isAncestorOf(serviceDef, leafResourceDef, 
resourceDef);
        }
 
        public boolean hasAllow() {
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceEvaluator.java
index 7d43b4b..9da9fac 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceEvaluator.java
@@ -21,6 +21,7 @@ package org.apache.ranger.plugin.policyresourcematcher;
 
 
 import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 
 import java.util.Map;
@@ -34,5 +35,5 @@ public interface RangerPolicyResourceEvaluator {
 
     RangerResourceMatcher getResourceMatcher(String resourceName);
 
-    Integer getLeafResourceLevel();
+    boolean isAncestorOf(RangerServiceDef.RangerResourceDef resourceDef);
 }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
index 0cba882..1afd07d 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
@@ -50,7 +50,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
     private static final String DEFAULT_WILDCARD_CHARS = "*?";
     private static final String TRIE_BUILDER_THREAD_COUNT = 
"ranger.policyengine.trie.builder.thread.count";
 
-    private final String resourceName;
+    private final RangerServiceDef.RangerResourceDef resourceDef;
     private final boolean optIgnoreCase;
     private final boolean optWildcard;
     private final String wildcardChars;
@@ -99,7 +99,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             tokenReplaceSpecialChars += delimiterEscape;
         }
 
-        this.resourceName  = resourceDef.getName();
+        this.resourceDef   = resourceDef;
         this.optIgnoreCase = 
RangerAbstractResourceMatcher.getOptionIgnoreCase(matcherOptions);
         this.optWildcard   = 
RangerAbstractResourceMatcher.getOptionWildCard(matcherOptions);
         this.wildcardChars = optWildcard ? DEFAULT_WILDCARD_CHARS + 
tokenReplaceSpecialChars : "" + tokenReplaceSpecialChars;
@@ -123,7 +123,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         if (TRACE_LOG.isTraceEnabled()) {
             StringBuilder sb = new StringBuilder();
             root.toString("", sb);
-            TRACE_LOG.trace("Trie Dump from RangerResourceTrie.init(name=" + 
resourceName + "):\n{" + sb.toString() + "}");
+            TRACE_LOG.trace("Trie Dump from RangerResourceTrie.init(name=" + 
resourceDef.getName() + "):\n{" + sb.toString() + "}");
         }
 
         if(LOG.isDebugEnabled()) {
@@ -132,7 +132,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
     }
 
     public String getResourceName() {
-        return resourceName;
+        return resourceDef.getName();
     }
 
     public List<T> getEvaluatorsForResource(Object resource) {
@@ -160,12 +160,18 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, 
"RangerResourceTrie.add(name=" + resource + ")");
         }
 
-        if (resource.getIsExcludes()) {
-            root.addWildcardEvaluator(evaluator);
+        if (resource == null) {
+            if (evaluator.isAncestorOf(resourceDef)) {
+                root.addWildcardEvaluator(evaluator);
+            }
         } else {
-            if (CollectionUtils.isNotEmpty(resource.getValues())) {
-                for (String value : resource.getValues()) {
-                    insert(root, value, resource.getIsRecursive(), evaluator);
+            if (resource.getIsExcludes()) {
+                root.addWildcardEvaluator(evaluator);
+            } else {
+                if (CollectionUtils.isNotEmpty(resource.getValues())) {
+                    for (String value : resource.getValues()) {
+                        insert(root, value, resource.getIsRecursive(), 
evaluator);
+                    }
                 }
             }
         }
@@ -372,10 +378,10 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         RangerPerfTracer perf = null;
 
         if(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_INIT_LOG)) {
-            perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, 
"RangerResourceTrie.copyTrie(name=" + other.resourceName + ")");
+            perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, 
"RangerResourceTrie.copyTrie(name=" + other.resourceDef.getName() + ")");
         }
 
-        this.resourceName = other.resourceName;
+        this.resourceDef = other.resourceDef;
         this.optIgnoreCase = other.optIgnoreCase;
         this.optWildcard = other.optWildcard;
         this.wildcardChars = other.wildcardChars;
@@ -391,7 +397,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         if (TRACE_LOG.isTraceEnabled()) {
             StringBuilder sb = new StringBuilder();
             root.toString("", sb);
-            TRACE_LOG.trace("Trie Dump from RangerResourceTrie.copyTrie(name=" 
+ other.resourceName + "):\n{" + sb.toString() + "}");
+            TRACE_LOG.trace("Trie Dump from RangerResourceTrie.copyTrie(name=" 
+ other.resourceDef.getName() + "):\n{" + sb.toString() + "}");
         }
     }
 
@@ -410,6 +416,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         final boolean                         isMultiThreaded = 
builderThreadCount > 1;
         final List<ResourceTrieBuilderThread> builderThreads;
         final Map<Character, Integer>         builderThreadMap;
+        final String                          resourceName = 
resourceDef.getName();
         int                                   lastUsedThreadIndex = 0;
 
         if (isMultiThreaded) {
@@ -431,7 +438,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             RangerPolicyResource policyResource = policyResources != null ? 
policyResources.get(resourceName) : null;
 
             if (policyResource == null) {
-                if (evaluator.getLeafResourceLevel() != null && 
resourceDef.getLevel() != null && evaluator.getLeafResourceLevel() < 
resourceDef.getLevel()) {
+                if (evaluator.isAncestorOf(resourceDef)) {
                     ret.addWildcardEvaluator(evaluator);
                 }
 
@@ -763,7 +770,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
 
         TrieData trieData = getTrieData();
 
-        sb.append("resourceName=").append(resourceName);
+        sb.append("resourceName=").append(resourceDef.getName());
         sb.append("; optIgnoreCase=").append(optIgnoreCase);
         sb.append("; optWildcard=").append(optWildcard);
         sb.append("; wildcardChars=").append(wildcardChars);
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceDefUtil.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceDefUtil.java
index f383241..f82f65f 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceDefUtil.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServiceDefUtil.java
@@ -128,6 +128,24 @@ public class ServiceDefUtil {
         return ret;
     }
 
+    public static boolean isAncestorOf(RangerServiceDef serviceDef, 
RangerResourceDef ancestor, RangerResourceDef descendant) {
+
+        boolean ret = false;
+
+        if (ancestor != null && descendant != null) {
+            final String ancestorName = ancestor.getName();
+
+            for (RangerResourceDef node = descendant; node != null; node = 
ServiceDefUtil.getResourceDef(serviceDef, node.getParent())) {
+                if (StringUtils.equalsIgnoreCase(ancestorName, 
node.getParent())) {
+                    ret = true;
+                    break;
+                }
+            }
+        }
+
+        return ret;
+    }
+
     public static boolean isEmpty(RangerPolicy.RangerPolicyResource 
policyResource) {
         boolean ret = true;
         if (policyResource != null) {

Reply via email to