RANGER-1781: Policy model update to support restricted access-types based on 
selected resource (more performance improvements)


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

Branch: refs/heads/master
Commit: 2a1406df8125b96b3051616cb61ba01fc96f93c3
Parents: 0688f5e
Author: Abhay Kulkarni <akulka...@hortonworks.com>
Authored: Fri Nov 10 07:34:34 2017 -0800
Committer: Abhay Kulkarni <akulka...@hortonworks.com>
Committed: Fri Nov 10 07:34:34 2017 -0800

----------------------------------------------------------------------
 .../policyengine/RangerPolicyEngineImpl.java    |   4 +-
 .../RangerDefaultPolicyResourceMatcher.java     | 364 ++++++----
 .../RangerPolicyResourceMatcher.java            |   2 +-
 .../RangerAbstractResourceMatcher.java          |   2 +-
 .../validation/TestRangerServiceDefHelper.java  |  16 +-
 .../plugin/policyengine/TestPolicyDb.java       |  40 +-
 .../TestDefaultPolicyResourceMatcher.java       |  46 +-
 ...stDefaultPolicyResourceMatcherForPolicy.java |  55 +-
 .../service-defs/test-hbase-servicedef.json     | 241 +++++++
 .../service-defs/test-hdfs-servicedef.json      | 286 ++++++++
 .../service-defs/test-hive-servicedef.json      | 679 +++++++++++++------
 .../admin/service-defs/test-tag-servicedef.json |  82 +++
 agents-common/src/test/resources/log4j.xml      |  18 +-
 .../policyengine/test_policydb_hive.json        | 441 ++++++++++++
 .../test_defaultpolicyresourcematcher.json      |  28 +-
 ...ltpolicyresourcematcher_for_hive_policy.json | 410 +++++++++++
 ...defaultpolicyresourcematcher_for_policy.json | 315 ---------
 ...rcematcher_for_resource_specific_policy.json | 335 ---------
 .../test/resources/testdata/test_modules.txt    |   2 +
 19 files changed, 2300 insertions(+), 1066 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
index 2bebb95..cff7a5e 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
@@ -572,7 +572,7 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                                        for (List<RangerPolicyEvaluator> 
evaluators : likelyEvaluators) {
                                                for (RangerPolicyEvaluator 
evaluator : evaluators) {
                                                        
RangerPolicyResourceMatcher matcher = evaluator.getPolicyResourceMatcher();
-                                                       if (matcher != null && 
matcher.isMatch(tagResource, 
RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR_OR_DESCENDANT, null)) {
+                                                       if (matcher != null && 
matcher.isMatch(tagResource, RangerPolicyResourceMatcher.MatchScope.ANY, null)) 
{
                                                                
ret.add(evaluator.getPolicy());
                                                        }
                                                }
@@ -591,7 +591,7 @@ public class RangerPolicyEngineImpl implements 
RangerPolicyEngine {
                        for (List<RangerPolicyEvaluator> evaluators : 
likelyEvaluators) {
                                for (RangerPolicyEvaluator evaluator : 
evaluators) {
                                        RangerPolicyResourceMatcher matcher = 
evaluator.getPolicyResourceMatcher();
-                                       if (matcher != null && 
matcher.isMatch(resource, 
RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR_OR_DESCENDANT, null)) {
+                                       if (matcher != null && 
matcher.isMatch(resource, RangerPolicyResourceMatcher.MatchScope.ANY, null)) {
                                                ret.add(evaluator.getPolicy());
                                        }
                                }

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
index 74b70be..415263e 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
@@ -20,7 +20,6 @@
 package org.apache.ranger.plugin.policyresourcematcher;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -40,10 +39,14 @@ import 
org.apache.ranger.plugin.policyengine.RangerAccessResource;
 import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
 import org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
+import org.apache.ranger.plugin.util.RangerPerfTracer;
 
 public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceMatcher {
     private static final Log LOG = 
LogFactory.getLog(RangerDefaultPolicyResourceMatcher.class);
 
+    private static final Log PERF_POLICY_RESOURCE_MATCHER_INIT_LOG = 
RangerPerfTracer.getPerfLogger("policyresourcematcher.init");
+    private static final Log PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG = 
RangerPerfTracer.getPerfLogger("policyresourcematcher.match");
+
     protected RangerServiceDef                  serviceDef;
     protected int                               policyType;
     protected Map<String, RangerPolicyResource> policyResources;
@@ -74,7 +77,6 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
         } else {
             setPolicyResources(policy.getResources(), policy.getPolicyType() 
== null ? RangerPolicy.POLICY_TYPE_ACCESS : policy.getPolicyType());
         }
-
     }
 
     @Override
@@ -98,6 +100,16 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
     }
 
     @Override
+    public RangerServiceDef getServiceDef() {
+        return serviceDef;
+    }
+
+    @Override
+    public RangerResourceMatcher getResourceMatcher(String resourceName) {
+        return allMatchers != null ? allMatchers.get(resourceName) : null;
+    }
+
+    @Override
     public boolean getNeedsDynamicEval() { return needsDynamicEval; }
 
     @Override
@@ -110,10 +122,15 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
         needsDynamicEval       = false;
         validResourceHierarchy = null;
         isInitialized          = false;
-        serviceDefHelper       = null;
 
         String errorText = "";
 
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_INIT_LOG)) {
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_INIT_LOG, 
"RangerDefaultPolicyResourceMatcher.init()");
+        }
+
         if (policyResources != null && !policyResources.isEmpty() && 
serviceDef != null) {
             serviceDefHelper                                    = 
serviceDefHelper == null ? new RangerServiceDefHelper(serviceDef, false) : 
serviceDefHelper;
 
@@ -204,35 +221,37 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
             isInitialized = true;
         }
 
+        RangerPerfTracer.log(perf);
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("<== RangerDefaultPolicyResourceMatcher.init(): ret=" + 
isInitialized);
         }
     }
 
     @Override
-    public RangerServiceDef getServiceDef() {
-        return serviceDef;
-    }
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
 
-    @Override
-    public RangerResourceMatcher getResourceMatcher(String resourceName) {
-        return allMatchers != null ? allMatchers.get(resourceName) : null;
+        return toString(sb).toString();
     }
 
     @Override
-    public boolean isMatch(Map<String, RangerPolicyResource> resources, 
Map<String, Object> evalContext) {
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("==> RangerDefaultPolicyResourceMatcher.isMatch(" + 
resources  + ", " + evalContext + ")");
-        }
-
-        boolean ret = isMatch(resources, MatchScope.SELF_OR_ANCESTOR, true, 
evalContext);
+    public StringBuilder toString(StringBuilder sb) {
+        sb.append("RangerDefaultPolicyResourceMatcher={");
 
+        sb.append("isInitialized=").append(isInitialized).append(", ");
 
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("<== RangerDefaultPolicyResourceMatcher.isMatch(" + 
resources  + ", " + evalContext + "): " + ret);
+        sb.append("matchers={");
+        if(allMatchers != null) {
+            for(RangerResourceMatcher matcher : allMatchers.values()) {
+                sb.append("{").append(matcher).append("} ");
+            }
         }
+        sb.append("} ");
 
-        return ret;
+        sb.append("}");
+
+        return sb;
     }
 
     @Override
@@ -241,6 +260,12 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
             LOG.debug("==> 
RangerDefaultPolicyResourceMatcher.isCompleteMatch(" + resource + ", " + 
evalContext + ")");
         }
 
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.grantRevokeMatch()");
+        }
+
         boolean            ret          = false;
         Collection<String> resourceKeys = resource == null ? null : 
resource.getKeys();
         Collection<String> policyKeys   = policyResources == null ? null : 
policyResources.keySet();
@@ -268,6 +293,8 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
             }
         }
 
+        RangerPerfTracer.log(perf);
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("<== 
RangerDefaultPolicyResourceMatcher.isCompleteMatch(" + resource + ", " + 
evalContext + "): " + ret);
         }
@@ -281,6 +308,12 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
             LOG.debug("==> 
RangerDefaultPolicyResourceMatcher.isCompleteMatch(" + resources + ", " + 
evalContext + ")");
         }
 
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.applyPolicyMatch()");
+        }
+
         boolean            ret          = false;
         Collection<String> resourceKeys = resources == null ? null : 
resources.keySet();
         Collection<String> policyKeys   = policyResources == null ? null : 
policyResources.keySet();
@@ -308,6 +341,8 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
             }
         }
 
+        RangerPerfTracer.log(perf);
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("<== 
RangerDefaultPolicyResourceMatcher.isCompleteMatch(" + resources + ", " + 
evalContext + "): " + ret);
         }
@@ -316,19 +351,18 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
     }
 
     @Override
