You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2020/01/16 14:48:09 UTC

[hbase-site] branch asf-site updated: Published site at 19d3bed1d472dbb6a529ab94d95c455604c68bd5.

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

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 1bc18b4  Published site at 19d3bed1d472dbb6a529ab94d95c455604c68bd5.
1bc18b4 is described below

commit 1bc18b403eda3c8cbf187f13823430e75c4a9f24
Author: jenkins <bu...@apache.org>
AuthorDate: Thu Jan 16 14:47:36 2020 +0000

    Published site at 19d3bed1d472dbb6a529ab94d95c455604c68bd5.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |   22 +-
 checkstyle.rss                                     |   16 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |    4 +-
 .../store/region/RegionProcedureStore.html         |   22 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |    4 +-
 .../store/region/RegionProcedureStore.html         |  437 ++---
 .../master/AssignmentManagerStatusTmplImpl.html    |   50 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html    |  342 ++--
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-tracking.html                                |    2 +-
 mail-lists.html                                    |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 project-summary.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 source-repository.html                             |    2 +-
 sponsors.html                                      |    2 +-
 supportingprojects.html                            |    2 +-
 team-list.html                                     |    2 +-
 testdevapidocs/allclasses-frame.html               |    1 +
 testdevapidocs/allclasses-noframe.html             |    1 +
 testdevapidocs/index-all.html                      |   64 +-
 ...formanceEvaluation.SeqShardedDataGenerator.html |    4 +-
 ...hAdaptivePolicy.html => TableNameTestRule.html} |   90 +-
 .../TestAcidGuaranteesWithAdaptivePolicy.html      |    4 +-
 .../apache/hadoop/hbase/TestTableName.Names.html   |   20 +-
 .../org/apache/hadoop/hbase/TestTableName.html     |  120 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../{TestTableName.html => TableNameTestRule.html} |   64 +-
 .../hbase/class-use/TestTableName.Names.html       |    2 +-
 .../hadoop/hbase/class-use/TestTableName.html      |  106 +-
 .../org/apache/hadoop/hbase/package-frame.html     |    1 +
 .../org/apache/hadoop/hbase/package-summary.html   |  210 +--
 .../org/apache/hadoop/hbase/package-tree.html      |   11 +-
 .../org/apache/hadoop/hbase/package-use.html       |   12 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../regionserver/TestScannerRetriableFailure.html  |   10 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    4 +-
 .../TestAccessController2.MyAccessController.html  |    4 +-
 .../security/access/TestAccessController2.html     |   98 +-
 .../access/TestCellACLWithMultipleVersions.html    |   94 +-
 .../hadoop/hbase/security/access/TestCellACLs.html |   70 +-
 .../security/access/TestScanEarlyTermination.html  |   52 +-
 .../access/TestWithDisabledAuthorization.html      |   84 +-
 .../hbase/snapshot/TestSnapshotClientRetries.html  |   14 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html    |   14 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 testdevapidocs/overview-tree.html                  |    3 +-
 .../org/apache/hadoop/hbase/TableNameTestRule.html |  110 ++
 .../apache/hadoop/hbase/TestTableName.Names.html   |  326 ++--
 .../org/apache/hadoop/hbase/TestTableName.html     |  326 ++--
 ...nnerRetriableFailure.FaultyScannerObserver.html |    6 +-
 .../regionserver/TestScannerRetriableFailure.html  |    6 +-
 .../TestAccessController2.MyAccessController.html  | 1013 +++++-----
 .../security/access/TestAccessController2.html     | 1013 +++++-----
 .../access/TestCellACLWithMultipleVersions.html    | 1913 ++++++++++---------
 .../hadoop/hbase/security/access/TestCellACLs.html |  864 +++++----
 .../security/access/TestScanEarlyTermination.html  |  521 +++---
 .../access/TestWithDisabledAuthorization.html      | 1928 ++++++++++----------
 ...stSnapshotClientRetries.MasterSyncObserver.html |   12 +-
 .../hbase/snapshot/TestSnapshotClientRetries.html  |   12 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html    |    4 +-
 81 files changed, 5034 insertions(+), 5144 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index b0e2ccb..7a37d6a 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -450,7 +450,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 2e257ec..fd20433 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20200115143954+00'00')
-/CreationDate (D:20200115143954+00'00')
+/ModDate (D:20200116144343+00'00')
+/CreationDate (D:20200116144343+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index 883fefe..9a52015 100644
--- a/book.html
+++ b/book.html
@@ -44282,7 +44282,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2020-01-15 14:30:09 UTC
+Last updated 2020-01-16 14:30:13 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 62683aa..b1f08e2 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -155,7 +155,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 3e661a6..b3c100d 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -149,7 +149,7 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>4139</td>
+<td>4140</td>
 <td>0</td>
 <td>0</td>
 <td>10916</td></tr></table></div>
@@ -73800,19 +73800,19 @@
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>299</td></tr>
+<td>298</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>325</td></tr>
+<td>324</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>529</td></tr></table></div>
+<td>528</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestCellACLWithMultipleVersions.java">org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.java</h3>
 <table border="0" class="table table-striped">
@@ -73827,7 +73827,7 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>765</td></tr></table></div>
+<td>764</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestCellACLs.java">org/apache/hadoop/hbase/security/access/TestCellACLs.java</h3>
 <table border="0" class="table table-striped">
@@ -73842,13 +73842,13 @@
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 221 lines (max allowed is 150).</td>
-<td>151</td></tr>
+<td>149</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>245</td></tr></table></div>
+<td>243</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.TestNamespaceCommands.java">org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java</h3>
 <table border="0" class="table table-striped">
@@ -73905,19 +73905,19 @@
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 165 lines (max allowed is 150).</td>
-<td>242</td></tr>
+<td>240</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 301 lines (max allowed is 150).</td>
-<td>468</td></tr>
+<td>466</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>971</td></tr></table></div>
+<td>969</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.java">org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java</h3>
 <table border="0" class="table table-striped">
@@ -86925,7 +86925,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index 184cc89..39850af 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,7 +25,7 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2020 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 4139,
+      <title>File: 4140,
              Errors: 10916,
              Warnings: 0,
              Infos: 0
@@ -35564,6 +35564,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="https://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.TableNameTestRule.java">org/apache/hadoop/hbase/TableNameTestRule.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="https://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.TestNamespace.java">org/apache/hadoop/hbase/TestNamespace.java</a>
                 </td>
                 <td>
diff --git a/coc.html b/coc.html
index fdeb91a..84c5483 100644
--- a/coc.html
+++ b/coc.html
@@ -224,7 +224,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index d04229d..eebab4e 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -296,7 +296,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 9e1b35f..dfaef37 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -541,7 +541,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index 2f2c735..64ae187 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -177,7 +177,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index beb489b..dd99924 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -905,7 +905,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index cc550c0..13025fd 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -4102,14 +4102,14 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Wed Jan 15 14:36:08 UTC 2020"</code></td>
+<td class="colLast"><code>"Thu Jan 16 14:38:26 UTC 2020"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"cb78b103a7a24ea49e6bc7716d31a9e8bf15ea3a"</code></td>
+<td class="colLast"><code>"19d3bed1d472dbb6a529ab94d95c455604c68bd5"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
index 5406d55..a858b95 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
@@ -833,7 +833,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>recoverLease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.371">recoverLease</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.372">recoverLease</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#recoverLease--">ProcedureStore</a></code></span></div>
 <div class="block">Acquire the lease for the procedure store.</div>
@@ -849,7 +849,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.406">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.407">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#load-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader-">ProcedureStore</a></code></span></div>
 <div class="block">Load the Procedures in the store.</div>
@@ -867,7 +867,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>serializePut</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.435">serializePut</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.436">serializePut</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt;&nbsp;rowsToLock)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -883,7 +883,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeDelete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.445">serializeDelete</a>(long&nbsp;procId,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.446">serializeDelete</a>(long&nbsp;procId,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;mutations,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt;&nbsp;rowsToLock)</pre>
 </li>
@@ -894,7 +894,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.452">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.453">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                    <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;subProcs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">When a procedure is submitted to the executor insert(proc, null) will be called.
@@ -916,7 +916,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.475">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.476">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">Serialize a set of new procedures.
  These procedures are freshly submitted to the executor and each procedure
@@ -933,7 +933,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.491">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.492">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#update-org.apache.hadoop.hbase.procedure2.Procedure-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procedure was executed,
  and the new state should be written to the store.</div>
@@ -949,7 +949,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.504">delete</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.505">delete</a>(long&nbsp;procId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procId was removed from the executor,
  due to completion, abort or failure.
@@ -966,7 +966,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.516">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;parentProc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.517">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;parentProc,
                    long[]&nbsp;subProcIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-org.apache.hadoop.hbase.procedure2.Procedure-long:A-">ProcedureStore</a></code></span></div>
 <div class="block">The parent procedure completed.
@@ -984,7 +984,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.534">delete</a>(long[]&nbsp;procIds,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.535">delete</a>(long[]&nbsp;procIds,
                    int&nbsp;offset,
                    int&nbsp;count)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long:A-int-int-">ProcedureStore</a></code></span></div>
@@ -1005,7 +1005,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cleanup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.558">cleanup</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html#line.559">cleanup</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#cleanup--">ProcedureStore</a></code></span></div>
 <div class="block">Will be called by the framework to give the store a chance to do some clean up works.
  <p/>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 926ad36..ef563fe 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  justification="Intentional; to be modified in test")<a name="line.10"></a>
 <span class="sourceLineNo">011</span>public class Version {<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String version = new String("3.0.0-SNAPSHOT");<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String revision = "cb78b103a7a24ea49e6bc7716d31a9e8bf15ea3a";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String revision = "19d3bed1d472dbb6a529ab94d95c455604c68bd5";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String user = "jenkins";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String date = "Wed Jan 15 14:36:08 UTC 2020";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String date = "Thu Jan 16 14:38:26 UTC 2020";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.16"></a>
 <span class="sourceLineNo">017</span>  public static final String srcChecksum = "(stdin)=";<a name="line.17"></a>
 <span class="sourceLineNo">018</span>}<a name="line.18"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
index 5f081d3..2fda483 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/region/RegionProcedureStore.html
@@ -372,224 +372,225 @@
 <span class="sourceLineNo">364</span>      throw new IOException("Failed to delete the WALProcedureStore migrated proc wal directory " +<a name="line.364"></a>
 <span class="sourceLineNo">365</span>        procWALDir);<a name="line.365"></a>
 <span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    LOG.info("Migration of WALProcedureStore finished");<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Override<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void recoverLease() throws IOException {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    LOG.debug("Starting Region Procedure Store lease recovery...");<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    Configuration baseConf = server.getConfiguration();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    FileSystem fs = CommonFSUtils.getWALFileSystem(baseConf);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    Path globalWALRootDir = CommonFSUtils.getWALRootDir(baseConf);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    Path rootDir = new Path(globalWALRootDir, MASTER_PROCEDURE_DIR);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    // we will override some configurations so create a new one.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    Configuration conf = new Configuration(baseConf);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    CommonFSUtils.setRootDir(conf, rootDir);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    CommonFSUtils.setWALRootDir(conf, rootDir);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    RegionFlusherAndCompactor.setupConf(conf);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    conf.setInt(AbstractFSWAL.MAX_LOGS, conf.getInt(MAX_WALS_KEY, DEFAULT_MAX_WALS));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    if (conf.get(USE_HSYNC_KEY) != null) {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      conf.set(HRegion.WAL_HSYNC_CONF_KEY, conf.get(USE_HSYNC_KEY));<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    conf.setInt(AbstractFSWAL.RING_BUFFER_SLOT_COUNT, IntMath.ceilingPowerOfTwo(16 * numThreads));<a name="line.386"></a>
-<span class="sourceLineNo">387</span><a name="line.387"></a>
-<span class="sourceLineNo">388</span>    walRoller = RegionProcedureStoreWALRoller.create(conf, server, fs, rootDir, globalWALRootDir);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    walRoller.start();<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    walFactory = new WALFactory(conf, server.getServerName().toString(), false);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Path tableDir = CommonFSUtils.getTableDir(rootDir, TABLE_NAME);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    if (fs.exists(tableDir)) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      // load the existing region.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      region = open(conf, fs, rootDir);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    } else {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      // bootstrapping...<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      region = bootstrap(conf, fs, rootDir);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    flusherAndCompactor = new RegionFlusherAndCompactor(conf, server, region);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    walRoller.setFlusherAndCompactor(flusherAndCompactor);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    tryMigrate(fs);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    List&lt;ProcedureProtos.Procedure&gt; procs = new ArrayList&lt;&gt;();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    long maxProcId = 0;<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>    try (RegionScanner scanner = region.getScanner(new Scan().addColumn(FAMILY, PROC_QUALIFIER))) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      boolean moreRows;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      do {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        moreRows = scanner.next(cells);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        if (cells.isEmpty()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>          continue;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        Cell cell = cells.get(0);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        cells.clear();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        maxProcId = Math.max(maxProcId,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          Bytes.toLong(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        if (cell.getValueLength() &gt; 0) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          ProcedureProtos.Procedure proto = ProcedureProtos.Procedure.parser()<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            .parseFrom(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          procs.add(proto);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      } while (moreRows);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    loader.setMaxProcId(maxProcId);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    ProcedureTree tree = ProcedureTree.build(procs);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    loader.load(tree.getValidProcs());<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    loader.handleCorrupted(tree.getCorruptedProcs());<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private void serializePut(Procedure&lt;?&gt; proc, List&lt;Mutation&gt; mutations, List&lt;byte[]&gt; rowsToLock)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    throws IOException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    ProcedureProtos.Procedure proto = ProcedureUtil.convertToProtoProcedure(proc);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    byte[] row = Bytes.toBytes(proc.getProcId());<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    mutations.add(new Put(row).addColumn(FAMILY, PROC_QUALIFIER, proto.toByteArray()));<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    rowsToLock.add(row);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  // As we need to keep the max procedure id, here we can not simply delete the procedure, just fill<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  // the proc column with an empty array.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  private void serializeDelete(long procId, List&lt;Mutation&gt; mutations, List&lt;byte[]&gt; rowsToLock) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] row = Bytes.toBytes(procId);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    mutations.add(new Put(row).addColumn(FAMILY, PROC_QUALIFIER, EMPTY_BYTE_ARRAY));<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    rowsToLock.add(row);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>  public void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subProcs) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    if (subProcs == null || subProcs.length == 0) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      // same with update, just insert a single procedure<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      update(proc);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      return;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(subProcs.length + 1);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(subProcs.length + 1);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    try {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      serializePut(proc, mutations, rowsToLock);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      for (Procedure&lt;?&gt; subProc : subProcs) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        serializePut(subProc, mutations, rowsToLock);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    } catch (IOException e) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      LOG.error(HBaseMarkers.FATAL, "Failed to insert proc {}, sub procs {}", proc,<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        Arrays.toString(subProcs), e);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      throw new UncheckedIOException(e);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    flusherAndCompactor.onUpdate();<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void insert(Procedure&lt;?&gt;[] procs) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(procs.length);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(procs.length);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    try {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      for (Procedure&lt;?&gt; proc : procs) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        serializePut(proc, mutations, rowsToLock);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    } catch (IOException e) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      LOG.error(HBaseMarkers.FATAL, "Failed to insert procs {}", Arrays.toString(procs), e);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      throw new UncheckedIOException(e);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    flusherAndCompactor.onUpdate();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>  }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>  @Override<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public void update(Procedure&lt;?&gt; proc) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      ProcedureProtos.Procedure proto = ProcedureUtil.convertToProtoProcedure(proc);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      region.put(new Put(Bytes.toBytes(proc.getProcId())).addColumn(FAMILY, PROC_QUALIFIER,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        proto.toByteArray()));<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    } catch (IOException e) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      LOG.error(HBaseMarkers.FATAL, "Failed to update proc {}", proc, e);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throw new UncheckedIOException(e);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    flusherAndCompactor.onUpdate();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  public void delete(long procId) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      region<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        .put(new Put(Bytes.toBytes(procId)).addColumn(FAMILY, PROC_QUALIFIER, EMPTY_BYTE_ARRAY));<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete pid={}", procId, e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      throw new UncheckedIOException(e);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    flusherAndCompactor.onUpdate();<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>  @Override<a name="line.515"></a>
-<span class="sourceLineNo">516</span>  public void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(subProcIds.length + 1);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(subProcIds.length + 1);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    try {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      serializePut(parentProc, mutations, rowsToLock);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      for (long subProcId : subProcIds) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        serializeDelete(subProcId, mutations, rowsToLock);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    } catch (IOException e) {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete parent proc {}, sub pids={}", parentProc,<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        Arrays.toString(subProcIds), e);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      throw new UncheckedIOException(e);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    flusherAndCompactor.onUpdate();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>  @Override<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public void delete(long[] procIds, int offset, int count) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    if (count == 0) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    if (count == 1) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      delete(procIds[offset]);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      return;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(count);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(count);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    for (int i = 0; i &lt; count; i++) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      long procId = procIds[offset + i];<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      serializeDelete(procId, mutations, rowsToLock);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    try {<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    } catch (IOException e) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete pids={}", Arrays.toString(procIds), e);<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      throw new UncheckedIOException(e);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    flusherAndCompactor.onUpdate();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  @Override<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  public void cleanup() {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    // actually delete the procedures if it is not the one with the max procedure id.<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    try (RegionScanner scanner =<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      region.getScanner(new Scan().addColumn(FAMILY, PROC_QUALIFIER).setReversed(true))) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      // skip the row with max procedure id<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      boolean moreRows = scanner.next(cells);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (cells.isEmpty()) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        return;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      cells.clear();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      while (moreRows) {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>        moreRows = scanner.next(cells);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>        if (cells.isEmpty()) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          continue;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        }<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        Cell cell = cells.get(0);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        cells.clear();<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        if (cell.getValueLength() == 0) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.delete(new Delete(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        }<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    } catch (IOException e) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      LOG.warn("Failed to clean up delete procedures", e);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>  }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>}<a name="line.584"></a>
+<span class="sourceLineNo">367</span>    store.stop(true);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    LOG.info("Migration of WALProcedureStore finished");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Override<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void recoverLease() throws IOException {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    LOG.debug("Starting Region Procedure Store lease recovery...");<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    Configuration baseConf = server.getConfiguration();<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    FileSystem fs = CommonFSUtils.getWALFileSystem(baseConf);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    Path globalWALRootDir = CommonFSUtils.getWALRootDir(baseConf);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Path rootDir = new Path(globalWALRootDir, MASTER_PROCEDURE_DIR);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    // we will override some configurations so create a new one.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    Configuration conf = new Configuration(baseConf);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    CommonFSUtils.setRootDir(conf, rootDir);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    CommonFSUtils.setWALRootDir(conf, rootDir);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    RegionFlusherAndCompactor.setupConf(conf);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    conf.setInt(AbstractFSWAL.MAX_LOGS, conf.getInt(MAX_WALS_KEY, DEFAULT_MAX_WALS));<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    if (conf.get(USE_HSYNC_KEY) != null) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      conf.set(HRegion.WAL_HSYNC_CONF_KEY, conf.get(USE_HSYNC_KEY));<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    conf.setInt(AbstractFSWAL.RING_BUFFER_SLOT_COUNT, IntMath.ceilingPowerOfTwo(16 * numThreads));<a name="line.387"></a>
+<span class="sourceLineNo">388</span><a name="line.388"></a>
+<span class="sourceLineNo">389</span>    walRoller = RegionProcedureStoreWALRoller.create(conf, server, fs, rootDir, globalWALRootDir);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    walRoller.start();<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>    walFactory = new WALFactory(conf, server.getServerName().toString(), false);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Path tableDir = CommonFSUtils.getTableDir(rootDir, TABLE_NAME);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    if (fs.exists(tableDir)) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      // load the existing region.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      region = open(conf, fs, rootDir);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    } else {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      // bootstrapping...<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      region = bootstrap(conf, fs, rootDir);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    flusherAndCompactor = new RegionFlusherAndCompactor(conf, server, region);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    walRoller.setFlusherAndCompactor(flusherAndCompactor);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    tryMigrate(fs);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  @Override<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    List&lt;ProcedureProtos.Procedure&gt; procs = new ArrayList&lt;&gt;();<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    long maxProcId = 0;<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    try (RegionScanner scanner = region.getScanner(new Scan().addColumn(FAMILY, PROC_QUALIFIER))) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      boolean moreRows;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      do {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        moreRows = scanner.next(cells);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        if (cells.isEmpty()) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          continue;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        Cell cell = cells.get(0);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        cells.clear();<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        maxProcId = Math.max(maxProcId,<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          Bytes.toLong(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if (cell.getValueLength() &gt; 0) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          ProcedureProtos.Procedure proto = ProcedureProtos.Procedure.parser()<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            .parseFrom(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          procs.add(proto);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        }<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      } while (moreRows);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    loader.setMaxProcId(maxProcId);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    ProcedureTree tree = ProcedureTree.build(procs);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    loader.load(tree.getValidProcs());<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    loader.handleCorrupted(tree.getCorruptedProcs());<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private void serializePut(Procedure&lt;?&gt; proc, List&lt;Mutation&gt; mutations, List&lt;byte[]&gt; rowsToLock)<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    throws IOException {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    ProcedureProtos.Procedure proto = ProcedureUtil.convertToProtoProcedure(proc);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    byte[] row = Bytes.toBytes(proc.getProcId());<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    mutations.add(new Put(row).addColumn(FAMILY, PROC_QUALIFIER, proto.toByteArray()));<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    rowsToLock.add(row);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  // As we need to keep the max procedure id, here we can not simply delete the procedure, just fill<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  // the proc column with an empty array.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private void serializeDelete(long procId, List&lt;Mutation&gt; mutations, List&lt;byte[]&gt; rowsToLock) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] row = Bytes.toBytes(procId);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    mutations.add(new Put(row).addColumn(FAMILY, PROC_QUALIFIER, EMPTY_BYTE_ARRAY));<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    rowsToLock.add(row);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  }<a name="line.450"></a>
+<span class="sourceLineNo">451</span><a name="line.451"></a>
+<span class="sourceLineNo">452</span>  @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  public void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subProcs) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    if (subProcs == null || subProcs.length == 0) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      // same with update, just insert a single procedure<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      update(proc);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      return;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    }<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(subProcs.length + 1);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(subProcs.length + 1);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      serializePut(proc, mutations, rowsToLock);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      for (Procedure&lt;?&gt; subProc : subProcs) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>        serializePut(subProc, mutations, rowsToLock);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    } catch (IOException e) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      LOG.error(HBaseMarkers.FATAL, "Failed to insert proc {}, sub procs {}", proc,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        Arrays.toString(subProcs), e);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      throw new UncheckedIOException(e);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    flusherAndCompactor.onUpdate();<a name="line.472"></a>
+<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>  @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void insert(Procedure&lt;?&gt;[] procs) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(procs.length);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(procs.length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      for (Procedure&lt;?&gt; proc : procs) {<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        serializePut(proc, mutations, rowsToLock);<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      }<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    } catch (IOException e) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      LOG.error(HBaseMarkers.FATAL, "Failed to insert procs {}", Arrays.toString(procs), e);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      throw new UncheckedIOException(e);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    flusherAndCompactor.onUpdate();<a name="line.488"></a>
+<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  public void update(Procedure&lt;?&gt; proc) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      ProcedureProtos.Procedure proto = ProcedureUtil.convertToProtoProcedure(proc);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      region.put(new Put(Bytes.toBytes(proc.getProcId())).addColumn(FAMILY, PROC_QUALIFIER,<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        proto.toByteArray()));<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    } catch (IOException e) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      LOG.error(HBaseMarkers.FATAL, "Failed to update proc {}", proc, e);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      throw new UncheckedIOException(e);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    flusherAndCompactor.onUpdate();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>  }<a name="line.502"></a>
+<span class="sourceLineNo">503</span><a name="line.503"></a>
+<span class="sourceLineNo">504</span>  @Override<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  public void delete(long procId) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      region<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        .put(new Put(Bytes.toBytes(procId)).addColumn(FAMILY, PROC_QUALIFIER, EMPTY_BYTE_ARRAY));<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    } catch (IOException e) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete pid={}", procId, e);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      throw new UncheckedIOException(e);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    flusherAndCompactor.onUpdate();<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  }<a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>  @Override<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  public void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(subProcIds.length + 1);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(subProcIds.length + 1);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    try {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      serializePut(parentProc, mutations, rowsToLock);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      for (long subProcId : subProcIds) {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>        serializeDelete(subProcId, mutations, rowsToLock);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    } catch (IOException e) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete parent proc {}, sub pids={}", parentProc,<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        Arrays.toString(subProcIds), e);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      throw new UncheckedIOException(e);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    flusherAndCompactor.onUpdate();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>  @Override<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  public void delete(long[] procIds, int offset, int count) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    if (count == 0) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    if (count == 1) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      delete(procIds[offset]);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      return;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    List&lt;Mutation&gt; mutations = new ArrayList&lt;&gt;(count);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    List&lt;byte[]&gt; rowsToLock = new ArrayList&lt;&gt;(count);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    for (int i = 0; i &lt; count; i++) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      long procId = procIds[offset + i];<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      serializeDelete(procId, mutations, rowsToLock);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    try {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      region.mutateRowsWithLocks(mutations, rowsToLock, NO_NONCE, NO_NONCE);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    } catch (IOException e) {<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      LOG.error(HBaseMarkers.FATAL, "Failed to delete pids={}", Arrays.toString(procIds), e);<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      throw new UncheckedIOException(e);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    }<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    flusherAndCompactor.onUpdate();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>  @Override<a name="line.558"></a>
+<span class="sourceLineNo">559</span>  public void cleanup() {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    // actually delete the procedures if it is not the one with the max procedure id.<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    try (RegionScanner scanner =<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      region.getScanner(new Scan().addColumn(FAMILY, PROC_QUALIFIER).setReversed(true))) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      // skip the row with max procedure id<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      boolean moreRows = scanner.next(cells);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      if (cells.isEmpty()) {<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        return;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      }<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      cells.clear();<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      while (moreRows) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        moreRows = scanner.next(cells);<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        if (cells.isEmpty()) {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          continue;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        }<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        Cell cell = cells.get(0);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>        cells.clear();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>        if (cell.getValueLength() == 0) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.delete(new Delete(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength()));<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        }<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      }<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    } catch (IOException e) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      LOG.warn("Failed to clean up delete procedures", e);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>}<a name="line.585"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmplImpl.html
index f8df4e5..8e6e177 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmplImpl.html
@@ -237,44 +237,18 @@
 <span class="sourceLineNo">229</span>        jamonWriter.write("\n                   &lt;/table&gt;\n             &lt;/div&gt;\n         ");<a name="line.229"></a>
 <span class="sourceLineNo">230</span>      }<a name="line.230"></a>
 <span class="sourceLineNo">231</span>      // 120, 16<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      jamonWriter.write("\n         &lt;/div&gt;\n         &lt;nav&gt;\n             &lt;ul class=\"nav nav-pills pagination\"&gt;\n             ");<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 124, 14<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      for (int i = 1 ; i &lt;= numOfPages; i++ )<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        // 124, 55<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        jamonWriter.write("\n                 ");<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        // 125, 18<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        if (i == 1 )<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>          // 125, 32<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          jamonWriter.write("\n                 &lt;li class=\"active\"&gt;\n                 ");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        // 127, 18<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        else<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          // 127, 25<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          jamonWriter.write("\n                 &lt;li&gt;\n                 ");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        // 129, 24<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        jamonWriter.write("\n                 &lt;a href=\"#tab_rits");<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        // 130, 36<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(i), jamonWriter);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // 130, 43<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        jamonWriter.write("\"&gt;");<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        // 130, 45<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(i), jamonWriter);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // 130, 52<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        jamonWriter.write("&lt;/a&gt;&lt;/li&gt;\n             ");<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // 131, 21<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      jamonWriter.write("\n             &lt;/ul&gt;\n         &lt;/nav&gt;\n     &lt;/div&gt;\n   &lt;/section&gt;\n ");<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // 136, 8<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    jamonWriter.write("\n\n");<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  <a name="line.267"></a>
-<span class="sourceLineNo">268</span>  <a name="line.268"></a>
-<span class="sourceLineNo">269</span>}<a name="line.269"></a>
+<span class="sourceLineNo">232</span>      jamonWriter.write("\n         &lt;/div&gt;\n         &lt;input type=\"hidden\" id =\"rit_page_num\" value=\"");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      // 122, 57<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(numOfRITs), jamonWriter);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      // 122, 72<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      jamonWriter.write("\" /&gt;\n         &lt;nav id=\"rit_pagination\"&gt;&lt;/nav&gt;\n     &lt;/div&gt;\n   &lt;/section&gt;\n ");<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    // 126, 8<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    jamonWriter.write("\n\n");<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  <a name="line.241"></a>
+<span class="sourceLineNo">242</span>  <a name="line.242"></a>
+<span class="sourceLineNo">243</span>}<a name="line.243"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index 62a1093..4f73ef7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -578,63 +578,63 @@
 <span class="sourceLineNo">570</span>      jamonWriter.write("&lt;/td&gt;\n\t                    &lt;td&gt;LoadBalancer to be used in the Master&lt;/td&gt;\n\t                &lt;/tr&gt;\n                ");<a name="line.570"></a>
 <span class="sourceLineNo">571</span>    }<a name="line.571"></a>
 <span class="sourceLineNo">572</span>    // 400, 23<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    jamonWriter.write("\n            &lt;/table&gt;\n        &lt;/section&gt;\n        &lt;/div&gt;\n    &lt;/div&gt; &lt;!-- /container --&gt;\n\n    &lt;script src=\"/static/js/jquery.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"/static/js/jquery.tablesorter.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"/static/js/bootstrap.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script [...]
+<span class="sourceLineNo">573</span>    jamonWriter.write("\n            &lt;/table&gt;\n        &lt;/section&gt;\n        &lt;/div&gt;\n    &lt;/div&gt; &lt;!-- /container --&gt;\n\n    &lt;script src=\"/static/js/jquery.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"/static/js/jquery.tablesorter.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"/static/js/bootstrap.min.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script [...]
 <span class="sourceLineNo">574</span>  }<a name="line.574"></a>
 <span class="sourceLineNo">575</span>  <a name="line.575"></a>
 <span class="sourceLineNo">576</span>  <a name="line.576"></a>
-<span class="sourceLineNo">577</span>  // 492, 1<a name="line.577"></a>
+<span class="sourceLineNo">577</span>  // 521, 1<a name="line.577"></a>
 <span class="sourceLineNo">578</span>  private void __jamon_innerUnit__catalogTables(final java.io.Writer jamonWriter)<a name="line.578"></a>
 <span class="sourceLineNo">579</span>    throws java.io.IOException<a name="line.579"></a>
 <span class="sourceLineNo">580</span>  {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    // 493, 1<a name="line.581"></a>
+<span class="sourceLineNo">581</span>    // 522, 1<a name="line.581"></a>
 <span class="sourceLineNo">582</span>    <a name="line.582"></a>
 <span class="sourceLineNo">583</span> List&lt;TableDescriptor&gt; sysTables = master.isInitialized() ?<a name="line.583"></a>
 <span class="sourceLineNo">584</span>   master.listTableDescriptorsByNamespace(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR) : null;<a name="line.584"></a>
 <span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>    // 497, 1<a name="line.586"></a>
+<span class="sourceLineNo">586</span>    // 526, 1<a name="line.586"></a>
 <span class="sourceLineNo">587</span>    if ((sysTables != null &amp;&amp; sysTables.size() &gt; 0))<a name="line.587"></a>
 <span class="sourceLineNo">588</span>    {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      // 497, 51<a name="line.589"></a>
+<span class="sourceLineNo">589</span>      // 526, 51<a name="line.589"></a>
 <span class="sourceLineNo">590</span>      jamonWriter.write("\n&lt;table class=\"table table-striped\"&gt;\n&lt;tr&gt;\n    &lt;th&gt;Table Name&lt;/th&gt;\n    ");<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      // 501, 5<a name="line.591"></a>
+<span class="sourceLineNo">591</span>      // 530, 5<a name="line.591"></a>
 <span class="sourceLineNo">592</span>      if ((frags != null) )<a name="line.592"></a>
 <span class="sourceLineNo">593</span>      {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        // 501, 28<a name="line.594"></a>
+<span class="sourceLineNo">594</span>        // 530, 28<a name="line.594"></a>
 <span class="sourceLineNo">595</span>        jamonWriter.write("\n        &lt;th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\"&gt;Frag.&lt;/th&gt;\n    ");<a name="line.595"></a>
 <span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      // 503, 11<a name="line.597"></a>
+<span class="sourceLineNo">597</span>      // 532, 11<a name="line.597"></a>
 <span class="sourceLineNo">598</span>      jamonWriter.write("\n    &lt;th&gt;Description&lt;/th&gt;\n&lt;/tr&gt;\n");<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      // 506, 1<a name="line.599"></a>
+<span class="sourceLineNo">599</span>      // 535, 1<a name="line.599"></a>
 <span class="sourceLineNo">600</span>      for (TableDescriptor systemTable : sysTables)<a name="line.600"></a>
 <span class="sourceLineNo">601</span>      {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>        // 506, 48<a name="line.602"></a>
+<span class="sourceLineNo">602</span>        // 535, 48<a name="line.602"></a>
 <span class="sourceLineNo">603</span>        jamonWriter.write("\n&lt;tr&gt;\n");<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        // 508, 1<a name="line.604"></a>
+<span class="sourceLineNo">604</span>        // 537, 1<a name="line.604"></a>
 <span class="sourceLineNo">605</span>        TableName tableName = systemTable.getTableName();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        // 509, 5<a name="line.606"></a>
+<span class="sourceLineNo">606</span>        // 538, 5<a name="line.606"></a>
 <span class="sourceLineNo">607</span>        jamonWriter.write("&lt;td&gt;&lt;a href=\"table.jsp?name=");<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        // 509, 33<a name="line.608"></a>
+<span class="sourceLineNo">608</span>        // 538, 33<a name="line.608"></a>
 <span class="sourceLineNo">609</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>        // 509, 48<a name="line.610"></a>
+<span class="sourceLineNo">610</span>        // 538, 48<a name="line.610"></a>
 <span class="sourceLineNo">611</span>        jamonWriter.write("\"&gt;");<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // 509, 50<a name="line.612"></a>
+<span class="sourceLineNo">612</span>        // 538, 50<a name="line.612"></a>
 <span class="sourceLineNo">613</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        // 509, 65<a name="line.614"></a>
+<span class="sourceLineNo">614</span>        // 538, 65<a name="line.614"></a>
 <span class="sourceLineNo">615</span>        jamonWriter.write("&lt;/a&gt;&lt;/td&gt;\n    ");<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        // 510, 5<a name="line.616"></a>
+<span class="sourceLineNo">616</span>        // 539, 5<a name="line.616"></a>
 <span class="sourceLineNo">617</span>        if ((frags != null))<a name="line.617"></a>
 <span class="sourceLineNo">618</span>        {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          // 510, 27<a name="line.619"></a>
+<span class="sourceLineNo">619</span>          // 539, 27<a name="line.619"></a>
 <span class="sourceLineNo">620</span>          jamonWriter.write("\n        &lt;td align=\"center\"&gt;");<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          // 511, 28<a name="line.621"></a>
+<span class="sourceLineNo">621</span>          // 540, 28<a name="line.621"></a>
 <span class="sourceLineNo">622</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())<a name="line.622"></a>
 <span class="sourceLineNo">623</span>        .intValue() + "%" : "n/a"), jamonWriter);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>          // 512, 37<a name="line.624"></a>
+<span class="sourceLineNo">624</span>          // 541, 37<a name="line.624"></a>
 <span class="sourceLineNo">625</span>          jamonWriter.write("&lt;/td&gt;\n    ");<a name="line.625"></a>
 <span class="sourceLineNo">626</span>        }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        // 513, 11<a name="line.627"></a>
+<span class="sourceLineNo">627</span>        // 542, 11<a name="line.627"></a>
 <span class="sourceLineNo">628</span>        jamonWriter.write("\n    ");<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // 514, 5<a name="line.629"></a>
+<span class="sourceLineNo">629</span>        // 543, 5<a name="line.629"></a>
 <span class="sourceLineNo">630</span>        String description = null;<a name="line.630"></a>
 <span class="sourceLineNo">631</span>        if (tableName.equals(TableName.META_TABLE_NAME)){<a name="line.631"></a>
 <span class="sourceLineNo">632</span>            description = "The hbase:meta table holds references to all User Table regions.";<a name="line.632"></a>
@@ -655,256 +655,256 @@
 <span class="sourceLineNo">647</span>            "WAL file offsets.";<a name="line.647"></a>
 <span class="sourceLineNo">648</span>        }<a name="line.648"></a>
 <span class="sourceLineNo">649</span>    <a name="line.649"></a>
-<span class="sourceLineNo">650</span>        // 534, 5<a name="line.650"></a>
+<span class="sourceLineNo">650</span>        // 563, 5<a name="line.650"></a>
 <span class="sourceLineNo">651</span>        jamonWriter.write("&lt;td&gt;");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        // 534, 9<a name="line.652"></a>
+<span class="sourceLineNo">652</span>        // 563, 9<a name="line.652"></a>
 <span class="sourceLineNo">653</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        // 534, 26<a name="line.654"></a>
+<span class="sourceLineNo">654</span>        // 563, 26<a name="line.654"></a>
 <span class="sourceLineNo">655</span>        jamonWriter.write("&lt;/td&gt;\n&lt;/tr&gt;\n");<a name="line.655"></a>
 <span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      // 536, 8<a name="line.657"></a>
+<span class="sourceLineNo">657</span>      // 565, 8<a name="line.657"></a>
 <span class="sourceLineNo">658</span>      jamonWriter.write("\n&lt;/table&gt;\n");<a name="line.658"></a>
 <span class="sourceLineNo">659</span>    }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    // 538, 7<a name="line.660"></a>
