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

madhan pushed a commit to branch ranger-2.4
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/ranger-2.4 by this push:
     new 4f4b5b9ca RANGER-3997: option to use default value when user/group/tag 
does not have the attribute
4f4b5b9ca is described below

commit 4f4b5b9ca18743c87aa316071bacd831d8a1e51f
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Mon Dec 5 15:02:38 2022 -0800

    RANGER-3997: option to use default value when user/group/tag does not have 
the attribute
    
    (cherry picked from commit e1cdc6fd738f930e6cc7228ccc4bd0855ecc6847)
---
 .../policyengine/RangerRequestScriptEvaluator.java | 251 +++++++++++++++++----
 .../ranger/plugin/util/RangerCommonConstants.java  |  20 ++
 .../RangerRequestScriptEvaluatorTest.java          | 214 ++++++++++++++++++
 3 files changed, 444 insertions(+), 41 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerRequestScriptEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerRequestScriptEvaluator.java
index 6a3baa71d..7c6ea5742 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerRequestScriptEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerRequestScriptEvaluator.java
@@ -81,8 +81,8 @@ public final class RangerRequestScriptEvaluator {
        private static final Pattern JSON_VAR_NAMES_PATTERN   = 
Pattern.compile(getJsonVarNamesPattern());
        private static final Pattern USER_ATTRIBUTES_PATTERN  = 
Pattern.compile(getUserAttributesPattern());
        private static final Pattern GROUP_ATTRIBUTES_PATTERN = 
Pattern.compile(getGroupAttributesPattern());
-       private static final Character CHAR_QUOTE = '\'';
-       private static final Character CHAR_COMMA = ',';
+       private static final String  STR_QUOTE  = "'";
+       private static final String  STR_COMMA  = ",";
 
        private static final MacroProcessor MACRO_PROCESSOR = new 
MacroProcessor(getMacrosMap());
 
@@ -644,98 +644,116 @@ public final class RangerRequestScriptEvaluator {
                return ret;
        }
 
-       public String ugNamesCsv() {
+       public String tagNames(Object... args) {
                init();
 
-               return toCsv(userGroups);
+               return toCsv(tagNames, args);
        }
 
-       public String ugNamesCsvQ() {
+       public String tagNamesQ(Object... args) {
                init();
 
-               return toCsvQ(userGroups);
+               return toCsvQ(tagNames, args);
        }
 
-       public String urNamesCsv() {
+       public String tagAttrNames(Object... args) {
                init();
 
-               return toCsv(userRoles);
+               return toCsv(getTagAttrNames(), args);
        }
 
-       public String urNamesCsvQ() {
+       public String tagAttrNamesQ(Object... args) {
                init();
 
-               return toCsvQ(userRoles);
+               return toCsvQ(getTagAttrNames(), args);
        }
 
-       public String tagNamesCsv() {
+       public String tagAttr(String attrName, Object... args) {
                init();
 
-               return toCsv(tagNames);
+               return toCsv(getTagAttr(attrName), args);
        }
 
-       public String tagNamesCsvQ() {
+       public String tagAttrQ(String attrName, Object... args) {
                init();
 
-               return toCsvQ(tagNames);
+               return toCsvQ(getTagAttr(attrName), args);
        }
 
-       public String userAttrNamesCsv() {
+       public String ugNames(Object... args) {
                init();
 
-               return toCsv(getUserAttrNames());
+               return toCsv(userGroups, args);
        }
 
-       public String userAttrNamesCsvQ() {
+       public String ugNamesQ(Object... args) {
                init();
 
-               return toCsvQ(getUserAttrNames());
+               return toCsvQ(userGroups, args);
        }
 
-       public String ugAttrNamesCsv() {
+       public String ugAttrNames(Object... args) {
                init();
 
-               return toCsv(getUgAttrNames());
+               return toCsv(getUgAttrNames(), args);
        }
 
-       public String ugAttrNamesCsvQ() {
-               return toCsvQ(getUgAttrNames());
+       public String ugAttrNamesQ(Object... args) {
+               init();
+
+               return toCsvQ(getUgAttrNames(), args);
        }
 
-       public String tagAttrNamesCsv() {
+       public String ugAttr(String attrName, Object... args) {
                init();
 
-               return toCsv(getTagAttrNames());
+               return toCsv(getUgAttr(attrName), args);
        }
 
-       public String tagAttrNamesCsvQ() {
+       public String ugAttrQ(String attrName, Object... args) {
                init();
 
-               return toCsvQ(getTagAttrNames());
+               return toCsvQ(getUgAttr(attrName), args);
        }
 
-       public String ugAttrCsv(String attrName) {
+       public String urNames(Object... args) {
                init();
 
-               return toCsv(getUgAttr(attrName));
+               return toCsv(userRoles, args);
        }
 
-       public String ugAttrCsvQ(String attrName) {
+       public String urNamesQ(Object... args) {
                init();
 
-               return toCsvQ(getUgAttr(attrName));
+               return toCsvQ(userRoles, args);
        }
 
-       public String tagAttrCsv(String attrName) {
+       public String userAttrNames(Object... args) {
                init();
 
-               return toCsv(getTagAttr(attrName));
+               return toCsv(getUserAttrNames(), args);
        }
 
-       public String tagAttrCsvQ(String attrName) {
+       public String userAttrNamesQ(Object... args) {
+               init();
+
+               return toCsvQ(getUserAttrNames(), args);
+       }
+
+       public String userAttr(String attrName, Object... args) {
+               init();
+
+               String attrVal = userAttrs.get(attrName);
+
+               return toCsv(Collections.singletonList(attrVal), args);
+       }
+
+       public String userAttrQ(String attrName, Object... args) {
                init();
 
-               return toCsvQ(getTagAttr(attrName));
+               String attrVal = userAttrs.get(attrName);
+
+               return toCsvQ(Collections.singletonList(attrVal), args);
        }
 
        public boolean hasTag(String tagName) {
@@ -815,6 +833,71 @@ public final class RangerRequestScriptEvaluator {
                return !userRoles.isEmpty();
        }
 
+       // for backward compatibility
+       public String ugNamesCsv() {
+               return ugNames(null, STR_COMMA);
+       }
+
+       public String ugNamesCsvQ() {
+               return ugNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String urNamesCsv() {
+               return urNames(null, STR_COMMA);
+       }
+
+       public String urNamesCsvQ() {
+               return urNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String tagNamesCsv() {
+               return tagNames(null, STR_COMMA);
+       }
+
+       public String tagNamesCsvQ() {
+               return tagNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String userAttrNamesCsv() {
+               return userAttrNames(null, STR_COMMA);
+       }
+
+       public String userAttrNamesCsvQ() {
+               return userAttrNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String ugAttrNamesCsv() {
+               return ugAttrNames(null, STR_COMMA);
+       }
+
+       public String ugAttrNamesCsvQ() {
+               return ugAttrNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String tagAttrNamesCsv() {
+               return tagAttrNames(null, STR_COMMA);
+       }
+
+       public String tagAttrNamesCsvQ() {
+               return tagAttrNamesQ(null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String ugAttrCsv(String attrName) {
+               return ugAttr(attrName, null, STR_COMMA);
+       }
+
+       public String ugAttrCsvQ(String attrName) {
+               return ugAttrQ(attrName, null, STR_COMMA, STR_QUOTE);
+       }
+
+       public String tagAttrCsv(String attrName) {
+               return tagAttr(attrName, null, STR_COMMA);
+       }
+
+       public String tagAttrCsvQ(String attrName) {
+               return tagAttrQ(attrName, null, STR_COMMA, STR_QUOTE);
+       }
+
        private void init() {
                if (!initDone) {
                        RangerUserStore                  userStore        = 
RangerAccessRequestUtil.getRequestUserStoreFromContext(accessRequest.getContext());
@@ -976,8 +1059,9 @@ public final class RangerRequestScriptEvaluator {
                return getSorted(ret);
        }
 
-       private String toCsv(Collection<? extends Object> values) {
-               StringBuilder sb = new StringBuilder();
+       private String toCsv(Collection<? extends Object> values, Object[] 
args) {
+               StringBuilder sb        = new StringBuilder();
+               String        separator = getSeparator(args);
 
                for (Object value : values) {
                        if (value == null) {
@@ -985,17 +1069,28 @@ public final class RangerRequestScriptEvaluator {
                        }
 
                        if (sb.length() > 0) {
-                               sb.append(CHAR_COMMA);
+                               sb.append(separator);
                        }
 
                        sb.append(value);
                }
 
+               if (sb.length() == 0) {
+                       String defValue = getDefaultValue(args);
+
+                       if (defValue != null) {
+                               sb.append(getDefaultValue(args));
+                       }
+               }
+
                return sb.toString();
        }
 
-       private String toCsvQ(Collection<? extends Object> values) {
-               StringBuilder sb = new StringBuilder();
+       private String toCsvQ(Collection<? extends Object> values, Object[] 
args) {
+               StringBuilder sb         = new StringBuilder();
+               String        openQuote  = getOpenQuote(args);
+               String        closeQuote = getCloseQuote(args, openQuote);
+               String        separator  = getSeparator(args);
 
                for (Object value : values) {
                        if (value == null) {
@@ -1003,15 +1098,47 @@ public final class RangerRequestScriptEvaluator {
                        }
 
                        if (sb.length() > 0) {
-                               sb.append(CHAR_COMMA);
+                               sb.append(separator);
                        }
 
-                       sb.append(CHAR_QUOTE).append(value).append(CHAR_QUOTE);
+                       sb.append(openQuote).append(value).append(closeQuote);
+               }
+
+               if (sb.length() == 0) {
+                       String defValue = getDefaultValue(args);
+
+                       if (defValue != null) {
+                               
sb.append(openQuote).append(getDefaultValue(args)).append(closeQuote);
+                       }
                }
 
                return sb.toString();
        }
 
+       private String getDefaultValue(Object[] args) {
+               Object ret = (args != null && args.length > 0) ? args[0] : null;
+
+               return ret != null ? ret.toString() : null;
+       }
+
+       private String getSeparator(Object[] args) {
+               Object ret = (args != null && args.length > 1) ? args[1] : 
STR_COMMA;
+
+               return ret != null ? ret.toString() : "";
+       }
+
+       private String getOpenQuote(Object[] args) {
+               Object ret = (args != null && args.length > 2) ? args[2] : 
STR_QUOTE;
+
+               return ret != null ? ret.toString() : "";
+       }
+
+       private String getCloseQuote(Object[] args, String openQuote) {
+               Object ret = (args != null && args.length > 3) ? args[3] : null;
+
+               return ret != null ? ret.toString() : openQuote;
+       }
+
        private static String getJsonVarNamesPattern() {
                List<String> varNames = new ArrayList<>();
 
@@ -1041,10 +1168,21 @@ public final class RangerRequestScriptEvaluator {
                List<String> varNames = new ArrayList<>();
 
                varNames.add(SCRIPT_VAR_USER);
+
+               varNames.add(SCRIPT_MACRO_GET_USER_ATTR);
+               varNames.add(SCRIPT_MACRO_GET_USER_ATTR_Q);
+
+               varNames.add(SCRIPT_MACRO_GET_USER_ATTR_NAMES);
+               varNames.add(SCRIPT_MACRO_GET_USER_ATTR_NAMES_Q);
                varNames.add(SCRIPT_MACRO_USER_ATTR_NAMES_CSV);
                varNames.add(SCRIPT_MACRO_USER_ATTR_NAMES_Q_CSV);
+
                varNames.add(SCRIPT_MACRO_HAS_USER_ATTR);
 
+               varNames.add("userAttr");
+               varNames.add("userAttrQ");
+               varNames.add("userAttrNames");
+               varNames.add("userAttrNamesQ");
                varNames.add("userAttrNamesCsv");
                varNames.add("userAttrNamesCsvQ");
                varNames.add("hasUserAttr");
@@ -1058,16 +1196,28 @@ public final class RangerRequestScriptEvaluator {
                varNames.add(SCRIPT_VAR_UG);
                varNames.add(SCRIPT_VAR_UGA);
 
+               varNames.add(SCRIPT_MACRO_GET_UG_ATTR);
+               varNames.add(SCRIPT_MACRO_GET_UG_ATTR_Q);
                varNames.add(SCRIPT_MACRO_GET_UG_ATTR_CSV);
                varNames.add(SCRIPT_MACRO_GET_UG_ATTR_Q_CSV);
+
+               varNames.add(SCRIPT_MACRO_GET_UG_ATTR_NAMES);
+               varNames.add(SCRIPT_MACRO_GET_UG_ATTR_NAMES_Q);
                varNames.add(SCRIPT_MACRO_UG_ATTR_NAMES_CSV);
                varNames.add(SCRIPT_MACRO_UG_ATTR_NAMES_Q_CSV);
+
                varNames.add(SCRIPT_MACRO_HAS_UG_ATTR);
 
+               varNames.add("ugAttr");
+               varNames.add("ugAttrQ");
                varNames.add("ugAttrCsv");
                varNames.add("ugAttrCsvQ");
+
+               varNames.add("ugAttrNames");
+               varNames.add("ugAttrNamesQ");
                varNames.add("ugAttrNamesCsv");
                varNames.add("ugAttrNamesCsvQ");
+
                varNames.add("hasUgAttr");
 
                return "\\b(" + StringUtils.join(varNames, '|') + ")\\b";
@@ -1076,6 +1226,25 @@ public final class RangerRequestScriptEvaluator {
        private static Map<String, String> getMacrosMap() {
                Map<String, String> ret = new HashMap<>();
 
+               ret.put(SCRIPT_MACRO_GET_TAG_NAMES,         "ctx.tagNames");
+               ret.put(SCRIPT_MACRO_GET_TAG_NAMES_Q,       "ctx.tagNamesQ");
+               ret.put(SCRIPT_MACRO_GET_TAG_ATTR_NAMES,    "ctx.tagAttrNames");
+               ret.put(SCRIPT_MACRO_GET_TAG_ATTR_NAMES_Q,  
"ctx.tagAttrNamesQ");
+               ret.put(SCRIPT_MACRO_GET_TAG_ATTR,          "ctx.tagAttr");
+               ret.put(SCRIPT_MACRO_GET_TAG_ATTR_Q,        "ctx.tagAttrQ");
+               ret.put(SCRIPT_MACRO_GET_UG_NAMES,          "ctx.ugNames");
+               ret.put(SCRIPT_MACRO_GET_UG_NAMES_Q,        "ctx.ugNamesQ");
+               ret.put(SCRIPT_MACRO_GET_UG_ATTR_NAMES,     "ctx.ugAttrNames");
+               ret.put(SCRIPT_MACRO_GET_UG_ATTR_NAMES_Q,   "ctx.ugAttrNamesQ");
+               ret.put(SCRIPT_MACRO_GET_UG_ATTR,           "ctx.ugAttr");
+               ret.put(SCRIPT_MACRO_GET_UG_ATTR_Q,         "ctx.ugAttrQ");
+               ret.put(SCRIPT_MACRO_GET_UR_NAMES,          "ctx.urNames");
+               ret.put(SCRIPT_MACRO_GET_UR_NAMES_Q,        "ctx.urNamesQ");
+               ret.put(SCRIPT_MACRO_GET_USER_ATTR_NAMES,   
"ctx.userAttrNames");
+               ret.put(SCRIPT_MACRO_GET_USER_ATTR_NAMES_Q, 
"ctx.userAttrNamesQ");
+               ret.put(SCRIPT_MACRO_GET_USER_ATTR,         "ctx.userAttr");
+               ret.put(SCRIPT_MACRO_GET_USER_ATTR_Q,       "ctx.userAttrQ");
+
                ret.put(SCRIPT_MACRO_GET_TAG_ATTR_CSV,      "ctx.tagAttrCsv");
                ret.put(SCRIPT_MACRO_GET_TAG_ATTR_Q_CSV,    "ctx.tagAttrCsvQ");
                ret.put(SCRIPT_MACRO_GET_UG_ATTR_CSV,       "ctx.ugAttrCsv");
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
index 73e3dadbf..54991deca 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
@@ -99,6 +99,25 @@ public class RangerCommonConstants {
        public static final String SCRIPT_FIELD_UGA                     = "uga";
        public static final String SCRIPT_FIELD_USER_ROLES              = 
"userRoles";
 
+       public static final String SCRIPT_MACRO_GET_TAG_NAMES         = 
"GET_TAG_NAMES";
+       public static final String SCRIPT_MACRO_GET_TAG_NAMES_Q       = 
"GET_TAG_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_TAG_ATTR_NAMES    = 
"GET_TAG_ATTR_NAMES";
+       public static final String SCRIPT_MACRO_GET_TAG_ATTR_NAMES_Q  = 
"GET_TAG_ATTR_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_TAG_ATTR          = 
"GET_TAG_ATTR";
+       public static final String SCRIPT_MACRO_GET_TAG_ATTR_Q        = 
"GET_TAG_ATTR_Q";
+       public static final String SCRIPT_MACRO_GET_UG_NAMES          = 
"GET_UG_NAMES";
+       public static final String SCRIPT_MACRO_GET_UG_NAMES_Q        = 
"GET_UG_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_UG_ATTR_NAMES     = 
"GET_UG_ATTR_NAMES";
+       public static final String SCRIPT_MACRO_GET_UG_ATTR_NAMES_Q   = 
"GET_UG_ATTR_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_UG_ATTR           = 
"GET_UG_ATTR";
+       public static final String SCRIPT_MACRO_GET_UG_ATTR_Q         = 
"GET_UG_ATTR_Q";
+       public static final String SCRIPT_MACRO_GET_UR_NAMES          = 
"GET_UR_NAMES";
+       public static final String SCRIPT_MACRO_GET_UR_NAMES_Q        = 
"GET_UR_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_USER_ATTR_NAMES   = 
"GET_USER_ATTR_NAMES";
+       public static final String SCRIPT_MACRO_GET_USER_ATTR_NAMES_Q = 
"GET_USER_ATTR_NAMES_Q";
+       public static final String SCRIPT_MACRO_GET_USER_ATTR         = 
"GET_USER_ATTR";
+       public static final String SCRIPT_MACRO_GET_USER_ATTR_Q       = 
"GET_USER_ATTR_Q";
+
        public static final String SCRIPT_MACRO_GET_TAG_ATTR_CSV      = 
"GET_TAG_ATTR_CSV";
        public static final String SCRIPT_MACRO_GET_TAG_ATTR_Q_CSV    = 
"GET_TAG_ATTR_Q_CSV";
        public static final String SCRIPT_MACRO_GET_UG_ATTR_CSV       = 
"GET_UG_ATTR_CSV";
@@ -115,6 +134,7 @@ public class RangerCommonConstants {
        public static final String SCRIPT_MACRO_UR_NAMES_Q_CSV        = 
"UR_NAMES_Q_CSV";
        public static final String SCRIPT_MACRO_USER_ATTR_NAMES_CSV   = 
"USER_ATTR_NAMES_CSV";
        public static final String SCRIPT_MACRO_USER_ATTR_NAMES_Q_CSV = 
"USER_ATTR_NAMES_Q_CSV";
+
        public static final String SCRIPT_MACRO_HAS_TAG               = 
"HAS_TAG";
        public static final String SCRIPT_MACRO_HAS_ANY_TAG           = 
"HAS_ANY_TAG";
        public static final String SCRIPT_MACRO_HAS_NO_TAG            = 
"HAS_NO_TAG";
diff --git 
a/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerRequestScriptEvaluatorTest.java
 
b/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerRequestScriptEvaluatorTest.java
index c398e0205..6705327d8 100644
--- 
a/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerRequestScriptEvaluatorTest.java
+++ 
b/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerRequestScriptEvaluatorTest.java
@@ -135,6 +135,220 @@ public class RangerRequestScriptEvaluatorTest {
         Assert.assertFalse("test: HAS_TAG(notExists)", (Boolean) 
evaluator.evaluateScript(scriptEngine, "HAS_TAG('notExists')"));
         Assert.assertTrue("test: HAS_ANY_TAG", (Boolean) 
evaluator.evaluateScript(scriptEngine, "HAS_ANY_TAG"));
         Assert.assertFalse("test: HAS_NO_TAG", (Boolean) 
evaluator.evaluateScript(scriptEngine, "HAS_NO_TAG"));
+
+        Assert.assertEquals("GET_TAG_NAMES()",           "PCI,PII", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES()"));
+        Assert.assertEquals("GET_TAG_NAMES(null)",       "PCI,PII", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES(null)"));
+        Assert.assertEquals("GET_TAG_NAMES(null, '|')",  "PCI|PII", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES(null, '|')"));
+        Assert.assertEquals("GET_TAG_NAMES(null, null)", "PCIPII", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_TAG_NAMES_Q()",                    
"'PCI','PII'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q()"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null)",                
"'PCI','PII'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null)"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null, '|')",           
"'PCI'|'PII'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null, 
'|')"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null, null)",          
"'PCI''PII'",  evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null, 
null)"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null, '|', null)",     "PCI|PII", 
    evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null, '|', null)"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null, ',', '{', '}')", 
"{PCI},{PII}", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null, 
',', '{', '}')"));
+
+        Assert.assertEquals("GET_TAG_ATTR_NAMES()",           "attr1", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES()"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES(null)",       "attr1", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES(null)"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES(null, '|',)", "attr1", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES(null, '|')"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES(null, null)", "attr1", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q()",                    
"'attr1'", evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES_Q()"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q(null)",                
"'attr1'", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_NAMES_Q(null)"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q(null, '|')",           
"'attr1'", evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES_Q(null, 
'|')"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q(null, null)",          
"'attr1'",   evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES_Q(null, 
null)"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q(null, '|', null)",     
"attr1",   evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES_Q(null, 
'|', null)"));
+        Assert.assertEquals("GET_TAG_ATTR_NAMES_Q(null, ',', '{', '}')", 
"{attr1}", evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_NAMES_Q(null, 
',', '{', '}')"));
+
+        Assert.assertEquals("GET_TAG_ATTR('attr1')",            
"PCI_value,PII_value", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR('attr1')"));
+        Assert.assertEquals("GET_TAG_ATTR('attr1', null)",      
"PCI_value,PII_value", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR('attr1', null)"));
+        Assert.assertEquals("GET_TAG_ATTR('attr1', null, '|')", 
"PCI_value|PII_value", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR('attr1', null, '|')"));
+        Assert.assertEquals("GET_TAG_ATTR('attr1', null, null)", 
"PCI_valuePII_value", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR('attr1', null, null)"));
+
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1')",                      
"'PCI_value','PII_value'", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1')"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1', null)",                
"'PCI_value','PII_value'", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1', null)"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1', null, null)",          
"'PCI_value''PII_value'",  evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1', null, null)"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1', null, '|')",           
"'PCI_value'|'PII_value'", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1', null, '|')"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1', null, ',', null)",     
"PCI_value,PII_value",     evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1', null, ',', null)"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('attr1', null, ',', '{', '}')", 
"{PCI_value},{PII_value}", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('attr1', null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_UG_NAMES()",           
"test-group1,test-group2", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES()"));
+        Assert.assertEquals("GET_UG_NAMES(null)",       
"test-group1,test-group2", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES(null)"));
+        Assert.assertEquals("GET_UG_NAMES(null, '|')",  
"test-group1|test-group2", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES(null, '|')"));
+        Assert.assertEquals("GET_UG_NAMES(null, null)", 
"test-group1test-group2",  evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_UG_NAMES_Q()",                    
"'test-group1','test-group2'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q()"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null)",                
"'test-group1','test-group2'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q(null)"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null, null)",          
"'test-group1''test-group2'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q(null, null)"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null, '|')",           
"'test-group1'|'test-group2'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q(null, '|')"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null, ',', null)",     
"test-group1,test-group2",     evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q(null, ',', null)"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null, ',', '{', '}')", 
"{test-group1},{test-group2}", evaluator.evaluateScript(scriptEngine, 
"GET_UG_NAMES_Q(null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_UG_ATTR_NAMES()",           "dept,site", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_NAMES()"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES(null)",       "dept,site", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_NAMES(null)"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES(null, '|')",  "dept|site", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_NAMES(null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES(null, null)", "deptsite",  
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q()",                    
"'dept','site'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q()"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q(null)",                
"'dept','site'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q(null)"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q(null, null)",          
"'dept''site'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q(null, null)"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q(null, '|')",           
"'dept'|'site'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q(null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q(null, ',', null)",     
"dept,site",     evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q(null, ',', null)"));
+        Assert.assertEquals("GET_UG_ATTR_NAMES_Q(null, ',', '{', '}')", 
"{dept},{site}", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_NAMES_Q(null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_UG_ATTR('dept')",             "ENGG,PROD", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('dept')"));
+        Assert.assertEquals("GET_UG_ATTR('dept', null)",       "ENGG,PROD", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('dept', null)"));
+        Assert.assertEquals("GET_UG_ATTR('dept', null, '|')",  "ENGG|PROD", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('dept', null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR('dept', null, null)", "ENGGPROD",  
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('dept', null, null)"));
+
+        Assert.assertEquals("GET_UG_ATTR_Q('dept')",                      
"'ENGG','PROD'", evaluator.evaluateScript(scriptEngine, 
"GET_UG_ATTR_Q('dept')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('dept', null)",                
"'ENGG','PROD'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('dept', 
null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('dept', null, null)",          
"'ENGG''PROD'",  evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('dept', 
null, null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('dept', null, '|')",           
"'ENGG'|'PROD'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('dept', 
null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('dept', null, ',', null)",     
"ENGG,PROD",     evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('dept', 
null, ',', null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('dept', null, ',', '{', '}')", 
"{ENGG},{PROD}", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('dept', 
null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_UG_ATTR('site')",             "10,20", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('site')"));
+        Assert.assertEquals("GET_UG_ATTR('site', null)",       "10,20", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('site', null)"));
+        Assert.assertEquals("GET_UG_ATTR('site', null, '|')",  "10|20", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('site', null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR('site', null, null)", "1020",  
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('site', null, null)"));
+
+        Assert.assertEquals("GET_UG_ATTR_Q('site')",                      
"'10','20'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('site', null)",                
"'10','20'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site', 
null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('site', null, null)",          
"'10''20'",  evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site', 
null, null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('site', null, '|')",           
"'10'|'20'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site', 
null, '|')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('site', null, ',', null)",     
"10,20",     evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site', 
null, ',', null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('site', null, ',', '{', '}')", 
"{10},{20}", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('site', 
null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_UR_NAMES()",           
"test-role1,test-role2", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES()"));
+        Assert.assertEquals("GET_UR_NAMES(null)",       
"test-role1,test-role2", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES(null)"));
+        Assert.assertEquals("GET_UR_NAMES(null, '|')",  
"test-role1|test-role2", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES(null, '|')"));
+        Assert.assertEquals("GET_UR_NAMES(null, null)", 
"test-role1test-role2",  evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_UR_NAMES_Q()",                    
"'test-role1','test-role2'", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q()"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null)",                
"'test-role1','test-role2'", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q(null)"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null, null)",          
"'test-role1''test-role2'", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q(null, null)"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null, '|')",           
"'test-role1'|'test-role2'", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q(null, '|')"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null, ',', null)",     
"test-role1,test-role2",     evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q(null, ',', null)"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null, ',', '{', '}')", 
"{test-role1},{test-role2}", evaluator.evaluateScript(scriptEngine, 
"GET_UR_NAMES_Q(null, ',', '{', '}')"));
+
+        Assert.assertEquals("GET_USER_ATTR_NAMES()",           "state", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES()"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES(null)",       "state", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES(null)"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES(null, '|')",  "state", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES(null, '|')"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES(null, null)", "state",  
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES(null, null)"));
+
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q()",                    
"'state'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES_Q()"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q(null)",                
"'state'", evaluator.evaluateScript(scriptEngine, 
"GET_USER_ATTR_NAMES_Q(null)"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q(null, null)",          
"'state'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES_Q(null, 
null)"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q(null, '|')",           
"'state'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES_Q(null, 
'|')"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q(null, ',', null)",     
"state",   evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES_Q(null, 
',', null)"));
+        Assert.assertEquals("GET_USER_ATTR_NAMES_Q(null, ',', '{', '}')", 
"{state}", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_NAMES_Q(null, 
',', '{', '}')"));
+
+        Assert.assertEquals("GET_USER_ATTR('state')",             "CA", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('state')"));
+        Assert.assertEquals("GET_USER_ATTR('state', null)",       "CA", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('state', null)"));
+        Assert.assertEquals("GET_USER_ATTR('state', null, '|')",  "CA", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('state', null, '|')"));
+        Assert.assertEquals("GET_USER_ATTR('state', null, null)", "CA",  
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('state', null, null)"));
+
+        Assert.assertEquals("GET_USER_ATTR_Q('state')",                      
"'CA'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state')"));
+        Assert.assertEquals("GET_USER_ATTR_Q('state', null)",                
"'CA'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state', 
null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('state', null, null)",          
"'CA'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state', null, 
null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('state', null, '|')",           
"'CA'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state', null, 
'|')"));
+        Assert.assertEquals("GET_USER_ATTR_Q('state', null, ',', null)",     
"CA",   evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state', null, 
',', null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('state', null, ',', '{', '}')", 
"{CA}", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('state', null, 
',', '{', '}')"));
+    }
+
+    @Test
+    public void testNonExistentValues() {
+        RangerAccessRequest          request   = createRequest("test-user", 
Collections.emptySet(), Collections.emptySet(), Collections.emptyList());
+        RangerRequestScriptEvaluator evaluator = new 
RangerRequestScriptEvaluator(request);
+
+        // empty TAG names
+        Assert.assertEquals("GET_TAG_NAMES()",              "",      
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES()"));
+        Assert.assertEquals("GET_TAG_NAMES(null)",          "",      
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES(null)"));
+        Assert.assertEquals("GET_TAG_NAMES('empty')",       "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES('empty')"));
+        Assert.assertEquals("GET_TAG_NAMES('empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES('empty', '|')"));
+        Assert.assertEquals("GET_TAG_NAMES('empty', null)", "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES('empty', null)"));
+
+        // empty TAG names
+        Assert.assertEquals("GET_TAG_NAMES_Q()",                       "",     
   evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q()"));
+        Assert.assertEquals("GET_TAG_NAMES_Q(null)",                   "",     
   evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q(null)"));
+        Assert.assertEquals("GET_TAG_NAMES_Q('empty')",                
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q('empty')"));
+        Assert.assertEquals("GET_TAG_NAMES_Q('empty', ',')",           
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q('empty', 
',')"));
+        Assert.assertEquals("GET_TAG_NAMES_Q('empty', '|', null)",     
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q('empty', 
'|')"));
+        Assert.assertEquals("GET_TAG_NAMES_Q('empty', ',', '{', '}')", 
"{empty}", evaluator.evaluateScript(scriptEngine, "GET_TAG_NAMES_Q('empty', 
',', '{', '}')"));
+
+        // empty UG names
+        Assert.assertEquals("GET_UG_NAMES()",              "",      
evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES()"));
+        Assert.assertEquals("GET_UG_NAMES(null)",          "",      
evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES(null)"));
+        Assert.assertEquals("GET_UG_NAMES('empty')",       "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES('empty')"));
+        Assert.assertEquals("GET_UG_NAMES('empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES('empty', '|')"));
+        Assert.assertEquals("GET_UG_NAMES('empty', null)", "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES('empty', null)"));
+
+        // empty UG names
+        Assert.assertEquals("GET_UG_NAMES_Q()",                       "",      
  evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q()"));
+        Assert.assertEquals("GET_UG_NAMES_Q(null)",                   "",      
  evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q(null)"));
+        Assert.assertEquals("GET_UG_NAMES_Q('empty')",                
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q('empty')"));
+        Assert.assertEquals("GET_UG_NAMES_Q('empty', ',')",           
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q('empty', 
',')"));
+        Assert.assertEquals("GET_UG_NAMES_Q('empty', '|', null)",     
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q('empty', 
'|')"));
+        Assert.assertEquals("GET_UG_NAMES_Q('empty', ',', '{', '}')", 
"{empty}", evaluator.evaluateScript(scriptEngine, "GET_UG_NAMES_Q('empty', ',', 
'{', '}')"));
+
+        // empty UR names
+        Assert.assertEquals("GET_UR_NAMES()",              "",      
evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES()"));
+        Assert.assertEquals("GET_UR_NAMES(null)",          "",      
evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES(null)"));
+        Assert.assertEquals("GET_UR_NAMES('empty')",       "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES('empty')"));
+        Assert.assertEquals("GET_UR_NAMES('empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES('empty', '|')"));
+        Assert.assertEquals("GET_UR_NAMES('empty', null)", "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES('empty', null)"));
+
+        // empty UR names
+        Assert.assertEquals("GET_UR_NAMES_Q()",                       "",      
  evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q()"));
+        Assert.assertEquals("GET_UR_NAMES_Q(null)",                   "",      
  evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q(null)"));
+        Assert.assertEquals("GET_UR_NAMES_Q('empty')",                
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q('empty')"));
+        Assert.assertEquals("GET_UR_NAMES_Q('empty', ',')",           
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q('empty', 
',')"));
+        Assert.assertEquals("GET_UR_NAMES_Q('empty', '|', null)",     
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q('empty', 
'|')"));
+        Assert.assertEquals("GET_UR_NAMES_Q('empty', ',', '{', '}')", 
"{empty}", evaluator.evaluateScript(scriptEngine, "GET_UR_NAMES_Q('empty', ',', 
'{', '}')"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_TAG_ATTR('noattr')",                "",      
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR('noattr')"));
+        Assert.assertEquals("GET_TAG_ATTR('noattr', null)",          "",      
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR('noattr', null)"));
+        Assert.assertEquals("GET_TAG_ATTR('noattr', 'empty')",       "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR('noattr', 'empty')"));
+        Assert.assertEquals("GET_TAG_ATTR('noattr', 'empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR('noattr', 'empty', '|')"));
+        Assert.assertEquals("GET_TAG_ATTR('noattr', 'empty', null)", "empty", 
evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR('noattr', 'empty', 
null)"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr')",                        
 "",        evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_Q('noattr')"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr', null)",                  
 "",        evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_Q('noattr', 
null)"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr', 'empty')",               
 "'empty'", evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_Q('noattr', 
'empty')"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr', 'empty', ',')",          
 "'empty'", evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_Q('noattr', 
'empty', ',')"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr', 'empty', '|', null)",    
 "empty",   evaluator.evaluateScript(scriptEngine, "GET_TAG_ATTR_Q('noattr', 
'empty', '|', null)"));
+        Assert.assertEquals("GET_TAG_ATTR_Q('noattr', 'empty', ',', '{', 
'}')", "{empty}", evaluator.evaluateScript(scriptEngine, 
"GET_TAG_ATTR_Q('noattr', 'empty', ',', '{', '}')"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_UG_ATTR('noattr')",             "", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('noattr')"));
+        Assert.assertEquals("GET_UG_ATTR('noattr', null)",       "", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('noattr', null)"));
+        Assert.assertEquals("GET_UG_ATTR('noattr', 'empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('noattr', 'empty', '|')"));
+        Assert.assertEquals("GET_UG_ATTR('noattr', 'empty', null)", "empty",  
evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR('noattr', 'empty', null)"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr')",                         
"",        evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr', null)",                   
"",        evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr', 
null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr', 'empty', null)",          
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr', 
'empty', null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr', 'empty', '|')",           
"'empty'", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr', 
'empty', '|')"));
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr', 'empty', ',', null)",     
"empty",   evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr', 
'empty', ',', null)"));
+        Assert.assertEquals("GET_UG_ATTR_Q('noattr', 'empty', ',', '{', '}')", 
"{empty}", evaluator.evaluateScript(scriptEngine, "GET_UG_ATTR_Q('noattr', 
'empty', ',', '{', '}')"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_USER_ATTR('noattr')",                "",      
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('noattr')"));
+        Assert.assertEquals("GET_USER_ATTR('noattr', null)",          "",      
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('noattr', null)"));
+        Assert.assertEquals("GET_USER_ATTR('noattr', 'empty', '|')",  "empty", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('noattr', 'empty', 
'|')"));
+        Assert.assertEquals("GET_USER_ATTR('noattr', 'empty', null)", "empty", 
evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR('noattr', 'empty', 
null)"));
+
+        // non-existent attribute
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr')",                       
  "",        evaluator.evaluateScript(scriptEngine, 
"GET_USER_ATTR_Q('noattr')"));
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr', null)",                 
  "",        evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('noattr', 
null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr', 'empty', null)",        
  "'empty'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('noattr', 
'empty', null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr', 'empty', '|')",         
  "'empty'", evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('noattr', 
'empty', '|')"));
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr', 'empty', ',', null)",   
  "empty",   evaluator.evaluateScript(scriptEngine, "GET_USER_ATTR_Q('noattr', 
'empty', ',', null)"));
+        Assert.assertEquals("GET_USER_ATTR_Q('noattr', 'empty', ',', '{', 
'}')", "{empty}", evaluator.evaluateScript(scriptEngine, 
"GET_USER_ATTR_Q('noattr', 'empty', ',', '{', '}')"));
     }
 
     @Test


Reply via email to