-    public boolean isMatch(RangerAccessResource resource, Map<String, Object> 
evalContext) {
-        return isMatch(resource, MatchScope.SELF_OR_ANCESTOR, evalContext);
-    }
-
-    @Override
     public boolean isMatch(RangerPolicy policy, MatchScope scope, Map<String, 
Object> evalContext) {
-        return policy.getPolicyType() == policyType && 
isMatch(policy.getResources(), scope, false, evalContext);
-    }
-
-    private boolean isMatch(Map<String, RangerPolicyResource> resources, 
MatchScope scope, boolean mustMatchAllPolicyValues, Map<String, Object> 
evalContext) {
         boolean ret = false;
 
-        if (MapUtils.isNotEmpty(resources)) {
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.getPoliciesNonLegacy()");
+        }
+
+        Map<String, RangerPolicyResource> resources = policy.getResources();
+
+        if (policy.getPolicyType() == policyType && 
MapUtils.isNotEmpty(resources)) {
             List<RangerResourceDef> hierarchy = 
getMatchingHierarchy(resources.keySet());
 
             if (CollectionUtils.isNotEmpty(hierarchy)) {
@@ -349,9 +383,10 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
                 // level, the final matchType (which is for the entire policy) 
is checked against
                 // requested scope to determine the match-result.
 
-                // Unit tests in TestDefaultPolicyResourceForPolicy.java, 
test_defaultpolicyresourcematcher_for_policy.json,
+                // Unit tests in TestDefaultPolicyResourceForPolicy.java, 
TestDefaultPolicyResourceMatcher.java
                 // test_defaultpolicyresourcematcher_for_hdfs_policy.json, and
-                // 
test_defaultpolicyresourcematcher_for_resource_specific_policy.json
+                // test_defaultpolicyresourcematcher_for_hive_policy.json, and
+                // test_defaultPolicyResourceMatcher.json
 
                 boolean skipped = false;
 
@@ -371,10 +406,7 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
 
                                 if (matchType != MatchType.NONE) { // One 
value for this resourceDef matched
                                     ret = true;
-
-                                    if (!mustMatchAllPolicyValues) {
-                                        break;
-                                    }
+                                    break;
                                 }
                             }
                         } else {
@@ -388,10 +420,107 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
                         break;
                     }
                 }
+
                 ret = ret && isMatch(scope, matchType);
             }
         }
 
+        RangerPerfTracer.log(perf);
+
+        return ret;
+    }
+
+    @Override
+    public boolean isMatch(RangerAccessResource resource, Map<String, Object> 
evalContext) {
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.grantRevokeMatch()");
+        }
+
+        /*
+        * There is already API to get the delegateAdmin permissions for a map 
of policyResources.
+        * That implementation should be reused for figuring out delegateAdmin 
permissions for a resource as well.
+         */
+
+        Map<String, RangerPolicyResource> policyResources = null;
+
+        for (RangerResourceDef resourceDef : serviceDef.getResources()) {
+            String resourceName = resourceDef.getName();
+            String resourceValue = resource.getValue(resourceName);
+            if (resourceValue != null) {
+                if (policyResources == null) {
+                    policyResources = new HashMap<>();
+                }
+                policyResources.put(resourceName, new 
RangerPolicyResource(resourceValue));
+            }
+        }
+        final boolean ret = MapUtils.isNotEmpty(policyResources) && 
isMatch(policyResources, evalContext);
+
+        RangerPerfTracer.log(perf);
+
+        return ret;
+    }
+
+    @Override
+    public boolean isMatch(Map<String, RangerPolicyResource> resources, 
Map<String, Object> evalContext) {
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("==> RangerDefaultPolicyResourceMatcher.isMatch(" + 
resources  + ", " + evalContext + ")");
+        }
+
+        boolean ret = false;
+
+        RangerPerfTracer perf = null;
+
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.delegateAdminMatch()");
+        }
+
+        if(serviceDef != null && serviceDef.getResources() != null) {
+            Collection<String> resourceKeys = resources == null ? null : 
resources.keySet();
+            Collection<String> policyKeys   = policyResources == null ? null : 
policyResources.keySet();
+
+            boolean keysMatch = CollectionUtils.isEmpty(resourceKeys) || 
(policyKeys != null && policyKeys.containsAll(resourceKeys));
+
+            if(keysMatch) {
+                for(RangerResourceDef resourceDef : serviceDef.getResources()) 
{
+                    String                resourceName   = 
resourceDef.getName();
+                    RangerPolicyResource  resourceValues = resources == null ? 
null : resources.get(resourceName);
+                    List<String>          values         = resourceValues == 
null ? null : resourceValues.getValues();
+                    RangerResourceMatcher matcher        = allMatchers == null 
? null : allMatchers.get(resourceName);
+
+                    if (matcher != null) {
+                        if (CollectionUtils.isNotEmpty(values)) {
+                            for (String value : values) {
+                                ret = matcher.isMatch(value, evalContext);
+                                if (!ret) {
+                                    break;
+                                }
+                            }
+                        } else {
+                            ret = matcher.isMatchAny();
+                        }
+                    } else {
+                        ret = CollectionUtils.isEmpty(values);
+                    }
+
+                    if(! ret) {
+                        break;
+                    }
+                }
+            } else {
+                if(LOG.isDebugEnabled()) {
+                    LOG.debug("isMatch(): keysMatch=false. resourceKeys=" + 
resourceKeys + "; policyKeys=" + policyKeys);
+                }
+            }
+        }
+
+        RangerPerfTracer.log(perf);
+
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("<== RangerDefaultPolicyResourceMatcher.isMatch(" + 
resources  + ", " + evalContext + "): " + ret);
+        }
+
         return ret;
     }
 
@@ -406,91 +535,81 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
         if (LOG.isDebugEnabled()) {
             LOG.debug("==> RangerDefaultPolicyResourceMatcher.getMatchType(" + 
resource + evalContext + ")");
         }
-
         MatchType ret              = MatchType.NONE;
-        int       policyKeysSize   = policyResources == null ? 0 : 
policyResources.size();
-        int       resourceKeysSize = resource == null || resource.getKeys() == 
null ? 0 : resource.getKeys().size();
 