+<span class="sourceLineNo">660</span>    // 567, 7<a name="line.660"></a>
 <span class="sourceLineNo">661</span>    jamonWriter.write("\n");<a name="line.661"></a>
 <span class="sourceLineNo">662</span>  }<a name="line.662"></a>
 <span class="sourceLineNo">663</span>  <a name="line.663"></a>
 <span class="sourceLineNo">664</span>  <a name="line.664"></a>
-<span class="sourceLineNo">665</span>  // 654, 1<a name="line.665"></a>
+<span class="sourceLineNo">665</span>  // 683, 1<a name="line.665"></a>
 <span class="sourceLineNo">666</span>  private void __jamon_innerUnit__deadRegionServers(final java.io.Writer jamonWriter)<a name="line.666"></a>
 <span class="sourceLineNo">667</span>    throws java.io.IOException<a name="line.667"></a>
 <span class="sourceLineNo">668</span>  {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // 656, 1<a name="line.669"></a>
+<span class="sourceLineNo">669</span>    // 685, 1<a name="line.669"></a>
 <span class="sourceLineNo">670</span>    if ((deadServers != null &amp;&amp; deadServers.size() &gt; 0))<a name="line.670"></a>
 <span class="sourceLineNo">671</span>    {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      // 656, 55<a name="line.672"></a>
+<span class="sourceLineNo">672</span>      // 685, 55<a name="line.672"></a>
 <span class="sourceLineNo">673</span>      jamonWriter.write("\n&lt;h2&gt;Dead Region Servers&lt;/h2&gt;\n&lt;table class=\"table table-striped\"&gt;\n    &lt;tr&gt;\n        &lt;th&gt;&lt;/th&gt;\n        &lt;th&gt;ServerName&lt;/th&gt;\n        &lt;th&gt;Stop time&lt;/th&gt;\n    &lt;/tr&gt;\n    ");<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      // 664, 5<a name="line.674"></a>
+<span class="sourceLineNo">674</span>      // 693, 5<a name="line.674"></a>
 <span class="sourceLineNo">675</span>      <a name="line.675"></a>
 <span class="sourceLineNo">676</span>       DeadServer deadServerUtil = master.getServerManager().getDeadServers();<a name="line.676"></a>
 <span class="sourceLineNo">677</span>       ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);<a name="line.677"></a>
 <span class="sourceLineNo">678</span>         Arrays.sort(deadServerNames);<a name="line.678"></a>
 <span class="sourceLineNo">679</span>         for (ServerName deadServerName: deadServerNames) {<a name="line.679"></a>
 <span class="sourceLineNo">680</span>    <a name="line.680"></a>
-<span class="sourceLineNo">681</span>      // 670, 5<a name="line.681"></a>
+<span class="sourceLineNo">681</span>      // 699, 5<a name="line.681"></a>
 <span class="sourceLineNo">682</span>      jamonWriter.write("&lt;tr&gt;\n    \t&lt;th&gt;&lt;/th&gt;\n        &lt;td&gt;");<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      // 672, 13<a name="line.683"></a>
+<span class="sourceLineNo">683</span>      // 701, 13<a name="line.683"></a>
 <span class="sourceLineNo">684</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      // 672, 33<a name="line.685"></a>
+<span class="sourceLineNo">685</span>      // 701, 33<a name="line.685"></a>
 <span class="sourceLineNo">686</span>      jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      // 673, 13<a name="line.687"></a>
+<span class="sourceLineNo">687</span>      // 702, 13<a name="line.687"></a>
 <span class="sourceLineNo">688</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>      // 673, 64<a name="line.689"></a>
+<span class="sourceLineNo">689</span>      // 702, 64<a name="line.689"></a>
 <span class="sourceLineNo">690</span>      jamonWriter.write("&lt;/td&gt;\n    &lt;/tr&gt;\n    ");<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      // 675, 5<a name="line.691"></a>
+<span class="sourceLineNo">691</span>      // 704, 5<a name="line.691"></a>
 <span class="sourceLineNo">692</span>      <a name="line.692"></a>
 <span class="sourceLineNo">693</span>        }<a name="line.693"></a>
 <span class="sourceLineNo">694</span>    <a name="line.694"></a>
-<span class="sourceLineNo">695</span>      // 678, 5<a name="line.695"></a>
+<span class="sourceLineNo">695</span>      // 707, 5<a name="line.695"></a>
 <span class="sourceLineNo">696</span>      jamonWriter.write("&lt;tr&gt;\n        &lt;th&gt;Total: &lt;/th&gt;\n        &lt;td&gt;servers: ");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      // 680, 22<a name="line.697"></a>
+<span class="sourceLineNo">697</span>      // 709, 22<a name="line.697"></a>
 <span class="sourceLineNo">698</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      // 680, 46<a name="line.699"></a>
+<span class="sourceLineNo">699</span>      // 709, 46<a name="line.699"></a>
 <span class="sourceLineNo">700</span>      jamonWriter.write("&lt;/td&gt;\n        &lt;th&gt;&lt;/th&gt;\n    &lt;/tr&gt;\n&lt;/table&gt;\n");<a name="line.700"></a>
 <span class="sourceLineNo">701</span>    }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // 684, 7<a name="line.702"></a>
+<span class="sourceLineNo">702</span>    // 713, 7<a name="line.702"></a>
 <span class="sourceLineNo">703</span>    jamonWriter.write("\n");<a name="line.703"></a>
 <span class="sourceLineNo">704</span>  }<a name="line.704"></a>
 <span class="sourceLineNo">705</span>  <a name="line.705"></a>
 <span class="sourceLineNo">706</span>  <a name="line.706"></a>
-<span class="sourceLineNo">707</span>  // 687, 1<a name="line.707"></a>
+<span class="sourceLineNo">707</span>  // 716, 1<a name="line.707"></a>
 <span class="sourceLineNo">708</span>  private void __jamon_innerUnit__peerConfigs(final java.io.Writer jamonWriter)<a name="line.708"></a>
 <span class="sourceLineNo">709</span>    throws java.io.IOException<a name="line.709"></a>
 <span class="sourceLineNo">710</span>  {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    // 688, 1<a name="line.711"></a>
+<span class="sourceLineNo">711</span>    // 717, 1<a name="line.711"></a>
 <span class="sourceLineNo">712</span>    <a name="line.712"></a>
 <span class="sourceLineNo">713</span>    List&lt;ReplicationPeerDescription&gt; peers = null;<a name="line.713"></a>
 <span class="sourceLineNo">714</span>    if (master.getReplicationPeerManager() != null) {<a name="line.714"></a>
 <span class="sourceLineNo">715</span>        peers = master.getReplicationPeerManager().listPeers(null);<a name="line.715"></a>
 <span class="sourceLineNo">716</span>    }<a name="line.716"></a>
 <span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    // 694, 1<a name="line.718"></a>
+<span class="sourceLineNo">718</span>    // 723, 1<a name="line.718"></a>
 <span class="sourceLineNo">719</span>    jamonWriter.write("&lt;table class=\"table table-striped\"&gt;\n    &lt;tr&gt;\n        &lt;th&gt;Peer Id&lt;/th&gt;\n        &lt;th&gt;Cluster Key&lt;/th&gt;\n        &lt;th&gt;Endpoint&lt;/th&gt;\n        &lt;th&gt;State&lt;/th&gt;\n        &lt;th&gt;IsSerial&lt;/th&gt;\n        &lt;th&gt;Remote WAL&lt;/th&gt;\n        &lt;th&gt;Sync Replication State&lt;/th&gt;\n        &lt;th&gt;Bandwidth&lt;/th&gt;\n        &lt;th&gt;ReplicateAll&lt;/th&gt;\n [...]
-<span class="sourceLineNo">720</span>    // 710, 1<a name="line.720"></a>
+<span class="sourceLineNo">720</span>    // 739, 1<a name="line.720"></a>
 <span class="sourceLineNo">721</span>    if ((peers != null &amp;&amp; peers.size() &gt; 0))<a name="line.721"></a>
 <span class="sourceLineNo">722</span>    {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      // 710, 43<a name="line.723"></a>
+<span class="sourceLineNo">723</span>      // 739, 43<a name="line.723"></a>
 <span class="sourceLineNo">724</span>      jamonWriter.write("\n    ");<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      // 711, 5<a name="line.725"></a>
+<span class="sourceLineNo">725</span>      // 740, 5<a name="line.725"></a>
 <span class="sourceLineNo">726</span>      for (ReplicationPeerDescription peer : peers )<a name="line.726"></a>
 <span class="sourceLineNo">727</span>      {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        // 711, 53<a name="line.728"></a>
+<span class="sourceLineNo">728</span>        // 740, 53<a name="line.728"></a>
 <span class="sourceLineNo">729</span>        jamonWriter.write("\n    ");<a name="line.729"></a>
-<span class="sourceLineNo">730</span>        // 712, 5<a name="line.730"></a>
+<span class="sourceLineNo">730</span>        // 741, 5<a name="line.730"></a>
 <span class="sourceLineNo">731</span>        <a name="line.731"></a>
 <span class="sourceLineNo">732</span>        String peerId = peer.getPeerId();<a name="line.732"></a>
 <span class="sourceLineNo">733</span>        ReplicationPeerConfig peerConfig = peer.getPeerConfig();<a name="line.733"></a>
 <span class="sourceLineNo">734</span>    <a name="line.734"></a>
-<span class="sourceLineNo">735</span>        // 716, 5<a name="line.735"></a>
+<span class="sourceLineNo">735</span>        // 745, 5<a name="line.735"></a>
 <span class="sourceLineNo">736</span>        jamonWriter.write("&lt;tr&gt;\n        &lt;td&gt;");<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        // 717, 13<a name="line.737"></a>
+<span class="sourceLineNo">737</span>        // 746, 13<a name="line.737"></a>
 <span class="sourceLineNo">738</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerId), jamonWriter);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        // 717, 25<a name="line.739"></a>
+<span class="sourceLineNo">739</span>        // 746, 25<a name="line.739"></a>
 <span class="sourceLineNo">740</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>        // 718, 13<a name="line.741"></a>
+<span class="sourceLineNo">741</span>        // 747, 13<a name="line.741"></a>
 <span class="sourceLineNo">742</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getClusterKey()), jamonWriter);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        // 718, 45<a name="line.743"></a>
+<span class="sourceLineNo">743</span>        // 747, 45<a name="line.743"></a>
 <span class="sourceLineNo">744</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        // 719, 13<a name="line.745"></a>
+<span class="sourceLineNo">745</span>        // 748, 13<a name="line.745"></a>
 <span class="sourceLineNo">746</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getReplicationEndpointImpl()), jamonWriter);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>        // 719, 58<a name="line.747"></a>
+<span class="sourceLineNo">747</span>        // 748, 58<a name="line.747"></a>
 <span class="sourceLineNo">748</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        // 720, 13<a name="line.749"></a>
+<span class="sourceLineNo">749</span>        // 749, 13<a name="line.749"></a>
 <span class="sourceLineNo">750</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peer.isEnabled() ? "ENABLED" : "DISABLED"), jamonWriter);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        // 720, 60<a name="line.751"></a>
+<span class="sourceLineNo">751</span>        // 749, 60<a name="line.751"></a>
 <span class="sourceLineNo">752</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        // 721, 13<a name="line.753"></a>
+<span class="sourceLineNo">753</span>        // 750, 13<a name="line.753"></a>
 <span class="sourceLineNo">754</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.isSerial()), jamonWriter);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        // 721, 40<a name="line.755"></a>
+<span class="sourceLineNo">755</span>        // 750, 40<a name="line.755"></a>
 <span class="sourceLineNo">756</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        // 722, 13<a name="line.757"></a>
+<span class="sourceLineNo">757</span>        // 751, 13<a name="line.757"></a>
 <span class="sourceLineNo">758</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getRemoteWALDir() == null ? "" : peerConfig.getRemoteWALDir()), jamonWriter);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        // 722, 91<a name="line.759"></a>
+<span class="sourceLineNo">759</span>        // 751, 91<a name="line.759"></a>
 <span class="sourceLineNo">760</span>        jamonWriter.write("\n        &lt;td&gt;");<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        // 723, 13<a name="line.761"></a>
+<span class="sourceLineNo">761</span>        // 752, 13<a name="line.761"></a>
 <span class="sourceLineNo">762</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peer.getSyncReplicationState()), jamonWriter);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        // 723, 49<a name="line.763"></a>
+<span class="sourceLineNo">763</span>        // 752, 49<a name="line.763"></a>
 <span class="sourceLineNo">764</span>        jamonWriter.write("\n        &lt;td&gt;");<a name="line.764"></a>
-<span class="sourceLineNo">765</span>        // 724, 13<a name="line.765"></a>
+<span class="sourceLineNo">765</span>        // 753, 13<a name="line.765"></a>
 <span class="sourceLineNo">766</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getBandwidth() == 0? "UNLIMITED" : StringUtils.humanReadableInt(peerConfig.getBandwidth())), jamonWriter);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        // 724, 120<a name="line.767"></a>
+<span class="sourceLineNo">767</span>        // 753, 120<a name="line.767"></a>
 <span class="sourceLineNo">768</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        // 725, 13<a name="line.769"></a>
+<span class="sourceLineNo">769</span>        // 754, 13<a name="line.769"></a>
 <span class="sourceLineNo">770</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.replicateAllUserTables()), jamonWriter);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        // 725, 54<a name="line.771"></a>
+<span class="sourceLineNo">771</span>        // 754, 54<a name="line.771"></a>
 <span class="sourceLineNo">772</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;\n           ");<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        // 727, 12<a name="line.773"></a>
+<span class="sourceLineNo">773</span>        // 756, 12<a name="line.773"></a>
 <span class="sourceLineNo">774</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getNamespaces() == null ? "" : ReplicationPeerConfigUtil.convertToString(peerConfig.getNamespaces()).replaceAll(";", "; ")), jamonWriter);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>        // 727, 151<a name="line.775"></a>
+<span class="sourceLineNo">775</span>        // 756, 151<a name="line.775"></a>
 <span class="sourceLineNo">776</span>        jamonWriter.write("\n        &lt;/td&gt;\n        &lt;td&gt;\n            ");<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        // 730, 13<a name="line.777"></a>
+<span class="sourceLineNo">777</span>        // 759, 13<a name="line.777"></a>
 <span class="sourceLineNo">778</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getExcludeNamespaces() == null ? "" : ReplicationPeerConfigUtil.convertToString(peerConfig.getExcludeNamespaces()).replaceAll(";", "; ")), jamonWriter);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        // 730, 166<a name="line.779"></a>
+<span class="sourceLineNo">779</span>        // 759, 166<a name="line.779"></a>
 <span class="sourceLineNo">780</span>        jamonWriter.write("\n        &lt;/td&gt;\n        &lt;td&gt;\n           ");<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        // 733, 12<a name="line.781"></a>
+<span class="sourceLineNo">781</span>        // 762, 12<a name="line.781"></a>
 <span class="sourceLineNo">782</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getTableCFsMap() == null ? "" : ReplicationPeerConfigUtil.convertToString(peerConfig.getTableCFsMap()).replaceAll(";", "; ")), jamonWriter);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        // 733, 153<a name="line.783"></a>
+<span class="sourceLineNo">783</span>        // 762, 153<a name="line.783"></a>
 <span class="sourceLineNo">784</span>        jamonWriter.write("\n        &lt;/td&gt;\n        &lt;td&gt;\n           ");<a name="line.784"></a>
-<span class="sourceLineNo">785</span>        // 736, 12<a name="line.785"></a>
+<span class="sourceLineNo">785</span>        // 765, 12<a name="line.785"></a>
 <span class="sourceLineNo">786</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getExcludeTableCFsMap() == null ? "" : ReplicationPeerConfigUtil.convertToString(peerConfig.getExcludeTableCFsMap()).replaceAll(";", "; ")), jamonWriter);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        // 736, 167<a name="line.787"></a>
+<span class="sourceLineNo">787</span>        // 765, 167<a name="line.787"></a>
 <span class="sourceLineNo">788</span>        jamonWriter.write("\n        &lt;/td&gt;\n    &lt;/tr&gt;\n    ");<a name="line.788"></a>
 <span class="sourceLineNo">789</span>      }<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      // 739, 12<a name="line.790"></a>
+<span class="sourceLineNo">790</span>      // 768, 12<a name="line.790"></a>
 <span class="sourceLineNo">791</span>      jamonWriter.write("\n");<a name="line.791"></a>
 <span class="sourceLineNo">792</span>    }<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    // 740, 7<a name="line.793"></a>
+<span class="sourceLineNo">793</span>    // 769, 7<a name="line.793"></a>
 <span class="sourceLineNo">794</span>    jamonWriter.write("\n&lt;tr&gt;&lt;td&gt;Total: ");<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    // 741, 16<a name="line.795"></a>
+<span class="sourceLineNo">795</span>    // 770, 16<a name="line.795"></a>
 <span class="sourceLineNo">796</span>    org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf((peers != null) ? peers.size() : 0), jamonWriter);<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    // 741, 56<a name="line.797"></a>
+<span class="sourceLineNo">797</span>    // 770, 56<a name="line.797"></a>
 <span class="sourceLineNo">798</span>    jamonWriter.write("&lt;/td&gt;&lt;/tr&gt;\n&lt;/table&gt;\n");<a name="line.798"></a>
 <span class="sourceLineNo">799</span>  }<a name="line.799"></a>
 <span class="sourceLineNo">800</span>  <a name="line.800"></a>
 <span class="sourceLineNo">801</span>  <a name="line.801"></a>
-<span class="sourceLineNo">802</span>  // 625, 1<a name="line.802"></a>
+<span class="sourceLineNo">802</span>  // 654, 1<a name="line.802"></a>
 <span class="sourceLineNo">803</span>  private void __jamon_innerUnit__userSnapshots(final java.io.Writer jamonWriter)<a name="line.803"></a>
 <span class="sourceLineNo">804</span>    throws java.io.IOException<a name="line.804"></a>
 <span class="sourceLineNo">805</span>  {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    // 626, 1<a name="line.806"></a>
+<span class="sourceLineNo">806</span>    // 655, 1<a name="line.806"></a>
 <span class="sourceLineNo">807</span>    <a name="line.807"></a>
 <span class="sourceLineNo">808</span>   List&lt;SnapshotDescription&gt; snapshots = master.isInitialized() ?<a name="line.808"></a>
 <span class="sourceLineNo">809</span>     master.getSnapshotManager().getCompletedSnapshots() : null;<a name="line.809"></a>
 <span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>    // 630, 1<a name="line.811"></a>
+<span class="sourceLineNo">811</span>    // 659, 1<a name="line.811"></a>
 <span class="sourceLineNo">812</span>    if ((snapshots != null &amp;&amp; snapshots.size() &gt; 0))<a name="line.812"></a>
 <span class="sourceLineNo">813</span>    {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>      // 630, 51<a name="line.814"></a>
+<span class="sourceLineNo">814</span>      // 659, 51<a name="line.814"></a>
 <span class="sourceLineNo">815</span>      jamonWriter.write("\n&lt;table class=\"table table-striped\"&gt;\n    &lt;tr&gt;\n        &lt;th&gt;Snapshot Name&lt;/th&gt;\n        &lt;th&gt;Table&lt;/th&gt;\n        &lt;th&gt;Creation Time&lt;/th&gt;\n    &lt;/tr&gt;\n    ");<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      // 637, 5<a name="line.816"></a>
+<span class="sourceLineNo">816</span>      // 666, 5<a name="line.816"></a>
 <span class="sourceLineNo">817</span>      for (SnapshotDescription snapshotDesc : snapshots)<a name="line.817"></a>
 <span class="sourceLineNo">818</span>      {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        // 637, 57<a name="line.819"></a>
+<span class="sourceLineNo">819</span>        // 666, 57<a name="line.819"></a>
 <span class="sourceLineNo">820</span>        jamonWriter.write("\n    ");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>        // 638, 5<a name="line.821"></a>
+<span class="sourceLineNo">821</span>        // 667, 5<a name="line.821"></a>
 <span class="sourceLineNo">822</span>        <a name="line.822"></a>
 <span class="sourceLineNo">823</span>        TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());<a name="line.823"></a>
 <span class="sourceLineNo">824</span>    <a name="line.824"></a>
-<span class="sourceLineNo">825</span>        // 641, 5<a name="line.825"></a>
+<span class="sourceLineNo">825</span>        // 670, 5<a name="line.825"></a>
 <span class="sourceLineNo">826</span>        jamonWriter.write("&lt;tr&gt;\n        &lt;td&gt;&lt;a href=\"snapshot.jsp?name=");<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        // 642, 40<a name="line.827"></a>
+<span class="sourceLineNo">827</span>        // 671, 40<a name="line.827"></a>
 <span class="sourceLineNo">828</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>        // 642, 68<a name="line.829"></a>
+<span class="sourceLineNo">829</span>        // 671, 68<a name="line.829"></a>
 <span class="sourceLineNo">830</span>        jamonWriter.write("\"&gt;");<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        // 642, 70<a name="line.831"></a>
+<span class="sourceLineNo">831</span>        // 671, 70<a name="line.831"></a>
 <span class="sourceLineNo">832</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>        // 642, 98<a name="line.833"></a>
+<span class="sourceLineNo">833</span>        // 671, 98<a name="line.833"></a>
 <span class="sourceLineNo">834</span>        jamonWriter.write("&lt;/a&gt; &lt;/td&gt;\n        &lt;td&gt;&lt;a href=\"table.jsp?name=");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        // 643, 37<a name="line.835"></a>
+<span class="sourceLineNo">835</span>        // 672, 37<a name="line.835"></a>
 <span class="sourceLineNo">836</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        // 643, 74<a name="line.837"></a>
+<span class="sourceLineNo">837</span>        // 672, 74<a name="line.837"></a>
 <span class="sourceLineNo">838</span>        jamonWriter.write("\"&gt;");<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        // 643, 76<a name="line.839"></a>
+<span class="sourceLineNo">839</span>        // 672, 76<a name="line.839"></a>
 <span class="sourceLineNo">840</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        // 643, 113<a name="line.841"></a>
+<span class="sourceLineNo">841</span>        // 672, 113<a name="line.841"></a>
 <span class="sourceLineNo">842</span>        jamonWriter.write("&lt;/a&gt;\n        &lt;/td&gt;\n        &lt;td&gt;");<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        // 645, 13<a name="line.843"></a>
+<span class="sourceLineNo">843</span>        // 674, 13<a name="line.843"></a>
 <span class="sourceLineNo">844</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        // 645, 59<a name="line.845"></a>
+<span class="sourceLineNo">845</span>        // 674, 59<a name="line.845"></a>
 <span class="sourceLineNo">846</span>        jamonWriter.write("&lt;/td&gt;\n    &lt;/tr&gt;\n    ");<a name="line.846"></a>
 <span class="sourceLineNo">847</span>      }<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      // 647, 12<a name="line.848"></a>
+<span class="sourceLineNo">848</span>      // 676, 12<a name="line.848"></a>
 <span class="sourceLineNo">849</span>      jamonWriter.write("\n    &lt;p&gt;");<a name="line.849"></a>
-<span class="sourceLineNo">850</span>      // 648, 8<a name="line.850"></a>
+<span class="sourceLineNo">850</span>      // 677, 8<a name="line.850"></a>
 <span class="sourceLineNo">851</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>      // 648, 30<a name="line.852"></a>
+<span class="sourceLineNo">852</span>      // 677, 30<a name="line.852"></a>
 <span class="sourceLineNo">853</span>      jamonWriter.write(" snapshot(s) in set. [&lt;a href=\"/snapshotsStats.jsp\"&gt;Snapshot Storefile stats&lt;/a&gt;]&lt;/p&gt;\n&lt;/table&gt;\n");<a name="line.853"></a>
 <span class="sourceLineNo">854</span>    }<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    // 650, 7<a name="line.855"></a>
+<span class="sourceLineNo">855</span>    // 679, 7<a name="line.855"></a>
 <span class="sourceLineNo">856</span>    jamonWriter.write("\n");<a name="line.856"></a>
 <span class="sourceLineNo">857</span>  }<a name="line.857"></a>
 <span class="sourceLineNo">858</span>  <a name="line.858"></a>
 <span class="sourceLineNo">859</span>  <a name="line.859"></a>
-<span class="sourceLineNo">860</span>  // 541, 1<a name="line.860"></a>
+<span class="sourceLineNo">860</span>  // 570, 1<a name="line.860"></a>
 <span class="sourceLineNo">861</span>  private void __jamon_innerUnit__userTables(final java.io.Writer jamonWriter)<a name="line.861"></a>
 <span class="sourceLineNo">862</span>    throws java.io.IOException<a name="line.862"></a>
 <span class="sourceLineNo">863</span>  {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    // 542, 1<a name="line.864"></a>
+<span class="sourceLineNo">864</span>    // 571, 1<a name="line.864"></a>
 <span class="sourceLineNo">865</span>    <a name="line.865"></a>
 <span class="sourceLineNo">866</span>   List&lt;TableDescriptor&gt; tables = new ArrayList&lt;TableDescriptor&gt;();<a name="line.866"></a>
 <span class="sourceLineNo">867</span>   String errorMessage = getUserTables(master, tables);<a name="line.867"></a>
 <span class="sourceLineNo">868</span><a name="line.868"></a>
-<span class="sourceLineNo">869</span>    // 546, 1<a name="line.869"></a>
+<span class="sourceLineNo">869</span>    // 575, 1<a name="line.869"></a>
 <span class="sourceLineNo">870</span>    if ((tables.size() == 0 &amp;&amp; errorMessage != null))<a name="line.870"></a>
 <span class="sourceLineNo">871</span>    {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      // 546, 52<a name="line.872"></a>
+<span class="sourceLineNo">872</span>      // 575, 52<a name="line.872"></a>
 <span class="sourceLineNo">873</span>      jamonWriter.write("\n&lt;p&gt; ");<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      // 547, 5<a name="line.874"></a>
+<span class="sourceLineNo">874</span>      // 576, 5<a name="line.874"></a>
 <span class="sourceLineNo">875</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(errorMessage), jamonWriter);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      // 547, 23<a name="line.876"></a>
+<span class="sourceLineNo">876</span>      // 576, 23<a name="line.876"></a>
 <span class="sourceLineNo">877</span>      jamonWriter.write(" &lt;/p&gt;\n");<a name="line.877"></a>
 <span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // 548, 7<a name="line.879"></a>
+<span class="sourceLineNo">879</span>    // 577, 7<a name="line.879"></a>
 <span class="sourceLineNo">880</span>    jamonWriter.write("\n\n");<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    // 550, 1<a name="line.881"></a>
+<span class="sourceLineNo">881</span>    // 579, 1<a name="line.881"></a>
 <span class="sourceLineNo">882</span>    if ((tables != null &amp;&amp; tables.size() &gt; 0))<a name="line.882"></a>
 <span class="sourceLineNo">883</span>    {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      // 550, 45<a name="line.884"></a>
+<span class="sourceLineNo">884</span>      // 579, 45<a name="line.884"></a>
 <span class="sourceLineNo">885</span>      jamonWriter.write("\n&lt;table id=\"userTables\" class=\"tablesorter table table-striped\"&gt;\n&lt;thead&gt;\n    &lt;tr&gt;\n        &lt;th style=\"vertical-align: middle;\" rowspan=\"2\"&gt;Namespace&lt;/th&gt;\n        &lt;th style=\"vertical-align: middle;\" rowspan=\"2\"&gt;Name&lt;/th&gt;\n        ");<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      // 556, 9<a name="line.886"></a>
+<span class="sourceLineNo">886</span>      // 585, 9<a name="line.886"></a>
 <span class="sourceLineNo">887</span>      if ((frags != null) )<a name="line.887"></a>
 <span class="sourceLineNo">888</span>      {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>        // 556, 32<a name="line.889"></a>
+<span class="sourceLineNo">889</span>        // 585, 32<a name="line.889"></a>
 <span class="sourceLineNo">890</span>        jamonWriter.write("\n            &lt;th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\"&gt;Frag.&lt;/th&gt;\n        ");<a name="line.890"></a>
 <span class="sourceLineNo">891</span>      }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      // 558, 15<a name="line.892"></a>
+<span class="sourceLineNo">892</span>      // 587, 15<a name="line.892"></a>
 <span class="sourceLineNo">893</span>      jamonWriter.write("\n        &lt;th style=\"vertical-align:middle;\" rowspan=\"2\"&gt;State&lt;/th&gt;\n        &lt;th style=\"text-align: center\" colspan=\"8\"&gt;Regions&lt;/th&gt;\n        &lt;th style=\"vertical-align:middle;\" rowspan=\"2\"&gt;Description&lt;/th&gt;\n    &lt;/tr&gt;\n    &lt;tr&gt;\n        &lt;th&gt;OPEN&lt;/th&gt;\n        &lt;th&gt;OPENING&lt;/th&gt;\n        &lt;th&gt;CLOSED&lt;/th&gt;\n        &lt;th&gt;CLOSING&lt;/th [...]
-<span class="sourceLineNo">894</span>      // 575, 5<a name="line.894"></a>
+<span class="sourceLineNo">894</span>      // 604, 5<a name="line.894"></a>
 <span class="sourceLineNo">895</span>      for (TableDescriptor desc : tables)<a name="line.895"></a>
 <span class="sourceLineNo">896</span>      {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>        // 575, 42<a name="line.897"></a>
+<span class="sourceLineNo">897</span>        // 604, 42<a name="line.897"></a>
 <span class="sourceLineNo">898</span>        jamonWriter.write("\n    ");<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        // 576, 5<a name="line.899"></a>
+<span class="sourceLineNo">899</span>        // 605, 5<a name="line.899"></a>
 <span class="sourceLineNo">900</span>        <a name="line.900"></a>
 <span class="sourceLineNo">901</span>      HTableDescriptor htDesc = new HTableDescriptor(desc);<a name="line.901"></a>
 <span class="sourceLineNo">902</span>      TableName tableName = htDesc.getTableName();<a name="line.902"></a>
@@ -930,125 +930,125 @@
 <span class="sourceLineNo">922</span>                     - splitRegionsCount - openingRegionsCount<a name="line.922"></a>
 <span class="sourceLineNo">923</span>                     - closedRegionsCount - closingRegionsCount;<a name="line.923"></a>
 <span class="sourceLineNo">924</span>    <a name="line.924"></a>
-<span class="sourceLineNo">925</span>        // 601, 5<a name="line.925"></a>
+<span class="sourceLineNo">925</span>        // 630, 5<a name="line.925"></a>
 <span class="sourceLineNo">926</span>        jamonWriter.write("&lt;tr&gt;\n        &lt;td&gt;");<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        // 602, 13<a name="line.927"></a>
+<span class="sourceLineNo">927</span>        // 631, 13<a name="line.927"></a>
 <span class="sourceLineNo">928</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>        // 602, 51<a name="line.929"></a>
+<span class="sourceLineNo">929</span>        // 631, 51<a name="line.929"></a>
 <span class="sourceLineNo">930</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;&lt;a href=table.jsp?name=");<a name="line.930"></a>
-<span class="sourceLineNo">931</span>        // 603, 36<a name="line.931"></a>
+<span class="sourceLineNo">931</span>        // 632, 36<a name="line.931"></a>
 <span class="sourceLineNo">932</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        // 603, 69<a name="line.933"></a>
+<span class="sourceLineNo">933</span>        // 632, 69<a name="line.933"></a>
 <span class="sourceLineNo">934</span>        jamonWriter.write("&gt;");<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // 603, 70<a name="line.935"></a>
+<span class="sourceLineNo">935</span>        // 632, 70<a name="line.935"></a>
 <span class="sourceLineNo">936</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>        // 603, 108<a name="line.937"></a>
+<span class="sourceLineNo">937</span>        // 632, 108<a name="line.937"></a>
 <span class="sourceLineNo">938</span>        jamonWriter.write("&lt;/a&gt; &lt;/td&gt;\n        ");<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        // 604, 9<a name="line.939"></a>
+<span class="sourceLineNo">939</span>        // 633, 9<a name="line.939"></a>
 <span class="sourceLineNo">940</span>        if ((frags != null) )<a name="line.940"></a>
 <span class="sourceLineNo">941</span>        {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>          // 604, 32<a name="line.942"></a>
+<span class="sourceLineNo">942</span>          // 633, 32<a name="line.942"></a>
 <span class="sourceLineNo">943</span>          jamonWriter.write("\n            &lt;td align=\"center\"&gt;");<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          // 605, 32<a name="line.944"></a>
+<span class="sourceLineNo">944</span>          // 634, 32<a name="line.944"></a>
 <span class="sourceLineNo">945</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          // 605, 150<a name="line.946"></a>
+<span class="sourceLineNo">946</span>          // 634, 150<a name="line.946"></a>
 <span class="sourceLineNo">947</span>          jamonWriter.write("&lt;/td&gt;\n        ");<a name="line.947"></a>
 <span class="sourceLineNo">948</span>        }<a name="line.948"></a>
-<span class="sourceLineNo">949</span>        // 606, 15<a name="line.949"></a>
+<span class="sourceLineNo">949</span>        // 635, 15<a name="line.949"></a>
 <span class="sourceLineNo">950</span>        jamonWriter.write("\n        &lt;td&gt;");<a name="line.950"></a>
-<span class="sourceLineNo">951</span>        // 607, 13<a name="line.951"></a>
+<span class="sourceLineNo">951</span>        // 636, 13<a name="line.951"></a>
 <span class="sourceLineNo">952</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableState.getState()), jamonWriter);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>        // 607, 40<a name="line.953"></a>
+<span class="sourceLineNo">953</span>        // 636, 40<a name="line.953"></a>
 <span class="sourceLineNo">954</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        // 608, 13<a name="line.955"></a>
+<span class="sourceLineNo">955</span>        // 637, 13<a name="line.955"></a>
 <span class="sourceLineNo">956</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);<a name="line.956"></a>
-<span class="sourceLineNo">957</span>        // 608, 35<a name="line.957"></a>
+<span class="sourceLineNo">957</span>        // 637, 35<a name="line.957"></a>
 <span class="sourceLineNo">958</span>        jamonWriter.write("&lt;/td&gt;\n        ");<a name="line.958"></a>
-<span class="sourceLineNo">959</span>        // 609, 9<a name="line.959"></a>
+<span class="sourceLineNo">959</span>        // 638, 9<a name="line.959"></a>
 <span class="sourceLineNo">960</span>        if ((openingRegionsCount &gt; 0) )<a name="line.960"></a>
 <span class="sourceLineNo">961</span>        {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          // 609, 42<a name="line.962"></a>
+<span class="sourceLineNo">962</span>          // 638, 42<a name="line.962"></a>
 <span class="sourceLineNo">963</span>          jamonWriter.write(" &lt;td&gt;&lt;a href=\"/rits.jsp?table=");<a name="line.963"></a>
-<span class="sourceLineNo">964</span>          // 609, 72<a name="line.964"></a>
+<span class="sourceLineNo">964</span>          // 638, 72<a name="line.964"></a>
 <span class="sourceLineNo">965</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>          // 609, 105<a name="line.966"></a>
+<span class="sourceLineNo">966</span>          // 638, 105<a name="line.966"></a>
 <span class="sourceLineNo">967</span>          jamonWriter.write("&amp;state=OPENING\"&gt;");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>          // 609, 121<a name="line.968"></a>
+<span class="sourceLineNo">968</span>          // 638, 121<a name="line.968"></a>
 <span class="sourceLineNo">969</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openingRegionsCount), jamonWriter);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>          // 609, 146<a name="line.970"></a>
