Browse Source

HADOOP-1375 a simple parser for hbase
M src/contrib/hbase/NOTICE.txt
Add notice of udanax contributions.
Msrc/contrib/hbase/conf/hbase-default.xml
(hbaseshell.jline.bell.enabled): Added.
M src/contrib/hbase/CHANGES.txt
(hadoop-1375) Added.
M src/contrib/hbase/src/java/org/apache/hadoop/hbase/package.html
Add note on how to start up hbase shell
M src/contrib/hbase/bin/hbase
Add 'shell'. Remove 'client' (shell does what it used do and more).
Removed all reader and logreader until better developed. Starting
up a reader or logreader on a running hbase system could do damage).
M src/contrib/hbase/build.xml
Add a javacc target to generate content of shell/generated subpackage.
A src/contrib/hbase/src/test/org/apache/hadoop/hbase/shell/TestHBaseShell.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/Shell.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DeleteCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CreateCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DropCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/InsertCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CommandFactory.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpContents.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ExitCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ConsoleTable.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DescCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SelectCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/Command.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ShowCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/BasicCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpManager.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ReturnMsg.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HBaseShell.jj
Added.
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Token.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/TokenMgrError.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/SimpleCharStream.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserTokenManager.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParseException.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserConstants.java
A src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Parser.java
Added javacc generated files.


git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@555415 13f79535-47bb-0310-9956-ffa450edef68

Michael Stack 18 years ago
parent
commit
ae01addfd9
32 changed files with 4543 additions and 14 deletions
  1. 1 2
      src/contrib/hbase/CHANGES.txt
  2. 5 2
      src/contrib/hbase/NOTICE.txt
  3. 3 9
      src/contrib/hbase/bin/hbase
  4. 26 1
      src/contrib/hbase/build.xml
  5. 9 0
      src/contrib/hbase/conf/hbase-default.xml
  6. 95 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/Shell.java
  7. 4 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/package.html
  8. 32 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/BasicCommand.java
  9. 26 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/Command.java
  10. 23 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CommandFactory.java
  11. 186 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ConsoleTable.java
  12. 68 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CreateCommand.java
  13. 79 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DeleteCommand.java
  14. 61 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DescCommand.java
  15. 42 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DropCommand.java
  16. 27 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ExitCommand.java
  17. 474 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HBaseShell.jj
  18. 31 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java
  19. 61 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpContents.java
  20. 78 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpManager.java
  21. 86 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/InsertCommand.java
  22. 40 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ReturnMsg.java
  23. 243 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SelectCommand.java
  24. 58 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ShowCommand.java
  25. 207 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParseException.java
  26. 738 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Parser.java
  27. 94 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserConstants.java
  28. 1015 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserTokenManager.java
  29. 454 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/SimpleCharStream.java
  30. 96 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Token.java
  31. 148 0
      src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/TokenMgrError.java
  32. 33 0
      src/contrib/hbase/src/test/org/apache/hadoop/hbase/shell/TestHBaseShell.java

+ 1 - 2
src/contrib/hbase/CHANGES.txt

@@ -56,5 +56,4 @@ Trunk (unreleased changes)
  33. HADOOP-1538 Provide capability for client specified time stamps in HBase
      HADOOP-1466 Clean up visibility and javadoc issues in HBase.
  34. HADOOP-1589 Exception handling in HBase is broken over client server connections
-
-
+ 35. HADOOP-1375 a simple parser for hbase (Edward Yoon via Stack)

+ 5 - 2
src/contrib/hbase/NOTICE.txt

@@ -1,5 +1,8 @@
 This product includes software developed by The Apache Software
 Foundation (http://www.apache.org/).
 
-In addition, this product includes software developed by European Commission
-project OneLab (http://www.one-lab.org)
+In addition, this product includes software developed by:
+
+European Commission project OneLab (http://www.one-lab.org)
+
+Udanax (http://www.udanax.org)

+ 3 - 9
src/contrib/hbase/bin/hbase

@@ -38,9 +38,7 @@ esac
 if [ $# = 0 ]; then
   echo "Usage: hbase [--hadoop=hadoopdir] <command>"
   echo "where <command> is one of:"
-  echo "  client           run a hbase client"
-  echo "  reader           run a hbase region directory reader"
-  echo "  logreader        output content of a logfile"
+  echo "  shell            run the hbase shell"
   echo "  master           run a hbase HMaster node" 
   echo "  regionserver     run a hbase HRegionServer node" 
   echo " or"
@@ -181,12 +179,8 @@ fi
 unset IFS
 
 # figure out which class to run
-if [ "$COMMAND" = "client" ] ; then
-  CLASS='org.apache.hadoop.hbase.HClient'
-elif [ "$COMMAND" = "reader" ] ; then
-  CLASS='org.apache.hadoop.hbase.HRegiondirReader'
-elif [ "$COMMAND" = "logreader" ] ; then
-  CLASS='org.apache.hadoop.hbase.HLog'
+if [ "$COMMAND" = "shell" ] ; then
+  CLASS='org.apache.hadoop.hbase.Shell'
 elif [ "$COMMAND" = "master" ] ; then
   CLASS='org.apache.hadoop.hbase.HMaster'
 elif [ "$COMMAND" = "regionserver" ] ; then

+ 26 - 1
src/contrib/hbase/build.xml

@@ -5,9 +5,34 @@ Before you can run these subtargets directly, you need
 to call at top-level: ant deploy-contrib compile-core-test
 -->
 <project name="hbase" default="jar">
-
   <import file="../build-contrib.xml"/>
 
+<target name="javacc" if="javacc.home">
+<echo message="javacc.home: ${javacc.home}"/>
+<property name="hbaseshell.src.dir" 
+   value="${src.dir}/org/apache/hadoop/hbase/shell" /> 
+ <mkdir dir="${hbaseshell.src.dir}/generated" />
+  <javacc
+         target="${hbaseshell.src.dir}/HBaseShell.jj"
+       outputdirectory="${hbaseshell.src.dir}/generated"
+        javacchome="${javacc.home}"
+   />
+</target>
+
+<target name="compile" depends="init,javacc">
+   <echo message="contrib: ${name}"/>
+   <javac
+    encoding="${build.encoding}"
+    srcdir="${src.dir}"
+    includes="**/*.java"
+    destdir="${build.classes}"
+    debug="${javac.debug}"
+    deprecation="${javac.deprecation}">
+     <classpath refid="classpath"/>
+     <classpath path="path"/>
+   </javac>
+</target>
+	
   <!-- Override jar target to specify main class -->
   <target name="jar" depends="compile">
     <jar

+ 9 - 0
src/contrib/hbase/conf/hbase-default.xml

@@ -110,4 +110,13 @@
     value + (value / 2), the HRegion is split in two.  Default: 128M.
     </description>
   </property>
+
+  <!-- HbaseShell Configurations -->
+  <property>
+ 	<name>hbaseshell.jline.bell.enabled</name>
+  	<value>true</value>
+  	<description>
+  		if true, enable audible keyboard bells if an alert is required.
+  	</description>
+  </property>  
 </configuration>

+ 95 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/Shell.java

@@ -0,0 +1,95 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase;
+
+import java.io.IOException;
+
+import jline.ConsoleReader;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.shell.Command;
+import org.apache.hadoop.hbase.shell.HelpManager;
+import org.apache.hadoop.hbase.shell.ReturnMsg;
+import org.apache.hadoop.hbase.shell.generated.ParseException;
+import org.apache.hadoop.hbase.shell.generated.Parser;
+import org.apache.hadoop.hbase.shell.generated.TokenMgrError;
+
+/**
+ * An hbase shell.
+ * 
+ * @see <a href="http://wiki.apache.org/lucene-hadoop/Hbase/HbaseShell">HBaseShell</a>
+ */
+public class Shell {
+  /** audible keyboard bells */
+  public static final boolean DEFAULT_BELL_ENABLED = true;
+
+  /** Main method */
+  public static void main(String args[]) throws IOException {
+    Configuration conf = new HBaseConfiguration();
+    HClient client = new HClient(conf);
+    ConsoleReader reader = new ConsoleReader();
+    reader.setBellEnabled(conf.getBoolean("hbaseshell.jline.bell.enabled",
+        DEFAULT_BELL_ENABLED));
+    HelpManager help = new HelpManager();
+    help.printVersion();
+    StringBuilder queryStr = new StringBuilder();
+    String extendedLine;
+    while ((extendedLine = reader.readLine(getPrompt(queryStr))) != null) {
+      if (isEndOfCommand(extendedLine)) {
+        queryStr.append(" " + extendedLine);
+        long start = System.currentTimeMillis();
+        Parser parser = new Parser(queryStr.toString());
+        ReturnMsg rs = null;
+        try {
+          Command cmd = parser.terminatedCommand();
+          if (cmd != null) {
+            rs = cmd.execute(client);
+          }
+        } catch (ParseException pe) {
+          String[] msg = pe.getMessage().split("[\n]");
+          System.out.println("Syntax error : Type 'help' for usage: " + msg[0]);
+        } catch (TokenMgrError te) {
+          System.out.println("Lexical error : Type 'help' for usage.");
+        }
+
+        long end = System.currentTimeMillis();
+
+        if (rs != null && rs.getType() > -1)
+          System.out.println(rs.getMsg()
+              + executeTime((rs.getType() == 1), start, end));
+        queryStr = new StringBuilder();
+      } else {
+        queryStr.append(" " + extendedLine);
+      }
+    }
+    System.out.println();
+  }
+
+  /** Return the boolean value indicating whether end of command or not */
+  static boolean isEndOfCommand(String line) {
+    return (line.lastIndexOf(';') > -1) ? true : false;
+  }
+
+  /** Return the string of prompt start string */
+  private static String getPrompt(final StringBuilder queryStr) {
+    return (queryStr.toString().equals("")) ? "HBase > " : "    --> ";
+  }
+
+  /** return a string of code execution time. */
+  public static String executeTime(boolean watch, long start, long end) {
+    return (watch) ? "(" + String.format("%.2f", (end - start) * 0.001) + " sec)" : "";
+  }
+}

+ 4 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/package.html

@@ -37,6 +37,10 @@ ${HBASE_HOME}/bin/stop-hbase.sh
 </pre>
 Logs can be found in ${HADOOP_LOG_DIR}.
 </p>
+<p>To obtain a shell against a running hbase instance, run:
+<pre>${HBASE_HOME}/bin/hbase shell</pre>
+Once the shell is up, type <code>help;</code> to see list of supported commands.
+</p>
 
 <h2>Related Documentation</h2>
 

+ 32 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/BasicCommand.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+/**
+ * @see <a href="http://wiki.apache.org/lucene-hadoop/Hbase/HbaseShell">HBaseShell</a>
+ */
+public abstract class BasicCommand implements Command, CommandFactory {
+  
+  public BasicCommand getBasicCommand() {
+    return this;
+  }
+  
+  /** basic commands are their own factories. */
+  public Command getCommand() {
+    return this;
+  }
+  
+}

+ 26 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/Command.java

@@ -0,0 +1,26 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import org.apache.hadoop.hbase.HClient;
+
+public interface Command {
+  /** family indicator */
+  public static final String FAMILY_INDICATOR = ":";
+
+  /** Execute a command */
+  public ReturnMsg execute(HClient client);
+}

+ 23 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CommandFactory.java

@@ -0,0 +1,23 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+/**
+ * Parser uses command factories to create command.
+ */
+public interface CommandFactory {
+  Command getCommand();
+}

+ 186 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ConsoleTable.java

@@ -0,0 +1,186 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+/**
+ * Manufactures console table, but stupid.
+ */
+public class ConsoleTable {
+  public static void printHead(String name) {
+    System.out.println("+------+----------------------+");
+    System.out.print("| No.  | ");
+    System.out.printf("%-20s", name);
+    System.out.println(" |");
+  }
+
+  public static void printFoot() {
+    System.out.println("+------+----------------------+");
+    System.out.println();
+  }
+
+  public static void printTable(int count, String name) {
+    System.out.println("+------+----------------------+");
+
+    if (name.length() > 20) {
+      int interval = 20;
+
+      System.out.print("| ");
+      System.out.printf("%-4s", count + 1);
+      System.out.print(" | ");
+      System.out.printf("%-20s", name.substring(0, interval));
+      System.out.println(" |");
+
+      for (int i = 0; i < name.length() / interval; i++) {
+        System.out.print("| ");
+        System.out.printf("%-4s", "");
+        System.out.print(" | ");
+
+        int end = ((interval * i) + interval + interval);
+        if (end > name.length()) {
+          System.out.printf("%-20s", name.substring(end - interval,
+            name.length()));
+        } else {
+          System.out.printf("%-20s", name.substring(end - interval, end));
+        }
+        System.out.println(" |");
+      }
+
+    } else {
+      System.out.print("| ");
+      System.out.printf("%-4s", count + 1);
+      System.out.print(" | ");
+      System.out.printf("%-20s", name);
+      System.out.println(" |");
+    }
+  }
+
+  public static void selectHead() {
+    System.out.println("+------+----------------------+" +
+      "----------------------+----------------------+");
+    System.out.print("| No.  | ");
+    System.out.printf("%-20s", "Row");
+    System.out.printf(" | ");
+    System.out.printf("%-20s", "Column");
+    System.out.printf(" | ");
+    System.out.printf("%-20s", "Cell");
+    System.out.println(" | ");
+  }
+
+  public static void printLine(int count, String key, String column,
+      String cellData) {
+    System.out.println("+------+----------------------+" +
+      "----------------------+----------------------+");
+
+    if (key.length() > 20 || column.length() > 20 || cellData.length() > 20) {
+      int interval = 20;
+      System.out.print("| ");
+      System.out.printf("%-4s", count + 1);
+      System.out.print(" | ");
+      if (key.length() > 20)
+        System.out.printf("%-20s", key.substring(0, interval));
+      else
+        System.out.printf("%-20s", key);
+      System.out.print(" | ");
+      if (column.length() > 20)
+        System.out.printf("%-20s", column.substring(0, interval));
+      else
+        System.out.printf("%-20s", column);
+      System.out.print(" | ");
+      if (cellData.length() > 20)
+        System.out.printf("%-20s", cellData.substring(0, interval));
+      else
+        System.out.printf("%-20s", cellData);
+      System.out.println(" |");
+
+      // System.out.println(getBiggerInt(new int[]{ 3, 1, 9}));
+      int biggerStrLength = getBiggerInt(new int[] { key.length(),
+        column.length(), cellData.length() });
+
+      for (int i = 0; i < (biggerStrLength / interval); i++) {
+        System.out.print("| ");
+        System.out.printf("%-4s", "");
+        System.out.print(" | ");
+
+        int end = ((interval * i) + interval + interval);
+
+        if (end > key.length()) {
+          if (key.length() > interval && end - interval < key.length()) {
+            System.out.printf("%-20s", key.substring(end - interval,
+              key.length()));
+          } else {
+            System.out.printf("%-20s", "");
+          }
+        } else {
+          System.out.printf("%-20s", key.substring(end - interval, end));
+        }
+
+        System.out.print(" | ");
+
+        if (end > column.length()) {
+          if (column.length() > interval && end - interval < column.length()) {
+            System.out.printf("%-20s", column.substring(end - interval,
+              column.length()));
+          } else {
+            System.out.printf("%-20s", "");
+          }
+        } else {
+          System.out.printf("%-20s", column.substring(end - interval, end));
+        }
+
+        System.out.print(" | ");
+        if (end > cellData.length()) {
+          if (cellData.length() > interval &&
+              end - interval < cellData.length()) {
+            System.out.printf("%-20s",
+              cellData.substring(end - interval, cellData.length()));
+          } else {
+            System.out.printf("%-20s", "");
+          }
+        } else {
+          System.out.printf("%-20s", cellData.substring(end - interval, end));
+        }
+        System.out.println(" |");
+      }
+
+    } else {
+      System.out.print("| ");
+      System.out.printf("%-4s", count + 1);
+      System.out.print(" | ");
+      System.out.printf("%-20s", key);
+      System.out.print(" | ");
+      System.out.printf("%-20s", column);
+      System.out.print(" | ");
+      System.out.printf("%-20s", cellData);
+      System.out.println(" |");
+    }
+  }
+
+  public static int getBiggerInt(int[] integers) {
+    int result = -1;
+    for (int i = 0; i < integers.length; i++) {
+      if (integers[i] > result) {
+        result = integers[i];
+      }
+    }
+    return result;
+  }
+
+  public static void selectFoot() {
+    System.out.println("+------+----------------------+" +
+      "----------------------+----------------------+");
+    System.out.println();
+  }
+}

+ 68 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/CreateCommand.java

@@ -0,0 +1,68 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+
+public class CreateCommand extends BasicCommand {
+  String table;
+
+  List<String> columnfamilies;
+
+  int limit;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.table == null || this.columnfamilies == null)
+      return new ReturnMsg(0, "Syntax error : Please check 'Create' syntax.");
+
+    try {
+      HTableDescriptor desc = new HTableDescriptor(this.table);
+
+      for (int i = 0; i < this.columnfamilies.size(); i++) {
+
+        String columnFamily = columnfamilies.get(i);
+        if (columnFamily.lastIndexOf(':') == (columnFamily.length() - 1)) {
+          columnFamily = columnFamily.substring(0, columnFamily.length() - 1);
+        }
+        desc.addFamily(new HColumnDescriptor(columnFamily + FAMILY_INDICATOR));
+
+      }
+
+      client.createTable(desc);
+
+      return new ReturnMsg(1, "Table created successfully.");
+    } catch (IOException e) {
+      return new ReturnMsg(0, "error msg : " + e.toString());
+    }
+  }
+
+  public void setTable(String table) {
+    this.table = table;
+  }
+
+  public void setColumnfamilies(List<String> columnfamilies) {
+    this.columnfamilies = columnfamilies;
+  }
+
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+}

+ 79 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DeleteCommand.java

@@ -0,0 +1,79 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.io.Text;
+
+public class DeleteCommand extends BasicCommand {
+  String table;
+
+  Map<String, List<String>> condition;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.table == null || condition == null)
+      return new ReturnMsg(0, "Syntax error : Please check 'Delete' syntax.");
+
+    try {
+      client.openTable(new Text(this.table));
+      long lockId = client.startUpdate(getRow());
+
+      if (getColumn() != null) {
+
+        client.delete(lockId, getColumn());
+
+      } else {
+        Set<Text> keySet = client.getRow(getRow()).keySet();
+        Text[] columnKey = keySet.toArray(new Text[keySet.size()]);
+
+        for (int i = 0; i < columnKey.length; i++) {
+          client.delete(lockId, columnKey[i]);
+        }
+      }
+
+      client.commit(lockId);
+
+      return new ReturnMsg(1, "1 deleted successfully. ");
+    } catch (IOException e) {
+      return new ReturnMsg(0, "error msg : " + e.toString());
+    }
+  }
+
+  public void setTable(String table) {
+    this.table = table;
+  }
+
+  public void setCondition(Map<String, List<String>> cond) {
+    this.condition = cond;
+  }
+
+  public Text getRow() {
+    return new Text(this.condition.get("row").get(1));
+  }
+
+  public Text getColumn() {
+    if (this.condition.containsKey("column")) {
+      return new Text(this.condition.get("column").get(1));
+    } else {
+      return null;
+    }
+  }
+}

+ 61 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DescCommand.java

@@ -0,0 +1,61 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.io.Text;
+
+public class DescCommand extends BasicCommand {
+  String argument;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.argument == null) 
+      return new ReturnMsg(0, "Syntax error : Please check 'Describe' syntax.");
+
+    try {
+      HTableDescriptor[] tables = client.listTables();
+      Text[] columns = null;
+
+      for (int i = 0; i < tables.length; i++) {
+        if (tables[i].getName().toString().equals(this.argument)) {
+          columns = tables[i].families().keySet().toArray(new Text[] {});
+        }
+      }
+
+      if (columns == null) {
+        return new ReturnMsg(0, "Table not found.");
+      }
+
+      ConsoleTable.printHead("ColumnFamily Name");
+      for (int ii = 0; ii < columns.length; ii++) {
+        String familyName = columns[ii].toString().replace(FAMILY_INDICATOR, "");
+        ConsoleTable.printTable(ii, familyName);
+      }
+      ConsoleTable.printFoot();
+
+      return new ReturnMsg(1, columns.length + " columnfamilie(s) found.");
+    } catch (IOException e) {
+      return new ReturnMsg(0, "error msg : " + e.toString());
+    }
+  }
+
+  public void setArgument(String argument) {
+    this.argument = argument;
+  }
+}

