You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ec...@apache.org on 2016/02/29 18:17:45 UTC
hbase git commit: HBASE-14878 Add hbase-shaded-client archetype to
hbase-archetypes
Repository: hbase
Updated Branches:
refs/heads/master 88f775996 -> 83297f661
HBASE-14878 Add hbase-shaded-client archetype to hbase-archetypes
Signed-off-by: Elliott Clark <ec...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/83297f66
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/83297f66
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/83297f66
Branch: refs/heads/master
Commit: 83297f661b80af58190591c57d3cef1e6496e56b
Parents: 88f7759
Author: Daniel Vimont <da...@commonvox.org>
Authored: Tue Feb 23 13:13:56 2016 +0900
Committer: Elliott Clark <ec...@apache.org>
Committed: Mon Feb 29 09:09:37 2016 -0800
----------------------------------------------------------------------
hbase-archetypes/README.md | 10 +-
.../hbase-archetype-builder/createArchetypes.sh | 4 +
.../installArchetypes.sh | 4 +
.../hbase-archetype-builder/pom.xml | 74 +++++-
.../hbase-shaded-client-project/pom.xml | 76 +++++++
.../exemplars/shaded_client/HelloHBase.java | 226 +++++++++++++++++++
.../exemplars/shaded_client/package-info.java | 25 ++
.../src/main/resources/log4j.properties | 111 +++++++++
.../exemplars/shaded_client/TestHelloHBase.java | 131 +++++++++++
hbase-archetypes/pom.xml | 3 +-
10 files changed, 659 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/README.md
----------------------------------------------------------------------
diff --git a/hbase-archetypes/README.md b/hbase-archetypes/README.md
index 3af1f8b..7997b56 100644
--- a/hbase-archetypes/README.md
+++ b/hbase-archetypes/README.md
@@ -81,11 +81,15 @@ of the new archetype. (It may be most straightforward to simply copy the `src`
and `pom.xml` components from one of the existing exemplar projects, replace
the `src/main` and `src/test` code, and modify the `pom.xml` file's
`<dependencies>`, `<artifactId>`,` <name>`, and `<description>` elements.)
-2. Modify the `hbase-archetype-builder/pom.xml` file: (a) add the new exemplar
-project to the `<modules>` element, and (b) add appropriate `<execution>`
+2. Modify the `hbase-archetypes/pom.xml` file: add a new `<module>` subelement
+to the `<modules>` element, with the new exemplar project's subdirectory name
+as its value.
+3. Modify the `hbase-archetype-builder/pom.xml` file: (a) add a new `<*.dir>`
+subelement to the `<properties>` element, with the new exemplar project's
+subdirectory name as its value, and (b) add appropriate `<execution>`
elements and `<transformationSet>` elements within the `<plugin>` elements
(using the existing entries from already-existing exemplar projects as a guide).
-3. Add appropriate entries for the new exemplar project to the
+4. Add appropriate entries for the new exemplar project to the
`createArchetypes.sh` and `installArchetypes.sh` scripts in the
`hbase-archetype-builder` subdirectory (using the existing entries as a guide).
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-archetype-builder/createArchetypes.sh
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/createArchetypes.sh b/hbase-archetypes/hbase-archetype-builder/createArchetypes.sh
index 3aeb1c3..067fbd9 100755
--- a/hbase-archetypes/hbase-archetype-builder/createArchetypes.sh
+++ b/hbase-archetypes/hbase-archetype-builder/createArchetypes.sh
@@ -25,6 +25,10 @@ buildArchetypeSubdir=target/build-archetype
cd /"$workingDir"/../hbase-client-project/$buildArchetypeSubdir
mvn archetype:create-from-project
+# CREATE hbase-shaded-client archetype
+cd /"$workingDir"/../hbase-shaded-client-project/$buildArchetypeSubdir
+mvn archetype:create-from-project
+
# add entries for additional archetypes above this comment (modeled on entries above)
cd "$workingDir"
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-archetype-builder/installArchetypes.sh
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/installArchetypes.sh b/hbase-archetypes/hbase-archetype-builder/installArchetypes.sh
index 74f118e..1067a1f 100755
--- a/hbase-archetypes/hbase-archetype-builder/installArchetypes.sh
+++ b/hbase-archetypes/hbase-archetype-builder/installArchetypes.sh
@@ -26,6 +26,10 @@ archetypeSourceSubdir=target/generated-sources/archetype
cd /"$workingDir"/../hbase-client-project/$buildArchetypeSubdir/$archetypeSourceSubdir
mvn install
+# INSTALL hbase-shaded-client archetype
+cd /"$workingDir"/../hbase-shaded-client-project/$buildArchetypeSubdir/$archetypeSourceSubdir
+mvn install
+
# add entries for additional archetypes above this comment (modeled on entries above)
cd "$workingDir"
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-archetype-builder/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/pom.xml b/hbase-archetypes/hbase-archetype-builder/pom.xml
index 00a1305..1672dea 100644
--- a/hbase-archetypes/hbase-archetype-builder/pom.xml
+++ b/hbase-archetypes/hbase-archetype-builder/pom.xml
@@ -41,6 +41,7 @@
<temp.exemplar.subdir>target/temp</temp.exemplar.subdir>
<temp.archetype.subdir>target/temp-arch</temp.archetype.subdir>
<hbase-client.dir>hbase-client-project</hbase-client.dir>
+ <hbase-shaded-client.dir>hbase-shaded-client-project</hbase-shaded-client.dir>
<!-- For new archetype, add corresponding *.dir property above this comment.
(See hbase-archetypes/README.txt for details on adding new archetype.) -->
</properties>
@@ -52,7 +53,7 @@
<version>2.7</version>
<executions>
<!-- maven-resources-plugin copies each exemplar project's src directory to
- ${build.archetype.subdir} subdirectory, and copy each project's pom.xml file
+ ${build.archetype.subdir} subdirectory, and copies each project's pom.xml file
to ${temp.exemplar.subdir} subdirectory. (Filtering during copy replaces
${project-version} with literal value). The pom.xml files are processed
further using xml-maven-plugin for xslt transformation, below. -->
@@ -93,6 +94,43 @@
</resources>
</configuration>
</execution>
+ <execution>
+ <id>hbase-shaded-client__copy-src-to-build-archetype-subdir</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>/${project.basedir}/../${hbase-shaded-client.dir}/${build.archetype.subdir}</outputDirectory>
+ <resources>
+ <resource>
+ <directory>/${project.basedir}/../${hbase-shaded-client.dir}</directory>
+ <includes>
+ <include>src/**</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>hbase-shaded-client__copy-pom-to-temp-for-xslt-processing</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>/${project.basedir}/../${hbase-shaded-client.dir}/${temp.exemplar.subdir}</outputDirectory>
+ <resources>
+ <resource>
+ <directory>/${project.basedir}/../${hbase-shaded-client.dir}</directory>
+ <filtering>true</filtering> <!-- filtering replaces ${project.version} with literal -->
+ <includes>
+ <include>pom.xml</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
<!-- For new archetype, add pair of <execution> elements (modeled on existing elements) above this comment. -->
<!-- maven-resources-plugin copies each archetype project's pom.xml file
@@ -116,6 +154,24 @@
</resources>
</configuration>
</execution>
+ <execution>
+ <id>hbase-shaded-client-ARCHETYPE__copy-pom-to-temp-for-xslt-processing</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>/${project.basedir}/../${hbase-shaded-client.dir}/${temp.archetype.subdir}</outputDirectory>
+ <resources>
+ <resource>
+ <directory>/${project.basedir}/../${hbase-shaded-client.dir}/${build.archetype.subdir}/${archetype.source.subdir}</directory>
+ <includes>
+ <include>pom.xml</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
<!-- For new archetype, add <execution> element (modeled on existing elements) above this comment. -->
</executions>
</plugin>
@@ -142,6 +198,14 @@
<outputDir>/${project.basedir}/../${hbase-client.dir}/${build.archetype.subdir}</outputDir>
<stylesheet>modify_exemplar_pom.xsl</stylesheet>
</transformationSet>
+ <transformationSet>
+ <dir>/${project.basedir}/../${hbase-shaded-client.dir}/${temp.exemplar.subdir}</dir>
+ <includes>
+ <include>pom.xml</include>
+ </includes>
+ <outputDir>/${project.basedir}/../${hbase-shaded-client.dir}/${build.archetype.subdir}</outputDir>
+ <stylesheet>modify_exemplar_pom.xsl</stylesheet>
+ </transformationSet>
<!-- For new archetype, add <transformationSet> element (modeled on existing elements) above this comment. -->
</transformationSets>
</configuration>
@@ -164,6 +228,14 @@
<outputDir>/${project.basedir}/../${hbase-client.dir}/${build.archetype.subdir}/${archetype.source.subdir}</outputDir>
<stylesheet>modify_archetype_pom.xsl</stylesheet>
</transformationSet>
+ <transformationSet>
+ <dir>/${project.basedir}/../${hbase-shaded-client.dir}/${temp.archetype.subdir}</dir>
+ <includes>
+ <include>pom.xml</include>
+ </includes>
+ <outputDir>/${project.basedir}/../${hbase-shaded-client.dir}/${build.archetype.subdir}/${archetype.source.subdir}</outputDir>
+ <stylesheet>modify_archetype_pom.xsl</stylesheet>
+ </transformationSet>
<!-- For new archetype, add <transformationSet> element (modeled on existing elements) above this comment. -->
</transformationSets>
</configuration>
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-shaded-client-project/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/pom.xml b/hbase-archetypes/hbase-shaded-client-project/pom.xml
new file mode 100644
index 0000000..6f73033
--- /dev/null
+++ b/hbase-archetypes/hbase-shaded-client-project/pom.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation=
+ "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <!--
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>hbase-archetypes</artifactId>
+ <groupId>org.apache.hbase</groupId>
+ <version>2.0.0-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>hbase-shaded-client-project</artifactId>
+ <packaging>jar</packaging>
+ <name>Apache HBase - Exemplar for hbase-shaded-client archetype</name>
+ <description>Exemplar project for archetype with hbase-shaded-client dependency</description>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <maven.compiler.source>${compileSource}</maven.compiler.source>
+ <maven.compiler.target>${compileSource}</maven.compiler.target>
+ <surefire.version>2.19</surefire.version>
+ <junit.version>4.12</junit.version>
+ </properties>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${surefire.version}</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+ <!-- Dependency for hbase-testing-util must precede compile-scoped dependencies. -->
+ <dependency>
+ <groupId>org.apache.hbase</groupId>
+ <artifactId>hbase-testing-util</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.hbase</groupId>
+ <artifactId>hbase-shaded-client</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.java
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.java b/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.java
new file mode 100644
index 0000000..1c6b8bb
--- /dev/null
+++ b/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/HelloHBase.java
@@ -0,0 +1,226 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hbase.archetypes.exemplars.shaded_client;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+import java.util.NavigableMap;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
+import org.apache.hadoop.hbase.NamespaceNotFoundException;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.Connection;
+import org.apache.hadoop.hbase.client.ConnectionFactory;
+import org.apache.hadoop.hbase.client.Delete;
+import org.apache.hadoop.hbase.client.Get;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.util.Bytes;
+
+/**
+ * Successful running of this application requires access to an active instance
+ * of HBase. For install instructions for a standalone instance of HBase, please
+ * refer to https://hbase.apache.org/book.html#quickstart
+ */
+public final class HelloHBase {
+
+ protected static final String MY_NAMESPACE_NAME = "myTestNamespace";
+ static final TableName MY_TABLE_NAME = TableName.valueOf("myTestTable");
+ static final byte[] MY_COLUMN_FAMILY_NAME = Bytes.toBytes("cf");
+ static final byte[] MY_FIRST_COLUMN_QUALIFIER
+ = Bytes.toBytes("myFirstColumn");
+ static final byte[] MY_SECOND_COLUMN_QUALIFIER
+ = Bytes.toBytes("mySecondColumn");
+ static final byte[] MY_ROW_ID = Bytes.toBytes("rowId01");
+
+ // Private constructor included here to avoid checkstyle warnings
+ private HelloHBase() {
+ }
+
+ public static void main(final String[] args) throws IOException {
+ final boolean deleteAllAtEOJ = true;
+
+ /**
+ * ConnectionFactory#createConnection() automatically looks for
+ * hbase-site.xml (HBase configuration parameters) on the system's
+ * CLASSPATH, to enable creation of Connection to HBase via Zookeeper.
+ */
+ try (Connection connection = ConnectionFactory.createConnection();
+ Admin admin = connection.getAdmin()) {
+
+ admin.getClusterStatus(); // assure connection successfully established
+ System.out.println("\n*** Hello HBase! -- Connection has been "
+ + "established via Zookeeper!!\n");
+
+ createNamespaceAndTable(admin);
+
+ System.out.println("Getting a Table object for [" + MY_TABLE_NAME
+ + "] with which to perform CRUD operations in HBase.");
+ try (Table table = connection.getTable(MY_TABLE_NAME)) {
+
+ putRowToTable(table);
+ getAndPrintRowContents(table);
+
+ if (deleteAllAtEOJ) {
+ deleteRow(table);
+ }
+ }
+
+ if (deleteAllAtEOJ) {
+ deleteNamespaceAndTable(admin);
+ }
+ }
+ }
+
+ /**
+ * Invokes Admin#createNamespace and Admin#createTable to create a namespace
+ * with a table that has one column-family.
+ *
+ * @param admin Standard Admin object
+ * @throws IOException If IO problem encountered
+ */
+ static void createNamespaceAndTable(final Admin admin) throws IOException {
+
+ if (!namespaceExists(admin, MY_NAMESPACE_NAME)) {
+ System.out.println("Creating Namespace [" + MY_NAMESPACE_NAME + "].");
+
+ admin.createNamespace(NamespaceDescriptor
+ .create(MY_NAMESPACE_NAME).build());
+ }
+ if (!admin.tableExists(MY_TABLE_NAME)) {
+ System.out.println("Creating Table [" + MY_TABLE_NAME.getNameAsString()
+ + "], with one Column Family ["
+ + Bytes.toString(MY_COLUMN_FAMILY_NAME) + "].");
+
+ admin.createTable(new HTableDescriptor(MY_TABLE_NAME)
+ .addFamily(new HColumnDescriptor(MY_COLUMN_FAMILY_NAME)));
+ }
+ }
+
+ /**
+ * Invokes Table#put to store a row (with two new columns created 'on the
+ * fly') into the table.
+ *
+ * @param table Standard Table object (used for CRUD operations).
+ * @throws IOException If IO problem encountered
+ */
+ static void putRowToTable(final Table table) throws IOException {
+
+ table.put(new Put(MY_ROW_ID).addColumn(MY_COLUMN_FAMILY_NAME,
+ MY_FIRST_COLUMN_QUALIFIER,
+ Bytes.toBytes("Hello")).addColumn(MY_COLUMN_FAMILY_NAME,
+ MY_SECOND_COLUMN_QUALIFIER,
+ Bytes.toBytes("World!")));
+
+ System.out.println("Row [" + Bytes.toString(MY_ROW_ID)
+ + "] was put into Table ["
+ + table.getName().getNameAsString() + "] in HBase;\n"
+ + " the row's two columns (created 'on the fly') are: ["
+ + Bytes.toString(MY_COLUMN_FAMILY_NAME) + ":"
+ + Bytes.toString(MY_FIRST_COLUMN_QUALIFIER)
+ + "] and [" + Bytes.toString(MY_COLUMN_FAMILY_NAME) + ":"
+ + Bytes.toString(MY_SECOND_COLUMN_QUALIFIER) + "]");
+ }
+
+ /**
+ * Invokes Table#get and prints out the contents of the retrieved row.
+ *
+ * @param table Standard Table object
+ * @throws IOException If IO problem encountered
+ */
+ static void getAndPrintRowContents(final Table table) throws IOException {
+
+ Result row = table.get(new Get(MY_ROW_ID));
+
+ System.out.println("Row [" + Bytes.toString(row.getRow())
+ + "] was retrieved from Table ["
+ + table.getName().getNameAsString()
+ + "] in HBase, with the following content:");
+
+ for (Entry<byte[], NavigableMap<byte[], byte[]>> colFamilyEntry
+ : row.getNoVersionMap().entrySet()) {
+ String columnFamilyName = Bytes.toString(colFamilyEntry.getKey());
+
+ System.out.println(" Columns in Column Family [" + columnFamilyName
+ + "]:");
+
+ for (Entry<byte[], byte[]> columnNameAndValueMap
+ : colFamilyEntry.getValue().entrySet()) {
+
+ System.out.println(" Value of Column [" + columnFamilyName + ":"
+ + Bytes.toString(columnNameAndValueMap.getKey()) + "] == "
+ + Bytes.toString(columnNameAndValueMap.getValue()));
+ }
+ }
+ }
+
+ /**
+ * Checks to see whether a namespace exists.
+ *
+ * @param admin Standard Admin object
+ * @param namespaceName Name of namespace
+ * @return true If namespace exists
+ * @throws IOException If IO problem encountered
+ */
+ static boolean namespaceExists(final Admin admin, final String namespaceName)
+ throws IOException {
+ try {
+ admin.getNamespaceDescriptor(namespaceName);
+ } catch (NamespaceNotFoundException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Invokes Table#delete to delete test data (i.e. the row)
+ *
+ * @param table Standard Table object
+ * @throws IOException If IO problem is encountered
+ */
+ static void deleteRow(final Table table) throws IOException {
+ System.out.println("Deleting row [" + Bytes.toString(MY_ROW_ID)
+ + "] from Table ["
+ + table.getName().getNameAsString() + "].");
+ table.delete(new Delete(MY_ROW_ID));
+ }
+
+ /**
+ * Invokes Admin#disableTable, Admin#deleteTable, and Admin#deleteNamespace to
+ * disable/delete Table and delete Namespace.
+ *
+ * @param admin Standard Admin object
+ * @throws IOException If IO problem is encountered
+ */
+ static void deleteNamespaceAndTable(final Admin admin) throws IOException {
+ if (admin.tableExists(MY_TABLE_NAME)) {
+ System.out.println("Disabling/deleting Table ["
+ + MY_TABLE_NAME.getNameAsString() + "].");
+ admin.disableTable(MY_TABLE_NAME); // Disable a table before deleting it.
+ admin.deleteTable(MY_TABLE_NAME);
+ }
+ if (namespaceExists(admin, MY_NAMESPACE_NAME)) {
+ System.out.println("Deleting Namespace [" + MY_NAMESPACE_NAME + "].");
+ admin.deleteNamespace(MY_NAMESPACE_NAME);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/package-info.java
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/package-info.java b/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/package-info.java
new file mode 100644
index 0000000..754be16
--- /dev/null
+++ b/hbase-archetypes/hbase-shaded-client-project/src/main/java/org/apache/hbase/archetypes/exemplars/shaded_client/package-info.java
@@ -0,0 +1,25 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * This package provides fully-functional exemplar Java code demonstrating
+ * simple usage of the hbase-client API, for incorporation into a Maven
+ * archetype with hbase-shaded-client dependency.
+ */
+package org.apache.hbase.archetypes.exemplars.shaded_client;
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-shaded-client-project/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/src/main/resources/log4j.properties b/hbase-archetypes/hbase-shaded-client-project/src/main/resources/log4j.properties
new file mode 100644
index 0000000..d7c4552
--- /dev/null
+++ b/hbase-archetypes/hbase-shaded-client-project/src/main/resources/log4j.properties
@@ -0,0 +1,111 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Define some default values that can be overridden by system properties
+hbase.root.logger=INFO,console
+hbase.security.logger=INFO,console
+hbase.log.dir=.
+hbase.log.file=hbase.log
+
+# Define the root logger to the system property "hbase.root.logger".
+log4j.rootLogger=${hbase.root.logger}
+
+# Logging Threshold
+log4j.threshold=ALL
+
+#
+# Daily Rolling File Appender
+#
+log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.DRFA.File=${hbase.log.dir}/${hbase.log.file}
+
+# Rollver at midnight
+log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
+
+# 30-day backup
+#log4j.appender.DRFA.MaxBackupIndex=30
+log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
+
+# Pattern format: Date LogLevel LoggerName LogMessage
+log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n
+
+# Rolling File Appender properties
+hbase.log.maxfilesize=256MB
+hbase.log.maxbackupindex=20
+
+# Rolling File Appender
+log4j.appender.RFA=org.apache.log4j.RollingFileAppender
+log4j.appender.RFA.File=${hbase.log.dir}/${hbase.log.file}
+
+log4j.appender.RFA.MaxFileSize=${hbase.log.maxfilesize}
+log4j.appender.RFA.MaxBackupIndex=${hbase.log.maxbackupindex}
+
+log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
+log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n
+
+#
+# Security audit appender
+#
+hbase.security.log.file=SecurityAuth.audit
+hbase.security.log.maxfilesize=256MB
+hbase.security.log.maxbackupindex=20
+log4j.appender.RFAS=org.apache.log4j.RollingFileAppender
+log4j.appender.RFAS.File=${hbase.log.dir}/${hbase.security.log.file}
+log4j.appender.RFAS.MaxFileSize=${hbase.security.log.maxfilesize}
+log4j.appender.RFAS.MaxBackupIndex=${hbase.security.log.maxbackupindex}
+log4j.appender.RFAS.layout=org.apache.log4j.PatternLayout
+log4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
+log4j.category.SecurityLogger=${hbase.security.logger}
+log4j.additivity.SecurityLogger=false
+#log4j.logger.SecurityLogger.org.apache.hadoop.hbase.security.access.AccessController=TRACE
+#log4j.logger.SecurityLogger.org.apache.hadoop.hbase.security.visibility.VisibilityController=TRACE
+
+#
+# Null Appender
+#
+log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender
+
+#
+# console
+# Add "console" to rootlogger above if you want to use this
+#
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.target=System.err
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n
+
+# Custom Logging levels
+
+log4j.logger.org.apache.zookeeper=INFO
+#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
+log4j.logger.org.apache.hadoop.hbase=INFO
+# Make these two classes INFO-level. Make them DEBUG to see more zk debug.
+log4j.logger.org.apache.hadoop.hbase.zookeeper.ZKUtil=INFO
+log4j.logger.org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher=INFO
+#log4j.logger.org.apache.hadoop.dfs=DEBUG
+# Set this class to log INFO only otherwise its OTT
+# Enable this to get detailed connection error/retry logging.
+# log4j.logger.org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation=TRACE
+
+
+# Uncomment this line to enable tracing on _every_ RPC call (this can be a lot of output)
+#log4j.logger.org.apache.hadoop.ipc.HBaseServer.trace=DEBUG
+
+# Uncomment the below if you want to remove logging of client region caching'
+# and scan of hbase:meta messages
+# log4j.logger.org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation=INFO
+# log4j.logger.org.apache.hadoop.hbase.client.MetaScanner=INFO
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/hbase-shaded-client-project/src/test/java/org/apache/hbase/archetypes/exemplars/shaded_client/TestHelloHBase.java
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/src/test/java/org/apache/hbase/archetypes/exemplars/shaded_client/TestHelloHBase.java b/hbase-archetypes/hbase-shaded-client-project/src/test/java/org/apache/hbase/archetypes/exemplars/shaded_client/TestHelloHBase.java
new file mode 100644
index 0000000..cc5e201
--- /dev/null
+++ b/hbase-archetypes/hbase-shaded-client-project/src/test/java/org/apache/hbase/archetypes/exemplars/shaded_client/TestHelloHBase.java
@@ -0,0 +1,131 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hbase.archetypes.exemplars.shaded_client;
+
+import java.io.IOException;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
+import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.Get;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.testclassification.MediumTests;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.junit.AfterClass;
+import static org.junit.Assert.assertEquals;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Unit testing for HelloHBase.
+ */
+@Category(MediumTests.class)
+public class TestHelloHBase {
+
+ private static final HBaseTestingUtility TEST_UTIL
+ = new HBaseTestingUtility();
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ TEST_UTIL.startMiniCluster(1);
+ }
+
+ @AfterClass
+ public static void afterClass() throws Exception {
+ TEST_UTIL.shutdownMiniCluster();
+ }
+
+ @Test
+ public void testNamespaceExists() throws Exception {
+ final String NONEXISTENT_NAMESPACE = "xyzpdq_nonexistent";
+ final String EXISTING_NAMESPACE = "pdqxyz_myExistingNamespace";
+ boolean exists;
+ Admin admin = TEST_UTIL.getHBaseAdmin();
+
+ exists = HelloHBase.namespaceExists(admin, NONEXISTENT_NAMESPACE);
+ assertEquals("#namespaceExists failed: found nonexistent namespace.",
+ false, exists);
+
+ admin.createNamespace
+ (NamespaceDescriptor.create(EXISTING_NAMESPACE).build());
+ exists = HelloHBase.namespaceExists(admin, EXISTING_NAMESPACE);
+ assertEquals("#namespaceExists failed: did NOT find existing namespace.",
+ true, exists);
+ admin.deleteNamespace(EXISTING_NAMESPACE);
+ }
+
+ @Test
+ public void testCreateNamespaceAndTable() throws Exception {
+ Admin admin = TEST_UTIL.getHBaseAdmin();
+ HelloHBase.createNamespaceAndTable(admin);
+
+ boolean namespaceExists
+ = HelloHBase.namespaceExists(admin, HelloHBase.MY_NAMESPACE_NAME);
+ assertEquals("#createNamespaceAndTable failed to create namespace.",
+ true, namespaceExists);
+
+ boolean tableExists = admin.tableExists(HelloHBase.MY_TABLE_NAME);
+ assertEquals("#createNamespaceAndTable failed to create table.",
+ true, tableExists);
+
+ admin.disableTable(HelloHBase.MY_TABLE_NAME);
+ admin.deleteTable(HelloHBase.MY_TABLE_NAME);
+ admin.deleteNamespace(HelloHBase.MY_NAMESPACE_NAME);
+ }
+
+ @Test
+ public void testPutRowToTable() throws IOException {
+ Admin admin = TEST_UTIL.getAdmin();
+ admin.createNamespace
+ (NamespaceDescriptor.create(HelloHBase.MY_NAMESPACE_NAME).build());
+ Table table
+ = TEST_UTIL.createTable
+ (HelloHBase.MY_TABLE_NAME, HelloHBase.MY_COLUMN_FAMILY_NAME);
+
+ HelloHBase.putRowToTable(table);
+ Result row = table.get(new Get(HelloHBase.MY_ROW_ID));
+ assertEquals("#putRowToTable failed to store row.", false, row.isEmpty());
+
+ TEST_UTIL.deleteTable(HelloHBase.MY_TABLE_NAME);
+ admin.deleteNamespace(HelloHBase.MY_NAMESPACE_NAME);
+ }
+
+ @Test
+ public void testDeleteRow() throws IOException {
+ Admin admin = TEST_UTIL.getAdmin();
+ admin.createNamespace
+ (NamespaceDescriptor.create(HelloHBase.MY_NAMESPACE_NAME).build());
+ Table table
+ = TEST_UTIL.createTable
+ (HelloHBase.MY_TABLE_NAME, HelloHBase.MY_COLUMN_FAMILY_NAME);
+
+ table.put(new Put(HelloHBase.MY_ROW_ID).
+ addColumn(HelloHBase.MY_COLUMN_FAMILY_NAME,
+ HelloHBase.MY_FIRST_COLUMN_QUALIFIER,
+ Bytes.toBytes("xyz")));
+ HelloHBase.deleteRow(table);
+ Result row = table.get(new Get(HelloHBase.MY_ROW_ID));
+ assertEquals("#deleteRow failed to delete row.", true, row.isEmpty());
+
+ TEST_UTIL.deleteTable(HelloHBase.MY_TABLE_NAME);
+ admin.deleteNamespace(HelloHBase.MY_NAMESPACE_NAME);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/83297f66/hbase-archetypes/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-archetypes/pom.xml b/hbase-archetypes/pom.xml
index f011c2e..0c6c5d1 100644
--- a/hbase-archetypes/pom.xml
+++ b/hbase-archetypes/pom.xml
@@ -36,8 +36,9 @@
<modules>
<module>hbase-client-project</module>
+ <module>hbase-shaded-client-project</module>
<!-- For new archetype, add exemplar project above this comment.
- (See hbase-archetypes/README.txt for details on adding new archetype.) -->
+ (See hbase-archetypes/README.md for details on adding new archetype.) -->
<module>hbase-archetype-builder</module>
</modules>