+<span class="sourceLineNo">970</span>          // 638, 146<a name="line.970"></a>
 <span class="sourceLineNo">971</span>          jamonWriter.write("&lt;/td&gt; ");<a name="line.971"></a>
 <span class="sourceLineNo">972</span>        }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        // 609, 152<a name="line.973"></a>
+<span class="sourceLineNo">973</span>        // 638, 152<a name="line.973"></a>
 <span class="sourceLineNo">974</span>        else<a name="line.974"></a>
 <span class="sourceLineNo">975</span>        {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>          // 609, 159<a name="line.976"></a>
+<span class="sourceLineNo">976</span>          // 638, 159<a name="line.976"></a>
 <span class="sourceLineNo">977</span>          jamonWriter.write("&lt;td&gt;");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>          // 609, 163<a name="line.978"></a>
+<span class="sourceLineNo">978</span>          // 638, 163<a name="line.978"></a>
 <span class="sourceLineNo">979</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openingRegionsCount), jamonWriter);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>          // 609, 188<a name="line.980"></a>
+<span class="sourceLineNo">980</span>          // 638, 188<a name="line.980"></a>
 <span class="sourceLineNo">981</span>          jamonWriter.write("&lt;/td&gt; ");<a name="line.981"></a>
 <span class="sourceLineNo">982</span>        }<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        // 609, 200<a name="line.983"></a>
+<span class="sourceLineNo">983</span>        // 638, 200<a name="line.983"></a>
 <span class="sourceLineNo">984</span>        jamonWriter.write("\n        &lt;td&gt;");<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        // 610, 13<a name="line.985"></a>
+<span class="sourceLineNo">985</span>        // 639, 13<a name="line.985"></a>
 <span class="sourceLineNo">986</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closedRegionsCount), jamonWriter);<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        // 610, 37<a name="line.987"></a>
+<span class="sourceLineNo">987</span>        // 639, 37<a name="line.987"></a>
 <span class="sourceLineNo">988</span>        jamonWriter.write("&lt;/td&gt;\n        ");<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        // 611, 9<a name="line.989"></a>
+<span class="sourceLineNo">989</span>        // 640, 9<a name="line.989"></a>
 <span class="sourceLineNo">990</span>        if ((closingRegionsCount &gt; 0) )<a name="line.990"></a>
 <span class="sourceLineNo">991</span>        {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>          // 611, 42<a name="line.992"></a>
+<span class="sourceLineNo">992</span>          // 640, 42<a name="line.992"></a>
 <span class="sourceLineNo">993</span>          jamonWriter.write(" &lt;td&gt;&lt;a href=\"/rits.jsp?table=");<a name="line.993"></a>
-<span class="sourceLineNo">994</span>          // 611, 72<a name="line.994"></a>
+<span class="sourceLineNo">994</span>          // 640, 72<a name="line.994"></a>
 <span class="sourceLineNo">995</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);<a name="line.995"></a>
-<span class="sourceLineNo">996</span>          // 611, 105<a name="line.996"></a>
+<span class="sourceLineNo">996</span>          // 640, 105<a name="line.996"></a>
 <span class="sourceLineNo">997</span>          jamonWriter.write("&amp;state=CLOSING\"&gt;");<a name="line.997"></a>
-<span class="sourceLineNo">998</span>          // 611, 121<a name="line.998"></a>
+<span class="sourceLineNo">998</span>          // 640, 121<a name="line.998"></a>
 <span class="sourceLineNo">999</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closingRegionsCount), jamonWriter);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          // 611, 146<a name="line.1000"></a>
+<span class="sourceLineNo">1000</span>          // 640, 146<a name="line.1000"></a>
 <span class="sourceLineNo">1001</span>          jamonWriter.write("&lt;/td&gt; ");<a name="line.1001"></a>
 <span class="sourceLineNo">1002</span>        }<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        // 611, 152<a name="line.1003"></a>
+<span class="sourceLineNo">1003</span>        // 640, 152<a name="line.1003"></a>
 <span class="sourceLineNo">1004</span>        else<a name="line.1004"></a>
 <span class="sourceLineNo">1005</span>        {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>          // 611, 159<a name="line.1006"></a>
+<span class="sourceLineNo">1006</span>          // 640, 159<a name="line.1006"></a>
 <span class="sourceLineNo">1007</span>          jamonWriter.write("&lt;td&gt;");<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>          // 611, 163<a name="line.1008"></a>
+<span class="sourceLineNo">1008</span>          // 640, 163<a name="line.1008"></a>
 <span class="sourceLineNo">1009</span>          org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closingRegionsCount), jamonWriter);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>          // 611, 188<a name="line.1010"></a>
+<span class="sourceLineNo">1010</span>          // 640, 188<a name="line.1010"></a>
 <span class="sourceLineNo">1011</span>          jamonWriter.write("&lt;/td&gt; ");<a name="line.1011"></a>
 <span class="sourceLineNo">1012</span>        }<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        // 611, 200<a name="line.1013"></a>
+<span class="sourceLineNo">1013</span>        // 640, 200<a name="line.1013"></a>
 <span class="sourceLineNo">1014</span>        jamonWriter.write("\n        &lt;td&gt;");<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        // 612, 13<a name="line.1015"></a>
+<span class="sourceLineNo">1015</span>        // 641, 13<a name="line.1015"></a>
 <span class="sourceLineNo">1016</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        // 612, 38<a name="line.1017"></a>
+<span class="sourceLineNo">1017</span>        // 641, 38<a name="line.1017"></a>
 <span class="sourceLineNo">1018</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        // 613, 13<a name="line.1019"></a>
+<span class="sourceLineNo">1019</span>        // 642, 13<a name="line.1019"></a>
 <span class="sourceLineNo">1020</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>        // 613, 37<a name="line.1021"></a>
+<span class="sourceLineNo">1021</span>        // 642, 37<a name="line.1021"></a>
 <span class="sourceLineNo">1022</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>        // 614, 13<a name="line.1023"></a>
+<span class="sourceLineNo">1023</span>        // 643, 13<a name="line.1023"></a>
 <span class="sourceLineNo">1024</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>        // 614, 36<a name="line.1025"></a>
+<span class="sourceLineNo">1025</span>        // 643, 36<a name="line.1025"></a>
 <span class="sourceLineNo">1026</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        // 615, 13<a name="line.1027"></a>
+<span class="sourceLineNo">1027</span>        // 644, 13<a name="line.1027"></a>
 <span class="sourceLineNo">1028</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>        // 615, 36<a name="line.1029"></a>
+<span class="sourceLineNo">1029</span>        // 644, 36<a name="line.1029"></a>
 <span class="sourceLineNo">1030</span>        jamonWriter.write("&lt;/td&gt;\n        &lt;td&gt;");<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>        // 616, 13<a name="line.1031"></a>
+<span class="sourceLineNo">1031</span>        // 645, 13<a name="line.1031"></a>
 <span class="sourceLineNo">1032</span>        org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        // 616, 52<a name="line.1033"></a>
+<span class="sourceLineNo">1033</span>        // 645, 52<a name="line.1033"></a>
 <span class="sourceLineNo">1034</span>        jamonWriter.write("&lt;/td&gt;\n    &lt;/tr&gt;\n    ");<a name="line.1034"></a>
 <span class="sourceLineNo">1035</span>      }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      // 618, 12<a name="line.1036"></a>
+<span class="sourceLineNo">1036</span>      // 647, 12<a name="line.1036"></a>
 <span class="sourceLineNo">1037</span>      jamonWriter.write("\n    &lt;p&gt;");<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      // 619, 8<a name="line.1038"></a>
+<span class="sourceLineNo">1038</span>      // 648, 8<a name="line.1038"></a>
 <span class="sourceLineNo">1039</span>      org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.size()), jamonWriter);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      // 619, 27<a name="line.1040"></a>
+<span class="sourceLineNo">1040</span>      // 648, 27<a name="line.1040"></a>
 <span class="sourceLineNo">1041</span>      jamonWriter.write(" table(s) in set. [&lt;a href=tablesDetailed.jsp&gt;Details&lt;/a&gt;]&lt;/p&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n");<a name="line.1041"></a>
 <span class="sourceLineNo">1042</span>    }<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    // 622, 7<a name="line.1043"></a>
+<span class="sourceLineNo">1043</span>    // 651, 7<a name="line.1043"></a>
 <span class="sourceLineNo">1044</span>    jamonWriter.write("\n");<a name="line.1044"></a>
 <span class="sourceLineNo">1045</span>  }<a name="line.1045"></a>
 <span class="sourceLineNo">1046</span>  <a name="line.1046"></a>
diff --git a/downloads.html b/downloads.html
index cebfd36..56a2131 100644
--- a/downloads.html
+++ b/downloads.html
@@ -418,7 +418,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/export_control.html b/export_control.html
index a24c4e7..880108f 100644
--- a/export_control.html
+++ b/export_control.html
@@ -180,7 +180,7 @@ for more details.</p>
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/index.html b/index.html
index 4471784..5480f6c 100644
--- a/index.html
+++ b/index.html
@@ -258,7 +258,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-tracking.html b/issue-tracking.html
index b302fe5..d626f94 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mail-lists.html b/mail-lists.html
index 1c28aa4..8f6d436 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -205,7 +205,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/metrics.html b/metrics.html
index f710b1b..29d8e2a 100644
--- a/metrics.html
+++ b/metrics.html
@@ -308,7 +308,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/old_news.html b/old_news.html
index 8cef6fb..6bc1d99 100644
--- a/old_news.html
+++ b/old_news.html
@@ -299,7 +299,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugin-management.html b/plugin-management.html
index 3e08083..137e5ae 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -304,7 +304,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugins.html b/plugins.html
index 9c35aae..79faba3 100644
--- a/plugins.html
+++ b/plugins.html
@@ -231,7 +231,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 48ee848..3ea6e92 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -633,7 +633,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-info.html b/project-info.html
index c966971..5045fbf 100644
--- a/project-info.html
+++ b/project-info.html
@@ -193,7 +193,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-reports.html b/project-reports.html
index 38dbfb5..119064d 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-summary.html b/project-summary.html
index 827f89f..4a8bf0d 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -195,7 +195,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 6ebd730..661cd6f 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -157,7 +157,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/replication.html b/replication.html
index 032fbe5..58cce19 100644
--- a/replication.html
+++ b/replication.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/resources.html b/resources.html
index f7bf65e..fa9ddfb 100644
--- a/resources.html
+++ b/resources.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/source-repository.html b/source-repository.html
index b932b83..e469989 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -163,7 +163,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/sponsors.html b/sponsors.html
index 38d6dc1..b704373 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -182,7 +182,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/supportingprojects.html b/supportingprojects.html
index 8541aa3..3d9a00d 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -373,7 +373,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team-list.html b/team-list.html
index bcf94c3..37192fc 100644
--- a/team-list.html
+++ b/team-list.html
@@ -672,7 +672,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2020
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-15</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2020-01-16</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 140120b..02a3f2e 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -604,6 +604,7 @@
 <li><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase" target="classFrame">StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator</a></li>
 <li><a href="org/apache/hadoop/hbase/chaos/actions/SudoCommandAction.html" title="class in org.apache.hadoop.hbase.chaos.actions" target="classFrame">SudoCommandAction</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/SyncReplicationTestBase.html" title="class in org.apache.hadoop.hbase.replication" target="classFrame">SyncReplicationTestBase</a></li>
+<li><a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase" target="classFrame">TableNameTestRule</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatTestBase.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">TableSnapshotInputFormatTestBase</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile" target="classFrame">TagUsage</a></li>
 <li><a href="org/apache/hadoop/hbase/chaos/actions/TCCommandAction.html" title="class in org.apache.hadoop.hbase.chaos.actions" target="classFrame">TCCommandAction</a></li>
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 9f7804a..a9188b3 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -604,6 +604,7 @@
 <li><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator</a></li>
 <li><a href="org/apache/hadoop/hbase/chaos/actions/SudoCommandAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">SudoCommandAction</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/SyncReplicationTestBase.html" title="class in org.apache.hadoop.hbase.replication">SyncReplicationTestBase</a></li>
+<li><a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatTestBase.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormatTestBase</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile">TagUsage</a></li>
 <li><a href="org/apache/hadoop/hbase/chaos/actions/TCCommandAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">TCCommandAction</a></li>
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 4bdefab..7bcadbc 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -14407,7 +14407,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestSecureRESTServer.EmptyCredentials.html#EmptyCredentials--">EmptyCredentials()</a></span> - Constructor for class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestSecureRESTServer.EmptyCredentials.html" title="class in org.apache.hadoop.hbase.rest">TestSecureRESTServer.EmptyCredentials</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#emptyNames">emptyNames</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#emptyNames">emptyNames</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.html#emptyParam">emptyParam</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.html" title="class in org.apache.hadoop.hbase.mapreduce">MapreduceTestingShim</a></dt>
 <dd>&nbsp;</dd>
@@ -21185,6 +21185,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.TestTableDDLProcedure.html#getTableName--">getTableName()</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.TestTableDDLProcedure.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController.TestTableDDLProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TableNameTestRule.html#getTableName--">getTableName()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html#getTableName-org.apache.hadoop.conf.Configuration-">getTableName(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html#getTablename--">getTablename()</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList</a></dt>
@@ -21193,8 +21195,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html#getTablename--">getTablename()</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestLoadAndVerify</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#getTableName--">getTableName()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift/TestThriftServer.MySlowHBaseHandler.html#getTableNames--">getTableNames()</a></span> - Method in class org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/TestThriftServer.MySlowHBaseHandler.html" title="class in org.apache.hadoop.hbase.thrift">TestThriftServer.MySlowHBaseHandler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/procedure/ShellTestProcedure.html#getTableNameString--">getTableNameString()</a></span> - Method in class org.apache.hadoop.hbase.client.procedure.<a href="org/apache/hadoop/hbase/client/procedure/ShellTestProcedure.html" title="class in org.apache.hadoop.hbase.client.procedure">ShellTestProcedure</a></dt>
@@ -22830,7 +22830,7 @@
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#illegalTableNames">illegalTableNames</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#illegalTableNames">illegalTableNames</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/example/TestScanModifyingObserver.html#IMPLICIT_QUAL">IMPLICIT_QUAL</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.example.<a href="org/apache/hadoop/hbase/coprocessor/example/TestScanModifyingObserver.html" title="class in org.apache.hadoop.hbase.coprocessor.example">TestScanModifyingObserver</a></dt>
 <dd>&nbsp;</dd>
@@ -24006,7 +24006,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRowPrefixBloomFilter.html#invalidFormatter">invalidFormatter</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRowPrefixBloomFilter.html" title="class in org.apache.hadoop.hbase.regionserver">TestRowPrefixBloomFilter</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#invalidNamespace">invalidNamespace</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#invalidNamespace">invalidNamespace</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/encoding/TestSeekBeforeWithReverseScan.html#invert-byte:A-">invert(byte[])</a></span> - Method in class org.apache.hadoop.hbase.io.encoding.<a href="org/apache/hadoop/hbase/io/encoding/TestSeekBeforeWithReverseScan.html" title="class in org.apache.hadoop.hbase.io.encoding">TestSeekBeforeWithReverseScan</a></dt>
 <dd>&nbsp;</dd>
@@ -25330,7 +25330,7 @@
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
 &nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#legalTableNames">legalTableNames</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#legalTableNames">legalTableNames</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html#LEN_VARIATION">LEN_VARIATION</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">CreateRandomStoreFile</a></dt>
 <dd>
@@ -29940,7 +29940,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ClassFinder.FileFilterWithName.html#nameFilter">nameFilter</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/ClassFinder.FileFilterWithName.html" title="class in org.apache.hadoop.hbase">ClassFinder.FileFilterWithName</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#names">names</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#names">names</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.Names.html#Names-java.lang.String-java.lang.String-">Names(String, String)</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a></dt>
 <dd>&nbsp;</dd>
@@ -43946,10 +43946,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/StringRange.html#startInclusive">startInclusive</a></span> - Variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/StringRange.html" title="class in org.apache.hadoop.hbase.filter">StringRange</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#starting-org.junit.runner.Description-">starting(Description)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
-<dd>
-<div class="block">Invoked when a test is about to start</div>
-</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TableNameTestRule.html#starting-org.junit.runner.Description-">starting(Description)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/TestMobFileName.html#startKey">startKey</a></span> - Variable in class org.apache.hadoop.hbase.mob.<a href="org/apache/hadoop/hbase/mob/TestMobFileName.html" title="class in org.apache.hadoop.hbase.mob">TestMobFileName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/LoadTestTool.html#startKey">startKey</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/LoadTestTool.html" title="class in org.apache.hadoop.hbase.util">LoadTestTool</a></dt>
@@ -46162,14 +46160,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestRestoreFlushSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TableNameTestRule.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.Copier.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.Copier.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedListWithVisibility.Copier</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html#tableName">tableName</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedListWithVisibility</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.VisibilityVerify.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.VisibilityVerify.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedListWithVisibility.VisibilityVerify</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift2/TestThrift2HttpServer.html#TABLENAME">TABLENAME</a></span> - Static variable in class org.apache.hadoop.hbase.thrift2.<a href="org/apache/hadoop/hbase/thrift2/TestThrift2HttpServer.html" title="class in org.apache.hadoop.hbase.thrift2">TestThrift2HttpServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift2/TestThrift2ServerCmdLine.html#TABLENAME">TABLENAME</a></span> - Static variable in class org.apache.hadoop.hbase.thrift2.<a href="org/apache/hadoop/hbase/thrift2/TestThrift2ServerCmdLine.html" title="class in org.apache.hadoop.hbase.thrift2">TestThrift2ServerCmdLine</a></dt>
@@ -46196,6 +46194,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/procedure/ShellTestProcedure.html#tableNameString">tableNameString</a></span> - Variable in class org.apache.hadoop.hbase.client.procedure.<a href="org/apache/hadoop/hbase/client/procedure/ShellTestProcedure.html" title="class in org.apache.hadoop.hbase.client.procedure">ShellTestProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TableNameTestRule</span></a> - Class in <a href="org/apache/hadoop/hbase/package-summary.html">org.apache.hadoop.hbase</a></dt>
+<dd>
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TableNameTestRule.html#TableNameTestRule--">TableNameTestRule()</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestInvalidMutationDurabilityException.html#tableNeedReplicate">tableNeedReplicate</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestInvalidMutationDurabilityException.html" title="class in org.apache.hadoop.hbase.client">TestInvalidMutationDurabilityException</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestInvalidMutationDurabilityException.html#tableNotReplicate">tableNotReplicate</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestInvalidMutationDurabilityException.html" title="class in org.apache.hadoop.hbase.client">TestInvalidMutationDurabilityException</a></dt>
@@ -48302,40 +48306,24 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompactionFileNotFound.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompactionFileNotFound.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompactionFileNotFound</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerRetriableFailure</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.html" title="class in org.apache.hadoop.hbase.regionserver">TestServerCustomProtocol</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/TestRSGroupsWithACL.html" title="class in org.apache.hadoop.hbase.rsgroup">TestRSGroupsWithACL</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController2.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController2</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController3.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController3.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController3</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLs</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.html" title="class in org.apache.hadoop.hbase.security.access">TestCoprocessorWhitelistMasterObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestNamespaceCommands.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestNamespaceCommands.html" title="class in org.apache.hadoop.hbase.security.access">TestNamespaceCommands</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html" title="class in org.apache.hadoop.hbase.security.access">TestScanEarlyTermination</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestTablePermissions.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestTablePermissions.html" title="class in org.apache.hadoop.hbase.security.access">TestTablePermissions</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestUnloadAccessController.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestUnloadAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestUnloadAccessController</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html" title="class in org.apache.hadoop.hbase.security.access">TestWithDisabledAuthorization</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestZKPermissionWatcher.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestZKPermissionWatcher.html" title="class in org.apache.hadoop.hbase.security.access">TestZKPermissionWatcher</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALMethods.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALMethods.html" title="class in org.apache.hadoop.hbase.wal">TestWALMethods</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.html#TEST_TABLE1">TEST_TABLE1</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.html" title="class in org.apache.hadoop.hbase.coprocessor">TestMasterCoprocessorExceptionWithRemove</a></dt>
@@ -70059,6 +70047,22 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationWALEntryFilters.html#testSystemTableWALEntryFilter--">testSystemTableWALEntryFilter()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationWALEntryFilters.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationWALEntryFilters</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerRetriableFailure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController2.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController2.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController2</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLs</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html" title="class in org.apache.hadoop.hbase.security.access">TestScanEarlyTermination</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html" title="class in org.apache.hadoop.hbase.security.access">TestWithDisabledAuthorization</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#testTable">testTable</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestPerTableCFReplication.html#testTableCFsHelperConverter--">testTableCFsHelperConverter()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestPerTableCFReplication.html" title="class in org.apache.hadoop.hbase.replication">TestPerTableCFReplication</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/replication/master/TestTableCFsUpdater.html" title="class in org.apache.hadoop.hbase.replication.master"><span class="typeNameLink">TestTableCFsUpdater</span></a> - Class in <a href="org/apache/hadoop/hbase/replication/master/package-summary.html">org.apache.hadoop.hbase.replication.master</a></dt>
@@ -70340,7 +70344,7 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName</span></a> - Class in <a href="org/apache/hadoop/hbase/package-summary.html">org.apache.hadoop.hbase</a></dt>
 <dd>
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<div class="block">Tests for various kinds of TableNames.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestTableName.html#TestTableName--">TestTableName()</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></dt>
 <dd>&nbsp;</dd>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html b/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html
index d095c51..226ebb5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../index.html?org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" target="_top">Frames</a></li>
@@ -512,7 +512,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/util/test/LoadTestDataGener
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../index.html?org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" target="_top">Frames</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html b/testdevapidocs/org/apache/hadoop/hbase/TableNameTestRule.html
similarity index 68%
copy from testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html
copy to testdevapidocs/org/apache/hadoop/hbase/TableNameTestRule.html
index f597ade..a7f6d2b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TableNameTestRule.html
@@ -4,7 +4,7 @@
 <head>
 <!-- Generated by javadoc -->
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>TestAcidGuaranteesWithAdaptivePolicy (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<title>TableNameTestRule (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../script.js"></script>
 </head>
@@ -12,13 +12,13 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="TestAcidGuaranteesWithAdaptivePolicy (Apache HBase 3.0.0-SNAPSHOT Test API)";
+            parent.document.title="TableNameTestRule (Apache HBase 3.0.0-SNAPSHOT Test API)";
         }
     }
     catch(err) {
     }
 //-->
-var methods = {"i0":10};
+var methods = {"i0":10,"i1":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -40,7 +40,7 @@ var activeTableTab = "activeTableTab";
 <li><a href="../../../../overview-summary.html">Overview</a></li>
 <li><a href="package-summary.html">Package</a></li>
 <li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/TestAcidGuaranteesWithAdaptivePolicy.html">Use</a></li>
+<li><a href="class-use/TableNameTestRule.html">Use</a></li>
 <li><a href="package-tree.html">Tree</a></li>
 <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
 <li><a href="../../../../index-all.html">Index</a></li>
@@ -50,11 +50,11 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../index.html?org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" target="_top">Frames</a></li>
-<li><a href="TestAcidGuaranteesWithAdaptivePolicy.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../index.html?org/apache/hadoop/hbase/TableNameTestRule.html" target="_top">Frames</a></li>
+<li><a href="TableNameTestRule.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_top">
 <li><a href="../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
@@ -93,17 +93,17 @@ var activeTableTab = "activeTableTab";
 <!-- ======== START OF CLASS DATA ======== -->
 <div class="header">
 <div class="subTitle">org.apache.hadoop.hbase</div>
-<h2 title="Class TestAcidGuaranteesWithAdaptivePolicy" class="title">Class TestAcidGuaranteesWithAdaptivePolicy</h2>
+<h2 title="Class TableNameTestRule" class="title">Class TableNameTestRule</h2>
 </div>
 <div class="contentContainer">
 <ul class="inheritance">
 <li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
 <li>
 <ul class="inheritance">
-<li><a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html" title="class in org.apache.hadoop.hbase">org.apache.hadoop.hbase.AcidGuaranteesTestBase</a></li>
+<li>org.junit.rules.TestWatcher</li>
 <li>
 <ul class="inheritance">
-<li>org.apache.hadoop.hbase.TestAcidGuaranteesWithAdaptivePolicy</li>
+<li>org.apache.hadoop.hbase.TableNameTestRule</li>
 </ul>
 </li>
 </ul>
@@ -112,10 +112,15 @@ var activeTableTab = "activeTableTab";
 <div class="description">
 <ul class="blockList">
 <li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd>org.junit.rules.TestRule</dd>
+</dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../src-html/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#line.25">TestAcidGuaranteesWithAdaptivePolicy</a>
-extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html" title="class in org.apache.hadoop.hbase">AcidGuaranteesTestBase</a></pre>
+<pre>public class <a href="../../../../src-html/org/apache/hadoop/hbase/TableNameTestRule.html#line.26">TableNameTestRule</a>
+extends org.junit.rules.TestWatcher</pre>
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </li>
 </ul>
 </div>
@@ -135,8 +140,8 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>static <a href="../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code>private org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -153,7 +158,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#TestAcidGuaranteesWithAdaptivePolicy--">TestAcidGuaranteesWithAdaptivePolicy</a></span>()</code>&nbsp;</td>
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html#TableNameTestRule--">TableNameTestRule</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -171,16 +176,20 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>protected org.apache.hadoop.hbase.MemoryCompactionPolicy</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#getMemoryCompactionPolicy--">getMemoryCompactionPolicy</a></span>()</code>&nbsp;</td>
+<td class="colFirst"><code>org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html#starting-org.junit.runner.Description-">starting</a></span>(org.junit.runner.Description&nbsp;description)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
-<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.AcidGuaranteesTestBase">
+<li class="blockList"><a name="methods.inherited.from.class.org.junit.rules.TestWatcher">
 <!--   -->
 </a>
-<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html" title="class in org.apache.hadoop.hbase">AcidGuaranteesTestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html#setUp--">setUp</a>, <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html#setUpBeforeClass--">setUpBeforeClass</a>, <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html#tearDown--">tearDown</a>, <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html#tearDownAfterClass--">tearDownAfterClass</a>, <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesT [...]
+<h3>Methods inherited from class&nbsp;org.junit.rules.TestWatcher</h3>
+<code>apply, failed, finished, skipped, skipped, succeeded</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -203,13 +212,13 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="CLASS_RULE">
+<a name="tableName">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#line.28">CLASS_RULE</a></pre>
+<h4>tableName</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../src-html/org/apache/hadoop/hbase/TableNameTestRule.html#line.28">tableName</a></pre>
 </li>
 </ul>
 </li>
@@ -220,13 +229,13 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="TestAcidGuaranteesWithAdaptivePolicy--">
+<a name="TableNameTestRule--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>TestAcidGuaranteesWithAdaptivePolicy</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#line.25">TestAcidGuaranteesWithAdaptivePolicy</a>()</pre>
+<h4>TableNameTestRule</h4>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TableNameTestRule.html#line.26">TableNameTestRule</a>()</pre>
 </li>
 </ul>
 </li>
@@ -237,19 +246,28 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="getMemoryCompactionPolicy--">
+<a name="starting-org.junit.runner.Description-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
-<h4>getMemoryCompactionPolicy</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.MemoryCompactionPolicy&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#line.32">getMemoryCompactionPolicy</a>()</pre>
+<h4>starting</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TableNameTestRule.html#line.31">starting</a>(org.junit.runner.Description&nbsp;description)</pre>
 <dl>
-<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html#getMemoryCompactionPolicy--">getMemoryCompactionPolicy</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html" title="class in org.apache.hadoop.hbase">AcidGuaranteesTestBase</a></code></dd>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code>starting</code>&nbsp;in class&nbsp;<code>org.junit.rules.TestWatcher</code></dd>
 </dl>
 </li>
 </ul>
+<a name="getTableName--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getTableName</h4>
+<pre>public&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TableNameTestRule.html#line.35">getTableName</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>
@@ -269,7 +287,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <li><a href="../../../../overview-summary.html">Overview</a></li>
 <li><a href="package-summary.html">Package</a></li>
 <li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/TestAcidGuaranteesWithAdaptivePolicy.html">Use</a></li>
+<li><a href="class-use/TableNameTestRule.html">Use</a></li>
 <li><a href="package-tree.html">Tree</a></li>
 <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
 <li><a href="../../../../index-all.html">Index</a></li>
@@ -279,11 +297,11 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../index.html?org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" target="_top">Frames</a></li>
-<li><a href="TestAcidGuaranteesWithAdaptivePolicy.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../index.html?org/apache/hadoop/hbase/TableNameTestRule.html" target="_top">Frames</a></li>
+<li><a href="TableNameTestRule.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_bottom">
 <li><a href="../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html b/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html
index f597ade..e8f3a62 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -278,7 +278,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/AcidGuaranteesTestBase.html
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestTableName.Names.html b/testdevapidocs/org/apache/hadoop/hbase/TestTableName.Names.html
index d476a49..0f2c64c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestTableName.Names.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestTableName.Names.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.116">TestTableName.Names</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.53">TestTableName.Names</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -226,7 +226,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ns</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.117">ns</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.54">ns</a></pre>
 </li>
 </ul>
 <a name="nsb">
@@ -235,7 +235,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nsb</h4>
-<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.118">nsb</a></pre>
+<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.55">nsb</a></pre>
 </li>
 </ul>
 <a name="tn">
@@ -244,7 +244,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tn</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.119">tn</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.56">tn</a></pre>
 </li>
 </ul>
 <a name="tnb">
@@ -253,7 +253,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tnb</h4>
-<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.120">tnb</a></pre>
+<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.57">tnb</a></pre>
 </li>
 </ul>
 <a name="nn">
@@ -262,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nn</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.121">nn</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.58">nn</a></pre>
 </li>
 </ul>
 <a name="nnb">
@@ -271,7 +271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>nnb</h4>
-<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.122">nnb</a></pre>
+<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.59">nnb</a></pre>
 </li>
 </ul>
 </li>
@@ -288,7 +288,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Names</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.124">Names</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;ns,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.61">Names</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;ns,
       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tn)</pre>
 </li>
 </ul>
@@ -306,7 +306,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.134">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.71">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -319,7 +319,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.155">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.Names.html#line.91">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestTableName.html b/testdevapidocs/org/apache/hadoop/hbase/TestTableName.html
index 4acc31f..e8e3e34 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestTableName.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestTableName.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -100,27 +100,18 @@ var activeTableTab = "activeTableTab";
 <li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
 <li>
 <ul class="inheritance">
-<li>org.junit.rules.TestWatcher</li>
-<li>
-<ul class="inheritance">
 <li>org.apache.hadoop.hbase.TestTableName</li>
 </ul>
 </li>
 </ul>
-</li>
-</ul>
 <div class="description">
 <ul class="blockList">
 <li class="blockList">
-<dl>
-<dt>All Implemented Interfaces:</dt>
-<dd>org.junit.rules.TestRule</dd>
-</dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.41">TestTableName</a>
-extends org.junit.rules.TestWatcher</pre>
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<pre>public class <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.38">TestTableName</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+<div class="block">Tests for various kinds of TableNames.</div>
 </li>
 </ul>
 </div>
@@ -163,29 +154,25 @@ extends org.junit.rules.TestWatcher</pre>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#emptyNames">emptyNames</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#illegalTableNames">illegalTableNames</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#invalidNamespace">invalidNamespace</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#legalTableNames">legalTableNames</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) <a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#names">names</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>private org.apache.hadoop.hbase.TableName</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#tableName">tableName</a></span></code>&nbsp;</td>
-</tr>
 </table>
 </li>
 </ul>
@@ -219,53 +206,36 @@ extends org.junit.rules.TestWatcher</pre>
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>org.apache.hadoop.hbase.TableName</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
-</tr>
-<tr id="i1" class="rowColor">
-<td class="colFirst"><code>protected void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#starting-org.junit.runner.Description-">starting</a></span>(org.junit.runner.Description&nbsp;description)</code>
-<div class="block">Invoked when a test is about to start</div>
-</td>
-</tr>
-<tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testEmptyNamespaceName--">testEmptyNamespaceName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testEmptyTableName--">testEmptyTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testIllegalHTableNames--">testIllegalHTableNames</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testInvalidNamespace--">testInvalidNamespace</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testLegalHTableNames--">testLegalHTableNames</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#testValueOf--">testValueOf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.TableName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html#validateNames-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.TestTableName.Names-">validateNames</a></span>(org.apache.hadoop.hbase.TableName&nbsp;expected,
              <a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>&nbsp;names)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
-<li class="blockList"><a name="methods.inherited.from.class.org.junit.rules.TestWatcher">
-<!--   -->
-</a>
-<h3>Methods inherited from class&nbsp;org.junit.rules.TestWatcher</h3>
-<code>apply, failed, finished, skipped, skipped, succeeded</code></li>
-</ul>
-<ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
 <!--   -->
 </a>
@@ -292,16 +262,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.44">CLASS_RULE</a></pre>
-</li>
-</ul>
-<a name="tableName">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>tableName</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.47">tableName</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.40">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="emptyNames">
@@ -310,7 +271,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>emptyNames</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.61">emptyNames</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.43">emptyNames</a></pre>
 </li>
 </ul>
 <a name="invalidNamespace">
@@ -319,7 +280,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>invalidNamespace</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.62">invalidNamespace</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.44">invalidNamespace</a></pre>
 </li>
 </ul>
 <a name="legalTableNames">
@@ -328,7 +289,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>legalTableNames</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.63">legalTableNames</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.45">legalTableNames</a></pre>
 </li>
 </ul>
 <a name="illegalTableNames">
@@ -337,7 +298,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>illegalTableNames</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.67">illegalTableNames</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.49">illegalTableNames</a></pre>
 </li>
 </ul>
 <a name="names">
@@ -346,7 +307,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>names</h4>
-<pre><a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.162">names</a></pre>
+<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[] <a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.98">names</a></pre>
 </li>
 </ul>
 </li>
@@ -363,7 +324,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestTableName</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.41">TestTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.38">TestTableName</a>()</pre>
 </li>
 </ul>
 </li>
@@ -374,36 +335,13 @@ extends org.junit.rules.TestWatcher</pre>
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="starting-org.junit.runner.Description-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>starting</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.53">starting</a>(org.junit.runner.Description&nbsp;description)</pre>
-<div class="block">Invoked when a test is about to start</div>
-<dl>
-<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
-<dd><code>starting</code>&nbsp;in class&nbsp;<code>org.junit.rules.TestWatcher</code></dd>
-</dl>
-</li>
-</ul>
-<a name="getTableName--">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>getTableName</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.57">getTableName</a>()</pre>
-</li>
-</ul>
 <a name="testInvalidNamespace--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testInvalidNamespace</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.73">testInvalidNamespace</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.111">testInvalidNamespace</a>()</pre>
 </li>
 </ul>
 <a name="testEmptyNamespaceName--">
@@ -412,7 +350,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>testEmptyNamespaceName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.82">testEmptyNamespaceName</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.118">testEmptyNamespaceName</a>()</pre>
 </li>
 </ul>
 <a name="testEmptyTableName--">
@@ -421,7 +359,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>testEmptyTableName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.90">testEmptyTableName</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.125">testEmptyTableName</a>()</pre>
 </li>
 </ul>
 <a name="testLegalHTableNames--">
@@ -430,7 +368,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>testLegalHTableNames</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.98">testLegalHTableNames</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.132">testLegalHTableNames</a>()</pre>
 </li>
 </ul>
 <a name="testIllegalHTableNames--">
@@ -439,7 +377,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>testIllegalHTableNames</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.105">testIllegalHTableNames</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.138">testIllegalHTableNames</a>()</pre>
 </li>
 </ul>
 <a name="testValueOf--">
@@ -448,7 +386,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>testValueOf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.176">testValueOf</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.145">testValueOf</a>()</pre>
 </li>
 </ul>
 <a name="validateNames-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.TestTableName.Names-">
@@ -457,7 +395,7 @@ extends org.junit.rules.TestWatcher</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>validateNames</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.194">validateNames</a>(org.apache.hadoop.hbase.TableName&nbsp;expected,
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestTableName.html#line.161">validateNames</a>(org.apache.hadoop.hbase.TableName&nbsp;expected,
                                                         <a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>&nbsp;names)</pre>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index fa6650a..88e37d3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -150,8 +150,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/TableNameTestRule.html