+ 42 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/DropCommand.java

@@ -0,0 +1,42 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.io.Text;
+
+public class DropCommand extends BasicCommand {
+  String argument;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.argument == null) 
+      return new ReturnMsg(0, "Syntax error : Please check 'Drop' syntax.");
+
+    try {
+      client.deleteTable(new Text(this.argument));
+      
+      return new ReturnMsg(1, "Table droped successfully.");
+    } catch (IOException e) {
+      return new ReturnMsg(0, "error msg : " + e.toString());
+    }
+  }
+
+  public void setArgument(String argument) {
+    this.argument = argument;
+  }
+}

+ 27 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ExitCommand.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import org.apache.hadoop.hbase.HClient;
+
+public class ExitCommand extends BasicCommand {
+
+  public ReturnMsg execute(HClient client) {
+    System.exit(1);
+    return null;
+  }
+
+}

+ 474 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HBaseShell.jj

@@ -0,0 +1,474 @@
+options {
+  STATIC = false;
+  IGNORE_CASE = true;
+}
+
+PARSER_BEGIN(Parser)
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.StringReader;
+import java.io.Reader;
+
+import org.apache.hadoop.hbase.shell.*;
+
+/**
+ * Parsing command line.
+ */
+public class Parser {
+  private static String QueryString;
+  
+  public Parser(String query) {
+    this((Reader)(new StringReader(query)));
+    this.QueryString = query;
+  }
+  
+  public String getQueryStr() {
+    return this.QueryString;
+  }
+}
+
+PARSER_END(Parser)
+
+SKIP :                             
+{
+    " "
+ | "\t"
+ | "\r"
+ | "\n"
+}
+
+TOKEN:
+{
+   <HELP: "help">
+ | <SHOW: "show">
+ | <DESCRIBE: "describe">
+ | <CREATE: "create">	
+ | <DROP: "drop">
+ | <EXIT: "exit">
+ | <INSERT: "insert">
+ | <DELETE: "delete">
+ | <SELECT: "select">
+ | <ROW: "row">
+ | <COLUMN: "column">
+ | <TIME: "time">
+ | <VALUES: "values">
+ | <COLUMNFAMILIES: "columnfamilies">
+ | <WHERE: "where">
+ | <LIMIT: "limit">
+ | <AND: "and">
+ | <OR:  "or">
+ | <COMMA: ",">
+ | <DOT: ".">
+ | <LPAREN: "(">
+ | <RPAREN: ")">
+ | <EQUALS: "=">
+ | <NOTEQUAL: "<>">
+ | <OPTIONS: "-">
+}
+
+TOKEN :
+{
+   <ID: ["a"-"z","A"-"Z","_","-"] ( ["a"-"z","A"-"Z","_","0"-"9","-"] )* >
+ | <NUM: ( ["0"-"9"] )+ >
+ | <STRING: (["A"-"Z","a"-"z","0"-"9"])+ >
+ | <QUOTED_STRING: "\"" (~["\""])+ "\"" >
+ | <STRING_LITERAL: "'" (~["'"])* ( "''" (~["'"])* )* "'" >
+}
+
+/**
+ * Parses the given array of command line arguments.
+ */
+Command terminatedCommand() :
+{
+    Command statement = null;
+}
+{
+    ([statement = cmdStatement()] ";" | <EOF>)
+    {
+        return statement;
+    }
+}
+
+Command cmdStatement() :
+{
+    Command cmd = null;
+}
+{
+  (
+       cmd = exitCommand()
+     | cmd = helpCommand()
+     | cmd = showCommand()
+     | cmd = descCommand()
+     | cmd = createCommand()
+     | cmd = dropCommand()
+     | cmd = insertCommand()
+     | cmd = deleteCommand()
+     | cmd = selectCommand()
+  )
+   {
+       return cmd;
+   }
+}
+
+ExitCommand exitCommand() :
+{
+  ExitCommand exit = new ExitCommand();
+}
+{
+   <EXIT>  { return exit; }
+}
+
+HelpCommand helpCommand() :
+{
+  Token t = null;
+  HelpCommand help = new HelpCommand();
+  String argument = "";
+}
+{
+   <HELP>
+   [
+     (
+         t=<SHOW>
+       | t=<DESCRIBE>
+       | t=<CREATE>
+       | t=<DROP>
+       | t=<EXIT>
+       | t=<INSERT>
+       | t=<DELETE>
+       | t=<SELECT>
+       | t=<ID>
+     ) { argument = t.image.toString(); }
+   ]
+   
+  { 
+      help.setArgument(argument);
+      return help;  
+  }
+}
+
+ShowCommand showCommand() :
+{
+  ShowCommand show = new ShowCommand();
+  String argument = null;
+}
+{
+   <SHOW>
+   [
+       argument = getString()
+   ]
+   
+  { 
+      show.setArgument(argument);
+      return show;
+  }
+}
+
+DescCommand descCommand() :
+{
+  DescCommand desc = new DescCommand();
+  String argument = null;
+}
+{
+   <DESCRIBE>
+   [
+       argument = getString()
+   ]
+   
+  { 
+      desc.setArgument(argument);
+      return desc;
+  }
+}
+
+CreateCommand createCommand() :
+{
+  CreateCommand create = new CreateCommand();
+  String argument = null;
+  List<String> columnfamilies = null;
+  int limit = 1;
+}
+{
+    <CREATE>
+    argument = getString() 
+    { 
+         create.setTable(argument); 
+    }
+    
+    <COLUMNFAMILIES>
+    columnfamilies = getLiteralValues()
+    { 
+         create.setColumnfamilies(columnfamilies); 
+    }
+
+    [ <LIMIT><EQUALS> limit = getInt() {
+            try{
+               create.setLimit(limit);
+            }catch(ClassCastException ce) {
+               throw generateParseException();
+        }
+   } ]
+  { return create; }
+}
+
+DropCommand dropCommand() :
+{
+  DropCommand drop = new DropCommand();
+  String argument = null;
+}
+{
+   <DROP>
+   [
+       argument = getString()
+   ]
+   
+  { 
+      drop.setArgument(argument);
+      return drop;
+  }
+}
+
+InsertCommand insertCommand() :
+{
+    InsertCommand in = new InsertCommand();
+    Map<String, List<String>> cond = null;
+    List<String> columnfamilies = null;
+    List<String> values = null;
+    String table = null;
+}
+{
+    <INSERT>
+    table = getString()
+    { 
+         in.setTable(table); 
+    }
+    
+    columnfamilies = getLiteralValues()
+    {
+        in.setColumnfamilies(columnfamilies);
+    }
+    
+    <VALUES> values = getLiteralValues()
+    {
+        in.setValues(values);
+    }
+      
+    <WHERE> cond = WhereClause() 
+    {
+        try{
+           in.setCondition(cond);
+        }catch(ClassCastException ce) {
+           throw generateParseException();
+        }
+    } 
+    {
+       return in;
+    }
+}
+
+DeleteCommand deleteCommand() :
+{
+    DeleteCommand del = new DeleteCommand();
+    Map<String, List<String>> cond = null;
+    String argument = null;
+}
+{
+    <DELETE>
+    argument = getString()
+    { 
+         del.setTable(argument); 
+    }
+    
+     <WHERE> cond = WhereClause() {
+        try{
+           del.setCondition(cond);
+        }catch(ClassCastException ce) {
+            throw generateParseException();
+       }
+    } 
+    {
+       return del;
+    }
+}
+
+SelectCommand selectCommand() :
+{
+    SelectCommand select = new SelectCommand();
+    Map<String, List<String>> cond = null;
+    String argument = null;
+    int limit;
+}
+{
+    <SELECT>
+    argument = getString()
+    { 
+         select.setTable(argument); 
+    }
+
+     [ <WHERE> cond = WhereClause() {
+        try{
+           select.setCondition(cond);
+        }catch(ClassCastException ce) {
+            throw generateParseException();
+        }
+    } ] 
+    
+    [ <LIMIT><EQUALS> limit = getInt() {
+            try{
+               select.setLimit(limit);
+            }catch(ClassCastException ce) {
+               throw generateParseException();
+        }
+   } ]
+  { return select; }
+}
+
+/**
+* TODO : expressions codes need more love.
+*/
+
+String getString():
+{ Token t = null; }
+{
+    (  t=<ID>
+     | t=<QUOTED_STRING>
+    ) 
+    { return t.image.toString(); }
+}
+
+int getInt():
+{ Token t = null; }
+{
+   t = <NUM>
+   { return Integer.parseInt(t.image.toString()); }
+}
+
+Map<String, List<String>> WhereClause() :
+{
+    Map<String, List<String>> result = 
+               new HashMap<String, List<String>>();
+    List<String> exception = 
+               new ArrayList<String>();
+}
+{
+  { 
+      try{
+        result.putAll(ConditionExpression()); 
+      }catch(ParseException pe) {
+        exception.add(pe.toString());
+        result.put("error", exception);
+      }
+  }
+	(
+     <AND> { 
+      try{
+        result.putAll(ConditionExpression()); 
+      }catch(ParseException pe) {
+        exception.add(pe.toString());
+        result.put("error", exception);
+      }
+     }
+	)*
+	
+ { return result; }
+}
+
+Map<String, List<String>> ConditionExpression() :
+{
+    Token tSearchName, tComparator, tComparand;
+    Map<String, List<String>> tmp = 
+               new HashMap<String, List<String>>();
+    List<String> values = 
+               new ArrayList<String>();
+}
+{
+	( 
+	   tSearchName=<ROW>
+	 | tSearchName=<COLUMN>
+	 | tSearchName=<TIME> 
+	 | tSearchName=<ID>
+	 | tSearchName=<VALUES>
+	 | tSearchName=<COLUMNFAMILIES>
+	 )
+	 
+	( tComparator=<EQUALS> | tComparator=<NOTEQUAL> )
+
+ ( tComparand=<QUOTED_STRING>
+    { 
+          values.add("quoted string"); 
+          tmp.put("error", values); 
+          return tmp; 
+    } 
+  |  tComparand=<STRING_LITERAL> {
+    values.add(tComparator.image);
+    values.add(tComparand.image.substring(1,tComparand.image.length() - 1));
+  
+  if(tSearchName.image.toString().equals("row") || 
+  tSearchName.image.toString().equals("column") || 
+  tSearchName.image.toString().equals("time"))
+    { tmp.put(tSearchName.image, values); }
+  else   
+    {
+    values.add(tSearchName.image.toString());
+    tmp.put("error", values); 
+    }
+    
+    return tmp; 
+} )
+}
+
+List<String> getLiteralValues() :
+{
+    List<String> values = new ArrayList<String>();
+    String literal = null;
+}
+{    
+<LPAREN>
+ { literal = getStringLiteral();
+ if(literal != null) values.add(literal); 
+ }
+    (
+<COMMA> { 
+   literal = getStringLiteral(); 
+   if(literal != null) values.add(literal); 
+}
+| ( 
+       <ID>
+     | <STRING_LITERAL>
+     | <QUOTED_STRING>
+     | <STRING> 
+  )  { values.removeAll(values); }
+	)*
+<RPAREN>
+   { 
+     return values;
+    }
+}
+
+String getStringLiteral() :
+{
+    Token stringLiteral;
+}
+{
+ stringLiteral=<STRING_LITERAL> 
+ { return stringLiteral.image.substring(1,stringLiteral.image.length() - 1); }
+ | <QUOTED_STRING> { return null; }
+}