-        if (policyKeysSize == 0 && resourceKeysSize == 0) {
-            ret = MatchType.SELF;
-        } else {
-            List<RangerResourceDef> hierarchy = getMatchingHierarchy(resource);
-            if (CollectionUtils.isNotEmpty(hierarchy)) {
-                int lastNonAnyMatcherIndex = 0;
-                /*
-                 * For hive resource policy:
-                 *     lastNonAnyMatcherIndex will be set to
-                 *         0 : if all matchers in policy are '*'; such as 
database=*, table=*, column=*
-                 *         1 : database=hr, table=*, column=*
-                 *         2 : database=<any>, table=employee, column=*
-                 *         3 : database=<any>, table=<any>, column=ssn
-                */
-                int matchersSize = 0;
+        RangerPerfTracer perf = null;
 
-                for (RangerResourceDef resourceDef : hierarchy) {
-                    RangerResourceMatcher matcher = 
getResourceMatcher(resourceDef.getName());
-                    if (matcher != null) {
-                        matchersSize++;
-                        if (!matcher.isMatchAny()) {
-                            lastNonAnyMatcherIndex = matchersSize;
+        
if(RangerPerfTracer.isPerfTraceEnabled(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG)) 
{
+            perf = 
RangerPerfTracer.getPerfTracer(PERF_POLICY_RESOURCE_MATCHER_MATCH_LOG, 
"RangerDefaultPolicyResourceMatcher.getMatchType()");
+        }
+
+        if (resource != null && policyResources != null) {
+            int resourceKeysSize = resource.getKeys() == null ? 0 : 
resource.getKeys().size();
+
+            if (policyResources.size() == 0 && resourceKeysSize == 0) {
+                ret = MatchType.SELF;
+            } else {
+                List<RangerResourceDef> hierarchy = 
getMatchingHierarchy(resource);
+                if (CollectionUtils.isNotEmpty(hierarchy)) {
+
+                    int lastNonAnyMatcherIndex = -1;
+                    int matchersSize = 0;
+
+                    for (RangerResourceDef resourceDef : hierarchy) {
+                        RangerResourceMatcher matcher = 
getResourceMatcher(resourceDef.getName());
+                        if (matcher != null) {
+                            if (!matcher.isMatchAny()) {
+                                lastNonAnyMatcherIndex = matchersSize;
+                            }
+                            matchersSize++;
+                        } else {
+                            break;
                         }
                     }
-                }
 
-                if (resourceKeysSize == 0 && lastNonAnyMatcherIndex == 0) {
-                    ret = MatchType.SELF;
-                } else if (lastNonAnyMatcherIndex == 0) {
-                    ret = MatchType.ANCESTOR;
-                } else if (resourceKeysSize == 0) {
-                    ret = MatchType.DESCENDANT;
-                } else {
-                    int index = 0;
+                    int lastMatchedMatcherIndex = -1;
+
                     for (RangerResourceDef resourceDef : hierarchy) {
 
-                        String resourceName = resourceDef.getName();
-                        RangerResourceMatcher matcher = 
getResourceMatcher(resourceName);
-                        String resourceValue = resource.getValue(resourceName);
+                        RangerResourceMatcher matcher = 
getResourceMatcher(resourceDef.getName());
+                        String resourceValue = 
resource.getValue(resourceDef.getName());
 
-                        if (resourceValue != null) {
-                            if (matcher != null) {
-                                index++;
+                        if (matcher != null) {
+                            if (resourceValue != null) {
                                 if (matcher.isMatch(resourceValue, 
evalContext)) {
-                                    ret = index == resourceKeysSize && 
matcher.isMatchAny() ? MatchType.ANCESTOR : MatchType.SELF;
+                                    ret = MatchType.SELF;
+                                    lastMatchedMatcherIndex++;
                                 } else {
                                     ret = MatchType.NONE;
                                     break;
                                 }
                             } else {
-                                // More resource-levels than matchers
-                                ret = MatchType.ANCESTOR;
+                                // More matchers than resource-values
+                                ret = MatchType.DESCENDANT;
+
+                                if (lastMatchedMatcherIndex >= 
lastNonAnyMatcherIndex) {
+                                    ret = MatchType.ANCESTOR;
+                                    if (lastMatchedMatcherIndex == 
lastNonAnyMatcherIndex && lastMatchedMatcherIndex == -1) {
+                                        // For degenerate case : 
resourceKeysSize == 0 and all matchers are of type Any
+                                        ret = MatchType.SELF;
+                                    }
+                                }
                                 break;
                             }
                         } else {
-                            if (matcher != null) {
-                                // More matchers than resource-levels
-                                if (index >= lastNonAnyMatcherIndex) {
-                                    // All AnyMatch matchers after this
-                                    ret = MatchType.ANCESTOR;
-                                } else {
-                                    ret = MatchType.DESCENDANT;
-                                }
-                            } else {
-                                // Common part of several possible hierarchies 
matched
-                                if (resourceKeysSize > index) {
-                                    ret = MatchType.ANCESTOR;
-                                }
+                            if (resourceValue != null) {
+                                // More resource-values than matchers
+                                ret = MatchType.ANCESTOR;
                             }
                             break;
                         }
                     }
-                    if (ret == MatchType.SELF && resourceKeysSize > 
matchersSize) {
-                        ret = MatchType.ANCESTOR;
-                    }
                 }
             }
-
         }
 
+        RangerPerfTracer.log(perf);
+
         if (LOG.isDebugEnabled()) {
             LOG.debug("<== RangerDefaultPolicyResourceMatcher.getMatchType(" + 
resource + evalContext + "): " + ret);
         }
@@ -519,15 +638,18 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
                     }
                 }
             }
-        }
+        } else {
+            ret = false;
+         }
 
         return ret;
     }
+
     private List<RangerResourceDef> getMatchingHierarchy(Set<String> 
resourceKeys) {
         List<RangerResourceDef> ret = null;
 
-        if (CollectionUtils.isNotEmpty(resourceKeys)) {
-            Set<List<RangerResourceDef>> resourceHierarchies = 
serviceDefHelper == null ? Collections.EMPTY_SET : 
serviceDefHelper.getResourceHierarchies(policyType, resourceKeys);
+        if (CollectionUtils.isNotEmpty(resourceKeys) && serviceDefHelper != 
null) {
+            Set<List<RangerResourceDef>> resourceHierarchies = 
serviceDefHelper.getResourceHierarchies(policyType, resourceKeys);
 
             // pick the shortest hierarchy
             for (List<RangerResourceDef> resourceHierarchy : 
resourceHierarchies) {
@@ -554,25 +676,26 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
 
         final List<RangerResourceDef> ret;
 
-        Set<String> policyResourcesKeySet = policyResources == null ? 
Collections.EMPTY_SET : policyResources.keySet();
+        Set<String> policyResourcesKeySet = policyResources.keySet();
+        Set<String> resourceKeySet = resource.getKeys();
 
-        if (resource != null && resource.getKeys() != null) {
+        if (CollectionUtils.isNotEmpty(resourceKeySet)) {
             List<RangerResourceDef> aValidHierarchy = null;
 
             if (validResourceHierarchy != null && serviceDefHelper != null) {
-                if 
(serviceDefHelper.hierarchyHasAllResources(validResourceHierarchy, 
resource.getKeys())) {
+                if 
(serviceDefHelper.hierarchyHasAllResources(validResourceHierarchy, 
resourceKeySet)) {
                     aValidHierarchy = validResourceHierarchy;
                 }
             } else {
-                if (policyResourcesKeySet.containsAll(resource.getKeys())) {
+                if (policyResourcesKeySet.containsAll(resourceKeySet)) {
                     aValidHierarchy = 
getMatchingHierarchy(policyResourcesKeySet);
-                } else if 
(resource.getKeys().containsAll(policyResourcesKeySet)) {
-                    aValidHierarchy = getMatchingHierarchy(resource.getKeys());
+                } else if (resourceKeySet.containsAll(policyResourcesKeySet)) {
+                    aValidHierarchy = getMatchingHierarchy(resourceKeySet);
                 }
             }
             ret = isHierarchyValidForResources(aValidHierarchy, 
resource.getAsMap()) ? aValidHierarchy : null;
         } else {
-            ret = getMatchingHierarchy(policyResourcesKeySet);
+            ret = validResourceHierarchy != null ? validResourceHierarchy : 
getMatchingHierarchy(policyResourcesKeySet);
         }
 
         if (LOG.isDebugEnabled()) {
@@ -585,10 +708,6 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
     private boolean isMatch(final MatchScope scope, final MatchType matchType) 
{
         final boolean ret;
         switch (scope) {
-            case SELF_OR_ANCESTOR_OR_DESCENDANT: {
-                ret = matchType != MatchType.NONE;
-                break;
-            }
             case SELF: {
                 ret = matchType == MatchType.SELF;
                 break;
@@ -609,39 +728,12 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
                 ret = matchType == MatchType.ANCESTOR;
                 break;
             }
-            default:
+            default: {
                 ret = matchType != MatchType.NONE;
                 break;
-        }
-        return ret;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-
-        toString(sb);
-
-        return sb.toString();
-    }
-
-    @Override
-    public StringBuilder toString(StringBuilder sb) {
-        sb.append("RangerDefaultPolicyResourceMatcher={");
-
-        sb.append("isInitialized=").append(isInitialized).append(", ");
-
-        sb.append("matchers={");
-        if(allMatchers != null) {
-            for(RangerResourceMatcher matcher : allMatchers.values()) {
-                sb.append("{").append(matcher).append("} ");
             }
         }
-        sb.append("} ");
-
-        sb.append("}");
-
-        return sb;
+        return ret;
     }
 
     private static RangerResourceMatcher 
createResourceMatcher(RangerResourceDef resourceDef, RangerPolicyResource 
resource) {

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
index b8e7fd4..4696d84 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
@@ -29,7 +29,7 @@ import 
org.apache.ranger.plugin.policyengine.RangerAccessResource;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 
 public interface RangerPolicyResourceMatcher {
-       enum MatchScope { SELF_OR_ANCESTOR_OR_DESCENDANT, SELF, 
SELF_OR_DESCENDANT, SELF_OR_ANCESTOR, DESCENDANT, ANCESTOR };
+       enum MatchScope { SELF, SELF_OR_DESCENDANT, SELF_OR_ANCESTOR, 
DESCENDANT, ANCESTOR, ANY };
        enum MatchType { NONE, SELF, DESCENDANT, ANCESTOR };
 
        void setServiceDef(RangerServiceDef serviceDef);

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java
index 34a8777..acd599a 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/resourcematcher/RangerAbstractResourceMatcher.java
@@ -205,7 +205,7 @@ public abstract class RangerAbstractResourceMatcher 
implements RangerResourceMat
                        String policyValue = policyValues.get(0);
 
                        if(isMatchAny) {
-                               ret = StringUtils.containsOnly(resource, 
WILDCARD_ASTERISK);
+                               ret = StringUtils.isEmpty(resource) || 
StringUtils.containsOnly(resource, WILDCARD_ASTERISK);
                        } else {
                                ret = optIgnoreCase ? 
StringUtils.equalsIgnoreCase(resource, policyValue) : 
StringUtils.equals(resource, policyValue);
                        }

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/java/org/apache/ranger/plugin/model/validation/TestRangerServiceDefHelper.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/model/validation/TestRangerServiceDefHelper.java
 
b/agents-common/src/test/java/org/apache/ranger/plugin/model/validation/TestRangerServiceDefHelper.java
index 584e88e..b0c1085 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/model/validation/TestRangerServiceDefHelper.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/model/validation/TestRangerServiceDefHelper.java
@@ -71,8 +71,8 @@ public class TestRangerServiceDefHelper {
                RangerResourceDef Database = createResourceDef("Database", "");
                RangerResourceDef UDF = createResourceDef("UDF", "Database");
                RangerResourceDef Table = createResourceDef("Table", 
"Database");
-               RangerResourceDef Column = createResourceDef("Column", "Table");
-               RangerResourceDef Table_Attribute = 
createResourceDef("Table-Attribute", "Table");
+               RangerResourceDef Column = createResourceDef("Column", "Table", 
true);
+               RangerResourceDef Table_Attribute = 
createResourceDef("Table-Attribute", "Table", true);
                // order of resources in list sould not matter
                List<RangerResourceDef> resourceDefs = 
Lists.newArrayList(Column, Database, Table, Table_Attribute, UDF);
                // stuff this into a service-def
@@ -127,12 +127,12 @@ public class TestRangerServiceDefHelper {
                 * Check that helper corrects reports back all of the 
hierarchies: levels in it and their order.
                 */
                RangerResourceDef database = createResourceDef("database", "");
-               RangerResourceDef tableSpace = createResourceDef("table-space", 
"database");
+               RangerResourceDef tableSpace = createResourceDef("table-space", 
"database", true);
                RangerResourceDef table = createResourceDef("table", 
"database");
-               RangerResourceDef column = createResourceDef("column", "table");
+               RangerResourceDef column = createResourceDef("column", "table", 
true);
                RangerResourceDef namespace = createResourceDef("namespace", 
"");
-               RangerResourceDef function = createResourceDef("function", 
"namespace");
-               RangerResourceDef Package = createResourceDef("package", 
"namespace");
+               RangerResourceDef function = createResourceDef("function", 
"namespace", true);
+               RangerResourceDef Package = createResourceDef("package", 
"namespace", true);
                List<RangerResourceDef> resourceDefs = 
Lists.newArrayList(database, tableSpace, table, column, namespace, function, 
Package);
                when(_serviceDef.getResources()).thenReturn(resourceDefs);
                _helper = new RangerServiceDefHelper(_serviceDef);
@@ -172,8 +172,8 @@ public class TestRangerServiceDefHelper {
                RangerResourceDef database = createResourceDef("database", "");
                RangerResourceDef server = createResourceDef("server", "");
                RangerResourceDef namespace = createResourceDef("namespace", 
"");
-               RangerResourceDef function = createResourceDef("function", 
"namespace");
-               RangerResourceDef Package = createResourceDef("package", 
"namespace");
+               RangerResourceDef function = createResourceDef("function", 
"namespace", true);
+               RangerResourceDef Package = createResourceDef("package", 
"namespace", true);
                List<RangerResourceDef> resourceDefs = 
Lists.newArrayList(database, server, namespace, function, Package);
                when(_serviceDef.getResources()).thenReturn(resourceDefs);
                _helper = new RangerServiceDefHelper(_serviceDef);

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyDb.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyDb.java
 
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyDb.java
index 58bb351..85ea679 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyDb.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyDb.java
@@ -31,6 +31,7 @@ import java.util.Set;
 
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
+import org.apache.ranger.plugin.model.RangerServiceDef;
 import 
org.apache.ranger.plugin.policyengine.TestPolicyDb.PolicyDbTestCase.TestData;
 import org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator;
 import org.apache.ranger.plugin.util.ServicePolicies;
@@ -43,36 +44,67 @@ import com.google.gson.GsonBuilder;
 
 public class TestPolicyDb {
        static Gson gsonBuilder;
+    static RangerServiceDef hdfsServiceDef;
+    static RangerServiceDef hiveServiceDef;
+    static RangerServiceDef hbaseServiceDef;
+    static RangerServiceDef tagServiceDef;
 
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
                gsonBuilder = new 
GsonBuilder().setDateFormat("yyyyMMdd-HH:mm:ss.SSS-Z")
                                                                           
.setPrettyPrinting()
                                                                           
.create();
+               initializeServiceDefs();
        }
 
+       private static void initializeServiceDefs() {
+        hdfsServiceDef = readServiceDef("hdfs");
+        hiveServiceDef = readServiceDef("hive");
+        hbaseServiceDef = readServiceDef("hbase");
+        tagServiceDef = readServiceDef("tag");
+    }
+
+    private static RangerServiceDef readServiceDef(String name) {
+        InputStream inStream = 
TestPolicyDb.class.getResourceAsStream("/admin/service-defs/test-" + name + 
"-servicedef.json");
+        InputStreamReader reader = new InputStreamReader(inStream);
+        return gsonBuilder.fromJson(reader, RangerServiceDef.class);
+
+    }
+
        @AfterClass
        public static void tearDownAfterClass() throws Exception {
        }
 
        @Test
        public void testPolicyDb_hdfs() {
+
                String[] hdfsTestResourceFiles = { 
"/policyengine/test_policydb_hdfs.json" };
 
-               runTestsFromResourceFiles(hdfsTestResourceFiles);
+               runTestsFromResourceFiles(hdfsTestResourceFiles, 
hdfsServiceDef);
        }
 
-       private void runTestsFromResourceFiles(String[] resourceNames) {
+    @Test
+    public void testPolicyDb_hive() {
+        String[] hiveTestResourceFiles = { 
"/policyengine/test_policydb_hive.json" };
+
+        runTestsFromResourceFiles(hiveTestResourceFiles, hiveServiceDef);
+    }
+
+       private void runTestsFromResourceFiles(String[] resourceNames, 
RangerServiceDef serviceDef) {
                for(String resourceName : resourceNames) {
                        InputStream       inStream = 
this.getClass().getResourceAsStream(resourceName);
                        InputStreamReader reader   = new 
InputStreamReader(inStream);
 
-                       runTests(reader, resourceName);
+                       runTests(reader, resourceName, serviceDef);
                }
        }
 
-       private void runTests(InputStreamReader reader, String testName) {
+       private void runTests(InputStreamReader reader, String testName, 
RangerServiceDef serviceDef) {
                PolicyDbTestCase testCase = gsonBuilder.fromJson(reader, 
PolicyDbTestCase.class);
+               if (serviceDef != null) {
+                       // Override serviceDef in the json test-file with a 
global service-def
+                       testCase.servicePolicies.setServiceDef(serviceDef);
+               }
 
                assertTrue("invalid input: " + testName, testCase != null && 
testCase.servicePolicies != null && testCase.tests != null && 
testCase.servicePolicies.getPolicies() != null);
 

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcher.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcher.java
 
b/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcher.java
index 7d2519c..1755233 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcher.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcher.java
@@ -50,12 +50,31 @@ import com.google.gson.GsonBuilder;
 public class TestDefaultPolicyResourceMatcher {
        static Gson gsonBuilder;
 
+       static RangerServiceDef hdfsServiceDef;
+       static RangerServiceDef hiveServiceDef;
+       static RangerServiceDef hbaseServiceDef;
+       static RangerServiceDef tagServiceDef;
+
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
                gsonBuilder = new 
GsonBuilder().setDateFormat("yyyyMMdd-HH:mm:ss.SSS-Z")
                                .setPrettyPrinting()
                                
.registerTypeAdapter(RangerAccessResource.class, new 
TestDefaultPolicyResourceMatcher.RangerResourceDeserializer())
                                .create();
+               initializeServiceDefs();
+       }
+
+       private static void initializeServiceDefs() {
+               hdfsServiceDef = readServiceDef("hdfs");
+               hiveServiceDef = readServiceDef("hive");
+               hbaseServiceDef = readServiceDef("hbase");
+               tagServiceDef = readServiceDef("tag");
+       }
+
+       private static RangerServiceDef readServiceDef(String name) {
+               InputStream inStream = 
TestDefaultPolicyResourceMatcher.class.getResourceAsStream("/admin/service-defs/test-"
 + name + "-servicedef.json");
+               InputStreamReader reader = new InputStreamReader(inStream);
+               return gsonBuilder.fromJson(reader, RangerServiceDef.class);
        }
 
        @AfterClass
@@ -74,23 +93,30 @@ public class TestDefaultPolicyResourceMatcher {
        public void testDefaultPolicyResourceMatcher() throws Exception {
                String[] tests = { 
"/resourcematcher/test_defaultpolicyresourcematcher.json" };
 
-               runTestsFromResourceFiles(tests);
+               runTestsFromResourceFiles(tests, null);
        }
 
-       private void runTestsFromResourceFiles(String[] resourceNames) throws 
Exception {
-               for(String resourceName : resourceNames) {
-                       InputStream       inStream = 
this.getClass().getResourceAsStream(resourceName);
-                       InputStreamReader reader   = new 
InputStreamReader(inStream);
+       @Test
+       public void testDefaultPolicyResourceMatcher_ResourceSpecific() throws 
Exception {
+               String[] tests = { 
"/resourcematcher/test_defaultpolicyresourcematcher.json" };
 
-                       runTests(reader);
-               }
+               runTestsFromResourceFiles(tests, hiveServiceDef);
        }
 
-       private void runTests(InputStreamReader reader) throws Exception {
+       private void runTestsFromResourceFiles(String[] resourceNames, 
RangerServiceDef serviceDef) throws Exception {
+           for (String resourceName : resourceNames) {
+            InputStream inStream = 
this.getClass().getResourceAsStream(resourceName);
+            InputStreamReader reader = new InputStreamReader(inStream);
+
+            runTests(reader, serviceDef);
+        }
+    }
+
+       private void runTests(InputStreamReader reader, RangerServiceDef 
serviceDef) throws Exception {
                DefaultPolicyResourceMatcherTestCases testCases = 
gsonBuilder.fromJson(reader, DefaultPolicyResourceMatcherTestCases.class);
 
                for (DefaultPolicyResourceMatcherTestCases.TestCase testCase : 
testCases.testCases) {
-                       runTest(testCase, testCases.serviceDef);
+                       runTest(testCase, serviceDef == null ? 
testCases.serviceDef : serviceDef);
                }
        }
                private void 
runTest(DefaultPolicyResourceMatcherTestCases.TestCase testCase, 
RangerServiceDef serviceDef) throws Exception {
@@ -120,7 +146,7 @@ public class TestDefaultPolicyResourceMatcher {
                        } else if (StringUtils.equalsIgnoreCase(oneTest.type, 
"ancestorMatch")) {
                                scope = 
RangerPolicyResourceMatcher.MatchScope.ANCESTOR;
                        } else if (StringUtils.equalsIgnoreCase(oneTest.type, 
"anyMatch")) {
-                               scope = 
RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR_OR_DESCENDANT;
+                               scope = 
RangerPolicyResourceMatcher.MatchScope.ANY;
                        } else {
                                continue;
                        }

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcherForPolicy.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcherForPolicy.java
 
b/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcherForPolicy.java
index f6732eb..93daf3b 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcherForPolicy.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/resourcematcher/TestDefaultPolicyResourceMatcherForPolicy.java
@@ -52,12 +52,31 @@ import com.google.gson.GsonBuilder;
 public class TestDefaultPolicyResourceMatcherForPolicy {
        static Gson gsonBuilder;
 
+       static RangerServiceDef hdfsServiceDef;
+       static RangerServiceDef hiveServiceDef;
+       static RangerServiceDef hbaseServiceDef;
+       static RangerServiceDef tagServiceDef;
+
        @BeforeClass
        public static void setUpBeforeClass() throws Exception {
                gsonBuilder = new 
GsonBuilder().setDateFormat("yyyyMMdd-HH:mm:ss.SSS-Z")
                                .setPrettyPrinting()
                                
.registerTypeAdapter(RangerAccessResource.class, new 
TestDefaultPolicyResourceMatcherForPolicy.RangerResourceDeserializer())
                                .create();
+               initializeServiceDefs();
+       }
+
+       private static void initializeServiceDefs() {
+               hdfsServiceDef = readServiceDef("hdfs");
+               hiveServiceDef = readServiceDef("hive");
+               hbaseServiceDef = readServiceDef("hbase");
+               tagServiceDef = readServiceDef("tag");
+       }
+
+       private static RangerServiceDef readServiceDef(String name) {
+               InputStream inStream = 
TestDefaultPolicyResourceMatcherForPolicy.class.getResourceAsStream("/admin/service-defs/test-"
 + name + "-servicedef.json");
+               InputStreamReader reader = new InputStreamReader(inStream);
+               return gsonBuilder.fromJson(reader, RangerServiceDef.class);
        }
 
        @AfterClass
@@ -73,28 +92,40 @@ public class TestDefaultPolicyResourceMatcherForPolicy {
        }
 
        @Test
-       public void testDefaultPolicyResourceMatcherForPolicy() throws 
Exception {
-               String[] tests = { 
"/resourcematcher/test_defaultpolicyresourcematcher_for_resource_specific_policy.json",
-                               
"/resourcematcher/test_defaultpolicyresourcematcher_for_hdfs_policy.json",
-                               
"/resourcematcher/test_defaultpolicyresourcematcher_for_policy.json"};
+       public void testDefaultPolicyResourceMatcherForHdfs() throws Exception {
+               String[] tests = { 
"/resourcematcher/test_defaultpolicyresourcematcher_for_hdfs_policy.json" };
+
+               runTestsFromResourceFiles(tests, null);
+       }
+
+       @Test
+       public void testDefaultPolicyResourceMatcherForHive() throws Exception {
+               String[] tests = 
{"/resourcematcher/test_defaultpolicyresourcematcher_for_hive_policy.json"};
+
+               runTestsFromResourceFiles(tests, null);
+       }
+
+       @Test
+       public void testDefaultPolicyResourceMatcherForHive_ResourceSpecific() 
throws Exception {
+               String[] tests = 
{"/resourcematcher/test_defaultpolicyresourcematcher_for_hive_policy.json"};
 
-               runTestsFromResourceFiles(tests);
+               runTestsFromResourceFiles(tests, hiveServiceDef);
        }
 
-       private void runTestsFromResourceFiles(String[] resourceNames) throws 
Exception {
+       private void runTestsFromResourceFiles(String[] resourceNames, 
RangerServiceDef serviceDef) throws Exception {
                for(String resourceName : resourceNames) {
-                       InputStream       inStream = 
this.getClass().getResourceAsStream(resourceName);
-                       InputStreamReader reader   = new 
InputStreamReader(inStream, Charset.defaultCharset());
+                       InputStream inStream = 
this.getClass().getResourceAsStream(resourceName);
+                       InputStreamReader reader = new 
InputStreamReader(inStream, Charset.defaultCharset());
 
-                       runTests(reader);
+                       runTests(reader, serviceDef);
                }
        }
 
-       private void runTests(InputStreamReader reader) throws Exception {
+       private void runTests(InputStreamReader reader, RangerServiceDef 
serviceDef) throws Exception {
                DefaultPolicyResourceMatcherTestCases testCases = 
gsonBuilder.fromJson(reader, DefaultPolicyResourceMatcherTestCases.class);
 
                for (DefaultPolicyResourceMatcherTestCases.TestCase testCase : 
testCases.testCases) {
-                       runTest(testCase, testCases.serviceDef);
+                       runTest(testCase, serviceDef == null ? 
testCases.serviceDef : serviceDef);
                }
        }
        private void runTest(DefaultPolicyResourceMatcherTestCases.TestCase 
testCase, RangerServiceDef serviceDef) throws Exception {
@@ -124,7 +155,7 @@ public class TestDefaultPolicyResourceMatcherForPolicy {
                        } else if (StringUtils.equalsIgnoreCase(oneTest.type, 
"ancestorMatch")) {
                                scope = 
RangerPolicyResourceMatcher.MatchScope.ANCESTOR;
                        } else if (StringUtils.equalsIgnoreCase(oneTest.type, 
"anyMatch")) {
-                               scope = 
RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR_OR_DESCENDANT;
+                               scope = 
RangerPolicyResourceMatcher.MatchScope.ANY;
                        } else {
                                continue;
                        }

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/resources/admin/service-defs/test-hbase-servicedef.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/resources/admin/service-defs/test-hbase-servicedef.json
 
b/agents-common/src/test/resources/admin/service-defs/test-hbase-servicedef.json
new file mode 100644
index 0000000..71fae66
--- /dev/null
+++ 
b/agents-common/src/test/resources/admin/service-defs/test-hbase-servicedef.json
@@ -0,0 +1,241 @@
+{
+       "id":2,
+       "name": "hbase",
+       "implClass": "org.apache.ranger.services.hbase.RangerServiceHBase",
+       "label": "HBase",
+       "description": "HBase",
+       "guid": "d6cea1f0-2509-4791-8fc1-7b092399ba3b",
+       "resources": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "table",
+                       "type": "string",
+                       "level": 10,
+                       "parent": "",
+                       "mandatory": true,
+                       "lookupSupported": true,
+                       "recursiveSupported": false,
+                       "excludesSupported": true,
+                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+                       "matcherOptions": { "wildCard":true, "ignoreCase":false 
},
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "HBase Table",
+                       "description": "HBase Table"
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "column-family",
+                       "type": "string",
+                       "level": 20,
+                       "parent": "table",
+                       "mandatory": true,
+                       "lookupSupported": true,
+                       "recursiveSupported": false,
+                       "excludesSupported": true,
+                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+                       "matcherOptions": { "wildCard":true, "ignoreCase":false 
},
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "HBase Column-family",
+                       "description": "HBase Column-family"
+               },
+
+               {
+                       "itemId": 3,
+                       "name": "column",
+                       "type": "string",
+                       "level": 30,
+                       "parent": "column-family",
+                       "mandatory": true,
+                       "lookupSupported": false,
+                       "recursiveSupported": false,
+                       "excludesSupported": true,
+                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+                       "matcherOptions": { "wildCard":true, "ignoreCase":false 
},
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "HBase Column",
+                       "description": "HBase Column"
+               }
+       ],
+
+       "accessTypes": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "read",
+                       "label": "Read"
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "write",
+                       "label": "Write"
+               },
+
+               {
+                       "itemId": 3,
+                       "name": "create",
+                       "label": "Create"
+               },
+
+               {
+                       "itemId": 4,
+                       "name": "admin",
+                       "label": "Admin",
+                       "impliedGrants": 
+                       [
+                               "read",
+                               "write",
+                               "create"
+                       ]
+               }
+       ],
+
+       "configs": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "username",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Username"
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "password",
+                       "type": "password",
+                       "subType": "",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Password"
+               },
+
+               {
+                       "itemId": 3,
+                       "name": "hadoop.security.authentication",
+                       "type": "enum",
+                       "subType": "authnType",
+                       "mandatory": true,
+                       "defaultValue": "simple",
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 4,
+                       "name": "hbase.master.kerberos.principal",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "defaultValue": ""
+               },
+
+               {
+                       "itemId": 5,
+                       "name": "hbase.security.authentication",
+                       "type": "enum",
+                       "subType": "authnType",
+                       "mandatory": true,
+                       "defaultValue": "simple",
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 6,
+                       "name": "hbase.zookeeper.property.clientPort",
+                       "type": "int",
+                       "subType": "",
+                       "mandatory": true,
+                       "defaultValue": "2181",
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 7,
+                       "name": "hbase.zookeeper.quorum",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": true,
+                       "defaultValue": "",
+                       "validationRegEx":"",
+                       "validationMessage": ""
+               },
+
+               {
+                       "itemId": 8,
+                       "name": "zookeeper.znode.parent",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": true,
+                       "defaultValue": "/hbase",
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+               
+               {
+                       "itemId": 9,
+                       "name": "commonNameForCertificate",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Common Name for Certificate"
+               }
+       ],
+
+       "enums": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "authnType",
+                       "elements": 
+                       [
+                               {
+                                       "itemId": 1,
+                                       "name": "simple",
+                                       "label": "Simple"
+                               },
+
+                               {
+                                       "itemId": 2,
+                                       "name": "kerberos",
+                                       "label": "Kerberos"
+                               }
+                       ],
+
+                       "defaultIndex": 0
+               }
+       ],
+
+       "contextEnrichers": 
+       [
+               
+       ],
+
+       "policyConditions": 
+       [
+               
+       ]
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/resources/admin/service-defs/test-hdfs-servicedef.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/resources/admin/service-defs/test-hdfs-servicedef.json 
b/agents-common/src/test/resources/admin/service-defs/test-hdfs-servicedef.json
new file mode 100755
index 0000000..2a21ea9
--- /dev/null
+++ 
b/agents-common/src/test/resources/admin/service-defs/test-hdfs-servicedef.json
@@ -0,0 +1,286 @@
+{
+       "id":1,
+       "name": "hdfs",
+       "implClass": "org.apache.ranger.services.hdfs.RangerServiceHdfs",
+       "label": "HDFS Repository",
+       "description": "HDFS Repository",
+       "guid": "0d047247-bafe-4cf8-8e9b-d5d377284b2d",
+       "resources": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "path",
+                       "type": "path",
+                       "level": 10,
+                       "parent": "",
+                       "mandatory": true,
+                       "lookupSupported": true,
+                       "recursiveSupported": true,
+                       "excludesSupported": false,
+                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerPathResourceMatcher",
+                       "matcherOptions": { "wildCard":true, "ignoreCase":false 
},
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Resource Path",
+                       "description": "HDFS file or directory path"
+               }
+       ],
+
+       "accessTypes": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "read",
+                       "label": "Read"
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "write",
+                       "label": "Write"
+               },
+
+               {
+                       "itemId": 3,
+                       "name": "execute",
+                       "label": "Execute"
+               }
+       ],
+
+       "configs": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "username",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Username"
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "password",
+                       "type": "password",
+                       "subType": "",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Password"
+               },
+
+               {
+                       "itemId": 3,
+                       "name": "fs.default.name",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Namenode URL"
+               },
+
+               {
+                       "itemId": 4,
+                       "name": "hadoop.security.authorization",
+                       "type": "bool",
+                       "subType": "YesTrue:NoFalse",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Authorization Enabled",
+                       "defaultValue": "false"
+               },
+
+               {
+                       "itemId": 5,
+                       "name": "hadoop.security.authentication",
+                       "type": "enum",
+                       "subType": "authnType",
+                       "mandatory": true,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Authentication Type",
+                       "defaultValue": "simple"
+               },
+
+               {
+                       "itemId": 6,
+                       "name": "hadoop.security.auth_to_local",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 7,
+                       "name": "dfs.datanode.kerberos.principal",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 8,
+                       "name": "dfs.namenode.kerberos.principal",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 9,
+                       "name": "dfs.secondary.namenode.kerberos.principal",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":""
+               },
+
+               {
+                       "itemId": 10,
+                       "name": "hadoop.rpc.protection",
+                       "type": "enum",
+                       "subType": "rpcProtection",
+                       "mandatory": false,
+                       "label": "RPC Protection Type",
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "defaultValue": "authentication"
+               },
+
+               {
+                       "itemId": 11,
+                       "name": "commonNameForCertificate",
+                       "type": "string",
+                       "subType": "",
+                       "mandatory": false,
+                       "validationRegEx":"",
+                       "validationMessage": "",
+                       "uiHint":"",
+                       "label": "Common Name for Certificate"
+               }
+       ],
+
+       "enums": 
+       [
+               {
+                       "itemId": 1,
+                       "name": "authnType",
+                       "elements": 
+                       [
+                               {
+                                       "itemId": 1,
+                                       "name": "simple",
+                                       "label": "Simple"
+                               },
+
+                               {
+                                       "itemId": 2,
+                                       "name": "kerberos",
+                                       "label": "Kerberos"
+                               }
+                       ],
+
+                       "defaultIndex": 0
+               },
+
+               {
+                       "itemId": 2,
+                       "name": "rpcProtection",
+                       "elements": 
+                       [
+                               {
+                                       "itemId": 1,
+                                       "name": "authentication",
+                                       "label": "Authentication"
+                               },
+
+                               {
+                                       "itemId": 2,
+                                       "name": "integrity",
+                                       "label": "Integrity"
+                               },
+
+                               {
+                                       "itemId": 3,
+                                       "name": "privacy",
+                                       "label": "Privacy"
+                               }
+                       ],
+
+                       "defaultIndex": 0
+               }
+       ],
+
+       "contextEnrichers": 
+       [
+      {
+        "itemId":1,
+        "name" : "GeolocationEnricher_format_long",
+        "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerFileBasedGeolocationProvider",
+        "enricherOptions" : {
+          "FilePath":"/etc/ranger/geo/geo_long.txt", "ForceRead":"false", 
"IPInDotFormat":"false"
+        ,"geolocation.meta.prefix": "FORMAT_LONG_"
+        }
+      },
+      {
+        "itemId":2,
+        "name" : "GeolocationEnricher_format_dot",
+        "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerFileBasedGeolocationProvider",
+        "enricherOptions" : {
+          "FilePath":"/etc/ranger/geo/geo.txt", "ForceRead":"false", 
"IPInDotFormat":"true"
+        ,"geolocation.meta.prefix": "FORMAT_DOT_"
+        }
+      }
+      ,
+      {
+        "itemId":1,
+        "name" : "GeolocationEnricher",
+        "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerFileBasedGeolocationProvider",
+        "enricherOptions" : {
+          "FilePath":"/etc/ranger/geo/geo.txt", "ForceRead":"false", 
"IPInDotFormat":"true"
+        ,"geolocation.meta.prefix": "TEST_"
+        }
+      }
+       ],
+
+       "policyConditions": 
+       [
+      {
+        "itemId":1,
+        "name":"ScriptConditionEvaluator",
+        "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerScriptConditionEvaluator",
+        "evaluatorOptions" : {"engineName":"JavaScript"},
+        "label":"Script",
+        "description": "Script to execute"
+      }
+    ,
+      { "itemId": 2,
+        "name":"country",
+        
"evaluator":"org.apache.ranger.plugin.conditionevaluator.RangerSimpleMatcher",
+        "evaluatorOptions":{"CONTEXT_NAME":"country"}
+      }
+               
+       ]
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/resources/admin/service-defs/test-hive-servicedef.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/resources/admin/service-defs/test-hive-servicedef.json 
b/agents-common/src/test/resources/admin/service-defs/test-hive-servicedef.json
index 53b1926..32d92b0 100644
--- 
a/agents-common/src/test/resources/admin/service-defs/test-hive-servicedef.json
+++ 
b/agents-common/src/test/resources/admin/service-defs/test-hive-servicedef.json
@@ -1,226 +1,457 @@
 {
-       "id":3,
-       "name": "hive",
-       "implClass": "org.apache.ranger.services.hive.RangerServiceHive",
-       "label": "Hive Server2",
-       "description": "Hive Server2",
-       "guid": "3e1afb5a-184a-4e82-9d9c-87a5cacc243c",
-       "resources": 
-       [
-               {
-                       "itemId": 1,
-                       "name": "database",
-                       "type": "string",
-                       "level": 10,
-                       "parent": "",
-                       "mandatory": true,
-                       "lookupSupported": true,
-                       "recursiveSupported": false,
-                       "excludesSupported": true,
-                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions": { "wildCard":true, "ignoreCase":true 
},
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Hive Database",
-                       "description": "Hive Database"
-               },
-
-               {
-                       "itemId": 2,
-                       "name": "table",
-                       "type": "string",
-                       "level": 20,
-                       "parent": "database",
-                       "mandatory": true,
-                       "lookupSupported": true,
-                       "recursiveSupported": false,
-                       "excludesSupported": true,
-                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions": { "wildCard":true, "ignoreCase":true 
},
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Hive Table",
-                       "description": "Hive Table"
-               },
-
-               {
-                       "itemId": 3,
-                       "name": "udf",
-                       "type": "string",
-                       "level": 20,
-                       "parent": "database",
-                       "mandatory": true,
-                       "lookupSupported": true,
-                       "recursiveSupported": false,
-                       "excludesSupported": true,
-                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions": { "wildCard":true, "ignoreCase":true 
},
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Hive UDF",
-                       "description": "Hive UDF"
-               },
-
-               {
-                       "itemId": 4,
-                       "name": "column",
-                       "type": "string",
-                       "level": 30,
-                       "parent": "table",
-                       "mandatory": true,
-                       "lookupSupported": true,
-                       "recursiveSupported": false,
-                       "excludesSupported": true,
-                       "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions": { "wildCard":true, "ignoreCase":true 
},
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Hive Column",
-                       "description": "Hive Column"
-               }
-       ],
-
-       "accessTypes": 
-       [
-               {
-                       "itemId": 1,
-                       "name": "select",
-                       "label": "select"
-               },
-
-               {
-                       "itemId": 2,
-                       "name": "update",
-                       "label": "update"
-               },
-
-               {
-                       "itemId": 3,
-                       "name": "create",
-                       "label": "Create"
-               },
-
-               {
-                       "itemId": 4,
-                       "name": "drop",
-                       "label": "Drop"
-               },
-
-               {
-                       "itemId": 5,
-                       "name": "alter",
-                       "label": "Alter"
-               },
-
-               {
-                       "itemId": 6,
-                       "name": "index",
-                       "label": "Index"
-               },
-
-               {
-                       "itemId": 7,
-                       "name": "lock",
-                       "label": "Lock"
-               },
-
-               {
-                       "itemId": 8,
-                       "name": "all",
-                       "label": "All",
-                       "impliedGrants":
-                       [
-                               "select",
-                               "update",
-                               "create",
-                               "drop",
-                               "alter",
-                               "index",
-                               "lock"
-                       ]
-               }
-       ],
-
-       "configs": 
-       [
-               {
-                       "itemId": 1,
-                       "name": "username",
-                       "type": "string",
-                       "mandatory": true,
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Username"
-               },
-
-               {
-                       "itemId": 2,
-                       "name": "password",
-                       "type": "password",
-                       "mandatory": true,
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Password"
-               },
-
-               {
-                       "itemId": 3,
-                       "name": "jdbc.driverClassName",
-                       "type": "string",
-                       "mandatory": true,
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "defaultValue": "org.apache.hive.jdbc.HiveDriver"
-               },
-
-               {
-                       "itemId": 4,
-                       "name": "jdbc.url",
-                       "type": "string",
-                       "mandatory": true,
-                       "defaultValue": "",
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":""
-               },
-
-               {
-                       "itemId": 5,
-                       "name": "commonNameForCertificate",
-                       "type": "string",
-                       "mandatory": false,
-                       "validationRegEx":"",
-                       "validationMessage": "",
-                       "uiHint":"",
-                       "label": "Common Name for Certificate"
-               }
-       ],
-
-       "enums": 
-       [
-               
-       ],
-
-       "contextEnrichers": 
-       [
-       ],
-
-       "policyConditions": 
-       [
-         {
-               "itemId":1,
-               "name":"not-accessed-together",
-               "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerHiveResourcesNotAccessedTogetherCondition",
-               "evaluatorOptions" : {},
-               "label":"Not Accessed Together?",
-               "description": "List of Hive resources"
-         }
-       ]
+  "id":3,
+  "name": "hive",
+  "implClass": "org.apache.ranger.services.hive.RangerServiceHive",
+  "label": "Hive Server2",
+  "description": "Hive Server2",
+  "guid": "3e1afb5a-184a-4e82-9d9c-87a5cacc243c",
+  "resources":
+  [
+    {
+      "itemId": 1,
+      "name": "database",
+      "type": "string",
+      "level": 10,
+      "parent": "",
+      "mandatory": true,
+      "lookupSupported": true,
+      "recursiveSupported": false,
+      "excludesSupported": true,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+      "matcherOptions": { "wildCard":true, "ignoreCase":true },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Hive Database",
+      "description": "Hive Database",
+      "accessTypeRestrictions":["select", "update", "create", "drop", "alter", 
"lock"],
+      "isValidLeaf": true
+    },
+
+    {
+      "itemId": 2,
+      "name": "table",
+      "type": "string",
+      "level": 20,
+      "parent": "database",
+      "mandatory": true,
+      "lookupSupported": true,
+      "recursiveSupported": false,
+      "excludesSupported": true,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+      "matcherOptions": { "wildCard":true, "ignoreCase":true },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Hive Table",
+      "description": "Hive Table",
+      "accessTypeRestrictions":["select", "update", "create", "drop", "alter", 
"index", "lock"],
+      "isValidLeaf": true
+    },
+
+    {
+      "itemId": 3,
+      "name": "udf",
+      "type": "string",
+      "level": 20,
+      "parent": "database",
+      "mandatory": true,
+      "lookupSupported": true,
+      "recursiveSupported": false,
+      "excludesSupported": true,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+      "matcherOptions": { "wildCard":true, "ignoreCase":true },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Hive UDF",
+      "description": "Hive UDF",
+      "accessTypeRestrictions":["select", "update", "create", "drop", "alter"],
+      "isValidLeaf": true
+    },
+
+    {
+      "itemId": 4,
+      "name": "column",
+      "type": "string",
+      "level": 30,
+      "parent": "table",
+      "mandatory": true,
+      "lookupSupported": true,
+      "recursiveSupported": false,
+      "excludesSupported": true,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+      "matcherOptions": { "wildCard":true, "ignoreCase":true },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Hive Column",
+      "description": "Hive Column",
+      "accessTypeRestrictions":["select", "update", "alter", "lock"],
+      "isValidLeaf": true
+    },
+
+    {
+      "itemId": 5,
+      "name": "url",
+      "type": "string",
+      "level": 10,
+      "parent": "",
+      "mandatory": true,
+      "lookupSupported": false,
+      "recursiveSupported": true,
+      "excludesSupported": false,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerPathResourceMatcher",
+      "matcherOptions": { "wildCard":true, "ignoreCase":false },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "URL",
+      "description": "URL",
+      "accessTypeRestrictions":["read", "write"],
+      "isValidLeaf": true
+    }
+  ],
+
+  "accessTypes":
+  [
+    {
+      "itemId": 1,
+      "name": "select",
+      "label": "select"
+    },
+
+    {
+      "itemId": 2,
+      "name": "update",
+      "label": "update"
+    },
+
+    {
+      "itemId": 3,
+      "name": "create",
+      "label": "Create"
+    },
+
+    {
+      "itemId": 4,
+      "name": "drop",
+      "label": "Drop"
+    },
+
+    {
+      "itemId": 5,
+      "name": "alter",
+      "label": "Alter"
+    },
+
+    {
+      "itemId": 6,
+      "name": "index",
+      "label": "Index"
+    },
+
+    {
+      "itemId": 7,
+      "name": "lock",
+      "label": "Lock"
+    },
+
+    {
+      "itemId": 8,
+      "name": "all",
+      "label": "All",
+      "impliedGrants":
+      [
+        "select",
+        "update",
+        "create",
+        "drop",
+        "alter",
+        "index",
+        "lock",
+        "read",
+        "write"
+      ]
+    },
+
+    {
+      "itemId": 9,
+      "name": "read",
+      "label": "Read"
+    },
+
+    {
+      "itemId": 10,
+      "name": "write",
+      "label": "Write"
+    }
+  ],
+
+  "configs":
+  [
+    {
+      "itemId": 1,
+      "name": "username",
+      "type": "string",
+      "mandatory": true,
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Username"
+    },
+
+    {
+      "itemId": 2,
+      "name": "password",
+      "type": "password",
+      "mandatory": true,
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Password"
+    },
+
+    {
+      "itemId": 3,
+      "name": "jdbc.driverClassName",
+      "type": "string",
+      "mandatory": true,
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "defaultValue": "org.apache.hive.jdbc.HiveDriver"
+    },
+
+    {
+      "itemId": 4,
+      "name": "jdbc.url",
+      "type": "string",
+      "mandatory": true,
+      "defaultValue": "",
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":""
+    },
+
+    {
+      "itemId": 5,
+      "name": "commonNameForCertificate",
+      "type": "string",
+      "mandatory": false,
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"",
+      "label": "Common Name for Certificate"
+    }
+  ],
+
+  "enums":
+  [
+
+  ],
+
+  "contextEnrichers":
+  [
+    {
+      "itemId":1,
+      "name" : "GeolocationEnricher_format_long",
+      "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerFileBasedGeolocationProvider",
+      "enricherOptions" : {
+        "FilePath":"/etc/ranger/geo/geo_long.txt", "ForceRead":"false", 
"IPInDotFormat":"false"
+      ,"geolocation.meta.prefix": "FORMAT_LONG_"
+      }
+    },
+    {
+      "itemId":2,
+      "name" : "GeolocationEnricher_format_dot",
+      "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerFileBasedGeolocationProvider",
+      "enricherOptions" : {
+        "FilePath":"/etc/ranger/geo/geo.txt", "ForceRead":"false", 
"IPInDotFormat":"true"
+      ,"geolocation.meta.prefix": "FORMAT_DOT_"
+      }
+    }
+  ],
+
+  "policyConditions":
+  [
+    {
+      "itemId":1,
+      "name":"ScriptConditionEvaluator",
+      "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerScriptConditionEvaluator",
+      "evaluatorOptions" : {"engineName":"JavaScript"},
+      "label":"Script",
+      "description": "Script to execute"
+    }
+    ,
+    { "itemId": 2,
+      "name":"country",
+      
"evaluator":"org.apache.ranger.plugin.conditionevaluator.RangerSimpleMatcher",
+      "evaluatorOptions":{"CONTEXT_NAME":"country"}
+    }
+    ,
+    {
+      "itemId":3,
+      "name":"not-accessed-together",
+      "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerHiveResourcesNotAccessedTogetherCondition",
+      "evaluatorOptions" : {},
+      "label":"Not Accessed Together?",
+      "description": "List of Hive resources"
+    }
+    ,
+    {
+      "itemId":4,
+      "name":"accessed-together",
+      "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerHiveResourcesAccessedTogetherCondition",
+      "evaluatorOptions" : {"ui.isMultiline":"false" },
+      "label":"Accessed Together?",
+      "description": "List of Hive resources"
+    }
+  ],
+  "dataMaskDef": {
+    "accessTypes": [
+      {
+        "name": "select"
+      }
+    ],
+    "resources": [
+      {
+        "itemId": 1,
+        "name": "database",
+        "type": "string",
+        "level": 10,
+        "parent": "",
+        "mandatory": true,
+        "lookupSupported": true,
+        "matcherOptions": {
+          "wildCard": "false"
+        },
+        "uiHint":"{ \"singleValue\":true }",
+        "isValidLeaf": false
+      },
+      {
+        "itemId": 2,
+        "name": "table",
+        "type": "string",
+        "level": 20,
+        "parent": "database",
+        "mandatory": true,
+        "lookupSupported": true,
+        "matcherOptions": {
+          "wildCard": "false"
+        },
+        "uiHint":"{ \"singleValue\":true }",
+        "isValidLeaf": false
+      },
+      {
+        "itemId": 4,
+        "name": "column",
+        "type": "string",
+        "level": 30,
+        "parent": "table",
+        "mandatory": true,
+        "lookupSupported": true,
+        "matcherOptions": {
+          "wildCard": "false"
+        },
+        "uiHint":"{ \"singleValue\":true }",
+        "isValidLeaf": true
+      }
+    ],
+    "maskTypes": [
+      {
+        "itemId": 1,
+        "name": "MASK",
+        "label": "Redact",
+        "description": "Replace lowercase with 'x', uppercase with 'X', digits 
with '0'",
+        "transformer": "mask({col})",
+        "dataMaskOptions": {
+        }
+      },
+      {
+        "itemId": 2,
+        "name": "MASK_SHOW_LAST_4",
+        "label": "Partial mask: show last 4",
+        "description": "Show last 4 characters; replace rest with 'x'",
+        "transformer": "mask_show_last_n({col}, 4, 'x', 'x', 'x', -1, '1')"
+      },
+      {
+        "itemId": 3,
+        "name": "MASK_SHOW_FIRST_4",
+        "label": "Partial mask: show first 4",
+        "description": "Show first 4 characters; replace rest with 'x'",
+        "transformer": "mask_show_first_n({col}, 4, 'x', 'x', 'x', -1, '1')"
+      },
+      {
+        "itemId": 4,
+        "name": "MASK_HASH",
+        "label": "Hash",
+        "description": "Hash the value",
+        "transformer": "mask_hash({col})"
+      },
+      {
+        "itemId": 5,
+        "name": "MASK_NULL",
+        "label": "Nullify",
+        "description": "Replace with NULL"
+      },
+      {
+        "itemId": 6,
+        "name": "MASK_NONE",
+        "label": "Unmasked (retain original value)",
+        "description": "No masking"
+      },
+      {
+        "itemId": 12,
+        "name": "MASK_DATE_SHOW_YEAR",
+        "label": "Date: show only year",
+        "description": "Date: show only year",
+        "transformer": "mask({col}, 'x', 'x', 'x', -1, '1', 1, 0, -1)"
+      },
+      {
+        "itemId": 13,
+        "name": "CUSTOM",
+        "label": "Custom",
+        "description": "Custom"
+      }
+    ]
+  },
+  "rowFilterDef": {
+    "accessTypes": [
+      {
+        "name": "select"
+      }
+    ],
+    "resources": [
+      {
+        "itemId": 1,
+        "name": "database",
+        "type": "string",
+        "level": 10,
+        "parent": "",
+        "mandatory": true,
+        "lookupSupported": true,
+        "matcherOptions": {
+          "wildCard": "false"
+        },
+        "uiHint": "{ \"singleValue\":true }",
+        "isValidLeaf": false
+      },
+      {
+        "itemId": 2,
+        "name": "table",
+        "type": "string",
+        "level": 20,
+        "parent": "database",
+        "mandatory": true,
+        "lookupSupported": true,
+        "matcherOptions": {
+          "wildCard": "false"
+        },
+        "uiHint": "{ \"singleValue\":true }",
+        "isValidLeaf": true
+      }
+    ]
+  }
 }
+

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/resources/admin/service-defs/test-tag-servicedef.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/test/resources/admin/service-defs/test-tag-servicedef.json 
b/agents-common/src/test/resources/admin/service-defs/test-tag-servicedef.json
new file mode 100644
index 0000000..c17b750
--- /dev/null
+++ 
b/agents-common/src/test/resources/admin/service-defs/test-tag-servicedef.json
@@ -0,0 +1,82 @@
+{
+  "id":100,
+  "name": "tag",
+  "implClass": "org.apache.ranger.services.tag.RangerServiceTag",
+  "label": "TAG",
+  "description": "TAG Service Definition",
+  "guid": "0d047248-baff-4cf9-8e9e-d5d377284b2e",
+  "options":
+  {
+    "ui.pages":"tag-based-policies"
+  },
+  "resources":
+  [
+    {
+      "itemId":1,
+      "name": "tag",
+      "type": "string",
+      "level": 1,
+      "parent": "",
+      "mandatory": true,
+      "lookupSupported": true,
+      "recursiveSupported": false,
+      "excludesSupported": false,
+      "matcher": 
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+      "matcherOptions": { "wildCard":false, "ignoreCase":false },
+      "validationRegEx":"",
+      "validationMessage": "",
+      "uiHint":"{ \"singleValue\":true }",
+      "label": "TAG",
+      "description": "TAG"
+    }
+  ],
+
+  "accessTypes":
+  [
+
+  ],
+
+  "configs":
+  [
+
+  ],
+
+  "enums":
+  [
+
+  ],
+
+  "contextEnrichers":
+  [
+    {
+      "itemId": 1,
+      "name" : "TagEnricher",
+      "enricher" : 
"org.apache.ranger.plugin.contextenricher.RangerTagEnricher",
+      "enricherOptions" : {
+        "tagRetrieverClassName": 
"org.apache.ranger.plugin.contextenricher.RangerAdminTagRetriever",
+        "tagRefresherPollingInterval": 60000
+      }
+    }
+  ],
+
+  "policyConditions":
+  [
+    {
+      "itemId":1,
+      "name":"accessed-after-expiry",
+      "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerScriptTemplateConditionEvaluator",
+      "evaluatorOptions" : { 
"scriptTemplate":"ctx.isAccessedAfter('expiry_date');" },
+      "uiHint": "{ \"singleValue\":true }",
+      "label":"Accessed after expiry_date (yes/no)?",
+      "description": "Accessed after expiry_date? (yes/no)"
+    },
+    {
+      "itemId":2,
+      "name":"expression",
+      "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerScriptConditionEvaluator",
+      "evaluatorOptions" : {"engineName":"JavaScript", 
"ui.isMultiline":"true"},
+      "label":"Enter boolean expression",
+      "description": "Boolean expression"
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/2a1406df/agents-common/src/test/resources/log4j.xml
----------------------------------------------------------------------
diff --git a/agents-common/src/test/resources/log4j.xml 
b/agents-common/src/test/resources/log4j.xml
index d863cf1..558e27b 100644
--- a/agents-common/src/test/resources/log4j.xml
+++ b/agents-common/src/test/resources/log4j.xml
@@ -26,9 +26,8 @@
         </layout>
     </appender>
 
-    <!--
-    <appender name="ranger_perf_appender" 
class="org.apache.log4j.DailyRollingFileAppender">
-        <param name="file" value="./ranger_admin_perf.log" />
+    <appender name="ranger_perf_appender" 
class="org.apache.log4j.ConsoleAppender">
+        <param name="target" value="System.err" />
         <param name="datePattern" value="'.'yyyy-MM-dd" />
         <param name="append" value="true" />
         <layout class="org.apache.log4j.PatternLayout">
@@ -36,6 +35,7 @@
         </layout>
     </appender>
 
+    <!--
     <logger name="org.apache.ranger.perf.policyengine" additivity="false">
         <level value="debug" />
         <appender-ref ref="ranger_perf_appender" />
@@ -51,6 +51,11 @@
         <appender-ref ref="ranger_perf_appender" />
     </logger>
 
+    <logger name="org.apache.ranger.perf.policyresourcematcher" 
additivity="false">
+        <level value="debug" />
+        <appender-ref ref="ranger_perf_appender" />
+    </logger>
+
     <logger name="org.apache.ranger.perf.contextenricher" additivity="false">
         <level value="debug" />
         <appender-ref ref="ranger_perf_appender" />
@@ -70,7 +75,12 @@
         <level value="debug" />
         <appender-ref ref="ranger_perf_appender" />
     </logger>
-    -->
+        -->
+
+    <logger name="org.apache.ranger.perf.policyresourcematcher" 
additivity="false">
+        <level value="debug" />
+        <appender-ref ref="ranger_perf_appender" />
+    </logger>
 
     <root>
         <level value="warn" />

Reply via email to