Repository: incubator-ranger
Updated Branches:
  refs/heads/master 252cb4d3c -> a3a472d99


RANGER-895: Mask UDF implementation updated to handle byte and char datatypes


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

Branch: refs/heads/master
Commit: a3a472d999fe77f516b20f0c0644149c5ebe7470
Parents: 252cb4d
Author: Madhan Neethiraj <[email protected]>
Authored: Wed Apr 20 23:48:15 2016 -0700
Committer: Madhan Neethiraj <[email protected]>
Committed: Sat Apr 23 23:56:03 2016 -0700

----------------------------------------------------------------------
 .../service-defs/ranger-servicedef-hive.json    |  24 +-
 .../authorization/hive/udf/RangerBaseUdf.java   | 109 +++++++---
 .../authorization/hive/udf/RangerUdfMask.java   | 217 +++++++++++++------
 .../hive/udf/RangerUdfMaskFirstN.java           |  15 +-
 .../hive/udf/RangerUdfMaskHash.java             |   5 +
 .../hive/udf/RangerUdfMaskLastN.java            |  16 +-
 .../hive/udf/RangerUdfMaskShowFirstN.java       |  15 +-
 .../hive/udf/RangerUdfMaskShowLastN.java        |  17 +-
 8 files changed, 289 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json 
b/agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json
index eda2d22..4bb2607 100644
--- a/agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json
+++ b/agents-common/src/main/resources/service-defs/ranger-servicedef-hive.json
@@ -253,7 +253,7 @@
                                "name": "MASK",
                                "label": "Mask",
                                "description": "Replace lowercase with 'x', 
uppercase with 'X', digits with '0'",
-                               "transformer": "rangerUdfMask({col})",
+                               "transformer": "default.mask({col})",
                                "dataMaskOptions": {
                                }
                        },
@@ -262,21 +262,21 @@
                                "name": "MASK_SHOW_LAST_4",
                                "label": "Partial mask: show last 4",
                                "description": "Show last 4 characters; replace 
rest with 'x'",
-                               "transformer": "rangerUdfMaskShowLastN({col}, 
4, 'x', 'x', 'x', -1, '1')"
+                               "transformer": "default.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": "rangerUdfMaskShowFirstN({col}, 
4, 'x', 'x', 'x', -1, '1')"
+                               "transformer": 
"default.mask_show_first_n({col}, 4, 'x', 'x', 'x', -1, '1')"
                        },
                        {
                                "itemId": 4,
                                "name": "MASK_HASH",
                                "label": "Hash",
                                "description": "Hash the value",
-                               "transformer": "rangerUdfMaskHash({col})"
+                               "transformer": "default.mask_hash({col})"
                        },
                        {
                                "itemId": 5,
@@ -295,46 +295,42 @@
                                "name": "MASK_DATE_DAY",
                                "label": "Date: mask day",
                                "description": "Date: mask day",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', 1, -1, -1)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', 1, -1, -1)"
                        },
                        {
                                "itemId": 8,
                                "name": "MASK_DATE_MONTH",
                                "label": "Date: mask month",
                                "description": "Date: mask month",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', -1, 0, -1)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', -1, 0, -1)"
                        },
                        {
                                "itemId": 9,
                                "name": "MASK_DATE_YEAR",
                                "label": "Date: mask year",
                                "description": "Date: mask year",
-                               "transformer": "rangerUdfMask",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', -1, -1, 0)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', -1, -1, 0)"
                        },
                        {
                                "itemId": 10,
                                "name": "MASK_DATE_SHOW_DAY",
                                "label": "Date: show only day",
                                "description": "Date: show only day",
-                               "transformer": "rangerUdfMask",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', -1, 0, 0)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', -1, 0, 0)"
                        },
                        {
                                "itemId": 11,
                                "name": "MASK_DATE_SHOW_MONTH",
                                "label": "Date: show only month",
                                "description": "Date: show only month",
-                               "transformer": "rangerUdfMask",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', 1, -1, 0)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', 1, -1, 0)"
                        },
                        {
                                "itemId": 12,
                                "name": "MASK_DATE_SHOW_YEAR",
                                "label": "Date: show only year",
                                "description": "Date: show only year",
-                               "transformer": "rangerUdfMask",
-                               "transformer": "rangerUdfMask({col}, 'x', 'x', 
'x', -1, '1', 1, 0, -1)"
+                               "transformer": "default.mask({col}, 'x', 'x', 
'x', -1, '1', 1, 0, -1)"
                        }
                ]
        },

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerBaseUdf.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerBaseUdf.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerBaseUdf.java
index 389b2a5..d2fbed9 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerBaseUdf.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerBaseUdf.java
@@ -22,14 +22,13 @@ package org.apache.ranger.authorization.hive.udf;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.common.type.HiveChar;
 import org.apache.hadoop.hive.common.type.HiveVarchar;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