+ 31 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpCommand.java

@@ -0,0 +1,31 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import org.apache.hadoop.hbase.HClient;
+
+public class HelpCommand extends BasicCommand {
+  String argument;
+
+  public ReturnMsg execute(HClient client) {
+    HelpManager.printHelp(this.argument);
+    return null;
+  }
+
+  public void setArgument(String argument) {
+    this.argument = argument;
+  }
+}

+ 61 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpContents.java

@@ -0,0 +1,61 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class HelpContents {
+
+  /**
+   * add help contents 
+   */
+  public static Map<? extends String, ? extends String[]> Load() {
+    Map<String, String[]> load = new HashMap<String, String[]>();
+
+    load.put("SHOW", new String[] { "List all tables.", "SHOW TABLES;" });
+    load.put("DESCRIBE", new String[] { "Describe a table's columnfamilies.",
+        "DESCRIBE <table_name>;" });
+    load.put("CREATE", new String[] {
+        "Create a table",
+        "CREATE <table_name>"
+            + "\n\t  COLUMNFAMILIES('cf_name1'[, 'cf_name2', ...]);"
+            + "\n    [LIMIT=versions_limit];" });
+    load.put("DROP", new String[] {
+        "Drop columnfamilie(s) from a table or drop table(s)",
+        "DROP table_name1[, table_name2, ...] | cf_name1[, cf_name2, ...];" });
+    load.put("INSERT", new String[] {
+        "Insert row into table",
+        "INSERT <table_name>" + "\n\t('column_name1'[, 'column_name2', ...])"
+            + "\n\t    VALUES('entry1'[, 'entry2', ...])"
+            + "\n    WHERE row='row_key';" });
+    load.put("DELETE", new String[] {
+        "Delete cell or row in table.",
+        "DELETE <table_name>" + "\n\t    WHERE row='row_key;"
+            + "\n    [AND column='column_name'];" });
+    load.put("SELECT",
+        new String[] {
+            "Select values from a table",
+            "SELECT <table_name>" + "\n\t    [WHERE row='row_key']"
+                + "\n    [AND column='column_name'];"
+                + "\n    [AND time='timestamp'];"
+                + "\n    [LIMIT=versions_limit];" });
+    load.put("EXIT", new String[] { "Exit shell", "EXIT;" });
+
+    return load;
+  }
+
+}

+ 78 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/HelpManager.java

@@ -0,0 +1,78 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Prints a usage message for the program to the given stream.
+ */
+public class HelpManager {
+  /** application name */
+  public static final String APP_NAME = "HBase Shell";
+
+  /** version of the code */
+  public static final String APP_VERSION = "0.0.1";
+
+  /** help contents map */
+  public static final Map<String, String[]> help = new HashMap<String, String[]>();
+
+  public HelpManager() {
+    help.putAll(HelpContents.Load());
+  }
+
+  /** Print out the program version. */
+  public void printVersion() {
+    System.out.println("\n" + APP_NAME + ", " + APP_VERSION + " version.\n"
+        + "Copyright (c) 2007 by udanax, "
+        + "licensed to Apache Software Foundation.\n"
+        + "Type 'help;' for usage.\n");
+  }
+
+  public static void printHelp(String cmd) {
+    if (cmd.equals("")) {
+      System.out.println("\nType 'help <command>;' to see command-specific "
+          + "usage.\n");
+      for (Map.Entry<String, String[]> helpMap : help.entrySet()) {
+        wrapping(helpMap.getKey(), helpMap.getValue(), false);
+      }
+      System.out.println();
+    } else {
+      if (help.containsKey(cmd.toUpperCase())) {
+        System.out.println();
+        String[] msg = help.get(cmd.toUpperCase());
+        wrapping(cmd.toUpperCase(), msg, true);
+      } else {
+        System.out.println("Unknown Command : Type 'help' for usage.");
+      }
+    }
+  }
+
+  public static void wrapping(String cmd, String[] cmdType, boolean example) {
+    System.out.printf("%-10s", cmd);
+    if (cmdType[0].length() > 55) {
+      System.out.println(cmdType[0].substring(0, 55));
+      System.out.printf("%13s", "");
+      System.out.println(cmdType[0].substring(55, cmdType[1].length()));
+    } else {
+      System.out.println(cmdType[0]);
+    }
+
+    if (example)
+      System.out.println("\n>>> " + cmdType[1] + "\n");
+  }
+}

+ 86 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/InsertCommand.java