similarity index 69%
copy from testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
copy to testdevapidocs/org/apache/hadoop/hbase/class-use/TableNameTestRule.html
index bff8c20..865bc1a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/TableNameTestRule.html
@@ -4,7 +4,7 @@
 <head>
 <!-- Generated by javadoc -->
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Uses of Class org.apache.hadoop.hbase.TestTableName (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<title>Uses of Class org.apache.hadoop.hbase.TableNameTestRule (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../script.js"></script>
 </head>
@@ -12,7 +12,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Uses of Class org.apache.hadoop.hbase.TestTableName (Apache HBase 3.0.0-SNAPSHOT Test API)";
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.TableNameTestRule (Apache HBase 3.0.0-SNAPSHOT Test API)";
         }
     }
     catch(err) {
@@ -33,7 +33,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">Class</a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../../../../../overview-tree.html">Tree</a></li>
 <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
@@ -47,8 +47,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../index.html?org/apache/hadoop/hbase/class-use/TestTableName.html" target="_top">Frames</a></li>
-<li><a href="TestTableName.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/class-use/TableNameTestRule.html" target="_top">Frames</a></li>
+<li><a href="TableNameTestRule.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_top">
 <li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
@@ -70,13 +70,13 @@
 </a></div>
 <!-- ========= END OF TOP NAVBAR ========= -->
 <div class="header">
-<h2 title="Uses of Class org.apache.hadoop.hbase.TestTableName" class="title">Uses of Class<br>org.apache.hadoop.hbase.TestTableName</h2>
+<h2 title="Uses of Class org.apache.hadoop.hbase.TableNameTestRule" class="title">Uses of Class<br>org.apache.hadoop.hbase.TableNameTestRule</h2>
 </div>
 <div class="classUseContainer">
 <ul class="blockList">
 <li class="blockList">
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
-<caption><span>Packages that use <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>Packages that use <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Package</th>
 <th class="colLast" scope="col">Description</th>
@@ -102,17 +102,17 @@
 <li class="blockList"><a name="org.apache.hadoop.hbase.regionserver">
 <!--   -->
 </a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></h3>
+<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></h3>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestScannerRetriableFailure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestScannerRetriableFailure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
@@ -120,33 +120,33 @@
 <li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
 <!--   -->
 </a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a></h3>
+<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a></h3>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAccessController2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestAccessController2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestScanEarlyTermination.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestScanEarlyTermination.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWithDisabledAuthorization.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestWithDisabledAuthorization.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCellACLs.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestCellACLs.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCellACLWithMultipleVersions.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestCellACLWithMultipleVersions.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
@@ -154,21 +154,21 @@
 <li class="blockList"><a name="org.apache.hadoop.hbase.snapshot">
 <!--   -->
 </a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></h3>
+<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></h3>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
+<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSnapshotClientRetries.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotClientRetries.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
 </table>
@@ -188,7 +188,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">Class</a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../../../../../overview-tree.html">Tree</a></li>
 <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
@@ -202,8 +202,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../index.html?org/apache/hadoop/hbase/class-use/TestTableName.html" target="_top">Frames</a></li>
-<li><a href="TestTableName.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/class-use/TableNameTestRule.html" target="_top">Frames</a></li>
+<li><a href="TableNameTestRule.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_bottom">
 <li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.Names.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.Names.html
index 6a2c2c5..b5df122 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.Names.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.Names.html
@@ -103,7 +103,7 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[]</code></td>
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">TestTableName.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html#names">names</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
index bff8c20..8737b96 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
@@ -72,111 +72,7 @@
 <div class="header">
 <h2 title="Uses of Class org.apache.hadoop.hbase.TestTableName" class="title">Uses of Class<br>org.apache.hadoop.hbase.TestTableName</h2>
 </div>
-<div class="classUseContainer">
-<ul class="blockList">
-<li class="blockList">
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
-<caption><span>Packages that use <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Package</th>
-<th class="colLast" scope="col">Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.regionserver">org.apache.hadoop.hbase.regionserver</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.security.access">org.apache.hadoop.hbase.security.access</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-<li class="blockList">
-<ul class="blockList">
-<li class="blockList"><a name="org.apache.hadoop.hbase.regionserver">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Field and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestScannerRetriableFailure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-<li class="blockList"><a name="org.apache.hadoop.hbase.security.access">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/security/access/package-summary.html">org.apache.hadoop.hbase.security.access</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Field and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAccessController2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestScanEarlyTermination.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWithDisabledAuthorization.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCellACLs.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCellACLWithMultipleVersions.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-<li class="blockList"><a name="org.apache.hadoop.hbase.snapshot">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a> declared as <a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Field and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSnapshotClientRetries.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
-</ul>
-</li>
-</ul>
-</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.TestTableName</div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->
 <div class="bottomNav"><a name="navbar.bottom">
 <!--   -->
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/package-frame.html
index 6735cf2..583d9be 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-frame.html
@@ -155,6 +155,7 @@
 <li><a href="StartMiniClusterOption.Builder.html" title="class in org.apache.hadoop.hbase" target="classFrame">StartMiniClusterOption.Builder</a></li>
 <li><a href="StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase" target="classFrame">StripeCompactionsPerformanceEvaluation</a></li>
 <li><a href="StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator.html" title="class in org.apache.hadoop.hbase" target="classFrame">StripeCompactionsPerformanceEvaluation.SeqShardedDataGenerator</a></li>
+<li><a href="TableNameTestRule.html" title="class in org.apache.hadoop.hbase" target="classFrame">TableNameTestRule</a></li>
 <li><a href="TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase" target="classFrame">TestAcidGuaranteesWithAdaptivePolicy</a></li>
 <li><a href="TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase" target="classFrame">TestAcidGuaranteesWithBasicPolicy</a></li>
 <li><a href="TestAcidGuaranteesWithEagerPolicy.html" title="class in org.apache.hadoop.hbase" target="classFrame">TestAcidGuaranteesWithEagerPolicy</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/package-summary.html
index 33e5ff0..84e506e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-summary.html
@@ -836,146 +836,152 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></td>
+<td class="colLast">
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithAdaptivePolicy</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithBasicPolicy</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithEagerPolicy.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithEagerPolicy</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestAcidGuaranteesWithNoInMemCompaction.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithNoInMemCompaction</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestByteBufferKeyValue.html" title="class in org.apache.hadoop.hbase">TestByteBufferKeyValue</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCachedClusterId.html" title="class in org.apache.hadoop.hbase">TestCachedClusterId</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCachedClusterId.GetClusterIdThread.html" title="class in org.apache.hadoop.hbase">TestCachedClusterId.GetClusterIdThread</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellBuilder.html" title="class in org.apache.hadoop.hbase">TestCellBuilder</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellComparator.html" title="class in org.apache.hadoop.hbase">TestCellComparator</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellUtil.html" title="class in org.apache.hadoop.hbase">TestCellUtil</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellUtil.NonExtendedCell.html" title="class in org.apache.hadoop.hbase">TestCellUtil.NonExtendedCell</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellUtil.TestCell.html" title="class in org.apache.hadoop.hbase">TestCellUtil.TestCell</a></td>
 <td class="colLast">
 <div class="block">Cell used in test.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellUtil.TestCellScannable.html" title="class in org.apache.hadoop.hbase">TestCellUtil.TestCellScannable</a></td>
 <td class="colLast">
 <div class="block">CellScannable used in test.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCellUtil.TestCellScanner.html" title="class in org.apache.hadoop.hbase">TestCellUtil.TestCellScanner</a></td>
 <td class="colLast">
 <div class="block">CellScanner used in test.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCheckTestClasses.html" title="class in org.apache.hadoop.hbase">TestCheckTestClasses</a></td>
 <td class="colLast">
 <div class="block">Checks tests are categorized.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.html" title="class in org.apache.hadoop.hbase">TestChoreService</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples</a></td>
 <td class="colLast">
 <div class="block">A few ScheduledChore samples that are useful for testing with ChoreService</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.CountingChore.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.CountingChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.DoNothingChore.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.DoNothingChore</a></td>
 <td class="colLast">
 <div class="block">Lightweight ScheduledChore used primarily to fill the scheduling queue in tests</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.FailInitialChore.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.FailInitialChore</a></td>
 <td class="colLast">
 <div class="block">A Chore that will try to execute the initial chore a few times before succeeding.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SampleStopper.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.SampleStopper</a></td>
 <td class="colLast">
 <div class="block">Straight forward stopper implementation that is used by default when one is not provided</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SleepingChore.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.SleepingChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SlowChore.html" title="class in org.apache.hadoop.hbase">TestChoreService.ScheduledChoreSamples.SlowChore</a></td>
 <td class="colLast">
 <div class="block">Sleeps for longer than the scheduled period.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClassFinder.html" title="class in org.apache.hadoop.hbase">TestClassFinder</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClassFinder.CustomClassloader.html" title="class in org.apache.hadoop.hbase">TestClassFinder.CustomClassloader</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClassFinder.FileAndPath.html" title="class in org.apache.hadoop.hbase">TestClassFinder.FileAndPath</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientClusterMetrics.html" title="class in org.apache.hadoop.hbase">TestClientClusterMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientClusterMetrics.MyObserver.html" title="class in org.apache.hadoop.hbase">TestClientClusterMetrics.MyObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientClusterStatus.html" title="class in org.apache.hadoop.hbase">TestClientClusterStatus</a></td>
 <td class="colLast">
 <div class="block">Test the ClusterStatus.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientClusterStatus.MyObserver.html" title="class in org.apache.hadoop.hbase">TestClientClusterStatus.MyObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></td>
 <td class="colLast">
 <div class="block">These tests verify that the RPC timeouts ('hbase.client.operation.timeout' and
@@ -983,358 +989,358 @@
  injects delays to get, scan and mutate operations.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientOperationTimeout.DelayedRegionServer.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout.DelayedRegionServer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClientOperationTimeout.DelayedRSRpcServices.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout.DelayedRSRpcServices</a></td>
 <td class="colLast">
 <div class="block">This <code>RSRpcServices</code> class injects delay for Rpc calls and after executes super methods.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClusterBootOrder.html" title="class in org.apache.hadoop.hbase">TestClusterBootOrder</a></td>
 <td class="colLast">
 <div class="block">Tests the boot order indifference between regionserver and master</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestClusterPortAssignment.html" title="class in org.apache.hadoop.hbase">TestClusterPortAssignment</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCompatibilitySingletonFactory.html" title="class in org.apache.hadoop.hbase">TestCompatibilitySingletonFactory</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestCompoundConfiguration.html" title="class in org.apache.hadoop.hbase">TestCompoundConfiguration</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestExecutorStatusChore.html" title="class in org.apache.hadoop.hbase">TestExecutorStatusChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.html" title="class in org.apache.hadoop.hbase">TestFSTableDescriptorForceCreation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestFullLogReconstruction.html" title="class in org.apache.hadoop.hbase">TestFullLogReconstruction</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestGlobalMemStoreSize.html" title="class in org.apache.hadoop.hbase">TestGlobalMemStoreSize</a></td>
 <td class="colLast">
 <div class="block">Test HBASE-3694 whether the GlobalMemStoreSize is the same as the summary
  of all the online region's MemStoreSize</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHBaseConfiguration.html" title="class in org.apache.hadoop.hbase">TestHBaseConfiguration</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHBaseConfiguration.ReflectiveCredentialProviderClient.html" title="class in org.apache.hadoop.hbase">TestHBaseConfiguration.ReflectiveCredentialProviderClient</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHBaseOnOtherDfsCluster.html" title="class in org.apache.hadoop.hbase">TestHBaseOnOtherDfsCluster</a></td>
 <td class="colLast">
 <div class="block">Test that an HBase cluster can run on top of an existing MiniDfsCluster</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">TestHBaseTestingUtility</a></td>
 <td class="colLast">
 <div class="block">Test our testing utility class</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHBaseTestingUtilSpinup.html" title="class in org.apache.hadoop.hbase">TestHBaseTestingUtilSpinup</a></td>
 <td class="colLast">
 <div class="block">Make sure we can spin up a HBTU without a hbase-site.xml</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHColumnDescriptor.html" title="class in org.apache.hadoop.hbase">TestHColumnDescriptor</a></td>
 <td class="colLast">Deprecated
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0 together with
             <code>HColumnDescriptor</code>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHColumnDescriptorDefaultVersions.html" title="class in org.apache.hadoop.hbase">TestHColumnDescriptorDefaultVersions</a></td>
 <td class="colLast">
 <div class="block">Verify that the HColumnDescriptor version is set correctly by default, hbase-site.xml, and user
  input</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHDFSBlocksDistribution.html" title="class in org.apache.hadoop.hbase">TestHDFSBlocksDistribution</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHRegionLocation.html" title="class in org.apache.hadoop.hbase">TestHRegionLocation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestHTableDescriptor.html" title="class in org.apache.hadoop.hbase">TestHTableDescriptor</a></td>
 <td class="colLast">Deprecated
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0 together with
              <code>HTableDescriptor</code>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIndividualBytesFieldCell.html" title="class in org.apache.hadoop.hbase">TestIndividualBytesFieldCell</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestInfoServers.html" title="class in org.apache.hadoop.hbase">TestInfoServers</a></td>
 <td class="colLast">
 <div class="block">Testing, info servers are disabled.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIntegrationTestBase.html" title="class in org.apache.hadoop.hbase">TestIntegrationTestBase</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIOFencing.html" title="class in org.apache.hadoop.hbase">TestIOFencing</a></td>
 <td class="colLast">
 <div class="block">Test for the case where a regionserver going down has enough cycles to do damage to regions that
  have actually been assigned elsehwere.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionHStore.html" title="class in org.apache.hadoop.hbase">TestIOFencing.BlockCompactionsInCompletionHStore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html" title="class in org.apache.hadoop.hbase">TestIOFencing.BlockCompactionsInCompletionRegion</a></td>
 <td class="colLast">
 <div class="block">An override of HRegion that allows us park compactions in a holding pattern and
  then when appropriate for the test, allow them proceed again.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html" title="class in org.apache.hadoop.hbase">TestIOFencing.BlockCompactionsInPrepRegion</a></td>
 <td class="colLast">
 <div class="block">An override of HRegion that allows us park compactions in a holding pattern and
  then when appropriate for the test, allow them proceed again.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html" title="class in org.apache.hadoop.hbase">TestIOFencing.CompactionBlockerRegion</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestIPv6NIOServerSocketChannel.html" title="class in org.apache.hadoop.hbase">TestIPv6NIOServerSocketChannel</a></td>
 <td class="colLast">
 <div class="block">This tests whether ServerSocketChannel works over ipv6, which ZooKeeper
  depends on.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestJMXConnectorServer.html" title="class in org.apache.hadoop.hbase">TestJMXConnectorServer</a></td>
 <td class="colLast">
 <div class="block">Test case for JMX Connector Server.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html" title="class in org.apache.hadoop.hbase">TestJMXConnectorServer.MyAccessController</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestJMXListener.html" title="class in org.apache.hadoop.hbase">TestJMXListener</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestKeyValue.html" title="class in org.apache.hadoop.hbase">TestKeyValue</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestKeyValue.FailureCase.html" title="class in org.apache.hadoop.hbase">TestKeyValue.FailureCase</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestLocalHBaseCluster.html" title="class in org.apache.hadoop.hbase">TestLocalHBaseCluster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestLocalHBaseCluster.MyHMaster.html" title="class in org.apache.hadoop.hbase">TestLocalHBaseCluster.MyHMaster</a></td>
 <td class="colLast">
 <div class="block">A private master class similar to that used by HMasterCommandLine when
  running in local mode.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestLocalHBaseCluster.MyHRegionServer.html" title="class in org.apache.hadoop.hbase">TestLocalHBaseCluster.MyHRegionServer</a></td>
 <td class="colLast">
 <div class="block">A private regionserver class with a dummy method for testing casts</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMetaTableAccessor.html" title="class in org.apache.hadoop.hbase">TestMetaTableAccessor</a></td>
 <td class="colLast">
 <div class="block">Test <code>MetaTableAccessor</code>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMetaTableAccessor.MetaTask.html" title="class in org.apache.hadoop.hbase">TestMetaTableAccessor.MetaTask</a></td>
 <td class="colLast">
 <div class="block">Thread that runs a MetaTableAccessor task until asked stop.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMetaTableAccessor.SpyingRpcScheduler.html" title="class in org.apache.hadoop.hbase">TestMetaTableAccessor.SpyingRpcScheduler</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMetaTableAccessor.SpyingRpcSchedulerFactory.html" title="class in org.apache.hadoop.hbase">TestMetaTableAccessor.SpyingRpcSchedulerFactory</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMetaTableLocator.html" title="class in org.apache.hadoop.hbase">TestMetaTableLocator</a></td>
 <td class="colLast">
 <div class="block">Test <code>MetaTableLocator</code></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMovedRegionsCleaner.html" title="class in org.apache.hadoop.hbase">TestMovedRegionsCleaner</a></td>
 <td class="colLast">
 <div class="block">Test whether background cleanup of MovedRegion entries is happening</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMovedRegionsCleaner.TestMockRegionServer.html" title="class in org.apache.hadoop.hbase">TestMovedRegionsCleaner.TestMockRegionServer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestMultiVersions.html" title="class in org.apache.hadoop.hbase">TestMultiVersions</a></td>
 <td class="colLast">
 <div class="block">Port of old TestScanMultipleVersions, TestTimestamp and TestGetRowVersions
  from old testing framework to <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase"><code>HBaseTestingUtility</code></a>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestNamespace.html" title="class in org.apache.hadoop.hbase">TestNamespace</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestNodeHealthCheckChore.html" title="class in org.apache.hadoop.hbase">TestNodeHealthCheckChore</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestNodeHealthCheckChore.StoppableImplementation.html" title="class in org.apache.hadoop.hbase">TestNodeHealthCheckChore.StoppableImplementation</a></td>
 <td class="colLast">
 <div class="block">Simple helper class that just keeps track of whether or not its stopped.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestPartialResultsFromClientSide</a></td>
 <td class="colLast">
 <div class="block">These tests are focused on testing how partial results appear to a client.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">TestPerformanceEvaluation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestRegionLocations.html" title="class in org.apache.hadoop.hbase">TestRegionLocations</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestRegionMetrics.html" title="class in org.apache.hadoop.hbase">TestRegionMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestRegionRebalancing.html" title="class in org.apache.hadoop.hbase">TestRegionRebalancing</a></td>
 <td class="colLast">
 <div class="block">Test whether region re-balancing works.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestSequenceIdMonotonicallyIncreasing.html" title="class in org.apache.hadoop.hbase">TestSequenceIdMonotonicallyIncreasing</a></td>
 <td class="colLast">
 <div class="block">Testcase for HBASE-20066</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestSerialization.html" title="class in org.apache.hadoop.hbase">TestSerialization</a></td>
 <td class="colLast">
 <div class="block">Test HBase Writables serializations</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestServerMetrics.html" title="class in org.apache.hadoop.hbase">TestServerMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestServerName.html" title="class in org.apache.hadoop.hbase">TestServerName</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestServerSideScanMetricsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestServerSideScanMetricsFromClientSide</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestSize.html" title="class in org.apache.hadoop.hbase">TestSize</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestSplitMerge.html" title="class in org.apache.hadoop.hbase">TestSplitMerge</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestStochasticBalancerJmxMetrics.html" title="class in org.apache.hadoop.hbase">TestStochasticBalancerJmxMetrics</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></td>
 <td class="colLast">
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<div class="block">Tests for various kinds of TableNames.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase">TestTableName.Names</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestTagRewriteCell.html" title="class in org.apache.hadoop.hbase">TestTagRewriteCell</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestTagUtil.html" title="class in org.apache.hadoop.hbase">TestTagUtil</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestTimeout.html" title="class in org.apache.hadoop.hbase">TestTimeout</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestZooKeeper.html" title="class in org.apache.hadoop.hbase">TestZooKeeper</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TestZooKeeper.MockLoadBalancer.html" title="class in org.apache.hadoop.hbase">TestZooKeeper.MockLoadBalancer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TimedOutTestsListener.html" title="class in org.apache.hadoop.hbase">TimedOutTestsListener</a></td>
 <td class="colLast">
 <div class="block">JUnit run listener which prints full thread dump into System.err
  in case a test is failed due to timeout.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/TimestampTestBase.html" title="class in org.apache.hadoop.hbase">TimestampTestBase</a></td>
 <td class="colLast">
 <div class="block">Tests user specifiable time stamps putting, getting and scanning.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/hadoop/hbase/Waiter.html" title="class in org.apache.hadoop.hbase">Waiter</a></td>
 <td class="colLast">
 <div class="block">A class that provides a standard waitFor pattern
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 4b88053..24f9465 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -532,13 +532,14 @@
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestServerSideScanMetricsFromClientSide.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestServerSideScanMetricsFromClientSide</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestSize.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestSize</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestSplitMerge.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestSplitMerge</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName.Names</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTagRewriteCell.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTagRewriteCell</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTagUtil.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTagUtil</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTimeout.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTimeout</span></a></li>
 <li type="circle">org.junit.rules.TestWatcher (implements org.junit.rules.TestRule)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TableNameTestRule</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestZooKeeper.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestZooKeeper</span></a></li>
@@ -594,15 +595,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-use.html b/testdevapidocs/org/apache/hadoop/hbase/package-use.html
index e860d02..b2afe0f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-use.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-use.html
@@ -2419,8 +2419,8 @@
 <td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/QosTestHelper.html#org.apache.hadoop.hbase.regionserver">QosTestHelper</a>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TestTableName.html#org.apache.hadoop.hbase.regionserver">TestTableName</a>
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TableNameTestRule.html#org.apache.hadoop.hbase.regionserver">TableNameTestRule</a>
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </td>
 </tr>
 </tbody>
@@ -2743,8 +2743,8 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TestTableName.html#org.apache.hadoop.hbase.security.access">TestTableName</a>
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TableNameTestRule.html#org.apache.hadoop.hbase.security.access">TableNameTestRule</a>
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </td>
 </tr>
 </tbody>
@@ -2819,8 +2819,8 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TestTableName.html#org.apache.hadoop.hbase.snapshot">TestTableName</a>
-<div class="block">Returns a <code>byte[]</code> containing the name of the currently running test method.</div>
+<td class="colOne"><a href="../../../../org/apache/hadoop/hbase/class-use/TableNameTestRule.html#org.apache.hadoop.hbase.snapshot">TableNameTestRule</a>
+<div class="block">Returns a <code>TableName</code> based on currently running test method name.</div>
 </td>
 </tr>
 </tbody>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 52aa6c8..11b8fb7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -242,9 +242,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
index ca64276..a6b7a1f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
@@ -165,8 +165,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#testTable">testTable</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
@@ -309,13 +309,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#line.69">FAMILY_NAME</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#line.71">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#line.71">testTable</a></pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index aa5501f..c7da27f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -719,11 +719,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
index 188c3e2..3df5f08 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
@@ -116,7 +116,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.485">TestAccessController2.MyAccessController</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.484">TestAccessController2.MyAccessController</a>
 extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends org.apache.hadoop.hbase.security.access.AccessController</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MyAccessController</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html#line.485">MyAccessController</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html#line.484">MyAccessController</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.html
index a760599..38b91a4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.70">TestAccessController2</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.69">TestAccessController2</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 </li>
 </ul>
@@ -219,37 +219,37 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_ROW_3">TEST_ROW_3</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TEST_VALUE">TEST_VALUE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TESTGROUP_1">TESTGROUP_1</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TESTGROUP_1_NAME">TESTGROUP_1_NAME</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TESTGROUP_2">TESTGROUP_2</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TESTGROUP1_USER1">TESTGROUP1_USER1</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#TESTGROUP2_USER1">TESTGROUP2_USER1</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestAccessController2.html#tname">tname</a></span></code>&nbsp;</td>
@@ -369,7 +369,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.73">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.72">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -378,7 +378,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.76">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.75">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW">
@@ -387,7 +387,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.78">TEST_ROW</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.77">TEST_ROW</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY">
@@ -396,7 +396,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.79">TEST_FAMILY</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.78">TEST_FAMILY</a></pre>
 </li>
 </ul>
 <a name="TEST_QUALIFIER">
@@ -405,7 +405,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_QUALIFIER</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.80">TEST_QUALIFIER</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.79">TEST_QUALIFIER</a></pre>
 </li>
 </ul>
 <a name="TEST_VALUE">
@@ -414,7 +414,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_VALUE</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.81">TEST_VALUE</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.80">TEST_VALUE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -423,7 +423,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.83">TEST_UTIL</a></pre>
+<pre>private static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.82">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -432,7 +432,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.84">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.83">conf</a></pre>
 </li>
 </ul>
 <a name="systemUserConnection">
@@ -441,7 +441,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>systemUserConnection</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.89">systemUserConnection</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.88">systemUserConnection</a></pre>
 <div class="block">The systemUserConnection created here is tied to the system user. In case, you are planning
  to create AccessTestAction, DON'T use this systemUserConnection as the 'doAs' user
  gets  eclipsed by the system user.</div>
@@ -453,7 +453,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>Q1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.91">Q1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.90">Q1</a></pre>
 </li>
 </ul>
 <a name="value1">
@@ -462,7 +462,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>value1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.92">value1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.91">value1</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY_2">
@@ -471,7 +471,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY_2</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.94">TEST_FAMILY_2</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.93">TEST_FAMILY_2</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW_2">
@@ -480,7 +480,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW_2</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.95">TEST_ROW_2</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.94">TEST_ROW_2</a></pre>
 </li>
 </ul>
 <a name="Q2">
@@ -489,7 +489,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>Q2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.96">Q2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.95">Q2</a></pre>
 </li>
 </ul>
 <a name="value2">
@@ -498,7 +498,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>value2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.97">value2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.96">value2</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW_3">
@@ -507,7 +507,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW_3</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.99">TEST_ROW_3</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.98">TEST_ROW_3</a></pre>
 </li>
 </ul>
 <a name="TESTGROUP_1">
@@ -516,7 +516,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TESTGROUP_1</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.101">TESTGROUP_1</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.100">TESTGROUP_1</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.security.access.TestAccessController2.TESTGROUP_1">Constant Field Values</a></dd>
@@ -529,7 +529,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TESTGROUP_2</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.102">TESTGROUP_2</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.101">TESTGROUP_2</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.security.access.TestAccessController2.TESTGROUP_2">Constant Field Values</a></dd>
@@ -542,7 +542,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TESTGROUP1_USER1</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.104">TESTGROUP1_USER1</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.103">TESTGROUP1_USER1</a></pre>
 </li>
 </ul>
 <a name="TESTGROUP2_USER1">
@@ -551,16 +551,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TESTGROUP2_USER1</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.105">TESTGROUP2_USER1</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.104">TESTGROUP2_USER1</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.108">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.107">testTable</a></pre>
 </li>
 </ul>
 <a name="namespace">
@@ -569,7 +569,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>namespace</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.109">namespace</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.108">namespace</a></pre>
 </li>
 </ul>
 <a name="tname">
@@ -578,7 +578,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tname</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.110">tname</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.109">tname</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -587,7 +587,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.111">tableName</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.110">tableName</a></pre>
 </li>
 </ul>
 <a name="TESTGROUP_1_NAME">
@@ -596,7 +596,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TESTGROUP_1_NAME</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.112">TESTGROUP_1_NAME</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.111">TESTGROUP_1_NAME</a></pre>
 </li>
 </ul>
 </li>
@@ -613,7 +613,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAccessController2</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.70">TestAccessController2</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.69">TestAccessController2</a>()</pre>
 </li>
 </ul>
 </li>
@@ -630,7 +630,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.115">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.114">setupBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -644,7 +644,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.137">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.136">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -658,7 +658,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.160">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.159">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -672,7 +672,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.166">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.165">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -686,7 +686,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCreateWithCorrectOwner</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.181">testCreateWithCorrectOwner</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.180">testCreateWithCorrectOwner</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -700,7 +700,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCreateTableWithGroupPermissions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.217">testCreateTableWithGroupPermissions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.216">testCreateTableWithGroupPermissions</a>()
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -714,7 +714,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testACLTableAccess</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.242">testACLTableAccess</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.241">testACLTableAccess</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -728,7 +728,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testPostGrantAndRevokeScanAction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.351">testPostGrantAndRevokeScanAction</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.350">testPostGrantAndRevokeScanAction</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -742,7 +742,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCoprocessorLoading</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.489">testCoprocessorLoading</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.488">testCoprocessorLoading</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -756,7 +756,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testACLZNodeDeletion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.503">testACLZNodeDeletion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html#line.502">testACLZNodeDeletion</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
index 02a59ab..ab0e50f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.65">TestCellACLWithMultipleVersions</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.64">TestCellACLWithMultipleVersions</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 </li>
 </ul>
@@ -194,13 +194,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_ROW">TEST_ROW</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TWO">TWO</a></span></code>&nbsp;</td>
@@ -390,7 +390,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.68">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.67">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -399,16 +399,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.71">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.70">LOG</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.74">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.73">testTable</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -417,7 +417,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.75">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.74">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY1">
@@ -426,7 +426,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.76">TEST_FAMILY1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.75">TEST_FAMILY1</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY2">
@@ -435,7 +435,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.77">TEST_FAMILY2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.76">TEST_FAMILY2</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW">
@@ -444,7 +444,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.78">TEST_ROW</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.77">TEST_ROW</a></pre>
 </li>
 </ul>
 <a name="TEST_Q1">
@@ -453,7 +453,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.79">TEST_Q1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.78">TEST_Q1</a></pre>
 </li>
 </ul>
 <a name="TEST_Q2">
@@ -462,7 +462,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.80">TEST_Q2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.79">TEST_Q2</a></pre>
 </li>
 </ul>
 <a name="ZERO">
@@ -471,7 +471,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ZERO</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.81">ZERO</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.80">ZERO</a></pre>
 </li>
 </ul>
 <a name="ONE">
@@ -480,7 +480,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.82">ONE</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.81">ONE</a></pre>
 </li>
 </ul>
 <a name="TWO">
@@ -489,7 +489,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TWO</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.83">TWO</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.82">TWO</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -498,7 +498,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.85">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.84">conf</a></pre>
 </li>
 </ul>
 <a name="GROUP">
@@ -507,7 +507,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.87">GROUP</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.86">GROUP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.security.access.TestCellACLWithMultipleVersions.GROUP">Constant Field Values</a></dd>
@@ -520,7 +520,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_USER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.88">GROUP_USER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.87">GROUP_USER</a></pre>
 </li>
 </ul>
 <a name="USER_OWNER">
@@ -529,7 +529,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OWNER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.89">USER_OWNER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.88">USER_OWNER</a></pre>
 </li>
 </ul>
 <a name="USER_OTHER">
@@ -538,7 +538,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OTHER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.90">USER_OTHER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.89">USER_OTHER</a></pre>
 </li>
 </ul>
 <a name="USER_OTHER2">
@@ -547,7 +547,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OTHER2</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.91">USER_OTHER2</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.90">USER_OTHER2</a></pre>
 </li>
 </ul>
 <a name="usersAndGroups">
@@ -556,7 +556,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>usersAndGroups</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.93">usersAndGroups</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.92">usersAndGroups</a></pre>
 </li>
 </ul>
 </li>
@@ -573,7 +573,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestCellACLWithMultipleVersions</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.65">TestCellACLWithMultipleVersions</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.64">TestCellACLWithMultipleVersions</a>()</pre>
 </li>
 </ul>
 </li>
@@ -590,7 +590,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.96">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.95">setupBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -604,7 +604,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.130">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.129">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -618,7 +618,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.135">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.134">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -632,7 +632,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionwithVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.157">testCellPermissionwithVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.156">testCellPermissionwithVersions</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -646,7 +646,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareCellPermissions</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.247">prepareCel [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.246">prepareCel [...]
                                                                                               org.apache.hadoop.hbase.security.access.Permission.Action...&nbsp;action)</pre>
 </li>
 </ul>
@@ -656,7 +656,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsWithDeleteMutipleVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.256">testCellPermissionsWithDeleteMutipleVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.255">testCellPermissionsWithDeleteMutipleVersions</a>()
                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -670,7 +670,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForDeleteMultipleVersions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.359">verifyUserDeniedForDeleteMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.358">verifyUserDeniedForDeleteMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                        byte[]&nbsp;row,
                                                        byte[]&nbsp;q1,
                                                        byte[]&nbsp;q2)
@@ -689,7 +689,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteWithFutureTimestamp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.382">testDeleteWithFutureTimestamp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.381">testDeleteWithFutureTimestamp</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -703,7 +703,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>getDeleteFamilyAction</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.459">getDeleteFamilyAction</a>(byte[]&nbsp;fam)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.458">getDeleteFamilyAction</a>(byte[]&nbsp;fam)</pre>
 </li>
 </ul>
 <a name="testCellPermissionsWithDeleteWithUserTs--">
@@ -712,7 +712,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsWithDeleteWithUserTs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.476">testCellPermissionsWithDeleteWithUserTs</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.475">testCellPermissionsWithDeleteWithUserTs</a>()
                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -726,7 +726,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsWithDeleteExactVersion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.547">testCellPermissionsWithDeleteExactVersion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.546">testCellPermissionsWithDeleteExactVersion</a>()
                                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -740,7 +740,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForDeleteExactVersion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.630">verifyUserDeniedForDeleteExactVersion</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.629">verifyUserDeniedForDeleteExactVersion</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                    byte[]&nbsp;row,
                                                    byte[]&nbsp;q1,
                                                    byte[]&nbsp;q2)
@@ -759,7 +759,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsForIncrementWithMultipleVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.653">testCellPermissionsForIncrementWithMultipleVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.652">testCellPermissionsForIncrementWithMultipleVersions</a>()
                                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -773,7 +773,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForIncrementMultipleVersions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.719">verifyUserDeniedForIncrementMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.718">verifyUserDeniedForIncrementMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                           byte[]&nbsp;row,
                                                           byte[]&nbsp;q1)
                                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
@@ -791,7 +791,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsForPutWithMultipleVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.741">testCellPermissionsForPutWithMultipleVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.740">testCellPermissionsForPutWithMultipleVersions</a>()
                                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -805,7 +805,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForPutMultipleVersions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.814">verifyUserDeniedForPutMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.813">verifyUserDeniedForPutMultipleVersions</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                     byte[]&nbsp;row,
                                                     byte[]&nbsp;q1,
                                                     byte[]&nbsp;q2,
@@ -825,7 +825,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissionsForCheckAndDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.838">testCellPermissionsForCheckAndDelete</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.837">testCellPermissionsForCheckAndDelete</a>()
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -839,7 +839,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserAllowedforCheckAndDelete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.934">verifyUserAllowedforCheckAndDelete</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.933">verifyUserAllowedforCheckAndDelete</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                 byte[]&nbsp;row,
                                                 byte[]&nbsp;q1,
                                                 byte[]&nbsp;value)
@@ -858,7 +858,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForCheckAndDelete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.951">verifyUserDeniedForCheckAndDelete</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.950">verifyUserDeniedForCheckAndDelete</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                                byte[]&nbsp;row,
                                                byte[]&nbsp;value)
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
@@ -876,7 +876,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.971">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#line.970">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLs.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLs.html
index 283f791..8f1aecc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLs.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCellACLs.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.69">TestCellACLs</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.67">TestCellACLs</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 </li>
 </ul>
@@ -198,13 +198,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_ROW">TEST_ROW</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestCellACLs.html#USER_OTHER">USER_OTHER</a></span></code>&nbsp;</td>
@@ -329,7 +329,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.72">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.70">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -338,16 +338,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.75">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.73">LOG</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.78">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.76">testTable</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -356,7 +356,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.79">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.77">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY">
@@ -365,7 +365,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.80">TEST_FAMILY</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.78">TEST_FAMILY</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW">
@@ -374,7 +374,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.81">TEST_ROW</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.79">TEST_ROW</a></pre>
 </li>
 </ul>
 <a name="TEST_Q1">
@@ -383,7 +383,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.82">TEST_Q1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.80">TEST_Q1</a></pre>
 </li>
 </ul>
 <a name="TEST_Q2">
@@ -392,7 +392,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.83">TEST_Q2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.81">TEST_Q2</a></pre>
 </li>
 </ul>
 <a name="TEST_Q3">
@@ -401,7 +401,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q3</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.84">TEST_Q3</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.82">TEST_Q3</a></pre>
 </li>
 </ul>
 <a name="TEST_Q4">