-import org.apache.hadoop.hive.serde2.io.DateWritable;
-import org.apache.hadoop.hive.serde2.io.HiveVarcharWritable;
-import org.apache.hadoop.hive.serde2.io.ShortWritable;
+import org.apache.hadoop.hive.serde2.io.*;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.*;
@@ -70,17 +69,7 @@ public abstract class RangerBaseUdf extends GenericUDF {
 
        @Override
        public Object evaluate(DeferredObject[] arguments) throws HiveException 
{
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("==> 
RangerBaseUdf.evaluate(arguments.length=" + arguments.length + ")");
-               }
-
-               Object ret = 
transformerAdapter.getTransformedWritable(arguments[0]);
-
-               if (LOG.isDebugEnabled()) {
-                       LOG.debug("<== 
RangerBaseUdf.evaluate(arguments.length=" + arguments.length + "): ret=" + ret);
-               }
-
-               return ret;
+               return transformerAdapter.getTransformedWritable(arguments[0]);
        }
 
        @Override
@@ -89,16 +78,10 @@ public abstract class RangerBaseUdf extends GenericUDF {
        }
 
        static abstract class RangerTransformer {
-               static final Short   SHORT_0   = Short.valueOf((short)0);
-               static final Integer INTEGER_0 = Integer.valueOf((int)0);
-               static final Long    LONG_0    = Long.valueOf((long)0);
-               static final Date    DATE_0    = new Date(0);
-               static final String  STRING_0  = new String("0");
-
-
                abstract void    init(ObjectInspector[] arguments, int 
startIdx);
 
                abstract String  transform(String value);
+               abstract Byte    transform(Byte value);
                abstract Short   transform(Short value);
                abstract Integer transform(Integer value);
                abstract Long    transform(Long value);
@@ -128,6 +111,14 @@ abstract class RangerTransformerAdapter {
                                ret = new 
HiveVarcharTransformerAdapter((HiveVarcharObjectInspector)columnType, 
transformer);
                                break;
 
+                       case CHAR:
+                               ret = new 
HiveCharTransformerAdapter((HiveCharObjectInspector)columnType, transformer);
+                               break;
+
+                       case BYTE:
+                               ret = new 
ByteTransformerAdapter((ByteObjectInspector)columnType, transformer);
+                               break;
+
                        case SHORT:
                                ret = new 
ShortTransformerAdapter((ShortObjectInspector)columnType, transformer);
                                break;
@@ -153,9 +144,40 @@ abstract class RangerTransformerAdapter {
        }
 }
 
+class ByteTransformerAdapter extends RangerTransformerAdapter {
+       final ByteObjectInspector columnType;
+       final ByteWritable        writable;
+
+       public ByteTransformerAdapter(ByteObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
+               this(columnType, transformer, new ByteWritable());
+       }
+
+       public ByteTransformerAdapter(ByteObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer, ByteWritable writable) {
+               super(transformer);
+
+               this.columnType = columnType;
+               this.writable   = writable;
+       }
+
+       @Override
+       public Object getTransformedWritable(DeferredObject object) throws 
HiveException {
+               Byte value = 
(Byte)columnType.getPrimitiveJavaObject(object.get());
+
+               if(value != null) {
+                       Byte transformedValue = transformer.transform(value);
+
+                       writable.set(transformedValue);
+
+                       return writable;
+               }
+
+               return null;
+       }
+}
+
 class DateTransformerAdapter extends RangerTransformerAdapter {
        final DateObjectInspector columnType;
-       final DateWritable writable;
+       final DateWritable        writable;
 
        public DateTransformerAdapter(DateObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new DateWritable());
@@ -184,9 +206,40 @@ class DateTransformerAdapter extends 
RangerTransformerAdapter {
        }
 }
 
+class HiveCharTransformerAdapter extends RangerTransformerAdapter {
+       final HiveCharObjectInspector columnType;
+       final HiveCharWritable        writable;
+
+       public HiveCharTransformerAdapter(HiveCharObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
+               this(columnType, transformer, new HiveCharWritable());
+       }
+
+       public HiveCharTransformerAdapter(HiveCharObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer, HiveCharWritable writable) {
+               super(transformer);
+
+               this.columnType = columnType;
+               this.writable   = writable;
+       }
+
+       @Override
+       public Object getTransformedWritable(DeferredObject object) throws 
HiveException {
+               HiveChar value = 
columnType.getPrimitiveJavaObject(object.get());
+
+               if(value != null) {
+                       String transformedValue = 
transformer.transform(value.getValue());
+
+                       writable.set(transformedValue);
+
+                       return writable;
+               }
+
+               return null;
+       }
+}
+
 class HiveVarcharTransformerAdapter extends RangerTransformerAdapter {
        final HiveVarcharObjectInspector columnType;
-       final HiveVarcharWritable writable;
+       final HiveVarcharWritable        writable;
 
        public HiveVarcharTransformerAdapter(HiveVarcharObjectInspector 
columnType, RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new HiveVarcharWritable());
@@ -217,7 +270,7 @@ class HiveVarcharTransformerAdapter extends 
RangerTransformerAdapter {
 
 class IntegerTransformerAdapter extends RangerTransformerAdapter {
        final IntObjectInspector columnType;
-       final IntWritable writable;
+       final IntWritable        writable;
 
        public IntegerTransformerAdapter(IntObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new IntWritable());
@@ -248,7 +301,7 @@ class IntegerTransformerAdapter extends 
RangerTransformerAdapter {
 
 class LongTransformerAdapter extends RangerTransformerAdapter {
        final LongObjectInspector columnType;
-       final LongWritable writable;
+       final LongWritable        writable;
 
        public LongTransformerAdapter(LongObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new LongWritable());
@@ -288,13 +341,13 @@ class NoTransformAdapter extends RangerTransformerAdapter 
{
 
        @Override
        public Object getTransformedWritable(DeferredObject object) throws 
HiveException {
-               return columnType.getPrimitiveWritableObject(object);
+               return columnType.getPrimitiveWritableObject(object.get());
        }
 }
 
 class ShortTransformerAdapter extends RangerTransformerAdapter {
        final ShortObjectInspector columnType;
-       final ShortWritable writable;
+       final ShortWritable        writable;
 
        public ShortTransformerAdapter(ShortObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new ShortWritable());
@@ -325,7 +378,7 @@ class ShortTransformerAdapter extends 
RangerTransformerAdapter {
 
 class StringTransformerAdapter extends RangerTransformerAdapter {
        final StringObjectInspector columnType;
-       final Text writable;
+       final Text                  writable;
 
        public StringTransformerAdapter(StringObjectInspector columnType, 
RangerBaseUdf.RangerTransformer transformer) {
                this(columnType, transformer, new Text());

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMask.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMask.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMask.java
index fac4e57..9d5b2ce 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMask.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMask.java
@@ -21,12 +21,12 @@ package org.apache.ranger.authorization.hive.udf;
 
 import java.sql.Date;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.hive.serde2.io.ShortWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
-import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantIntObjectInspector;
-import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantStringObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.*;
 import org.apache.hadoop.io.IntWritable;
-import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.LongWritable;
 
 
 public class RangerUdfMask extends RangerBaseUdf {
@@ -43,71 +43,88 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
        final static int MASKED_DAY_COMPONENT_VAL    = 1;
        final static int MASKED_MONTH_COMPONENT_VAL  = 0;
        final static int MASKED_YEAR_COMPONENT_VAL   = 0;
-       final static int UNMASKED_DATE_COMPONENT_VAL = -1;
+       final static int UNMASKED_VAL                = -1;
 
-       int maskedUpperChar   = MASKED_UPPERCASE;
-       int maskedLowerChar   = MASKED_LOWERCASE;
-       int maskedDigitChar   = MASKED_NUMBER;
-       int maskedOtherChar   = MASKED_OTHER_CHAR;
-       int maskedNumber      = MASKED_NUMBER;
-       int maskedDayValue    = MASKED_DAY_COMPONENT_VAL;
-       int maskedMonthValue  = MASKED_MONTH_COMPONENT_VAL;
-       int maskedYearValue   = MASKED_YEAR_COMPONENT_VAL;
+       int maskedUpperChar  = MASKED_UPPERCASE;
+       int maskedLowerChar  = MASKED_LOWERCASE;
+       int maskedDigitChar  = MASKED_NUMBER;
+       int maskedOtherChar  = MASKED_OTHER_CHAR;
+       int maskedNumber     = MASKED_NUMBER;
+       int maskedDayValue   = MASKED_DAY_COMPONENT_VAL;
+       int maskedMonthValue = MASKED_MONTH_COMPONENT_VAL;
+       int maskedYearValue  = MASKED_YEAR_COMPONENT_VAL;
 
        public MaskTransformer() {
        }
 
        @Override
        public void init(ObjectInspector[] arguments, int startIdx) {
-               maskedUpperChar  = getCharArg(arguments, startIdx + 0, 
MASKED_UPPERCASE);
-               maskedLowerChar  = getCharArg(arguments, startIdx + 1, 
MASKED_LOWERCASE);
-               maskedDigitChar  = getCharArg(arguments, startIdx + 2, 
MASKED_NUMBER);
-               maskedOtherChar  = getCharArg(arguments, startIdx + 3, 
MASKED_OTHER_CHAR);
-               maskedNumber     = getCharArg(arguments, startIdx + 4, 
MASKED_NUMBER);
-               maskedDayValue   = getIntArg(arguments, startIdx + 5, 
MASKED_DAY_COMPONENT_VAL);
-               maskedMonthValue = getIntArg(arguments, startIdx + 6, 
MASKED_MONTH_COMPONENT_VAL);
-               maskedYearValue  = getIntArg(arguments, startIdx + 7, 
MASKED_YEAR_COMPONENT_VAL);
+               int idx = startIdx;
+
+               maskedUpperChar  = getCharArg(arguments, idx++, 
MASKED_UPPERCASE);
+               maskedLowerChar  = getCharArg(arguments, idx++, 
MASKED_LOWERCASE);
+               maskedDigitChar  = getCharArg(arguments, idx++, MASKED_NUMBER);
+               maskedOtherChar  = getCharArg(arguments, idx++, 
MASKED_OTHER_CHAR);
+               maskedNumber     = getCharArg(arguments, idx++, MASKED_NUMBER);
+               maskedDayValue   = getIntArg(arguments, idx++, 
MASKED_DAY_COMPONENT_VAL);
+               maskedMonthValue = getIntArg(arguments, idx++, 
MASKED_MONTH_COMPONENT_VAL);
+               maskedYearValue  = getIntArg(arguments, idx++, 
MASKED_YEAR_COMPONENT_VAL);
        }
 
        @Override
        String transform(String value) {
-               return maskString(value, maskedUpperChar, maskedLowerChar, 
maskedDigitChar, maskedOtherChar, 0, value.length());
+               return maskString(value, 0, value.length());
+       }
+
+       @Override
+       Byte transform(Byte value) {
+               String strValue = value.toString();
+
+               return toByte(Long.parseLong(maskNumber(strValue, 0, 
strValue.length())));
        }
 
        @Override
        Short transform(Short value) {
                String strValue = value.toString();
 
-               return Short.parseShort(maskNumber(strValue, maskedDigitChar, 
0, strValue.length()));
+               return toShort(Long.parseLong(maskNumber(strValue, 0, 
strValue.length())));
        }
 
        @Override
        Integer transform(Integer value) {
                String strValue = value.toString();
 
-               return Integer.parseInt(maskNumber(strValue, maskedDigitChar, 
0, strValue.length()));
+               return toInteger(Long.parseLong(maskNumber(strValue, 0, 
strValue.length())));
        }
 
        @Override
        Long transform(Long value) {
                String strValue = value.toString();
 
-               return Long.parseLong(maskNumber(strValue, maskedDigitChar, 0, 
strValue.length()));
+               return Long.parseLong(maskNumber(strValue, 0, 
strValue.length()));
        }
 
        @Override
        Date transform(Date value) {
-               return maskDate(value, maskedDayValue, maskedMonthValue, 
maskedYearValue);
+               return maskDate(value);
        }
 
 
-       String maskString(String val, int replaceUpperChar, int 
replaceLowerChar, int replaceDigitChar, int replaceOtherChar, int startIdx, int 
endIdx) {
-               StringBuffer strBuf = new StringBuffer(val.length());
+       String maskString(String val, int startIdx, int endIdx) {
+               StringBuilder strBuf = new StringBuilder(val.length());
 
                if(startIdx < 0) {
                        startIdx = 0;
                }
 
+               if(endIdx < 0) {
+                       endIdx = 0;
+               }
+
+               if(startIdx > val.length()) {
+                       startIdx = val.length();
+               }
+
                if(endIdx > val.length()) {
                        endIdx = val.length();
                }
@@ -121,26 +138,26 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
 
                        switch(Character.getType(c)) {
                                case Character.UPPERCASE_LETTER:
-                                       if(replaceUpperChar != -1) {
-                                               c = replaceUpperChar;
+                                       if(maskedUpperChar != UNMASKED_VAL) {
+                                               c = maskedUpperChar;
                                        }
                                        break;
 
                                case Character.LOWERCASE_LETTER:
-                                       if(replaceLowerChar != -1) {
-                                               c = replaceLowerChar;
+                                       if(maskedLowerChar != UNMASKED_VAL) {
+                                               c = maskedLowerChar;
                                        }
                                        break;
 
                                case Character.DECIMAL_DIGIT_NUMBER:
-                                       if(replaceDigitChar != -1) {
-                                               c = replaceDigitChar;
+                                       if(maskedDigitChar != UNMASKED_VAL) {
+                                               c = maskedDigitChar;
                                        }
                                        break;
 
                                default:
-                                       if(replaceOtherChar != -1) {
-                                               c = replaceOtherChar;
+                                       if(maskedOtherChar != UNMASKED_VAL) {
+                                               c = maskedOtherChar;
                                        }
                                        break;
                        }
@@ -155,14 +172,22 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
                return strBuf.toString();
        }
 
-       String maskNumber(String val, int replaceDigit, int startIdx, int 
endIdx) {
-               if(replaceDigit != -1) {
-                       StringBuffer strBuf = new StringBuffer(val.length());
+       String maskNumber(String val, int startIdx, int endIdx) {
+               if(maskedNumber != UNMASKED_VAL) {
+                       StringBuilder strBuf = new StringBuilder(val.length());
 
                        if (startIdx < 0) {
                                startIdx = 0;
                        }
 
+                       if (endIdx < 0) {
+                               endIdx = 0;
+                       }
+
+                       if (startIdx > val.length()) {
+                               startIdx = val.length();
+                       }
+
                        if (endIdx > val.length()) {
                                endIdx = val.length();
                        }
@@ -176,8 +201,8 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
 
                                switch (Character.getType(c)) {
                                        case Character.DECIMAL_DIGIT_NUMBER:
-                                               c = replaceDigit;
-                                       break;
+                                               c = maskedNumber;
+                                               break;
                                }
 
                                strBuf.appendCodePoint(c);
@@ -193,39 +218,79 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
                return val;
        }
 
-       Date maskDate(Date value, int maskedDay, int maskedMonth, int 
maskedYear) {
-               int year  = maskedYear  == UNMASKED_DATE_COMPONENT_VAL ? 
value.getYear()  : MASKED_YEAR_COMPONENT_VAL;
-               int month = maskedMonth == UNMASKED_DATE_COMPONENT_VAL ? 
value.getMonth() : MASKED_MONTH_COMPONENT_VAL;
-               int day   = maskedDay   == UNMASKED_DATE_COMPONENT_VAL ? 
value.getDate()  : MASKED_DAY_COMPONENT_VAL;
+       Date maskDate(Date value) {
+               int year  = maskedYearValue  == UNMASKED_VAL ? value.getYear()  
: maskedYearValue;
+               int month = maskedMonthValue == UNMASKED_VAL ? value.getMonth() 
: maskedMonthValue;
+               int day   = maskedDayValue   == UNMASKED_VAL ? value.getDate()  
: maskedDayValue;
 
                return new Date(year, month, day);
        }
 
-       String getStringArg(ObjectInspector[] arguments, int index, String 
defaultValue) {
-               String ret = defaultValue;
+       Byte toByte(long value) {
+               if(value < Byte.MIN_VALUE) {
+                       return Byte.MIN_VALUE;
+               } else if(value > Byte.MAX_VALUE) {
+                       return Byte.MAX_VALUE;
+               } else {
+                       return (byte)value;
+               }
+       }
+
+       Short toShort(long value) {
+               if(value < Short.MIN_VALUE) {
+                       return Short.MIN_VALUE;
+               } else if(value > Short.MAX_VALUE) {
+                       return Short.MAX_VALUE;
+               } else {
+                       return (short)value;
+               }
+       }
+
+       Integer toInteger(long value) {
+               if(value < Integer.MIN_VALUE) {
+                       return Integer.MIN_VALUE;
+               } else if(value > Integer.MAX_VALUE) {
+                       return Integer.MAX_VALUE;
+               } else {
+                       return (int)value;
+               }
+       }
+
+       int getCharArg(ObjectInspector[] arguments, int index, int 
defaultValue) {
+               int ret = defaultValue;
 
                ObjectInspector arg = (arguments != null && arguments.length > 
index) ? arguments[index] : null;
 
                if (arg != null) {
-                       if (arg instanceof 
WritableConstantStringObjectInspector) {
-                               Text value = 
((WritableConstantStringObjectInspector) arg).getWritableConstantValue();
+                       if(arg instanceof WritableConstantIntObjectInspector) {
+                               IntWritable value = 
((WritableConstantIntObjectInspector)arg).getWritableConstantValue();
 
-                               if (value != null && value.getLength() > 0) {
-                                       ret = value.toString();
+                               if(value != null) {
+                                       ret = value.get();
                                }
-                       }
-               }
+                       } else if(arg instanceof 
WritableConstantLongObjectInspector) {
+                               LongWritable value = 
((WritableConstantLongObjectInspector)arg).getWritableConstantValue();
 
-               return ret;
-       }
+                               if(value != null) {
+                                       ret = (int)value.get();
+                               }
+                       } else if(arg instanceof 
WritableConstantShortObjectInspector) {
+                               ShortWritable value = 
((WritableConstantShortObjectInspector)arg).getWritableConstantValue();
 
-       int getCharArg(ObjectInspector[] arguments, int index, int 
defaultValue) {
-               int ret = defaultValue;
+                               if(value != null) {
+                                       ret = value.get();
+                               }
+                       } else if(arg instanceof ConstantObjectInspector) {
+                               Object value = ((ConstantObjectInspector) 
arg).getWritableConstantValue();
 
-               String value = getStringArg(arguments, index, null);
+                               if (value != null) {
+                                       String strValue = value.toString();
 
-               if (StringUtils.isNotEmpty(value)) {
-                       ret = value.charAt(0);
+                                       if (strValue != null && 
strValue.length() > 0) {
+                                               ret = strValue.charAt(0);
+                                       }
+                               }
+                       }
                }
 
                return ret;
@@ -237,22 +302,34 @@ class MaskTransformer extends 
RangerBaseUdf.RangerTransformer {
                ObjectInspector arg = (arguments != null && arguments.length > 
index) ? arguments[index] : null;
 
                if (arg != null) {
-                       if (arg instanceof 
WritableConstantStringObjectInspector) {
-                               Text value = 
((WritableConstantStringObjectInspector) arg).getWritableConstantValue();
+                       if (arg instanceof WritableConstantIntObjectInspector) {
+                               IntWritable value = 
((WritableConstantIntObjectInspector) arg).getWritableConstantValue();
 
                                if (value != null) {
-                                       try {
-                                               ret = 
Integer.parseInt(value.toString());
-                                       } catch(NumberFormatException excp) {
-                                               // ignored; defaultValue will 
be returned
-                                       }
+                                       ret = value.get();
                                }
-                       } else if(arg instanceof 
WritableConstantIntObjectInspector) {
-                               IntWritable value = 
((WritableConstantIntObjectInspector)arg).getWritableConstantValue();
+                       } else if (arg instanceof 
WritableConstantLongObjectInspector) {
+                               LongWritable value = 
((WritableConstantLongObjectInspector) arg).getWritableConstantValue();
 
-                               if(value != null) {
+                               if (value != null) {
+                                       ret = (int) value.get();
+                               }
+                       } else if (arg instanceof 
WritableConstantShortObjectInspector) {
+                               ShortWritable value = 
((WritableConstantShortObjectInspector) arg).getWritableConstantValue();
+
+                               if (value != null) {
                                        ret = value.get();
                                }
+                       } else if (arg instanceof ConstantObjectInspector) {
+                               Object value = ((ConstantObjectInspector) 
arg).getWritableConstantValue();
+
+                               if (value != null) {
+                                       String strValue = value.toString();
+
+                                       if (strValue != null && 
strValue.length() > 0) {
+                                               ret = 
Integer.parseInt(value.toString());
+                                       }
+                               }
                        }
                }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskFirstN.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskFirstN.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskFirstN.java
index f6ece4d..0c2605f 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskFirstN.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskFirstN.java
@@ -43,27 +43,34 @@ class MaskFirstNTransformer extends MaskTransformer {
 
     @Override
     String transform(String value) {
-        return maskString(value, maskedUpperChar, maskedLowerChar, 
maskedDigitChar, maskedOtherChar, 0, charCount);
+        return maskString(value, 0, charCount);
+    }
+
+    @Override
+    Byte transform(Byte value) {
+        String strValue = value.toString();
+
+        return toByte(Long.parseLong(maskNumber(strValue, 0, charCount)));
     }
 
     @Override
     Short transform(Short value) {
         String strValue = value.toString();
 
-        return Short.parseShort(maskNumber(strValue, maskedDigitChar, 0, 
charCount));
+        return toShort(Long.parseLong(maskNumber(strValue, 0, charCount)));
     }
 
     @Override
     Integer transform(Integer value) {
         String strValue = value.toString();
 
-        return Integer.parseInt(maskNumber(strValue, maskedDigitChar, 0, 
charCount));
+        return toInteger(Long.parseLong(maskNumber(strValue, 0, charCount)));
     }
 
     @Override
     Long transform(Long value) {
         String strValue = value.toString();
 
-        return Long.parseLong(maskNumber(strValue, maskedDigitChar, 0, 
charCount));
+        return Long.parseLong(maskNumber(strValue, 0, charCount));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskHash.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskHash.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskHash.java
index 5afc66b..4152949 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskHash.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskHash.java
@@ -41,6 +41,11 @@ class MaskHashTransformer extends 
RangerBaseUdf.RangerTransformer {
     }
 
     @Override
+    Byte transform(Byte value) {
+        return value;
+    }
+
+    @Override
     Short transform(Short value) {
         return value;
     }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskLastN.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskLastN.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskLastN.java
index 1ea433d..97b24e4 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskLastN.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskLastN.java
@@ -18,6 +18,7 @@
 
 package org.apache.ranger.authorization.hive.udf;
 
+import org.apache.hadoop.hive.ql.udf.generic.*;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 
 
@@ -43,27 +44,34 @@ class MaskLastNTransformer extends MaskTransformer {
 
     @Override
     String transform(String value) {
-        return maskString(value, maskedUpperChar, maskedLowerChar, 
maskedDigitChar, maskedOtherChar, value.length() - charCount, value.length());
+        return maskString(value, value.length() - charCount, value.length());
+    }
+
+    @Override
+    Byte transform(Byte value) {
+        String strValue = value.toString();
+
+        return toByte(Long.parseLong(maskNumber(strValue, strValue.length() - 
charCount, strValue.length())));
     }
 
     @Override
     Short transform(Short value) {
         String strValue = value.toString();
 
-        return Short.parseShort(maskNumber(strValue, maskedDigitChar, 
strValue.length() - charCount, strValue.length()));
+        return toShort(Long.parseLong(maskNumber(strValue, strValue.length() - 
charCount, strValue.length())));
     }
 
     @Override
     Integer transform(Integer value) {
         String strValue = value.toString();
 
-        return Integer.parseInt(maskNumber(strValue, maskedDigitChar, 
strValue.length() - charCount, strValue.length()));
+        return toInteger(Long.parseLong(maskNumber(strValue, strValue.length() 
- charCount, strValue.length())));
     }
 
     @Override
     Long transform(Long value) {
         String strValue = value.toString();
 
-        return Long.parseLong(maskNumber(strValue, maskedDigitChar, 
strValue.length() - charCount, strValue.length()));
+        return Long.parseLong(maskNumber(strValue, strValue.length() - 
charCount, strValue.length()));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowFirstN.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowFirstN.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowFirstN.java
index a7ce40f..06a902c 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowFirstN.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowFirstN.java
@@ -43,27 +43,34 @@ class MaskShowFirstNTransformer extends MaskTransformer {
 
     @Override
     String transform(String value) {
-        return maskString(value, maskedUpperChar, maskedLowerChar, 
maskedDigitChar, maskedOtherChar, charCount, value.length());
+        return maskString(value, charCount, value.length());
+    }
+
+    @Override
+    Byte transform(Byte value) {
+        String strValue = value.toString();
+
+        return toByte(Long.parseLong(maskNumber(strValue, charCount, 
strValue.length())));
     }
 
     @Override
     Short transform(Short value) {
         String strValue = value.toString();
 
-        return Short.parseShort(maskNumber(strValue, maskedDigitChar, 
charCount, strValue.length()));
+        return toShort(Long.parseLong(maskNumber(strValue, charCount, 
strValue.length())));
     }
 
     @Override
     Integer transform(Integer value) {
         String strValue = value.toString();
 
-        return Integer.parseInt(maskNumber(strValue, maskedDigitChar, 
charCount, strValue.length()));
+        return toInteger(Long.parseLong(maskNumber(strValue, charCount, 
strValue.length())));
     }
 
     @Override
     Long transform(Long value) {
         String strValue = value.toString();
 
-        return Long.parseLong(maskNumber(strValue, maskedDigitChar, charCount, 
strValue.length()));
+        return Long.parseLong(maskNumber(strValue, charCount, 
strValue.length()));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a3a472d9/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowLastN.java
----------------------------------------------------------------------
diff --git 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowLastN.java
 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowLastN.java
index 3abe636..be72097 100644
--- 
a/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowLastN.java
+++ 
b/ranger-hive-utils/src/main/java/org/apache/ranger/authorization/hive/udf/RangerUdfMaskShowLastN.java
@@ -28,7 +28,7 @@ public class RangerUdfMaskShowLastN extends RangerBaseUdf {
 }
 
 class MaskShowLastNTransformer extends MaskTransformer {
-    int charCount;
+    int charCount = 4;
 
     public MaskShowLastNTransformer() {
         super();
@@ -43,27 +43,34 @@ class MaskShowLastNTransformer extends MaskTransformer {
 
     @Override
     String transform(String value) {
-        return maskString(value, maskedUpperChar, maskedLowerChar, 
maskedDigitChar, maskedOtherChar, 0, value.length() - charCount);
+        return maskString(value, 0, value.length() - charCount);
+    }
+
+    @Override
+    Byte transform(Byte value) {
+        String strValue = value.toString();
+
+        return toByte(Long.parseLong(maskNumber(strValue, 0, strValue.length() 
- charCount)));
     }
 
     @Override
     Short transform(Short value) {
         String strValue = value.toString();
 
-        return Short.parseShort(maskNumber(strValue, maskedDigitChar, 0, 
strValue.length() - charCount));
+        return toShort(Long.parseLong(maskNumber(strValue, 0, 
strValue.length() - charCount)));
     }
 
     @Override
     Integer transform(Integer value) {
         String strValue = value.toString();
 
-        return Integer.parseInt(maskNumber(strValue, maskedDigitChar, 0, 
strValue.length() - charCount));
+        return toInteger(Long.parseLong(maskNumber(strValue, 0, 
strValue.length() - charCount)));
     }
 
     @Override
     Long transform(Long value) {
         String strValue = value.toString();
 
-        return Long.parseLong(maskNumber(strValue, maskedDigitChar, 0, 
strValue.length() - charCount));
+        return Long.parseLong(maskNumber(strValue, 0, strValue.length() - 
charCount));
     }
 }

Reply via email to