@@ -0,0 +1,86 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.io.Text;
+
+public class InsertCommand extends BasicCommand {
+  String table;
+
+  List<String> columnfamilies;
+
+  List<String> values;
+
+  Map<String, List<String>> condition;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.table == null || this.values == null || this.condition == null)
+      return new ReturnMsg(0, "Syntax error : Please check 'Insert' syntax.");
+
+    if (this.columnfamilies.size() != this.values.size())
+      return new ReturnMsg(0,
+          "Mismatch between values list and columnfamilies list");
+
+    try {
+      client.openTable(new Text(this.table));
+      long lockId = client.startUpdate(new Text(getRow()));
+
+      for (int i = 0; i < this.values.size(); i++) {
+        client.put(lockId, getColumn(i), getValue(i));
+      }
+
+      client.commit(lockId);
+
+      return new ReturnMsg(1, "1 row inserted successfully.");
+    } catch (IOException e) {
+      String[] msg = e.getMessage().split("[\n]");
+      return new ReturnMsg(0, msg[0]);
+    }
+  }
+
+  public void setTable(String table) {
+    this.table = table;
+  }
+
+  public void setColumnfamilies(List<String> columnfamilies) {
+    this.columnfamilies = columnfamilies;
+  }
+
+  public void setValues(List<String> values) {
+    this.values = values;
+  }
+
+  public void setCondition(Map<String, List<String>> cond) {
+    this.condition = cond;
+  }
+
+  public Text getRow() {
+    return new Text(this.condition.get("row").get(1));
+  }
+
+  public Text getColumn(int i) {
+    return new Text(this.columnfamilies.get(i));
+  }
+
+  public byte[] getValue(int i) {
+    return this.values.get(i).getBytes();
+  }
+}

+ 40 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ReturnMsg.java

@@ -0,0 +1,40 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+public class ReturnMsg {
+  private String msg;
+
+  private int type;
+
+  public ReturnMsg(int i, String string) {
+    this.type = i;
+    this.msg = string;
+  }
+
+  public ReturnMsg(int i) {
+    this.type = i;
+    this.msg = "";
+  }
+
+  public String getMsg() {
+    return this.msg;
+  }
+
+  public int getType() {
+    return this.type;
+  }
+}

+ 243 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/SelectCommand.java

@@ -0,0 +1,243 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HScannerInterface;
+import org.apache.hadoop.hbase.HStoreKey;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.io.DataInputBuffer;
+import org.apache.hadoop.io.Text;
+
+public class SelectCommand extends BasicCommand {
+  String table;
+
+  int limit;
+
+  Map<String, List<String>> condition;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.condition != null && this.condition.containsKey("error"))
+      return new ReturnMsg(0, "Syntax error : Please check 'Select' syntax.");
+
+    try {
+      client.openTable(new Text(this.table));
+
+      switch (getCondition()) {
+      case 0:
+
+        HTableDescriptor[] tables = client.listTables();
+        Text[] columns = null;
+
+        if (this.table.equals(HConstants.ROOT_TABLE_NAME.toString())
+            || this.table.equals(HConstants.META_TABLE_NAME.toString())) {
+          columns = HConstants.COLUMN_FAMILY_ARRAY;
+        } else {
+          for (int i = 0; i < tables.length; i++) {
+            if (tables[i].getName().toString().equals(this.table)) {
+              columns = tables[i].families().keySet().toArray(new Text[] {});
+            }
+          }
+        }
+
+        HScannerInterface scan = client.obtainScanner(columns, new Text(""));
+        HStoreKey key = new HStoreKey();
+        TreeMap<Text, byte[]> results = new TreeMap<Text, byte[]>();
+
+        ConsoleTable.selectHead();
+        int count = 0;
+        while (scan.next(key, results)) {
+          Text rowKey = key.getRow();
+
+          for (Text columnKey : results.keySet()) {
+            byte[] value = results.get(columnKey);
+            String cellData = new String(value);
+
+            if (columnKey.equals(HConstants.COL_REGIONINFO)) {
+              DataInputBuffer inbuf = new DataInputBuffer();
+              HRegionInfo info = new HRegionInfo();
+              inbuf.reset(value, value.length);
+              info.readFields(inbuf);
+
+              cellData = "ID : " + String.valueOf(info.getRegionId());
+            }
+            ConsoleTable.printLine(count, rowKey.toString(), columnKey.toString(),
+                cellData);
+            count++;
+          }
+          results = new TreeMap<Text, byte[]>();
+        }
+        ConsoleTable.selectFoot();
+        scan.close();
+
+        break;
+
+      case 1:
+
+        count = 0;
+        ConsoleTable.selectHead();
+        for (Map.Entry<Text, byte[]> entry : client.getRow(new Text(getRow())).entrySet()) {
+
+          byte[] value = entry.getValue();
+          String cellData = new String(value);
+
+          if (entry.getKey().equals(HConstants.COL_REGIONINFO)) {
+            DataInputBuffer inbuf = new DataInputBuffer();
+            HRegionInfo info = new HRegionInfo();
+            inbuf.reset(value, value.length);
+            info.readFields(inbuf);
+
+            cellData = "ID : " + String.valueOf(info.getRegionId());
+          }
+          ConsoleTable.printLine(count, getRow().toString(), entry.getKey().toString(),
+              cellData);
+          count++;
+        }
+        ConsoleTable.selectFoot();
+
+        break;
+
+      case 2:
+
+        Text[] column = new Text[] { new Text(getColumn()) };
+
+        HScannerInterface scanner = client.obtainScanner(column, new Text(""));
+        HStoreKey k = new HStoreKey();
+        TreeMap<Text, byte[]> r = new TreeMap<Text, byte[]>();
+
+        ConsoleTable.selectHead();
+        count = 0;
+        while (scanner.next(k, r)) {
+          Text rowKey = k.getRow();
+
+          for (Text columnKey : r.keySet()) {
+            byte[] value = r.get(columnKey);
+            String cellData = new String(value);
+            ConsoleTable.printLine(count, rowKey.toString(), columnKey.toString(),
+                cellData);
+            count++;
+          }
+          results = new TreeMap<Text, byte[]>();
+        }
+        ConsoleTable.selectFoot();
+        scanner.close();
+
+        break;
+
+      case 3:
+
+        byte[] rs1 = client.get(new Text(getRow()), new Text(getColumn()));
+
+        ConsoleTable.selectHead();
+        ConsoleTable.printLine(0, getRow(), getColumn(),
+          new String(rs1, HConstants.UTF8_ENCODING));
+        ConsoleTable.selectFoot();
+
+        break;
+
+      case 4:
+
+        byte[][] rs2 = client.get(new Text(getRow()), new Text(getColumn()), this.limit);
+
+        ConsoleTable.selectHead();
+        for (int i = 0; i < rs2.length; i++) {
+          ConsoleTable.printLine(i, getRow(), getColumn(),
+            new String(rs2[i], HConstants.UTF8_ENCODING));
+        }
+        ConsoleTable.selectFoot();
+
+        break;
+
+      case 5:
+
+        byte[][] rs3 = client.get(new Text(getRow()), new Text(getColumn()), getTime(), this.limit);
+
+        ConsoleTable.selectHead();
+        for (int i = 0; i < rs3.length; i++) {
+          ConsoleTable.printLine(i, getRow(), getColumn(), new String(rs3[i]));
+        }
+        ConsoleTable.selectFoot();
+
+        break;
+
+      }
+
+      return new ReturnMsg(1, "Successfully print out the selected data.");
+    } catch (IOException e) {
+      String[] msg = e.getMessage().split("[,]");
+      return new ReturnMsg(0, msg[0]);
+    }
+  }
+
+  public void setTable(String table) {
+    this.table = table;
+  }
+
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  public void setCondition(Map<String, List<String>> cond) {
+    this.condition = cond;
+  }
+
+  public String getRow() {
+    return this.condition.get("row").get(1);
+  }
+
+  public String getColumn() {
+    return this.condition.get("column").get(1);
+  }
+
+  public long getTime() {
+    return Long.parseLong(this.condition.get("time").get(1));
+  }
+
+  public int getConditionSize() {
+    return this.condition.size();
+  }
+
+  public int getCondition() {
+    int type = 0;
+    if (this.condition == null) {
+      type = 0;
+    } else if (this.condition.containsKey("row")) {
+      if (getConditionSize() == 1) {
+        type = 1;
+      } else if (this.condition.containsKey("column")) {
+        if (getConditionSize() == 2) {
+          if (this.limit == 0) {
+            type = 3;
+          } else {
+            type = 4;
+          }
+        } else {
+          type = 5;
+        }
+      }
+    } else if (this.condition.containsKey("column")) {
+      type = 2;
+    }
+    return type;
+  }
+}

+ 58 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/ShowCommand.java

@@ -0,0 +1,58 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.hbase.HTableDescriptor;
+
+public class ShowCommand extends BasicCommand {
+  String argument;
+
+  public ReturnMsg execute(HClient client) {
+    if (this.argument == null)
+      return new ReturnMsg(0, "Syntax error : Please check 'Show' syntax.");
+
+    try {
+      int tableLength = 0;
+
+      if ("tables".equals(this.argument)) {
+        HTableDescriptor[] tables = client.listTables();
+        tableLength = tables.length;
+        if (tableLength == 0) {
+          return new ReturnMsg(0, "Table not found.");
+        }
+
+        ConsoleTable.printHead("Table Name");
+        for (int i = 0; i < tableLength; i++) {
+          String tableName = tables[i].getName().toString();
+          ConsoleTable.printTable(i, tableName);
+        }
+        ConsoleTable.printFoot();
+
+        return new ReturnMsg(1, tableLength + " table(s) found.");
+      }
+      return new ReturnMsg(0, "Missing parameters. Please check 'Show' syntax.");
+    } catch (IOException e) {
+      return new ReturnMsg(0, "error msg : " + e.toString());
+    }
+  }
+
+  public void setArgument(String argument) {
+    this.argument = argument;
+  }
+}

+ 207 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParseException.java

@@ -0,0 +1,207 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException extends Exception {
+
+  /**
+   * This constructor is used by the method "generateParseException"
+   * in the generated parser.  Calling this constructor generates
+   * a new object of this type with the fields "currentToken",
+   * "expectedTokenSequences", and "tokenImage" set.  The boolean
+   * flag "specialConstructor" is also set to true to indicate that
+   * this constructor was used to create this object.
+   * This constructor calls its super class with the empty string
+   * to force the "toString" method of parent class "Throwable" to
+   * print the error message in the form:
+   *     ParseException: <result of getMessage>
+   */
+  public ParseException(Token currentTokenVal,
+                        int[][] expectedTokenSequencesVal,
+                        String[] tokenImageVal
+                       )
+  {
+    super("");
+    specialConstructor = true;
+    currentToken = currentTokenVal;
+    expectedTokenSequences = expectedTokenSequencesVal;
+    tokenImage = tokenImageVal;
+  }
+
+  /**
+   * The following constructors are for use by you for whatever
+   * purpose you can think of.  Constructing the exception in this
+   * manner makes the exception behave in the normal way - i.e., as
+   * documented in the class "Throwable".  The fields "errorToken",
+   * "expectedTokenSequences", and "tokenImage" do not contain
+   * relevant information.  The JavaCC generated code does not use
+   * these constructors.
+   */
+
+  public ParseException() {
+    super();
+    specialConstructor = false;
+  }
+
+  public ParseException(String message) {
+    super(message);
+    specialConstructor = false;
+  }
+
+  /**
+   * This variable determines which constructor was used to create
+   * this object and thereby affects the semantics of the
+   * "getMessage" method (see below).
+   */
+  protected boolean specialConstructor;
+
+  /**
+   * This is the last token that has been consumed successfully.  If
+   * this object has been created due to a parse error, the token
+   * followng this token will (therefore) be the first error token.
+   */
+  public Token currentToken;
+
+  /**
+   * Each entry in this array is an array of integers.  Each array
+   * of integers represents a sequence of tokens (by their ordinal
+   * values) that is expected at this point of the parse.
+   */
+  public int[][] expectedTokenSequences;
+
+  /**
+   * This is a reference to the "tokenImage" array of the generated
+   * parser within which the parse error occurred.  This array is
+   * defined in the generated ...Constants interface.
+   */
+  public String[] tokenImage;
+
+  /**
+   * This method has the standard behavior when this object has been
+   * created using the standard constructors.  Otherwise, it uses
+   * "currentToken" and "expectedTokenSequences" to generate a parse
+   * error message and returns it.  If this object has been created
+   * due to a parse error, and you do not catch it (it gets thrown
+   * from the parser), then this method is called during the printing
+   * of the final stack trace, and hence the correct error message
+   * gets displayed.
+   */
+  public String getMessage() {
+    if (!specialConstructor) {
+      return super.getMessage();
+    }
+    StringBuffer expected = new StringBuffer();
+    int maxSize = 0;
+    for (int i = 0; i < expectedTokenSequences.length; i++) {
+      if (maxSize < expectedTokenSequences[i].length) {
+        maxSize = expectedTokenSequences[i].length;
+      }
+      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
+      }
+      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+        expected.append("...");
+      }
+      expected.append(eol).append("    ");
+    }
+    String retval = "Encountered \"";
+    Token tok = currentToken.next;
+    for (int i = 0; i < maxSize; i++) {
+      if (i != 0) retval += " ";
+      if (tok.kind == 0) {
+        retval += tokenImage[0];
+        break;
+      }
+      retval += add_escapes(tok.image);
+      tok = tok.next; 
+    }
+    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+    retval += "." + eol;
+    if (expectedTokenSequences.length == 1) {
+      retval += "Was expecting:" + eol + "    ";
+    } else {
+      retval += "Was expecting one of:" + eol + "    ";
+    }
+    retval += expected.toString();
+    return retval;
+  }
+
+  /**
+   * The end of line string for this machine.
+   */
+  protected String eol = System.getProperty("line.separator", "\n");
+ 
+  /**
+   * Used to convert raw characters to their escaped version
+   * when these raw version cannot be used as part of an ASCII
+   * string literal.
+   */
+  protected String add_escapes(String str) {
+      StringBuffer retval = new StringBuffer();
+      char ch;
+      for (int i = 0; i < str.length(); i++) {
+        switch (str.charAt(i))
+        {
+           case 0 :
+              continue;
+           case '\b':
+              retval.append("\\b");
+              continue;
+           case '\t':
+              retval.append("\\t");
+              continue;
+           case '\n':
+              retval.append("\\n");
+              continue;
+           case '\f':
+              retval.append("\\f");
+              continue;
+           case '\r':
+              retval.append("\\r");
+              continue;
+           case '\"':
+              retval.append("\\\"");
+              continue;
+           case '\'':
+              retval.append("\\\'");
+              continue;
+           case '\\':
+              retval.append("\\\\");
+              continue;
+           default:
+              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                 String s = "0000" + Integer.toString(ch, 16);
+                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+              } else {
+                 retval.append(ch);
+              }
+              continue;
+        }
+      }
+      return retval.toString();
+   }
+
+}