@@ -410,7 +410,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q4</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.85">TEST_Q4</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.83">TEST_Q4</a></pre>
 </li>
 </ul>
 <a name="ZERO">
@@ -419,7 +419,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ZERO</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.86">ZERO</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.84">ZERO</a></pre>
 </li>
 </ul>
 <a name="ONE">
@@ -428,7 +428,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.87">ONE</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.85">ONE</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -437,7 +437,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.89">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.87">conf</a></pre>
 </li>
 </ul>
 <a name="GROUP">
@@ -446,7 +446,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.91">GROUP</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.89">GROUP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.security.access.TestCellACLs.GROUP">Constant Field Values</a></dd>
@@ -459,7 +459,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>GROUP_USER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.92">GROUP_USER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.90">GROUP_USER</a></pre>
 </li>
 </ul>
 <a name="USER_OWNER">
@@ -468,7 +468,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OWNER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.93">USER_OWNER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.91">USER_OWNER</a></pre>
 </li>
 </ul>
 <a name="USER_OTHER">
@@ -477,7 +477,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OTHER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.94">USER_OTHER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.92">USER_OTHER</a></pre>
 </li>
 </ul>
 <a name="usersAndGroups">
@@ -486,7 +486,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>usersAndGroups</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.95">usersAndGroups</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.93">usersAndGroups</a></pre>
 </li>
 </ul>
 </li>
@@ -503,7 +503,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestCellACLs</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.69">TestCellACLs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.67">TestCellACLs</a>()</pre>
 </li>
 </ul>
 </li>
@@ -520,7 +520,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.98">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.96">setupBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -534,7 +534,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.132">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.130">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -548,7 +548,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.137">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.135">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -562,7 +562,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellPermissions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.152">testCellPermissions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.150">testCellPermissions</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -576,7 +576,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCoveringCheck</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.379">testCoveringCheck</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.377">testCoveringCheck</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Insure we are not granting access in the absence of any cells found
  when scanning for covered cells.</div>
@@ -592,7 +592,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserDeniedForWrite</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.419">verifyUserDeniedForWrite</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.417">verifyUserDeniedForWrite</a>(org.apache.hadoop.hbase.security.User&nbsp;user,
                                       byte[]&nbsp;value)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
@@ -607,7 +607,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyUserAllowedForRead</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.434">verifyUserAllowedForRead</a>(org.apache.hadoop.hbase.security.User&nbsp;user)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.432">verifyUserAllowedForRead</a>(org.apache.hadoop.hbase.security.User&nbsp;user)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -621,7 +621,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareCellPermissions</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.446">prepareCellPermissions</a>(<a [...]
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.security.access.Permission&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.444">prepareCellPermissions</a>(<a [...]
                                                                                               org.apache.hadoop.hbase.security.access.Permission.Action...&nbsp;action)</pre>
 </li>
 </ul>
@@ -631,7 +631,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.455">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestCellACLs.html#line.453">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html
index d9dbc97..402c741 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.59">TestScanEarlyTermination</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.58">TestScanEarlyTermination</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 </li>
 </ul>
@@ -182,13 +182,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_ROW">TEST_ROW</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#USER_OTHER">USER_OTHER</a></span></code>&nbsp;</td>
@@ -288,7 +288,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.62">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.61">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -297,16 +297,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.65">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.64">LOG</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.68">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.67">testTable</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -315,7 +315,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.69">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.68">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY1">
@@ -324,7 +324,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.70">TEST_FAMILY1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.69">TEST_FAMILY1</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY2">
@@ -333,7 +333,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.71">TEST_FAMILY2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.70">TEST_FAMILY2</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW">
@@ -342,7 +342,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.72">TEST_ROW</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.71">TEST_ROW</a></pre>
 </li>
 </ul>
 <a name="TEST_Q1">
@@ -351,7 +351,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.73">TEST_Q1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.72">TEST_Q1</a></pre>
 </li>
 </ul>
 <a name="TEST_Q2">
@@ -360,7 +360,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.74">TEST_Q2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.73">TEST_Q2</a></pre>
 </li>
 </ul>
 <a name="ZERO">
@@ -369,7 +369,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ZERO</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.75">ZERO</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.74">ZERO</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -378,7 +378,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.77">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.76">conf</a></pre>
 </li>
 </ul>
 <a name="USER_OWNER">
@@ -387,7 +387,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OWNER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.79">USER_OWNER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.78">USER_OWNER</a></pre>
 </li>
 </ul>
 <a name="USER_OTHER">
@@ -396,7 +396,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>USER_OTHER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.80">USER_OTHER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.79">USER_OTHER</a></pre>
 </li>
 </ul>
 </li>
@@ -413,7 +413,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestScanEarlyTermination</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.59">TestScanEarlyTermination</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.58">TestScanEarlyTermination</a>()</pre>
 </li>
 </ul>
 </li>
@@ -430,7 +430,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.83">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.82">setupBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -444,7 +444,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.112">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.111">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -458,7 +458,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.117">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.116">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -472,7 +472,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.137">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.136">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -486,7 +486,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testEarlyScanTermination</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.149">testEarlyScanTermination</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestScanEarlyTermination.html#line.148">testEarlyScanTermination</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html
index 25cac6b..54d8d83 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.85">TestWithDisabledAuthorization</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.83">TestWithDisabledAuthorization</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.html" title="class in org.apache.hadoop.hbase.security.access">SecureTestUtil</a></pre>
 </li>
 </ul>
@@ -206,13 +206,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_ROW">TEST_ROW</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.security.User</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#USER_ADMIN">USER_ADMIN</a></span></code>&nbsp;</td>
@@ -360,7 +360,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.88">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.86">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -369,7 +369,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.91">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.89">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -378,7 +378,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.92">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.90">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY">
@@ -387,7 +387,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.94">TEST_FAMILY</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.92">TEST_FAMILY</a></pre>
 </li>
 </ul>
 <a name="TEST_FAMILY2">
@@ -396,7 +396,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_FAMILY2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.95">TEST_FAMILY2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.93">TEST_FAMILY2</a></pre>
 </li>
 </ul>
 <a name="TEST_ROW">
@@ -405,7 +405,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_ROW</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.96">TEST_ROW</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.94">TEST_ROW</a></pre>
 </li>
 </ul>
 <a name="TEST_Q1">
@@ -414,7 +414,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q1</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.97">TEST_Q1</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.95">TEST_Q1</a></pre>
 </li>
 </ul>
 <a name="TEST_Q2">
@@ -423,7 +423,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q2</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.98">TEST_Q2</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.96">TEST_Q2</a></pre>
 </li>
 </ul>
 <a name="TEST_Q3">
@@ -432,7 +432,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q3</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.99">TEST_Q3</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.97">TEST_Q3</a></pre>
 </li>
 </ul>
 <a name="TEST_Q4">
@@ -441,7 +441,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_Q4</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.100">TEST_Q4</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.98">TEST_Q4</a></pre>
 </li>
 </ul>
 <a name="ZERO">
@@ -450,7 +450,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ZERO</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.101">ZERO</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.99">ZERO</a></pre>
 </li>
 </ul>
 <a name="CP_ENV">
@@ -459,7 +459,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>CP_ENV</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.103">CP_ENV</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.101">CP_ENV</a></pre>
 </li>
 </ul>
 <a name="ACCESS_CONTROLLER">
@@ -468,7 +468,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>ACCESS_CONTROLLER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.access.AccessController <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.104">ACCESS_CONTROLLER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.access.AccessController <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.102">ACCESS_CONTROLLER</a></pre>
 </li>
 </ul>
 <a name="RSCP_ENV">
@@ -477,7 +477,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>RSCP_ENV</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.105">RSCP_ENV</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.103">RSCP_ENV</a></pre>
 </li>
 </ul>
 <a name="RCP_ENV">
@@ -486,16 +486,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>RCP_ENV</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.106">RCP_ENV</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.104">RCP_ENV</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.108">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.106">testTable</a></pre>
 </li>
 </ul>
 <a name="SUPERUSER">
@@ -504,7 +504,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>SUPERUSER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.113">SUPERUSER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.111">SUPERUSER</a></pre>
 </li>
 </ul>
 <a name="USER_ADMIN">
@@ -513,7 +513,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_ADMIN</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.115">USER_ADMIN</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.113">USER_ADMIN</a></pre>
 </li>
 </ul>
 <a name="USER_RW">
@@ -522,7 +522,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_RW</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.117">USER_RW</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.115">USER_RW</a></pre>
 </li>
 </ul>
 <a name="USER_RO">
@@ -531,7 +531,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_RO</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.119">USER_RO</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.117">USER_RO</a></pre>
 </li>
 </ul>
 <a name="USER_OWNER">
@@ -540,7 +540,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_OWNER</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.121">USER_OWNER</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.119">USER_OWNER</a></pre>
 </li>
 </ul>
 <a name="USER_CREATE">
@@ -549,7 +549,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_CREATE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.123">USER_CREATE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.121">USER_CREATE</a></pre>
 </li>
 </ul>
 <a name="USER_NONE">
@@ -558,7 +558,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>USER_NONE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.125">USER_NONE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.123">USER_NONE</a></pre>
 </li>
 </ul>
 <a name="USER_QUAL">
@@ -567,7 +567,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>USER_QUAL</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.127">USER_QUAL</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.security.User <a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.125">USER_QUAL</a></pre>
 </li>
 </ul>
 </li>
@@ -584,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestWithDisabledAuthorization</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.85">TestWithDisabledAuthorization</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.83">TestWithDisabledAuthorization</a>()</pre>
 </li>
 </ul>
 </li>
@@ -601,7 +601,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.130">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.128">setupBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -615,7 +615,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.172">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.170">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -629,7 +629,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.177">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.175">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -643,7 +643,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.227">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.225">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -657,7 +657,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckPermissions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.243">testCheckPermissions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.241">testCheckPermissions</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -671,7 +671,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testPassiveGrantRevoke</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.411">testPassiveGrantRevoke</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.409">testPassiveGrantRevoke</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test grants and revocations with authorization disabled</div>
 <dl>
@@ -686,7 +686,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testPassiveMasterOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.469">testPassiveMasterOperations</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.467">testPassiveMasterOperations</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test master observer</div>
 <dl>
@@ -701,7 +701,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testPassiveRegionServerOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.773">testPassiveRegionServerOperations</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.771">testPassiveRegionServerOperations</a>()
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test region server observer</div>
 <dl>
@@ -716,7 +716,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockList">
 <li class="blockList">
 <h4>testPassiveRegionOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.796">testPassiveRegionOperations</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.794">testPassiveRegionOperations</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test region observer</div>
 <dl>
@@ -731,7 +731,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/security/access/Secur
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testPassiveCellPermissions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.934">testPassiveCellPermissions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.html#line.932">testPassiveCellPermissions</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html
index af30f21..1118142 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html
@@ -157,13 +157,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -275,13 +275,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#line.54">LOG</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#line.56">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#line.56">testTable</a></pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
index 02b3216..572558b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
@@ -163,13 +163,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TABLE_NAME">TABLE_NAME</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#testTable">testTable</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#VALUE">VALUE</a></span></code>&nbsp;</td>
@@ -355,13 +355,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private static&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.75">TABLE</a></pre>
 </li>
 </ul>
-<a name="TEST_TABLE">
+<a name="testTable">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>TEST_TABLE</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.78">TEST_TABLE</a></pre>
+<h4>testTable</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase">TableNameTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.78">testTable</a></pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index a463e8c..317d19f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -254,9 +254,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index a8b0f08..51e93c5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -163,9 +163,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index 871a4c3..3528730 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -4201,6 +4201,7 @@
 </li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestTableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TestTableMapReduceUtil</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapred.<a href="org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapred"><span class="typeNameLink">TestTableMapReduceUtil</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.Names.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName.Names</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableOperationException.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestTableOperationException</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
@@ -4331,7 +4332,7 @@
 <li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestWarmupRegion.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">TestWarmupRegion</span></a></li>
 <li type="circle">org.junit.rules.TestWatcher (implements org.junit.rules.TestRule)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TestTableName</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TableNameTestRule.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">TableNameTestRule</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestWeakObjectPool.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">TestWeakObjectPool</span></a></li>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TableNameTestRule.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TableNameTestRule.html
