http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b671b3/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
index 104cb5b..e601af7 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
@@ -40,7 +40,9 @@ import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants.OperationStatusCode;
 import org.apache.hadoop.hbase.Tag;
+import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.TagType;
+import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
@@ -58,6 +60,7 @@ import 
org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode;
 import 
org.apache.hadoop.hbase.security.visibility.expression.LeafExpressionNode;
 import 
org.apache.hadoop.hbase.security.visibility.expression.NonLeafExpressionNode;
 import org.apache.hadoop.hbase.security.visibility.expression.Operator;
+import org.apache.hadoop.hbase.util.ByteBufferUtils;
 import org.apache.hadoop.hbase.util.Bytes;
 
 /**
@@ -73,7 +76,7 @@ public class ExpAsStringVisibilityLabelServiceImpl implements 
VisibilityLabelSer
 
   private static final byte[] DUMMY_VALUE = new byte[0];
   private static final byte STRING_SERIALIZATION_FORMAT = 2;
-  private static final Tag STRING_SERIALIZATION_FORMAT_TAG = new Tag(
+  private static final Tag STRING_SERIALIZATION_FORMAT_TAG = new 
ArrayBackedTag(
       TagType.VISIBILITY_EXP_SERIALIZATION_FORMAT_TAG_TYPE,
       new byte[] { STRING_SERIALIZATION_FORMAT });
   private final ExpressionParser expressionParser = new ExpressionParser();
@@ -281,28 +284,27 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
         boolean visibilityTagPresent = false;
         // Save an object allocation where we can
         if (cell.getTagsLength() > 0) {
-          Iterator<Tag> tagsItr = CellUtil.tagsIterator(cell.getTagsArray(), 
cell.getTagsOffset(),
-              cell.getTagsLength());
+          Iterator<Tag> tagsItr = CellUtil.tagsIterator(cell);
           while (tagsItr.hasNext()) {
             boolean includeKV = true;
             Tag tag = tagsItr.next();
             if (tag.getType() == VISIBILITY_TAG_TYPE) {
               visibilityTagPresent = true;
-              int offset = tag.getTagOffset();
-              int endOffset = offset + tag.getTagLength();
+              int offset = tag.getValueOffset();
+              int endOffset = offset + tag.getValueLength();
               while (offset < endOffset) {
-                short len = Bytes.toShort(tag.getBuffer(), offset);
+                short len = getTagValuePartAsShort(tag, offset);
                 offset += 2;
                 if (len < 0) {
                   // This is a NOT label.
                   len = (short) (-1 * len);
-                  String label = Bytes.toString(tag.getBuffer(), offset, len);
+                  String label = Bytes.toString(tag.getValueArray(), offset, 
len);
                   if (authLabelsFinal.contains(label)) {
                     includeKV = false;
                     break;
                   }
                 } else {
-                  String label = Bytes.toString(tag.getBuffer(), offset, len);
+                  String label = Bytes.toString(tag.getValueArray(), offset, 
len);
                   if (!authLabelsFinal.contains(label)) {
                     includeKV = false;
                     break;
@@ -353,7 +355,7 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
       dos.writeShort(bLabel.length);
       dos.write(bLabel);
     }
-    return new Tag(VISIBILITY_TAG_TYPE, baos.toByteArray());
+    return new ArrayBackedTag(VISIBILITY_TAG_TYPE, baos.toByteArray());
   }
 
   private void extractLabels(ExpressionNode node, List<String> labels, 
List<String> notLabels) {
@@ -423,8 +425,7 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
       for (Tag tag : deleteVisTags) {
         matchFound = false;
         for (Tag givenTag : putVisTags) {
-          if (Bytes.equals(tag.getBuffer(), tag.getTagOffset(), 
tag.getTagLength(),
-              givenTag.getBuffer(), givenTag.getTagOffset(), 
givenTag.getTagLength())) {
+          if (TagUtil.matchingValue(tag, givenTag)) {
             matchFound = true;
             break;
           }
@@ -459,15 +460,15 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
           visibilityString.append(VisibilityConstants.CLOSED_PARAN
               + VisibilityConstants.OR_OPERATOR);
         }
-        int offset = tag.getTagOffset();
-        int endOffset = offset + tag.getTagLength();
+        int offset = tag.getValueOffset();
+        int endOffset = offset + tag.getValueLength();
         boolean expressionStart = true;
         while (offset < endOffset) {
-          short len = Bytes.toShort(tag.getBuffer(), offset);
+          short len = getTagValuePartAsShort(tag, offset);
           offset += 2;
           if (len < 0) {
             len = (short) (-1 * len);
-            String label = Bytes.toString(tag.getBuffer(), offset, len);
+            String label = getTagValuePartAsString(tag, offset, len);
             if (expressionStart) {
               visibilityString.append(VisibilityConstants.OPEN_PARAN
                   + VisibilityConstants.NOT_OPERATOR + 
CellVisibility.quote(label));
@@ -476,7 +477,7 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
                   + VisibilityConstants.NOT_OPERATOR + 
CellVisibility.quote(label));
             }
           } else {
-            String label = Bytes.toString(tag.getBuffer(), offset, len);
+            String label = getTagValuePartAsString(tag, offset, len);
             if (expressionStart) {
               visibilityString.append(VisibilityConstants.OPEN_PARAN + 
CellVisibility.quote(label));
             } else {
@@ -496,4 +497,20 @@ public class ExpAsStringVisibilityLabelServiceImpl 
implements VisibilityLabelSer
     }
     return null;
   }
+
+  private static short getTagValuePartAsShort(Tag t, int offset) {
+    if (t.hasArray()) {
+      return Bytes.toShort(t.getValueArray(), offset);
+    }
+    return ByteBufferUtils.toShort(t.getValueByteBuffer(), offset);
+  }
+
+  private static String getTagValuePartAsString(Tag t, int offset, int length) 
{
+    if (t.hasArray()) {
+      return Bytes.toString(t.getValueArray(), offset, length);
+    }
+    byte[] b = new byte[length];
+    ByteBufferUtils.copyFromBufferToArray(b, t.getValueByteBuffer(), offset, 
0, length);
+    return Bytes.toString(b);
+  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b671b3/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelReplicationWithExpAsString.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelReplicationWithExpAsString.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelReplicationWithExpAsString.java
index fecff07..2140a5c 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelReplicationWithExpAsString.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelReplicationWithExpAsString.java
@@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.Tag;
+import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
@@ -183,7 +184,7 @@ public class TestVisibilityLabelReplicationWithExpAsString 
extends TestVisibilit
           boolean foundNonVisTag = false;
           for(Tag t : TestCoprocessorForTagsAtSink.tags) {
             if(t.getType() == NON_VIS_TAG_TYPE) {
-              assertEquals(TEMP, Bytes.toString(t.getValue()));
+              assertEquals(TEMP, Bytes.toString(TagUtil.cloneValue(t)));
               foundNonVisTag = true;
               break;
             }

http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b671b3/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
index 8414813..b3b3b43 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java
@@ -43,8 +43,10 @@ import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.Tag;
+import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.TagRewriteCell;
 import org.apache.hadoop.hbase.TagType;
+import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
@@ -284,11 +286,11 @@ public class TestVisibilityLabelsReplication {
     for (Cell cell : cells) {
       if ((Bytes.equals(cell.getRowArray(), cell.getRowOffset(), 
cell.getRowLength(), row, 0,
           row.length))) {
-        List<Tag> tags = Tag
-            .asList(cell.getTagsArray(), cell.getTagsOffset(), 
cell.getTagsLength());
+        List<Tag> tags = TagUtil.asList(cell.getTagsArray(), 
cell.getTagsOffset(),
+            cell.getTagsLength());
         for (Tag tag : tags) {
           if (tag.getType() == TagType.STRING_VIS_TAG_TYPE) {
-            assertEquals(visTag, Bytes.toString(tag.getValue()));
+            assertEquals(visTag, TagUtil.getValueAsString(tag));
             tagFound = true;
             break;
           }
@@ -330,7 +332,7 @@ public class TestVisibilityLabelsReplication {
           boolean foundNonVisTag = false;
           for (Tag t : TestCoprocessorForTagsAtSink.tags) {
             if (t.getType() == NON_VIS_TAG_TYPE) {
-              assertEquals(TEMP, Bytes.toString(t.getValue()));
+              assertEquals(TEMP, TagUtil.getValueAsString(t));
               foundNonVisTag = true;
               break;
             }
@@ -407,11 +409,11 @@ public class TestVisibilityLabelsReplication {
             if (cf == null) {
               cf = CellUtil.cloneFamily(kv);
             }
-            Tag tag = new Tag((byte) NON_VIS_TAG_TYPE, attribute);
+            Tag tag = new ArrayBackedTag((byte) NON_VIS_TAG_TYPE, attribute);
             List<Tag> tagList = new ArrayList<Tag>();
             tagList.add(tag);
             tagList.addAll(kv.getTags());
-            byte[] fromList = Tag.fromList(tagList);
+            byte[] fromList = TagUtil.fromList(tagList);
             TagRewriteCell newcell = new TagRewriteCell(kv, fromList);
             ((List<Cell>) updatedCells).add(newcell);
           }
@@ -433,7 +435,7 @@ public class TestVisibilityLabelsReplication {
         // Check tag presence in the 1st cell in 1st Result
         if (!results.isEmpty()) {
           Cell cell = results.get(0);
-          tags = Tag.asList(cell.getTagsArray(), cell.getTagsOffset(), 
cell.getTagsLength());
+          tags = TagUtil.asList(cell.getTagsArray(), cell.getTagsOffset(), 
cell.getTagsLength());
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b671b3/hbase-server/src/test/java/org/apache/hadoop/hbase/util/HFileTestUtil.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/HFileTestUtil.java 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/HFileTestUtil.java
index fdf4fd9..964d6ed 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/HFileTestUtil.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/HFileTestUtil.java
@@ -21,10 +21,13 @@ package org.apache.hadoop.hbase.util;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.Tag;
 import org.apache.hadoop.hbase.TagType;
+import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
@@ -98,14 +101,11 @@ public class HFileTestUtil {
         KeyValue kv = new KeyValue(key, family, qualifier, now, key);
         if (withTag) {
           // add a tag.  Arbitrarily chose mob tag since we have a helper 
already.
-          Tag tableNameTag = new Tag(TagType.MOB_TABLE_NAME_TAG_TYPE, key);
+          Tag tableNameTag = new 
ArrayBackedTag(TagType.MOB_TABLE_NAME_TAG_TYPE, key);
           kv = MobUtils.createMobRefKeyValue(kv, key, tableNameTag);
 
           // verify that the kv has the tag.
-          byte[] ta = kv.getTagsArray();
-          int toff = kv.getTagsOffset();
-          int tlen = kv.getTagsLength();
-          Tag t = Tag.getTag(ta, toff, tlen, TagType.MOB_TABLE_NAME_TAG_TYPE);
+          Tag t = CellUtil.getTag(kv, TagType.MOB_TABLE_NAME_TAG_TYPE);
           if (t == null) {
             throw new IllegalStateException("Tag didn't stick to KV " + 
kv.toString());
           }
@@ -130,15 +130,12 @@ public class HFileTestUtil {
     ResultScanner s = table.getScanner(new Scan());
     for (Result r : s) {
       for (Cell c : r.listCells()) {
-        byte[] ta = c.getTagsArray();
-        int toff = c.getTagsOffset();
-        int tlen = c.getTagsLength();
-        Tag t = Tag.getTag(ta, toff, tlen, TagType.MOB_TABLE_NAME_TAG_TYPE);
+        Tag t = CellUtil.getTag(c, TagType.MOB_TABLE_NAME_TAG_TYPE);
         if (t == null) {
           fail(c.toString() + " has null tag");
           continue;
         }
-        byte[] tval = t.getValue();
+        byte[] tval = TagUtil.cloneValue(t);
         assertArrayEquals(c.toString() + " has tag" + Bytes.toString(tval),
             r.getRow(), tval);
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/a9b671b3/hbase-server/src/test/java/org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java
index 70d6d9d..87cb070 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java
@@ -27,6 +27,7 @@ import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValue.Type;
 import org.apache.hadoop.hbase.Tag;
+import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.client.Mutation;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.util.MultiThreadedAction.DefaultDataGenerator;
@@ -77,7 +78,7 @@ public class LoadTestDataGeneratorWithTags extends 
DefaultDataGenerator {
             minTagLength + random.nextInt(maxTagLength - minTagLength));
         tags = new ArrayList<Tag>();
         for (int n = 0; n < numTags; n++) {
-          tags.add(new Tag((byte) 127, tag));
+          tags.add(new ArrayBackedTag((byte) 127, tag));
         }
         Cell updatedCell = new KeyValue(cell.getRowArray(), 
cell.getRowOffset(),
             cell.getRowLength(), cell.getFamilyArray(), cell.getFamilyOffset(),

Reply via email to