+ 738 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Parser.java

@@ -0,0 +1,738 @@
+/* Generated By:JavaCC: Do not edit this line. Parser.java */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.StringReader;
+import java.io.Reader;
+
+import org.apache.hadoop.hbase.shell.*;
+
+/**
+ * Parsing command line.
+ */
+public class Parser implements ParserConstants {
+  private static String QueryString;
+
+  public Parser(String query) {
+    this((Reader)(new StringReader(query)));
+    this.QueryString = query;
+  }
+
+  public String getQueryStr() {
+    return this.QueryString;
+  }
+
+/**
+ * Parses the given array of command line arguments.
+ */
+  final public Command terminatedCommand() throws ParseException {
+    Command statement = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case HELP:
+    case SHOW:
+    case DESCRIBE:
+    case CREATE:
+    case DROP:
+    case EXIT:
+    case INSERT:
+    case DELETE:
+    case SELECT:
+    case 35:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case HELP:
+      case SHOW:
+      case DESCRIBE:
+      case CREATE:
+      case DROP:
+      case EXIT:
+      case INSERT:
+      case DELETE:
+      case SELECT:
+        statement = cmdStatement();
+        break;
+      default:
+        jj_la1[0] = jj_gen;
+        ;
+      }
+      jj_consume_token(35);
+      break;
+    case 0:
+      jj_consume_token(0);
+      break;
+    default:
+      jj_la1[1] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+        {if (true) return statement;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Command cmdStatement() throws ParseException {
+    Command cmd = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case EXIT:
+      cmd = exitCommand();
+      break;
+    case HELP:
+      cmd = helpCommand();
+      break;
+    case SHOW:
+      cmd = showCommand();
+      break;
+    case DESCRIBE:
+      cmd = descCommand();
+      break;
+    case CREATE:
+      cmd = createCommand();
+      break;
+    case DROP:
+      cmd = dropCommand();
+      break;
+    case INSERT:
+      cmd = insertCommand();
+      break;
+    case DELETE:
+      cmd = deleteCommand();
+      break;
+    case SELECT:
+      cmd = selectCommand();
+      break;
+    default:
+      jj_la1[2] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+       {if (true) return cmd;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public ExitCommand exitCommand() throws ParseException {
+  ExitCommand exit = new ExitCommand();
+    jj_consume_token(EXIT);
+             {if (true) return exit;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public HelpCommand helpCommand() throws ParseException {
+  Token t = null;
+  HelpCommand help = new HelpCommand();
+  String argument = "";
+    jj_consume_token(HELP);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case SHOW:
+    case DESCRIBE:
+    case CREATE:
+    case DROP:
+    case EXIT:
+    case INSERT:
+    case DELETE:
+    case SELECT:
+    case ID:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SHOW:
+        t = jj_consume_token(SHOW);
+        break;
+      case DESCRIBE:
+        t = jj_consume_token(DESCRIBE);
+        break;
+      case CREATE:
+        t = jj_consume_token(CREATE);
+        break;
+      case DROP:
+        t = jj_consume_token(DROP);
+        break;
+      case EXIT:
+        t = jj_consume_token(EXIT);
+        break;
+      case INSERT:
+        t = jj_consume_token(INSERT);
+        break;
+      case DELETE:
+        t = jj_consume_token(DELETE);
+        break;
+      case SELECT:
+        t = jj_consume_token(SELECT);
+        break;
+      case ID:
+        t = jj_consume_token(ID);
+        break;
+      default:
+        jj_la1[3] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+         argument = t.image.toString();
+      break;
+    default:
+      jj_la1[4] = jj_gen;
+      ;
+    }
+      help.setArgument(argument);
+      {if (true) return help;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public ShowCommand showCommand() throws ParseException {
+  ShowCommand show = new ShowCommand();
+  String argument = null;
+    jj_consume_token(SHOW);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ID:
+    case QUOTED_STRING:
+      argument = getString();
+      break;
+    default:
+      jj_la1[5] = jj_gen;
+      ;
+    }
+      show.setArgument(argument);
+      {if (true) return show;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public DescCommand descCommand() throws ParseException {
+  DescCommand desc = new DescCommand();
+  String argument = null;
+    jj_consume_token(DESCRIBE);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ID:
+    case QUOTED_STRING:
+      argument = getString();
+      break;
+    default:
+      jj_la1[6] = jj_gen;
+      ;
+    }
+      desc.setArgument(argument);
+      {if (true) return desc;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public CreateCommand createCommand() throws ParseException {
+  CreateCommand create = new CreateCommand();
+  String argument = null;
+  List<String> columnfamilies = null;
+  int limit = 1;
+    jj_consume_token(CREATE);
+    argument = getString();
+         create.setTable(argument);
+    jj_consume_token(COLUMNFAMILIES);
+    columnfamilies = getLiteralValues();
+         create.setColumnfamilies(columnfamilies);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case LIMIT:
+      jj_consume_token(LIMIT);
+      jj_consume_token(EQUALS);
+      limit = getInt();
+            try{
+               create.setLimit(limit);
+            }catch(ClassCastException ce) {
+               {if (true) throw generateParseException();}
+        }
+      break;
+    default:
+      jj_la1[7] = jj_gen;
+      ;
+    }
+    {if (true) return create;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public DropCommand dropCommand() throws ParseException {
+  DropCommand drop = new DropCommand();
+  String argument = null;
+    jj_consume_token(DROP);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ID:
+    case QUOTED_STRING:
+      argument = getString();
+      break;
+    default:
+      jj_la1[8] = jj_gen;
+      ;
+    }
+      drop.setArgument(argument);
+      {if (true) return drop;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public InsertCommand insertCommand() throws ParseException {
+    InsertCommand in = new InsertCommand();
+    Map<String, List<String>> cond = null;
+    List<String> columnfamilies = null;
+    List<String> values = null;
+    String table = null;
+    jj_consume_token(INSERT);
+    table = getString();
+         in.setTable(table);
+    columnfamilies = getLiteralValues();
+        in.setColumnfamilies(columnfamilies);
+    jj_consume_token(VALUES);
+    values = getLiteralValues();
+        in.setValues(values);
+    jj_consume_token(WHERE);
+    cond = WhereClause();
+        try{
+           in.setCondition(cond);
+        }catch(ClassCastException ce) {
+            {if (true) throw generateParseException();}
+     }
+       {if (true) return in;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public DeleteCommand deleteCommand() throws ParseException {
+    DeleteCommand del = new DeleteCommand();
+    Map<String, List<String>> cond = null;
+    String argument = null;
+    jj_consume_token(DELETE);
+    argument = getString();
+         del.setTable(argument);
+    jj_consume_token(WHERE);
+    cond = WhereClause();
+        try{
+           del.setCondition(cond);
+        }catch(ClassCastException ce) {
+            {if (true) throw generateParseException();}
+        }
+       {if (true) return del;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public SelectCommand selectCommand() throws ParseException {
+    SelectCommand select = new SelectCommand();
+    Map<String, List<String>> cond = null;
+    String argument = null;
+    int limit;
+    jj_consume_token(SELECT);
+    argument = getString();
+         select.setTable(argument);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case WHERE:
+      jj_consume_token(WHERE);
+      cond = WhereClause();
+        try{
+           select.setCondition(cond);
+        }catch(ClassCastException ce) {
+            {if (true) throw generateParseException();}
+        }
+      break;
+    default:
+      jj_la1[9] = jj_gen;
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case LIMIT:
+      jj_consume_token(LIMIT);
+      jj_consume_token(EQUALS);
+      limit = getInt();
+            try{
+               select.setLimit(limit);
+            }catch(ClassCastException ce) {
+               {if (true) throw generateParseException();}
+        }
+      break;
+    default:
+      jj_la1[10] = jj_gen;
+      ;
+    }
+    {if (true) return select;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+* TODO : expressions codes need more love.
+*/
+  final public String getString() throws ParseException {
+  Token t = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ID:
+      t = jj_consume_token(ID);
+      break;
+    case QUOTED_STRING:
+      t = jj_consume_token(QUOTED_STRING);
+      break;
+    default:
+      jj_la1[11] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+        {if (true) return t.image.toString();}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public int getInt() throws ParseException {
+  Token t = null;
+    t = jj_consume_token(NUM);
+     {if (true) return Integer.parseInt(t.image.toString());}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Map<String, List<String>> WhereClause() throws ParseException {
+    Map<String, List<String>> result =
+               new HashMap<String, List<String>>();
+    List<String> exception =
+               new ArrayList<String>();
+      try{
+        result.putAll(ConditionExpression());
+      }catch(ParseException pe) {
+        exception.add(pe.toString());
+        result.put("error", exception);
+      }
+    label_1:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case AND:
+        ;
+        break;
+      default:
+        jj_la1[12] = jj_gen;
+        break label_1;
+      }
+      jj_consume_token(AND);
+      try{
+        result.putAll(ConditionExpression());
+      }catch(ParseException pe) {
+        exception.add(pe.toString());
+        result.put("error", exception);
+      }
+    }
+   {if (true) return result;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Map<String, List<String>> ConditionExpression() throws ParseException {
+    Token tSearchName, tComparator, tComparand;
+    Map<String, List<String>> tmp =
+               new HashMap<String, List<String>>();
+    List<String> values =
+               new ArrayList<String>();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ROW:
+      tSearchName = jj_consume_token(ROW);
+      break;
+    case COLUMN:
+      tSearchName = jj_consume_token(COLUMN);
+      break;
+    case TIME:
+      tSearchName = jj_consume_token(TIME);
+      break;
+    case ID:
+      tSearchName = jj_consume_token(ID);
+      break;
+    case VALUES:
+      tSearchName = jj_consume_token(VALUES);
+      break;
+    case COLUMNFAMILIES:
+      tSearchName = jj_consume_token(COLUMNFAMILIES);
+      break;
+    default:
+      jj_la1[13] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case EQUALS:
+      tComparator = jj_consume_token(EQUALS);
+      break;
+    case NOTEQUAL:
+      tComparator = jj_consume_token(NOTEQUAL);
+      break;
+    default:
+      jj_la1[14] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case QUOTED_STRING:
+      tComparand = jj_consume_token(QUOTED_STRING);
+          values.add("quoted string");
+          tmp.put("error", values);
+          {if (true) return tmp;}
+      break;
+    case STRING_LITERAL:
+      tComparand = jj_consume_token(STRING_LITERAL);
+    values.add(tComparator.image);
+    values.add(tComparand.image.substring(1,tComparand.image.length() - 1));
+
+  if(tSearchName.image.toString().equals("row") ||
+  tSearchName.image.toString().equals("column") ||
+  tSearchName.image.toString().equals("time"))
+    { tmp.put(tSearchName.image, values); }
+  else
+    {
+    values.add(tSearchName.image.toString());
+    tmp.put("error", values);
+    }
+
+    {if (true) return tmp;}
+      break;
+    default:
+      jj_la1[15] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  final public List<String> getLiteralValues() throws ParseException {
+    List<String> values = new ArrayList<String>();
+    String literal = null;
+    jj_consume_token(LPAREN);
+   literal = getStringLiteral();
+ if(literal != null) values.add(literal);
+    label_2:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+      case ID:
+      case STRING:
+      case QUOTED_STRING:
+      case STRING_LITERAL:
+        ;
+        break;
+      default:
+        jj_la1[16] = jj_gen;
+        break label_2;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+        jj_consume_token(COMMA);
+   literal = getStringLiteral();
+   if(literal != null) values.add(literal);
+        break;
+      case ID:
+      case STRING:
+      case QUOTED_STRING:
+      case STRING_LITERAL:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case ID:
+          jj_consume_token(ID);
+          break;
+        case STRING_LITERAL:
+          jj_consume_token(STRING_LITERAL);
+          break;
+        case QUOTED_STRING:
+          jj_consume_token(QUOTED_STRING);
+          break;
+        case STRING:
+          jj_consume_token(STRING);
+          break;
+        default:
+          jj_la1[17] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+       values.removeAll(values);
+        break;
+      default:
+        jj_la1[18] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    }
+    jj_consume_token(RPAREN);
+     {if (true) return values;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String getStringLiteral() throws ParseException {
+    Token stringLiteral;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case STRING_LITERAL:
+      stringLiteral = jj_consume_token(STRING_LITERAL);
+   {if (true) return stringLiteral.image.substring(1,stringLiteral.image.length() - 1);}
+      break;
+    case QUOTED_STRING:
+      jj_consume_token(QUOTED_STRING);
+                     {if (true) return null;}
+      break;
+    default:
+      jj_la1[19] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  public ParserTokenManager token_source;
+  SimpleCharStream jj_input_stream;
+  public Token token, jj_nt;
+  private int jj_ntk;
+  private int jj_gen;
+  final private int[] jj_la1 = new int[20];
+  static private int[] jj_la1_0;
+  static private int[] jj_la1_1;
+  static {
+      jj_la1_0();
+      jj_la1_1();
+   }
+   private static void jj_la1_0() {
+      jj_la1_0 = new int[] {0x3fe0,0x3fe1,0x3fe0,0x40003fc0,0x40003fc0,0x40000000,0x40000000,0x100000,0x40000000,0x80000,0x100000,0x40000000,0x200000,0x4007c000,0x18000000,0x0,0x40800000,0x40000000,0x40800000,0x0,};
+   }
+   private static void jj_la1_1() {
+      jj_la1_1 = new int[] {0x0,0x8,0x0,0x0,0x0,0x2,0x2,0x0,0x2,0x0,0x0,0x2,0x0,0x0,0x0,0x6,0x7,0x7,0x7,0x6,};
+   }
+
+  public Parser(java.io.InputStream stream) {
+     this(stream, null);
+  }
+  public Parser(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+    token_source = new ParserTokenManager(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  public void ReInit(java.io.InputStream stream) {
+     ReInit(stream, null);
+  }
+  public void ReInit(java.io.InputStream stream, String encoding) {
+    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+    token_source.ReInit(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  public Parser(java.io.Reader stream) {
+    jj_input_stream = new SimpleCharStream(stream, 1, 1);
+    token_source = new ParserTokenManager(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  public void ReInit(java.io.Reader stream) {
+    jj_input_stream.ReInit(stream, 1, 1);
+    token_source.ReInit(jj_input_stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  public Parser(ParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  public void ReInit(ParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 20; i++) jj_la1[i] = -1;
+  }
+
+  final private Token jj_consume_token(int kind) throws ParseException {
+    Token oldToken;
+    if ((oldToken = token).next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    if (token.kind == kind) {
+      jj_gen++;
+      return token;
+    }
+    token = oldToken;
+    jj_kind = kind;
+    throw generateParseException();
+  }
+
+  final public Token getNextToken() {
+    if (token.next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    jj_gen++;
+    return token;
+  }
+
+  final public Token getToken(int index) {
+    Token t = token;
+    for (int i = 0; i < index; i++) {
+      if (t.next != null) t = t.next;
+      else t = t.next = token_source.getNextToken();
+    }
+    return t;
+  }
+
+  final private int jj_ntk() {
+    if ((jj_nt=token.next) == null)
+      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+    else
+      return (jj_ntk = jj_nt.kind);
+  }
+
+  private java.util.Vector jj_expentries = new java.util.Vector();
+  private int[] jj_expentry;
+  private int jj_kind = -1;
+
+  public ParseException generateParseException() {
+    jj_expentries.removeAllElements();
+    boolean[] la1tokens = new boolean[36];
+    for (int i = 0; i < 36; i++) {
+      la1tokens[i] = false;
+    }
+    if (jj_kind >= 0) {
+      la1tokens[jj_kind] = true;
+      jj_kind = -1;
+    }
+    for (int i = 0; i < 20; i++) {
+      if (jj_la1[i] == jj_gen) {
+        for (int j = 0; j < 32; j++) {
+          if ((jj_la1_0[i] & (1<<j)) != 0) {
+            la1tokens[j] = true;
+          }
+          if ((jj_la1_1[i] & (1<<j)) != 0) {
+            la1tokens[32+j] = true;
+          }
+        }
+      }
+    }
+    for (int i = 0; i < 36; i++) {
+      if (la1tokens[i]) {
+        jj_expentry = new int[1];
+        jj_expentry[0] = i;
+        jj_expentries.addElement(jj_expentry);
+      }
+    }
+    int[][] exptokseq = new int[jj_expentries.size()][];
+    for (int i = 0; i < jj_expentries.size(); i++) {
+      exptokseq[i] = (int[])jj_expentries.elementAt(i);
+    }
+    return new ParseException(token, exptokseq, tokenImage);
+  }
+
+  final public void enable_tracing() {
+  }
+
+  final public void disable_tracing() {
+  }
+
+}

+ 94 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserConstants.java

@@ -0,0 +1,94 @@
+/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+public interface ParserConstants {
+
+  int EOF = 0;
+  int HELP = 5;
+  int SHOW = 6;
+  int DESCRIBE = 7;
+  int CREATE = 8;
+  int DROP = 9;
+  int EXIT = 10;
+  int INSERT = 11;
+  int DELETE = 12;
+  int SELECT = 13;
+  int ROW = 14;
+  int COLUMN = 15;
+  int TIME = 16;
+  int VALUES = 17;
+  int COLUMNFAMILIES = 18;
+  int WHERE = 19;
+  int LIMIT = 20;
+  int AND = 21;
+  int OR = 22;
+  int COMMA = 23;
+  int DOT = 24;
+  int LPAREN = 25;
+  int RPAREN = 26;
+  int EQUALS = 27;
+  int NOTEQUAL = 28;
+  int OPTIONS = 29;
+  int ID = 30;
+  int NUM = 31;
+  int STRING = 32;
+  int QUOTED_STRING = 33;
+  int STRING_LITERAL = 34;
+
+  int DEFAULT = 0;
+
+  String[] tokenImage = {
+    "<EOF>",
+    "\" \"",
+    "\"\\t\"",
+    "\"\\r\"",
+    "\"\\n\"",
+    "\"help\"",
+    "\"show\"",
+    "\"describe\"",
+    "\"create\"",
+    "\"drop\"",
+    "\"exit\"",
+    "\"insert\"",
+    "\"delete\"",
+    "\"select\"",
+    "\"row\"",
+    "\"column\"",
+    "\"time\"",
+    "\"values\"",
+    "\"columnfamilies\"",
+    "\"where\"",
+    "\"limit\"",
+    "\"and\"",
+    "\"or\"",
+    "\",\"",
+    "\".\"",
+    "\"(\"",
+    "\")\"",
+    "\"=\"",
+    "\"<>\"",
+    "\"-\"",
+    "<ID>",
+    "<NUM>",
+    "<STRING>",
+    "<QUOTED_STRING>",
+    "<STRING_LITERAL>",
+    "\";\"",
+  };
+
+}

+ 1015 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/ParserTokenManager.java

@@ -0,0 +1,1015 @@
+/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.StringReader;
+import java.io.Reader;
+import org.apache.hadoop.hbase.shell.*;
+
+public class ParserTokenManager implements ParserConstants
+{
+  public  java.io.PrintStream debugStream = System.out;
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0)
+{
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0x20000000L) != 0L)
+            return 1;
+         if ((active0 & 0x7fffe0L) != 0L)
+         {
+            jjmatchedKind = 30;
+            return 13;
+         }
+         return -1;
+      case 1:
+         if ((active0 & 0x3fffe0L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 1;
+            return 13;
+         }
+         if ((active0 & 0x400000L) != 0L)
+            return 13;
+         return -1;
+      case 2:
+         if ((active0 & 0x204000L) != 0L)
+            return 13;
+         if ((active0 & 0x1fbfe0L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 2;
+            return 13;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0x10660L) != 0L)
+            return 13;
+         if ((active0 & 0x1eb980L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 3;
+            return 13;
+         }
+         return -1;
+      case 4:
+         if ((active0 & 0x6b980L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 4;
+            return 13;
+         }
+         if ((active0 & 0x180000L) != 0L)
+            return 13;
+         return -1;
+      case 5:
+         if ((active0 & 0x6b900L) != 0L)
+            return 13;
+         if ((active0 & 0x80L) != 0L)
+         {
+            if (jjmatchedPos != 5)
+            {
+               jjmatchedKind = 30;
+               jjmatchedPos = 5;
+            }
+            return 13;
+         }
+         return -1;
+      case 6:
+         if ((active0 & 0x40080L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 6;
+            return 13;
+         }
+         return -1;
+      case 7:
+         if ((active0 & 0x80L) != 0L)
+            return 13;
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 7;
+            return 13;
+         }
+         return -1;
+      case 8:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 8;
+            return 13;
+         }
+         return -1;
+      case 9:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 9;
+            return 13;
+         }
+         return -1;
+      case 10:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 10;
+            return 13;
+         }
+         return -1;
+      case 11:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 11;
+            return 13;
+         }
+         return -1;
+      case 12:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 30;
+            jjmatchedPos = 12;
+            return 13;
+         }
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_0(int pos, long active0)
+{
+   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+}
+private final int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private final int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 40:
+         return jjStopAtPos(0, 25);
+      case 41:
+         return jjStopAtPos(0, 26);
+      case 44:
+         return jjStopAtPos(0, 23);
+      case 45:
+         return jjStartNfaWithStates_0(0, 29, 1);
+      case 46:
+         return jjStopAtPos(0, 24);
+      case 59:
+         return jjStopAtPos(0, 35);
+      case 60:
+         return jjMoveStringLiteralDfa1_0(0x10000000L);
+      case 61:
+         return jjStopAtPos(0, 27);
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa1_0(0x200000L);
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa1_0(0x48100L);
+      case 68:
+      case 100:
+         return jjMoveStringLiteralDfa1_0(0x1280L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa1_0(0x400L);
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa1_0(0x20L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa1_0(0x800L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa1_0(0x100000L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa1_0(0x400000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa1_0(0x4000L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa1_0(0x2040L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x10000L);
+      case 86:
+      case 118:
+         return jjMoveStringLiteralDfa1_0(0x20000L);
+      case 87:
+      case 119:
+         return jjMoveStringLiteralDfa1_0(0x80000L);
+      default :
+         return jjMoveNfa_0(0, 0);
+   }
+}
+private final int jjMoveStringLiteralDfa1_0(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 62:
+         if ((active0 & 0x10000000L) != 0L)
+            return jjStopAtPos(1, 28);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa2_0(active0, 0x20000L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa2_0(active0, 0x30a0L);
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa2_0(active0, 0x80040L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0x110000L);
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa2_0(active0, 0x200800L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4c000L);
+      case 82:
+      case 114:
+         if ((active0 & 0x400000L) != 0L)
+            return jjStartNfaWithStates_0(1, 22, 13);
+         return jjMoveStringLiteralDfa2_0(active0, 0x300L);
+      case 88:
+      case 120:
+         return jjMoveStringLiteralDfa2_0(active0, 0x400L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(0, active0);
+}
+private final int jjMoveStringLiteralDfa2_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(0, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(1, active0);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 68:
+      case 100:
+         if ((active0 & 0x200000L) != 0L)
+            return jjStartNfaWithStates_0(2, 21, 13);
+         break;
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa3_0(active0, 0x80100L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa3_0(active0, 0x400L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa3_0(active0, 0x6b020L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0x110000L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x240L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa3_0(active0, 0x880L);
+      case 87:
+      case 119:
+         if ((active0 & 0x4000L) != 0L)
+            return jjStartNfaWithStates_0(2, 14, 13);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0);
+}
+private final int jjMoveStringLiteralDfa3_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(1, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100L);
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa4_0(active0, 0x80L);
+      case 69:
+      case 101:
+         if ((active0 & 0x10000L) != 0L)
+            return jjStartNfaWithStates_0(3, 16, 13);
+         return jjMoveStringLiteralDfa4_0(active0, 0x3800L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000L);
+      case 80:
+      case 112:
+         if ((active0 & 0x20L) != 0L)
+            return jjStartNfaWithStates_0(3, 5, 13);
+         else if ((active0 & 0x200L) != 0L)
+            return jjStartNfaWithStates_0(3, 9, 13);
+         break;
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000L);
+      case 84:
+      case 116:
+         if ((active0 & 0x400L) != 0L)
+            return jjStartNfaWithStates_0(3, 10, 13);
+         break;
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa4_0(active0, 0x68000L);
+      case 87:
+      case 119:
+         if ((active0 & 0x40L) != 0L)
+            return jjStartNfaWithStates_0(3, 6, 13);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(2, active0);
+}
+private final int jjMoveStringLiteralDfa4_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(2, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(3, active0);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa5_0(active0, 0x2000L);
+      case 69:
+      case 101:
+         if ((active0 & 0x80000L) != 0L)
+            return jjStartNfaWithStates_0(4, 19, 13);
+         return jjMoveStringLiteralDfa5_0(active0, 0x20000L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa5_0(active0, 0x48000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa5_0(active0, 0x880L);
+      case 84:
+      case 116:
+         if ((active0 & 0x100000L) != 0L)
+            return jjStartNfaWithStates_0(4, 20, 13);
+         return jjMoveStringLiteralDfa5_0(active0, 0x1100L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(3, active0);
+}
+private final int jjMoveStringLiteralDfa5_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(3, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(4, active0);
+      return 5;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         if ((active0 & 0x100L) != 0L)
+            return jjStartNfaWithStates_0(5, 8, 13);
+         else if ((active0 & 0x1000L) != 0L)
+            return jjStartNfaWithStates_0(5, 12, 13);
+         break;
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa6_0(active0, 0x80L);
+      case 78:
+      case 110:
+         if ((active0 & 0x8000L) != 0L)
+         {
+            jjmatchedKind = 15;
+            jjmatchedPos = 5;
+         }
+         return jjMoveStringLiteralDfa6_0(active0, 0x40000L);
+      case 83:
+      case 115:
+         if ((active0 & 0x20000L) != 0L)
+            return jjStartNfaWithStates_0(5, 17, 13);
+         break;
+      case 84:
+      case 116:
+         if ((active0 & 0x800L) != 0L)
+            return jjStartNfaWithStates_0(5, 11, 13);
+         else if ((active0 & 0x2000L) != 0L)
+            return jjStartNfaWithStates_0(5, 13, 13);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(4, active0);
+}
+private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(4, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(5, active0);
+      return 6;
+   }
+   switch(curChar)
+   {
+      case 66:
+      case 98:
+         return jjMoveStringLiteralDfa7_0(active0, 0x80L);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa7_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(5, active0);
+}
+private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(5, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(6, active0);
+      return 7;
+   }
+   switch(curChar)
+   {
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa8_0(active0, 0x40000L);
+      case 69:
+      case 101:
+         if ((active0 & 0x80L) != 0L)
+            return jjStartNfaWithStates_0(7, 7, 13);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(6, active0);
+}
+private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(6, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(7, active0);
+      return 8;
+   }
+   switch(curChar)
+   {
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa9_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(7, active0);
+}
+private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(7, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(8, active0);
+      return 9;
+   }
+   switch(curChar)
+   {
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa10_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(8, active0);
+}
+private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(8, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(9, active0);
+      return 10;
+   }
+   switch(curChar)
+   {
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa11_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(9, active0);
+}
+private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(9, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(10, active0);
+      return 11;
+   }
+   switch(curChar)
+   {
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa12_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(10, active0);
+}
+private final int jjMoveStringLiteralDfa12_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(10, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(11, active0);
+      return 12;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa13_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(11, active0);
+}
+private final int jjMoveStringLiteralDfa13_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(11, old0); 
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(12, active0);
+      return 13;
+   }
+   switch(curChar)
+   {
+      case 83:
+      case 115:
+         if ((active0 & 0x40000L) != 0L)
+            return jjStartNfaWithStates_0(13, 18, 13);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(12, active0);
+}
+private final void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private final void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private final void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+private final void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+private final void jjCheckNAddStates(int start)
+{
+   jjCheckNAdd(jjnextStates[start]);
+   jjCheckNAdd(jjnextStates[start + 1]);
+}
+static final long[] jjbitVec0 = {
+   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private final int jjMoveNfa_0(int startState, int curPos)
+{
+   int[] nextStates;
+   int startsAt = 0;
+   jjnewStateCnt = 13;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int j, kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         MatchLoop: do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 32)
+                        kind = 32;
+                     jjCheckNAdd(3);
+                  }
+                  else if (curChar == 39)
+                     jjCheckNAddStates(0, 2);
+                  else if (curChar == 34)
+                     jjCheckNAdd(5);
+                  else if (curChar == 45)
+                  {
+                     if (kind > 30)
+                        kind = 30;
+                     jjCheckNAdd(1);
+                  }
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 31)
+                        kind = 31;
+                     jjCheckNAdd(2);
+                  }
+                  break;
+               case 13:
+                  if ((0x3ff200000000000L & l) != 0L)
+                  {
+                     if (kind > 30)
+                        kind = 30;
+                     jjCheckNAdd(1);
+                  }
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 32)
+                        kind = 32;
+                     jjCheckNAdd(3);
+                  }
+                  break;
+               case 1:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 30)
+                     kind = 30;
+                  jjCheckNAdd(1);
+                  break;
+               case 2:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 31)
+                     kind = 31;
+                  jjCheckNAdd(2);
+                  break;
+               case 3:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 32)
+                     kind = 32;
+                  jjCheckNAdd(3);
+                  break;
+               case 4:
+                  if (curChar == 34)
+                     jjCheckNAdd(5);
+                  break;
+               case 5:
+                  if ((0xfffffffbffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(5, 6);
+                  break;
+               case 6:
+                  if (curChar == 34 && kind > 33)
+                     kind = 33;
+                  break;
+               case 7:
+                  if (curChar == 39)
+                     jjCheckNAddStates(0, 2);
+                  break;
+               case 8:
+                  if ((0xffffff7fffffffffL & l) != 0L)
+                     jjCheckNAddStates(0, 2);
+                  break;
+               case 9:
+                  if (curChar == 39)
+                     jjCheckNAddStates(3, 5);
+                  break;
+               case 10:
+                  if (curChar == 39)
+                     jjstateSet[jjnewStateCnt++] = 9;
+                  break;
+               case 11:
+                  if ((0xffffff7fffffffffL & l) != 0L)
+                     jjCheckNAddStates(3, 5);
+                  break;
+               case 12:
+                  if (curChar == 39 && kind > 34)
+                     kind = 34;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         MatchLoop: do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 30)
+                        kind = 30;
+                     jjCheckNAdd(1);
+                  }
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                  {
+                     if (kind > 32)
+                        kind = 32;
+                     jjCheckNAdd(3);
+                  }
+                  break;
+               case 13:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 30)
+                        kind = 30;
+                     jjCheckNAdd(1);
+                  }
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                  {
+                     if (kind > 32)
+                        kind = 32;
+                     jjCheckNAdd(3);
+                  }
+                  break;
+               case 1:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 30)
+                     kind = 30;
+                  jjCheckNAdd(1);
+                  break;
+               case 3:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 32)
+                     kind = 32;
+                  jjCheckNAdd(3);
+                  break;
+               case 5:
+                  jjAddStates(6, 7);
+                  break;
+               case 8:
+                  jjCheckNAddStates(0, 2);
+                  break;
+               case 11:
+                  jjCheckNAddStates(3, 5);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         MatchLoop: do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 5:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(6, 7);
+                  break;
+               case 8:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(0, 2);
+                  break;
+               case 11:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(3, 5);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 13 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+static final int[] jjnextStates = {
+   8, 10, 12, 10, 11, 12, 5, 6, 
+};
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, "\54", "\56", "\50", 
+"\51", "\75", "\74\76", "\55", null, null, null, null, null, "\73", };
+public static final String[] lexStateNames = {
+   "DEFAULT", 
+};
+static final long[] jjtoToken = {
+   0xfffffffe1L, 
+};
+static final long[] jjtoSkip = {
+   0x1eL, 
+};
+protected SimpleCharStream input_stream;
+private final int[] jjrounds = new int[13];
+private final int[] jjstateSet = new int[26];
+protected char curChar;
+public ParserTokenManager(SimpleCharStream stream){
+   if (SimpleCharStream.staticFlag)
+      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+   input_stream = stream;
+}
+public ParserTokenManager(SimpleCharStream stream, int lexState){
+   this(stream);
+   SwitchTo(lexState);
+}
+public void ReInit(SimpleCharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private final void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 13; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+public void ReInit(SimpleCharStream stream, int lexState)
+{
+   ReInit(stream);
+   SwitchTo(lexState);
+}
+public void SwitchTo(int lexState)
+{
+   if (lexState >= 1 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   Token t = Token.newToken(jjmatchedKind);
+   t.kind = jjmatchedKind;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   t.image = (im == null) ? input_stream.GetImage() : im;
+   t.beginLine = input_stream.getBeginLine();
+   t.beginColumn = input_stream.getBeginColumn();
+   t.endLine = input_stream.getEndLine();
+   t.endColumn = input_stream.getEndColumn();
+   return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+public Token getNextToken() 
+{
+  int kind;
+  Token specialToken = null;
+  Token matchedToken;
+  int curPos = 0;
+
+  EOFLoop :
+  for (;;)
+  {   
+   try   
+   {     
+      curChar = input_stream.BeginToken();
+   }     
+   catch(java.io.IOException e)
+   {        
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      return matchedToken;
+   }
+
+   try { input_stream.backup(0);
+      while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L)
+         curChar = input_stream.BeginToken();
+   }
+   catch (java.io.IOException e1) { continue EOFLoop; }
+   jjmatchedKind = 0x7fffffff;
+   jjmatchedPos = 0;
+   curPos = jjMoveStringLiteralDfa0_0();
+   if (jjmatchedKind != 0x7fffffff)
+   {
+      if (jjmatchedPos + 1 < curPos)
+         input_stream.backup(curPos - jjmatchedPos - 1);
+      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+      {
+         matchedToken = jjFillToken();
+         return matchedToken;
+      }
+      else
+      {
+         continue EOFLoop;
+      }
+   }
+   int error_line = input_stream.getEndLine();
+   int error_column = input_stream.getEndColumn();
+   String error_after = null;
+   boolean EOFSeen = false;
+   try { input_stream.readChar(); input_stream.backup(1); }
+   catch (java.io.IOException e1) {
+      EOFSeen = true;
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+      if (curChar == '\n' || curChar == '\r') {
+         error_line++;
+         error_column = 0;
+      }
+      else
+         error_column++;
+   }
+   if (!EOFSeen) {
+      input_stream.backup(1);
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+   }
+   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+  }
+}
+
+}

+ 454 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/SimpleCharStream.java

@@ -0,0 +1,454 @@
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public class SimpleCharStream
+{
+  public static final boolean staticFlag = false;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  public int bufpos = -1;
+  protected int bufline[];
+  protected int bufcolumn[];
+
+  protected int column = 0;
+  protected int line = 1;
+
+  protected boolean prevCharIsCR = false;
+  protected boolean prevCharIsLF = false;
+
+  protected java.io.Reader inputStream;
+
+  protected char[] buffer;
+  protected int maxNextCharInd = 0;
+  protected int inBuf = 0;
+  protected int tabSize = 8;
+
+  protected void setTabSize(int i) { tabSize = i; }
+  protected int getTabSize(int i) { return tabSize; }
+
+
+  protected void ExpandBuff(boolean wrapAround)
+  {
+     char[] newbuffer = new char[bufsize + 2048];
+     int newbufline[] = new int[bufsize + 2048];
+     int newbufcolumn[] = new int[bufsize + 2048];
+
+     try
+     {
+        if (wrapAround)
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           System.arraycopy(buffer, 0, newbuffer,
+                                             bufsize - tokenBegin, bufpos);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+        }
+        else
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos -= tokenBegin);
+        }
+     }
+     catch (Throwable t)
+     {
+        throw new Error(t.getMessage());
+     }
+
+
+     bufsize += 2048;
+     available = bufsize;
+     tokenBegin = 0;
+  }
+
+  protected void FillBuff() throws java.io.IOException
+  {
+     if (maxNextCharInd == available)
+     {
+        if (available == bufsize)
+        {
+           if (tokenBegin > 2048)
+           {
+              bufpos = maxNextCharInd = 0;
+              available = tokenBegin;
+           }
+           else if (tokenBegin < 0)
+              bufpos = maxNextCharInd = 0;
+           else
+              ExpandBuff(false);
+        }
+        else if (available > tokenBegin)
+           available = bufsize;
+        else if ((tokenBegin - available) < 2048)
+           ExpandBuff(true);
+        else
+           available = tokenBegin;
+     }
+
+     int i;
+     try {
+        if ((i = inputStream.read(buffer, maxNextCharInd,
+                                    available - maxNextCharInd)) == -1)
+        {
+           inputStream.close();
+           throw new java.io.IOException();
+        }
+        else
+           maxNextCharInd += i;
+        return;
+     }
+     catch(java.io.IOException e) {
+        --bufpos;
+        backup(0);
+        if (tokenBegin == -1)
+           tokenBegin = bufpos;
+        throw e;
+     }
+  }
+
+  public char BeginToken() throws java.io.IOException
+  {
+     tokenBegin = -1;
+     char c = readChar();
+     tokenBegin = bufpos;
+
+     return c;
+  }
+
+  protected void UpdateLineColumn(char c)
+  {
+     column++;
+
+     if (prevCharIsLF)
+     {
+        prevCharIsLF = false;
+        line += (column = 1);
+     }
+     else if (prevCharIsCR)
+     {
+        prevCharIsCR = false;
+        if (c == '\n')
+        {
+           prevCharIsLF = true;
+        }
+        else
+           line += (column = 1);
+     }
+
+     switch (c)
+     {
+        case '\r' :
+           prevCharIsCR = true;
+           break;
+        case '\n' :
+           prevCharIsLF = true;
+           break;
+        case '\t' :
+           column--;
+           column += (tabSize - (column % tabSize));
+           break;
+        default :
+           break;
+     }
+
+     bufline[bufpos] = line;
+     bufcolumn[bufpos] = column;
+  }
+
+  public char readChar() throws java.io.IOException
+  {
+     if (inBuf > 0)
+     {
+        --inBuf;
+
+        if (++bufpos == bufsize)
+           bufpos = 0;
+
+        return buffer[bufpos];
+     }
+
+     if (++bufpos >= maxNextCharInd)
+        FillBuff();
+
+     char c = buffer[bufpos];
+
+     UpdateLineColumn(c);
+     return (c);
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndColumn
+   */
+
+  public int getColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndLine
+   */
+
+  public int getLine() {
+     return bufline[bufpos];
+  }
+
+  public int getEndColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  public int getEndLine() {
+     return bufline[bufpos];
+  }
+
+  public int getBeginColumn() {
+     return bufcolumn[tokenBegin];
+  }
+
+  public int getBeginLine() {
+     return bufline[tokenBegin];
+  }
+
+  public void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+       bufpos += bufsize;
+  }
+
+  public SimpleCharStream(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+  }
+
+  public SimpleCharStream(java.io.Reader dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public SimpleCharStream(java.io.Reader dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    bufpos = -1;
+  }
+
+  public void ReInit(java.io.Reader dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+  public void ReInit(java.io.Reader dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public SimpleCharStream(java.io.InputStream dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+     this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, startline, startcolumn, 4096);
+  }
+
+  public SimpleCharStream(java.io.InputStream dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, 1, 1, 4096);
+  }
+
+  public SimpleCharStream(java.io.InputStream dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, int startline,
+                          int startcolumn, int buffersize)
+  {
+     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                     int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, startline, startcolumn, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+  public String GetImage()
+  {
+     if (bufpos >= tokenBegin)
+        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+     else
+        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  public char[] GetSuffix(int len)
+  {
+     char[] ret = new char[len];
+
+     if ((bufpos + 1) >= len)
+        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+     else
+     {
+        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                          len - bufpos - 1);
+        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+     }
+
+     return ret;
+  }
+
+  public void Done()
+  {
+     buffer = null;
+     bufline = null;
+     bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+     int start = tokenBegin;
+     int len;
+
+     if (bufpos >= tokenBegin)
+     {
+        len = bufpos - tokenBegin + inBuf + 1;
+     }
+     else
+     {
+        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+     }
+
+     int i = 0, j = 0, k = 0;
+     int nextColDiff = 0, columnDiff = 0;
+
+     while (i < len &&
+            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+     {
+        bufline[j] = newLine;
+        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+        bufcolumn[j] = newCol + columnDiff;
+        columnDiff = nextColDiff;
+        i++;
+     } 
+
+     if (i < len)
+     {
+        bufline[j] = newLine++;
+        bufcolumn[j] = newCol + columnDiff;
+
+        while (i++ < len)
+        {
+           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+              bufline[j] = newLine++;
+           else
+              bufline[j] = newLine;
+        }
+     }
+
+     line = bufline[j];
+     column = bufcolumn[j];
+  }
+
+}

+ 96 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/Token.java

@@ -0,0 +1,96 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+  /**
+   * An integer that describes the kind of this token.  This numbering
+   * system is determined by JavaCCParser, and a table of these numbers is
+   * stored in the file ...Constants.java.
+   */
+  public int kind;
+
+  /**
+   * beginLine and beginColumn describe the position of the first character
+   * of this token; endLine and endColumn describe the position of the
+   * last character of this token.
+   */
+  public int beginLine, beginColumn, endLine, endColumn;
+
+  /**
+   * The string image of the token.
+   */
+  public String image;
+
+  /**
+   * A reference to the next regular (non-special) token from the input
+   * stream.  If this is the last token from the input stream, or if the
+   * token manager has not read tokens beyond this one, this field is
+   * set to null.  This is true only if this token is also a regular
+   * token.  Otherwise, see below for a description of the contents of
+   * this field.
+   */
+  public Token next;
+
+  /**
+   * This field is used to access special tokens that occur prior to this
+   * token, but after the immediately preceding regular (non-special) token.
+   * If there are no such special tokens, this field is set to null.
+   * When there are more than one such special token, this field refers
+   * to the last of these special tokens, which in turn refers to the next
+   * previous special token through its specialToken field, and so on
+   * until the first special token (whose specialToken field is null).
+   * The next fields of special tokens refer to other special tokens that
+   * immediately follow it (without an intervening regular token).  If there
+   * is no such token, this field is null.
+   */
+  public Token specialToken;
+
+  /**
+   * Returns the image.
+   */
+  public String toString()
+  {
+     return image;
+  }
+
+  /**
+   * Returns a new Token object, by default. However, if you want, you
+   * can create and return subclass objects based on the value of ofKind.
+   * Simply add the cases to the switch for all those special cases.
+   * For example, if you have a subclass of Token called IDToken that
+   * you want to create if ofKind is ID, simlpy add something like :
+   *
+   *    case MyParserConstants.ID : return new IDToken();
+   *
+   * to the following switch statement. Then you can cast matchedToken
+   * variable to the appropriate type and use it in your lexical actions.
+   */
+  public static final Token newToken(int ofKind)
+  {
+     switch(ofKind)
+     {
+       default : return new Token();
+     }
+  }
+
+}

+ 148 - 0
src/contrib/hbase/src/java/org/apache/hadoop/hbase/shell/generated/TokenMgrError.java

@@ -0,0 +1,148 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell.generated;
+
+public class TokenMgrError extends Error
+{
+   /*
+    * Ordinals for various reasons why an Error of this type can be thrown.
+    */
+
+   /**
+    * Lexical error occured.
+    */
+   static final int LEXICAL_ERROR = 0;
+
+   /**
+    * An attempt wass made to create a second instance of a static token manager.
+    */
+   static final int STATIC_LEXER_ERROR = 1;
+
+   /**
+    * Tried to change to an invalid lexical state.
+    */
+   static final int INVALID_LEXICAL_STATE = 2;
+
+   /**
+    * Detected (and bailed out of) an infinite loop in the token manager.
+    */
+   static final int LOOP_DETECTED = 3;
+
+   /**
+    * Indicates the reason why the exception is thrown. It will have
+    * one of the above 4 values.
+    */
+   int errorCode;
+
+   /**
+    * Replaces unprintable characters by their espaced (or unicode escaped)
+    * equivalents in the given string
+    */
+   protected static final String addEscapes(String str) {
+      StringBuffer retval = new StringBuffer();
+      char ch;
+      for (int i = 0; i < str.length(); i++) {
+        switch (str.charAt(i))
+        {
+           case 0 :
+              continue;
+           case '\b':
+              retval.append("\\b");
+              continue;
+           case '\t':
+              retval.append("\\t");
+              continue;
+           case '\n':
+              retval.append("\\n");
+              continue;
+           case '\f':
+              retval.append("\\f");
+              continue;
+           case '\r':
+              retval.append("\\r");
+              continue;
+           case '\"':
+              retval.append("\\\"");
+              continue;
+           case '\'':
+              retval.append("\\\'");
+              continue;
+           case '\\':
+              retval.append("\\\\");
+              continue;
+           default:
+              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                 String s = "0000" + Integer.toString(ch, 16);
+                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+              } else {
+                 retval.append(ch);
+              }
+              continue;
+        }
+      }
+      return retval.toString();
+   }
+
+   /**
+    * Returns a detailed message for the Error when it is thrown by the
+    * token manager to indicate a lexical error.
+    * Parameters : 
+    *    EOFSeen     : indicates if EOF caused the lexicl error
+    *    curLexState : lexical state in which this error occured
+    *    errorLine   : line number when the error occured
+    *    errorColumn : column number when the error occured
+    *    errorAfter  : prefix that was seen before this error occured
+    *    curchar     : the offending character
+    * Note: You can customize the lexical error message by modifying this method.
+    */
+   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+      return("Lexical error at line " +
+           errorLine + ", column " +
+           errorColumn + ".  Encountered: " +
+           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+           "after : \"" + addEscapes(errorAfter) + "\"");
+   }
+
+   /**
+    * You can also modify the body of this method to customize your error messages.
+    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+    * of end-users concern, so you can return something like : 
+    *
+    *     "Internal Error : Please file a bug report .... "
+    *
+    * from this method for such cases in the release version of your parser.
+    */
+   public String getMessage() {
+      return super.getMessage();
+   }
+
+   /*
+    * Constructors of various flavors follow.
+    */
+
+   public TokenMgrError() {
+   }
+
+   public TokenMgrError(String message, int reason) {
+      super(message);
+      errorCode = reason;
+   }
+
+   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+   }
+}

+ 33 - 0
src/contrib/hbase/src/test/org/apache/hadoop/hbase/shell/TestHBaseShell.java

@@ -0,0 +1,33 @@
+/**
+ * Copyright 2007 The Apache Software Foundation
+ *
+ * Licensed 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.hadoop.hbase.shell;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HClient;
+import org.apache.hadoop.hbase.shell.generated.ParseException;
+import org.apache.hadoop.hbase.shell.generated.Parser;
+
+public class TestHBaseShell extends TestCase {
+  public void testParse() {
+    String queryString1 = "SELECT test_table WHERE row='row_key' and " +
+      "column='column_key';";
+    new Parser(queryString1);
+    
+  }
+}