new file mode 100644
index 0000000..9c1ef31
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TableNameTestRule.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import org.junit.rules.TestWatcher;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import org.junit.runner.Description;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>/**<a name="line.23"></a>
+<span class="sourceLineNo">024</span> * Returns a {@code TableName} based on currently running test method name.<a name="line.24"></a>
+<span class="sourceLineNo">025</span> */<a name="line.25"></a>
+<span class="sourceLineNo">026</span>public class TableNameTestRule extends TestWatcher {<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>  private TableName tableName;<a name="line.28"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>  @Override<a name="line.30"></a>
+<span class="sourceLineNo">031</span>  protected void starting(Description description) {<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    tableName = TableName.valueOf(description.getMethodName());<a name="line.32"></a>
+<span class="sourceLineNo">033</span>  }<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>  public TableName getTableName() {<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    return tableName;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
+<span class="sourceLineNo">038</span>}<a name="line.38"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.Names.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.Names.html
index 2e16dbb..cedabbc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.Names.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.Names.html
@@ -6,7 +6,7 @@
 </head>
 <body>
 <div class="sourceContainer">
-<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
 <span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
 <span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
 <span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
@@ -28,188 +28,154 @@
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertArrayEquals;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.junit.Assert.assertEquals;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertSame;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.fail;<a name="line.23"></a>
-<span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.nio.ByteBuffer;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.MiscTests;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.junit.Test;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.experimental.categories.Category;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.junit.rules.TestWatcher;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.junit.runner.Description;<a name="line.35"></a>
-<span class="sourceLineNo">036</span><a name="line.36"></a>
-<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * Returns a {@code byte[]} containing the name of the currently running test method.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> */<a name="line.39"></a>
-<span class="sourceLineNo">040</span>@Category({MiscTests.class, MediumTests.class})<a name="line.40"></a>
-<span class="sourceLineNo">041</span>public class TestTableName extends TestWatcher {<a name="line.41"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertThrows;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.nio.ByteBuffer;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.testclassification.MiscTests;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.junit.ClassRule;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.junit.Test;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.experimental.categories.Category;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * Tests for various kinds of TableNames.<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@Category({MiscTests.class, SmallTests.class})<a name="line.37"></a>
+<span class="sourceLineNo">038</span>public class TestTableName {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @ClassRule<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      HBaseClassTestRule.forClass(TestTableName.class);<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  @ClassRule<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.44"></a>
-<span class="sourceLineNo">045</span>      HBaseClassTestRule.forClass(TestTableName.class);<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  private TableName tableName;<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  /**<a name="line.49"></a>
-<span class="sourceLineNo">050</span>   * Invoked when a test is about to start<a name="line.50"></a>
-<span class="sourceLineNo">051</span>   */<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  @Override<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  protected void starting(Description description) {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    tableName = TableName.valueOf(description.getMethodName());<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  public TableName getTableName() {<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    return tableName;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
+<span class="sourceLineNo">043</span>  private static String[] emptyNames = {"", " "};<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  private static String[] invalidNamespace = {":a", "%:a"};<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private static String[] legalTableNames = {"foo", "with-dash_under.dot", "_under_start_ok",<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02",<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2",<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    "trailingdots..", "trailing.dots...", "ns:mytable", "ns:_mytable_", "ns:my_table_01-02"};<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private static String[] illegalTableNames = {".dot_start_illegal", "-dash_start_illegal",<a name="line.49"></a>
+<span class="sourceLineNo">050</span>    "spaces not ok", "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash",<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"};<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  static class Names {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    String ns;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    byte[] nsb;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    String tn;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    byte[] tnb;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    String nn;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    byte[] nnb;<a name="line.59"></a>
 <span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  String[] emptyNames = {"", " "};<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  String[] invalidNamespace = {":a", "%:a"};<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  String[] legalTableNames = {"foo", "with-dash_under.dot", "_under_start_ok",<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02",<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2",<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    "trailingdots..", "trailing.dots...", "ns:mytable", "ns:_mytable_", "ns:my_table_01-02"};<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  String[] illegalTableNames = {".dot_start_illegal", "-dash_start_illegal", "spaces not ok",<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash",<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"};<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @Test(expected = IllegalArgumentException.class)<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public void testInvalidNamespace() {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    for (String tn : invalidNamespace) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      fail("invalid namespace " + tn<a name="line.76"></a>
-<span class="sourceLineNo">077</span>          + " should have failed with IllegalArgumentException for namespace");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">061</span>    Names(String ns, String tn) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      this.ns = ns;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      nsb = Bytes.toBytes(ns);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      this.tn = tn;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      tnb = Bytes.toBytes(tn);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      nn = this.ns + ":" + this.tn;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      nnb = Bytes.toBytes(nn);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @Override<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    public boolean equals(Object o) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      if (this == o) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        return true;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      }<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      if (o == null || getClass() != o.getClass()) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>        return false;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>      Names names = (Names) o;<a name="line.79"></a>
 <span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Test(expected = IllegalArgumentException.class)<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void testEmptyNamespaceName() {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    for (String nn : emptyNames) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      TableName.isLegalNamespaceName(Bytes.toBytes(nn));<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      fail("invalid Namespace name " + nn + " should have failed with IllegalArgumentException");<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @Test(expected = IllegalArgumentException.class)<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public void testEmptyTableName() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    for (String tn : emptyNames) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      fail("invalid tablename " + tn + " should have failed with IllegalArgumentException");<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testLegalHTableNames() {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    for (String tn : legalTableNames) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  @Test<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public void testIllegalHTableNames() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    for (String tn : illegalTableNames) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      try {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        fail("invalid tablename " + tn + " should have failed");<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      } catch (Exception e) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // expected<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  static class Names {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    String ns;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    byte[] nsb;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    String tn;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    byte[] tnb;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    String nn;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    byte[] nnb;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    Names(String ns, String tn) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.ns = ns;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      nsb = Bytes.toBytes(ns);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      this.tn = tn;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      tnb = Bytes.toBytes(tn);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      nn = this.ns + ":" + this.tn;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      nnb = Bytes.toBytes(nn);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    public boolean equals(Object o) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (this == o) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        return true;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      if (o == null || getClass() != o.getClass()) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        return false;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Names names = (Names) o;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>      if (!ns.equals(names.ns)) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        return false;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      if (!tn.equals(names.tn)) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        return false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>      return true;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    @Override<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    public int hashCode() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      int result = ns.hashCode();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      result = 31 * result + tn.hashCode();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return result;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  Names[] names = new Names[] {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    new Names("n1", "n1"),<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    new Names("n2", "n2"),<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    new Names("table1", "table1"),<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    new Names("table2", "table2"),<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    new Names("table2", "table1"),<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    new Names("table1", "table2"),<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    new Names("n1", "table1"),<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    new Names("n1", "table1"),<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    new Names("n2", "table2"),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    new Names("n2", "table2")<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  };<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  @Test<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  public void testValueOf() {<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Map&lt;String, TableName&gt; inCache = new HashMap&lt;&gt;();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // fill cache<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    for (Names name : names) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      inCache.put(name.nn, TableName.valueOf(name.ns, name.tn));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    for (Names name : names) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.ns, name.tn), name));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nsb, name.tnb), name));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nn), name));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nnb), name));<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>          ByteBuffer.wrap(name.nsb), ByteBuffer.wrap(name.tnb)), name));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private TableName validateNames(TableName expected, Names names) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(expected.getNameAsString(), names.nn);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertArrayEquals(expected.getName(), names.nnb);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    assertEquals(expected.getQualifierAsString(), names.tn);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    assertArrayEquals(expected.getQualifier(), names.tnb);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals(expected.getNamespaceAsString(), names.ns);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    assertArrayEquals(expected.getNamespace(), names.nsb);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    return expected;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>}<a name="line.204"></a>
+<span class="sourceLineNo">081</span>      if (!ns.equals(names.ns)) {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        return false;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      if (!tn.equals(names.tn)) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        return false;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      return true;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>    @Override<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    public int hashCode() {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      int result = ns.hashCode();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      result = 31 * result + tn.hashCode();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      return result;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Names[] names = new Names[] {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    new Names("n1", "n1"),<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    new Names("n2", "n2"),<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    new Names("table1", "table1"),<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new Names("table2", "table2"),<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    new Names("table2", "table1"),<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    new Names("table1", "table2"),<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    new Names("n1", "table1"),<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    new Names("n1", "table1"),<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    new Names("n2", "table2"),<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    new Names("n2", "table2")<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  };<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test public void testInvalidNamespace() {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    for (String tn : invalidNamespace) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      assertThrows(IllegalArgumentException.class,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @Test public void testEmptyNamespaceName() {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    for (String nn : emptyNames) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      assertThrows(IllegalArgumentException.class,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        () -&gt; TableName.isLegalNamespaceName(Bytes.toBytes(nn)));<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test public void testEmptyTableName() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    for (String tn : emptyNames) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      assertThrows(IllegalArgumentException.class,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test public void testLegalHTableNames() {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (String tn : legalTableNames) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  @Test public void testIllegalHTableNames() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    for (String tn : illegalTableNames) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      assertThrows(Exception.class,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Test public void testValueOf() {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Map&lt;String, TableName&gt; inCache = new HashMap&lt;&gt;();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    // fill cache<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    for (Names name : names) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      inCache.put(name.nn, TableName.valueOf(name.ns, name.tn));<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (Names name : names) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.ns, name.tn), name));<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nsb, name.tnb), name));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nn), name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nnb), name));<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          ByteBuffer.wrap(name.nsb), ByteBuffer.wrap(name.tnb)), name));<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  private TableName validateNames(TableName expected, Names names) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(expected.getNameAsString(), names.nn);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertArrayEquals(expected.getName(), names.nnb);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    assertEquals(expected.getQualifierAsString(), names.tn);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    assertArrayEquals(expected.getQualifier(), names.tnb);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertEquals(expected.getNamespaceAsString(), names.ns);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    assertArrayEquals(expected.getNamespace(), names.nsb);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    return expected;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>}<a name="line.170"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.html
index 2e16dbb..cedabbc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestTableName.html
@@ -6,7 +6,7 @@
 </head>
 <body>
 <div class="sourceContainer">
-<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
 <span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
 <span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
 <span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
@@ -28,188 +28,154 @@
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertArrayEquals;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.junit.Assert.assertEquals;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertSame;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.fail;<a name="line.23"></a>
-<span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.nio.ByteBuffer;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.MiscTests;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.junit.Test;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.experimental.categories.Category;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.junit.rules.TestWatcher;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.junit.runner.Description;<a name="line.35"></a>
-<span class="sourceLineNo">036</span><a name="line.36"></a>
-<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * Returns a {@code byte[]} containing the name of the currently running test method.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> */<a name="line.39"></a>
-<span class="sourceLineNo">040</span>@Category({MiscTests.class, MediumTests.class})<a name="line.40"></a>
-<span class="sourceLineNo">041</span>public class TestTableName extends TestWatcher {<a name="line.41"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertThrows;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.nio.ByteBuffer;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.testclassification.MiscTests;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.junit.ClassRule;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.junit.Test;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.experimental.categories.Category;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * Tests for various kinds of TableNames.<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@Category({MiscTests.class, SmallTests.class})<a name="line.37"></a>
+<span class="sourceLineNo">038</span>public class TestTableName {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  @ClassRule<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      HBaseClassTestRule.forClass(TestTableName.class);<a name="line.41"></a>
 <span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  @ClassRule<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.44"></a>
-<span class="sourceLineNo">045</span>      HBaseClassTestRule.forClass(TestTableName.class);<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  private TableName tableName;<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  /**<a name="line.49"></a>
-<span class="sourceLineNo">050</span>   * Invoked when a test is about to start<a name="line.50"></a>
-<span class="sourceLineNo">051</span>   */<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  @Override<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  protected void starting(Description description) {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    tableName = TableName.valueOf(description.getMethodName());<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  public TableName getTableName() {<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    return tableName;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
+<span class="sourceLineNo">043</span>  private static String[] emptyNames = {"", " "};<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  private static String[] invalidNamespace = {":a", "%:a"};<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  private static String[] legalTableNames = {"foo", "with-dash_under.dot", "_under_start_ok",<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02",<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2",<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    "trailingdots..", "trailing.dots...", "ns:mytable", "ns:_mytable_", "ns:my_table_01-02"};<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private static String[] illegalTableNames = {".dot_start_illegal", "-dash_start_illegal",<a name="line.49"></a>
+<span class="sourceLineNo">050</span>    "spaces not ok", "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash",<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"};<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>  static class Names {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    String ns;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    byte[] nsb;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    String tn;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    byte[] tnb;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    String nn;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    byte[] nnb;<a name="line.59"></a>
 <span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  String[] emptyNames = {"", " "};<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  String[] invalidNamespace = {":a", "%:a"};<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  String[] legalTableNames = {"foo", "with-dash_under.dot", "_under_start_ok",<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02",<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2",<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    "trailingdots..", "trailing.dots...", "ns:mytable", "ns:_mytable_", "ns:my_table_01-02"};<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  String[] illegalTableNames = {".dot_start_illegal", "-dash_start_illegal", "spaces not ok",<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash",<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"};<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @Test(expected = IllegalArgumentException.class)<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public void testInvalidNamespace() {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    for (String tn : invalidNamespace) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      fail("invalid namespace " + tn<a name="line.76"></a>
-<span class="sourceLineNo">077</span>          + " should have failed with IllegalArgumentException for namespace");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
+<span class="sourceLineNo">061</span>    Names(String ns, String tn) {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      this.ns = ns;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      nsb = Bytes.toBytes(ns);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      this.tn = tn;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      tnb = Bytes.toBytes(tn);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      nn = this.ns + ":" + this.tn;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      nnb = Bytes.toBytes(nn);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @Override<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    public boolean equals(Object o) {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>      if (this == o) {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        return true;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      }<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      if (o == null || getClass() != o.getClass()) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>        return false;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>      Names names = (Names) o;<a name="line.79"></a>
 <span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Test(expected = IllegalArgumentException.class)<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void testEmptyNamespaceName() {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    for (String nn : emptyNames) {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      TableName.isLegalNamespaceName(Bytes.toBytes(nn));<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      fail("invalid Namespace name " + nn + " should have failed with IllegalArgumentException");<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @Test(expected = IllegalArgumentException.class)<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public void testEmptyTableName() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    for (String tn : emptyNames) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      fail("invalid tablename " + tn + " should have failed with IllegalArgumentException");<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Test<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public void testLegalHTableNames() {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    for (String tn : legalTableNames) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  }<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  @Test<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public void testIllegalHTableNames() {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    for (String tn : illegalTableNames) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      try {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        fail("invalid tablename " + tn + " should have failed");<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      } catch (Exception e) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // expected<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>  static class Names {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    String ns;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    byte[] nsb;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    String tn;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    byte[] tnb;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    String nn;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    byte[] nnb;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>    Names(String ns, String tn) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.ns = ns;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      nsb = Bytes.toBytes(ns);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      this.tn = tn;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      tnb = Bytes.toBytes(tn);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      nn = this.ns + ":" + this.tn;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      nnb = Bytes.toBytes(nn);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    public boolean equals(Object o) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (this == o) {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>        return true;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      if (o == null || getClass() != o.getClass()) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        return false;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Names names = (Names) o;<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>      if (!ns.equals(names.ns)) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        return false;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      }<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      if (!tn.equals(names.tn)) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        return false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>      return true;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>    @Override<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    public int hashCode() {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      int result = ns.hashCode();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      result = 31 * result + tn.hashCode();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return result;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    }<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  Names[] names = new Names[] {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    new Names("n1", "n1"),<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    new Names("n2", "n2"),<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    new Names("table1", "table1"),<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    new Names("table2", "table2"),<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    new Names("table2", "table1"),<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    new Names("table1", "table2"),<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    new Names("n1", "table1"),<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    new Names("n1", "table1"),<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    new Names("n2", "table2"),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    new Names("n2", "table2")<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  };<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  @Test<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  public void testValueOf() {<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Map&lt;String, TableName&gt; inCache = new HashMap&lt;&gt;();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // fill cache<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    for (Names name : names) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      inCache.put(name.nn, TableName.valueOf(name.ns, name.tn));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    for (Names name : names) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.ns, name.tn), name));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nsb, name.tnb), name));<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nn), name));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nnb), name));<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(<a name="line.188"></a>
-<span class="sourceLineNo">189</span>          ByteBuffer.wrap(name.nsb), ByteBuffer.wrap(name.tnb)), name));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private TableName validateNames(TableName expected, Names names) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(expected.getNameAsString(), names.nn);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertArrayEquals(expected.getName(), names.nnb);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    assertEquals(expected.getQualifierAsString(), names.tn);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    assertArrayEquals(expected.getQualifier(), names.tnb);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals(expected.getNamespaceAsString(), names.ns);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    assertArrayEquals(expected.getNamespace(), names.nsb);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    return expected;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>}<a name="line.204"></a>
+<span class="sourceLineNo">081</span>      if (!ns.equals(names.ns)) {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        return false;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      }<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      if (!tn.equals(names.tn)) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        return false;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      return true;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>    @Override<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    public int hashCode() {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      int result = ns.hashCode();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      result = 31 * result + tn.hashCode();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      return result;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Names[] names = new Names[] {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    new Names("n1", "n1"),<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    new Names("n2", "n2"),<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    new Names("table1", "table1"),<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new Names("table2", "table2"),<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    new Names("table2", "table1"),<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    new Names("table1", "table2"),<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    new Names("n1", "table1"),<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    new Names("n1", "table1"),<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    new Names("n2", "table2"),<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    new Names("n2", "table2")<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  };<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Test public void testInvalidNamespace() {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    for (String tn : invalidNamespace) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      assertThrows(IllegalArgumentException.class,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @Test public void testEmptyNamespaceName() {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    for (String nn : emptyNames) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      assertThrows(IllegalArgumentException.class,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        () -&gt; TableName.isLegalNamespaceName(Bytes.toBytes(nn)));<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Test public void testEmptyTableName() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    for (String tn : emptyNames) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      assertThrows(IllegalArgumentException.class,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test public void testLegalHTableNames() {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    for (String tn : legalTableNames) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn));<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  @Test public void testIllegalHTableNames() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    for (String tn : illegalTableNames) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      assertThrows(Exception.class,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        () -&gt; TableName.isLegalFullyQualifiedTableName(Bytes.toBytes(tn)));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @Test public void testValueOf() {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Map&lt;String, TableName&gt; inCache = new HashMap&lt;&gt;();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    // fill cache<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    for (Names name : names) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      inCache.put(name.nn, TableName.valueOf(name.ns, name.tn));<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (Names name : names) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.ns, name.tn), name));<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nsb, name.tnb), name));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nn), name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(name.nnb), name));<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      assertSame(inCache.get(name.nn), validateNames(TableName.valueOf(<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          ByteBuffer.wrap(name.nsb), ByteBuffer.wrap(name.tnb)), name));<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  private TableName validateNames(TableName expected, Names names) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertEquals(expected.getNameAsString(), names.nn);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertArrayEquals(expected.getName(), names.nnb);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    assertEquals(expected.getQualifierAsString(), names.tn);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    assertArrayEquals(expected.getQualifier(), names.tnb);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertEquals(expected.getNamespaceAsString(), names.ns);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    assertArrayEquals(expected.getNamespace(), names.nsb);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    return expected;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>}<a name="line.170"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
index 0250f8f..749ad50 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
@@ -38,7 +38,7 @@
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.30"></a>
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TestTableName;<a name="line.33"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableNameTestRule;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Put;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Result;<a name="line.36"></a>
@@ -76,7 +76,7 @@
 <span class="sourceLineNo">068</span>  private static final String FAMILY_NAME_STR = "f";<a name="line.68"></a>
 <span class="sourceLineNo">069</span>  private static final byte[] FAMILY_NAME = Bytes.toBytes(FAMILY_NAME_STR);<a name="line.69"></a>
 <span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  @Rule public TestTableName TEST_TABLE = new TestTableName();<a name="line.71"></a>
+<span class="sourceLineNo">071</span>  @Rule public TableNameTestRule testTable = new TableNameTestRule();<a name="line.71"></a>
 <span class="sourceLineNo">072</span><a name="line.72"></a>
 <span class="sourceLineNo">073</span>  public static class FaultyScannerObserver implements RegionCoprocessor, RegionObserver {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    private int faults = 0;<a name="line.74"></a>
@@ -124,7 +124,7 @@
 <span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span>  @Test<a name="line.117"></a>
 <span class="sourceLineNo">118</span>  public void testFaultyScanner() throws Exception {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    TableName tableName = TEST_TABLE.getTableName();<a name="line.119"></a>
+<span class="sourceLineNo">119</span>    TableName tableName = testTable.getTableName();<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    Table table = UTIL.createTable(tableName, FAMILY_NAME);<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    try {<a name="line.121"></a>
 <span class="sourceLineNo">122</span>      final int NUM_ROWS = 100;<a name="line.122"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
index 0250f8f..749ad50 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html
@@ -38,7 +38,7 @@
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.30"></a>
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TestTableName;<a name="line.33"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableNameTestRule;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Put;<a name="line.35"></a>
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Result;<a name="line.36"></a>
@@ -76,7 +76,7 @@
 <span class="sourceLineNo">068</span>  private static final String FAMILY_NAME_STR = "f";<a name="line.68"></a>
 <span class="sourceLineNo">069</span>  private static final byte[] FAMILY_NAME = Bytes.toBytes(FAMILY_NAME_STR);<a name="line.69"></a>
 <span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  @Rule public TestTableName TEST_TABLE = new TestTableName();<a name="line.71"></a>
+<span class="sourceLineNo">071</span>  @Rule public TableNameTestRule testTable = new TableNameTestRule();<a name="line.71"></a>
 <span class="sourceLineNo">072</span><a name="line.72"></a>
 <span class="sourceLineNo">073</span>  public static class FaultyScannerObserver implements RegionCoprocessor, RegionObserver {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    private int faults = 0;<a name="line.74"></a>
@@ -124,7 +124,7 @@
 <span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span>  @Test<a name="line.117"></a>
 <span class="sourceLineNo">118</span>  public void testFaultyScanner() throws Exception {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    TableName tableName = TEST_TABLE.getTableName();<a name="line.119"></a>
+<span class="sourceLineNo">119</span>    TableName tableName = testTable.getTableName();<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    Table table = UTIL.createTable(tableName, FAMILY_NAME);<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    try {<a name="line.121"></a>
 <span class="sourceLineNo">122</span>      final int NUM_ROWS = 100;<a name="line.122"></a>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
index ccffe4f..dd36ffe 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
@@ -30,514 +30,513 @@
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertFalse;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Arrays;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.conf.Configuration;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.TableName;<a name="line.36"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.conf.Configuration;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HConstants;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.TableName;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.TableNameTestRule;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TestTableName;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Put;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Result;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Table;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.After;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.AfterClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Before;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.BeforeClass;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.ClassRule;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.Rule;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.Test;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.junit.experimental.categories.Category;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.Logger;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.slf4j.LoggerFactory;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>@Category({SecurityTests.class, LargeTests.class})<a name="line.69"></a>
-<span class="sourceLineNo">070</span>public class TestAccessController2 extends SecureTestUtil {<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @ClassRule<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      HBaseClassTestRule.forClass(TestAccessController2.class);<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAccessController2.class);<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final byte[] TEST_ROW = Bytes.toBytes("test");<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final byte[] TEST_FAMILY = Bytes.toBytes("f");<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final byte[] TEST_QUALIFIER = Bytes.toBytes("q");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static final byte[] TEST_VALUE = Bytes.toBytes("value");<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static Configuration conf;<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /** The systemUserConnection created here is tied to the system user. In case, you are planning<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * to create AccessTestAction, DON'T use this systemUserConnection as the 'doAs' user<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * gets  eclipsed by the system user. */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static Connection systemUserConnection;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final static byte[] Q1 = Bytes.toBytes("q1");<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private final static byte[] value1 = Bytes.toBytes("value1");<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static byte[] TEST_FAMILY_2 = Bytes.toBytes("f2");<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static byte[] TEST_ROW_2 = Bytes.toBytes("r2");<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private final static byte[] Q2 = Bytes.toBytes("q2");<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final static byte[] value2 = Bytes.toBytes("value2");<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static byte[] TEST_ROW_3 = Bytes.toBytes("r3");<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private static final String TESTGROUP_1 = "testgroup_1";<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final String TESTGROUP_2 = "testgroup_2";<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static User TESTGROUP1_USER1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static User TESTGROUP2_USER1;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Rule<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public TestTableName TEST_TABLE = new TestTableName();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private String namespace = "testNamespace";<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private String tname = namespace + ":testtable1";<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private TableName tableName = TableName.valueOf(tname);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private static String TESTGROUP_1_NAME;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @BeforeClass<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public static void setupBeforeClass() throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf = TEST_UTIL.getConfiguration();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // Up the handlers; this test needs more than usual.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    conf.setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    // Enable security<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    enableSecurity(conf);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    // Verify enableSecurity sets up what we require<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    verifyConfiguration(conf);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.startMiniCluster();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    // Wait for the ACL table to become available<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    TEST_UTIL.waitUntilAllRegionsAssigned(PermissionStorage.ACL_TABLE_NAME);<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    TESTGROUP_1_NAME = toGroupEntry(TESTGROUP_1);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    TESTGROUP1_USER1 =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        User.createUserForTesting(conf, "testgroup1_user1", new String[] { TESTGROUP_1 });<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    TESTGROUP2_USER1 =<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        User.createUserForTesting(conf, "testgroup2_user2", new String[] { TESTGROUP_2 });<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    systemUserConnection = ConnectionFactory.createConnection(conf);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  @Before<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public void setUp() throws Exception {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    createNamespace(TEST_UTIL, NamespaceDescriptor.create(namespace).build());<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    try (Table table = createTable(TEST_UTIL, tableName,<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          new byte[][] { TEST_FAMILY, TEST_FAMILY_2 })) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      TEST_UTIL.waitTableEnabled(tableName);<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>      // Ingesting test data.<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      table.put(Arrays.asList(new Put(TEST_ROW).addColumn(TEST_FAMILY, Q1, value1),<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          new Put(TEST_ROW_2).addColumn(TEST_FAMILY, Q2, value2),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          new Put(TEST_ROW_3).addColumn(TEST_FAMILY_2, Q1, value1)));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(1, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    try {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      assertEquals(1, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          tableName.toString()).size());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    } catch (Throwable e) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      LOG.error("Error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @AfterClass<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public static void tearDownAfterClass() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    systemUserConnection.close();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  @After<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public void tearDown() throws Exception {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // Clean the _acl_ table<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      deleteTable(TEST_UTIL, tableName);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } catch (TableNotFoundException ex) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      // Test deleted the table, no problem<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      LOG.info("Test deleted table " + tableName);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    deleteNamespace(TEST_UTIL, namespace);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // Verify all table/namespace permissions are erased<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertEquals(0, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertEquals(0, PermissionStorage.getNamespacePermissions(conf, namespace).size());<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testCreateWithCorrectOwner() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    // Create a test user<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final User testUser = User.createUserForTesting(TEST_UTIL.getConfiguration(), "TestUser",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      new String[0]);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    // Grant the test user the ability to create tables<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    SecureTestUtil.grantGlobal(TEST_UTIL, testUser.getShortName(), Action.CREATE);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    verifyAllowed(new AccessTestAction() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      public Object run() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        HTableDescriptor desc = new HTableDescriptor(TEST_TABLE.getTableName());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        try (Connection connection =<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            ConnectionFactory.createConnection(TEST_UTIL.getConfiguration(), testUser)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          try (Admin admin = connection.getAdmin()) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            createTable(TEST_UTIL, admin, desc);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        return null;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }, testUser);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    TEST_UTIL.waitTableAvailable(TEST_TABLE.getTableName());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // Verify that owner permissions have been granted to the test user on the<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    // table just created<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    List&lt;UserPermission&gt; perms = PermissionStorage<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        .getTablePermissions(conf, TEST_TABLE.getTableName()).get(testUser.getShortName());<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    assertNotNull(perms);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    assertFalse(perms.isEmpty());<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // Should be RWXCA<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.READ));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.WRITE));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.EXEC));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.CREATE));<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.ADMIN));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  @Test<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  public void testCreateTableWithGroupPermissions() throws Exception {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      AccessTestAction createAction = new AccessTestAction() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        public Object run() throws Exception {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          HTableDescriptor desc = new HTableDescriptor(TEST_TABLE.getTableName());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>          desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          try (Connection connection =<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>            try (Admin admin = connection.getAdmin()) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              admin.createTable(desc);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>            }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          return null;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      };<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      verifyAllowed(createAction, TESTGROUP1_USER1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      verifyDenied(createAction, TESTGROUP2_USER1);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    } finally {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Test<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public void testACLTableAccess() throws Exception {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    final Configuration conf = TEST_UTIL.getConfiguration();<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Superuser<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    User superUser = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    // Global users<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    User globalRead = User.createUserForTesting(conf, "globalRead", new String[0]);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    User globalWrite = User.createUserForTesting(conf, "globalWrite", new String[0]);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    User globalCreate = User.createUserForTesting(conf, "globalCreate", new String[0]);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    User globalAdmin = User.createUserForTesting(conf, "globalAdmin", new String[0]);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalRead.getShortName(), Action.READ);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalWrite.getShortName(), Action.WRITE);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalCreate.getShortName(), Action.CREATE);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalAdmin.getShortName(), Action.ADMIN);<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // Namespace users<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    User nsRead = User.createUserForTesting(conf, "nsRead", new String[0]);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    User nsWrite = User.createUserForTesting(conf, "nsWrite", new String[0]);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    User nsCreate = User.createUserForTesting(conf, "nsCreate", new String[0]);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    User nsAdmin = User.createUserForTesting(conf, "nsAdmin", new String[0]);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsRead.getShortName(),<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.READ);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsWrite.getShortName(),<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.WRITE);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsCreate.getShortName(),<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.CREATE);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsAdmin.getShortName(),<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.ADMIN);<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Table users<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    User tableRead = User.createUserForTesting(conf, "tableRead", new String[0]);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    User tableWrite = User.createUserForTesting(conf, "tableWrite", new String[0]);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    User tableCreate = User.createUserForTesting(conf, "tableCreate", new String[0]);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    User tableAdmin = User.createUserForTesting(conf, "tableAdmin", new String[0]);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableRead.getShortName(),<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      TEST_TABLE.getTableName(), null, null, Action.READ);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableWrite.getShortName(),<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      TEST_TABLE.getTableName(), null, null, Action.WRITE);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableCreate.getShortName(),<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      TEST_TABLE.getTableName(), null, null, Action.CREATE);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableAdmin.getShortName(),<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      TEST_TABLE.getTableName(), null, null, Action.ADMIN);<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // Write tests<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      AccessTestAction writeAction = new AccessTestAction() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public Object run() throws Exception {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            t.put(new Put(TEST_ROW).addColumn(PermissionStorage.ACL_LIST_FAMILY, TEST_QUALIFIER,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              TEST_VALUE));<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            return null;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          } finally {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      };<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      // All writes to ACL table denied except for GLOBAL WRITE permission and superuser<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>      verifyDenied(writeAction, globalAdmin, globalCreate, globalRead, TESTGROUP2_USER1);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      verifyDenied(writeAction, nsAdmin, nsCreate, nsRead, nsWrite);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      verifyDenied(writeAction, tableAdmin, tableCreate, tableRead, tableWrite);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      verifyAllowed(writeAction, superUser, globalWrite, TESTGROUP1_USER1);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    } finally {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Read tests<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>      AccessTestAction scanAction = new AccessTestAction() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        public Object run() throws Exception {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>            ResultScanner s = t.getScanner(new Scan());<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>              for (Result r = s.next(); r != null; r = s.next()) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                // do nothing<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>              s.close();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>            return null;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      };<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // All reads from ACL table denied except for GLOBAL READ and superuser<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>      verifyDenied(scanAction, globalAdmin, globalCreate, globalWrite, TESTGROUP2_USER1);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      verifyDenied(scanAction, nsCreate, nsAdmin, nsRead, nsWrite);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      verifyDenied(scanAction, tableCreate, tableAdmin, tableRead, tableWrite);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      verifyAllowed(scanAction, superUser, globalRead, TESTGROUP1_USER1);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    } finally {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /*<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Test table scan operation at table, column family and column qualifier level.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   */<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  @Test<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void testPostGrantAndRevokeScanAction() throws Exception {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    AccessTestAction scanTableActionForGroupWithTableLevelAccess = new AccessTestAction() {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      @Override<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      public Void run() throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            Table table = connection.getTable(tableName)) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          Scan s1 = new Scan();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            Result[] next1 = scanner1.next(5);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            assertTrue("User having table level access should be able to scan all "<a name="line.360"></a>
-<span class="sourceLineNo">361</span>                + "the data in the table.", next1.length == 3);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        return null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    };<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    AccessTestAction scanTableActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      @Override<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      public Void run() throws Exception {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            Table table = connection.getTable(tableName)) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Scan s1 = new Scan();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            Result[] next1 = scanner1.next(5);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            assertTrue("User having column family level access should be able to scan all "<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                + "the data belonging to that family.", next1.length == 2);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        return null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    };<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    AccessTestAction scanFamilyActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      @Override<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      public Void run() throws Exception {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>            Table table = connection.getTable(tableName)) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          Scan s1 = new Scan();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            scanner1.next();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        return null;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    };<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>    AccessTestAction scanTableActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      public Void run() throws Exception {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            Table table = connection.getTable(tableName)) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Scan s1 = new Scan();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            Result[] next1 = scanner1.next(5);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            assertTrue("User having column qualifier level access should be able to scan "<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                + "that column family qualifier data.", next1.length == 1);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        return null;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    };<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    AccessTestAction scanFamilyActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      public Void run() throws Exception {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            Table table = connection.getTable(tableName)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          Scan s1 = new Scan();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>            scanner1.next();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          }<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        return null;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    };<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    AccessTestAction scanQualifierActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      public Void run() throws Exception {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            Table table = connection.getTable(tableName)) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          Scan s1 = new Scan();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          s1.addColumn(TEST_FAMILY, Q2);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            scanner1.next();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    };<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    // Verify user from a group which has table level access can read all the data and group which<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // has no access can't read any data.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null, Action.READ);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    // Verify user from a group whose table level access has been revoked can't read any data.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>    // Verify user from a group which has column family level access can read all the data<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // belonging to that family and group which has no access can't read any data.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      Permission.Action.READ);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    // Verify user from a group whose column family level access has been revoked can't read any<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    // data from that family.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Verify user from a group which has column qualifier level access can read data that has this<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    // family and qualifier, and group which has no access can't read any data.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1, Action.READ);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    verifyDenied(TESTGROUP1_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    verifyDenied(TESTGROUP2_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    // Verify user from a group whose column qualifier level access has been revoked can't read the<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    // data having this column family and qualifier.<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public static class MyAccessController extends AccessController {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  @Test<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public void testCoprocessorLoading() throws Exception {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    MasterCoprocessorHost cpHost =<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterCoprocessorHost();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    cpHost.load(MyAccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    AccessController ACCESS_CONTROLLER = cpHost.findCoprocessor(MyAccessController.class);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    MasterCoprocessorEnvironment CP_ENV = cpHost.createEnvironment(<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        .getRegionServerCoprocessorHost();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    RegionServerCoprocessorEnvironment RSCP_ENV = rsHost.createEnvironment(<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  @Test<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public void testACLZNodeDeletion() throws Exception {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    String baseAclZNode = "/hbase/acl/";<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    String ns = "testACLZNodeDeletionNamespace";<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    createNamespace(TEST_UTIL, desc);<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final TableName table = TableName.valueOf(ns, "testACLZNodeDeletionTable");<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final byte[] family = Bytes.toBytes("f1");<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    HTableDescriptor htd = new HTableDescriptor(table);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    htd.addFamily(new HColumnDescriptor(family));<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    createTable(TEST_UTIL, htd);<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Namespace needs this, as they follow the lazy creation of ACL znode.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    grantOnNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ZKWatcher zkw = TEST_UTIL.getMiniHBaseCluster().getMaster().getZooKeeper();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    assertTrue("The acl znode for table should exist",  ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        table.getNameAsString()) != -1);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    assertTrue("The acl znode for namespace should exist", ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        convertToNamespace(ns)) != -1);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    revokeFromNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    deleteTable(TEST_UTIL, table);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    deleteNamespace(TEST_UTIL, ns);<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertTrue("The acl znode for table should have been deleted",<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        ZKUtil.checkExists(zkw, baseAclZNode + table.getNameAsString()) == -1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertTrue( "The acl znode for namespace should have been deleted",<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        ZKUtil.checkExists(zkw, baseAclZNode + convertToNamespace(ns)) == -1);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>}<a name="line.532"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Put;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Result;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Table;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.security.User;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.After;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Rule;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.Test;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.experimental.categories.Category;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.Logger;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.slf4j.LoggerFactory;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>@Category({SecurityTests.class, LargeTests.class})<a name="line.68"></a>
+<span class="sourceLineNo">069</span>public class TestAccessController2 extends SecureTestUtil {<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @ClassRule<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      HBaseClassTestRule.forClass(TestAccessController2.class);<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAccessController2.class);<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final byte[] TEST_ROW = Bytes.toBytes("test");<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final byte[] TEST_FAMILY = Bytes.toBytes("f");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static final byte[] TEST_QUALIFIER = Bytes.toBytes("q");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final byte[] TEST_VALUE = Bytes.toBytes("value");<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static Configuration conf;<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  /** The systemUserConnection created here is tied to the system user. In case, you are planning<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * to create AccessTestAction, DON'T use this systemUserConnection as the 'doAs' user<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * gets  eclipsed by the system user. */<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static Connection systemUserConnection;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private final static byte[] Q1 = Bytes.toBytes("q1");<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private final static byte[] value1 = Bytes.toBytes("value1");<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static byte[] TEST_FAMILY_2 = Bytes.toBytes("f2");<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static byte[] TEST_ROW_2 = Bytes.toBytes("r2");<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private final static byte[] Q2 = Bytes.toBytes("q2");<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private final static byte[] value2 = Bytes.toBytes("value2");<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static byte[] TEST_ROW_3 = Bytes.toBytes("r3");<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final String TESTGROUP_1 = "testgroup_1";<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final String TESTGROUP_2 = "testgroup_2";<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private static User TESTGROUP1_USER1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static User TESTGROUP2_USER1;<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  @Rule<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public TableNameTestRule testTable = new TableNameTestRule();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String namespace = "testNamespace";<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private String tname = namespace + ":testtable1";<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private TableName tableName = TableName.valueOf(tname);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static String TESTGROUP_1_NAME;<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @BeforeClass<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static void setupBeforeClass() throws Exception {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    conf = TEST_UTIL.getConfiguration();<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // Up the handlers; this test needs more than usual.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // Enable security<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    enableSecurity(conf);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // Verify enableSecurity sets up what we require<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    verifyConfiguration(conf);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    TEST_UTIL.startMiniCluster();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // Wait for the ACL table to become available<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    TEST_UTIL.waitUntilAllRegionsAssigned(PermissionStorage.ACL_TABLE_NAME);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TESTGROUP_1_NAME = toGroupEntry(TESTGROUP_1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TESTGROUP1_USER1 =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        User.createUserForTesting(conf, "testgroup1_user1", new String[] { TESTGROUP_1 });<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TESTGROUP2_USER1 =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        User.createUserForTesting(conf, "testgroup2_user2", new String[] { TESTGROUP_2 });<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    systemUserConnection = ConnectionFactory.createConnection(conf);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Before<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void setUp() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    createNamespace(TEST_UTIL, NamespaceDescriptor.create(namespace).build());<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    try (Table table = createTable(TEST_UTIL, tableName,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          new byte[][] { TEST_FAMILY, TEST_FAMILY_2 })) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      TEST_UTIL.waitTableEnabled(tableName);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // Ingesting test data.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      table.put(Arrays.asList(new Put(TEST_ROW).addColumn(TEST_FAMILY, Q1, value1),<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          new Put(TEST_ROW_2).addColumn(TEST_FAMILY, Q2, value2),<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          new Put(TEST_ROW_3).addColumn(TEST_FAMILY_2, Q1, value1)));<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertEquals(1, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    try {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      assertEquals(1, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          tableName.toString()).size());<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } catch (Throwable e) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.error("Error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @AfterClass<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public static void tearDownAfterClass() throws Exception {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    systemUserConnection.close();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @After<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public void tearDown() throws Exception {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Clean the _acl_ table<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    try {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      deleteTable(TEST_UTIL, tableName);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } catch (TableNotFoundException ex) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      // Test deleted the table, no problem<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      LOG.info("Test deleted table " + tableName);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    deleteNamespace(TEST_UTIL, namespace);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // Verify all table/namespace permissions are erased<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    assertEquals(0, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    assertEquals(0, PermissionStorage.getNamespacePermissions(conf, namespace).size());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testCreateWithCorrectOwner() throws Exception {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    // Create a test user<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final User testUser = User.createUserForTesting(TEST_UTIL.getConfiguration(), "TestUser",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      new String[0]);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // Grant the test user the ability to create tables<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    SecureTestUtil.grantGlobal(TEST_UTIL, testUser.getShortName(), Action.CREATE);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    verifyAllowed(new AccessTestAction() {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      @Override<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      public Object run() throws Exception {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        HTableDescriptor desc = new HTableDescriptor(testTable.getTableName());<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        try (Connection connection =<a name="line.191"></a>
+<span class="sourceLineNo">192</span>            ConnectionFactory.createConnection(TEST_UTIL.getConfiguration(), testUser)) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>          try (Admin admin = connection.getAdmin()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>            createTable(TEST_UTIL, admin, desc);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        return null;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }, testUser);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    TEST_UTIL.waitTableAvailable(testTable.getTableName());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // Verify that owner permissions have been granted to the test user on the<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // table just created<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    List&lt;UserPermission&gt; perms = PermissionStorage<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        .getTablePermissions(conf, testTable.getTableName()).get(testUser.getShortName());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    assertNotNull(perms);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    assertFalse(perms.isEmpty());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    // Should be RWXCA<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.READ));<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.WRITE));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.EXEC));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.CREATE));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.ADMIN));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  @Test<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void testCreateTableWithGroupPermissions() throws Exception {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      AccessTestAction createAction = new AccessTestAction() {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        @Override<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        public Object run() throws Exception {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          HTableDescriptor desc = new HTableDescriptor(testTable.getTableName());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>          desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>          try (Connection connection =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>            try (Admin admin = connection.getAdmin()) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>              admin.createTable(desc);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          return null;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      };<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      verifyAllowed(createAction, TESTGROUP1_USER1);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      verifyDenied(createAction, TESTGROUP2_USER1);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    } finally {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Test<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void testACLTableAccess() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    final Configuration conf = TEST_UTIL.getConfiguration();<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // Superuser<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    User superUser = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // Global users<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    User globalRead = User.createUserForTesting(conf, "globalRead", new String[0]);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    User globalWrite = User.createUserForTesting(conf, "globalWrite", new String[0]);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    User globalCreate = User.createUserForTesting(conf, "globalCreate", new String[0]);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    User globalAdmin = User.createUserForTesting(conf, "globalAdmin", new String[0]);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalRead.getShortName(), Action.READ);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalWrite.getShortName(), Action.WRITE);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalCreate.getShortName(), Action.CREATE);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalAdmin.getShortName(), Action.ADMIN);<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    // Namespace users<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    User nsRead = User.createUserForTesting(conf, "nsRead", new String[0]);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    User nsWrite = User.createUserForTesting(conf, "nsWrite", new String[0]);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    User nsCreate = User.createUserForTesting(conf, "nsCreate", new String[0]);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    User nsAdmin = User.createUserForTesting(conf, "nsAdmin", new String[0]);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsRead.getShortName(),<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      testTable.getTableName().getNamespaceAsString(), Action.READ);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsWrite.getShortName(),<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      testTable.getTableName().getNamespaceAsString(), Action.WRITE);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsCreate.getShortName(),<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      testTable.getTableName().getNamespaceAsString(), Action.CREATE);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsAdmin.getShortName(),<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      testTable.getTableName().getNamespaceAsString(), Action.ADMIN);<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // Table users<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    User tableRead = User.createUserForTesting(conf, "tableRead", new String[0]);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    User tableWrite = User.createUserForTesting(conf, "tableWrite", new String[0]);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    User tableCreate = User.createUserForTesting(conf, "tableCreate", new String[0]);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    User tableAdmin = User.createUserForTesting(conf, "tableAdmin", new String[0]);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableRead.getShortName(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      testTable.getTableName(), null, null, Action.READ);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableWrite.getShortName(),<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      testTable.getTableName(), null, null, Action.WRITE);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableCreate.getShortName(),<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      testTable.getTableName(), null, null, Action.CREATE);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableAdmin.getShortName(),<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      testTable.getTableName(), null, null, Action.ADMIN);<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    try {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // Write tests<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>      AccessTestAction writeAction = new AccessTestAction() {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        @Override<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        public Object run() throws Exception {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            t.put(new Put(TEST_ROW).addColumn(PermissionStorage.ACL_LIST_FAMILY, TEST_QUALIFIER,<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              TEST_VALUE));<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            return null;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          } finally {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      };<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // All writes to ACL table denied except for GLOBAL WRITE permission and superuser<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>      verifyDenied(writeAction, globalAdmin, globalCreate, globalRead, TESTGROUP2_USER1);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      verifyDenied(writeAction, nsAdmin, nsCreate, nsRead, nsWrite);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      verifyDenied(writeAction, tableAdmin, tableCreate, tableRead, tableWrite);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      verifyAllowed(writeAction, superUser, globalWrite, TESTGROUP1_USER1);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Read tests<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>      AccessTestAction scanAction = new AccessTestAction() {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        public Object run() throws Exception {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            ResultScanner s = t.getScanner(new Scan());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            try {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>              for (Result r = s.next(); r != null; r = s.next()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                // do nothing<a name="line.325"></a>
+<span class="sourceLineNo">326</span>              }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            } finally {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              s.close();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            return null;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      };<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>      // All reads from ACL table denied except for GLOBAL READ and superuser<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>      verifyDenied(scanAction, globalAdmin, globalCreate, globalWrite, TESTGROUP2_USER1);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      verifyDenied(scanAction, nsCreate, nsAdmin, nsRead, nsWrite);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      verifyDenied(scanAction, tableCreate, tableAdmin, tableRead, tableWrite);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      verifyAllowed(scanAction, superUser, globalRead, TESTGROUP1_USER1);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    } finally {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  /*<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * Test table scan operation at table, column family and column qualifier level.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  @Test<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  public void testPostGrantAndRevokeScanAction() throws Exception {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    AccessTestAction scanTableActionForGroupWithTableLevelAccess = new AccessTestAction() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      @Override<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      public Void run() throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            Table table = connection.getTable(tableName)) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          Scan s1 = new Scan();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            Result[] next1 = scanner1.next(5);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            assertTrue("User having table level access should be able to scan all "<a name="line.359"></a>
+<span class="sourceLineNo">360</span>                + "the data in the table.", next1.length == 3);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        return null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    };<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>    AccessTestAction scanTableActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      @Override<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      public Void run() throws Exception {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            Table table = connection.getTable(tableName)) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          Scan s1 = new Scan();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            Result[] next1 = scanner1.next(5);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            assertTrue("User having column family level access should be able to scan all "<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                + "the data belonging to that family.", next1.length == 2);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        return null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    };<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>    AccessTestAction scanFamilyActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      public Void run() throws Exception {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>            Table table = connection.getTable(tableName)) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          Scan s1 = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            scanner1.next();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    };<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    AccessTestAction scanTableActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      @Override<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      public Void run() throws Exception {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            Table table = connection.getTable(tableName)) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          Scan s1 = new Scan();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            Result[] next1 = scanner1.next(5);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>            assertTrue("User having column qualifier level access should be able to scan "<a name="line.406"></a>
+<span class="sourceLineNo">407</span>                + "that column family qualifier data.", next1.length == 1);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        return null;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    };<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    AccessTestAction scanFamilyActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      @Override<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      public Void run() throws Exception {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            Table table = connection.getTable(tableName)) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          Scan s1 = new Scan();<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>            scanner1.next();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        return null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    };<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>    AccessTestAction scanQualifierActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      @Override<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      public Void run() throws Exception {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            Table table = connection.getTable(tableName)) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          Scan s1 = new Scan();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          s1.addColumn(TEST_FAMILY, Q2);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            scanner1.next();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        return null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>    // Verify user from a group which has table level access can read all the data and group which<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    // has no access can't read any data.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null, Action.READ);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    // Verify user from a group whose table level access has been revoked can't read any data.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    // Verify user from a group which has column family level access can read all the data<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    // belonging to that family and group which has no access can't read any data.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null,<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      Permission.Action.READ);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Verify user from a group whose column family level access has been revoked can't read any<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // data from that family.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>    // Verify user from a group which has column qualifier level access can read data that has this<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    // family and qualifier, and group which has no access can't read any data.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1, Action.READ);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    verifyDenied(TESTGROUP1_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    verifyDenied(TESTGROUP2_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>    // Verify user from a group whose column qualifier level access has been revoked can't read the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // data having this column family and qualifier.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  public static class MyAccessController extends AccessController {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  @Test<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public void testCoprocessorLoading() throws Exception {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    MasterCoprocessorHost cpHost =<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterCoprocessorHost();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    cpHost.load(MyAccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    AccessController ACCESS_CONTROLLER = cpHost.findCoprocessor(MyAccessController.class);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    MasterCoprocessorEnvironment CP_ENV = cpHost.createEnvironment(<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        .getRegionServerCoprocessorHost();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    RegionServerCoprocessorEnvironment RSCP_ENV = rsHost.createEnvironment(<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  @Test<a name="line.501"></a>
+<span class="sourceLineNo">502</span>  public void testACLZNodeDeletion() throws Exception {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    String baseAclZNode = "/hbase/acl/";<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    String ns = "testACLZNodeDeletionNamespace";<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    createNamespace(TEST_UTIL, desc);<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>    final TableName table = TableName.valueOf(ns, "testACLZNodeDeletionTable");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    final byte[] family = Bytes.toBytes("f1");<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    HTableDescriptor htd = new HTableDescriptor(table);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    htd.addFamily(new HColumnDescriptor(family));<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    createTable(TEST_UTIL, htd);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    // Namespace needs this, as they follow the lazy creation of ACL znode.<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    grantOnNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ZKWatcher zkw = TEST_UTIL.getMiniHBaseCluster().getMaster().getZooKeeper();<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    assertTrue("The acl znode for table should exist",  ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        table.getNameAsString()) != -1);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    assertTrue("The acl znode for namespace should exist", ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        convertToNamespace(ns)) != -1);<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>    revokeFromNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    deleteTable(TEST_UTIL, table);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    deleteNamespace(TEST_UTIL, ns);<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>    assertTrue("The acl znode for table should have been deleted",<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        ZKUtil.checkExists(zkw, baseAclZNode + table.getNameAsString()) == -1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    assertTrue( "The acl znode for namespace should have been deleted",<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        ZKUtil.checkExists(zkw, baseAclZNode + convertToNamespace(ns)) == -1);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>}<a name="line.531"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html
index ccffe4f..dd36ffe 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestAccessController2.html
@@ -30,514 +30,513 @@
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertFalse;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Arrays;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.conf.Configuration;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.TableName;<a name="line.36"></a>
+<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.conf.Configuration;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HConstants;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.NamespaceDescriptor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.TableName;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.TableNameTestRule;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.TestTableName;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Put;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Result;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Table;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.After;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.AfterClass;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.Before;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.BeforeClass;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.ClassRule;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.Rule;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.Test;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.junit.experimental.categories.Category;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.slf4j.Logger;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.slf4j.LoggerFactory;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>@Category({SecurityTests.class, LargeTests.class})<a name="line.69"></a>
-<span class="sourceLineNo">070</span>public class TestAccessController2 extends SecureTestUtil {<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>  @ClassRule<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      HBaseClassTestRule.forClass(TestAccessController2.class);<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAccessController2.class);<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final byte[] TEST_ROW = Bytes.toBytes("test");<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final byte[] TEST_FAMILY = Bytes.toBytes("f");<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final byte[] TEST_QUALIFIER = Bytes.toBytes("q");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static final byte[] TEST_VALUE = Bytes.toBytes("value");<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static Configuration conf;<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /** The systemUserConnection created here is tied to the system user. In case, you are planning<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * to create AccessTestAction, DON'T use this systemUserConnection as the 'doAs' user<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * gets  eclipsed by the system user. */<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static Connection systemUserConnection;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final static byte[] Q1 = Bytes.toBytes("q1");<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private final static byte[] value1 = Bytes.toBytes("value1");<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static byte[] TEST_FAMILY_2 = Bytes.toBytes("f2");<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static byte[] TEST_ROW_2 = Bytes.toBytes("r2");<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private final static byte[] Q2 = Bytes.toBytes("q2");<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final static byte[] value2 = Bytes.toBytes("value2");<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static byte[] TEST_ROW_3 = Bytes.toBytes("r3");<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private static final String TESTGROUP_1 = "testgroup_1";<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static final String TESTGROUP_2 = "testgroup_2";<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static User TESTGROUP1_USER1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static User TESTGROUP2_USER1;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  @Rule<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public TestTableName TEST_TABLE = new TestTableName();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private String namespace = "testNamespace";<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private String tname = namespace + ":testtable1";<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private TableName tableName = TableName.valueOf(tname);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private static String TESTGROUP_1_NAME;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @BeforeClass<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public static void setupBeforeClass() throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    conf = TEST_UTIL.getConfiguration();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // Up the handlers; this test needs more than usual.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    conf.setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    // Enable security<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    enableSecurity(conf);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    // Verify enableSecurity sets up what we require<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    verifyConfiguration(conf);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.startMiniCluster();<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    // Wait for the ACL table to become available<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    TEST_UTIL.waitUntilAllRegionsAssigned(PermissionStorage.ACL_TABLE_NAME);<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    TESTGROUP_1_NAME = toGroupEntry(TESTGROUP_1);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    TESTGROUP1_USER1 =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        User.createUserForTesting(conf, "testgroup1_user1", new String[] { TESTGROUP_1 });<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    TESTGROUP2_USER1 =<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        User.createUserForTesting(conf, "testgroup2_user2", new String[] { TESTGROUP_2 });<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    systemUserConnection = ConnectionFactory.createConnection(conf);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  @Before<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public void setUp() throws Exception {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    createNamespace(TEST_UTIL, NamespaceDescriptor.create(namespace).build());<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    try (Table table = createTable(TEST_UTIL, tableName,<a name="line.139"></a>
-<span class="sourceLineNo">140</span>          new byte[][] { TEST_FAMILY, TEST_FAMILY_2 })) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      TEST_UTIL.waitTableEnabled(tableName);<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>      // Ingesting test data.<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      table.put(Arrays.asList(new Put(TEST_ROW).addColumn(TEST_FAMILY, Q1, value1),<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          new Put(TEST_ROW_2).addColumn(TEST_FAMILY, Q2, value2),<a name="line.145"></a>
-<span class="sourceLineNo">146</span>          new Put(TEST_ROW_3).addColumn(TEST_FAMILY_2, Q1, value1)));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(1, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    try {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      assertEquals(1, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          tableName.toString()).size());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    } catch (Throwable e) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      LOG.error("Error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @AfterClass<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public static void tearDownAfterClass() throws Exception {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    systemUserConnection.close();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  @After<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public void tearDown() throws Exception {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // Clean the _acl_ table<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      deleteTable(TEST_UTIL, tableName);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } catch (TableNotFoundException ex) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      // Test deleted the table, no problem<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      LOG.info("Test deleted table " + tableName);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    deleteNamespace(TEST_UTIL, namespace);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // Verify all table/namespace permissions are erased<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assertEquals(0, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    assertEquals(0, PermissionStorage.getNamespacePermissions(conf, namespace).size());<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  }<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @Test<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void testCreateWithCorrectOwner() throws Exception {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    // Create a test user<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    final User testUser = User.createUserForTesting(TEST_UTIL.getConfiguration(), "TestUser",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      new String[0]);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    // Grant the test user the ability to create tables<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    SecureTestUtil.grantGlobal(TEST_UTIL, testUser.getShortName(), Action.CREATE);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    verifyAllowed(new AccessTestAction() {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      @Override<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      public Object run() throws Exception {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        HTableDescriptor desc = new HTableDescriptor(TEST_TABLE.getTableName());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        try (Connection connection =<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            ConnectionFactory.createConnection(TEST_UTIL.getConfiguration(), testUser)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          try (Admin admin = connection.getAdmin()) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            createTable(TEST_UTIL, admin, desc);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        return null;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }, testUser);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    TEST_UTIL.waitTableAvailable(TEST_TABLE.getTableName());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // Verify that owner permissions have been granted to the test user on the<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    // table just created<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    List&lt;UserPermission&gt; perms = PermissionStorage<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        .getTablePermissions(conf, TEST_TABLE.getTableName()).get(testUser.getShortName());<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    assertNotNull(perms);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    assertFalse(perms.isEmpty());<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // Should be RWXCA<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.READ));<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.WRITE));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.EXEC));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.CREATE));<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.ADMIN));<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  @Test<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  public void testCreateTableWithGroupPermissions() throws Exception {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      AccessTestAction createAction = new AccessTestAction() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        public Object run() throws Exception {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          HTableDescriptor desc = new HTableDescriptor(TEST_TABLE.getTableName());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>          desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          try (Connection connection =<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>            try (Admin admin = connection.getAdmin()) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>              admin.createTable(desc);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>            }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          return null;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      };<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      verifyAllowed(createAction, TESTGROUP1_USER1);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      verifyDenied(createAction, TESTGROUP2_USER1);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    } finally {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Test<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public void testACLTableAccess() throws Exception {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    final Configuration conf = TEST_UTIL.getConfiguration();<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Superuser<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    User superUser = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    // Global users<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    User globalRead = User.createUserForTesting(conf, "globalRead", new String[0]);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    User globalWrite = User.createUserForTesting(conf, "globalWrite", new String[0]);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    User globalCreate = User.createUserForTesting(conf, "globalCreate", new String[0]);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    User globalAdmin = User.createUserForTesting(conf, "globalAdmin", new String[0]);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalRead.getShortName(), Action.READ);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalWrite.getShortName(), Action.WRITE);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalCreate.getShortName(), Action.CREATE);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalAdmin.getShortName(), Action.ADMIN);<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // Namespace users<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    User nsRead = User.createUserForTesting(conf, "nsRead", new String[0]);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    User nsWrite = User.createUserForTesting(conf, "nsWrite", new String[0]);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    User nsCreate = User.createUserForTesting(conf, "nsCreate", new String[0]);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    User nsAdmin = User.createUserForTesting(conf, "nsAdmin", new String[0]);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsRead.getShortName(),<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.READ);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsWrite.getShortName(),<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.WRITE);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsCreate.getShortName(),<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.CREATE);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsAdmin.getShortName(),<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      TEST_TABLE.getTableName().getNamespaceAsString(), Action.ADMIN);<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Table users<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    User tableRead = User.createUserForTesting(conf, "tableRead", new String[0]);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    User tableWrite = User.createUserForTesting(conf, "tableWrite", new String[0]);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    User tableCreate = User.createUserForTesting(conf, "tableCreate", new String[0]);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    User tableAdmin = User.createUserForTesting(conf, "tableAdmin", new String[0]);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableRead.getShortName(),<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      TEST_TABLE.getTableName(), null, null, Action.READ);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableWrite.getShortName(),<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      TEST_TABLE.getTableName(), null, null, Action.WRITE);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableCreate.getShortName(),<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      TEST_TABLE.getTableName(), null, null, Action.CREATE);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableAdmin.getShortName(),<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      TEST_TABLE.getTableName(), null, null, Action.ADMIN);<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      // Write tests<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      AccessTestAction writeAction = new AccessTestAction() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public Object run() throws Exception {<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>            t.put(new Put(TEST_ROW).addColumn(PermissionStorage.ACL_LIST_FAMILY, TEST_QUALIFIER,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              TEST_VALUE));<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            return null;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          } finally {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      };<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      // All writes to ACL table denied except for GLOBAL WRITE permission and superuser<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>      verifyDenied(writeAction, globalAdmin, globalCreate, globalRead, TESTGROUP2_USER1);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      verifyDenied(writeAction, nsAdmin, nsCreate, nsRead, nsWrite);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      verifyDenied(writeAction, tableAdmin, tableCreate, tableRead, tableWrite);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      verifyAllowed(writeAction, superUser, globalWrite, TESTGROUP1_USER1);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    } finally {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    try {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // Read tests<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>      AccessTestAction scanAction = new AccessTestAction() {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        public Object run() throws Exception {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>            ResultScanner s = t.getScanner(new Scan());<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>              for (Result r = s.next(); r != null; r = s.next()) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                // do nothing<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>              s.close();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>            return null;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      };<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // All reads from ACL table denied except for GLOBAL READ and superuser<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>      verifyDenied(scanAction, globalAdmin, globalCreate, globalWrite, TESTGROUP2_USER1);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      verifyDenied(scanAction, nsCreate, nsAdmin, nsRead, nsWrite);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      verifyDenied(scanAction, tableCreate, tableAdmin, tableRead, tableWrite);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      verifyAllowed(scanAction, superUser, globalRead, TESTGROUP1_USER1);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    } finally {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /*<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Test table scan operation at table, column family and column qualifier level.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   */<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  @Test<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void testPostGrantAndRevokeScanAction() throws Exception {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    AccessTestAction scanTableActionForGroupWithTableLevelAccess = new AccessTestAction() {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      @Override<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      public Void run() throws Exception {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>            Table table = connection.getTable(tableName)) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          Scan s1 = new Scan();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            Result[] next1 = scanner1.next(5);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            assertTrue("User having table level access should be able to scan all "<a name="line.360"></a>
-<span class="sourceLineNo">361</span>                + "the data in the table.", next1.length == 3);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        return null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    };<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    AccessTestAction scanTableActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      @Override<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      public Void run() throws Exception {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>            Table table = connection.getTable(tableName)) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Scan s1 = new Scan();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            Result[] next1 = scanner1.next(5);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>            assertTrue("User having column family level access should be able to scan all "<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                + "the data belonging to that family.", next1.length == 2);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        return null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    };<a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    AccessTestAction scanFamilyActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      @Override<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      public Void run() throws Exception {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>            Table table = connection.getTable(tableName)) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          Scan s1 = new Scan();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            scanner1.next();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        return null;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    };<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>    AccessTestAction scanTableActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      @Override<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      public Void run() throws Exception {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            Table table = connection.getTable(tableName)) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Scan s1 = new Scan();<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            Result[] next1 = scanner1.next(5);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>            assertTrue("User having column qualifier level access should be able to scan "<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                + "that column family qualifier data.", next1.length == 1);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        return null;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    };<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>    AccessTestAction scanFamilyActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      @Override<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      public Void run() throws Exception {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>            Table table = connection.getTable(tableName)) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          Scan s1 = new Scan();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>            scanner1.next();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          }<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        return null;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    };<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    AccessTestAction scanQualifierActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      public Void run() throws Exception {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>            Table table = connection.getTable(tableName)) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          Scan s1 = new Scan();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          s1.addColumn(TEST_FAMILY, Q2);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            scanner1.next();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return null;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    };<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>    // Verify user from a group which has table level access can read all the data and group which<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    // has no access can't read any data.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null, Action.READ);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    // Verify user from a group whose table level access has been revoked can't read any data.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>    // Verify user from a group which has column family level access can read all the data<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // belonging to that family and group which has no access can't read any data.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      Permission.Action.READ);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>    // Verify user from a group whose column family level access has been revoked can't read any<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    // data from that family.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.467"></a>
-<span class="sourceLineNo">468</span><a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // Verify user from a group which has column qualifier level access can read data that has this<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    // family and qualifier, and group which has no access can't read any data.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1, Action.READ);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    verifyDenied(TESTGROUP1_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    verifyDenied(TESTGROUP2_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    // Verify user from a group whose column qualifier level access has been revoked can't read the<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    // data having this column family and qualifier.<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  public static class MyAccessController extends AccessController {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  @Test<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public void testCoprocessorLoading() throws Exception {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    MasterCoprocessorHost cpHost =<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterCoprocessorHost();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    cpHost.load(MyAccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    AccessController ACCESS_CONTROLLER = cpHost.findCoprocessor(MyAccessController.class);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    MasterCoprocessorEnvironment CP_ENV = cpHost.createEnvironment(<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        .getRegionServerCoprocessorHost();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    RegionServerCoprocessorEnvironment RSCP_ENV = rsHost.createEnvironment(<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  @Test<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public void testACLZNodeDeletion() throws Exception {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    String baseAclZNode = "/hbase/acl/";<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    String ns = "testACLZNodeDeletionNamespace";<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    createNamespace(TEST_UTIL, desc);<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>    final TableName table = TableName.valueOf(ns, "testACLZNodeDeletionTable");<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    final byte[] family = Bytes.toBytes("f1");<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    HTableDescriptor htd = new HTableDescriptor(table);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    htd.addFamily(new HColumnDescriptor(family));<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    createTable(TEST_UTIL, htd);<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // Namespace needs this, as they follow the lazy creation of ACL znode.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    grantOnNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    ZKWatcher zkw = TEST_UTIL.getMiniHBaseCluster().getMaster().getZooKeeper();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    assertTrue("The acl znode for table should exist",  ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        table.getNameAsString()) != -1);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    assertTrue("The acl znode for namespace should exist", ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        convertToNamespace(ns)) != -1);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    revokeFromNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    deleteTable(TEST_UTIL, table);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    deleteNamespace(TEST_UTIL, ns);<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertTrue("The acl znode for table should have been deleted",<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        ZKUtil.checkExists(zkw, baseAclZNode + table.getNameAsString()) == -1);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    assertTrue( "The acl znode for namespace should have been deleted",<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        ZKUtil.checkExists(zkw, baseAclZNode + convertToNamespace(ns)) == -1);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>}<a name="line.532"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Put;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Result;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Table;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.security.User;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.After;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.AfterClass;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.Before;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.junit.BeforeClass;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.ClassRule;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.Rule;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.Test;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.experimental.categories.Category;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.Logger;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.slf4j.LoggerFactory;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>@Category({SecurityTests.class, LargeTests.class})<a name="line.68"></a>
+<span class="sourceLineNo">069</span>public class TestAccessController2 extends SecureTestUtil {<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @ClassRule<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.72"></a>
+<span class="sourceLineNo">073</span>      HBaseClassTestRule.forClass(TestAccessController2.class);<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAccessController2.class);<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final byte[] TEST_ROW = Bytes.toBytes("test");<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final byte[] TEST_FAMILY = Bytes.toBytes("f");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static final byte[] TEST_QUALIFIER = Bytes.toBytes("q");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final byte[] TEST_VALUE = Bytes.toBytes("value");<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static Configuration conf;<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  /** The systemUserConnection created here is tied to the system user. In case, you are planning<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * to create AccessTestAction, DON'T use this systemUserConnection as the 'doAs' user<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * gets  eclipsed by the system user. */<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static Connection systemUserConnection;<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private final static byte[] Q1 = Bytes.toBytes("q1");<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private final static byte[] value1 = Bytes.toBytes("value1");<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static byte[] TEST_FAMILY_2 = Bytes.toBytes("f2");<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static byte[] TEST_ROW_2 = Bytes.toBytes("r2");<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private final static byte[] Q2 = Bytes.toBytes("q2");<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private final static byte[] value2 = Bytes.toBytes("value2");<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static byte[] TEST_ROW_3 = Bytes.toBytes("r3");<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final String TESTGROUP_1 = "testgroup_1";<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final String TESTGROUP_2 = "testgroup_2";<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private static User TESTGROUP1_USER1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static User TESTGROUP2_USER1;<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  @Rule<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public TableNameTestRule testTable = new TableNameTestRule();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private String namespace = "testNamespace";<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private String tname = namespace + ":testtable1";<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  private TableName tableName = TableName.valueOf(tname);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static String TESTGROUP_1_NAME;<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @BeforeClass<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static void setupBeforeClass() throws Exception {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    conf = TEST_UTIL.getConfiguration();<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // Up the handlers; this test needs more than usual.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // Enable security<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    enableSecurity(conf);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // Verify enableSecurity sets up what we require<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    verifyConfiguration(conf);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    TEST_UTIL.startMiniCluster();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // Wait for the ACL table to become available<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    TEST_UTIL.waitUntilAllRegionsAssigned(PermissionStorage.ACL_TABLE_NAME);<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TESTGROUP_1_NAME = toGroupEntry(TESTGROUP_1);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TESTGROUP1_USER1 =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        User.createUserForTesting(conf, "testgroup1_user1", new String[] { TESTGROUP_1 });<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TESTGROUP2_USER1 =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        User.createUserForTesting(conf, "testgroup2_user2", new String[] { TESTGROUP_2 });<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    systemUserConnection = ConnectionFactory.createConnection(conf);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Before<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void setUp() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    createNamespace(TEST_UTIL, NamespaceDescriptor.create(namespace).build());<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    try (Table table = createTable(TEST_UTIL, tableName,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          new byte[][] { TEST_FAMILY, TEST_FAMILY_2 })) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      TEST_UTIL.waitTableEnabled(tableName);<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // Ingesting test data.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      table.put(Arrays.asList(new Put(TEST_ROW).addColumn(TEST_FAMILY, Q1, value1),<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          new Put(TEST_ROW_2).addColumn(TEST_FAMILY, Q2, value2),<a name="line.144"></a>
+<span class="sourceLineNo">145</span>          new Put(TEST_ROW_3).addColumn(TEST_FAMILY_2, Q1, value1)));<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    assertEquals(1, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    try {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      assertEquals(1, AccessControlClient.getUserPermissions(systemUserConnection,<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          tableName.toString()).size());<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    } catch (Throwable e) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      LOG.error("Error during call of AccessControlClient.getUserPermissions. ", e);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @AfterClass<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public static void tearDownAfterClass() throws Exception {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    systemUserConnection.close();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @After<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  public void tearDown() throws Exception {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Clean the _acl_ table<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    try {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      deleteTable(TEST_UTIL, tableName);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } catch (TableNotFoundException ex) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      // Test deleted the table, no problem<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      LOG.info("Test deleted table " + tableName);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    deleteNamespace(TEST_UTIL, namespace);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // Verify all table/namespace permissions are erased<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    assertEquals(0, PermissionStorage.getTablePermissions(conf, tableName).size());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    assertEquals(0, PermissionStorage.getNamespacePermissions(conf, namespace).size());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  @Test<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void testCreateWithCorrectOwner() throws Exception {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    // Create a test user<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    final User testUser = User.createUserForTesting(TEST_UTIL.getConfiguration(), "TestUser",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      new String[0]);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    // Grant the test user the ability to create tables<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    SecureTestUtil.grantGlobal(TEST_UTIL, testUser.getShortName(), Action.CREATE);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    verifyAllowed(new AccessTestAction() {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      @Override<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      public Object run() throws Exception {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        HTableDescriptor desc = new HTableDescriptor(testTable.getTableName());<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        try (Connection connection =<a name="line.191"></a>
+<span class="sourceLineNo">192</span>            ConnectionFactory.createConnection(TEST_UTIL.getConfiguration(), testUser)) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>          try (Admin admin = connection.getAdmin()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>            createTable(TEST_UTIL, admin, desc);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        }<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        return null;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }, testUser);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    TEST_UTIL.waitTableAvailable(testTable.getTableName());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    // Verify that owner permissions have been granted to the test user on the<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // table just created<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    List&lt;UserPermission&gt; perms = PermissionStorage<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        .getTablePermissions(conf, testTable.getTableName()).get(testUser.getShortName());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    assertNotNull(perms);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    assertFalse(perms.isEmpty());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    // Should be RWXCA<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.READ));<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.WRITE));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.EXEC));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.CREATE));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    assertTrue(perms.get(0).getPermission().implies(Permission.Action.ADMIN));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  @Test<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void testCreateTableWithGroupPermissions() throws Exception {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      AccessTestAction createAction = new AccessTestAction() {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        @Override<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        public Object run() throws Exception {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          HTableDescriptor desc = new HTableDescriptor(testTable.getTableName());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>          desc.addFamily(new HColumnDescriptor(TEST_FAMILY));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>          try (Connection connection =<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>            try (Admin admin = connection.getAdmin()) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>              admin.createTable(desc);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>            }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          return null;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      };<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      verifyAllowed(createAction, TESTGROUP1_USER1);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      verifyDenied(createAction, TESTGROUP2_USER1);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    } finally {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.CREATE);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
+<span class="sourceLineNo">239</span><a name="line.239"></a>
+<span class="sourceLineNo">240</span>  @Test<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void testACLTableAccess() throws Exception {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    final Configuration conf = TEST_UTIL.getConfiguration();<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // Superuser<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    User superUser = User.createUserForTesting(conf, "admin", new String[] { "supergroup" });<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // Global users<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    User globalRead = User.createUserForTesting(conf, "globalRead", new String[0]);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    User globalWrite = User.createUserForTesting(conf, "globalWrite", new String[0]);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    User globalCreate = User.createUserForTesting(conf, "globalCreate", new String[0]);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    User globalAdmin = User.createUserForTesting(conf, "globalAdmin", new String[0]);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalRead.getShortName(), Action.READ);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalWrite.getShortName(), Action.WRITE);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalCreate.getShortName(), Action.CREATE);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    SecureTestUtil.grantGlobal(TEST_UTIL, globalAdmin.getShortName(), Action.ADMIN);<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>    // Namespace users<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    User nsRead = User.createUserForTesting(conf, "nsRead", new String[0]);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    User nsWrite = User.createUserForTesting(conf, "nsWrite", new String[0]);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    User nsCreate = User.createUserForTesting(conf, "nsCreate", new String[0]);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    User nsAdmin = User.createUserForTesting(conf, "nsAdmin", new String[0]);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsRead.getShortName(),<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      testTable.getTableName().getNamespaceAsString(), Action.READ);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsWrite.getShortName(),<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      testTable.getTableName().getNamespaceAsString(), Action.WRITE);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsCreate.getShortName(),<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      testTable.getTableName().getNamespaceAsString(), Action.CREATE);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    SecureTestUtil.grantOnNamespace(TEST_UTIL, nsAdmin.getShortName(),<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      testTable.getTableName().getNamespaceAsString(), Action.ADMIN);<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // Table users<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    User tableRead = User.createUserForTesting(conf, "tableRead", new String[0]);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    User tableWrite = User.createUserForTesting(conf, "tableWrite", new String[0]);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    User tableCreate = User.createUserForTesting(conf, "tableCreate", new String[0]);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    User tableAdmin = User.createUserForTesting(conf, "tableAdmin", new String[0]);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableRead.getShortName(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      testTable.getTableName(), null, null, Action.READ);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableWrite.getShortName(),<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      testTable.getTableName(), null, null, Action.WRITE);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableCreate.getShortName(),<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      testTable.getTableName(), null, null, Action.CREATE);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    SecureTestUtil.grantOnTable(TEST_UTIL, tableAdmin.getShortName(),<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      testTable.getTableName(), null, null, Action.ADMIN);<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    try {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      // Write tests<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>      AccessTestAction writeAction = new AccessTestAction() {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        @Override<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        public Object run() throws Exception {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            t.put(new Put(TEST_ROW).addColumn(PermissionStorage.ACL_LIST_FAMILY, TEST_QUALIFIER,<a name="line.295"></a>
+<span class="sourceLineNo">296</span>              TEST_VALUE));<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            return null;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          } finally {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      };<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // All writes to ACL table denied except for GLOBAL WRITE permission and superuser<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>      verifyDenied(writeAction, globalAdmin, globalCreate, globalRead, TESTGROUP2_USER1);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      verifyDenied(writeAction, nsAdmin, nsCreate, nsRead, nsWrite);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      verifyDenied(writeAction, tableAdmin, tableCreate, tableRead, tableWrite);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      verifyAllowed(writeAction, superUser, globalWrite, TESTGROUP1_USER1);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    } finally {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.WRITE);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>    grantGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Read tests<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>      AccessTestAction scanAction = new AccessTestAction() {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        public Object run() throws Exception {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              Table t = conn.getTable(PermissionStorage.ACL_TABLE_NAME)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            ResultScanner s = t.getScanner(new Scan());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            try {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>              for (Result r = s.next(); r != null; r = s.next()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                // do nothing<a name="line.325"></a>
+<span class="sourceLineNo">326</span>              }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            } finally {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              s.close();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            return null;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      };<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>      // All reads from ACL table denied except for GLOBAL READ and superuser<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>      verifyDenied(scanAction, globalAdmin, globalCreate, globalWrite, TESTGROUP2_USER1);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      verifyDenied(scanAction, nsCreate, nsAdmin, nsRead, nsWrite);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      verifyDenied(scanAction, tableCreate, tableAdmin, tableRead, tableWrite);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      verifyAllowed(scanAction, superUser, globalRead, TESTGROUP1_USER1);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    } finally {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      revokeGlobal(TEST_UTIL, TESTGROUP_1_NAME, Action.READ);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  /*<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * Test table scan operation at table, column family and column qualifier level.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  @Test<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  public void testPostGrantAndRevokeScanAction() throws Exception {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    AccessTestAction scanTableActionForGroupWithTableLevelAccess = new AccessTestAction() {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      @Override<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      public Void run() throws Exception {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            Table table = connection.getTable(tableName)) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          Scan s1 = new Scan();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            Result[] next1 = scanner1.next(5);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            assertTrue("User having table level access should be able to scan all "<a name="line.359"></a>
+<span class="sourceLineNo">360</span>                + "the data in the table.", next1.length == 3);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        return null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    };<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>    AccessTestAction scanTableActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      @Override<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      public Void run() throws Exception {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>            Table table = connection.getTable(tableName)) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          Scan s1 = new Scan();<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>            Result[] next1 = scanner1.next(5);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            assertTrue("User having column family level access should be able to scan all "<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                + "the data belonging to that family.", next1.length == 2);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>          }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        return null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    };<a name="line.381"></a>
+<span class="sourceLineNo">382</span><a name="line.382"></a>
+<span class="sourceLineNo">383</span>    AccessTestAction scanFamilyActionForGroupWithFamilyLevelAccess = new AccessTestAction() {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      @Override<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      public Void run() throws Exception {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>            Table table = connection.getTable(tableName)) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          Scan s1 = new Scan();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            scanner1.next();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        return null;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    };<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    AccessTestAction scanTableActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      @Override<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      public Void run() throws Exception {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            Table table = connection.getTable(tableName)) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          Scan s1 = new Scan();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            Result[] next1 = scanner1.next(5);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>            assertTrue("User having column qualifier level access should be able to scan "<a name="line.406"></a>
+<span class="sourceLineNo">407</span>                + "that column family qualifier data.", next1.length == 1);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        return null;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    };<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    AccessTestAction scanFamilyActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      @Override<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      public Void run() throws Exception {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            Table table = connection.getTable(tableName)) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          Scan s1 = new Scan();<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          s1.addFamily(TEST_FAMILY_2);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>            scanner1.next();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        return null;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    };<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>    AccessTestAction scanQualifierActionForGroupWithQualifierLevelAccess = new AccessTestAction() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      @Override<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      public Void run() throws Exception {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>            Table table = connection.getTable(tableName)) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          Scan s1 = new Scan();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          s1.addColumn(TEST_FAMILY, Q2);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>          try (ResultScanner scanner1 = table.getScanner(s1)) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>            scanner1.next();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>          }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        return null;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    };<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>    // Verify user from a group which has table level access can read all the data and group which<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    // has no access can't read any data.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null, Action.READ);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    // Verify user from a group whose table level access has been revoked can't read any data.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, null, null);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithTableLevelAccess);<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    // Verify user from a group which has column family level access can read all the data<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    // belonging to that family and group which has no access can't read any data.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null,<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      Permission.Action.READ);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithFamilyLevelAccess);<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Verify user from a group whose column family level access has been revoked can't read any<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    // data from that family.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, null);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithFamilyLevelAccess);<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>    // Verify user from a group which has column qualifier level access can read data that has this<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    // family and qualifier, and group which has no access can't read any data.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    grantOnTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1, Action.READ);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    verifyAllowed(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    verifyDenied(TESTGROUP1_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    verifyDenied(TESTGROUP1_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    verifyDenied(TESTGROUP2_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    verifyDenied(TESTGROUP2_USER1, scanFamilyActionForGroupWithQualifierLevelAccess);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    verifyDenied(TESTGROUP2_USER1, scanQualifierActionForGroupWithQualifierLevelAccess);<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>    // Verify user from a group whose column qualifier level access has been revoked can't read the<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    // data having this column family and qualifier.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    revokeFromTable(TEST_UTIL, TESTGROUP_1_NAME, tableName, TEST_FAMILY, Q1);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    verifyDenied(TESTGROUP1_USER1, scanTableActionForGroupWithQualifierLevelAccess);<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>  public static class MyAccessController extends AccessController {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  }<a name="line.485"></a>
+<span class="sourceLineNo">486</span><a name="line.486"></a>
+<span class="sourceLineNo">487</span>  @Test<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public void testCoprocessorLoading() throws Exception {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    MasterCoprocessorHost cpHost =<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterCoprocessorHost();<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    cpHost.load(MyAccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    AccessController ACCESS_CONTROLLER = cpHost.findCoprocessor(MyAccessController.class);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    MasterCoprocessorEnvironment CP_ENV = cpHost.createEnvironment(<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        .getRegionServerCoprocessorHost();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    RegionServerCoprocessorEnvironment RSCP_ENV = rsHost.createEnvironment(<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      ACCESS_CONTROLLER, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  @Test<a name="line.501"></a>
+<span class="sourceLineNo">502</span>  public void testACLZNodeDeletion() throws Exception {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    String baseAclZNode = "/hbase/acl/";<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    String ns = "testACLZNodeDeletionNamespace";<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    createNamespace(TEST_UTIL, desc);<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>    final TableName table = TableName.valueOf(ns, "testACLZNodeDeletionTable");<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    final byte[] family = Bytes.toBytes("f1");<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    HTableDescriptor htd = new HTableDescriptor(table);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    htd.addFamily(new HColumnDescriptor(family));<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    createTable(TEST_UTIL, htd);<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    // Namespace needs this, as they follow the lazy creation of ACL znode.<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    grantOnNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    ZKWatcher zkw = TEST_UTIL.getMiniHBaseCluster().getMaster().getZooKeeper();<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    assertTrue("The acl znode for table should exist",  ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        table.getNameAsString()) != -1);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    assertTrue("The acl znode for namespace should exist", ZKUtil.checkExists(zkw, baseAclZNode +<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        convertToNamespace(ns)) != -1);<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>    revokeFromNamespace(TEST_UTIL, TESTGROUP1_USER1.getShortName(), ns, Action.ADMIN);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    deleteTable(TEST_UTIL, table);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    deleteNamespace(TEST_UTIL, ns);<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>    assertTrue("The acl znode for table should have been deleted",<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        ZKUtil.checkExists(zkw, baseAclZNode + table.getNameAsString()) == -1);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    assertTrue( "The acl znode for namespace should have been deleted",<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        ZKUtil.checkExists(zkw, baseAclZNode + convertToNamespace(ns)) == -1);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>}<a name="line.531"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
index f740088..6a3b6d4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html
@@ -27,966 +27,965 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.junit.Assert.fail;<a name="line.21"></a>
-<span class="sourceLineNo">022</span><a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.security.PrivilegedExceptionAction;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Map;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.conf.Configuration;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.AuthUtil;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.33"></a>
+<span class="sourceLineNo">022</span>import java.io.IOException;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.security.PrivilegedExceptionAction;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.HashMap;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Map;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.conf.Configuration;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.AuthUtil;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableNameTestRule;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.TableNotFoundException;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.TestTableName;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Get;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Put;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Table;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.User;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.junit.After;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.junit.AfterClass;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.junit.Before;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.junit.BeforeClass;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.junit.ClassRule;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.junit.Rule;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.junit.Test;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.experimental.categories.Category;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.slf4j.Logger;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.LoggerFactory;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>@Category({SecurityTests.class, MediumTests.class})<a name="line.64"></a>
-<span class="sourceLineNo">065</span>public class TestCellACLWithMultipleVersions extends SecureTestUtil {<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  @ClassRule<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      HBaseClassTestRule.forClass(TestCellACLWithMultipleVersions.class);<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(TestCellACLWithMultipleVersions.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  @Rule<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public TestTableName TEST_TABLE = new TestTableName();<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private static final byte[] TEST_FAMILY1 = Bytes.toBytes("f1");<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final byte[] TEST_FAMILY2 = Bytes.toBytes("f2");<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final byte[] TEST_ROW = Bytes.toBytes("cellpermtest");<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static final byte[] ZERO = Bytes.toBytes(0L);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private static final byte[] ONE = Bytes.toBytes(1L);<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static final byte[] TWO = Bytes.toBytes(2L);<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static Configuration conf;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private static final String GROUP = "group";<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private static User GROUP_USER;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static User USER_OWNER;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private static User USER_OTHER;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private static User USER_OTHER2;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static String[] usersAndGroups;<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @BeforeClass<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static void setupBeforeClass() throws Exception {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    // setup configuration<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    conf = TEST_UTIL.getConfiguration();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    // Enable security<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    enableSecurity(conf);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    // Verify enableSecurity sets up what we require<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    verifyConfiguration(conf);<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    // We expect 0.98 cell ACL semantics<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    conf.setBoolean(AccessControlConstants.CF_ATTRIBUTE_EARLY_OUT, false);<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    TEST_UTIL.startMiniCluster();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    MasterCoprocessorHost cpHost = TEST_UTIL.getMiniHBaseCluster().getMaster()<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        .getMasterCoprocessorHost();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    cpHost.load(AccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    AccessController ac = cpHost.findCoprocessor(AccessController.class);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    cpHost.createEnvironment(ac, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        .getRegionServerCoprocessorHost();<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    rsHost.createEnvironment(ac, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // Wait for the ACL table to become available<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    TEST_UTIL.waitTableEnabled(PermissionStorage.ACL_TABLE_NAME);<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // create a set of test users<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    USER_OWNER = User.createUserForTesting(conf, "owner", new String[0]);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    USER_OTHER = User.createUserForTesting(conf, "other", new String[0]);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    USER_OTHER2 = User.createUserForTesting(conf, "other2", new String[0]);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    GROUP_USER = User.createUserForTesting(conf, "group_user", new String[] { GROUP });<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>    usersAndGroups = new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) };<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @AfterClass<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public static void tearDownAfterClass() throws Exception {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Before<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void setUp() throws Exception {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    HTableDescriptor htd = new HTableDescriptor(TEST_TABLE.getTableName());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    HColumnDescriptor hcd = new HColumnDescriptor(TEST_FAMILY1);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    hcd.setMaxVersions(4);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    htd.setOwner(USER_OWNER);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    htd.addFamily(hcd);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    hcd = new HColumnDescriptor(TEST_FAMILY2);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    hcd.setMaxVersions(4);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    htd.setOwner(USER_OWNER);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    htd.addFamily(hcd);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // Create the test table (owner added to the _acl_ table)<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    try (Connection connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      try (Admin admin = connection.getAdmin()) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>        admin.createTable(htd, new byte[][] { Bytes.toBytes("s") });<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    TEST_UTIL.waitTableEnabled(TEST_TABLE.getTableName());<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    LOG.info("Sleeping a second because of HBASE-12581");<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    Threads.sleep(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @Test<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public void testCellPermissionwithVersions() throws Exception {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    // store two sets of values, one store with a cell level ACL, and one<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    // without<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    final Map&lt;String, Permission&gt; writePerms = prepareCellPermissions(usersAndGroups, Action.WRITE);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    final Map&lt;String, Permission&gt; readPerms = prepareCellPermissions(usersAndGroups, Action.READ);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    verifyAllowed(new AccessTestAction() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      @Override<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      public Object run() throws Exception {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          Put p;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>          // with ro ACL<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>          p.setACL(writePerms);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>          t.put(p);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>          // with ro ACL<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          p.setACL(readPerms);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>          t.put(p);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          p.setACL(writePerms);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          t.put(p);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>          p.setACL(readPerms);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          t.put(p);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          p.setACL(writePerms);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          t.put(p);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        return null;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }, USER_OWNER);<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>    /* ---- Gets ---- */<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>    AccessTestAction getQ1 = new AccessTestAction() {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      public Object run() throws Exception {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>        Get get = new Get(TEST_ROW);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        get.readVersions(10);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          return t.get(get).listCells();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    };<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>    AccessTestAction get2 = new AccessTestAction() {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      public Object run() throws Exception {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        Get get = new Get(TEST_ROW);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        get.readVersions(10);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>            Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          return t.get(get).listCells();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    };<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // Confirm special read access set at cell level<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    verifyAllowed(GROUP_USER, getQ1, 2);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    verifyAllowed(USER_OTHER, getQ1, 2);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // store two sets of values, one store with a cell level ACL, and one<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // without<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    verifyAllowed(new AccessTestAction() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      @Override<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      public Object run() throws Exception {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>            Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          Put p;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          p.setACL(writePerms);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>          t.put(p);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          p.setACL(readPerms);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          t.put(p);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>          p.setACL(writePerms);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>          t.put(p);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        return null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    }, USER_OWNER);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    // Confirm special read access set at cell level<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>    verifyAllowed(USER_OTHER, get2, 1);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    verifyAllowed(GROUP_USER, get2, 1);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>  private Map&lt;String, Permission&gt; prepareCellPermissions(String[] users, Action... action) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Map&lt;String, Permission&gt; perms = new HashMap&lt;&gt;(2);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    for (String user : users) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      perms.put(user, new Permission(action));<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    return perms;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  @Test<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public void testCellPermissionsWithDeleteMutipleVersions() throws Exception {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    // table/column/qualifier level permissions<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    final byte[] TEST_ROW2 = Bytes.toBytes("r2");<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // additional test user<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    verifyAllowed(new AccessTestAction() {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      @Override<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      public Object run() throws Exception {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            // with rw ACL for "user1"<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            Put p = new Put(TEST_ROW1);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            p.setACL(user1.getShortName(), new Permission(Permission.Action.READ,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>                Permission.Action.WRITE));<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            t.put(p);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            // with rw ACL for "user1"<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            p = new Put(TEST_ROW2);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>            p.setACL(user1.getShortName(), new Permission(Permission.Action.READ,<a name="line.284"></a>
-<span class="sourceLineNo">285</span>                Permission.Action.WRITE));<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            t.put(p);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        return null;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    }, USER_OWNER);<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>    verifyAllowed(new AccessTestAction() {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      public Object run() throws Exception {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            // with rw ACL for "user1", "user2" and "@group"<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            Put p = new Put(TEST_ROW1);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            Map&lt;String, Permission&gt; perms =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>                prepareCellPermissions(new String[] { user1.getShortName(), user2.getShortName(),<a name="line.303"></a>
-<span class="sourceLineNo">304</span>                    AuthUtil.toGroupEntry(GROUP) }, Action.READ, Action.WRITE);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            p.setACL(perms);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            t.put(p);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            // with rw ACL for "user1", "user2" and "@group"<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            p = new Put(TEST_ROW2);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            p.setACL(perms);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            t.put(p);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        return null;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }, user1);<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    // user1 should be allowed to delete TEST_ROW1 as he is having write permission on both<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    // versions of the cells<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      public Void run() throws Exception {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>            Delete d = new Delete(TEST_ROW1);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>            d.addColumns(TEST_FAMILY1, TEST_Q1);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            d.addColumns(TEST_FAMILY1, TEST_Q2);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            t.delete(d);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        return null;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    });<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    // user2 should not be allowed to delete TEST_ROW2 as he is having write permission only on one<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // version of the cells.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    verifyUserDeniedForDeleteMultipleVersions(user2, TEST_ROW2, TEST_Q1, TEST_Q2);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // GROUP_USER should not be allowed to delete TEST_ROW2 as he is having write permission only on<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    // one version of the cells.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    verifyUserDeniedForDeleteMultipleVersions(GROUP_USER, TEST_ROW2, TEST_Q1, TEST_Q2);<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>    // user1 should be allowed to delete the cf. (All data under cf for a row)<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      @Override<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      public Void run() throws Exception {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            Delete d = new Delete(TEST_ROW2);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>            d.addFamily(TEST_FAMILY1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            t.delete(d);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          }<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        return null;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    });<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  private void verifyUserDeniedForDeleteMultipleVersions(final User user, final byte[] row,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      final byte[] q1, final byte[] q2) throws IOException, InterruptedException {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      @Override<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      public Void run() throws Exception {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>            Delete d = new Delete(row);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>            d.addColumns(TEST_FAMILY1, q1);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            d.addColumns(TEST_FAMILY1, q2);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>            t.delete(d);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>            fail(user.getShortName() + " should not be allowed to delete the row");<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          } catch (Exception e) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>          }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        return null;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    });<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.Get;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Put;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Table;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.security.User;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.access.Permission.Action;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.SecurityTests;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.After;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.AfterClass;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.Before;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.BeforeClass;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.ClassRule;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.Rule;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.Test;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.experimental.categories.Category;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>@Category({SecurityTests.class, MediumTests.class})<a name="line.63"></a>
+<span class="sourceLineNo">064</span>public class TestCellACLWithMultipleVersions extends SecureTestUtil {<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  @ClassRule<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      HBaseClassTestRule.forClass(TestCellACLWithMultipleVersions.class);<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final Logger LOG = LoggerFactory.getLogger(TestCellACLWithMultipleVersions.class);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  @Rule<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public TableNameTestRule testTable = new TableNameTestRule();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private static final byte[] TEST_FAMILY1 = Bytes.toBytes("f1");<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final byte[] TEST_FAMILY2 = Bytes.toBytes("f2");<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final byte[] TEST_ROW = Bytes.toBytes("cellpermtest");<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private static final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final byte[] ZERO = Bytes.toBytes(0L);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final byte[] ONE = Bytes.toBytes(1L);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static final byte[] TWO = Bytes.toBytes(2L);<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static Configuration conf;<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final String GROUP = "group";<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static User GROUP_USER;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static User USER_OWNER;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static User USER_OTHER;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static User USER_OTHER2;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private static String[] usersAndGroups;<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @BeforeClass<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public static void setupBeforeClass() throws Exception {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    // setup configuration<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    conf = TEST_UTIL.getConfiguration();<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    // Enable security<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    enableSecurity(conf);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    // Verify enableSecurity sets up what we require<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    verifyConfiguration(conf);<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>    // We expect 0.98 cell ACL semantics<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    conf.setBoolean(AccessControlConstants.CF_ATTRIBUTE_EARLY_OUT, false);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    TEST_UTIL.startMiniCluster();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    MasterCoprocessorHost cpHost = TEST_UTIL.getMiniHBaseCluster().getMaster()<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        .getMasterCoprocessorHost();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    cpHost.load(AccessController.class, Coprocessor.PRIORITY_HIGHEST, conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    AccessController ac = cpHost.findCoprocessor(AccessController.class);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    cpHost.createEnvironment(ac, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    RegionServerCoprocessorHost rsHost = TEST_UTIL.getMiniHBaseCluster().getRegionServer(0)<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        .getRegionServerCoprocessorHost();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    rsHost.createEnvironment(ac, Coprocessor.PRIORITY_HIGHEST, 1, conf);<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // Wait for the ACL table to become available<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    TEST_UTIL.waitTableEnabled(PermissionStorage.ACL_TABLE_NAME);<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    // create a set of test users<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    USER_OWNER = User.createUserForTesting(conf, "owner", new String[0]);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    USER_OTHER = User.createUserForTesting(conf, "other", new String[0]);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    USER_OTHER2 = User.createUserForTesting(conf, "other2", new String[0]);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    GROUP_USER = User.createUserForTesting(conf, "group_user", new String[] { GROUP });<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>    usersAndGroups = new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) };<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @AfterClass<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public static void tearDownAfterClass() throws Exception {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  @Before<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public void setUp() throws Exception {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    HTableDescriptor htd = new HTableDescriptor(testTable.getTableName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    HColumnDescriptor hcd = new HColumnDescriptor(TEST_FAMILY1);<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    hcd.setMaxVersions(4);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    htd.setOwner(USER_OWNER);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    htd.addFamily(hcd);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    hcd = new HColumnDescriptor(TEST_FAMILY2);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    hcd.setMaxVersions(4);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    htd.setOwner(USER_OWNER);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    htd.addFamily(hcd);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    // Create the test table (owner added to the _acl_ table)<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try (Connection connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      try (Admin admin = connection.getAdmin()) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        admin.createTable(htd, new byte[][] { Bytes.toBytes("s") });<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    TEST_UTIL.waitTableEnabled(testTable.getTableName());<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    LOG.info("Sleeping a second because of HBASE-12581");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    Threads.sleep(1000);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  @Test<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public void testCellPermissionwithVersions() throws Exception {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    // store two sets of values, one store with a cell level ACL, and one<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    // without<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    final Map&lt;String, Permission&gt; writePerms = prepareCellPermissions(usersAndGroups, Action.WRITE);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    final Map&lt;String, Permission&gt; readPerms = prepareCellPermissions(usersAndGroups, Action.READ);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    verifyAllowed(new AccessTestAction() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      @Override<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      public Object run() throws Exception {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>            Table t = connection.getTable(testTable.getTableName())) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          Put p;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          // with ro ACL<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>          p.setACL(writePerms);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          t.put(p);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          // with ro ACL<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          p.setACL(readPerms);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          t.put(p);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>          p.setACL(writePerms);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>          t.put(p);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>          p.setACL(readPerms);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>          t.put(p);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          p.setACL(writePerms);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          t.put(p);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        return null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    }, USER_OWNER);<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>    /* ---- Gets ---- */<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>    AccessTestAction getQ1 = new AccessTestAction() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      @Override<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      public Object run() throws Exception {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        Get get = new Get(TEST_ROW);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        get.readVersions(10);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>            Table t = connection.getTable(testTable.getTableName())) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          return t.get(get).listCells();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    };<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    AccessTestAction get2 = new AccessTestAction() {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      @Override<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      public Object run() throws Exception {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>        Get get = new Get(TEST_ROW);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        get.readVersions(10);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>            Table t = connection.getTable(testTable.getTableName())) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          return t.get(get).listCells();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    };<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // Confirm special read access set at cell level<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    verifyAllowed(GROUP_USER, getQ1, 2);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    verifyAllowed(USER_OTHER, getQ1, 2);<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // store two sets of values, one store with a cell level ACL, and one<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // without<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    verifyAllowed(new AccessTestAction() {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      @Override<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      public Object run() throws Exception {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        try(Connection connection = ConnectionFactory.createConnection(conf);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>            Table t = connection.getTable(testTable.getTableName())) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          Put p;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          p.setACL(writePerms);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>          t.put(p);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          p.setACL(readPerms);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          t.put(p);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>          p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          p.setACL(writePerms);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>          t.put(p);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        return null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    }, USER_OWNER);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // Confirm special read access set at cell level<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    verifyAllowed(USER_OTHER, get2, 1);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    verifyAllowed(GROUP_USER, get2, 1);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  private Map&lt;String, Permission&gt; prepareCellPermissions(String[] users, Action... action) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Map&lt;String, Permission&gt; perms = new HashMap&lt;&gt;(2);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    for (String user : users) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      perms.put(user, new Permission(action));<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    return perms;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  @Test<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  public void testCellPermissionsWithDeleteMutipleVersions() throws Exception {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // table/column/qualifier level permissions<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final byte[] TEST_ROW2 = Bytes.toBytes("r2");<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // additional test user<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>    verifyAllowed(new AccessTestAction() {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      public Object run() throws Exception {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            // with rw ACL for "user1"<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            Put p = new Put(TEST_ROW1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>            p.setACL(user1.getShortName(), new Permission(Permission.Action.READ,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>                Permission.Action.WRITE));<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            t.put(p);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>            // with rw ACL for "user1"<a name="line.279"></a>
+<span class="sourceLineNo">280</span>            p = new Put(TEST_ROW2);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            p.setACL(user1.getShortName(), new Permission(Permission.Action.READ,<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                Permission.Action.WRITE));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>            t.put(p);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        return null;<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    }, USER_OWNER);<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    verifyAllowed(new AccessTestAction() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      @Override<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      public Object run() throws Exception {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            // with rw ACL for "user1", "user2" and "@group"<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            Put p = new Put(TEST_ROW1);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            Map&lt;String, Permission&gt; perms =<a name="line.301"></a>
+<span class="sourceLineNo">302</span>                prepareCellPermissions(new String[] { user1.getShortName(), user2.getShortName(),<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                    AuthUtil.toGroupEntry(GROUP) }, Action.READ, Action.WRITE);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            p.setACL(perms);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>            t.put(p);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            // with rw ACL for "user1", "user2" and "@group"<a name="line.306"></a>
+<span class="sourceLineNo">307</span>            p = new Put(TEST_ROW2);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, ZERO);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            p.setACL(perms);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>            t.put(p);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        return null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }, user1);<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    // user1 should be allowed to delete TEST_ROW1 as he is having write permission on both<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    // versions of the cells<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      @Override<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      public Void run() throws Exception {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            Delete d = new Delete(TEST_ROW1);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            d.addColumns(TEST_FAMILY1, TEST_Q1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            d.addColumns(TEST_FAMILY1, TEST_Q2);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            t.delete(d);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>          }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        return null;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    });<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    // user2 should not be allowed to delete TEST_ROW2 as he is having write permission only on one<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // version of the cells.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    verifyUserDeniedForDeleteMultipleVersions(user2, TEST_ROW2, TEST_Q1, TEST_Q2);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // GROUP_USER should not be allowed to delete TEST_ROW2 as he is having write permission only on<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // one version of the cells.<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    verifyUserDeniedForDeleteMultipleVersions(GROUP_USER, TEST_ROW2, TEST_Q1, TEST_Q2);<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // user1 should be allowed to delete the cf. (All data under cf for a row)<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      @Override<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      public Void run() throws Exception {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            Delete d = new Delete(TEST_ROW2);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>            d.addFamily(TEST_FAMILY1);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            t.delete(d);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        return null;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    });<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private void verifyUserDeniedForDeleteMultipleVersions(final User user, final byte[] row,<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      final byte[] q1, final byte[] q2) throws IOException, InterruptedException {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      @Override<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      public Void run() throws Exception {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            Delete d = new Delete(row);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>            d.addColumns(TEST_FAMILY1, q1);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            d.addColumns(TEST_FAMILY1, q2);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>            t.delete(d);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            fail(user.getShortName() + " should not be allowed to delete the row");<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          } catch (Exception e) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>          }<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        return null;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    });<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
 <span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  @Test<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  public void testDeleteWithFutureTimestamp() throws Exception {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    // Store two values, one in the future<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    verifyAllowed(new AccessTestAction() {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      @Override<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      public Object run() throws Exception {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            // Store a read write ACL without a timestamp, server will use current time<a name="line.390"></a>
-<span class="sourceLineNo">391</span>            Put p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q2, ONE);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            Map&lt;String, Permission&gt; readAndWritePerms =<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                prepareCellPermissions(usersAndGroups, Action.READ, Action.WRITE);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            p.setACL(readAndWritePerms);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            t.put(p);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            p = new Put(TEST_ROW).addColumn(TEST_FAMILY2, TEST_Q2, ONE);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            p.setACL(readAndWritePerms);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            t.put(p);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            LOG.info("Stored at current time");<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            // Store read only ACL at a future time<a name="line.400"></a>
-<span class="sourceLineNo">401</span>            p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>                EnvironmentEdgeManager.currentTime() + 1000000, ZERO);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            p.setACL(prepareCellPermissions(new String[]{ USER_OTHER.getShortName(),<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                AuthUtil.toGroupEntry(GROUP)}, Action.READ));<a name="line.404"></a>
-<span class="sourceLineNo">405</span>            t.put(p);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        return null;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    }, USER_OWNER);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // Confirm stores are visible<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>    AccessTestAction getQ1 = new AccessTestAction() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      @Override<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      public Object run() throws Exception {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        Get get = new Get(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>            return t.get(get).listCells();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          }<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    };<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>    AccessTestAction getQ2 = new AccessTestAction() {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      public Object run() throws Exception {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        Get get = new Get(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q2);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>            return t.get(get).listCells();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          }<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    };<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>    verifyAllowed(getQ1, USER_OWNER, USER_OTHER, GROUP_USER);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    verifyAllowed(getQ2, USER_OWNER, USER_OTHER, GROUP_USER);<a name="line.439"></a>
+<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  public void testDeleteWithFutureTimestamp() throws Exception {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    // Store two values, one in the future<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>    verifyAllowed(new AccessTestAction() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      @Override<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      public Object run() throws Exception {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>            // Store a read write ACL without a timestamp, server will use current time<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            Put p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q2, ONE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            Map&lt;String, Permission&gt; readAndWritePerms =<a name="line.391"></a>
+<span class="sourceLineNo">392</span>                prepareCellPermissions(usersAndGroups, Action.READ, Action.WRITE);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>            p.setACL(readAndWritePerms);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>            t.put(p);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>            p = new Put(TEST_ROW).addColumn(TEST_FAMILY2, TEST_Q2, ONE);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>            p.setACL(readAndWritePerms);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            t.put(p);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            LOG.info("Stored at current time");<a name="line.398"></a>
+<span class="sourceLineNo">399</span>            // Store read only ACL at a future time<a name="line.399"></a>
+<span class="sourceLineNo">400</span>            p = new Put(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1,<a name="line.400"></a>
+<span class="sourceLineNo">401</span>                EnvironmentEdgeManager.currentTime() + 1000000, ZERO);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>            p.setACL(prepareCellPermissions(new String[]{ USER_OTHER.getShortName(),<a name="line.402"></a>
+<span class="sourceLineNo">403</span>                AuthUtil.toGroupEntry(GROUP)}, Action.READ));<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            t.put(p);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>          }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        }<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        return null;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }, USER_OWNER);<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>    // Confirm stores are visible<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>    AccessTestAction getQ1 = new AccessTestAction() {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      @Override<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      public Object run() throws Exception {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        Get get = new Get(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q1);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>            return t.get(get).listCells();<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        }<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      }<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    };<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    AccessTestAction getQ2 = new AccessTestAction() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      @Override<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      public Object run() throws Exception {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        Get get = new Get(TEST_ROW).addColumn(TEST_FAMILY1, TEST_Q2);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>            return t.get(get).listCells();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    };<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span>    verifyAllowed(getQ1, USER_OWNER, USER_OTHER, GROUP_USER);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    verifyAllowed(getQ2, USER_OWNER, USER_OTHER, GROUP_USER);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>    // Issue a DELETE for the family, should succeed because the future ACL is<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    // not considered<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    AccessTestAction deleteFamily1 = getDeleteFamilyAction(TEST_FAMILY1);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    AccessTestAction deleteFamily2 = getDeleteFamilyAction(TEST_FAMILY2);<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    verifyAllowed(deleteFamily1, USER_OTHER);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    verifyAllowed(deleteFamily2, GROUP_USER);<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>    // The future put should still exist<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    verifyAllowed(getQ1, USER_OWNER, USER_OTHER,GROUP_USER);<a name="line.452"></a>
-<span class="sourceLineNo">453</span><a name="line.453"></a>
-<span class="sourceLineNo">454</span>    // The other put should be covered by the tombstone<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>    verifyIfNull(getQ2, USER_OTHER, GROUP_USER);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>  private AccessTestAction getDeleteFamilyAction(final byte[] fam) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    AccessTestAction deleteFamilyAction = new AccessTestAction() {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      public Object run() throws Exception {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        Delete delete = new Delete(TEST_ROW).addFamily(fam);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            t.delete(delete);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>          }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        return null;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    };<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    return deleteFamilyAction;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
-<span class="sourceLineNo">474</span><a name="line.474"></a>
-<span class="sourceLineNo">475</span>  @Test<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  public void testCellPermissionsWithDeleteWithUserTs() throws Exception {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    USER_OWNER.runAs(new AccessTestAction() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      @Override<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      public Object run() throws Exception {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>            // This version (TS = 123) with rw ACL for USER_OTHER and USER_OTHER2<a name="line.482"></a>
-<span class="sourceLineNo">483</span>            Put p = new Put(TEST_ROW);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123L, ZERO);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123L, ZERO);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>            p.setACL(prepareCellPermissions(<a name="line.486"></a>
-<span class="sourceLineNo">487</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP),<a name="line.487"></a>
-<span class="sourceLineNo">488</span>                  USER_OTHER2.getShortName() }, Permission.Action.READ, Permission.Action.WRITE));<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            t.put(p);<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>            // This version (TS = 125) with rw ACL for USER_OTHER<a name="line.491"></a>
-<span class="sourceLineNo">492</span>            p = new Put(TEST_ROW);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 125L, ONE);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 125L, ONE);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>            p.setACL(prepareCellPermissions(<a name="line.495"></a>
-<span class="sourceLineNo">496</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) },<a name="line.496"></a>
-<span class="sourceLineNo">497</span>              Action.READ, Action.WRITE));<a name="line.497"></a>
-<span class="sourceLineNo">498</span>            t.put(p);<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>            // This version (TS = 127) with rw ACL for USER_OTHER<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            p = new Put(TEST_ROW);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127L, TWO);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127L, TWO);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>            p.setACL(prepareCellPermissions(<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) },<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              Action.READ, Action.WRITE));<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            t.put(p);<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>            return null;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    });<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    // USER_OTHER2 should be allowed to delete the column f1:q1 versions older than TS 124L<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    USER_OTHER2.runAs(new AccessTestAction() {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      @Override<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      public Object run() throws Exception {<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            Delete d = new Delete(TEST_ROW, 124L);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>            d.addColumns(TEST_FAMILY1, TEST_Q1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>            t.delete(d);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>        }<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        return null;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      }<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    });<a name="line.528"></a>
-<span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>    // USER_OTHER2 should be allowed to delete the column f1:q2 versions older than TS 124L<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    USER_OTHER2.runAs(new AccessTestAction() {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      public Object run() throws Exception {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>            Delete d = new Delete(TEST_ROW);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>            d.addColumns(TEST_FAMILY1, TEST_Q2, 124L);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>            t.delete(d);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        return null;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    });<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  @Test<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  public void testCellPermissionsWithDeleteExactVersion() throws Exception {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>    verifyAllowed(new AccessTestAction() {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      @Override<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      public Object run() throws Exception {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>            Map&lt;String, Permission&gt; permsU1andOwner =<a name="line.561"></a>
-<span class="sourceLineNo">562</span>                prepareCellPermissions(<a name="line.562"></a>
-<span class="sourceLineNo">563</span>                  new String[] { user1.getShortName(), USER_OWNER.getShortName() }, Action.READ,<a name="line.563"></a>
-<span class="sourceLineNo">564</span>                  Action.WRITE);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            Map&lt;String, Permission&gt; permsU2andGUandOwner =<a name="line.565"></a>
-<span class="sourceLineNo">566</span>                prepareCellPermissions(<a name="line.566"></a>
-<span class="sourceLineNo">567</span>                  new String[] { user2.getShortName(), AuthUtil.toGroupEntry(GROUP),<a name="line.567"></a>
-<span class="sourceLineNo">568</span>                      USER_OWNER.getShortName() }, Action.READ, Action.WRITE);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>            Put p = new Put(TEST_ROW1);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123, ZERO);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>            p.setACL(permsU1andOwner);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            t.put(p);<a name="line.572"></a>
-<span class="sourceLineNo">573</span>            p = new Put(TEST_ROW1);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123, ZERO);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>            p.setACL(permsU2andGUandOwner);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>            t.put(p);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>            p = new Put(TEST_ROW1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            p.addColumn(TEST_FAMILY2, TEST_Q1, 123, ZERO);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            p.addColumn(TEST_FAMILY2, TEST_Q2, 123, ZERO);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            p.setACL(permsU2andGUandOwner);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            t.put(p);<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>            p = new Put(TEST_ROW1);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            p.addColumn(TEST_FAMILY2, TEST_Q1, 125, ZERO);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            p.addColumn(TEST_FAMILY2, TEST_Q2, 125, ZERO);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            p.setACL(permsU1andOwner);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            t.put(p);<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>            p = new Put(TEST_ROW1);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127, ZERO);<a name="line.590"></a>
-<span class="sourceLineNo">591</span>            p.setACL(permsU2andGUandOwner);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            t.put(p);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>            p = new Put(TEST_ROW1);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127, ZERO);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>            p.setACL(permsU1andOwner);<a name="line.595"></a>
-<span class="sourceLineNo">596</span>            t.put(p);<a name="line.596"></a>
-<span class="sourceLineNo">597</span>            p = new Put(TEST_ROW1);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>            p.addColumn(TEST_FAMILY2, TEST_Q1, 129, ZERO);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>            p.addColumn(TEST_FAMILY2, TEST_Q2, 129, ZERO);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>            p.setACL(permsU1andOwner);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>            t.put(p);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          }<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        return null;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      }<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }, USER_OWNER);<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    // user1 should be allowed to delete TEST_ROW1 as he is having write permission on both<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    // versions of the cells<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      public Void run() throws Exception {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>            Delete d = new Delete(TEST_ROW1);<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            d.addColumn(TEST_FAMILY1, TEST_Q1, 123);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            d.addColumn(TEST_FAMILY1, TEST_Q2);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>            d.addFamilyVersion(TEST_FAMILY2, 125);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            t.delete(d);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        return null;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      }<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    });<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>    verifyUserDeniedForDeleteExactVersion(user2, TEST_ROW1, TEST_Q1, TEST_Q2);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    verifyUserDeniedForDeleteExactVersion(GROUP_USER, TEST_ROW1, TEST_Q1, TEST_Q2);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  private void verifyUserDeniedForDeleteExactVersion(final User user, final byte[] row,<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      final byte[] q1, final byte[] q2) throws IOException, InterruptedException {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      @Override<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      public Void run() throws Exception {<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.635"></a>
-<span class="sourceLineNo">636</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>            Delete d = new Delete(row, 127);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>            d.addColumns(TEST_FAMILY1, q1);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>            d.addColumns(TEST_FAMILY1, q2);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>            d.addFamily(TEST_FAMILY2, 129);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>            t.delete(d);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>            fail(user.getShortName() + " can not do the delete");<a name="line.642"></a>
-<span class="sourceLineNo">643</span>          } catch (Exception e) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>          }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        }<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        return null;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    });<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  @Test<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  public void testCellPermissionsForIncrementWithMultipleVersions() throws Exception {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    verifyAllowed(new AccessTestAction() {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      @Override<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      public Object run() throws Exception {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>            Map&lt;String, Permission&gt; permsU1andOwner =<a name="line.667"></a>
-<span class="sourceLineNo">668</span>                prepareCellPermissions(<a name="line.668"></a>
-<span class="sourceLineNo">669</span>                  new String[] { user1.getShortName(), USER_OWNER.getShortName() }, Action.READ,<a name="line.669"></a>
-<span class="sourceLineNo">670</span>                  Action.WRITE);<a name="line.670"></a>
-<span class="sourceLineNo">671</span>            Map&lt;String, Permission&gt; permsU2andGUandOwner =<a name="line.671"></a>
-<span class="sourceLineNo">672</span>                prepareCellPermissions(<a name="line.672"></a>
-<span class="sourceLineNo">673</span>                  new String[] { user2.getShortName(), AuthUtil.toGroupEntry(GROUP),<a name="line.673"></a>
-<span class="sourceLineNo">674</span>                      USER_OWNER.getShortName() }, Action.READ, Action.WRITE);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            Put p = new Put(TEST_ROW1);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123, ZERO);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            p.setACL(permsU1andOwner);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            t.put(p);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            p = new Put(TEST_ROW1);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123, ZERO);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>            p.setACL(permsU2andGUandOwner);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>            t.put(p);<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>            p = new Put(TEST_ROW1);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127, ZERO);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            p.setACL(permsU2andGUandOwner);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>            t.put(p);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>            p = new Put(TEST_ROW1);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127, ZERO);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>            p.setACL(permsU1andOwner);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>            t.put(p);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>        return null;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    }, USER_OWNER);<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // Increment considers the TimeRange set on it.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      @Override<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      public Void run() throws Exception {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>            Increment inc = new Increment(TEST_ROW1);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>            inc.setTimeRange(0, 123);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>            inc.addColumn(TEST_FAMILY1, TEST_Q1, 2L);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            t.increment(inc);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>            t.incrementColumnValue(TEST_ROW1, TEST_FAMILY1, TEST_Q2, 1L);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>          }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        }<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        return null;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    });<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>    verifyUserDeniedForIncrementMultipleVersions(user2, TEST_ROW1, TEST_Q2);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    verifyUserDeniedForIncrementMultipleVersions(GROUP_USER, TEST_ROW1, TEST_Q2);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>  private void verifyUserDeniedForIncrementMultipleVersions(final User user, final byte[] row,<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      final byte[] q1) throws IOException, InterruptedException {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      @Override<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      public Void run() throws Exception {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>            Increment inc = new Increment(row);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>            inc.setTimeRange(0, 127);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>            inc.addColumn(TEST_FAMILY1, q1, 2L);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>            t.increment(inc);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>            fail(user.getShortName() + " cannot do the increment.");<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          } catch (Exception e) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>          }<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        }<a name="line.734"></a>
-<span class="sourceLineNo">735</span>        return null;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      }<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    });<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  @Test<a name="line.740"></a>
-<span class="sourceLineNo">741</span>  public void testCellPermissionsForPutWithMultipleVersions() throws Exception {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    final byte[] TEST_Q1 = Bytes.toBytes("q1");<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    final byte[] TEST_Q2 = Bytes.toBytes("q2");<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>    verifyAllowed(new AccessTestAction() {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      public Object run() throws Exception {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>            Map&lt;String, Permission&gt; permsU1andOwner =<a name="line.755"></a>
-<span class="sourceLineNo">756</span>                prepareCellPermissions(<a name="line.756"></a>
-<span class="sourceLineNo">757</span>                  new String[] { user1.getShortName(), USER_OWNER.getShortName() }, Action.READ,<a name="line.757"></a>
-<span class="sourceLineNo">758</span>                  Action.WRITE);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>            Map&lt;String, Permission&gt; permsU2andGUandOwner =<a name="line.759"></a>
-<span class="sourceLineNo">760</span>                prepareCellPermissions(<a name="line.760"></a>
-<span class="sourceLineNo">761</span>                  new String[] { user1.getShortName(), AuthUtil.toGroupEntry(GROUP),<a name="line.761"></a>
-<span class="sourceLineNo">762</span>                      USER_OWNER.getShortName() }, Action.READ, Action.WRITE);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>            permsU2andGUandOwner.put(user2.getShortName(), new Permission(Permission.Action.READ,<a name="line.763"></a>
-<span class="sourceLineNo">764</span>                Permission.Action.WRITE));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>            permsU2andGUandOwner.put(USER_OWNER.getShortName(), new Permission(Permission.Action.READ,<a name="line.765"></a>
-<span class="sourceLineNo">766</span>                Permission.Action.WRITE));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>            Put p = new Put(TEST_ROW1);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123, ZERO);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>            p.setACL(permsU1andOwner);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>            t.put(p);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>            p = new Put(TEST_ROW1);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123, ZERO);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>            p.setACL(permsU2andGUandOwner);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            t.put(p);<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>            p = new Put(TEST_ROW1);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127, ZERO);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>            p.setACL(permsU2andGUandOwner);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>            t.put(p);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>            p = new Put(TEST_ROW1);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127, ZERO);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>            p.setACL(permsU1andOwner);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>            t.put(p);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>          }<a name="line.784"></a>
-<span class="sourceLineNo">785</span>        }<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        return null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      }<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }, USER_OWNER);<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span>    // new Put with TEST_Q1 column having TS=125. This covers old cell with TS 123 and user1 is<a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // having RW permission. While TEST_Q2 is with latest TS and so it covers old cell with TS 127.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // User1 is having RW permission on that too.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      @Override<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      public Void run() throws Exception {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.797"></a>
-<span class="sourceLineNo">798</span>            Put p = new Put(TEST_ROW1);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 125, ZERO);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, ZERO);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>            p.setACL(user2.getShortName(), new Permission(Permission.Action.READ,<a name="line.801"></a>
-<span class="sourceLineNo">802</span>                Permission.Action.WRITE));<a name="line.802"></a>
-<span class="sourceLineNo">803</span>            t.put(p);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>          }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>        }<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        return null;<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      }<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    });<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    verifyUserDeniedForPutMultipleVersions(user2, TEST_ROW1, TEST_Q1, TEST_Q2, ZERO);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    verifyUserDeniedForPutMultipleVersions(GROUP_USER, TEST_ROW1, TEST_Q1, TEST_Q2, ZERO);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  private void verifyUserDeniedForPutMultipleVersions(final User user, final byte[] row,<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      final byte[] q1, final byte[] q2, final byte[] value) throws IOException,<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      InterruptedException {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      @Override<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      public Void run() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>            Put p = new Put(row);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>            // column Q1 covers version at 123 fr which user2 do not have permission<a name="line.823"></a>
-<span class="sourceLineNo">824</span>            p.addColumn(TEST_FAMILY1, q1, 124, value);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>            p.addColumn(TEST_FAMILY1, q2, value);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            t.put(p);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            fail(user.getShortName() + " cannot do the put.");<a name="line.827"></a>
-<span class="sourceLineNo">828</span>          } catch (Exception e) {<a name="line.828"></a>
-<span class="sourceLineNo">829</span><a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>        }<a name="line.831"></a>
-<span class="sourceLineNo">832</span>        return null;<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      }<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    });<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>  @Test<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  public void testCellPermissionsForCheckAndDelete() throws Exception {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    final byte[] TEST_ROW1 = Bytes.toBytes("r1");<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    final byte[] TEST_Q3 = Bytes.toBytes("q3");<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    final byte[] ZERO = Bytes.toBytes(0L);<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>    final User user1 = User.createUserForTesting(conf, "user1", new String[0]);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    final User user2 = User.createUserForTesting(conf, "user2", new String[0]);<a name="line.844"></a>
-<span class="sourceLineNo">845</span><a name="line.845"></a>
-<span class="sourceLineNo">846</span>    verifyAllowed(new AccessTestAction() {<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      @Override<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      public Object run() throws Exception {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>            Map&lt;String, Permission&gt; permsU1andOwner =<a name="line.851"></a>
-<span class="sourceLineNo">852</span>                prepareCellPermissions(<a name="line.852"></a>
-<span class="sourceLineNo">853</span>                  new String[] { user1.getShortName(), USER_OWNER.getShortName() }, Action.READ,<a name="line.853"></a>
-<span class="sourceLineNo">854</span>                  Action.WRITE);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            Map&lt;String, Permission&gt; permsU1andU2andGUandOwner =<a name="line.855"></a>
-<span class="sourceLineNo">856</span>                prepareCellPermissions(new String[] { user1.getShortName(), user2.getShortName(),<a name="line.856"></a>
-<span class="sourceLineNo">857</span>                    AuthUtil.toGroupEntry(GROUP), USER_OWNER.getShortName() }, Action.READ,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>                  Action.WRITE);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>            Map&lt;String, Permission&gt; permsU1_U2andGU =<a name="line.859"></a>
-<span class="sourceLineNo">860</span>                prepareCellPermissions(new String[] { user1.getShortName(), user2.getShortName(),<a name="line.860"></a>
-<span class="sourceLineNo">861</span>                    AuthUtil.toGroupEntry(GROUP) }, Action.READ, Action.WRITE);<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>            Put p = new Put(TEST_ROW1);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 120, ZERO);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 120, ZERO);<a name="line.865"></a>
-<span class="sourceLineNo">866</span>            p.addColumn(TEST_FAMILY1, TEST_Q3, 120, ZERO);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>            p.setACL(permsU1andU2andGUandOwner);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            t.put(p);<a name="line.868"></a>
-<span class="sourceLineNo">869</span><a name="line.869"></a>
-<span class="sourceLineNo">870</span>            p = new Put(TEST_ROW1);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123, ZERO);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123, ZERO);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>            p.addColumn(TEST_FAMILY1, TEST_Q3, 123, ZERO);<a name="line.873"></a>
-<span class="sourceLineNo">874</span>            p.setACL(permsU1andOwner);<a name="line.874"></a>
-<span class="sourceLineNo">875</span>            t.put(p);<a name="line.875"></a>
-<span class="sourceLineNo">876</span><a name="line.876"></a>
-<span class="sourceLineNo">877</span>            p = new Put(TEST_ROW1);<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127, ZERO);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>            p.setACL(permsU1_U2andGU);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            t.put(p);<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>            p = new Put(TEST_ROW1);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127, ZERO);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>            p.setACL(user2.getShortName(), new Permission(Permission.Action.READ));<a name="line.884"></a>
-<span class="sourceLineNo">885</span>            t.put(p);<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>            p = new Put(TEST_ROW1);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            p.addColumn(TEST_FAMILY1, TEST_Q3, 127, ZERO);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>            p.setACL(AuthUtil.toGroupEntry(GROUP), new Permission(Permission.Action.READ));<a name="line.889"></a>
-<span class="sourceLineNo">890</span>            t.put(p);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>          }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>        }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        return null;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      }<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    }, USER_OWNER);<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>    // user1 should be allowed to do the checkAndDelete. user1 having read permission on the latest<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    // version cell and write permission on all versions<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    user1.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      @Override<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      public Void run() throws Exception {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>            Delete d = new Delete(TEST_ROW1);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>            d.addColumns(TEST_FAMILY1, TEST_Q1, 120);<a name="line.905"></a>
-<span class="sourceLineNo">906</span>            t.checkAndMutate(TEST_ROW1, TEST_FAMILY1).qualifier(TEST_Q1)<a name="line.906"></a>
-<span class="sourceLineNo">907</span>                .ifEquals(ZERO).thenDelete(d);<a name="line.907"></a>
-<span class="sourceLineNo">908</span>          }<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        return null;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>      }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    });<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // user2 shouldn't be allowed to do the checkAndDelete. user2 having RW permission on the latest<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // version cell but not on cell version TS=123<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    verifyUserDeniedForCheckAndDelete(user2, TEST_ROW1, ZERO);<a name="line.915"></a>
-<span class="sourceLineNo">916</span><a name="line.916"></a>
-<span class="sourceLineNo">917</span>    // GROUP_USER shouldn't be allowed to do the checkAndDelete. GROUP_USER having RW permission on<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // the latest<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    // version cell but not on cell version TS=123<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    verifyUserDeniedForCheckAndDelete(GROUP_USER, TEST_ROW1, ZERO);<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // user2 should be allowed to do the checkAndDelete when delete tries to delete the old version<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    // TS=120. user2 having R permission on the latest version(no W permission) cell<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    // and W permission on cell version TS=120.<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    verifyUserAllowedforCheckAndDelete(user2, TEST_ROW1, TEST_Q2, ZERO);<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>    // GROUP_USER should be allowed to do the checkAndDelete when delete tries to delete the old<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // version<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // TS=120. user2 having R permission on the latest version(no W permission) cell<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // and W permission on cell version TS=120.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    verifyUserAllowedforCheckAndDelete(GROUP_USER, TEST_ROW1, TEST_Q3, ZERO);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  }<a name="line.932"></a>
-<span class="sourceLineNo">933</span><a name="line.933"></a>
-<span class="sourceLineNo">934</span>  private void verifyUserAllowedforCheckAndDelete(final User user, final byte[] row,<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      final byte[] q1, final byte[] value) throws IOException, InterruptedException {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      @Override<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      public Void run() throws Exception {<a name="line.938"></a>
-<span class="sourceLineNo">939</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            Delete d = new Delete(row);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            d.addColumn(TEST_FAMILY1, q1, 120);<a name="line.942"></a>
-<span class="sourceLineNo">943</span>            t.checkAndMutate(row, TEST_FAMILY1).qualifier(q1).ifEquals(value).thenDelete(d);<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          }<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        }<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        return null;<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      }<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    });<a name="line.948"></a>
-<span class="sourceLineNo">949</span>  }<a name="line.949"></a>
-<span class="sourceLineNo">950</span><a name="line.950"></a>
-<span class="sourceLineNo">951</span>  private void verifyUserDeniedForCheckAndDelete(final User user, final byte[] row,<a name="line.951"></a>
-<span class="sourceLineNo">952</span>      final byte[] value) throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    user.runAs(new PrivilegedExceptionAction&lt;Void&gt;() {<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      @Override<a name="line.954"></a>
-<span class="sourceLineNo">955</span>      public Void run() throws Exception {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          try (Table t = connection.getTable(TEST_TABLE.getTableName())) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>            Delete d = new Delete(row);<a name="line.958"></a>
-<span class="sourceLineNo">959</span>            d.addColumns(TEST_FAMILY1, TEST_Q1);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>            t.checkAndMutate(row, TEST_FAMILY1).qualifier(TEST_Q1).ifEquals(value).thenDelete(d);<a name="line.960"></a>
-<span class="sourceLineNo">961</span>            fail(user.getShortName() + " should not be allowed to do checkAndDelete");<a name="line.961"></a>
-<span class="sourceLineNo">962</span>          } catch (Exception e) {<a name="line.962"></a>
-<span class="sourceLineNo">963</span>          }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        return null;<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      }<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    });<a name="line.967"></a>
-<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>  @After<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public void tearDown() throws Exception {<a name="line.971"></a>
-<span class="sourceLineNo">972</span>    // Clean the _acl_ table<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    try {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      TEST_UTIL.deleteTable(TEST_TABLE.getTableName());<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    } catch (TableNotFoundException ex) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>      // Test deleted the table, no problem<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      LOG.info("Test deleted table " + TEST_TABLE.getTableName());<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    assertEquals(0, PermissionStorage.getTablePermissions(conf, TEST_TABLE.getTableName()).size());<a name="line.979"></a>
-<span class="sourceLineNo">980</span>  }<a name="line.980"></a>
-<span class="sourceLineNo">981</span>}<a name="line.981"></a>
+<span class="sourceLineNo">441</span>    // Issue a DELETE for the family, should succeed because the future ACL is<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // not considered<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    AccessTestAction deleteFamily1 = getDeleteFamilyAction(TEST_FAMILY1);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    AccessTestAction deleteFamily2 = getDeleteFamilyAction(TEST_FAMILY2);<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    verifyAllowed(deleteFamily1, USER_OTHER);<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    verifyAllowed(deleteFamily2, GROUP_USER);<a name="line.447"></a>
+<span class="sourceLineNo">448</span><a name="line.448"></a>
+<span class="sourceLineNo">449</span>    // The future put should still exist<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    verifyAllowed(getQ1, USER_OWNER, USER_OTHER,GROUP_USER);<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>    // The other put should be covered by the tombstone<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>    verifyIfNull(getQ2, USER_OTHER, GROUP_USER);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private AccessTestAction getDeleteFamilyAction(final byte[] fam) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    AccessTestAction deleteFamilyAction = new AccessTestAction() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      @Override<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      public Object run() throws Exception {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>        Delete delete = new Delete(TEST_ROW).addFamily(fam);<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            t.delete(delete);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          }<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        return null;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    };<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return deleteFamilyAction;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  public void testCellPermissionsWithDeleteWithUserTs() throws Exception {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    USER_OWNER.runAs(new AccessTestAction() {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      @Override<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      public Object run() throws Exception {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        try (Connection connection = ConnectionFactory.createConnection(conf)) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          try (Table t = connection.getTable(testTable.getTableName())) {<a name="line.480"></a>
+<span class="sourceLineNo">481</span>            // This version (TS = 123) with rw ACL for USER_OTHER and USER_OTHER2<a name="line.481"></a>
+<span class="sourceLineNo">482</span>            Put p = new Put(TEST_ROW);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 123L, ZERO);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 123L, ZERO);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            p.setACL(prepareCellPermissions(<a name="line.485"></a>
+<span class="sourceLineNo">486</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP),<a name="line.486"></a>
+<span class="sourceLineNo">487</span>                  USER_OTHER2.getShortName() }, Permission.Action.READ, Permission.Action.WRITE));<a name="line.487"></a>
+<span class="sourceLineNo">488</span>            t.put(p);<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>            // This version (TS = 125) with rw ACL for USER_OTHER<a name="line.490"></a>
+<span class="sourceLineNo">491</span>            p = new Put(TEST_ROW);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 125L, ONE);<a name="line.492"></a>
+<span class="sourceLineNo">493</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 125L, ONE);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>            p.setACL(prepareCellPermissions(<a name="line.494"></a>
+<span class="sourceLineNo">495</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) },<a name="line.495"></a>
+<span class="sourceLineNo">496</span>              Action.READ, Action.WRITE));<a name="line.496"></a>
+<span class="sourceLineNo">497</span>            t.put(p);<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>            // This version (TS = 127) with rw ACL for USER_OTHER<a name="line.499"></a>
+<span class="sourceLineNo">500</span>            p = new Put(TEST_ROW);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>            p.addColumn(TEST_FAMILY1, TEST_Q1, 127L, TWO);<a name="line.501"></a>
+<span class="sourceLineNo">502</span>            p.addColumn(TEST_FAMILY1, TEST_Q2, 127L, TWO);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>            p.setACL(prepareCellPermissions(<a name="line.503"></a>
+<span class="sourceLineNo">504</span>              new String[] { USER_OTHER.getShortName(), AuthUtil.toGroupEntry(GROUP) },<a name="line.504"></a>
+<span class="sourceLineNo">505</span>              Action.READ, Action.WRITE));<a name="line.505"></a>
+<span class="sourceLineNo">506</span>            t.put(p);<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>            return null;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    });<a name="line.512"></a>
+<span class="sourceLineNo">513</span><a name="line.513"></a>
+<span class="sourceLineNo">514</span>    // USER_OTHER2 should be allowed to delete the column f1:q1 versions older than TS 124L<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    USER_OTHER2.runAs(new AccessTestAction() {<a name="line.515"></a>
... 3952 lines suppressed ...