diff --git a/CHANGES.txt b/CHANGES.txt
index 0025076..cfe404a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -38,6 +38,8 @@
   HCAT-427 Document storage-based authorization (lefty via gates)
 
   IMPROVEMENTS
+  HCAT-493 Convert classes with 2 space indentation to 4 space indentation for consistent style (amalakar via traviscrawford)
+
   HCAT-489 HCatalog style cleanups and readd javac debug option (traviscrawford)
 
   HCAT-431 document hcat type to java class/pig type mapping (lefty via khorgath)
diff --git a/build.xml b/build.xml
index 76b8cb4..b7fc8a1 100644
--- a/build.xml
+++ b/build.xml
@@ -21,451 +21,452 @@
          xmlns:ivy="antlib:org.apache.ivy.ant"
          xmlns:artifact="artifact:org.apache.maven.artifact.ant">
 
-  <property name="path.to.basedir" location="${basedir}"/>
+    <property name="path.to.basedir" location="${basedir}"/>
 
-  <loadproperties srcfile="${basedir}/build.properties"/>
+    <loadproperties srcfile="${basedir}/build.properties"/>
 
-  <!--  
-  ================================================================================
-  Imports
-  ================================================================================ -->
+    <!--
+   ================================================================================
+   Imports
+   ================================================================================ -->
 
-  <!--
-  ================================================================================
-  Properties and Classpaths Section
-  ================================================================================
-  -->
+    <!--
+    ================================================================================
+    Properties and Classpaths Section
+    ================================================================================
+    -->
 
-  <condition property="staging">
-    <equals arg1="${repo}" arg2="staging"/>
-  </condition>
+    <condition property="staging">
+        <equals arg1="${repo}" arg2="staging"/>
+    </condition>
 
-  <!-- e2e test properties -->
-  <property name="test.e2e.dir" value="${basedir}/src/test/e2e/hcatalog"/>
+    <!-- e2e test properties -->
+    <property name="test.e2e.dir" value="${basedir}/src/test/e2e/hcatalog"/>
 
-  <!-- ivy properties set here -->
-  <property name="ivy.repo.dir" value="${user.home}/ivyrepo" />
-  <property name="ivy.dir" location="ivy" />
-  <loadproperties srcfile="${ivy.dir}/libraries.properties"/>
-  <property name="asfrepo" value="https://repository.apache.org"/>
-  <property name="asfsnapshotrepo" value="${asfrepo}/content/repositories/snapshots"/>
-  <property name="mvnrepo" value="http://repo2.maven.org/maven2"/>
-  <property name="asfstagingrepo" value="${asfrepo}/service/local/staging/deploy/maven2"/>
-  <property name="ivy.jar" location="${ivy.dir}/ivy-${ivy.version}.jar"/>
-  <property name="ant_task.jar" location="${ivy.dir}/maven-ant-tasks-${ant-task.version}.jar"/>
-  <property name="ant_task_repo_url"
-    value="${mvnrepo}/org/apache/maven/maven-ant-tasks/${ant-task.version}/maven-ant-tasks-${ant-task.version}.jar"/>
-  <property name="ivy_repo_url" value="${mvnrepo}/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar"/>
-  <property name="ivy.xml" location="${basedir}/ivy.xml"/>
-  <property name="ivysettings.xml" location="${ivy.dir}/ivysettings.xml" />
-  <property name="build.ivy.dir" location="${build.dir}/ivy" />
-  <property name="pom.file" location="${build.ivy.dir}/${ant.project.name}-${hcatalog.version}.pom"/>
-  <property name="build.ivy.lib.dir" location="${build.ivy.dir}/lib" />
-  <property name="ivy.lib.dir" location="${build.ivy.lib.dir}/${ant.project.name}"/>
-  <property name="build.ivy.report.dir" location="${build.ivy.dir}/report" />
+    <!-- ivy properties set here -->
+    <property name="ivy.repo.dir" value="${user.home}/ivyrepo"/>
+    <property name="ivy.dir" location="ivy"/>
+    <loadproperties srcfile="${ivy.dir}/libraries.properties"/>
+    <property name="asfrepo" value="https://repository.apache.org"/>
+    <property name="asfsnapshotrepo" value="${asfrepo}/content/repositories/snapshots"/>
+    <property name="mvnrepo" value="http://repo2.maven.org/maven2"/>
+    <property name="asfstagingrepo" value="${asfrepo}/service/local/staging/deploy/maven2"/>
+    <property name="ivy.jar" location="${ivy.dir}/ivy-${ivy.version}.jar"/>
+    <property name="ant_task.jar" location="${ivy.dir}/maven-ant-tasks-${ant-task.version}.jar"/>
+    <property name="ant_task_repo_url"
+              value="${mvnrepo}/org/apache/maven/maven-ant-tasks/${ant-task.version}/maven-ant-tasks-${ant-task.version}.jar"/>
+    <property name="ivy_repo_url" value="${mvnrepo}/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar"/>
+    <property name="ivy.xml" location="${basedir}/ivy.xml"/>
+    <property name="ivysettings.xml" location="${ivy.dir}/ivysettings.xml"/>
+    <property name="build.ivy.dir" location="${build.dir}/ivy"/>
+    <property name="pom.file" location="${build.ivy.dir}/${ant.project.name}-${hcatalog.version}.pom"/>
+    <property name="build.ivy.lib.dir" location="${build.ivy.dir}/lib"/>
+    <property name="ivy.lib.dir" location="${build.ivy.lib.dir}/${ant.project.name}"/>
+    <property name="build.ivy.report.dir" location="${build.ivy.dir}/report"/>
 
-  <!-- packaging properties -->
-  <property name="package.prefix" value="/usr"/>
-  <property name="package.conf.dir" value="/etc/hcatalog"/>
-  <property name="package.log.dir" value="/var/log/hcatalog"/>
-  <property name="package.pid.dir" value="/var/run/hcatalog"/>
-  <property name="package.var.dir" value="/var/lib/hcatalog"/>
-  <property name="package.share.dir" value="/share/hcatalog/${module}"/>
-  <property name="package.buildroot" value="${build.dir}/rpm/hcatalog_package_build_${user.name}"/>
-  <property name="package.build.dir" value="${build.dir}/rpm/hcatalog_package_build_${user.name}/BUILD"/>
+    <!-- packaging properties -->
+    <property name="package.prefix" value="/usr"/>
+    <property name="package.conf.dir" value="/etc/hcatalog"/>
+    <property name="package.log.dir" value="/var/log/hcatalog"/>
+    <property name="package.pid.dir" value="/var/run/hcatalog"/>
+    <property name="package.var.dir" value="/var/lib/hcatalog"/>
+    <property name="package.share.dir" value="/share/hcatalog/${module}"/>
+    <property name="package.buildroot" value="${build.dir}/rpm/hcatalog_package_build_${user.name}"/>
+    <property name="package.build.dir" value="${build.dir}/rpm/hcatalog_package_build_${user.name}/BUILD"/>
 
-  <!-- rats properties -->
-  <property name="rat.reporting.classname" value="rat.Report"/>
+    <!-- rats properties -->
+    <property name="rat.reporting.classname" value="rat.Report"/>
 
-  <path id="compile.classpath">
-    <fileset dir="${build.dir}/ivy/lib/default">
-      <include name="**/*.jar"/>
-    </fileset>
-  </path>
+    <path id="compile.classpath">
+        <fileset dir="${build.dir}/ivy/lib/default">
+            <include name="**/*.jar"/>
+        </fileset>
+    </path>
 
-  <path id="test.class.path">
-    <pathelement location="${test.classes}"/>
-    <pathelement location="${build.classes}"/>
-    <pathelement location="conf"/>
-    <fileset dir="${build.dir}/ivy/lib/test">
-      <include name="**/*.jar"/>
-    </fileset>
-    <pathelement location="${basedir}/hcatalog-pig-adapter/build/hcatalog-pig-adapter-${hcatalog.version}.jar"/>
-  </path>
+    <path id="test.class.path">
+        <pathelement location="${test.classes}"/>
+        <pathelement location="${build.classes}"/>
+        <pathelement location="conf"/>
+        <fileset dir="${build.dir}/ivy/lib/test">
+            <include name="**/*.jar"/>
+        </fileset>
+        <pathelement location="${basedir}/hcatalog-pig-adapter/build/hcatalog-pig-adapter-${hcatalog.version}.jar"/>
+    </path>
 
-  <!-- Classpath that includes all sub packages, used for things like Java docs -->
-  <path id="uber.classpath">
-    <fileset dir="${basedir}">
-      <include name="**/build/ivy/lib/default/*.jar"/>
-    </fileset>
-  </path>
+    <!-- Classpath that includes all sub packages, used for things like Java docs -->
+    <path id="uber.classpath">
+        <fileset dir="${basedir}">
+            <include name="**/build/ivy/lib/default/*.jar"/>
+        </fileset>
+    </path>
 
-  <!-- This is a little janky because hcatalog-core.jar is not yet a submodule. -->
-  <target name="ivy-report" depends="ivy-retrieve">
-    <antcall target="_ivy-report"/>
-    <ant target="_ivy-report" dir="hcatalog-pig-adapter" inheritAll="false" useNativeBasedir="true"/>
-    <ant target="ivy-report" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
-  </target>
+    <!-- This is a little janky because hcatalog-core.jar is not yet a submodule. -->
+    <target name="ivy-report" depends="ivy-retrieve">
+        <antcall target="_ivy-report"/>
+        <ant target="_ivy-report" dir="hcatalog-pig-adapter" inheritAll="false" useNativeBasedir="true"/>
+        <ant target="ivy-report" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
+    </target>
 
-  <target name="ivy-download" description="To download ivy" unless="offline">
-    <echo message="${ant.project.name}"/>
-    <get src="${ivy_repo_url}" dest="${ivy.jar}" usetimestamp="true" skipexisting="true"/>
-    <typedef uri="antlib:org.apache.ivy.ant" onerror="fail" loaderRef="ivyLoader">
-      <classpath>
-        <pathelement location="${ivy.jar}"/>
-      </classpath>
-    </typedef>
-  </target>
+    <target name="ivy-download" description="To download ivy" unless="offline">
+        <echo message="${ant.project.name}"/>
+        <get src="${ivy_repo_url}" dest="${ivy.jar}" usetimestamp="true" skipexisting="true"/>
+        <typedef uri="antlib:org.apache.ivy.ant" onerror="fail" loaderRef="ivyLoader">
+            <classpath>
+                <pathelement location="${ivy.jar}"/>
+            </classpath>
+        </typedef>
+    </target>
 
-  <target name="ivy-init" depends="ivy-download,_ivy-init">
-    <!-- HCatalog started as a single source tree that produced multiple artifacts.
-    Currently its going through a transition to subprojects. During this transition
-    we jank together pom files for artifacts produced in the existing source tree until
-    they are correctly generated from per-subproject ivy.xml files. -->
-    <copy file="${pom.file}" tofile="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"
-          overwrite="true"/>
-    <replace file="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"
-             token="artifactId>hcatalog"
-             value="artifactId>hcatalog-core"/>
+    <target name="ivy-init" depends="ivy-download,_ivy-init">
+        <!-- HCatalog started as a single source tree that produced multiple artifacts.
+        Currently its going through a transition to subprojects. During this transition
+        we jank together pom files for artifacts produced in the existing source tree until
+        they are correctly generated from per-subproject ivy.xml files. -->
+        <copy file="${pom.file}" tofile="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"
+              overwrite="true"/>
+        <replace file="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"
+                 token="artifactId>hcatalog"
+                 value="artifactId>hcatalog-core"/>
 
-    <copy file="${pom.file}" overwrite="true"
-          tofile="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"/>
-    <replace file="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"
-             token="artifactId>hcatalog"
-             value="artifactId>hcatalog-server-extensions"/>
-  </target>
+        <copy file="${pom.file}" overwrite="true"
+              tofile="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"/>
+        <replace file="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"
+                 token="artifactId>hcatalog"
+                 value="artifactId>hcatalog-server-extensions"/>
+    </target>
 
-  <target name="init" depends="ivy-retrieve,mvn-init">
-    <mkdir dir="${dist.dir}" />
-    <mkdir dir="${build.classes}" />
-    <mkdir dir="${test.classes}" />
-  </target>
+    <target name="init" depends="ivy-retrieve,mvn-init">
+        <mkdir dir="${dist.dir}"/>
+        <mkdir dir="${build.classes}"/>
+        <mkdir dir="${test.classes}"/>
+    </target>
 
-  <!--
-  ================================================================================
-  Main Build and Jar Section
-  ================================================================================
-  -->
-  <!-- Build HCatalog src files -->
-  <target name="compile-src" depends="init">
-    <javac encoding="${build.encoding}" srcdir="${src.dir}" excludes="${excludes}"
-        includes="**/*.java" destdir="${build.classes}" debug="${javac.debug}"
-        optimize="${javac.optimize}" target="${javac.version}"
-        source="${javac.version}" deprecation="${javac.deprecation}"
-        includeantruntime="false">
-      <compilerarg line="${javac.args}"/>
-      <classpath refid="compile.classpath"/>
-    </javac>
-  </target>
- 
-  <!-- Build the hcatalog client jar -->
-  <target name="clientjar" depends="compile-src">
-    <jar jarfile="${build.dir}/${ant.project.name}/${hcatalog.core.jar}"
-         basedir="${build.classes}"/>
-    <artifact:install file="${build.dir}/${ant.project.name}/${hcatalog.core.jar}">
-      <artifact:pom file="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"/>
-    </artifact:install>
-  </target>
+    <!--
+    ================================================================================
+    Main Build and Jar Section
+    ================================================================================
+    -->
+    <!-- Build HCatalog src files -->
+    <target name="compile-src" depends="init">
+        <javac encoding="${build.encoding}" srcdir="${src.dir}" excludes="${excludes}"
+               includes="**/*.java" destdir="${build.classes}" debug="${javac.debug}"
+               optimize="${javac.optimize}" target="${javac.version}"
+               source="${javac.version}" deprecation="${javac.deprecation}"
+               includeantruntime="false">
+            <compilerarg line="${javac.args}"/>
+            <classpath refid="compile.classpath"/>
+        </javac>
+    </target>
 
-  <!--
-  ================================================================================
-  Build server side code, mainly listener.
-  ================================================================================
-  -->
-  <target name="server-extensions" depends="compile-src">
-    <jar jarfile="${build.dir}/${ant.project.name}/${ant.project.name}-server-extensions-${hcatalog.version}.jar"
-         basedir="${build.classes}"
-         includes="org/apache/hcatalog/listener/**,org/apache/hcatalog/metadata/**"/>
-    <artifact:install file="${build.dir}/${ant.project.name}/${ant.project.name}-server-extensions-${hcatalog.version}.jar">
-      <artifact:pom file="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"/>
-    </artifact:install>
-  </target>
+    <!-- Build the hcatalog client jar -->
+    <target name="clientjar" depends="compile-src">
+        <jar jarfile="${build.dir}/${ant.project.name}/${hcatalog.core.jar}"
+             basedir="${build.classes}"/>
+        <artifact:install file="${build.dir}/${ant.project.name}/${hcatalog.core.jar}">
+            <artifact:pom file="${build.ivy.dir}/hcatalog-core-${hcatalog.version}.pom"/>
+        </artifact:install>
+    </target>
 
-  <!--
-  ================================================================================
-  Build both clientjar and server-extensions
-  ================================================================================
-  -->
-  <target name="jar" depends="checkstyle,shims,clientjar,server-extensions,jar-storage-handlers">
-    <ant target="jar" dir="hcatalog-pig-adapter" inheritAll="false"/>
-    <ant target="jar" dir="webhcat/svr" inheritAll="false"/>
-    <ant target="jar" dir="webhcat/java-client" inheritAll="false"/>
+    <!--
+    ================================================================================
+    Build server side code, mainly listener.
+    ================================================================================
+    -->
+    <target name="server-extensions" depends="compile-src">
+        <jar jarfile="${build.dir}/${ant.project.name}/${ant.project.name}-server-extensions-${hcatalog.version}.jar"
+             basedir="${build.classes}"
+             includes="org/apache/hcatalog/listener/**,org/apache/hcatalog/metadata/**"/>
+        <artifact:install
+                file="${build.dir}/${ant.project.name}/${ant.project.name}-server-extensions-${hcatalog.version}.jar">
+            <artifact:pom file="${build.ivy.dir}/hcatalog-server-extensions-${hcatalog.version}.pom"/>
+        </artifact:install>
+    </target>
 
-    <!-- Build hcatalog.jar, bundling the pig adapter. Our intention is to stop producing this
-         fat jar after some migration period. -->
-    <jar jarfile="${build.dir}/${ant.project.name}/${hcatalog.jar}">
-      <zipfileset src="${build.dir}/${ant.project.name}/${hcatalog.core.jar}"/>
-      <zipfileset src="hcatalog-pig-adapter/build/hcatalog-pig-adapter-${hcatalog.version}.jar"/>
-    </jar>
-  </target>
+    <!--
+    ================================================================================
+    Build both clientjar and server-extensions
+    ================================================================================
+    -->
+    <target name="jar" depends="checkstyle,shims,clientjar,server-extensions,jar-storage-handlers">
+        <ant target="jar" dir="hcatalog-pig-adapter" inheritAll="false"/>
+        <ant target="jar" dir="webhcat/svr" inheritAll="false"/>
+        <ant target="jar" dir="webhcat/java-client" inheritAll="false"/>
 
-  <!--
-  ================================================================================
-  Build shims
-  ================================================================================
-  -->
+        <!-- Build hcatalog.jar, bundling the pig adapter. Our intention is to stop producing this
+             fat jar after some migration period. -->
+        <jar jarfile="${build.dir}/${ant.project.name}/${hcatalog.jar}">
+            <zipfileset src="${build.dir}/${ant.project.name}/${hcatalog.core.jar}"/>
+            <zipfileset src="hcatalog-pig-adapter/build/hcatalog-pig-adapter-${hcatalog.version}.jar"/>
+        </jar>
+    </target>
 
-  <target name="shims" depends="compile-src">
-    <ant antfile="shims/build.xml" target="jar" inheritAll="false" useNativeBasedir="true"/>
-  </target>
+    <!--
+    ================================================================================
+    Build shims
+    ================================================================================
+    -->
 
-  <!--
-  ================================================================================
-  Build storage handlers
-  ================================================================================
-  -->
+    <target name="shims" depends="compile-src">
+        <ant antfile="shims/build.xml" target="jar" inheritAll="false" useNativeBasedir="true"/>
+    </target>
 
-  <target name="jar-storage-handlers">        
-    <ant target="jar" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
-  </target>
+    <!--
+    ================================================================================
+    Build storage handlers
+    ================================================================================
+    -->
 
-  <!--
-  ================================================================================
-  Test Section
-  ================================================================================
-  -->
-  <!-- Build HCatalog test files -->
-  <target name="compile-test" depends="jar">
-    <javac
-        encoding="${build.encoding}"
-        srcdir="${test.src.dir}"
-        excludes="${test.excludes}"
-        includes="**/*.java"
-        destdir="${test.classes}"
-        debug="${javac.debug}"
-        optimize="${javac.optimize}"
-        target="${javac.version}"
-        source="${javac.version}"
-        deprecation="${javac.deprecation}"
-        includeantruntime="false">
-      <compilerarg line="${javac.args}"/>
-      <classpath refid="test.class.path"/>
-    </javac>
-  </target>
+    <target name="jar-storage-handlers">
+        <ant target="jar" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
+    </target>
 
-  <target name="test" depends="compile-test" description="run unit tests">
-    <_junit srcDir="${basedir}/src/test"/>
-    <ant target="test" dir="hcatalog-pig-adapter" inheritAll="false"/>
-    <ant target="test" dir="webhcat/svr" inheritAll="false"/>
-    <ant target="test" dir="webhcat/java-client" inheritAll="false"/>
-    <ant target="test" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
-  </target>
+    <!--
+    ================================================================================
+    Test Section
+    ================================================================================
+    -->
+    <!-- Build HCatalog test files -->
+    <target name="compile-test" depends="jar">
+        <javac
+                encoding="${build.encoding}"
+                srcdir="${test.src.dir}"
+                excludes="${test.excludes}"
+                includes="**/*.java"
+                destdir="${test.classes}"
+                debug="${javac.debug}"
+                optimize="${javac.optimize}"
+                target="${javac.version}"
+                source="${javac.version}"
+                deprecation="${javac.deprecation}"
+                includeantruntime="false">
+            <compilerarg line="${javac.args}"/>
+            <classpath refid="test.class.path"/>
+        </javac>
+    </target>
 
-  <target name="test-with-clover" depends="clover-init, compile-test"
-          description="run unit tests and generate code coverage reports">
-    <_junit srcDir="${basedir}/src/test"/>
-    <ant target="_test-with-clover" dir="hcatalog-pig-adapter" inheritAll="false"/>
-    <ant target="_test-with-clover" dir="webhcat/svr" inheritAll="false"/>
-    <ant target="_test-with-clover" dir="webhcat/java-client" inheritAll="false"/>
-    <!-- storage-handlers do not have coverage as they have not
-         yet been migrated to the new build files. -->
-    <ant target="test" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
-  </target>
+    <target name="test" depends="compile-test" description="run unit tests">
+        <_junit srcDir="${basedir}/src/test"/>
+        <ant target="test" dir="hcatalog-pig-adapter" inheritAll="false"/>
+        <ant target="test" dir="webhcat/svr" inheritAll="false"/>
+        <ant target="test" dir="webhcat/java-client" inheritAll="false"/>
+        <ant target="test" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
+    </target>
+
+    <target name="test-with-clover" depends="clover-init, compile-test"
+            description="run unit tests and generate code coverage reports">
+        <_junit srcDir="${basedir}/src/test"/>
+        <ant target="_test-with-clover" dir="hcatalog-pig-adapter" inheritAll="false"/>
+        <ant target="_test-with-clover" dir="webhcat/svr" inheritAll="false"/>
+        <ant target="_test-with-clover" dir="webhcat/java-client" inheritAll="false"/>
+        <!-- storage-handlers do not have coverage as they have not
+             yet been migrated to the new build files. -->
+        <ant target="test" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
+    </target>
 
 
-  <!--
-  ================================================================================
-  Findbugs Section
-  ================================================================================
-  -->
+    <!--
+    ================================================================================
+    Findbugs Section
+    ================================================================================
+    -->
 
-  <target name="findbugs" depends="init-findbugs,jar">
-    <property name="findbugs.out.dir" value="${test.dir}/findbugs"/>
-    <property name="findbugs.exclude.file" value="${test.src.dir}/findbugsExcludeFile.xml"/>
-    <property name="findbugs.report.htmlfile"
-      value="${findbugs.out.dir}/hcat-findbugs-report.html"/>
-    <property name="findbugs.report.xmlfile"
-      value="${findbugs.out.dir}/hcat-findbugs-report.xml"/>
+    <target name="findbugs" depends="init-findbugs,jar">
+        <property name="findbugs.out.dir" value="${test.dir}/findbugs"/>
+        <property name="findbugs.exclude.file" value="${test.src.dir}/findbugsExcludeFile.xml"/>
+        <property name="findbugs.report.htmlfile"
+                  value="${findbugs.out.dir}/hcat-findbugs-report.html"/>
+        <property name="findbugs.report.xmlfile"
+                  value="${findbugs.out.dir}/hcat-findbugs-report.xml"/>
 
-    <_findbugs outputDir="${findbugs.out.dir}"
-               outputFile="${findbugs.report.xmlfile}"
-               excludeFilter="${findbugs.exclude.file}"
-               findbugsReportXmlFile="${findbugs.report.xmlfile}"
-               findbugsReportHtmlFile="${findbugs.report.htmlfile}"
-               sourceDir="${src.dir}"
-               jarDir="${build.dir}/${ant.project.name}"
-               classPathRef="compile.classpath"/>
+        <_findbugs outputDir="${findbugs.out.dir}"
+                   outputFile="${findbugs.report.xmlfile}"
+                   excludeFilter="${findbugs.exclude.file}"
+                   findbugsReportXmlFile="${findbugs.report.xmlfile}"
+                   findbugsReportHtmlFile="${findbugs.report.htmlfile}"
+                   sourceDir="${src.dir}"
+                   jarDir="${build.dir}/${ant.project.name}"
+                   classPathRef="compile.classpath"/>
 
-    <ant target="findbugs" dir="hcatalog-pig-adapter" inheritAll="false"/>
-    <ant target="findbugs" dir="webhcat/svr" inheritAll="false"/>
-    <ant target="findbugs" dir="webhcat/java-client" inheritAll="false"/>
-  </target>
+        <ant target="findbugs" dir="hcatalog-pig-adapter" inheritAll="false"/>
+        <ant target="findbugs" dir="webhcat/svr" inheritAll="false"/>
+        <ant target="findbugs" dir="webhcat/java-client" inheritAll="false"/>
+    </target>
 
-  <!--
-  ================================================================================
-  Clean Section
-  ================================================================================
-  -->
-  <!-- Clean up children -->
-  <target name="clean" description="Cleanup all build artifacts">
-    <echo message="${ant.project.name}"/>
-    <delete dir="${build.dir}" />
-    <delete dir="${test.warehouse.dir}"/>
-    <ant target="clean" dir="hcatalog-pig-adapter" inheritAll="false"/>
-    <ant target="clean" dir="webhcat/svr" inheritAll="false"/>
-    <ant target="clean" dir="webhcat/java-client" inheritAll="false"/>
-    <ant target="clean" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
-    <ant target="clean" dir="shims" inheritAll="false" useNativeBasedir="true"/>
-  </target>
- 
-  <!--
-  ================================================================================
-  Docs Section
-  ================================================================================
-  -->
-  <target name="docs" depends="forrest, javadoc"
-          description="Generate Javadoc and Forrest documentation">
-  </target>
+    <!--
+    ================================================================================
+    Clean Section
+    ================================================================================
+    -->
+    <!-- Clean up children -->
+    <target name="clean" description="Cleanup all build artifacts">
+        <echo message="${ant.project.name}"/>
+        <delete dir="${build.dir}"/>
+        <delete dir="${test.warehouse.dir}"/>
+        <ant target="clean" dir="hcatalog-pig-adapter" inheritAll="false"/>
+        <ant target="clean" dir="webhcat/svr" inheritAll="false"/>
+        <ant target="clean" dir="webhcat/java-client" inheritAll="false"/>
+        <ant target="clean" dir="storage-handlers" inheritAll="false" useNativeBasedir="true"/>
+        <ant target="clean" dir="shims" inheritAll="false" useNativeBasedir="true"/>
+    </target>
 
-  <target name="forrest" if="forrest.home"
-          description="Generate forrest-based documentation. To use, specify -Dforrest.home=&lt;base of Apache Forrest installation&gt; on the command line.">
-    <exec dir="${docs.src}" executable="${forrest.home}/bin/forrest"
-          failonerror="true">
-    </exec>
-    <copy todir="${build.docs}/">
-      <fileset dir="${docs.src}/build/site/" />
-    </copy>
-  </target>
+    <!--
+    ================================================================================
+    Docs Section
+    ================================================================================
+    -->
+    <target name="docs" depends="forrest, javadoc"
+            description="Generate Javadoc and Forrest documentation">
+    </target>
 
-  <target name="javadoc" depends="jar" description="Generate Javadoc documentation">
-    <mkdir dir="${build.javadoc}" />
-    <javadoc overview="${src.dir}/../docs/overview.html"
-             packagenames="org.apache.hcatalog.*"
-             destdir="${build.javadoc}"
-             author="true"
-             version="true"
-             use="true"
-             noqualifier="all"
-             windowtitle="HCatalog ${hcatalog.version} API"
-             doctitle="HCatalog ${hcatalog.version} API"
-             failonerror="true">
-      <packageset dir="${src.dir}" />
-      <packageset dir="hcatalog-pig-adapter/src/main/java" />
-      <packageset dir="webhcat/svr/src/main/java" />
-      <packageset dir="webhcat/java-client/src/main/java" />
-      <classpath>
-        <path refid="uber.classpath"/>
-      </classpath>
-      <group title="hcatalog" packages="org.apache.hcatalog.*"/>
-    </javadoc>
-  </target>
+    <target name="forrest" if="forrest.home"
+            description="Generate forrest-based documentation. To use, specify -Dforrest.home=&lt;base of Apache Forrest installation&gt; on the command line.">
+        <exec dir="${docs.src}" executable="${forrest.home}/bin/forrest"
+              failonerror="true">
+        </exec>
+        <copy todir="${build.docs}/">
+            <fileset dir="${docs.src}/build/site/"/>
+        </copy>
+    </target>
 
-  <!--
-  ===============================================================================
-  Distribution Section
-  ===============================================================================
-  -->
-  <target name="package-storage-handlers">
-    <property name="handlers.dir" value="${dist.dir}/share/hcatalog/storage-handlers"/>
-    <mkdir dir="${handlers.dir}"/>
-    <ant target="package" dir="storage-handlers" inheritAll="false" useNativeBasedir="true">     
-        <property name="dist.handlers.dir" value="${handlers.dir}"/>
-    </ant>
-    <copy todir="${dist.dir}/share/${ant.project.name}/lib" includeEmptyDirs="false" flatten="true">
-      <fileset dir="${dist.dir}/share/${ant.project.name}/storage-handlers">
-        <include name="*/lib/*"/>
-      </fileset>
-    </copy>
-  </target>
+    <target name="javadoc" depends="jar" description="Generate Javadoc documentation">
+        <mkdir dir="${build.javadoc}"/>
+        <javadoc overview="${src.dir}/../docs/overview.html"
+                 packagenames="org.apache.hcatalog.*"
+                 destdir="${build.javadoc}"
+                 author="true"
+                 version="true"
+                 use="true"
+                 noqualifier="all"
+                 windowtitle="HCatalog ${hcatalog.version} API"
+                 doctitle="HCatalog ${hcatalog.version} API"
+                 failonerror="true">
+            <packageset dir="${src.dir}"/>
+            <packageset dir="hcatalog-pig-adapter/src/main/java"/>
+            <packageset dir="webhcat/svr/src/main/java"/>
+            <packageset dir="webhcat/java-client/src/main/java"/>
+            <classpath>
+                <path refid="uber.classpath"/>
+            </classpath>
+            <group title="hcatalog" packages="org.apache.hcatalog.*"/>
+        </javadoc>
+    </target>
 
-  <target name="package" depends="jar, docs" description="Create an HCatalog release">
-    <mkdir dir="${dist.dir}" />
-    <mkdir dir="${dist.dir}/share/${ant.project.name}/lib" />
-    <mkdir dir="${dist.dir}/etc/hcatalog" />
-    <mkdir dir="${dist.dir}/bin" />
-    <mkdir dir="${dist.dir}/sbin" />
-    <mkdir dir="${dist.dir}/share/${ant.project.name}/scripts" />
-    <mkdir dir="${dist.dir}/share/${ant.project.name}/templates/conf" />
-    <mkdir dir="${dist.dir}/share/doc/${ant.project.name}" />
-    <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/api" />
-    <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/jdiff"/>
-    <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/license" />
+    <!--
+    ===============================================================================
+    Distribution Section
+    ===============================================================================
+    -->
+    <target name="package-storage-handlers">
+        <property name="handlers.dir" value="${dist.dir}/share/hcatalog/storage-handlers"/>
+        <mkdir dir="${handlers.dir}"/>
+        <ant target="package" dir="storage-handlers" inheritAll="false" useNativeBasedir="true">
+            <property name="dist.handlers.dir" value="${handlers.dir}"/>
+        </ant>
+        <copy todir="${dist.dir}/share/${ant.project.name}/lib" includeEmptyDirs="false" flatten="true">
+            <fileset dir="${dist.dir}/share/${ant.project.name}/storage-handlers">
+                <include name="*/lib/*"/>
+            </fileset>
+        </copy>
+    </target>
 
-    <copy todir="${dist.dir}/share/${ant.project.name}" includeEmptyDirs="false">
-      <fileset dir="${build.dir}/${ant.project.name}/">
-        <include name="hcatalog-*.jar"/>
-      </fileset>
-      <fileset dir="hcatalog-pig-adapter/build">
-        <include name="hcatalog-*.jar"/>
-      </fileset>
-      <fileset dir="webhcat/svr/build">
-        <include name="webhcat-*.jar"/>
-      </fileset>
-      <fileset dir="webhcat/java-client/build">
-        <include name="webhcat-java-client*.jar"/>
-      </fileset>
-    </copy>
+    <target name="package" depends="jar, docs" description="Create an HCatalog release">
+        <mkdir dir="${dist.dir}"/>
+        <mkdir dir="${dist.dir}/share/${ant.project.name}/lib"/>
+        <mkdir dir="${dist.dir}/etc/hcatalog"/>
+        <mkdir dir="${dist.dir}/bin"/>
+        <mkdir dir="${dist.dir}/sbin"/>
+        <mkdir dir="${dist.dir}/share/${ant.project.name}/scripts"/>
+        <mkdir dir="${dist.dir}/share/${ant.project.name}/templates/conf"/>
+        <mkdir dir="${dist.dir}/share/doc/${ant.project.name}"/>
+        <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/api"/>
+        <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/jdiff"/>
+        <mkdir dir="${dist.dir}/share/doc/${ant.project.name}/license"/>
 
-    <copy todir="${dist.dir}/bin">
-      <fileset dir="bin/">
-        <include name="hcat"/>
-      </fileset>
+        <copy todir="${dist.dir}/share/${ant.project.name}" includeEmptyDirs="false">
+            <fileset dir="${build.dir}/${ant.project.name}/">
+                <include name="hcatalog-*.jar"/>
+            </fileset>
+            <fileset dir="hcatalog-pig-adapter/build">
+                <include name="hcatalog-*.jar"/>
+            </fileset>
+            <fileset dir="webhcat/svr/build">
+                <include name="webhcat-*.jar"/>
+            </fileset>
+            <fileset dir="webhcat/java-client/build">
+                <include name="webhcat-java-client*.jar"/>
+            </fileset>
+        </copy>
 
-    </copy>
-    <copy todir="${dist.dir}/libexec">
-      <fileset dir="bin">
-        <include name="hcat-config.sh"/>
-      </fileset>
-    </copy>
+        <copy todir="${dist.dir}/bin">
+            <fileset dir="bin/">
+                <include name="hcat"/>
+            </fileset>
 
-    <copy todir="${dist.dir}/sbin">
-      <fileset dir="${package.dir}">
-        <include name="*.sh"/>
-      </fileset>
-    </copy>
+        </copy>
+        <copy todir="${dist.dir}/libexec">
+            <fileset dir="bin">
+                <include name="hcat-config.sh"/>
+            </fileset>
+        </copy>
 
-    <copy todir="${dist.dir}/etc/${ant.project.name}">
-      <fileset dir="conf" />
-    </copy>
+        <copy todir="${dist.dir}/sbin">
+            <fileset dir="${package.dir}">
+                <include name="*.sh"/>
+            </fileset>
+        </copy>
 
-    <copy todir="${dist.dir}/share/${ant.project.name}/scripts">
-       <fileset dir="scripts">
-         <include name="*.sh"/>
-       </fileset>
-    </copy>
+        <copy todir="${dist.dir}/etc/${ant.project.name}">
+            <fileset dir="conf"/>
+        </copy>
 
-    <copy todir="${dist.dir}/share/${ant.project.name}/templates/conf">
-      <fileset dir="src/packages/templates/conf">
-        <include name="*"/>
-      </fileset>
-    </copy>
+        <copy todir="${dist.dir}/share/${ant.project.name}/scripts">
+            <fileset dir="scripts">
+                <include name="*.sh"/>
+            </fileset>
+        </copy>
 
-    <copy todir="${dist.dir}/sbin">
-      <fileset dir="${package.dir}">
-        <include name="*.sh"/>
-      </fileset>
-      <fileset dir="webhcat/svr/src/main/bin">
-        <include name="*.sh"/>
-      </fileset>
-      <fileset dir="bin">
-        <include name="hcat_server.sh"/>
-      </fileset>
-    </copy>
+        <copy todir="${dist.dir}/share/${ant.project.name}/templates/conf">
+            <fileset dir="src/packages/templates/conf">
+                <include name="*"/>
+            </fileset>
+        </copy>
 
-	<!-- Copy the licenses and such -->
-    <copy todir="${dist.dir}/share/doc/${ant.project.name}">
-      <fileset dir=".">
-        <include name="*.txt" />
-      </fileset>
-    </copy>
+        <copy todir="${dist.dir}/sbin">
+            <fileset dir="${package.dir}">
+                <include name="*.sh"/>
+            </fileset>
+            <fileset dir="webhcat/svr/src/main/bin">
+                <include name="*.sh"/>
+            </fileset>
+            <fileset dir="bin">
+                <include name="hcat_server.sh"/>
+            </fileset>
+        </copy>
 
-    <copy todir="${dist.dir}/share/doc/${ant.project.name}/license">
-      <fileset dir="license" />
-    </copy>
+        <!-- Copy the licenses and such -->
+        <copy todir="${dist.dir}/share/doc/${ant.project.name}">
+            <fileset dir=".">
+                <include name="*.txt"/>
+            </fileset>
+        </copy>
 
-    <chmod perm="ugo+x" type="file">
-      <fileset dir="${dist.dir}/bin" />
-      <fileset dir="${dist.dir}/sbin" />
-    </chmod>
-       <!--package storage-handlers -->
-      <antcall target="package-storage-handlers"/>
+        <copy todir="${dist.dir}/share/doc/${ant.project.name}/license">
+            <fileset dir="license"/>
+        </copy>
+
+        <chmod perm="ugo+x" type="file">
+            <fileset dir="${dist.dir}/bin"/>
+            <fileset dir="${dist.dir}/sbin"/>
+        </chmod>
+        <!--package storage-handlers -->
+        <antcall target="package-storage-handlers"/>
     </target>
 
     <target name="releaseaudit" depends="ivy-retrieve" description="Release Audit activities">
-      <java classname="${rat.reporting.classname}" fork="true">
-        <classpath refid="releaseaudit.classpath"/>
-        <arg value="${basedir}/src"/>
-      </java>
+        <java classname="${rat.reporting.classname}" fork="true">
+            <classpath refid="releaseaudit.classpath"/>
+            <arg value="${basedir}/src"/>
+        </java>
     </target>
 
     <!-- ================================================================== -->
@@ -473,7 +474,8 @@
     <!-- ================================================================== -->
     <target name="src-release" depends="clean" description="Source distribution">
         <mkdir dir="${build.dir}"/>
-        <tar compression="gzip" longfile="gnu" destfile="${build.dir}/${ant.project.name}-src-${hcatalog.version}.tar.gz">
+        <tar compression="gzip" longfile="gnu"
+             destfile="${build.dir}/${ant.project.name}-src-${hcatalog.version}.tar.gz">
             <tarfileset dir="${basedir}" mode="644" prefix="${ant.project.name}-src-${hcatalog.version}">
                 <include name="conf/**"/>
                 <include name="hcatalog-pig-adapter/**"/>
@@ -493,7 +495,7 @@
                 <include name="bin/**"/>
             </tarfileset>
         </tar>
-    </target> 
+    </target>
 
     <!-- ================================================================== -->
     <!-- Make release binary packages                                       -->
@@ -501,15 +503,15 @@
     <target name="tar" depends="package" description="Create release tarball">
         <tar compression="gzip" longfile="gnu" destfile="${build.dir}/${final.name}.tar.gz">
             <tarfileset dir="${build.dir}" mode="664">
-                <include name="${final.name}/**" />
-                <exclude name="${final.name}/bin/*" />
-                <exclude name="${final.name}/sbin/*" />
-                <exclude name="${final.name}/share/hcatalog/scripts/*" />
+                <include name="${final.name}/**"/>
+                <exclude name="${final.name}/bin/*"/>
+                <exclude name="${final.name}/sbin/*"/>
+                <exclude name="${final.name}/share/hcatalog/scripts/*"/>
             </tarfileset>
             <tarfileset dir="${build.dir}" mode="755">
-                <include name="${final.name}/bin/*" />
-                <include name="${final.name}/sbin/*" />
-                <include name="${final.name}/share/hcatalog/scripts/*" />
+                <include name="${final.name}/bin/*"/>
+                <include name="${final.name}/sbin/*"/>
+                <include name="${final.name}/share/hcatalog/scripts/*"/>
             </tarfileset>
         </tar>
     </target>
@@ -530,10 +532,10 @@
         <ant dir="${test.e2e.dir}" target="deploy"/>
     </target>
 
-  <import file="ant/checkstyle.xml"/>
-  <import file="ant/dependencies.xml"/>
-  <import file="ant/deploy.xml"/>
-  <import file="ant/findbugs.xml"/>
-  <import file="ant/test.xml"/>
+    <import file="ant/checkstyle.xml"/>
+    <import file="ant/dependencies.xml"/>
+    <import file="ant/deploy.xml"/>
+    <import file="ant/findbugs.xml"/>
+    <import file="ant/test.xml"/>
 
 </project>
diff --git a/coding_style.xml b/coding_style.xml
index 2ba8723..4af26a6 100644
--- a/coding_style.xml
+++ b/coding_style.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE module PUBLIC
-  "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
-  "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
 
 <!-- Checkstyle rules required by HCatalog.
 
@@ -12,28 +12,32 @@
 
 <module name="Checker">
 
-  <!-- Checks whether files end with a new line.                        -->
-  <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
-  <module name="NewlineAtEndOfFile"/>
+    <!-- Checks whether files end with a new line.                        -->
+    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
+    <module name="NewlineAtEndOfFile"/>
 
-  <!-- Checks for Size Violations.                    -->
-  <!-- See http://checkstyle.sf.net/config_sizes.html -->
-  <module name="FileLength"/>
+    <!-- Checks for Size Violations.                    -->
+    <!-- See http://checkstyle.sf.net/config_sizes.html -->
+    <module name="FileLength"/>
 
-  <module name="Header">
-    <property name="headerFile" value="apache_header_java.txt"/>
-    <property name="fileExtensions" value="java"/>
-  </module>
+    <module name="Header">
+        <property name="headerFile" value="apache_header_java.txt"/>
+        <property name="fileExtensions" value="java"/>
+    </module>
 
-  <module name="TreeWalker">
+    <module name="TreeWalker">
 
-    <!-- Checks for imports                              -->
-    <!-- See http://checkstyle.sf.net/config_import.html -->
-    <module name="AvoidStarImport"/>
-    <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
-    <module name="RedundantImport"/>
-    <module name="UnusedImports"/>
+        <!-- Checks for imports                              -->
+        <!-- See http://checkstyle.sf.net/config_import.html -->
+        <module name="AvoidStarImport"/>
+        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
+        <module name="RedundantImport"/>
+        <module name="UnusedImports"/>
 
-  </module>
+        <module name="Indentation">
+            <property name="caseIndent" value="0"/>
+        </module>
+
+    </module>
 
 </module>
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseLoader.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseLoader.java
index 734b758..031afda 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseLoader.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseLoader.java
@@ -48,102 +48,102 @@
 
 public abstract class HCatBaseLoader extends LoadFunc implements LoadMetadata, LoadPushDown {
 
-  protected static final String PRUNE_PROJECTION_INFO = "prune.projection.info";
+    protected static final String PRUNE_PROJECTION_INFO = "prune.projection.info";
 
-  private RecordReader<?, ?> reader;
-  protected String signature;
+    private RecordReader<?, ?> reader;
+    protected String signature;
 
-  HCatSchema outputSchema = null;
+    HCatSchema outputSchema = null;
 
 
-  @Override
-  public Tuple getNext() throws IOException {
-    try {
-      HCatRecord hr =  (HCatRecord) (reader.nextKeyValue() ? reader.getCurrentValue() : null);
-      Tuple t = PigHCatUtil.transformToTuple(hr,outputSchema);
-      // TODO : we were discussing an iter interface, and also a LazyTuple
-      // change this when plans for that solidifies.
-      return t;
-    } catch (ExecException e) {
-      int errCode = 6018;
-      String errMsg = "Error while reading input";
-      throw new ExecException(errMsg, errCode,
-          PigException.REMOTE_ENVIRONMENT, e);
-    } catch (Exception eOther){
-      int errCode = 6018;
-      String errMsg = "Error converting read value to tuple";
-      throw new ExecException(errMsg, errCode,
-          PigException.REMOTE_ENVIRONMENT, eOther);
-    }
-
-  }
-
-  @Override
-  public void prepareToRead(RecordReader reader, PigSplit arg1) throws IOException {
-    this.reader = reader;
-  }
-
-  @Override
-  public ResourceStatistics getStatistics(String location, Job job) throws IOException {
-    // statistics not implemented currently
-    return null;
-  }
-
-  @Override
-  public List<OperatorSet> getFeatures() {
-    return Arrays.asList(LoadPushDown.OperatorSet.PROJECTION);
-  }
-
-  @Override
-  public RequiredFieldResponse pushProjection(RequiredFieldList requiredFieldsInfo) throws FrontendException {
-    // Store the required fields information in the UDFContext so that we
-    // can retrieve it later.
-    storeInUDFContext(signature, PRUNE_PROJECTION_INFO, requiredFieldsInfo);
-
-    // HCat will always prune columns based on what we ask of it - so the
-    // response is true
-    return new RequiredFieldResponse(true);
-  }
-
-  @Override
-  public void setUDFContextSignature(String signature) {
-    this.signature = signature;
-  }
-
-
-  // helper methods
-  protected void storeInUDFContext(String signature, String key, Object value) {
-    UDFContext udfContext = UDFContext.getUDFContext();
-    Properties props = udfContext.getUDFProperties(
-        this.getClass(), new String[] {signature});
-    props.put(key, value);
-  }
-
-  /**
-   * A utility method to get the size of inputs. This is accomplished by summing the
-   * size of all input paths on supported FileSystems. Locations whose size cannot be
-   * determined are ignored. Note non-FileSystem and unpartitioned locations will not
-   * report their input size by default.
-   */
-  protected static long getSizeInBytes(InputJobInfo inputJobInfo) throws IOException {
-    Configuration conf = new Configuration();
-    long sizeInBytes = 0;
-
-    for (PartInfo partInfo : inputJobInfo.getPartitions()) {
-      try {
-        Path p = new Path(partInfo.getLocation());
-        if (p.getFileSystem(conf).isFile(p)) {
-          sizeInBytes += p.getFileSystem(conf).getFileStatus(p).getLen();
-        } else {
-          for (FileStatus child : p.getFileSystem(conf).listStatus(p)) {
-            sizeInBytes += child.getLen();
-          }
+    @Override
+    public Tuple getNext() throws IOException {
+        try {
+            HCatRecord hr = (HCatRecord) (reader.nextKeyValue() ? reader.getCurrentValue() : null);
+            Tuple t = PigHCatUtil.transformToTuple(hr, outputSchema);
+            // TODO : we were discussing an iter interface, and also a LazyTuple
+            // change this when plans for that solidifies.
+            return t;
+        } catch (ExecException e) {
+            int errCode = 6018;
+            String errMsg = "Error while reading input";
+            throw new ExecException(errMsg, errCode,
+                PigException.REMOTE_ENVIRONMENT, e);
+        } catch (Exception eOther) {
+            int errCode = 6018;
+            String errMsg = "Error converting read value to tuple";
+            throw new ExecException(errMsg, errCode,
+                PigException.REMOTE_ENVIRONMENT, eOther);
         }
-      } catch (IOException e) {
-        // Report size to the extent possible.
-      }
+
     }
 
-    return sizeInBytes;
-  }
+    @Override
+    public void prepareToRead(RecordReader reader, PigSplit arg1) throws IOException {
+        this.reader = reader;
+    }
+
+    @Override
+    public ResourceStatistics getStatistics(String location, Job job) throws IOException {
+        // statistics not implemented currently
+        return null;
+    }
+
+    @Override
+    public List<OperatorSet> getFeatures() {
+        return Arrays.asList(LoadPushDown.OperatorSet.PROJECTION);
+    }
+
+    @Override
+    public RequiredFieldResponse pushProjection(RequiredFieldList requiredFieldsInfo) throws FrontendException {
+        // Store the required fields information in the UDFContext so that we
+        // can retrieve it later.
+        storeInUDFContext(signature, PRUNE_PROJECTION_INFO, requiredFieldsInfo);
+
+        // HCat will always prune columns based on what we ask of it - so the
+        // response is true
+        return new RequiredFieldResponse(true);
+    }
+
+    @Override
+    public void setUDFContextSignature(String signature) {
+        this.signature = signature;
+    }
+
+
+    // helper methods
+    protected void storeInUDFContext(String signature, String key, Object value) {
+        UDFContext udfContext = UDFContext.getUDFContext();
+        Properties props = udfContext.getUDFProperties(
+            this.getClass(), new String[]{signature});
+        props.put(key, value);
+    }
+
+    /**
+     * A utility method to get the size of inputs. This is accomplished by summing the
+     * size of all input paths on supported FileSystems. Locations whose size cannot be
+     * determined are ignored. Note non-FileSystem and unpartitioned locations will not
+     * report their input size by default.
+     */
+    protected static long getSizeInBytes(InputJobInfo inputJobInfo) throws IOException {
+        Configuration conf = new Configuration();
+        long sizeInBytes = 0;
+
+        for (PartInfo partInfo : inputJobInfo.getPartitions()) {
+            try {
+                Path p = new Path(partInfo.getLocation());
+                if (p.getFileSystem(conf).isFile(p)) {
+                    sizeInBytes += p.getFileSystem(conf).getFileStatus(p).getLen();
+                } else {
+                    for (FileStatus child : p.getFileSystem(conf).listStatus(p)) {
+                        sizeInBytes += child.getLen();
+                    }
+                }
+            } catch (IOException e) {
+                // Report size to the extent possible.
+            }
+        }
+
+        return sizeInBytes;
+    }
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseStorer.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseStorer.java
index 458c755..b3ba293 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseStorer.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatBaseStorer.java
@@ -60,382 +60,382 @@
 
 public abstract class HCatBaseStorer extends StoreFunc implements StoreMetadata {
 
-  private static final List<Type> SUPPORTED_INTEGER_CONVERSIONS =
-      Lists.newArrayList(Type.TINYINT, Type.SMALLINT, Type.INT);
-  protected static final String COMPUTED_OUTPUT_SCHEMA = "hcat.output.schema";
-  protected final List<String> partitionKeys;
-  protected final Map<String,String> partitions;
-  protected Schema pigSchema;
-  private RecordWriter<WritableComparable<?>, HCatRecord> writer;
-  protected HCatSchema computedSchema;
-  protected static final String PIG_SCHEMA = "hcat.pig.store.schema";
-  protected String sign;
+    private static final List<Type> SUPPORTED_INTEGER_CONVERSIONS =
+        Lists.newArrayList(Type.TINYINT, Type.SMALLINT, Type.INT);
+    protected static final String COMPUTED_OUTPUT_SCHEMA = "hcat.output.schema";
+    protected final List<String> partitionKeys;
+    protected final Map<String, String> partitions;
+    protected Schema pigSchema;
+    private RecordWriter<WritableComparable<?>, HCatRecord> writer;
+    protected HCatSchema computedSchema;
+    protected static final String PIG_SCHEMA = "hcat.pig.store.schema";
+    protected String sign;
 
-  public HCatBaseStorer(String partSpecs, String schema) throws Exception {
+    public HCatBaseStorer(String partSpecs, String schema) throws Exception {
 
-    partitionKeys = new ArrayList<String>();
-    partitions = new HashMap<String, String>();
-    if(partSpecs != null && !partSpecs.trim().isEmpty()){
-      String[] partKVPs = partSpecs.split(",");
-      for(String partKVP : partKVPs){
-        String[] partKV = partKVP.split("=");
-        if(partKV.length == 2) {
-          String partKey = partKV[0].trim();
-          partitionKeys.add(partKey);
-          partitions.put(partKey, partKV[1].trim());
+        partitionKeys = new ArrayList<String>();
+        partitions = new HashMap<String, String>();
+        if (partSpecs != null && !partSpecs.trim().isEmpty()) {
+            String[] partKVPs = partSpecs.split(",");
+            for (String partKVP : partKVPs) {
+                String[] partKV = partKVP.split("=");
+                if (partKV.length == 2) {
+                    String partKey = partKV[0].trim();
+                    partitionKeys.add(partKey);
+                    partitions.put(partKey, partKV[1].trim());
+                } else {
+                    throw new FrontendException("Invalid partition column specification. " + partSpecs, PigHCatUtil.PIG_EXCEPTION_CODE);
+                }
+            }
+        }
+
+        if (schema != null) {
+            pigSchema = Utils.getSchemaFromString(schema);
+        }
+
+    }
+
+    @Override
+    public void checkSchema(ResourceSchema resourceSchema) throws IOException {
+
+        /*  Schema provided by user and the schema computed by Pig
+        * at the time of calling store must match.
+        */
+        Schema runtimeSchema = Schema.getPigSchema(resourceSchema);
+        if (pigSchema != null) {
+            if (!Schema.equals(runtimeSchema, pigSchema, false, true)) {
+                throw new FrontendException("Schema provided in store statement doesn't match with the Schema" +
+                    "returned by Pig run-time. Schema provided in HCatStorer: " + pigSchema.toString() + " Schema received from Pig runtime: " + runtimeSchema.toString(), PigHCatUtil.PIG_EXCEPTION_CODE);
+            }
         } else {
-          throw new FrontendException("Invalid partition column specification. "+partSpecs, PigHCatUtil.PIG_EXCEPTION_CODE);
+            pigSchema = runtimeSchema;
         }
-      }
+        UDFContext.getUDFContext().getUDFProperties(this.getClass(), new String[]{sign}).setProperty(PIG_SCHEMA, ObjectSerializer.serialize(pigSchema));
     }
 
-    if(schema != null) {
-      pigSchema = Utils.getSchemaFromString(schema);
-    }
-
-  }
-
-  @Override
-  public void checkSchema(ResourceSchema resourceSchema) throws IOException {
-
-    /*  Schema provided by user and the schema computed by Pig
-     * at the time of calling store must match.
+    /** Constructs HCatSchema from pigSchema. Passed tableSchema is the existing
+     * schema of the table in metastore.
      */
-    Schema runtimeSchema = Schema.getPigSchema(resourceSchema);
-    if(pigSchema != null){
-      if(! Schema.equals(runtimeSchema, pigSchema, false, true) ){
-        throw new FrontendException("Schema provided in store statement doesn't match with the Schema" +
-            "returned by Pig run-time. Schema provided in HCatStorer: "+pigSchema.toString()+ " Schema received from Pig runtime: "+runtimeSchema.toString(), PigHCatUtil.PIG_EXCEPTION_CODE);
-      }
-    } else {
-      pigSchema = runtimeSchema;
-    }
-    UDFContext.getUDFContext().getUDFProperties(this.getClass(), new String[]{sign}).setProperty(PIG_SCHEMA,ObjectSerializer.serialize(pigSchema));
-  }
+    protected HCatSchema convertPigSchemaToHCatSchema(Schema pigSchema, HCatSchema tableSchema) throws FrontendException {
+        List<HCatFieldSchema> fieldSchemas = new ArrayList<HCatFieldSchema>(pigSchema.size());
+        for (FieldSchema fSchema : pigSchema.getFields()) {
+            try {
+                HCatFieldSchema hcatFieldSchema = getColFromSchema(fSchema.alias, tableSchema);
 
-  /** Constructs HCatSchema from pigSchema. Passed tableSchema is the existing
-   * schema of the table in metastore.
-   */
-  protected HCatSchema convertPigSchemaToHCatSchema(Schema pigSchema, HCatSchema tableSchema) throws FrontendException{
-    List<HCatFieldSchema> fieldSchemas = new ArrayList<HCatFieldSchema>(pigSchema.size());
-    for(FieldSchema fSchema : pigSchema.getFields()){
-      try {
-        HCatFieldSchema hcatFieldSchema = getColFromSchema(fSchema.alias, tableSchema);
-
-        fieldSchemas.add(getHCatFSFromPigFS(fSchema, hcatFieldSchema));
-      } catch (HCatException he){
-          throw new FrontendException(he.getMessage(),PigHCatUtil.PIG_EXCEPTION_CODE,he);
-      }
-    }
-    return new HCatSchema(fieldSchemas);
-  }
-
-  public static boolean removeTupleFromBag(HCatFieldSchema hcatFieldSchema, FieldSchema bagFieldSchema) throws HCatException{
-    if (hcatFieldSchema != null && hcatFieldSchema.getArrayElementSchema().get(0).getType() != Type.STRUCT) {
-      return true;
-    }
-    // Column was not found in table schema. Its a new column
-    List<FieldSchema> tupSchema = bagFieldSchema.schema.getFields();
-    if (hcatFieldSchema == null && tupSchema.size() == 1 && (tupSchema.get(0).schema == null || (tupSchema.get(0).type == DataType.TUPLE && tupSchema.get(0).schema.size() == 1))) {
-      return true;
-    }
-    return false;
-  }
-
-
-  private HCatFieldSchema getHCatFSFromPigFS(FieldSchema fSchema, HCatFieldSchema hcatFieldSchema) throws FrontendException, HCatException{
-    byte type = fSchema.type;
-    switch(type){
-
-    case DataType.CHARARRAY:
-    case DataType.BIGCHARARRAY:
-      return new HCatFieldSchema(fSchema.alias, Type.STRING, null);
-
-    case DataType.INTEGER:
-      if (hcatFieldSchema != null) {
-        if (!SUPPORTED_INTEGER_CONVERSIONS.contains(hcatFieldSchema.getType())) {
-          throw new FrontendException("Unsupported type: " + type + "  in Pig's schema",
-            PigHCatUtil.PIG_EXCEPTION_CODE);
+                fieldSchemas.add(getHCatFSFromPigFS(fSchema, hcatFieldSchema));
+            } catch (HCatException he) {
+                throw new FrontendException(he.getMessage(), PigHCatUtil.PIG_EXCEPTION_CODE, he);
+            }
         }
-        return new HCatFieldSchema(fSchema.alias, hcatFieldSchema.getType(), null);
-      } else {
-        return new HCatFieldSchema(fSchema.alias, Type.INT, null);
-      }
-
-    case DataType.LONG:
-      return new HCatFieldSchema(fSchema.alias, Type.BIGINT, null);
-
-    case DataType.FLOAT:
-      return new HCatFieldSchema(fSchema.alias, Type.FLOAT, null);
-
-    case DataType.DOUBLE:
-      return new HCatFieldSchema(fSchema.alias, Type.DOUBLE, null);
-
-    case DataType.BYTEARRAY:
-      return new HCatFieldSchema(fSchema.alias, Type.BINARY, null);
-
-    case DataType.BAG:
-      Schema bagSchema = fSchema.schema;
-      List<HCatFieldSchema> arrFields = new ArrayList<HCatFieldSchema>(1);
-      FieldSchema field;
-      // Find out if we need to throw away the tuple or not.
-      if (removeTupleFromBag(hcatFieldSchema, fSchema)) {
-        field = bagSchema.getField(0).schema.getField(0);
-      } else {
-        field = bagSchema.getField(0);
-      }
-      arrFields.add(getHCatFSFromPigFS(field, hcatFieldSchema == null ? null : hcatFieldSchema.getArrayElementSchema().get(0)));
-      return new HCatFieldSchema(fSchema.alias, Type.ARRAY, new HCatSchema(arrFields), "");
-
-    case DataType.TUPLE:
-      List<String> fieldNames = new ArrayList<String>();
-      List<HCatFieldSchema> hcatFSs = new ArrayList<HCatFieldSchema>();
-      HCatSchema structSubSchema = hcatFieldSchema == null ? null : hcatFieldSchema.getStructSubSchema();
-      List<FieldSchema> fields = fSchema.schema.getFields();
-      for (int i = 0; i < fields.size(); i++) {
-        FieldSchema fieldSchema = fields.get(i);
-        fieldNames.add(fieldSchema.alias);
-        hcatFSs.add(getHCatFSFromPigFS(fieldSchema, structSubSchema == null ? null : structSubSchema.get(i)));
-      }
-      return new HCatFieldSchema(fSchema.alias, Type.STRUCT, new HCatSchema(hcatFSs), "");
-
-    case DataType.MAP:{
-      // Pig's schema contain no type information about map's keys and
-      // values. So, if its a new column assume <string,string> if its existing
-      // return whatever is contained in the existing column.
-
-      HCatFieldSchema valFS;
-      List<HCatFieldSchema> valFSList = new ArrayList<HCatFieldSchema>(1);
-
-      if(hcatFieldSchema != null){
-        return new HCatFieldSchema(fSchema.alias, Type.MAP, Type.STRING, hcatFieldSchema.getMapValueSchema(), "");
-      }
-
-      // Column not found in target table. Its a new column. Its schema is map<string,string>
-      valFS = new HCatFieldSchema(fSchema.alias, Type.STRING, "");
-      valFSList.add(valFS);
-      return new HCatFieldSchema(fSchema.alias,Type.MAP,Type.STRING, new HCatSchema(valFSList),"");
-     }
-
-    default:
-      throw new FrontendException("Unsupported type: "+type+"  in Pig's schema", PigHCatUtil.PIG_EXCEPTION_CODE);
-    }
-  }
-
-  @Override
-  public void prepareToWrite(RecordWriter writer) throws IOException {
-    this.writer = writer;
-    computedSchema = (HCatSchema)ObjectSerializer.deserialize(UDFContext.getUDFContext().getUDFProperties(this.getClass(), new String[]{sign}).getProperty(COMPUTED_OUTPUT_SCHEMA));
-  }
-
-  @Override
-  public void putNext(Tuple tuple) throws IOException {
-
-    List<Object> outgoing = new ArrayList<Object>(tuple.size());
-
-    int i = 0;
-    for(HCatFieldSchema fSchema : computedSchema.getFields()){
-      outgoing.add(getJavaObj(tuple.get(i++), fSchema));
-    }
-    try {
-      writer.write(null, new DefaultHCatRecord(outgoing));
-    } catch (InterruptedException e) {
-      throw new BackendException("Error while writing tuple: "+tuple, PigHCatUtil.PIG_EXCEPTION_CODE, e);
-    }
-  }
-
-  private Object getJavaObj(Object pigObj, HCatFieldSchema hcatFS) throws HCatException, BackendException{
-    try {
-
-      // The real work-horse. Spend time and energy in this method if there is
-      // need to keep HCatStorer lean and go fast.
-      Type type = hcatFS.getType();
-      switch(type){
-
-      case BINARY:
-        if (pigObj == null) {
-          return null;
-        }          
-        return ((DataByteArray)pigObj).get();
-
-      case STRUCT:
-        if (pigObj == null) {
-          return null;
-        }
-        HCatSchema structSubSchema = hcatFS.getStructSubSchema();
-        // Unwrap the tuple.
-        List<Object> all = ((Tuple)pigObj).getAll();
-        ArrayList<Object> converted = new ArrayList<Object>(all.size());
-        for (int i = 0; i < all.size(); i++) {
-          converted.add(getJavaObj(all.get(i), structSubSchema.get(i)));
-        }
-        return converted;
-
-      case ARRAY:
-        if (pigObj == null) {
-          return null;
-        }
-        // Unwrap the bag.
-        DataBag pigBag = (DataBag)pigObj;
-        HCatFieldSchema tupFS = hcatFS.getArrayElementSchema().get(0);
-        boolean needTuple = tupFS.getType() == Type.STRUCT;
-        List<Object> bagContents = new ArrayList<Object>((int)pigBag.size());
-        Iterator<Tuple> bagItr = pigBag.iterator();
-
-        while(bagItr.hasNext()){
-          // If there is only one element in tuple contained in bag, we throw away the tuple.
-          bagContents.add(getJavaObj(needTuple ? bagItr.next() : bagItr.next().get(0), tupFS));
-
-        }
-        return bagContents;
-      case MAP:
-        if (pigObj == null) {
-          return null;
-        }
-        Map<?,?> pigMap = (Map<?,?>)pigObj;
-        Map<Object,Object> typeMap = new HashMap<Object, Object>();
-        for(Entry<?, ?> entry: pigMap.entrySet()){
-          // the value has a schema and not a FieldSchema
-          typeMap.put(
-              // Schema validation enforces that the Key is a String
-              (String)entry.getKey(),
-              getJavaObj(entry.getValue(), hcatFS.getMapValueSchema().get(0)));
-        }
-        return typeMap;
-      case STRING:
-      case INT:
-      case BIGINT:
-      case FLOAT:
-      case DOUBLE:
-        return pigObj;
-      case SMALLINT:
-        if (pigObj == null) {
-          return null;
-        }
-        if ((Integer) pigObj < Short.MIN_VALUE || (Integer) pigObj > Short.MAX_VALUE) {
-          throw new BackendException("Value " + pigObj + " is outside the bounds of column " +
-              hcatFS.getName() + " with type " + hcatFS.getType(), PigHCatUtil.PIG_EXCEPTION_CODE);
-        }
-        return ((Integer) pigObj).shortValue();
-      case TINYINT:
-        if (pigObj == null) {
-          return null;
-        }
-        if ((Integer) pigObj < Byte.MIN_VALUE || (Integer) pigObj > Byte.MAX_VALUE) {
-          throw new BackendException("Value " + pigObj + " is outside the bounds of column " +
-              hcatFS.getName() + " with type " + hcatFS.getType(), PigHCatUtil.PIG_EXCEPTION_CODE);
-        }
-        return ((Integer) pigObj).byteValue();
-      case BOOLEAN:
-        // would not pass schema validation anyway
-        throw new BackendException("Incompatible type "+type+" found in hcat table schema: "+hcatFS, PigHCatUtil.PIG_EXCEPTION_CODE);
-      default:
-        throw new BackendException("Unexpected type "+type+" for value "+pigObj + (pigObj == null ? "" : " of class " + pigObj.getClass().getName()), PigHCatUtil.PIG_EXCEPTION_CODE);
-      }
-    } catch (BackendException e) {
-      // provide the path to the field in the error message
-      throw new BackendException(
-          (hcatFS.getName() == null ? " " : hcatFS.getName()+".") + e.getMessage(),
-          e.getCause() == null ? e : e.getCause());
-    }
-  }
-
-  @Override
-  public String relToAbsPathForStoreLocation(String location, Path curDir) throws IOException {
-
-    // Need to necessarily override this method since default impl assumes HDFS
-    // based location string.
-    return location;
-  }
-
-  @Override
-  public void setStoreFuncUDFContextSignature(String signature) {
-    sign = signature;
-  }
-
-
-  protected void doSchemaValidations(Schema pigSchema, HCatSchema tblSchema) throws FrontendException, HCatException{
-
-    // Iterate through all the elements in Pig Schema and do validations as
-    // dictated by semantics, consult HCatSchema of table when need be.
-
-    for(FieldSchema pigField : pigSchema.getFields()){
-      HCatFieldSchema hcatField = getColFromSchema(pigField.alias, tblSchema);
-      validateSchema(pigField, hcatField);
+        return new HCatSchema(fieldSchemas);
     }
 
-    try {
-      PigHCatUtil.validateHCatTableSchemaFollowsPigRules(tblSchema);
-    } catch (IOException e) {
-      throw new FrontendException("HCatalog schema is not compatible with Pig: "+e.getMessage(),  PigHCatUtil.PIG_EXCEPTION_CODE, e);
-    }
-  }
-
-
-  private void validateSchema(FieldSchema pigField, HCatFieldSchema hcatField)
-      throws HCatException, FrontendException {
-    validateAlias(pigField.alias);
-    byte type = pigField.type;
-    if(DataType.isComplex(type)){
-      switch(type){
-
-      case DataType.MAP:
-        if(hcatField != null){
-          if(hcatField.getMapKeyType() != Type.STRING){
-            throw new FrontendException("Key Type of map must be String "+hcatField,  PigHCatUtil.PIG_EXCEPTION_CODE);
-          }
-          // Map values can be primitive or complex
+    public static boolean removeTupleFromBag(HCatFieldSchema hcatFieldSchema, FieldSchema bagFieldSchema) throws HCatException {
+        if (hcatFieldSchema != null && hcatFieldSchema.getArrayElementSchema().get(0).getType() != Type.STRUCT) {
+            return true;
         }
-        break;
-
-      case DataType.BAG:
-        HCatSchema arrayElementSchema = hcatField == null ? null : hcatField.getArrayElementSchema();
-        for(FieldSchema innerField : pigField.schema.getField(0).schema.getFields()){
-          validateSchema(innerField, getColFromSchema(pigField.alias, arrayElementSchema));
+        // Column was not found in table schema. Its a new column
+        List<FieldSchema> tupSchema = bagFieldSchema.schema.getFields();
+        if (hcatFieldSchema == null && tupSchema.size() == 1 && (tupSchema.get(0).schema == null || (tupSchema.get(0).type == DataType.TUPLE && tupSchema.get(0).schema.size() == 1))) {
+            return true;
         }
-        break;
+        return false;
+    }
 
-      case DataType.TUPLE:
-        HCatSchema structSubSchema = hcatField == null ? null : hcatField.getStructSubSchema();
-        for(FieldSchema innerField : pigField.schema.getFields()){
-          validateSchema(innerField, getColFromSchema(pigField.alias, structSubSchema));
+
+    private HCatFieldSchema getHCatFSFromPigFS(FieldSchema fSchema, HCatFieldSchema hcatFieldSchema) throws FrontendException, HCatException {
+        byte type = fSchema.type;
+        switch (type) {
+
+        case DataType.CHARARRAY:
+        case DataType.BIGCHARARRAY:
+            return new HCatFieldSchema(fSchema.alias, Type.STRING, null);
+
+        case DataType.INTEGER:
+            if (hcatFieldSchema != null) {
+                if (!SUPPORTED_INTEGER_CONVERSIONS.contains(hcatFieldSchema.getType())) {
+                    throw new FrontendException("Unsupported type: " + type + "  in Pig's schema",
+                        PigHCatUtil.PIG_EXCEPTION_CODE);
+                }
+                return new HCatFieldSchema(fSchema.alias, hcatFieldSchema.getType(), null);
+            } else {
+                return new HCatFieldSchema(fSchema.alias, Type.INT, null);
+            }
+
+        case DataType.LONG:
+            return new HCatFieldSchema(fSchema.alias, Type.BIGINT, null);
+
+        case DataType.FLOAT:
+            return new HCatFieldSchema(fSchema.alias, Type.FLOAT, null);
+
+        case DataType.DOUBLE:
+            return new HCatFieldSchema(fSchema.alias, Type.DOUBLE, null);
+
+        case DataType.BYTEARRAY:
+            return new HCatFieldSchema(fSchema.alias, Type.BINARY, null);
+
+        case DataType.BAG:
+            Schema bagSchema = fSchema.schema;
+            List<HCatFieldSchema> arrFields = new ArrayList<HCatFieldSchema>(1);
+            FieldSchema field;
+            // Find out if we need to throw away the tuple or not.
+            if (removeTupleFromBag(hcatFieldSchema, fSchema)) {
+                field = bagSchema.getField(0).schema.getField(0);
+            } else {
+                field = bagSchema.getField(0);
+            }
+            arrFields.add(getHCatFSFromPigFS(field, hcatFieldSchema == null ? null : hcatFieldSchema.getArrayElementSchema().get(0)));
+            return new HCatFieldSchema(fSchema.alias, Type.ARRAY, new HCatSchema(arrFields), "");
+
+        case DataType.TUPLE:
+            List<String> fieldNames = new ArrayList<String>();
+            List<HCatFieldSchema> hcatFSs = new ArrayList<HCatFieldSchema>();
+            HCatSchema structSubSchema = hcatFieldSchema == null ? null : hcatFieldSchema.getStructSubSchema();
+            List<FieldSchema> fields = fSchema.schema.getFields();
+            for (int i = 0; i < fields.size(); i++) {
+                FieldSchema fieldSchema = fields.get(i);
+                fieldNames.add(fieldSchema.alias);
+                hcatFSs.add(getHCatFSFromPigFS(fieldSchema, structSubSchema == null ? null : structSubSchema.get(i)));
+            }
+            return new HCatFieldSchema(fSchema.alias, Type.STRUCT, new HCatSchema(hcatFSs), "");
+
+        case DataType.MAP: {
+            // Pig's schema contain no type information about map's keys and
+            // values. So, if its a new column assume <string,string> if its existing
+            // return whatever is contained in the existing column.
+
+            HCatFieldSchema valFS;
+            List<HCatFieldSchema> valFSList = new ArrayList<HCatFieldSchema>(1);
+
+            if (hcatFieldSchema != null) {
+                return new HCatFieldSchema(fSchema.alias, Type.MAP, Type.STRING, hcatFieldSchema.getMapValueSchema(), "");
+            }
+
+            // Column not found in target table. Its a new column. Its schema is map<string,string>
+            valFS = new HCatFieldSchema(fSchema.alias, Type.STRING, "");
+            valFSList.add(valFS);
+            return new HCatFieldSchema(fSchema.alias, Type.MAP, Type.STRING, new HCatSchema(valFSList), "");
         }
-        break;
 
-      default:
-        throw new FrontendException("Internal Error.", PigHCatUtil.PIG_EXCEPTION_CODE);
-      }
-    }
-  }
-
-  private void validateAlias(String alias) throws FrontendException{
-    if(alias == null) {
-      throw new FrontendException("Column name for a field is not specified. Please provide the full schema as an argument to HCatStorer.", PigHCatUtil.PIG_EXCEPTION_CODE);
-    }
-    if(alias.matches(".*[A-Z]+.*")) {
-      throw new FrontendException("Column names should all be in lowercase. Invalid name found: "+alias, PigHCatUtil.PIG_EXCEPTION_CODE);
-    }
-  }
-
-  // Finds column by name in HCatSchema, if not found returns null.
-  private HCatFieldSchema getColFromSchema(String alias, HCatSchema tblSchema){
-    if (tblSchema != null) {
-      for(HCatFieldSchema hcatField : tblSchema.getFields()){
-        if(hcatField!=null && hcatField.getName()!= null && hcatField.getName().equalsIgnoreCase(alias)){
-          return hcatField;
+        default:
+            throw new FrontendException("Unsupported type: " + type + "  in Pig's schema", PigHCatUtil.PIG_EXCEPTION_CODE);
         }
-      }
     }
-    // Its a new column
-    return null;
-  }
 
-  @Override
-  public void cleanupOnFailure(String location, Job job) throws IOException {
-    // No-op.
-  }
+    @Override
+    public void prepareToWrite(RecordWriter writer) throws IOException {
+        this.writer = writer;
+        computedSchema = (HCatSchema) ObjectSerializer.deserialize(UDFContext.getUDFContext().getUDFProperties(this.getClass(), new String[]{sign}).getProperty(COMPUTED_OUTPUT_SCHEMA));
+    }
 
-  @Override
-  public void storeStatistics(ResourceStatistics stats, String arg1, Job job) throws IOException {
-  }
+    @Override
+    public void putNext(Tuple tuple) throws IOException {
+
+        List<Object> outgoing = new ArrayList<Object>(tuple.size());
+
+        int i = 0;
+        for (HCatFieldSchema fSchema : computedSchema.getFields()) {
+            outgoing.add(getJavaObj(tuple.get(i++), fSchema));
+        }
+        try {
+            writer.write(null, new DefaultHCatRecord(outgoing));
+        } catch (InterruptedException e) {
+            throw new BackendException("Error while writing tuple: " + tuple, PigHCatUtil.PIG_EXCEPTION_CODE, e);
+        }
+    }
+
+    private Object getJavaObj(Object pigObj, HCatFieldSchema hcatFS) throws HCatException, BackendException {
+        try {
+
+            // The real work-horse. Spend time and energy in this method if there is
+            // need to keep HCatStorer lean and go fast.
+            Type type = hcatFS.getType();
+            switch (type) {
+
+            case BINARY:
+                if (pigObj == null) {
+                    return null;
+                }
+                return ((DataByteArray) pigObj).get();
+
+            case STRUCT:
+                if (pigObj == null) {
+                    return null;
+                }
+                HCatSchema structSubSchema = hcatFS.getStructSubSchema();
+                // Unwrap the tuple.
+                List<Object> all = ((Tuple) pigObj).getAll();
+                ArrayList<Object> converted = new ArrayList<Object>(all.size());
+                for (int i = 0; i < all.size(); i++) {
+                    converted.add(getJavaObj(all.get(i), structSubSchema.get(i)));
+                }
+                return converted;
+
+            case ARRAY:
+                if (pigObj == null) {
+                    return null;
+                }
+                // Unwrap the bag.
+                DataBag pigBag = (DataBag) pigObj;
+                HCatFieldSchema tupFS = hcatFS.getArrayElementSchema().get(0);
+                boolean needTuple = tupFS.getType() == Type.STRUCT;
+                List<Object> bagContents = new ArrayList<Object>((int) pigBag.size());
+                Iterator<Tuple> bagItr = pigBag.iterator();
+
+                while (bagItr.hasNext()) {
+                    // If there is only one element in tuple contained in bag, we throw away the tuple.
+                    bagContents.add(getJavaObj(needTuple ? bagItr.next() : bagItr.next().get(0), tupFS));
+
+                }
+                return bagContents;
+            case MAP:
+                if (pigObj == null) {
+                    return null;
+                }
+                Map<?, ?> pigMap = (Map<?, ?>) pigObj;
+                Map<Object, Object> typeMap = new HashMap<Object, Object>();
+                for (Entry<?, ?> entry : pigMap.entrySet()) {
+                    // the value has a schema and not a FieldSchema
+                    typeMap.put(
+                        // Schema validation enforces that the Key is a String
+                        (String) entry.getKey(),
+                        getJavaObj(entry.getValue(), hcatFS.getMapValueSchema().get(0)));
+                }
+                return typeMap;
+            case STRING:
+            case INT:
+            case BIGINT:
+            case FLOAT:
+            case DOUBLE:
+                return pigObj;
+            case SMALLINT:
+                if (pigObj == null) {
+                    return null;
+                }
+                if ((Integer) pigObj < Short.MIN_VALUE || (Integer) pigObj > Short.MAX_VALUE) {
+                    throw new BackendException("Value " + pigObj + " is outside the bounds of column " +
+                        hcatFS.getName() + " with type " + hcatFS.getType(), PigHCatUtil.PIG_EXCEPTION_CODE);
+                }
+                return ((Integer) pigObj).shortValue();
+            case TINYINT:
+                if (pigObj == null) {
+                    return null;
+                }
+                if ((Integer) pigObj < Byte.MIN_VALUE || (Integer) pigObj > Byte.MAX_VALUE) {
+                    throw new BackendException("Value " + pigObj + " is outside the bounds of column " +
+                        hcatFS.getName() + " with type " + hcatFS.getType(), PigHCatUtil.PIG_EXCEPTION_CODE);
+                }
+                return ((Integer) pigObj).byteValue();
+            case BOOLEAN:
+                // would not pass schema validation anyway
+                throw new BackendException("Incompatible type " + type + " found in hcat table schema: " + hcatFS, PigHCatUtil.PIG_EXCEPTION_CODE);
+            default:
+                throw new BackendException("Unexpected type " + type + " for value " + pigObj + (pigObj == null ? "" : " of class " + pigObj.getClass().getName()), PigHCatUtil.PIG_EXCEPTION_CODE);
+            }
+        } catch (BackendException e) {
+            // provide the path to the field in the error message
+            throw new BackendException(
+                (hcatFS.getName() == null ? " " : hcatFS.getName() + ".") + e.getMessage(),
+                e.getCause() == null ? e : e.getCause());
+        }
+    }
+
+    @Override
+    public String relToAbsPathForStoreLocation(String location, Path curDir) throws IOException {
+
+        // Need to necessarily override this method since default impl assumes HDFS
+        // based location string.
+        return location;
+    }
+
+    @Override
+    public void setStoreFuncUDFContextSignature(String signature) {
+        sign = signature;
+    }
+
+
+    protected void doSchemaValidations(Schema pigSchema, HCatSchema tblSchema) throws FrontendException, HCatException {
+
+        // Iterate through all the elements in Pig Schema and do validations as
+        // dictated by semantics, consult HCatSchema of table when need be.
+
+        for (FieldSchema pigField : pigSchema.getFields()) {
+            HCatFieldSchema hcatField = getColFromSchema(pigField.alias, tblSchema);
+            validateSchema(pigField, hcatField);
+        }
+
+        try {
+            PigHCatUtil.validateHCatTableSchemaFollowsPigRules(tblSchema);
+        } catch (IOException e) {
+            throw new FrontendException("HCatalog schema is not compatible with Pig: " + e.getMessage(), PigHCatUtil.PIG_EXCEPTION_CODE, e);
+        }
+    }
+
+
+    private void validateSchema(FieldSchema pigField, HCatFieldSchema hcatField)
+        throws HCatException, FrontendException {
+        validateAlias(pigField.alias);
+        byte type = pigField.type;
+        if (DataType.isComplex(type)) {
+            switch (type) {
+
+            case DataType.MAP:
+                if (hcatField != null) {
+                    if (hcatField.getMapKeyType() != Type.STRING) {
+                        throw new FrontendException("Key Type of map must be String " + hcatField, PigHCatUtil.PIG_EXCEPTION_CODE);
+                    }
+                    // Map values can be primitive or complex
+                }
+                break;
+
+            case DataType.BAG:
+                HCatSchema arrayElementSchema = hcatField == null ? null : hcatField.getArrayElementSchema();
+                for (FieldSchema innerField : pigField.schema.getField(0).schema.getFields()) {
+                    validateSchema(innerField, getColFromSchema(pigField.alias, arrayElementSchema));
+                }
+                break;
+
+            case DataType.TUPLE:
+                HCatSchema structSubSchema = hcatField == null ? null : hcatField.getStructSubSchema();
+                for (FieldSchema innerField : pigField.schema.getFields()) {
+                    validateSchema(innerField, getColFromSchema(pigField.alias, structSubSchema));
+                }
+                break;
+
+            default:
+                throw new FrontendException("Internal Error.", PigHCatUtil.PIG_EXCEPTION_CODE);
+            }
+        }
+    }
+
+    private void validateAlias(String alias) throws FrontendException {
+        if (alias == null) {
+            throw new FrontendException("Column name for a field is not specified. Please provide the full schema as an argument to HCatStorer.", PigHCatUtil.PIG_EXCEPTION_CODE);
+        }
+        if (alias.matches(".*[A-Z]+.*")) {
+            throw new FrontendException("Column names should all be in lowercase. Invalid name found: " + alias, PigHCatUtil.PIG_EXCEPTION_CODE);
+        }
+    }
+
+    // Finds column by name in HCatSchema, if not found returns null.
+    private HCatFieldSchema getColFromSchema(String alias, HCatSchema tblSchema) {
+        if (tblSchema != null) {
+            for (HCatFieldSchema hcatField : tblSchema.getFields()) {
+                if (hcatField != null && hcatField.getName() != null && hcatField.getName().equalsIgnoreCase(alias)) {
+                    return hcatField;
+                }
+            }
+        }
+        // Its a new column
+        return null;
+    }
+
+    @Override
+    public void cleanupOnFailure(String location, Job job) throws IOException {
+        // No-op.
+    }
+
+    @Override
+    public void storeStatistics(ResourceStatistics stats, String arg1, Job job) throws IOException {
+    }
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatLoader.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatLoader.java
index 2e05a80..2b001f8 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatLoader.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatLoader.java
@@ -51,59 +51,59 @@
 
 public class HCatLoader extends HCatBaseLoader {
 
-  private static final String PARTITION_FILTER = "partition.filter"; // for future use
+    private static final String PARTITION_FILTER = "partition.filter"; // for future use
 
-  private HCatInputFormat hcatInputFormat = null;
-  private String dbName;
-  private String tableName;
-  private String hcatServerUri;
-  private String partitionFilterString;
-  private final PigHCatUtil phutil = new PigHCatUtil();
+    private HCatInputFormat hcatInputFormat = null;
+    private String dbName;
+    private String tableName;
+    private String hcatServerUri;
+    private String partitionFilterString;
+    private final PigHCatUtil phutil = new PigHCatUtil();
 
-  // Signature for wrapped loader, see comments in LoadFuncBasedInputDriver.initialize
-  final public static String INNER_SIGNATURE = "hcatloader.inner.signature";
-  final public static String INNER_SIGNATURE_PREFIX = "hcatloader_inner_signature";
-  // A hash map which stores job credentials. The key is a signature passed by Pig, which is
-  //unique to the load func and input file name (table, in our case).
-  private static Map<String, Credentials> jobCredentials = new HashMap<String, Credentials>();
+    // Signature for wrapped loader, see comments in LoadFuncBasedInputDriver.initialize
+    final public static String INNER_SIGNATURE = "hcatloader.inner.signature";
+    final public static String INNER_SIGNATURE_PREFIX = "hcatloader_inner_signature";
+    // A hash map which stores job credentials. The key is a signature passed by Pig, which is
+    //unique to the load func and input file name (table, in our case).
+    private static Map<String, Credentials> jobCredentials = new HashMap<String, Credentials>();
 
-  @Override
-  public InputFormat<?,?> getInputFormat() throws IOException {
-    if(hcatInputFormat == null) {
-      hcatInputFormat = new HCatInputFormat();
+    @Override
+    public InputFormat<?, ?> getInputFormat() throws IOException {
+        if (hcatInputFormat == null) {
+            hcatInputFormat = new HCatInputFormat();
+        }
+        return hcatInputFormat;
     }
-    return hcatInputFormat;
-  }
 
-  @Override
-  public String relativeToAbsolutePath(String location, Path curDir) throws IOException {
-    return location;
-  }
+    @Override
+    public String relativeToAbsolutePath(String location, Path curDir) throws IOException {
+        return location;
+    }
 
-@Override
-  public void setLocation(String location, Job job) throws IOException {
+    @Override
+    public void setLocation(String location, Job job) throws IOException {
 
-    UDFContext udfContext = UDFContext.getUDFContext();
-    Properties udfProps = udfContext.getUDFProperties(this.getClass(),
-        new String[]{signature});
-    job.getConfiguration().set(INNER_SIGNATURE, INNER_SIGNATURE_PREFIX + "_" + signature);
-    Pair<String, String> dbTablePair = PigHCatUtil.getDBTableNames(location);
-    dbName = dbTablePair.first;
-    tableName = dbTablePair.second;
+        UDFContext udfContext = UDFContext.getUDFContext();
+        Properties udfProps = udfContext.getUDFProperties(this.getClass(),
+            new String[]{signature});
+        job.getConfiguration().set(INNER_SIGNATURE, INNER_SIGNATURE_PREFIX + "_" + signature);
+        Pair<String, String> dbTablePair = PigHCatUtil.getDBTableNames(location);
+        dbName = dbTablePair.first;
+        tableName = dbTablePair.second;
 
-    RequiredFieldList requiredFieldsInfo = (RequiredFieldList) udfProps
-    .get(PRUNE_PROJECTION_INFO);
-    // get partitionFilterString stored in the UDFContext - it would have
-    // been stored there by an earlier call to setPartitionFilter
-    // call setInput on HCatInputFormat only in the frontend because internally
-    // it makes calls to the hcat server - we don't want these to happen in
-    // the backend
-    // in the hadoop front end mapred.task.id property will not be set in
-    // the Configuration
+        RequiredFieldList requiredFieldsInfo = (RequiredFieldList) udfProps
+            .get(PRUNE_PROJECTION_INFO);
+        // get partitionFilterString stored in the UDFContext - it would have
+        // been stored there by an earlier call to setPartitionFilter
+        // call setInput on HCatInputFormat only in the frontend because internally
+        // it makes calls to the hcat server - we don't want these to happen in
+        // the backend
+        // in the hadoop front end mapred.task.id property will not be set in
+        // the Configuration
         if (udfProps.containsKey(HCatConstants.HCAT_PIG_LOADER_LOCATION_SET)) {
-            for( Enumeration<Object> emr = udfProps.keys();emr.hasMoreElements();) {
+            for (Enumeration<Object> emr = udfProps.keys(); emr.hasMoreElements(); ) {
                 PigHCatUtil.getConfigFromUDFProperties(udfProps,
-                            job.getConfiguration(), emr.nextElement().toString());
+                    job.getConfiguration(), emr.nextElement().toString());
             }
             if (!HCatUtil.checkJobContextIfRunningFromBackend(job)) {
                 //Combine credentials and credentials from job takes precedence for freshness
@@ -114,12 +114,12 @@
         } else {
             Job clone = new Job(job.getConfiguration());
             HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                    tableName, getPartitionFilterString()));
+                tableName, getPartitionFilterString()));
 
             // We will store all the new /changed properties in the job in the
             // udf context, so the the HCatInputFormat.setInput method need not
             //be called many times.
-            for (Entry<String,String> keyValue : job.getConfiguration()) {
+            for (Entry<String, String> keyValue : job.getConfiguration()) {
                 String oldValue = clone.getConfiguration().getRaw(keyValue.getKey());
                 if ((oldValue == null) || (keyValue.getValue().equals(oldValue) == false)) {
                     udfProps.put(keyValue.getKey(), keyValue.getValue());
@@ -144,129 +144,129 @@
         // here will ensure we communicate to HCatInputFormat about pruned
         // projections at getSplits() and createRecordReader() time
 
-        if(requiredFieldsInfo != null) {
-          // convert to hcatschema and pass to HCatInputFormat
-          try {
-            outputSchema = phutil.getHCatSchema(requiredFieldsInfo.getFields(),signature,this.getClass());
-            HCatInputFormat.setOutputSchema(job, outputSchema);
-          } catch (Exception e) {
-            throw new IOException(e);
-          }
-        } else{
-          // else - this means pig's optimizer never invoked the pushProjection
-          // method - so we need all fields and hence we should not call the
-          // setOutputSchema on HCatInputFormat
-          if (HCatUtil.checkJobContextIfRunningFromBackend(job)){
+        if (requiredFieldsInfo != null) {
+            // convert to hcatschema and pass to HCatInputFormat
             try {
-              HCatSchema hcatTableSchema = (HCatSchema) udfProps.get(HCatConstants.HCAT_TABLE_SCHEMA);
-              outputSchema = hcatTableSchema;
-              HCatInputFormat.setOutputSchema(job, outputSchema);
+                outputSchema = phutil.getHCatSchema(requiredFieldsInfo.getFields(), signature, this.getClass());
+                HCatInputFormat.setOutputSchema(job, outputSchema);
             } catch (Exception e) {
-              throw new IOException(e);
+                throw new IOException(e);
             }
-          }
+        } else {
+            // else - this means pig's optimizer never invoked the pushProjection
+            // method - so we need all fields and hence we should not call the
+            // setOutputSchema on HCatInputFormat
+            if (HCatUtil.checkJobContextIfRunningFromBackend(job)) {
+                try {
+                    HCatSchema hcatTableSchema = (HCatSchema) udfProps.get(HCatConstants.HCAT_TABLE_SCHEMA);
+                    outputSchema = hcatTableSchema;
+                    HCatInputFormat.setOutputSchema(job, outputSchema);
+                } catch (Exception e) {
+                    throw new IOException(e);
+                }
+            }
         }
 
-  }
+    }
 
-  @Override
-  public String[] getPartitionKeys(String location, Job job)
-  throws IOException {
-    Table table = phutil.getTable(location,
-        hcatServerUri!=null?hcatServerUri:PigHCatUtil.getHCatServerUri(job),
+    @Override
+    public String[] getPartitionKeys(String location, Job job)
+        throws IOException {
+        Table table = phutil.getTable(location,
+            hcatServerUri != null ? hcatServerUri : PigHCatUtil.getHCatServerUri(job),
             PigHCatUtil.getHCatServerPrincipal(job));
-    List<FieldSchema> tablePartitionKeys = table.getPartitionKeys();
-    String[] partitionKeys = new String[tablePartitionKeys.size()];
-    for(int i = 0; i < tablePartitionKeys.size(); i++) {
-      partitionKeys[i] = tablePartitionKeys.get(i).getName();
+        List<FieldSchema> tablePartitionKeys = table.getPartitionKeys();
+        String[] partitionKeys = new String[tablePartitionKeys.size()];
+        for (int i = 0; i < tablePartitionKeys.size(); i++) {
+            partitionKeys[i] = tablePartitionKeys.get(i).getName();
+        }
+        return partitionKeys;
     }
-    return partitionKeys;
-  }
 
-  @Override
-  public ResourceSchema getSchema(String location, Job job) throws IOException {
-    HCatContext.getInstance().mergeConf(job.getConfiguration());
-    HCatContext.getInstance().getConf().setBoolean(
-        HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION, true);
+    @Override
+    public ResourceSchema getSchema(String location, Job job) throws IOException {
+        HCatContext.getInstance().mergeConf(job.getConfiguration());
+        HCatContext.getInstance().getConf().setBoolean(
+            HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION, true);
 
-    Table table = phutil.getTable(location,
-        hcatServerUri!=null?hcatServerUri:PigHCatUtil.getHCatServerUri(job),
+        Table table = phutil.getTable(location,
+            hcatServerUri != null ? hcatServerUri : PigHCatUtil.getHCatServerUri(job),
             PigHCatUtil.getHCatServerPrincipal(job));
-    HCatSchema hcatTableSchema = HCatUtil.getTableSchemaWithPtnCols(table);
-    try {
-      PigHCatUtil.validateHCatTableSchemaFollowsPigRules(hcatTableSchema);
-    } catch (IOException e){
-      throw new PigException(
-          "Table schema incompatible for reading through HCatLoader :" + e.getMessage()
-          + ";[Table schema was "+ hcatTableSchema.toString() +"]"
-          ,PigHCatUtil.PIG_EXCEPTION_CODE, e);
+        HCatSchema hcatTableSchema = HCatUtil.getTableSchemaWithPtnCols(table);
+        try {
+            PigHCatUtil.validateHCatTableSchemaFollowsPigRules(hcatTableSchema);
+        } catch (IOException e) {
+            throw new PigException(
+                "Table schema incompatible for reading through HCatLoader :" + e.getMessage()
+                    + ";[Table schema was " + hcatTableSchema.toString() + "]"
+                , PigHCatUtil.PIG_EXCEPTION_CODE, e);
+        }
+        storeInUDFContext(signature, HCatConstants.HCAT_TABLE_SCHEMA, hcatTableSchema);
+        outputSchema = hcatTableSchema;
+        return PigHCatUtil.getResourceSchema(hcatTableSchema);
     }
-    storeInUDFContext(signature, HCatConstants.HCAT_TABLE_SCHEMA, hcatTableSchema);
-    outputSchema = hcatTableSchema;
-    return PigHCatUtil.getResourceSchema(hcatTableSchema);
-  }
 
-  @Override
-  public void setPartitionFilter(Expression partitionFilter) throws IOException {
-    // convert the partition filter expression into a string expected by
-    // hcat and pass it in setLocation()
+    @Override
+    public void setPartitionFilter(Expression partitionFilter) throws IOException {
+        // convert the partition filter expression into a string expected by
+        // hcat and pass it in setLocation()
 
-    partitionFilterString = getHCatComparisonString(partitionFilter);
+        partitionFilterString = getHCatComparisonString(partitionFilter);
 
-    // store this in the udf context so we can get it later
-    storeInUDFContext(signature,
-        PARTITION_FILTER, partitionFilterString);
-  }
-
-  /**
-   * Get statistics about the data to be loaded. Only input data size is implemented at this time.
-   */
-  @Override
-  public ResourceStatistics getStatistics(String location, Job job) throws IOException {
-    try {
-      ResourceStatistics stats = new ResourceStatistics();
-      InputJobInfo inputJobInfo = (InputJobInfo) HCatUtil.deserialize(
-          job.getConfiguration().get(HCatConstants.HCAT_KEY_JOB_INFO));
-      stats.setmBytes(getSizeInBytes(inputJobInfo) / 1024 / 1024);
-      return stats;
-    } catch (Exception e) {
-      throw new IOException(e);
+        // store this in the udf context so we can get it later
+        storeInUDFContext(signature,
+            PARTITION_FILTER, partitionFilterString);
     }
-  }
 
-  private String getPartitionFilterString() {
-    if(partitionFilterString == null) {
-      Properties props = UDFContext.getUDFContext().getUDFProperties(
-          this.getClass(), new String[] {signature});
-      partitionFilterString = props.getProperty(PARTITION_FILTER);
+    /**
+     * Get statistics about the data to be loaded. Only input data size is implemented at this time.
+     */
+    @Override
+    public ResourceStatistics getStatistics(String location, Job job) throws IOException {
+        try {
+            ResourceStatistics stats = new ResourceStatistics();
+            InputJobInfo inputJobInfo = (InputJobInfo) HCatUtil.deserialize(
+                job.getConfiguration().get(HCatConstants.HCAT_KEY_JOB_INFO));
+            stats.setmBytes(getSizeInBytes(inputJobInfo) / 1024 / 1024);
+            return stats;
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
     }
-    return partitionFilterString;
-  }
 
-  private String getHCatComparisonString(Expression expr) {
-    if(expr instanceof BinaryExpression){
-      // call getHCatComparisonString on lhs and rhs, and and join the
-      // results with OpType string
-
-      // we can just use OpType.toString() on all Expression types except
-      // Equal, NotEqualt since Equal has '==' in toString() and
-      // we need '='
-      String opStr = null;
-      switch(expr.getOpType()){
-        case OP_EQ :
-          opStr = " = ";
-          break;
-        default:
-          opStr = expr.getOpType().toString();
-      }
-      BinaryExpression be = (BinaryExpression)expr;
-      return "(" + getHCatComparisonString(be.getLhs()) +
-                  opStr +
-                  getHCatComparisonString(be.getRhs()) + ")";
-    } else {
-      // should be a constant or column
-      return expr.toString();
+    private String getPartitionFilterString() {
+        if (partitionFilterString == null) {
+            Properties props = UDFContext.getUDFContext().getUDFProperties(
+                this.getClass(), new String[]{signature});
+            partitionFilterString = props.getProperty(PARTITION_FILTER);
+        }
+        return partitionFilterString;
     }
-  }
+
+    private String getHCatComparisonString(Expression expr) {
+        if (expr instanceof BinaryExpression) {
+            // call getHCatComparisonString on lhs and rhs, and and join the
+            // results with OpType string
+
+            // we can just use OpType.toString() on all Expression types except
+            // Equal, NotEqualt since Equal has '==' in toString() and
+            // we need '='
+            String opStr = null;
+            switch (expr.getOpType()) {
+            case OP_EQ:
+                opStr = " = ";
+                break;
+            default:
+                opStr = expr.getOpType().toString();
+            }
+            BinaryExpression be = (BinaryExpression) expr;
+            return "(" + getHCatComparisonString(be.getLhs()) +
+                opStr +
+                getHCatComparisonString(be.getRhs()) + ")";
+        } else {
+            // should be a constant or column
+            return expr.toString();
+        }
+    }
 
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatStorer.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatStorer.java
index 9f5b4a2..c46db33 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatStorer.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/HCatStorer.java
@@ -50,114 +50,114 @@
 
 public class HCatStorer extends HCatBaseStorer {
 
-  // Signature for wrapped storer, see comments in LoadFuncBasedInputDriver.initialize
-  final public static String INNER_SIGNATURE = "hcatstorer.inner.signature";
-  final public static String INNER_SIGNATURE_PREFIX = "hcatstorer_inner_signature";
-  // A hash map which stores job credentials. The key is a signature passed by Pig, which is
-  //unique to the store func and out file name (table, in our case).
-  private static Map<String, Credentials> jobCredentials = new HashMap<String, Credentials>();
+    // Signature for wrapped storer, see comments in LoadFuncBasedInputDriver.initialize
+    final public static String INNER_SIGNATURE = "hcatstorer.inner.signature";
+    final public static String INNER_SIGNATURE_PREFIX = "hcatstorer_inner_signature";
+    // A hash map which stores job credentials. The key is a signature passed by Pig, which is
+    //unique to the store func and out file name (table, in our case).
+    private static Map<String, Credentials> jobCredentials = new HashMap<String, Credentials>();
 
 
-  public HCatStorer(String partSpecs, String schema) throws Exception {
-    super(partSpecs, schema);
-  }
-
-  public HCatStorer(String partSpecs) throws Exception {
-    this(partSpecs, null);
-  }
-
-  public HCatStorer() throws Exception{
-    this(null,null);
-  }
-
-  @Override
-  public OutputFormat getOutputFormat() throws IOException {
-    return new HCatOutputFormat();
-  }
-
-  @Override
-  public void setStoreLocation(String location, Job job) throws IOException {
-    HCatContext.getInstance().mergeConf(job.getConfiguration());
-    HCatContext.getInstance().getConf().setBoolean(
-        HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION, false);
-
-    Configuration config = job.getConfiguration();
-    config.set(INNER_SIGNATURE, INNER_SIGNATURE_PREFIX + "_" + sign);
-    Properties udfProps = UDFContext.getUDFContext().getUDFProperties(
-            this.getClass(), new String[] { sign });
-    String[] userStr = location.split("\\.");
-
-    if (udfProps.containsKey(HCatConstants.HCAT_PIG_STORER_LOCATION_SET)) {
-      for(Enumeration<Object> emr = udfProps.keys();emr.hasMoreElements();){
-        PigHCatUtil.getConfigFromUDFProperties(udfProps, config, emr.nextElement().toString());
-      }
-      Credentials crd = jobCredentials.get(INNER_SIGNATURE_PREFIX + "_" + sign);
-      if (crd != null) {
-        job.getCredentials().addAll(crd);
-      }
-    } else {
-      Job clone = new Job(job.getConfiguration());
-      OutputJobInfo outputJobInfo;
-      if (userStr.length == 2) {
-        outputJobInfo = OutputJobInfo.create(userStr[0], userStr[1], partitions);
-      } else if (userStr.length == 1) {
-        outputJobInfo = OutputJobInfo.create(null, userStr[0], partitions);
-      } else {
-        throw new FrontendException("location " + location
-              + " is invalid. It must be of the form [db.]table",
-              PigHCatUtil.PIG_EXCEPTION_CODE);
-      }
-      Schema schema = (Schema) ObjectSerializer.deserialize(udfProps.getProperty(PIG_SCHEMA));
-      if (schema != null) {
-        pigSchema = schema;
-      }
-      if (pigSchema == null) {
-        throw new FrontendException(
-            "Schema for data cannot be determined.",
-            PigHCatUtil.PIG_EXCEPTION_CODE);
-      }
-      try {
-        HCatOutputFormat.setOutput(job, outputJobInfo);
-      } catch (HCatException he) {
-        // pass the message to the user - essentially something about
-        // the table
-        // information passed to HCatOutputFormat was not right
-        throw new PigException(he.getMessage(),
-            PigHCatUtil.PIG_EXCEPTION_CODE, he);
-      }
-      HCatSchema hcatTblSchema = HCatOutputFormat.getTableSchema(job);
-      try {
-        doSchemaValidations(pigSchema, hcatTblSchema);
-      } catch (HCatException he) {
-        throw new FrontendException(he.getMessage(), PigHCatUtil.PIG_EXCEPTION_CODE, he);
-      }
-      computedSchema = convertPigSchemaToHCatSchema(pigSchema, hcatTblSchema);
-      HCatOutputFormat.setSchema(job, computedSchema);
-      udfProps.setProperty(COMPUTED_OUTPUT_SCHEMA,ObjectSerializer.serialize(computedSchema));
-
-      // We will store all the new /changed properties in the job in the
-      // udf context, so the the HCatOutputFormat.setOutput and setSchema
-      // methods need not be called many times.
-      for ( Entry<String,String> keyValue : job.getConfiguration()) {
-        String oldValue = clone.getConfiguration().getRaw(keyValue.getKey());
-        if ((oldValue == null) || (keyValue.getValue().equals(oldValue) == false)) {
-          udfProps.put(keyValue.getKey(), keyValue.getValue());
-        }
-      }
-      //Store credentials in a private hash map and not the udf context to
-      // make sure they are not public.
-      jobCredentials.put(INNER_SIGNATURE_PREFIX + "_" + sign,job.getCredentials());
-      udfProps.put(HCatConstants.HCAT_PIG_STORER_LOCATION_SET, true);
+    public HCatStorer(String partSpecs, String schema) throws Exception {
+        super(partSpecs, schema);
     }
-  }
 
-  @Override
-  public void storeSchema(ResourceSchema schema, String arg1, Job job) throws IOException {
-    HCatHadoopShims.Instance.get().commitJob(getOutputFormat(), schema, arg1, job);
-  }
+    public HCatStorer(String partSpecs) throws Exception {
+        this(partSpecs, null);
+    }
 
-  @Override
-  public void cleanupOnFailure(String location, Job job) throws IOException {
-      HCatHadoopShims.Instance.get().abortJob(getOutputFormat(), job);
-  }
+    public HCatStorer() throws Exception {
+        this(null, null);
+    }
+
+    @Override
+    public OutputFormat getOutputFormat() throws IOException {
+        return new HCatOutputFormat();
+    }
+
+    @Override
+    public void setStoreLocation(String location, Job job) throws IOException {
+        HCatContext.getInstance().mergeConf(job.getConfiguration());
+        HCatContext.getInstance().getConf().setBoolean(
+            HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION, false);
+
+        Configuration config = job.getConfiguration();
+        config.set(INNER_SIGNATURE, INNER_SIGNATURE_PREFIX + "_" + sign);
+        Properties udfProps = UDFContext.getUDFContext().getUDFProperties(
+            this.getClass(), new String[]{sign});
+        String[] userStr = location.split("\\.");
+
+        if (udfProps.containsKey(HCatConstants.HCAT_PIG_STORER_LOCATION_SET)) {
+            for (Enumeration<Object> emr = udfProps.keys(); emr.hasMoreElements(); ) {
+                PigHCatUtil.getConfigFromUDFProperties(udfProps, config, emr.nextElement().toString());
+            }
+            Credentials crd = jobCredentials.get(INNER_SIGNATURE_PREFIX + "_" + sign);
+            if (crd != null) {
+                job.getCredentials().addAll(crd);
+            }
+        } else {
+            Job clone = new Job(job.getConfiguration());
+            OutputJobInfo outputJobInfo;
+            if (userStr.length == 2) {
+                outputJobInfo = OutputJobInfo.create(userStr[0], userStr[1], partitions);
+            } else if (userStr.length == 1) {
+                outputJobInfo = OutputJobInfo.create(null, userStr[0], partitions);
+            } else {
+                throw new FrontendException("location " + location
+                    + " is invalid. It must be of the form [db.]table",
+                    PigHCatUtil.PIG_EXCEPTION_CODE);
+            }
+            Schema schema = (Schema) ObjectSerializer.deserialize(udfProps.getProperty(PIG_SCHEMA));
+            if (schema != null) {
+                pigSchema = schema;
+            }
+            if (pigSchema == null) {
+                throw new FrontendException(
+                    "Schema for data cannot be determined.",
+                    PigHCatUtil.PIG_EXCEPTION_CODE);
+            }
+            try {
+                HCatOutputFormat.setOutput(job, outputJobInfo);
+            } catch (HCatException he) {
+                // pass the message to the user - essentially something about
+                // the table
+                // information passed to HCatOutputFormat was not right
+                throw new PigException(he.getMessage(),
+                    PigHCatUtil.PIG_EXCEPTION_CODE, he);
+            }
+            HCatSchema hcatTblSchema = HCatOutputFormat.getTableSchema(job);
+            try {
+                doSchemaValidations(pigSchema, hcatTblSchema);
+            } catch (HCatException he) {
+                throw new FrontendException(he.getMessage(), PigHCatUtil.PIG_EXCEPTION_CODE, he);
+            }
+            computedSchema = convertPigSchemaToHCatSchema(pigSchema, hcatTblSchema);
+            HCatOutputFormat.setSchema(job, computedSchema);
+            udfProps.setProperty(COMPUTED_OUTPUT_SCHEMA, ObjectSerializer.serialize(computedSchema));
+
+            // We will store all the new /changed properties in the job in the
+            // udf context, so the the HCatOutputFormat.setOutput and setSchema
+            // methods need not be called many times.
+            for (Entry<String, String> keyValue : job.getConfiguration()) {
+                String oldValue = clone.getConfiguration().getRaw(keyValue.getKey());
+                if ((oldValue == null) || (keyValue.getValue().equals(oldValue) == false)) {
+                    udfProps.put(keyValue.getKey(), keyValue.getValue());
+                }
+            }
+            //Store credentials in a private hash map and not the udf context to
+            // make sure they are not public.
+            jobCredentials.put(INNER_SIGNATURE_PREFIX + "_" + sign, job.getCredentials());
+            udfProps.put(HCatConstants.HCAT_PIG_STORER_LOCATION_SET, true);
+        }
+    }
+
+    @Override
+    public void storeSchema(ResourceSchema schema, String arg1, Job job) throws IOException {
+        HCatHadoopShims.Instance.get().commitJob(getOutputFormat(), schema, arg1, job);
+    }
+
+    @Override
+    public void cleanupOnFailure(String location, Job job) throws IOException {
+        HCatHadoopShims.Instance.get().abortJob(getOutputFormat(), job);
+    }
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/PigHCatUtil.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/PigHCatUtil.java
index 0f74034..2407de5 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/PigHCatUtil.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/PigHCatUtil.java
@@ -56,388 +56,388 @@
 
 public class PigHCatUtil {
 
-  static final int PIG_EXCEPTION_CODE = 1115; // http://wiki.apache.org/pig/PigErrorHandlingFunctionalSpecification#Error_codes
-  private static final String DEFAULT_DB = MetaStoreUtils.DEFAULT_DATABASE_NAME;
+    static final int PIG_EXCEPTION_CODE = 1115; // http://wiki.apache.org/pig/PigErrorHandlingFunctionalSpecification#Error_codes
+    private static final String DEFAULT_DB = MetaStoreUtils.DEFAULT_DATABASE_NAME;
 
-  private final  Map<Pair<String,String>, Table> hcatTableCache =
-    new HashMap<Pair<String,String>, Table>();
+    private final Map<Pair<String, String>, Table> hcatTableCache =
+        new HashMap<Pair<String, String>, Table>();
 
-  private static final TupleFactory tupFac = TupleFactory.getInstance();
+    private static final TupleFactory tupFac = TupleFactory.getInstance();
 
-  static public Pair<String, String> getDBTableNames(String location) throws IOException {
-    // the location string will be of the form:
-    // <database name>.<table name> - parse it and
-    // communicate the information to HCatInputFormat
+    static public Pair<String, String> getDBTableNames(String location) throws IOException {
+        // the location string will be of the form:
+        // <database name>.<table name> - parse it and
+        // communicate the information to HCatInputFormat
 
-    try {
-      return HCatUtil.getDbAndTableName(location);
-    } catch (IOException e) {
-      String locationErrMsg = "The input location in load statement " +
-      "should be of the form " +
-      "<databasename>.<table name> or <table name>. Got " + location;
-      throw new PigException(locationErrMsg, PIG_EXCEPTION_CODE);
-    }
-  }
-
-  static public String getHCatServerUri(Job job) {
-
-    return job.getConfiguration().get(HiveConf.ConfVars.METASTOREURIS.varname);
-  }
-
-  static public String getHCatServerPrincipal(Job job) {
-
-    return job.getConfiguration().get(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-  }
-
-  private static HiveMetaStoreClient getHiveMetaClient(String serverUri,
-                                                       String serverKerberosPrincipal, Class<?> clazz) throws Exception {
-    HiveConf hiveConf = new HiveConf(clazz);
-
-    if (serverUri != null){
-      hiveConf.set("hive.metastore.local", "false");
-      hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, serverUri.trim());
+        try {
+            return HCatUtil.getDbAndTableName(location);
+        } catch (IOException e) {
+            String locationErrMsg = "The input location in load statement " +
+                "should be of the form " +
+                "<databasename>.<table name> or <table name>. Got " + location;
+            throw new PigException(locationErrMsg, PIG_EXCEPTION_CODE);
+        }
     }
 
-    if (serverKerberosPrincipal != null){
-      hiveConf.setBoolVar(HiveConf.ConfVars.METASTORE_USE_THRIFT_SASL, true);
-      hiveConf.setVar(HiveConf.ConfVars.METASTORE_KERBEROS_PRINCIPAL, serverKerberosPrincipal);
+    static public String getHCatServerUri(Job job) {
+
+        return job.getConfiguration().get(HiveConf.ConfVars.METASTOREURIS.varname);
     }
 
-    try {
-        return HCatUtil.getHiveClient(hiveConf);
-    } catch (Exception e){
-      throw new Exception("Could not instantiate a HiveMetaStoreClient connecting to server uri:["+serverUri+"]",e);
-    }
-  }
+    static public String getHCatServerPrincipal(Job job) {
 
-
-  HCatSchema getHCatSchema(List<RequiredField> fields, String signature, Class<?> classForUDFCLookup) throws IOException {
-    if(fields == null) {
-      return null;
+        return job.getConfiguration().get(HCatConstants.HCAT_METASTORE_PRINCIPAL);
     }
 
-    Properties props = UDFContext.getUDFContext().getUDFProperties(
-        classForUDFCLookup, new String[] {signature});
-    HCatSchema hcatTableSchema = (HCatSchema) props.get(HCatConstants.HCAT_TABLE_SCHEMA);
+    private static HiveMetaStoreClient getHiveMetaClient(String serverUri,
+                                                         String serverKerberosPrincipal, Class<?> clazz) throws Exception {
+        HiveConf hiveConf = new HiveConf(clazz);
 
-    ArrayList<HCatFieldSchema> fcols = new ArrayList<HCatFieldSchema>();
-    for(RequiredField rf: fields) {
-      fcols.add(hcatTableSchema.getFields().get(rf.getIndex()));
-    }
-    return new HCatSchema(fcols);
-  }
+        if (serverUri != null) {
+            hiveConf.set("hive.metastore.local", "false");
+            hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, serverUri.trim());
+        }
 
-  public Table getTable(String location, String hcatServerUri, String hcatServerPrincipal) throws IOException{
-    Pair<String, String> loc_server = new Pair<String,String>(location, hcatServerUri);
-    Table hcatTable = hcatTableCache.get(loc_server);
-    if(hcatTable != null){
-      return hcatTable;
+        if (serverKerberosPrincipal != null) {
+            hiveConf.setBoolVar(HiveConf.ConfVars.METASTORE_USE_THRIFT_SASL, true);
+            hiveConf.setVar(HiveConf.ConfVars.METASTORE_KERBEROS_PRINCIPAL, serverKerberosPrincipal);
+        }
+
+        try {
+            return HCatUtil.getHiveClient(hiveConf);
+        } catch (Exception e) {
+            throw new Exception("Could not instantiate a HiveMetaStoreClient connecting to server uri:[" + serverUri + "]", e);
+        }
     }
 
-    Pair<String, String> dbTablePair = PigHCatUtil.getDBTableNames(location);
-    String dbName = dbTablePair.first;
-    String tableName = dbTablePair.second;
-    Table table = null;
-    HiveMetaStoreClient client = null;
-    try {
-      client = getHiveMetaClient(hcatServerUri, hcatServerPrincipal, PigHCatUtil.class);
-      table = HCatUtil.getTable(client, dbName, tableName);
-    } catch (NoSuchObjectException nsoe){
-      throw new PigException("Table not found : " + nsoe.getMessage(), PIG_EXCEPTION_CODE); // prettier error messages to frontend
-    } catch (Exception e) {
-      throw new IOException(e);
-    } finally {
-        HCatUtil.closeHiveClientQuietly(client);
-    }
-    hcatTableCache.put(loc_server, table);
-    return table;
-  }
 
-  public static ResourceSchema getResourceSchema(HCatSchema hcatSchema) throws IOException {
+    HCatSchema getHCatSchema(List<RequiredField> fields, String signature, Class<?> classForUDFCLookup) throws IOException {
+        if (fields == null) {
+            return null;
+        }
 
-    List<ResourceFieldSchema> rfSchemaList = new ArrayList<ResourceFieldSchema>();
-    for (HCatFieldSchema hfs : hcatSchema.getFields()){
-      ResourceFieldSchema rfSchema;
-      rfSchema = getResourceSchemaFromFieldSchema(hfs);
-      rfSchemaList.add(rfSchema);
-    }
-    ResourceSchema rSchema = new ResourceSchema();
-    rSchema.setFields(rfSchemaList.toArray(new ResourceFieldSchema[0]));
-    return rSchema;
+        Properties props = UDFContext.getUDFContext().getUDFProperties(
+            classForUDFCLookup, new String[]{signature});
+        HCatSchema hcatTableSchema = (HCatSchema) props.get(HCatConstants.HCAT_TABLE_SCHEMA);
 
-  }
-
-  private static ResourceFieldSchema getResourceSchemaFromFieldSchema(HCatFieldSchema hfs)
-      throws IOException {
-    ResourceFieldSchema rfSchema;
-    // if we are dealing with a bag or tuple column - need to worry about subschema
-    if(hfs.getType() == Type.STRUCT) {
-        rfSchema = new ResourceFieldSchema()
-          .setName(hfs.getName())
-          .setDescription(hfs.getComment())
-          .setType(getPigType( hfs))
-          .setSchema(getTupleSubSchema(hfs));
-    } else if(hfs.getType() == Type.ARRAY) {
-        rfSchema = new ResourceFieldSchema()
-          .setName(hfs.getName())
-          .setDescription(hfs.getComment())
-          .setType(getPigType( hfs))
-          .setSchema(getBagSubSchema(hfs));
-    } else {
-      rfSchema = new ResourceFieldSchema()
-          .setName(hfs.getName())
-          .setDescription(hfs.getComment())
-          .setType(getPigType( hfs))
-          .setSchema(null); // no munging inner-schemas
-    }
-    return rfSchema;
-  }
-
-  protected static ResourceSchema getBagSubSchema(HCatFieldSchema hfs) throws IOException {
-    // there are two cases - array<Type> and array<struct<...>>
-    // in either case the element type of the array is represented in a
-    // tuple field schema in the bag's field schema - the second case (struct)
-    // more naturally translates to the tuple - in the first case (array<Type>)
-    // we simulate the tuple by putting the single field in a tuple
-
-    Properties props = UDFContext.getUDFContext().getClientSystemProps();
-    String innerTupleName = HCatConstants.HCAT_PIG_INNER_TUPLE_NAME_DEFAULT;
-    if (props != null && props.containsKey(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME)) {
-      innerTupleName = props.getProperty(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME)
-          .replaceAll("FIELDNAME", hfs.getName());
-    }
-    String innerFieldName = HCatConstants.HCAT_PIG_INNER_FIELD_NAME_DEFAULT;
-    if (props != null && props.containsKey(HCatConstants.HCAT_PIG_INNER_FIELD_NAME)) {
-      innerFieldName = props.getProperty(HCatConstants.HCAT_PIG_INNER_FIELD_NAME)
-          .replaceAll("FIELDNAME", hfs.getName());
+        ArrayList<HCatFieldSchema> fcols = new ArrayList<HCatFieldSchema>();
+        for (RequiredField rf : fields) {
+            fcols.add(hcatTableSchema.getFields().get(rf.getIndex()));
+        }
+        return new HCatSchema(fcols);
     }
 
-    ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
-    bagSubFieldSchemas[0] = new ResourceFieldSchema().setName(innerTupleName)
-      .setDescription("The tuple in the bag")
-      .setType(DataType.TUPLE);
-    HCatFieldSchema arrayElementFieldSchema = hfs.getArrayElementSchema().get(0);
-    if(arrayElementFieldSchema.getType() == Type.STRUCT) {
-      bagSubFieldSchemas[0].setSchema(getTupleSubSchema(arrayElementFieldSchema));
-    } else if(arrayElementFieldSchema.getType() == Type.ARRAY) {
-      ResourceSchema s = new ResourceSchema();
-      List<ResourceFieldSchema> lrfs = Arrays.asList(getResourceSchemaFromFieldSchema(arrayElementFieldSchema));
-      s.setFields(lrfs.toArray(new ResourceFieldSchema[0]));
-      bagSubFieldSchemas[0].setSchema(s);
-    } else {
-      ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
-      innerTupleFieldSchemas[0] = new ResourceFieldSchema().setName(innerFieldName)
-        .setDescription("The inner field in the tuple in the bag")
-        .setType(getPigType(arrayElementFieldSchema))
-        .setSchema(null); // the element type is not a tuple - so no subschema
-      bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
-    }
-    ResourceSchema s = new ResourceSchema().setFields(bagSubFieldSchemas);
-    return s;
+    public Table getTable(String location, String hcatServerUri, String hcatServerPrincipal) throws IOException {
+        Pair<String, String> loc_server = new Pair<String, String>(location, hcatServerUri);
+        Table hcatTable = hcatTableCache.get(loc_server);
+        if (hcatTable != null) {
+            return hcatTable;
+        }
 
-  }
-
-  private static ResourceSchema getTupleSubSchema(HCatFieldSchema hfs) throws IOException {
-    // for each struct subfield, create equivalent ResourceFieldSchema
-    ResourceSchema s = new ResourceSchema();
-    List<ResourceFieldSchema> lrfs = new ArrayList<ResourceFieldSchema>();
-    for(HCatFieldSchema subField : hfs.getStructSubSchema().getFields()) {
-      lrfs.add(getResourceSchemaFromFieldSchema(subField));
-    }
-    s.setFields(lrfs.toArray(new ResourceFieldSchema[0]));
-    return s;
-  }
-
-/**
-   * @param hfs the field schema of the column
-   * @return corresponding pig type
-   * @throws IOException
-   */
-  static public byte getPigType(HCatFieldSchema hfs) throws IOException {
-    return getPigType(hfs.getType());
-  }
-
-  static public byte getPigType(Type type) throws IOException {
-    String errMsg;
-
-    if (type == Type.STRING){
-      return DataType.CHARARRAY;
+        Pair<String, String> dbTablePair = PigHCatUtil.getDBTableNames(location);
+        String dbName = dbTablePair.first;
+        String tableName = dbTablePair.second;
+        Table table = null;
+        HiveMetaStoreClient client = null;
+        try {
+            client = getHiveMetaClient(hcatServerUri, hcatServerPrincipal, PigHCatUtil.class);
+            table = HCatUtil.getTable(client, dbName, tableName);
+        } catch (NoSuchObjectException nsoe) {
+            throw new PigException("Table not found : " + nsoe.getMessage(), PIG_EXCEPTION_CODE); // prettier error messages to frontend
+        } catch (Exception e) {
+            throw new IOException(e);
+        } finally {
+            HCatUtil.closeHiveClientQuietly(client);
+        }
+        hcatTableCache.put(loc_server, table);
+        return table;
     }
 
-    if ( (type == Type.INT) || (type == Type.SMALLINT) || (type == Type.TINYINT)){
-      return DataType.INTEGER;
+    public static ResourceSchema getResourceSchema(HCatSchema hcatSchema) throws IOException {
+
+        List<ResourceFieldSchema> rfSchemaList = new ArrayList<ResourceFieldSchema>();
+        for (HCatFieldSchema hfs : hcatSchema.getFields()) {
+            ResourceFieldSchema rfSchema;
+            rfSchema = getResourceSchemaFromFieldSchema(hfs);
+            rfSchemaList.add(rfSchema);
+        }
+        ResourceSchema rSchema = new ResourceSchema();
+        rSchema.setFields(rfSchemaList.toArray(new ResourceFieldSchema[0]));
+        return rSchema;
+
     }
 
-    if (type == Type.ARRAY){
-      return DataType.BAG;
+    private static ResourceFieldSchema getResourceSchemaFromFieldSchema(HCatFieldSchema hfs)
+        throws IOException {
+        ResourceFieldSchema rfSchema;
+        // if we are dealing with a bag or tuple column - need to worry about subschema
+        if (hfs.getType() == Type.STRUCT) {
+            rfSchema = new ResourceFieldSchema()
+                .setName(hfs.getName())
+                .setDescription(hfs.getComment())
+                .setType(getPigType(hfs))
+                .setSchema(getTupleSubSchema(hfs));
+        } else if (hfs.getType() == Type.ARRAY) {
+            rfSchema = new ResourceFieldSchema()
+                .setName(hfs.getName())
+                .setDescription(hfs.getComment())
+                .setType(getPigType(hfs))
+                .setSchema(getBagSubSchema(hfs));
+        } else {
+            rfSchema = new ResourceFieldSchema()
+                .setName(hfs.getName())
+                .setDescription(hfs.getComment())
+                .setType(getPigType(hfs))
+                .setSchema(null); // no munging inner-schemas
+        }
+        return rfSchema;
     }
 
-    if (type == Type.STRUCT){
-      return DataType.TUPLE;
+    protected static ResourceSchema getBagSubSchema(HCatFieldSchema hfs) throws IOException {
+        // there are two cases - array<Type> and array<struct<...>>
+        // in either case the element type of the array is represented in a
+        // tuple field schema in the bag's field schema - the second case (struct)
+        // more naturally translates to the tuple - in the first case (array<Type>)
+        // we simulate the tuple by putting the single field in a tuple
+
+        Properties props = UDFContext.getUDFContext().getClientSystemProps();
+        String innerTupleName = HCatConstants.HCAT_PIG_INNER_TUPLE_NAME_DEFAULT;
+        if (props != null && props.containsKey(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME)) {
+            innerTupleName = props.getProperty(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME)
+                .replaceAll("FIELDNAME", hfs.getName());
+        }
+        String innerFieldName = HCatConstants.HCAT_PIG_INNER_FIELD_NAME_DEFAULT;
+        if (props != null && props.containsKey(HCatConstants.HCAT_PIG_INNER_FIELD_NAME)) {
+            innerFieldName = props.getProperty(HCatConstants.HCAT_PIG_INNER_FIELD_NAME)
+                .replaceAll("FIELDNAME", hfs.getName());
+        }
+
+        ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
+        bagSubFieldSchemas[0] = new ResourceFieldSchema().setName(innerTupleName)
+            .setDescription("The tuple in the bag")
+            .setType(DataType.TUPLE);
+        HCatFieldSchema arrayElementFieldSchema = hfs.getArrayElementSchema().get(0);
+        if (arrayElementFieldSchema.getType() == Type.STRUCT) {
+            bagSubFieldSchemas[0].setSchema(getTupleSubSchema(arrayElementFieldSchema));
+        } else if (arrayElementFieldSchema.getType() == Type.ARRAY) {
+            ResourceSchema s = new ResourceSchema();
+            List<ResourceFieldSchema> lrfs = Arrays.asList(getResourceSchemaFromFieldSchema(arrayElementFieldSchema));
+            s.setFields(lrfs.toArray(new ResourceFieldSchema[0]));
+            bagSubFieldSchemas[0].setSchema(s);
+        } else {
+            ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
+            innerTupleFieldSchemas[0] = new ResourceFieldSchema().setName(innerFieldName)
+                .setDescription("The inner field in the tuple in the bag")
+                .setType(getPigType(arrayElementFieldSchema))
+                .setSchema(null); // the element type is not a tuple - so no subschema
+            bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
+        }
+        ResourceSchema s = new ResourceSchema().setFields(bagSubFieldSchemas);
+        return s;
+
     }
 
-    if (type == Type.MAP){
-      return DataType.MAP;
+    private static ResourceSchema getTupleSubSchema(HCatFieldSchema hfs) throws IOException {
+        // for each struct subfield, create equivalent ResourceFieldSchema
+        ResourceSchema s = new ResourceSchema();
+        List<ResourceFieldSchema> lrfs = new ArrayList<ResourceFieldSchema>();
+        for (HCatFieldSchema subField : hfs.getStructSubSchema().getFields()) {
+            lrfs.add(getResourceSchemaFromFieldSchema(subField));
+        }
+        s.setFields(lrfs.toArray(new ResourceFieldSchema[0]));
+        return s;
     }
 
-    if (type == Type.BIGINT){
-      return DataType.LONG;
+    /**
+     * @param hfs the field schema of the column
+     * @return corresponding pig type
+     * @throws IOException
+     */
+    static public byte getPigType(HCatFieldSchema hfs) throws IOException {
+        return getPigType(hfs.getType());
     }
 
-    if (type == Type.FLOAT){
-      return DataType.FLOAT;
+    static public byte getPigType(Type type) throws IOException {
+        String errMsg;
+
+        if (type == Type.STRING) {
+            return DataType.CHARARRAY;
+        }
+
+        if ((type == Type.INT) || (type == Type.SMALLINT) || (type == Type.TINYINT)) {
+            return DataType.INTEGER;
+        }
+
+        if (type == Type.ARRAY) {
+            return DataType.BAG;
+        }
+
+        if (type == Type.STRUCT) {
+            return DataType.TUPLE;
+        }
+
+        if (type == Type.MAP) {
+            return DataType.MAP;
+        }
+
+        if (type == Type.BIGINT) {
+            return DataType.LONG;
+        }
+
+        if (type == Type.FLOAT) {
+            return DataType.FLOAT;
+        }
+
+        if (type == Type.DOUBLE) {
+            return DataType.DOUBLE;
+        }
+
+        if (type == Type.BINARY) {
+            return DataType.BYTEARRAY;
+        }
+
+        if (type == Type.BOOLEAN) {
+            errMsg = "HCatalog column type 'BOOLEAN' is not supported in " +
+                "Pig as a column type";
+            throw new PigException(errMsg, PIG_EXCEPTION_CODE);
+        }
+
+        errMsg = "HCatalog column type '" + type.toString() + "' is not supported in Pig as a column type";
+        throw new PigException(errMsg, PIG_EXCEPTION_CODE);
     }
 
-    if (type == Type.DOUBLE){
-      return DataType.DOUBLE;
+    public static Tuple transformToTuple(HCatRecord hr, HCatSchema hs) throws Exception {
+        if (hr == null) {
+            return null;
+        }
+        return transformToTuple(hr.getAll(), hs);
     }
 
-    if (type == Type.BINARY){
-        return DataType.BYTEARRAY;
+    @SuppressWarnings("unchecked")
+    public static Object extractPigObject(Object o, HCatFieldSchema hfs) throws Exception {
+        Object result;
+        Type itemType = hfs.getType();
+        switch (itemType) {
+        case BINARY:
+            result = (o == null) ? null : new DataByteArray((byte[]) o);
+            break;
+        case STRUCT:
+            result = transformToTuple((List<Object>) o, hfs);
+            break;
+        case ARRAY:
+            result = transformToBag((List<? extends Object>) o, hfs);
+            break;
+        case MAP:
+            result = transformToPigMap((Map<String, Object>) o, hfs);
+            break;
+        default:
+            result = o;
+            break;
+        }
+        return result;
     }
 
-    if (type == Type.BOOLEAN){
-      errMsg = "HCatalog column type 'BOOLEAN' is not supported in " +
-      "Pig as a column type";
-      throw new PigException(errMsg, PIG_EXCEPTION_CODE);
+    public static Tuple transformToTuple(List<? extends Object> objList, HCatFieldSchema hfs) throws Exception {
+        try {
+            return transformToTuple(objList, hfs.getStructSubSchema());
+        } catch (Exception e) {
+            if (hfs.getType() != Type.STRUCT) {
+                throw new Exception("Expected Struct type, got " + hfs.getType(), e);
+            } else {
+                throw e;
+            }
+        }
     }
 
-    errMsg = "HCatalog column type '"+ type.toString() +"' is not supported in Pig as a column type";
-    throw new PigException(errMsg, PIG_EXCEPTION_CODE);
-  }
-
-  public static Tuple transformToTuple(HCatRecord hr, HCatSchema hs) throws Exception {
-    if (hr == null){
-      return null;
-    }
-    return transformToTuple(hr.getAll(),hs);
-  }
-
-  @SuppressWarnings("unchecked")
-  public static Object extractPigObject(Object o, HCatFieldSchema hfs) throws Exception {
-    Object result;
-    Type itemType = hfs.getType();
-    switch (itemType){
-    case BINARY:
-      result = (o == null) ? null : new DataByteArray((byte[])o);
-      break;
-    case STRUCT:
-      result = transformToTuple((List<Object>)o,hfs);
-      break;
-    case ARRAY:
-      result = transformToBag((List<? extends Object>) o,hfs);
-      break;
-    case MAP:
-      result = transformToPigMap((Map<String, Object>)o,hfs);
-      break;
-    default:
-      result = o;
-      break;
-    }
-    return result;
-  }
-
-  public static Tuple transformToTuple(List<? extends Object> objList, HCatFieldSchema hfs) throws Exception {
-      try {
-          return transformToTuple(objList,hfs.getStructSubSchema());
-      } catch (Exception e){
-          if (hfs.getType() != Type.STRUCT){
-              throw new Exception("Expected Struct type, got "+hfs.getType(), e);
-          } else {
-              throw e;
-          }
-      }
-  }
-
-  public static Tuple transformToTuple(List<? extends Object> objList, HCatSchema hs) throws Exception {
-    if (objList == null){
-      return null;
-    }
-    Tuple t = tupFac.newTuple(objList.size());
-    List<HCatFieldSchema> subFields = hs.getFields();
-    for (int i = 0; i < subFields.size(); i++){
-      t.set(i,extractPigObject(objList.get(i), subFields.get(i)));
-    }
-    return t;
-  }
-
-  public static Map<String,Object> transformToPigMap(Map<String,Object> map, HCatFieldSchema hfs) throws Exception {
-    if (map == null) {
-      return null;
+    public static Tuple transformToTuple(List<? extends Object> objList, HCatSchema hs) throws Exception {
+        if (objList == null) {
+            return null;
+        }
+        Tuple t = tupFac.newTuple(objList.size());
+        List<HCatFieldSchema> subFields = hs.getFields();
+        for (int i = 0; i < subFields.size(); i++) {
+            t.set(i, extractPigObject(objList.get(i), subFields.get(i)));
+        }
+        return t;
     }
 
-    Map<String,Object> result = new HashMap<String, Object>();
-    for (Entry<String, Object> entry : map.entrySet()) {
-      result.put(entry.getKey(), extractPigObject(entry.getValue(), hfs.getMapValueSchema().get(0)));
-    }
-    return result;
-  }
+    public static Map<String, Object> transformToPigMap(Map<String, Object> map, HCatFieldSchema hfs) throws Exception {
+        if (map == null) {
+            return null;
+        }
 
-  @SuppressWarnings("unchecked")
-  public static DataBag transformToBag(List<? extends Object> list, HCatFieldSchema hfs) throws Exception {
-    if (list == null){
-      return null;
+        Map<String, Object> result = new HashMap<String, Object>();
+        for (Entry<String, Object> entry : map.entrySet()) {
+            result.put(entry.getKey(), extractPigObject(entry.getValue(), hfs.getMapValueSchema().get(0)));
+        }
+        return result;
     }
 
-    HCatFieldSchema elementSubFieldSchema = hfs.getArrayElementSchema().getFields().get(0);
-    DataBag db = new DefaultDataBag();
-    for (Object o : list){
-      Tuple tuple;
-      if (elementSubFieldSchema.getType() == Type.STRUCT){
-        tuple = transformToTuple((List<Object>)o, elementSubFieldSchema);
-      } else {
-        // bags always contain tuples
-        tuple = tupFac.newTuple(extractPigObject(o, elementSubFieldSchema));
-      }
-      db.add(tuple);
+    @SuppressWarnings("unchecked")
+    public static DataBag transformToBag(List<? extends Object> list, HCatFieldSchema hfs) throws Exception {
+        if (list == null) {
+            return null;
+        }
+
+        HCatFieldSchema elementSubFieldSchema = hfs.getArrayElementSchema().getFields().get(0);
+        DataBag db = new DefaultDataBag();
+        for (Object o : list) {
+            Tuple tuple;
+            if (elementSubFieldSchema.getType() == Type.STRUCT) {
+                tuple = transformToTuple((List<Object>) o, elementSubFieldSchema);
+            } else {
+                // bags always contain tuples
+                tuple = tupFac.newTuple(extractPigObject(o, elementSubFieldSchema));
+            }
+            db.add(tuple);
+        }
+        return db;
     }
-    return db;
-  }
 
 
-  private static void validateHCatSchemaFollowsPigRules(HCatSchema tblSchema) throws PigException {
-    for(HCatFieldSchema hcatField : tblSchema.getFields()){
-      validateHcatFieldFollowsPigRules(hcatField);
+    private static void validateHCatSchemaFollowsPigRules(HCatSchema tblSchema) throws PigException {
+        for (HCatFieldSchema hcatField : tblSchema.getFields()) {
+            validateHcatFieldFollowsPigRules(hcatField);
+        }
     }
-  }
 
-  private static void validateHcatFieldFollowsPigRules(HCatFieldSchema hcatField) throws PigException {
-    try {
-      Type hType = hcatField.getType();
-      switch(hType){
-      case BOOLEAN:
-        throw new PigException("Incompatible type found in hcat table schema: "+hcatField, PigHCatUtil.PIG_EXCEPTION_CODE);
-      case ARRAY:
-        validateHCatSchemaFollowsPigRules(hcatField.getArrayElementSchema());
-        break;
-      case STRUCT:
-        validateHCatSchemaFollowsPigRules(hcatField.getStructSubSchema());
-        break;
-      case MAP:
-        // key is only string
-        validateHCatSchemaFollowsPigRules(hcatField.getMapValueSchema());
-        break;
-      }
-    } catch (HCatException e) {
-      throw new PigException("Incompatible type found in hcat table schema: "+hcatField, PigHCatUtil.PIG_EXCEPTION_CODE, e);
+    private static void validateHcatFieldFollowsPigRules(HCatFieldSchema hcatField) throws PigException {
+        try {
+            Type hType = hcatField.getType();
+            switch (hType) {
+            case BOOLEAN:
+                throw new PigException("Incompatible type found in hcat table schema: " + hcatField, PigHCatUtil.PIG_EXCEPTION_CODE);
+            case ARRAY:
+                validateHCatSchemaFollowsPigRules(hcatField.getArrayElementSchema());
+                break;
+            case STRUCT:
+                validateHCatSchemaFollowsPigRules(hcatField.getStructSubSchema());
+                break;
+            case MAP:
+                // key is only string
+                validateHCatSchemaFollowsPigRules(hcatField.getMapValueSchema());
+                break;
+            }
+        } catch (HCatException e) {
+            throw new PigException("Incompatible type found in hcat table schema: " + hcatField, PigHCatUtil.PIG_EXCEPTION_CODE, e);
+        }
     }
-  }
 
 
-  public static void validateHCatTableSchemaFollowsPigRules(HCatSchema hcatTableSchema) throws IOException {
-    validateHCatSchemaFollowsPigRules(hcatTableSchema);
-  }
-
-  public static void getConfigFromUDFProperties(Properties p, Configuration config, String propName) {
-    if(p.getProperty(propName) != null){
-      config.set(propName, p.getProperty(propName));
+    public static void validateHCatTableSchemaFollowsPigRules(HCatSchema hcatTableSchema) throws IOException {
+        validateHCatSchemaFollowsPigRules(hcatTableSchema);
     }
-  }
 
-  public static void saveConfigIntoUDFProperties(Properties p, Configuration config, String propName) {
-    if(config.get(propName) != null){
-      p.setProperty(propName, config.get(propName));
+    public static void getConfigFromUDFProperties(Properties p, Configuration config, String propName) {
+        if (p.getProperty(propName) != null) {
+            config.set(propName, p.getProperty(propName));
+        }
     }
-  }
+
+    public static void saveConfigIntoUDFProperties(Properties p, Configuration config, String propName) {
+        if (config.get(propName) != null) {
+            p.setProperty(propName, config.get(propName));
+        }
+    }
 
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/LoadFuncBasedInputFormat.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/LoadFuncBasedInputFormat.java
index 940e2c0..7028865 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/LoadFuncBasedInputFormat.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/LoadFuncBasedInputFormat.java
@@ -40,156 +40,156 @@
 /**
  * based on {@link org.apache.pig.builtin.PigStorage}
  */
-public class LoadFuncBasedInputFormat extends InputFormat<BytesWritable,Tuple> {
+public class LoadFuncBasedInputFormat extends InputFormat<BytesWritable, Tuple> {
 
-  private final LoadFunc loadFunc;
-  private static ResourceFieldSchema[] fields;
-
-  public LoadFuncBasedInputFormat(LoadFunc loadFunc, ResourceSchema dataSchema, String location, Configuration conf) throws IOException {
-
-    this.loadFunc = loadFunc;
-    fields = dataSchema.getFields();
-    
-    // Simulate the frontend call sequence for LoadFunc, in case LoadFunc need to store something into UDFContext (as JsonLoader does)
-    if (loadFunc instanceof LoadMetadata) {
-        ((LoadMetadata)loadFunc).getSchema(location, new Job(conf));
-    }
-  }
-
-  @Override
-  public RecordReader<BytesWritable, Tuple> createRecordReader(
-      InputSplit split, TaskAttemptContext taskContext) throws IOException,
-      InterruptedException {
-    RecordReader<BytesWritable,Tuple> reader = loadFunc.getInputFormat().createRecordReader(split, taskContext);
-    return new LoadFuncBasedRecordReader(reader, loadFunc);
-  }
-
-  @Override
-  public List<InputSplit> getSplits(JobContext jobContext) throws IOException,
-  InterruptedException {
-    try {
-      InputFormat<BytesWritable,Tuple> inpFormat = loadFunc.getInputFormat();
-      return inpFormat.getSplits(jobContext);
-
-    } catch (InterruptedException    e) {
-      throw new IOException(e);
-    }
-  }
-
-  static class LoadFuncBasedRecordReader extends RecordReader<BytesWritable, Tuple> {
-
-    private Tuple tupleFromDisk;
-    private final RecordReader<BytesWritable,Tuple> reader;
     private final LoadFunc loadFunc;
-    private final LoadCaster caster;
+    private static ResourceFieldSchema[] fields;
 
-     /**
-      * @param reader
-      * @param loadFunc
-      * @throws IOException
-      */
-     public LoadFuncBasedRecordReader(RecordReader<BytesWritable,Tuple> reader, LoadFunc loadFunc) throws IOException {
-       this.reader = reader;
-       this.loadFunc = loadFunc;
-       this.caster = loadFunc.getLoadCaster();
-     }
+    public LoadFuncBasedInputFormat(LoadFunc loadFunc, ResourceSchema dataSchema, String location, Configuration conf) throws IOException {
 
-     @Override
-     public void close() throws IOException {
-       reader.close();
-     }
+        this.loadFunc = loadFunc;
+        fields = dataSchema.getFields();
 
-     @Override
-     public BytesWritable getCurrentKey() throws IOException,
-     InterruptedException {
-       return null;
-     }
+        // Simulate the frontend call sequence for LoadFunc, in case LoadFunc need to store something into UDFContext (as JsonLoader does)
+        if (loadFunc instanceof LoadMetadata) {
+            ((LoadMetadata) loadFunc).getSchema(location, new Job(conf));
+        }
+    }
 
-     @Override
-     public Tuple getCurrentValue() throws IOException, InterruptedException {
+    @Override
+    public RecordReader<BytesWritable, Tuple> createRecordReader(
+        InputSplit split, TaskAttemptContext taskContext) throws IOException,
+        InterruptedException {
+        RecordReader<BytesWritable, Tuple> reader = loadFunc.getInputFormat().createRecordReader(split, taskContext);
+        return new LoadFuncBasedRecordReader(reader, loadFunc);
+    }
 
-       for(int i = 0; i < tupleFromDisk.size(); i++) {
+    @Override
+    public List<InputSplit> getSplits(JobContext jobContext) throws IOException,
+        InterruptedException {
+        try {
+            InputFormat<BytesWritable, Tuple> inpFormat = loadFunc.getInputFormat();
+            return inpFormat.getSplits(jobContext);
 
-         Object data = tupleFromDisk.get(i);
-         
-         // We will do conversion for bytes only for now
-         if (data instanceof DataByteArray) {
-         
-             DataByteArray dba = (DataByteArray) data;
-    
-             if(dba == null) {
-               // PigStorage will insert nulls for empty fields.
-              tupleFromDisk.set(i, null);
-              continue;
+        } catch (InterruptedException e) {
+            throw new IOException(e);
+        }
+    }
+
+    static class LoadFuncBasedRecordReader extends RecordReader<BytesWritable, Tuple> {
+
+        private Tuple tupleFromDisk;
+        private final RecordReader<BytesWritable, Tuple> reader;
+        private final LoadFunc loadFunc;
+        private final LoadCaster caster;
+
+        /**
+         * @param reader
+         * @param loadFunc
+         * @throws IOException
+         */
+        public LoadFuncBasedRecordReader(RecordReader<BytesWritable, Tuple> reader, LoadFunc loadFunc) throws IOException {
+            this.reader = reader;
+            this.loadFunc = loadFunc;
+            this.caster = loadFunc.getLoadCaster();
+        }
+
+        @Override
+        public void close() throws IOException {
+            reader.close();
+        }
+
+        @Override
+        public BytesWritable getCurrentKey() throws IOException,
+            InterruptedException {
+            return null;
+        }
+
+        @Override
+        public Tuple getCurrentValue() throws IOException, InterruptedException {
+
+            for (int i = 0; i < tupleFromDisk.size(); i++) {
+
+                Object data = tupleFromDisk.get(i);
+
+                // We will do conversion for bytes only for now
+                if (data instanceof DataByteArray) {
+
+                    DataByteArray dba = (DataByteArray) data;
+
+                    if (dba == null) {
+                        // PigStorage will insert nulls for empty fields.
+                        tupleFromDisk.set(i, null);
+                        continue;
+                    }
+
+                    switch (fields[i].getType()) {
+
+                    case DataType.CHARARRAY:
+                        tupleFromDisk.set(i, caster.bytesToCharArray(dba.get()));
+                        break;
+
+                    case DataType.INTEGER:
+                        tupleFromDisk.set(i, caster.bytesToInteger(dba.get()));
+                        break;
+
+                    case DataType.FLOAT:
+                        tupleFromDisk.set(i, caster.bytesToFloat(dba.get()));
+                        break;
+
+                    case DataType.LONG:
+                        tupleFromDisk.set(i, caster.bytesToLong(dba.get()));
+                        break;
+
+                    case DataType.DOUBLE:
+                        tupleFromDisk.set(i, caster.bytesToDouble(dba.get()));
+                        break;
+
+                    case DataType.MAP:
+                        tupleFromDisk.set(i, caster.bytesToMap(dba.get()));
+                        break;
+
+                    case DataType.BAG:
+                        tupleFromDisk.set(i, caster.bytesToBag(dba.get(), fields[i]));
+                        break;
+
+                    case DataType.TUPLE:
+                        tupleFromDisk.set(i, caster.bytesToTuple(dba.get(), fields[i]));
+                        break;
+
+                    default:
+                        throw new IOException("Unknown Pig type in data: " + fields[i].getType());
+                    }
+                }
             }
-    
-             switch(fields[i].getType()) {
-    
-             case DataType.CHARARRAY:
-               tupleFromDisk.set(i, caster.bytesToCharArray(dba.get()));
-               break;
-    
-             case DataType.INTEGER:
-               tupleFromDisk.set(i, caster.bytesToInteger(dba.get()));
-               break;
-    
-             case DataType.FLOAT:
-               tupleFromDisk.set(i, caster.bytesToFloat(dba.get()));
-               break;
-    
-             case DataType.LONG:
-               tupleFromDisk.set(i, caster.bytesToLong(dba.get()));
-               break;
-    
-             case DataType.DOUBLE:
-               tupleFromDisk.set(i, caster.bytesToDouble(dba.get()));
-               break;
-    
-             case DataType.MAP:
-               tupleFromDisk.set(i, caster.bytesToMap(dba.get()));
-               break;
-    
-             case DataType.BAG:
-               tupleFromDisk.set(i, caster.bytesToBag(dba.get(), fields[i]));
-               break;
-    
-             case DataType.TUPLE:
-               tupleFromDisk.set(i, caster.bytesToTuple(dba.get(), fields[i]));
-               break;
-    
-             default:
-               throw new IOException("Unknown Pig type in data: "+fields[i].getType());
-             }
-           }
-       }
 
-       return tupleFromDisk;
-     }
+            return tupleFromDisk;
+        }
 
 
-     @Override
-     public void initialize(InputSplit split, TaskAttemptContext ctx)
-     throws IOException, InterruptedException {
+        @Override
+        public void initialize(InputSplit split, TaskAttemptContext ctx)
+            throws IOException, InterruptedException {
 
-       reader.initialize(split, ctx);
-       loadFunc.prepareToRead(reader, null);
-     }
+            reader.initialize(split, ctx);
+            loadFunc.prepareToRead(reader, null);
+        }
 
-     @Override
-     public boolean nextKeyValue() throws IOException, InterruptedException {
+        @Override
+        public boolean nextKeyValue() throws IOException, InterruptedException {
 
-       // even if we don't need any data from disk, we will need to call
-       // getNext() on pigStorage() so we know how many rows to emit in our
-       // final output - getNext() will eventually return null when it has
-       // read all disk data and we will know to stop emitting final output
-       tupleFromDisk = loadFunc.getNext();
-       return tupleFromDisk != null;
-     }
+            // even if we don't need any data from disk, we will need to call
+            // getNext() on pigStorage() so we know how many rows to emit in our
+            // final output - getNext() will eventually return null when it has
+            // read all disk data and we will know to stop emitting final output
+            tupleFromDisk = loadFunc.getNext();
+            return tupleFromDisk != null;
+        }
 
-     @Override
-     public float getProgress() throws IOException, InterruptedException {
-       return 0;
-     }
+        @Override
+        public float getProgress() throws IOException, InterruptedException {
+            return 0;
+        }
 
-  }
+    }
 }
diff --git a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/StoreFuncBasedOutputFormat.java b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/StoreFuncBasedOutputFormat.java
index b43c2d2..ba603eb 100644
--- a/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/StoreFuncBasedOutputFormat.java
+++ b/hcatalog-pig-adapter/src/main/java/org/apache/hcatalog/pig/drivers/StoreFuncBasedOutputFormat.java
@@ -38,82 +38,84 @@
 import org.apache.pig.data.Tuple;
 
 public class StoreFuncBasedOutputFormat extends
-        OutputFormat<BytesWritable, Tuple> {
+    OutputFormat<BytesWritable, Tuple> {
 
     private final StoreFuncInterface storeFunc;
-    
+
     public StoreFuncBasedOutputFormat(StoreFuncInterface storeFunc) {
 
         this.storeFunc = storeFunc;
     }
-    
+
     @Override
     public void checkOutputSpecs(JobContext jobContext) throws IOException,
-            InterruptedException {
-        OutputFormat<BytesWritable,Tuple> outputFormat =  storeFunc.getOutputFormat();
+        InterruptedException {
+        OutputFormat<BytesWritable, Tuple> outputFormat = storeFunc.getOutputFormat();
         outputFormat.checkOutputSpecs(jobContext);
     }
 
     @Override
     public OutputCommitter getOutputCommitter(TaskAttemptContext ctx)
-            throws IOException, InterruptedException {
+        throws IOException, InterruptedException {
         String serializedJobInfo = ctx.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
-        OutputJobInfo outputJobInfo = (OutputJobInfo)HCatUtil.deserialize(serializedJobInfo);
+        OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(serializedJobInfo);
         ResourceSchema rs = PigHCatUtil.getResourceSchema(outputJobInfo.getOutputSchema());
         String location = outputJobInfo.getLocation();
-        OutputFormat<BytesWritable,Tuple> outputFormat =  storeFunc.getOutputFormat();
+        OutputFormat<BytesWritable, Tuple> outputFormat = storeFunc.getOutputFormat();
         return new StoreFuncBasedOutputCommitter(storeFunc, outputFormat.getOutputCommitter(ctx), location, rs);
     }
 
     @Override
     public RecordWriter<BytesWritable, Tuple> getRecordWriter(
-            TaskAttemptContext ctx) throws IOException, InterruptedException {
-        RecordWriter<BytesWritable,Tuple> writer = storeFunc.getOutputFormat().getRecordWriter(ctx);
+        TaskAttemptContext ctx) throws IOException, InterruptedException {
+        RecordWriter<BytesWritable, Tuple> writer = storeFunc.getOutputFormat().getRecordWriter(ctx);
         String serializedJobInfo = ctx.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
-        OutputJobInfo outputJobInfo = (OutputJobInfo)HCatUtil.deserialize(serializedJobInfo);
+        OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(serializedJobInfo);
         ResourceSchema rs = PigHCatUtil.getResourceSchema(outputJobInfo.getOutputSchema());
         String location = outputJobInfo.getLocation();
         return new StoreFuncBasedRecordWriter(writer, storeFunc, location, rs);
     }
-    
+
     static class StoreFuncBasedRecordWriter extends RecordWriter<BytesWritable, Tuple> {
-        private final RecordWriter<BytesWritable,Tuple> writer;
+        private final RecordWriter<BytesWritable, Tuple> writer;
         private final StoreFuncInterface storeFunc;
         private final ResourceSchema schema;
         private final String location;
-        
-        public StoreFuncBasedRecordWriter(RecordWriter<BytesWritable,Tuple> writer, StoreFuncInterface sf, String location, ResourceSchema rs) throws IOException {
+
+        public StoreFuncBasedRecordWriter(RecordWriter<BytesWritable, Tuple> writer, StoreFuncInterface sf, String location, ResourceSchema rs) throws IOException {
             this.writer = writer;
             this.storeFunc = sf;
             this.schema = rs;
             this.location = location;
             storeFunc.prepareToWrite(writer);
         }
-        
+
         @Override
         public void close(TaskAttemptContext ctx) throws IOException,
-                InterruptedException {
+            InterruptedException {
             writer.close(ctx);
         }
 
         @Override
         public void write(BytesWritable key, Tuple value) throws IOException,
-                InterruptedException {
+            InterruptedException {
             storeFunc.putNext(value);
         }
     }
-    
+
     static class StoreFuncBasedOutputCommitter extends OutputCommitter {
         StoreFuncInterface sf;
         OutputCommitter wrappedOutputCommitter;
         String location;
         ResourceSchema rs;
+
         public StoreFuncBasedOutputCommitter(StoreFuncInterface sf, OutputCommitter outputCommitter, String location, ResourceSchema rs) {
             this.sf = sf;
             this.wrappedOutputCommitter = outputCommitter;
             this.location = location;
             this.rs = rs;
         }
+
         @Override
         public void abortTask(TaskAttemptContext context) throws IOException {
             wrappedOutputCommitter.abortTask(context);
@@ -126,7 +128,7 @@
 
         @Override
         public boolean needsTaskCommit(TaskAttemptContext context)
-                throws IOException {
+            throws IOException {
             return wrappedOutputCommitter.needsTaskCommit(context);
         }
 
@@ -139,28 +141,28 @@
         public void setupTask(TaskAttemptContext context) throws IOException {
             wrappedOutputCommitter.setupTask(context);
         }
-        
+
         public void commitJob(JobContext context) throws IOException {
             wrappedOutputCommitter.commitJob(context);
             if (sf instanceof StoreMetadata) {
                 if (rs != null) {
                     ((StoreMetadata) sf).storeSchema(
-                            rs, location, new Job(context.getConfiguration()) );
+                        rs, location, new Job(context.getConfiguration()));
                 }
             }
         }
-        
+
         @Override
         public void cleanupJob(JobContext context) throws IOException {
             wrappedOutputCommitter.cleanupJob(context);
             if (sf instanceof StoreMetadata) {
                 if (rs != null) {
                     ((StoreMetadata) sf).storeSchema(
-                            rs, location, new Job(context.getConfiguration()) );
+                        rs, location, new Job(context.getConfiguration()));
                 }
             }
         }
-        
+
         public void abortJob(JobContext context, JobStatus.State state) throws IOException {
             wrappedOutputCommitter.abortJob(context, state);
         }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MockLoader.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MockLoader.java
index d95b1de..de69182 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MockLoader.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MockLoader.java
@@ -40,138 +40,140 @@
 import org.apache.pig.data.Tuple;
 
 public class MockLoader extends LoadFunc {
-  private static final class MockRecordReader extends RecordReader<Object, Object> {
-    @Override
-    public void close() throws IOException {
+    private static final class MockRecordReader extends RecordReader<Object, Object> {
+        @Override
+        public void close() throws IOException {
+        }
+
+        @Override
+        public Object getCurrentKey() throws IOException, InterruptedException {
+            return "mockKey";
+        }
+
+        @Override
+        public Object getCurrentValue() throws IOException, InterruptedException {
+            return "mockValue";
+        }
+
+        @Override
+        public float getProgress() throws IOException, InterruptedException {
+            return 0.5f;
+        }
+
+        @Override
+        public void initialize(InputSplit split, TaskAttemptContext arg1) throws IOException,
+            InterruptedException {
+        }
+
+        @Override
+        public boolean nextKeyValue() throws IOException, InterruptedException {
+            return true;
+        }
     }
 
-    @Override
-    public Object getCurrentKey() throws IOException, InterruptedException {
-      return "mockKey";
+    private static final class MockInputSplit extends InputSplit implements Writable {
+        private String location;
+
+        public MockInputSplit() {
+        }
+
+        public MockInputSplit(String location) {
+            this.location = location;
+        }
+
+        @Override
+        public String[] getLocations() throws IOException, InterruptedException {
+            return new String[]{location};
+        }
+
+        @Override
+        public long getLength() throws IOException, InterruptedException {
+            return 10000000;
+        }
+
+        @Override
+        public boolean equals(Object arg0) {
+            return arg0 == this;
+        }
+
+        @Override
+        public int hashCode() {
+            return location.hashCode();
+        }
+
+        @Override
+        public void readFields(DataInput arg0) throws IOException {
+            location = arg0.readUTF();
+        }
+
+        @Override
+        public void write(DataOutput arg0) throws IOException {
+            arg0.writeUTF(location);
+        }
     }
 
-    @Override
-    public Object getCurrentValue() throws IOException, InterruptedException {
-      return "mockValue";
+    private static final class MockInputFormat extends InputFormat {
+
+        private final String location;
+
+        public MockInputFormat(String location) {
+            this.location = location;
+        }
+
+        @Override
+        public RecordReader createRecordReader(InputSplit arg0, TaskAttemptContext arg1)
+            throws IOException, InterruptedException {
+            return new MockRecordReader();
+        }
+
+        @Override
+        public List getSplits(JobContext arg0) throws IOException, InterruptedException {
+            return Arrays.asList(new MockInputSplit(location));
+        }
     }
 
-    @Override
-    public float getProgress() throws IOException, InterruptedException {
-      return 0.5f;
+    private static final Map<String, Iterable<Tuple>> locationToData = new HashMap<String, Iterable<Tuple>>();
+
+    public static void setData(String location, Iterable<Tuple> data) {
+        locationToData.put(location, data);
     }
 
-    @Override
-    public void initialize(InputSplit split, TaskAttemptContext arg1) throws IOException,
-        InterruptedException {
-    }
-
-    @Override
-    public boolean nextKeyValue() throws IOException, InterruptedException {
-      return true;
-    }
-  }
-
-  private static final class MockInputSplit extends InputSplit implements Writable  {
     private String location;
-    public MockInputSplit() {
-    }
-    public MockInputSplit(String location) {
-      this.location = location;
+
+    private Iterator<Tuple> data;
+
+    @Override
+    public String relativeToAbsolutePath(String location, Path curDir) throws IOException {
+        return location;
     }
 
     @Override
-    public String[] getLocations() throws IOException, InterruptedException {
-      return new String[] { location };
+    public void setLocation(String location, Job job) throws IOException {
+        this.location = location;
+        if (location == null) {
+            throw new IOException("null location passed to MockLoader");
+        }
+        this.data = locationToData.get(location).iterator();
+        if (this.data == null) {
+            throw new IOException("No data configured for location: " + location);
+        }
     }
 
     @Override
-    public long getLength() throws IOException, InterruptedException {
-      return 10000000;
+    public Tuple getNext() throws IOException {
+        if (data == null) {
+            throw new IOException("data was not correctly initialized in MockLoader");
+        }
+        return data.hasNext() ? data.next() : null;
     }
 
     @Override
-    public boolean equals(Object arg0) {
-      return arg0==this;
+    public InputFormat getInputFormat() throws IOException {
+        return new MockInputFormat(location);
     }
 
     @Override
-    public int hashCode() {
-      return location.hashCode();
+    public void prepareToRead(RecordReader arg0, PigSplit arg1) throws IOException {
     }
 
-    @Override
-    public void readFields(DataInput arg0) throws IOException {
-      location = arg0.readUTF();
-    }
-
-    @Override
-    public void write(DataOutput arg0) throws IOException {
-      arg0.writeUTF(location);
-    }
-  }
-
-  private static final class MockInputFormat extends InputFormat {
-
-    private final String location;
-
-    public MockInputFormat(String location) {
-      this.location = location;
-    }
-
-    @Override
-    public RecordReader createRecordReader(InputSplit arg0, TaskAttemptContext arg1)
-        throws IOException, InterruptedException {
-      return new MockRecordReader();
-    }
-
-    @Override
-    public List getSplits(JobContext arg0) throws IOException, InterruptedException {
-      return Arrays.asList(new MockInputSplit(location));
-    }
-  }
-
-  private static final Map<String, Iterable<Tuple>> locationToData = new HashMap<String, Iterable<Tuple>>();
-
-  public static void setData(String location, Iterable<Tuple> data) {
-    locationToData.put(location, data);
-  }
-
-  private String location;
-
-  private Iterator<Tuple> data;
-
-  @Override
-  public String relativeToAbsolutePath(String location, Path curDir) throws IOException {
-    return location;
-  }
-
-  @Override
-  public void setLocation(String location, Job job) throws IOException {
-    this.location = location;
-    if (location == null) {
-      throw new IOException("null location passed to MockLoader");
-    }
-    this.data = locationToData.get(location).iterator();
-    if (this.data == null) {
-      throw new IOException("No data configured for location: "+location);
-    }
-  }
-
-  @Override
-  public Tuple getNext() throws IOException {
-    if (data == null) {
-      throw new IOException("data was not correctly initialized in MockLoader");
-    }
-    return data.hasNext() ? data.next() : null;
-  }
-
-  @Override
-  public InputFormat getInputFormat() throws IOException {
-    return new MockInputFormat(location);
-  }
-
-  @Override
-  public void prepareToRead(RecordReader arg0, PigSplit arg1) throws IOException {
-  }
-
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MyPigStorage.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MyPigStorage.java
index 74e69c4..a37dc1c 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MyPigStorage.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/MyPigStorage.java
@@ -24,15 +24,16 @@
 
 public class MyPigStorage extends PigStorage {
 
-  String arg2;
-  public MyPigStorage(String arg1, String arg2) throws IOException {
-    super(arg1);
-    this.arg2 = arg2;
-  }
-  
-  @Override
-  public void putNext(Tuple t) throws IOException {
-      t.append(arg2);
-      super.putNext(t);
-  }
+    String arg2;
+
+    public MyPigStorage(String arg1, String arg2) throws IOException {
+        super(arg1);
+        this.arg2 = arg2;
+    }
+
+    @Override
+    public void putNext(Tuple t) throws IOException {
+        t.append(arg2);
+        super.putNext(t);
+    }
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoader.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoader.java
index 2a2eb25..da6d13f 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoader.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoader.java
@@ -49,393 +49,395 @@
 import org.apache.pig.impl.logicalLayer.schema.Schema.FieldSchema;
 
 public class TestHCatLoader extends TestCase {
-  private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
-      "/build/test/data/" + TestHCatLoader.class.getCanonicalName();
-  private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
-  private static final String BASIC_FILE_NAME = TEST_DATA_DIR + "/basic.input.data";
-  private static final String COMPLEX_FILE_NAME = TEST_DATA_DIR + "/complex.input.data";
+    private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
+        "/build/test/data/" + TestHCatLoader.class.getCanonicalName();
+    private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
+    private static final String BASIC_FILE_NAME = TEST_DATA_DIR + "/basic.input.data";
+    private static final String COMPLEX_FILE_NAME = TEST_DATA_DIR + "/complex.input.data";
 
-  private static final String BASIC_TABLE = "junit_unparted_basic";
-  private static final String COMPLEX_TABLE = "junit_unparted_complex";
-  private static final String PARTITIONED_TABLE = "junit_parted_basic";
-  private static final String SPECIFIC_SIZE_TABLE = "junit_specific_size";
-  private static Driver driver;
+    private static final String BASIC_TABLE = "junit_unparted_basic";
+    private static final String COMPLEX_TABLE = "junit_unparted_complex";
+    private static final String PARTITIONED_TABLE = "junit_parted_basic";
+    private static final String SPECIFIC_SIZE_TABLE = "junit_specific_size";
+    private static Driver driver;
 
-  private static int guardTestCount = 6; // ugh, instantiate using introspection in guardedSetupBeforeClass
-  private static boolean setupHasRun = false;
+    private static int guardTestCount = 6; // ugh, instantiate using introspection in guardedSetupBeforeClass
+    private static boolean setupHasRun = false;
 
-  private static Map<Integer,Pair<Integer,String>> basicInputData;
+    private static Map<Integer, Pair<Integer, String>> basicInputData;
 
-  private void dropTable(String tablename) throws IOException, CommandNeedRetryException{
-    driver.run("drop table "+tablename);
-  }
-  private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException{
-    String createTable;
-    createTable = "create table "+tablename+"("+schema+") ";
-    if ((partitionedBy != null)&&(!partitionedBy.trim().isEmpty())){
-      createTable = createTable + "partitioned by ("+partitionedBy+") ";
-    }
-    createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
-        "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table. ["+createTable+"], return code from hive driver : ["+retCode+"]");
-    }
-  }
-
-  private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException{
-    createTable(tablename,schema,null);
-  }
-
-  protected void guardedSetUpBeforeClass() throws Exception {
-    if (!setupHasRun){
-      setupHasRun = true;
-    }else{
-      return;
+    private void dropTable(String tablename) throws IOException, CommandNeedRetryException {
+        driver.run("drop table " + tablename);
     }
 
-    File f = new File(TEST_WAREHOUSE_DIR);
-    if (f.exists()) {
-      FileUtil.fullyDelete(f);
-    }
-    new File(TEST_WAREHOUSE_DIR).mkdirs();
-
-    HiveConf hiveConf = new HiveConf(this.getClass());
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
-    driver = new Driver(hiveConf);
-    SessionState.start(new CliSessionState(hiveConf));
-
-    cleanup();
-
-    createTable(BASIC_TABLE,"a int, b string");
-    createTable(COMPLEX_TABLE,
-        "name string, studentid int, "
-        + "contact struct<phno:string,email:string>, "
-        + "currently_registered_courses array<string>, "
-        + "current_grades map<string,string>, "
-        + "phnos array<struct<phno:string,type:string>>");
-
-    createTable(PARTITIONED_TABLE,"a int, b string","bkt string");
-    createTable(SPECIFIC_SIZE_TABLE, "a int, b string");
-
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    basicInputData = new HashMap<Integer,Pair<Integer,String>>();
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        String sj = "S"+j+"S";
-        input[k] = si + "\t" + sj;
-        basicInputData.put(k, new Pair<Integer,String>(i,sj));
-        k++;
-      }
-    }
-    HcatTestUtils.createTestDataFile(BASIC_FILE_NAME, input);
-    HcatTestUtils.createTestDataFile(COMPLEX_FILE_NAME,
-        new String[]{
-            //"Henry Jekyll\t42\t(415-253-6367,hjekyll@contemporary.edu.uk)\t{(PHARMACOLOGY),(PSYCHIATRY)},[PHARMACOLOGY#A-,PSYCHIATRY#B+],{(415-253-6367,cell),(408-253-6367,landline)}",
-            //"Edward Hyde\t1337\t(415-253-6367,anonymous@b44chan.org)\t{(CREATIVE_WRITING),(COPYRIGHT_LAW)},[CREATIVE_WRITING#A+,COPYRIGHT_LAW#D],{(415-253-6367,cell),(408-253-6367,landline)}",
+    private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException {
+        String createTable;
+        createTable = "create table " + tablename + "(" + schema + ") ";
+        if ((partitionedBy != null) && (!partitionedBy.trim().isEmpty())) {
+            createTable = createTable + "partitioned by (" + partitionedBy + ") ";
         }
-    );
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+BASIC_FILE_NAME+"' as (a:int, b:chararray);");
-
-    server.registerQuery("store A into '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatStorer();");
-    server.registerQuery("store A into '" + SPECIFIC_SIZE_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
-    server.registerQuery("B = foreach A generate a,b;");
-    server.registerQuery("B2 = filter B by a < 2;");
-    server.registerQuery("store B2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
-
-    server.registerQuery("C = foreach A generate a,b;");
-    server.registerQuery("C2 = filter C by a >= 2;");
-    server.registerQuery("store C2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
-
-    server.registerQuery("D = load '"+COMPLEX_FILE_NAME+"' as (name:chararray, studentid:int, contact:tuple(phno:chararray,email:chararray), currently_registered_courses:bag{innertup:tuple(course:chararray)}, current_grades:map[ ] , phnos :bag{innertup:tuple(phno:chararray,type:chararray)});");
-    server.registerQuery("store D into '"+COMPLEX_TABLE+"' using org.apache.hcatalog.pig.HCatStorer();");
-    server.executeBatch();
-
-  }
-  private void cleanup() throws IOException, CommandNeedRetryException {
-    dropTable(BASIC_TABLE);
-    dropTable(COMPLEX_TABLE);
-    dropTable(PARTITIONED_TABLE);
-    dropTable(SPECIFIC_SIZE_TABLE);
-  }
-
-  protected void guardedTearDownAfterClass() throws Exception {
-    guardTestCount--;
-    if (guardTestCount > 0){
-      return;
-    }
-    cleanup();
-  }
-
-  @Override
-  protected void setUp() throws Exception {
-    guardedSetUpBeforeClass();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    guardedTearDownAfterClass();
-  }
-
-  public void testSchemaLoadBasic() throws IOException{
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-
-    // test that schema was loaded correctly
-    server.registerQuery("X = load '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    Schema dumpedXSchema = server.dumpSchema("X");
-    List<FieldSchema> Xfields = dumpedXSchema.getFields();
-    assertEquals(2,Xfields.size());
-    assertTrue(Xfields.get(0).alias.equalsIgnoreCase("a"));
-    assertTrue(Xfields.get(0).type == DataType.INTEGER);
-    assertTrue(Xfields.get(1).alias.equalsIgnoreCase("b"));
-    assertTrue(Xfields.get(1).type == DataType.CHARARRAY);
-
-  }
-
-  public void testReadDataBasic() throws IOException {
-    PigServer server = new PigServer(ExecType.LOCAL);
-
-    server.registerQuery("X = load '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    Iterator<Tuple> XIter = server.openIterator("X");
-    int numTuplesRead = 0;
-    while( XIter.hasNext() ){
-      Tuple t = XIter.next();
-      assertEquals(2,t.size());
-      assertTrue(t.get(0).getClass() == Integer.class);
-      assertTrue(t.get(1).getClass() == String.class);
-      assertEquals(t.get(0),basicInputData.get(numTuplesRead).first);
-      assertEquals(t.get(1),basicInputData.get(numTuplesRead).second);
-      numTuplesRead++;
-    }
-    assertEquals(basicInputData.size(),numTuplesRead);
-  }
-
-  public void testSchemaLoadComplex() throws IOException{
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-
-    // test that schema was loaded correctly
-    server.registerQuery("K = load '"+COMPLEX_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    Schema dumpedKSchema = server.dumpSchema("K");
-    List<FieldSchema> Kfields = dumpedKSchema.getFields();
-    assertEquals(6, Kfields.size());
-
-    assertEquals(DataType.CHARARRAY,Kfields.get(0).type);
-    assertEquals("name",Kfields.get(0).alias.toLowerCase());
-
-    assertEquals( DataType.INTEGER,Kfields.get(1).type);
-    assertEquals("studentid", Kfields.get(1).alias.toLowerCase());
-
-    assertEquals(DataType.TUPLE, Kfields.get(2).type);
-    assertEquals("contact", Kfields.get(2).alias.toLowerCase());
-    {
-      assertNotNull(Kfields.get(2).schema);
-      assertTrue(Kfields.get(2).schema.getFields().size() == 2);
-      assertTrue(Kfields.get(2).schema.getFields().get(0).type == DataType.CHARARRAY);
-      assertTrue(Kfields.get(2).schema.getFields().get(0).alias.equalsIgnoreCase("phno"));
-      assertTrue(Kfields.get(2).schema.getFields().get(1).type == DataType.CHARARRAY);
-      assertTrue(Kfields.get(2).schema.getFields().get(1).alias.equalsIgnoreCase("email"));
-    }
-    assertEquals(DataType.BAG, Kfields.get(3).type);
-    assertEquals("currently_registered_courses", Kfields.get(3).alias.toLowerCase());
-    {
-      assertNotNull(Kfields.get(3).schema);
-      assertEquals(1,Kfields.get(3).schema.getFields().size());
-      assertEquals(DataType.TUPLE,Kfields.get(3).schema.getFields().get(0).type);
-      assertNotNull(Kfields.get(3).schema.getFields().get(0).schema);
-      assertEquals(1,Kfields.get(3).schema.getFields().get(0).schema.getFields().size());
-      assertEquals(DataType.CHARARRAY,Kfields.get(3).schema.getFields().get(0).schema.getFields().get(0).type);
-      // assertEquals("course",Kfields.get(3).schema.getFields().get(0).schema.getFields().get(0).alias.toLowerCase());
-      // commented out, because the name becomes "innerfield" by default - we call it "course" in pig,
-      // but in the metadata, it'd be anonymous, so this would be autogenerated, which is fine
-    }
-    assertEquals(DataType.MAP,Kfields.get(4).type);
-    assertEquals("current_grades",Kfields.get(4).alias.toLowerCase());
-    assertEquals(DataType.BAG,Kfields.get(5).type);
-    assertEquals("phnos", Kfields.get(5).alias.toLowerCase());
-    {
-      assertNotNull(Kfields.get(5).schema);
-      assertEquals(1,Kfields.get(5).schema.getFields().size());
-      assertEquals(DataType.TUPLE,Kfields.get(5).schema.getFields().get(0).type);
-      assertNotNull(Kfields.get(5).schema.getFields().get(0).schema);
-      assertTrue(Kfields.get(5).schema.getFields().get(0).schema.getFields().size() == 2);
-      assertEquals(DataType.CHARARRAY,Kfields.get(5).schema.getFields().get(0).schema.getFields().get(0).type);
-      assertEquals("phno",Kfields.get(5).schema.getFields().get(0).schema.getFields().get(0).alias.toLowerCase());
-      assertEquals(DataType.CHARARRAY,Kfields.get(5).schema.getFields().get(0).schema.getFields().get(1).type);
-      assertEquals("type",Kfields.get(5).schema.getFields().get(0).schema.getFields().get(1).alias.toLowerCase());
+        createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
+            "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table. [" + createTable + "], return code from hive driver : [" + retCode + "]");
+        }
     }
 
-  }
-
-  public void testReadPartitionedBasic() throws IOException, CommandNeedRetryException {
-    PigServer server = new PigServer(ExecType.LOCAL);
-
-    driver.run("select * from "+PARTITIONED_TABLE);
-    ArrayList<String> valuesReadFromHiveDriver = new ArrayList<String>();
-    driver.getResults(valuesReadFromHiveDriver);
-    assertEquals(basicInputData.size(), valuesReadFromHiveDriver.size());
-
-    server.registerQuery("W = load '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    Schema dumpedWSchema = server.dumpSchema("W");
-    List<FieldSchema> Wfields = dumpedWSchema.getFields();
-    assertEquals(3,Wfields.size());
-    assertTrue(Wfields.get(0).alias.equalsIgnoreCase("a"));
-    assertTrue(Wfields.get(0).type == DataType.INTEGER);
-    assertTrue(Wfields.get(1).alias.equalsIgnoreCase("b"));
-    assertTrue(Wfields.get(1).type == DataType.CHARARRAY);
-    assertTrue(Wfields.get(2).alias.equalsIgnoreCase("bkt"));
-    assertTrue(Wfields.get(2).type == DataType.CHARARRAY);
-
-    Iterator<Tuple> WIter = server.openIterator("W");
-    Collection<Pair<Integer,String>> valuesRead = new ArrayList<Pair<Integer,String>>();
-    while( WIter.hasNext() ){
-      Tuple t = WIter.next();
-      assertTrue(t.size() == 3);
-      assertTrue(t.get(0).getClass() == Integer.class);
-      assertTrue(t.get(1).getClass() == String.class);
-      assertTrue(t.get(2).getClass() == String.class);
-      valuesRead.add(new Pair<Integer,String>((Integer)t.get(0),(String)t.get(1)));
-      if ((Integer)t.get(0) < 2){
-        assertEquals("0",t.get(2));
-      }else{
-        assertEquals("1",t.get(2));
-      }
+    private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException {
+        createTable(tablename, schema, null);
     }
-    assertEquals(valuesReadFromHiveDriver.size(),valuesRead.size());
 
-    server.registerQuery("P1 = load '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    server.registerQuery("P1filter = filter P1 by bkt == '0';");
-    Iterator<Tuple> P1Iter = server.openIterator("P1filter");
-    int count1 = 0;
-    while( P1Iter.hasNext() ) {
-      Tuple t = P1Iter.next();
+    protected void guardedSetUpBeforeClass() throws Exception {
+        if (!setupHasRun) {
+            setupHasRun = true;
+        } else {
+            return;
+        }
 
-      assertEquals("0", t.get(2));
-      assertEquals(1, t.get(0));
-      count1++;
+        File f = new File(TEST_WAREHOUSE_DIR);
+        if (f.exists()) {
+            FileUtil.fullyDelete(f);
+        }
+        new File(TEST_WAREHOUSE_DIR).mkdirs();
+
+        HiveConf hiveConf = new HiveConf(this.getClass());
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
+        driver = new Driver(hiveConf);
+        SessionState.start(new CliSessionState(hiveConf));
+
+        cleanup();
+
+        createTable(BASIC_TABLE, "a int, b string");
+        createTable(COMPLEX_TABLE,
+            "name string, studentid int, "
+                + "contact struct<phno:string,email:string>, "
+                + "currently_registered_courses array<string>, "
+                + "current_grades map<string,string>, "
+                + "phnos array<struct<phno:string,type:string>>");
+
+        createTable(PARTITIONED_TABLE, "a int, b string", "bkt string");
+        createTable(SPECIFIC_SIZE_TABLE, "a int, b string");
+
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        basicInputData = new HashMap<Integer, Pair<Integer, String>>();
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                String sj = "S" + j + "S";
+                input[k] = si + "\t" + sj;
+                basicInputData.put(k, new Pair<Integer, String>(i, sj));
+                k++;
+            }
+        }
+        HcatTestUtils.createTestDataFile(BASIC_FILE_NAME, input);
+        HcatTestUtils.createTestDataFile(COMPLEX_FILE_NAME,
+            new String[]{
+                //"Henry Jekyll\t42\t(415-253-6367,hjekyll@contemporary.edu.uk)\t{(PHARMACOLOGY),(PSYCHIATRY)},[PHARMACOLOGY#A-,PSYCHIATRY#B+],{(415-253-6367,cell),(408-253-6367,landline)}",
+                //"Edward Hyde\t1337\t(415-253-6367,anonymous@b44chan.org)\t{(CREATIVE_WRITING),(COPYRIGHT_LAW)},[CREATIVE_WRITING#A+,COPYRIGHT_LAW#D],{(415-253-6367,cell),(408-253-6367,landline)}",
+            }
+        );
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + BASIC_FILE_NAME + "' as (a:int, b:chararray);");
+
+        server.registerQuery("store A into '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
+        server.registerQuery("store A into '" + SPECIFIC_SIZE_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
+        server.registerQuery("B = foreach A generate a,b;");
+        server.registerQuery("B2 = filter B by a < 2;");
+        server.registerQuery("store B2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
+
+        server.registerQuery("C = foreach A generate a,b;");
+        server.registerQuery("C2 = filter C by a >= 2;");
+        server.registerQuery("store C2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
+
+        server.registerQuery("D = load '" + COMPLEX_FILE_NAME + "' as (name:chararray, studentid:int, contact:tuple(phno:chararray,email:chararray), currently_registered_courses:bag{innertup:tuple(course:chararray)}, current_grades:map[ ] , phnos :bag{innertup:tuple(phno:chararray,type:chararray)});");
+        server.registerQuery("store D into '" + COMPLEX_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
+        server.executeBatch();
+
     }
-    assertEquals(3, count1);
 
-    server.registerQuery("P2 = load '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    server.registerQuery("P2filter = filter P2 by bkt == '1';");
-    Iterator<Tuple> P2Iter = server.openIterator("P2filter");
-    int count2 = 0;
-    while( P2Iter.hasNext() ) {
-      Tuple t = P2Iter.next();
-
-      assertEquals("1", t.get(2));
-      assertTrue(((Integer) t.get(0)) > 1);
-      count2++;
+    private void cleanup() throws IOException, CommandNeedRetryException {
+        dropTable(BASIC_TABLE);
+        dropTable(COMPLEX_TABLE);
+        dropTable(PARTITIONED_TABLE);
+        dropTable(SPECIFIC_SIZE_TABLE);
     }
-    assertEquals(6, count2);
-  }
 
-  public void testProjectionsBasic() throws IOException {
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-
-    // projections are handled by using generate, not "as" on the Load
-
-    server.registerQuery("Y1 = load '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatLoader();");
-    server.registerQuery("Y2 = foreach Y1 generate a;");
-    server.registerQuery("Y3 = foreach Y1 generate b,a;");
-    Schema dumpedY2Schema = server.dumpSchema("Y2");
-    Schema dumpedY3Schema = server.dumpSchema("Y3");
-    List<FieldSchema> Y2fields = dumpedY2Schema.getFields();
-    List<FieldSchema> Y3fields = dumpedY3Schema.getFields();
-    assertEquals(1,Y2fields.size());
-    assertEquals("a",Y2fields.get(0).alias.toLowerCase());
-    assertEquals(DataType.INTEGER,Y2fields.get(0).type);
-    assertEquals(2,Y3fields.size());
-    assertEquals("b",Y3fields.get(0).alias.toLowerCase());
-    assertEquals(DataType.CHARARRAY,Y3fields.get(0).type);
-    assertEquals("a",Y3fields.get(1).alias.toLowerCase());
-    assertEquals(DataType.INTEGER,Y3fields.get(1).type);
-
-    int numTuplesRead = 0;
-    Iterator<Tuple> Y2Iter = server.openIterator("Y2");
-    while( Y2Iter.hasNext() ){
-      Tuple t = Y2Iter.next();
-      assertEquals(t.size(),1);
-      assertTrue(t.get(0).getClass() == Integer.class);
-      assertEquals(t.get(0),basicInputData.get(numTuplesRead).first);
-      numTuplesRead++;
+    protected void guardedTearDownAfterClass() throws Exception {
+        guardTestCount--;
+        if (guardTestCount > 0) {
+            return;
+        }
+        cleanup();
     }
-    numTuplesRead = 0;
-    Iterator<Tuple> Y3Iter = server.openIterator("Y3");
-    while( Y3Iter.hasNext() ){
-      Tuple t = Y3Iter.next();
-      assertEquals(t.size(),2);
-      assertTrue(t.get(0).getClass() == String.class);
-      assertEquals(t.get(0),basicInputData.get(numTuplesRead).second);
-      assertTrue(t.get(1).getClass() == Integer.class);
-      assertEquals(t.get(1),basicInputData.get(numTuplesRead).first);
-      numTuplesRead++;
+
+    @Override
+    protected void setUp() throws Exception {
+        guardedSetUpBeforeClass();
     }
-    assertEquals(basicInputData.size(),numTuplesRead);
-  }
 
-  public void testGetInputBytes() throws Exception {
-    File file = new File(TEST_WAREHOUSE_DIR + "/" + SPECIFIC_SIZE_TABLE + "/part-m-00000");
-    file.deleteOnExit();
-    RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
-    randomAccessFile.setLength(2L * 1024 * 1024 * 1024);
+    @Override
+    protected void tearDown() throws Exception {
+        guardedTearDownAfterClass();
+    }
 
-    Job job = new Job();
-    HCatLoader hCatLoader = new HCatLoader();
-    hCatLoader.setUDFContextSignature(this.getName());
-    hCatLoader.setLocation(SPECIFIC_SIZE_TABLE, job);
-    ResourceStatistics statistics = hCatLoader.getStatistics(file.getAbsolutePath(), job);
-    assertEquals(2048, (long) statistics.getmBytes());
-  }
+    public void testSchemaLoadBasic() throws IOException {
 
-  public void testConvertBooleanToInt() throws Exception {
-    String tbl = "test_convert_boolean_to_int";
-    String inputFileName = TEST_DATA_DIR + "/testConvertBooleanToInt/data.txt";
-    File inputDataDir = new File(inputFileName).getParentFile();
-    inputDataDir.mkdir();
+        PigServer server = new PigServer(ExecType.LOCAL);
 
-    String[] lines = new String[] {"llama\t1", "alpaca\t0"};
-    HcatTestUtils.createTestDataFile(inputFileName, lines);
+        // test that schema was loaded correctly
+        server.registerQuery("X = load '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        Schema dumpedXSchema = server.dumpSchema("X");
+        List<FieldSchema> Xfields = dumpedXSchema.getFields();
+        assertEquals(2, Xfields.size());
+        assertTrue(Xfields.get(0).alias.equalsIgnoreCase("a"));
+        assertTrue(Xfields.get(0).type == DataType.INTEGER);
+        assertTrue(Xfields.get(1).alias.equalsIgnoreCase("b"));
+        assertTrue(Xfields.get(1).type == DataType.CHARARRAY);
 
-    assertEquals(0, driver.run("drop table if exists " + tbl).getResponseCode());
-    assertEquals(0, driver.run("create external table " + tbl +
-        " (a string, b boolean) row format delimited fields terminated by '\t'" +
-        " stored as textfile location 'file://" +
-        inputDataDir.getAbsolutePath() + "'").getResponseCode());
+    }
 
-    Properties properties = new Properties();
-    properties.setProperty(HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER, "true");
-    PigServer server = new PigServer(ExecType.LOCAL, properties);
-    server.registerQuery(
-        "data = load 'test_convert_boolean_to_int' using org.apache.hcatalog.pig.HCatLoader();");
-    Schema schema = server.dumpSchema("data");
-    assertEquals(2, schema.getFields().size());
+    public void testReadDataBasic() throws IOException {
+        PigServer server = new PigServer(ExecType.LOCAL);
 
-    assertEquals("a", schema.getField(0).alias);
-    assertEquals(DataType.CHARARRAY, schema.getField(0).type);
-    assertEquals("b", schema.getField(1).alias);
-    assertEquals(DataType.INTEGER, schema.getField(1).type);
+        server.registerQuery("X = load '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        Iterator<Tuple> XIter = server.openIterator("X");
+        int numTuplesRead = 0;
+        while (XIter.hasNext()) {
+            Tuple t = XIter.next();
+            assertEquals(2, t.size());
+            assertTrue(t.get(0).getClass() == Integer.class);
+            assertTrue(t.get(1).getClass() == String.class);
+            assertEquals(t.get(0), basicInputData.get(numTuplesRead).first);
+            assertEquals(t.get(1), basicInputData.get(numTuplesRead).second);
+            numTuplesRead++;
+        }
+        assertEquals(basicInputData.size(), numTuplesRead);
+    }
 
-    Iterator<Tuple> iterator = server.openIterator("data");
-    Tuple t = iterator.next();
-    assertEquals("llama", t.get(0));
-    // TODO: Figure out how to load a text file into Hive with boolean columns. This next assert
-    // passes because data was loaded as integers, not because it was converted.
-    assertEquals(1, t.get(1));
-    t = iterator.next();
-    assertEquals("alpaca", t.get(0));
-    assertEquals(0, t.get(1));
-    assertFalse(iterator.hasNext());
-  }
+    public void testSchemaLoadComplex() throws IOException {
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+
+        // test that schema was loaded correctly
+        server.registerQuery("K = load '" + COMPLEX_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        Schema dumpedKSchema = server.dumpSchema("K");
+        List<FieldSchema> Kfields = dumpedKSchema.getFields();
+        assertEquals(6, Kfields.size());
+
+        assertEquals(DataType.CHARARRAY, Kfields.get(0).type);
+        assertEquals("name", Kfields.get(0).alias.toLowerCase());
+
+        assertEquals(DataType.INTEGER, Kfields.get(1).type);
+        assertEquals("studentid", Kfields.get(1).alias.toLowerCase());
+
+        assertEquals(DataType.TUPLE, Kfields.get(2).type);
+        assertEquals("contact", Kfields.get(2).alias.toLowerCase());
+        {
+            assertNotNull(Kfields.get(2).schema);
+            assertTrue(Kfields.get(2).schema.getFields().size() == 2);
+            assertTrue(Kfields.get(2).schema.getFields().get(0).type == DataType.CHARARRAY);
+            assertTrue(Kfields.get(2).schema.getFields().get(0).alias.equalsIgnoreCase("phno"));
+            assertTrue(Kfields.get(2).schema.getFields().get(1).type == DataType.CHARARRAY);
+            assertTrue(Kfields.get(2).schema.getFields().get(1).alias.equalsIgnoreCase("email"));
+        }
+        assertEquals(DataType.BAG, Kfields.get(3).type);
+        assertEquals("currently_registered_courses", Kfields.get(3).alias.toLowerCase());
+        {
+            assertNotNull(Kfields.get(3).schema);
+            assertEquals(1, Kfields.get(3).schema.getFields().size());
+            assertEquals(DataType.TUPLE, Kfields.get(3).schema.getFields().get(0).type);
+            assertNotNull(Kfields.get(3).schema.getFields().get(0).schema);
+            assertEquals(1, Kfields.get(3).schema.getFields().get(0).schema.getFields().size());
+            assertEquals(DataType.CHARARRAY, Kfields.get(3).schema.getFields().get(0).schema.getFields().get(0).type);
+            // assertEquals("course",Kfields.get(3).schema.getFields().get(0).schema.getFields().get(0).alias.toLowerCase());
+            // commented out, because the name becomes "innerfield" by default - we call it "course" in pig,
+            // but in the metadata, it'd be anonymous, so this would be autogenerated, which is fine
+        }
+        assertEquals(DataType.MAP, Kfields.get(4).type);
+        assertEquals("current_grades", Kfields.get(4).alias.toLowerCase());
+        assertEquals(DataType.BAG, Kfields.get(5).type);
+        assertEquals("phnos", Kfields.get(5).alias.toLowerCase());
+        {
+            assertNotNull(Kfields.get(5).schema);
+            assertEquals(1, Kfields.get(5).schema.getFields().size());
+            assertEquals(DataType.TUPLE, Kfields.get(5).schema.getFields().get(0).type);
+            assertNotNull(Kfields.get(5).schema.getFields().get(0).schema);
+            assertTrue(Kfields.get(5).schema.getFields().get(0).schema.getFields().size() == 2);
+            assertEquals(DataType.CHARARRAY, Kfields.get(5).schema.getFields().get(0).schema.getFields().get(0).type);
+            assertEquals("phno", Kfields.get(5).schema.getFields().get(0).schema.getFields().get(0).alias.toLowerCase());
+            assertEquals(DataType.CHARARRAY, Kfields.get(5).schema.getFields().get(0).schema.getFields().get(1).type);
+            assertEquals("type", Kfields.get(5).schema.getFields().get(0).schema.getFields().get(1).alias.toLowerCase());
+        }
+
+    }
+
+    public void testReadPartitionedBasic() throws IOException, CommandNeedRetryException {
+        PigServer server = new PigServer(ExecType.LOCAL);
+
+        driver.run("select * from " + PARTITIONED_TABLE);
+        ArrayList<String> valuesReadFromHiveDriver = new ArrayList<String>();
+        driver.getResults(valuesReadFromHiveDriver);
+        assertEquals(basicInputData.size(), valuesReadFromHiveDriver.size());
+
+        server.registerQuery("W = load '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        Schema dumpedWSchema = server.dumpSchema("W");
+        List<FieldSchema> Wfields = dumpedWSchema.getFields();
+        assertEquals(3, Wfields.size());
+        assertTrue(Wfields.get(0).alias.equalsIgnoreCase("a"));
+        assertTrue(Wfields.get(0).type == DataType.INTEGER);
+        assertTrue(Wfields.get(1).alias.equalsIgnoreCase("b"));
+        assertTrue(Wfields.get(1).type == DataType.CHARARRAY);
+        assertTrue(Wfields.get(2).alias.equalsIgnoreCase("bkt"));
+        assertTrue(Wfields.get(2).type == DataType.CHARARRAY);
+
+        Iterator<Tuple> WIter = server.openIterator("W");
+        Collection<Pair<Integer, String>> valuesRead = new ArrayList<Pair<Integer, String>>();
+        while (WIter.hasNext()) {
+            Tuple t = WIter.next();
+            assertTrue(t.size() == 3);
+            assertTrue(t.get(0).getClass() == Integer.class);
+            assertTrue(t.get(1).getClass() == String.class);
+            assertTrue(t.get(2).getClass() == String.class);
+            valuesRead.add(new Pair<Integer, String>((Integer) t.get(0), (String) t.get(1)));
+            if ((Integer) t.get(0) < 2) {
+                assertEquals("0", t.get(2));
+            } else {
+                assertEquals("1", t.get(2));
+            }
+        }
+        assertEquals(valuesReadFromHiveDriver.size(), valuesRead.size());
+
+        server.registerQuery("P1 = load '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        server.registerQuery("P1filter = filter P1 by bkt == '0';");
+        Iterator<Tuple> P1Iter = server.openIterator("P1filter");
+        int count1 = 0;
+        while (P1Iter.hasNext()) {
+            Tuple t = P1Iter.next();
+
+            assertEquals("0", t.get(2));
+            assertEquals(1, t.get(0));
+            count1++;
+        }
+        assertEquals(3, count1);
+
+        server.registerQuery("P2 = load '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        server.registerQuery("P2filter = filter P2 by bkt == '1';");
+        Iterator<Tuple> P2Iter = server.openIterator("P2filter");
+        int count2 = 0;
+        while (P2Iter.hasNext()) {
+            Tuple t = P2Iter.next();
+
+            assertEquals("1", t.get(2));
+            assertTrue(((Integer) t.get(0)) > 1);
+            count2++;
+        }
+        assertEquals(6, count2);
+    }
+
+    public void testProjectionsBasic() throws IOException {
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+
+        // projections are handled by using generate, not "as" on the Load
+
+        server.registerQuery("Y1 = load '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatLoader();");
+        server.registerQuery("Y2 = foreach Y1 generate a;");
+        server.registerQuery("Y3 = foreach Y1 generate b,a;");
+        Schema dumpedY2Schema = server.dumpSchema("Y2");
+        Schema dumpedY3Schema = server.dumpSchema("Y3");
+        List<FieldSchema> Y2fields = dumpedY2Schema.getFields();
+        List<FieldSchema> Y3fields = dumpedY3Schema.getFields();
+        assertEquals(1, Y2fields.size());
+        assertEquals("a", Y2fields.get(0).alias.toLowerCase());
+        assertEquals(DataType.INTEGER, Y2fields.get(0).type);
+        assertEquals(2, Y3fields.size());
+        assertEquals("b", Y3fields.get(0).alias.toLowerCase());
+        assertEquals(DataType.CHARARRAY, Y3fields.get(0).type);
+        assertEquals("a", Y3fields.get(1).alias.toLowerCase());
+        assertEquals(DataType.INTEGER, Y3fields.get(1).type);
+
+        int numTuplesRead = 0;
+        Iterator<Tuple> Y2Iter = server.openIterator("Y2");
+        while (Y2Iter.hasNext()) {
+            Tuple t = Y2Iter.next();
+            assertEquals(t.size(), 1);
+            assertTrue(t.get(0).getClass() == Integer.class);
+            assertEquals(t.get(0), basicInputData.get(numTuplesRead).first);
+            numTuplesRead++;
+        }
+        numTuplesRead = 0;
+        Iterator<Tuple> Y3Iter = server.openIterator("Y3");
+        while (Y3Iter.hasNext()) {
+            Tuple t = Y3Iter.next();
+            assertEquals(t.size(), 2);
+            assertTrue(t.get(0).getClass() == String.class);
+            assertEquals(t.get(0), basicInputData.get(numTuplesRead).second);
+            assertTrue(t.get(1).getClass() == Integer.class);
+            assertEquals(t.get(1), basicInputData.get(numTuplesRead).first);
+            numTuplesRead++;
+        }
+        assertEquals(basicInputData.size(), numTuplesRead);
+    }
+
+    public void testGetInputBytes() throws Exception {
+        File file = new File(TEST_WAREHOUSE_DIR + "/" + SPECIFIC_SIZE_TABLE + "/part-m-00000");
+        file.deleteOnExit();
+        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
+        randomAccessFile.setLength(2L * 1024 * 1024 * 1024);
+
+        Job job = new Job();
+        HCatLoader hCatLoader = new HCatLoader();
+        hCatLoader.setUDFContextSignature(this.getName());
+        hCatLoader.setLocation(SPECIFIC_SIZE_TABLE, job);
+        ResourceStatistics statistics = hCatLoader.getStatistics(file.getAbsolutePath(), job);
+        assertEquals(2048, (long) statistics.getmBytes());
+    }
+
+    public void testConvertBooleanToInt() throws Exception {
+        String tbl = "test_convert_boolean_to_int";
+        String inputFileName = TEST_DATA_DIR + "/testConvertBooleanToInt/data.txt";
+        File inputDataDir = new File(inputFileName).getParentFile();
+        inputDataDir.mkdir();
+
+        String[] lines = new String[]{"llama\t1", "alpaca\t0"};
+        HcatTestUtils.createTestDataFile(inputFileName, lines);
+
+        assertEquals(0, driver.run("drop table if exists " + tbl).getResponseCode());
+        assertEquals(0, driver.run("create external table " + tbl +
+            " (a string, b boolean) row format delimited fields terminated by '\t'" +
+            " stored as textfile location 'file://" +
+            inputDataDir.getAbsolutePath() + "'").getResponseCode());
+
+        Properties properties = new Properties();
+        properties.setProperty(HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER, "true");
+        PigServer server = new PigServer(ExecType.LOCAL, properties);
+        server.registerQuery(
+            "data = load 'test_convert_boolean_to_int' using org.apache.hcatalog.pig.HCatLoader();");
+        Schema schema = server.dumpSchema("data");
+        assertEquals(2, schema.getFields().size());
+
+        assertEquals("a", schema.getField(0).alias);
+        assertEquals(DataType.CHARARRAY, schema.getField(0).type);
+        assertEquals("b", schema.getField(1).alias);
+        assertEquals(DataType.INTEGER, schema.getField(1).type);
+
+        Iterator<Tuple> iterator = server.openIterator("data");
+        Tuple t = iterator.next();
+        assertEquals("llama", t.get(0));
+        // TODO: Figure out how to load a text file into Hive with boolean columns. This next assert
+        // passes because data was loaded as integers, not because it was converted.
+        assertEquals(1, t.get(1));
+        t = iterator.next();
+        assertEquals("alpaca", t.get(0));
+        assertEquals(0, t.get(1));
+        assertFalse(iterator.hasNext());
+    }
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderComplexSchema.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderComplexSchema.java
index 4b20785..bb82ee8 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderComplexSchema.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderComplexSchema.java
@@ -50,239 +50,252 @@
 
 public class TestHCatLoaderComplexSchema {
 
-  //private static MiniCluster cluster = MiniCluster.buildCluster();
-  private static Driver driver;
-  //private static Properties props;
-  private static final Logger LOG = LoggerFactory.getLogger(TestHCatLoaderComplexSchema.class);
-  private void dropTable(String tablename) throws IOException, CommandNeedRetryException{
-    driver.run("drop table "+tablename);
-  }
+    //private static MiniCluster cluster = MiniCluster.buildCluster();
+    private static Driver driver;
+    //private static Properties props;
+    private static final Logger LOG = LoggerFactory.getLogger(TestHCatLoaderComplexSchema.class);
 
-  private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException{
-    String createTable;
-    createTable = "create table "+tablename+"("+schema+") ";
-    if ((partitionedBy != null)&&(!partitionedBy.trim().isEmpty())){
-      createTable = createTable + "partitioned by ("+partitionedBy+") ";
+    private void dropTable(String tablename) throws IOException, CommandNeedRetryException {
+        driver.run("drop table " + tablename);
     }
-    createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
-        "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
-    LOG.info("Creating table:\n {}", createTable);
-    CommandProcessorResponse result = driver.run(createTable);
-    int retCode = result.getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table. ["+createTable+"], return code from hive driver : ["+retCode+" "+result.getErrorMessage()+"]");
+
+    private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException {
+        String createTable;
+        createTable = "create table " + tablename + "(" + schema + ") ";
+        if ((partitionedBy != null) && (!partitionedBy.trim().isEmpty())) {
+            createTable = createTable + "partitioned by (" + partitionedBy + ") ";
+        }
+        createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
+            "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
+        LOG.info("Creating table:\n {}", createTable);
+        CommandProcessorResponse result = driver.run(createTable);
+        int retCode = result.getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table. [" + createTable + "], return code from hive driver : [" + retCode + " " + result.getErrorMessage() + "]");
+        }
     }
-  }
 
-  private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException{
-    createTable(tablename,schema,null);
-  }
+    private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException {
+        createTable(tablename, schema, null);
+    }
 
-  @BeforeClass
-  public static void setUpBeforeClass() throws Exception {
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
 
-    HiveConf hiveConf = new HiveConf(TestHCatLoaderComplexSchema.class  );
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    driver = new Driver(hiveConf);
-    SessionState.start(new CliSessionState(hiveConf));
-    //props = new Properties();
-    //props.setProperty("fs.default.name", cluster.getProperties().getProperty("fs.default.name"));
+        HiveConf hiveConf = new HiveConf(TestHCatLoaderComplexSchema.class);
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        driver = new Driver(hiveConf);
+        SessionState.start(new CliSessionState(hiveConf));
+        //props = new Properties();
+        //props.setProperty("fs.default.name", cluster.getProperties().getProperty("fs.default.name"));
 
-  }
+    }
 
-  private static final TupleFactory tf = TupleFactory.getInstance();
-  private static final BagFactory bf = BagFactory.getInstance();
-  private Tuple t(Object... objects) {
-    return tf.newTuple(Arrays.asList(objects));
-  }
-  private DataBag b(Tuple... objects) {
-    return bf.newDefaultBag(Arrays.asList(objects));
-  }
+    private static final TupleFactory tf = TupleFactory.getInstance();
+    private static final BagFactory bf = BagFactory.getInstance();
 
-  /**
-   * artificially complex nested schema to test nested schema conversion
-   * @throws Exception
-   */
-  @Test
-  public void testSyntheticComplexSchema() throws Exception {
-    String pigSchema =
-        "(" +
-          "a: " +
+    private Tuple t(Object... objects) {
+        return tf.newTuple(Arrays.asList(objects));
+    }
+
+    private DataBag b(Tuple... objects) {
+        return bf.newDefaultBag(Arrays.asList(objects));
+    }
+
+    /**
+     * artificially complex nested schema to test nested schema conversion
+     * @throws Exception
+     */
+    @Test
+    public void testSyntheticComplexSchema() throws Exception {
+        String pigSchema =
             "(" +
-              "aa: chararray, " +
-              "ab: long, " +
-              "ac: map[], " +
-              "ad: { t: (ada: long) }, " +
-              "ae: { t: (aea:long, aeb: ( aeba: chararray, aebb: long)) }," +
-              "af: (afa: chararray, afb: long) " +
-            ")," +
-           "b: chararray, " +
-           "c: long, " +
-           "d:  { t: (da:long, db: ( dba: chararray, dbb: long), dc: { t: (dca: long) } ) } " +
-         ")";
+                "a: " +
+                "(" +
+                "aa: chararray, " +
+                "ab: long, " +
+                "ac: map[], " +
+                "ad: { t: (ada: long) }, " +
+                "ae: { t: (aea:long, aeb: ( aeba: chararray, aebb: long)) }," +
+                "af: (afa: chararray, afb: long) " +
+                ")," +
+                "b: chararray, " +
+                "c: long, " +
+                "d:  { t: (da:long, db: ( dba: chararray, dbb: long), dc: { t: (dca: long) } ) } " +
+                ")";
 
-    // with extra structs
-    String tableSchema =
-        "a struct<" +
-            "aa: string, " +
-            "ab: bigint, " +
-            "ac: map<string, string>, " +
-            "ad: array<struct<ada:bigint>>, " +
-            "ae: array<struct<aea:bigint, aeb: struct<aeba: string, aebb: bigint>>>," +
-            "af: struct<afa: string, afb: bigint> " +
-            ">, " +
-        "b string, " +
-        "c bigint, " +
-        "d array<struct<da: bigint, db: struct<dba:string, dbb:bigint>, dc: array<struct<dca: bigint>>>>";
+        // with extra structs
+        String tableSchema =
+            "a struct<" +
+                "aa: string, " +
+                "ab: bigint, " +
+                "ac: map<string, string>, " +
+                "ad: array<struct<ada:bigint>>, " +
+                "ae: array<struct<aea:bigint, aeb: struct<aeba: string, aebb: bigint>>>," +
+                "af: struct<afa: string, afb: bigint> " +
+                ">, " +
+                "b string, " +
+                "c bigint, " +
+                "d array<struct<da: bigint, db: struct<dba:string, dbb:bigint>, dc: array<struct<dca: bigint>>>>";
 
-    // without extra structs
-    String tableSchema2 =
-        "a struct<" +
-            "aa: string, " +
-            "ab: bigint, " +
-            "ac: map<string, string>, " +
-            "ad: array<bigint>, " +
-            "ae: array<struct<aea:bigint, aeb: struct<aeba: string, aebb: bigint>>>," +
-            "af: struct<afa: string, afb: bigint> " +
-            ">, " +
-        "b string, " +
-        "c bigint, " +
-        "d array<struct<da: bigint, db: struct<dba:string, dbb:bigint>, dc: array<bigint>>>";
+        // without extra structs
+        String tableSchema2 =
+            "a struct<" +
+                "aa: string, " +
+                "ab: bigint, " +
+                "ac: map<string, string>, " +
+                "ad: array<bigint>, " +
+                "ae: array<struct<aea:bigint, aeb: struct<aeba: string, aebb: bigint>>>," +
+                "af: struct<afa: string, afb: bigint> " +
+                ">, " +
+                "b string, " +
+                "c bigint, " +
+                "d array<struct<da: bigint, db: struct<dba:string, dbb:bigint>, dc: array<bigint>>>";
 
-    List<Tuple> data = new ArrayList<Tuple>();
-    for (int i = 0; i < 10; i++) {
-      Tuple t = t(
-          t(
-              "aa test",
-              2l,
-              new HashMap<String, String>() {{put("ac test1", "test 1");put("ac test2", "test 2");}},
-              b(t(3l), t(4l)),
-              b(t(5l, t("aeba test", 6l))),
-              t("afa test", 7l)
-          ),
-          "b test",
-          (long)i,
-          b(t(8l, t("dba test", 9l), b(t(10l)))));
+        List<Tuple> data = new ArrayList<Tuple>();
+        for (int i = 0; i < 10; i++) {
+            Tuple t = t(
+                t(
+                    "aa test",
+                    2l,
+                    new HashMap<String, String>() {
+                        {
+                            put("ac test1", "test 1");
+                            put("ac test2", "test 2");
+                        }
+                    },
+                    b(t(3l), t(4l)),
+                    b(t(5l, t("aeba test", 6l))),
+                    t("afa test", 7l)
+                ),
+                "b test",
+                (long) i,
+                b(t(8l, t("dba test", 9l), b(t(10l)))));
 
-      data.add(t);
+            data.add(t);
+        }
+        verifyWriteRead("testSyntheticComplexSchema", pigSchema, tableSchema, data, true);
+        verifyWriteRead("testSyntheticComplexSchema", pigSchema, tableSchema, data, false);
+        verifyWriteRead("testSyntheticComplexSchema2", pigSchema, tableSchema2, data, true);
+        verifyWriteRead("testSyntheticComplexSchema2", pigSchema, tableSchema2, data, false);
+
     }
-    verifyWriteRead("testSyntheticComplexSchema", pigSchema, tableSchema, data, true);
-    verifyWriteRead("testSyntheticComplexSchema", pigSchema, tableSchema, data, false);
-    verifyWriteRead("testSyntheticComplexSchema2", pigSchema, tableSchema2, data, true);
-    verifyWriteRead("testSyntheticComplexSchema2", pigSchema, tableSchema2, data, false);
 
-  }
+    private void verifyWriteRead(String tablename, String pigSchema, String tableSchema, List<Tuple> data, boolean provideSchemaToStorer)
+        throws IOException, CommandNeedRetryException, ExecException, FrontendException {
+        MockLoader.setData(tablename + "Input", data);
+        try {
+            createTable(tablename, tableSchema);
+            PigServer server = new PigServer(ExecType.LOCAL);
+            server.setBatchOn();
+            server.registerQuery("A = load '" + tablename + "Input' using org.apache.hcatalog.pig.MockLoader() AS " + pigSchema + ";");
+            Schema dumpedASchema = server.dumpSchema("A");
+            server.registerQuery("STORE A into '" + tablename + "' using org.apache.hcatalog.pig.HCatStorer("
+                + (provideSchemaToStorer ? "'', '" + pigSchema + "'" : "")
+                + ");");
 
-  private void verifyWriteRead(String tablename, String pigSchema, String tableSchema, List<Tuple> data, boolean provideSchemaToStorer)
-      throws IOException, CommandNeedRetryException, ExecException, FrontendException {
-    MockLoader.setData(tablename+"Input", data);
-    try {
-      createTable(tablename, tableSchema);
-      PigServer server = new PigServer(ExecType.LOCAL);
-      server.setBatchOn();
-      server.registerQuery("A = load '"+tablename+"Input' using org.apache.hcatalog.pig.MockLoader() AS "+pigSchema+";");
-      Schema dumpedASchema = server.dumpSchema("A");
-      server.registerQuery("STORE A into '"+tablename+"' using org.apache.hcatalog.pig.HCatStorer("
-          + (provideSchemaToStorer ? "'', '"+pigSchema+"'" : "")
-          + ");");
+            ExecJob execJob = server.executeBatch().get(0);
+            if (!execJob.getStatistics().isSuccessful()) {
+                throw new RuntimeException("Import failed", execJob.getException());
+            }
+            // test that schema was loaded correctly
+            server.registerQuery("X = load '" + tablename + "' using org.apache.hcatalog.pig.HCatLoader();");
+            server.dumpSchema("X");
+            Iterator<Tuple> it = server.openIterator("X");
+            int i = 0;
+            while (it.hasNext()) {
+                Tuple input = data.get(i++);
+                Tuple output = it.next();
+                Assert.assertEquals(input.toString(), output.toString());
+                LOG.info("tuple : {} ", output);
+            }
+            Schema dumpedXSchema = server.dumpSchema("X");
 
-      ExecJob execJob = server.executeBatch().get(0);
-      if (!execJob.getStatistics().isSuccessful()) {
-        throw new RuntimeException("Import failed", execJob.getException());
-      }
-      // test that schema was loaded correctly
-      server.registerQuery("X = load '"+tablename+"' using org.apache.hcatalog.pig.HCatLoader();");
-      server.dumpSchema("X");
-      Iterator<Tuple> it = server.openIterator("X");
-      int i = 0;
-      while (it.hasNext()) {
-        Tuple input = data.get(i++);
-        Tuple output = it.next();
-        Assert.assertEquals(input.toString(), output.toString());
-        LOG.info("tuple : {} ",output);
-      }
-      Schema dumpedXSchema = server.dumpSchema("X");
+            Assert.assertEquals(
+                "expected " + dumpedASchema + " but was " + dumpedXSchema + " (ignoring field names)",
+                "",
+                compareIgnoreFiledNames(dumpedASchema, dumpedXSchema));
 
-      Assert.assertEquals(
-          "expected " + dumpedASchema + " but was " + dumpedXSchema + " (ignoring field names)",
-          "",
-          compareIgnoreFiledNames(dumpedASchema, dumpedXSchema));
-
-    } finally {
-      dropTable(tablename);
+        } finally {
+            dropTable(tablename);
+        }
     }
-  }
 
-  private String compareIgnoreFiledNames(Schema expected, Schema got) throws FrontendException {
-    if (expected == null || got == null) {
-      if (expected == got) {
-        return "";
-      } else {
-        return "\nexpected "+expected+" got "+got;
-      }
+    private String compareIgnoreFiledNames(Schema expected, Schema got) throws FrontendException {
+        if (expected == null || got == null) {
+            if (expected == got) {
+                return "";
+            } else {
+                return "\nexpected " + expected + " got " + got;
+            }
+        }
+        if (expected.size() != got.size()) {
+            return "\nsize expected " + expected.size() + " (" + expected + ") got " + got.size() + " (" + got + ")";
+        }
+        String message = "";
+        for (int i = 0; i < expected.size(); i++) {
+            FieldSchema expectedField = expected.getField(i);
+            FieldSchema gotField = got.getField(i);
+            if (expectedField.type != gotField.type) {
+                message += "\ntype expected " + expectedField.type + " (" + expectedField + ") got " + gotField.type + " (" + gotField + ")";
+            } else {
+                message += compareIgnoreFiledNames(expectedField.schema, gotField.schema);
+            }
+        }
+        return message;
     }
-    if (expected.size() != got.size()) {
-      return "\nsize expected "+expected.size()+" ("+expected+") got "+got.size()+" ("+got+")";
+
+    /**
+     * tests that unnecessary tuples are drop while converting schema
+     * (Pig requires Tuples in Bags)
+     * @throws Exception
+     */
+    @Test
+    public void testTupleInBagInTupleInBag() throws Exception {
+        String pigSchema = "(a: { b : ( c: { d: (i : long) } ) })";
+
+        String tableSchema = "a array< array< bigint > >";
+
+        List<Tuple> data = new ArrayList<Tuple>();
+        data.add(t(b(t(b(t(100l), t(101l))), t(b(t(110l))))));
+        data.add(t(b(t(b(t(200l))), t(b(t(210l))), t(b(t(220l))))));
+        data.add(t(b(t(b(t(300l), t(301l))))));
+        data.add(t(b(t(b(t(400l))), t(b(t(410l), t(411l), t(412l))))));
+
+
+        verifyWriteRead("TupleInBagInTupleInBag1", pigSchema, tableSchema, data, true);
+        verifyWriteRead("TupleInBagInTupleInBag2", pigSchema, tableSchema, data, false);
+
+        // test that we don't drop the unnecessary tuple if the table has the corresponding Struct
+        String tableSchema2 = "a array< struct< c: array< struct< i: bigint > > > >";
+
+        verifyWriteRead("TupleInBagInTupleInBag3", pigSchema, tableSchema2, data, true);
+        verifyWriteRead("TupleInBagInTupleInBag4", pigSchema, tableSchema2, data, false);
+
     }
-    String message = "";
-    for (int i = 0; i < expected.size(); i++) {
-      FieldSchema expectedField = expected.getField(i);
-      FieldSchema gotField = got.getField(i);
-      if (expectedField.type != gotField.type) {
-        message += "\ntype expected "+expectedField.type+" ("+expectedField+") got "+gotField.type+" ("+gotField+")";
-      } else {
-        message += compareIgnoreFiledNames(expectedField.schema, gotField.schema);
-      }
+
+    @Test
+    public void testMapWithComplexData() throws Exception {
+        String pigSchema = "(a: long, b: map[])";
+        String tableSchema = "a bigint, b map<string, struct<aa:bigint, ab:string>>";
+
+        List<Tuple> data = new ArrayList<Tuple>();
+        for (int i = 0; i < 10; i++) {
+            Tuple t = t(
+                (long) i,
+                new HashMap<String, Object>() {
+                    {
+                        put("b test 1", t(1l, "test 1"));
+                        put("b test 2", t(2l, "test 2"));
+                    }
+                });
+
+            data.add(t);
+        }
+        verifyWriteRead("testMapWithComplexData", pigSchema, tableSchema, data, true);
+        verifyWriteRead("testMapWithComplexData2", pigSchema, tableSchema, data, false);
+
     }
-    return message;
-  }
-
-  /**
-   * tests that unnecessary tuples are drop while converting schema
-   * (Pig requires Tuples in Bags)
-   * @throws Exception
-   */
-  @Test
-  public void testTupleInBagInTupleInBag() throws Exception {
-    String pigSchema = "(a: { b : ( c: { d: (i : long) } ) })";
-
-    String tableSchema = "a array< array< bigint > >";
-
-    List<Tuple> data = new ArrayList<Tuple>();
-    data.add(t(b(t(b(t(100l),t(101l))), t(b(t(110l))))));
-    data.add(t(b(t(b(t(200l))), t(b(t(210l))), t(b(t(220l))))));
-    data.add(t(b(t(b(t(300l),t(301l))))));
-    data.add(t(b(t(b(t(400l))), t(b(t(410l),t(411l),t(412l))))));
-
-
-    verifyWriteRead("TupleInBagInTupleInBag1", pigSchema, tableSchema, data, true);
-    verifyWriteRead("TupleInBagInTupleInBag2", pigSchema, tableSchema, data, false);
-
-    // test that we don't drop the unnecessary tuple if the table has the corresponding Struct
-    String tableSchema2 = "a array< struct< c: array< struct< i: bigint > > > >";
-
-    verifyWriteRead("TupleInBagInTupleInBag3", pigSchema, tableSchema2, data, true);
-    verifyWriteRead("TupleInBagInTupleInBag4", pigSchema, tableSchema2, data, false);
-
-  }
-
-  @Test
-  public void testMapWithComplexData() throws Exception {
-    String pigSchema = "(a: long, b: map[])";
-    String tableSchema = "a bigint, b map<string, struct<aa:bigint, ab:string>>";
-
-    List<Tuple> data = new ArrayList<Tuple>();
-    for (int i = 0; i < 10; i++) {
-      Tuple t = t(
-          (long)i,
-          new HashMap<String, Object>() {{put("b test 1", t(1l,"test 1"));put("b test 2", t(2l, "test 2"));}});
-
-      data.add(t);
-    }
-  verifyWriteRead("testMapWithComplexData", pigSchema, tableSchema, data, true);
-  verifyWriteRead("testMapWithComplexData2", pigSchema, tableSchema, data, false);
-
-  }
- }
+}
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderStorer.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderStorer.java
index ed04581..e6cb139 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderStorer.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatLoaderStorer.java
@@ -40,101 +40,101 @@
  */
 public class TestHCatLoaderStorer extends HCatBaseTest {
 
-  /**
-   * Ensure Pig can read/write tinyint/smallint columns.
-   */
-  @Test
-  public void testSmallTinyInt() throws Exception {
+    /**
+     * Ensure Pig can read/write tinyint/smallint columns.
+     */
+    @Test
+    public void testSmallTinyInt() throws Exception {
 
-    String readTblName = "test_small_tiny_int";
-    File dataDir = new File(TEST_DATA_DIR + "/testSmallTinyIntData");
-    File dataFile = new File(dataDir, "testSmallTinyInt.tsv");
+        String readTblName = "test_small_tiny_int";
+        File dataDir = new File(TEST_DATA_DIR + "/testSmallTinyIntData");
+        File dataFile = new File(dataDir, "testSmallTinyInt.tsv");
 
-    String writeTblName = "test_small_tiny_int_write";
-    File writeDataFile = new File(TEST_DATA_DIR, writeTblName + ".tsv");
+        String writeTblName = "test_small_tiny_int_write";
+        File writeDataFile = new File(TEST_DATA_DIR, writeTblName + ".tsv");
 
-    FileUtil.fullyDelete(dataDir); // Might not exist
-    Assert.assertTrue(dataDir.mkdir());
+        FileUtil.fullyDelete(dataDir); // Might not exist
+        Assert.assertTrue(dataDir.mkdir());
 
-    HcatTestUtils.createTestDataFile(dataFile.getAbsolutePath(), new String[]{
-        String.format("%d\t%d", Short.MIN_VALUE, Byte.MIN_VALUE),
-        String.format("%d\t%d", Short.MAX_VALUE, Byte.MAX_VALUE)
-    });
+        HcatTestUtils.createTestDataFile(dataFile.getAbsolutePath(), new String[]{
+            String.format("%d\t%d", Short.MIN_VALUE, Byte.MIN_VALUE),
+            String.format("%d\t%d", Short.MAX_VALUE, Byte.MAX_VALUE)
+        });
 
-    // Create a table with smallint/tinyint columns, load data, and query from Hive.
-    Assert.assertEquals(0, driver.run("drop table if exists " + readTblName).getResponseCode());
-    Assert.assertEquals(0, driver.run("create external table " + readTblName +
-        " (my_small_int smallint, my_tiny_int tinyint)" +
-        " row format delimited fields terminated by '\t' stored as textfile").getResponseCode());
-    Assert.assertEquals(0, driver.run("load data local inpath '" +
-        dataDir.getAbsolutePath() + "' into table " + readTblName).getResponseCode());
+        // Create a table with smallint/tinyint columns, load data, and query from Hive.
+        Assert.assertEquals(0, driver.run("drop table if exists " + readTblName).getResponseCode());
+        Assert.assertEquals(0, driver.run("create external table " + readTblName +
+            " (my_small_int smallint, my_tiny_int tinyint)" +
+            " row format delimited fields terminated by '\t' stored as textfile").getResponseCode());
+        Assert.assertEquals(0, driver.run("load data local inpath '" +
+            dataDir.getAbsolutePath() + "' into table " + readTblName).getResponseCode());
 
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.registerQuery(
-        "data = load '" + readTblName + "' using org.apache.hcatalog.pig.HCatLoader();");
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.registerQuery(
+            "data = load '" + readTblName + "' using org.apache.hcatalog.pig.HCatLoader();");
 
-    // Ensure Pig schema is correct.
-    Schema schema = server.dumpSchema("data");
-    Assert.assertEquals(2, schema.getFields().size());
-    Assert.assertEquals("my_small_int", schema.getField(0).alias);
-    Assert.assertEquals(DataType.INTEGER, schema.getField(0).type);
-    Assert.assertEquals("my_tiny_int", schema.getField(1).alias);
-    Assert.assertEquals(DataType.INTEGER, schema.getField(1).type);
+        // Ensure Pig schema is correct.
+        Schema schema = server.dumpSchema("data");
+        Assert.assertEquals(2, schema.getFields().size());
+        Assert.assertEquals("my_small_int", schema.getField(0).alias);
+        Assert.assertEquals(DataType.INTEGER, schema.getField(0).type);
+        Assert.assertEquals("my_tiny_int", schema.getField(1).alias);
+        Assert.assertEquals(DataType.INTEGER, schema.getField(1).type);
 
-    // Ensure Pig can read data correctly.
-    Iterator<Tuple> it = server.openIterator("data");
-    Tuple t = it.next();
-    Assert.assertEquals(new Integer(Short.MIN_VALUE), t.get(0));
-    Assert.assertEquals(new Integer(Byte.MIN_VALUE), t.get(1));
-    t = it.next();
-    Assert.assertEquals(new Integer(Short.MAX_VALUE), t.get(0));
-    Assert.assertEquals(new Integer(Byte.MAX_VALUE), t.get(1));
-    Assert.assertFalse(it.hasNext());
+        // Ensure Pig can read data correctly.
+        Iterator<Tuple> it = server.openIterator("data");
+        Tuple t = it.next();
+        Assert.assertEquals(new Integer(Short.MIN_VALUE), t.get(0));
+        Assert.assertEquals(new Integer(Byte.MIN_VALUE), t.get(1));
+        t = it.next();
+        Assert.assertEquals(new Integer(Short.MAX_VALUE), t.get(0));
+        Assert.assertEquals(new Integer(Byte.MAX_VALUE), t.get(1));
+        Assert.assertFalse(it.hasNext());
 
-    // Ensure Pig can write correctly to smallint/tinyint columns. This means values within the
-    // bounds of the column type are written, and values outside throw an exception.
-    Assert.assertEquals(0, driver.run("drop table if exists " + writeTblName).getResponseCode());
-    Assert.assertEquals(0, driver.run("create table " + writeTblName +
-        " (my_small_int smallint, my_tiny_int tinyint) stored as rcfile").getResponseCode());
+        // Ensure Pig can write correctly to smallint/tinyint columns. This means values within the
+        // bounds of the column type are written, and values outside throw an exception.
+        Assert.assertEquals(0, driver.run("drop table if exists " + writeTblName).getResponseCode());
+        Assert.assertEquals(0, driver.run("create table " + writeTblName +
+            " (my_small_int smallint, my_tiny_int tinyint) stored as rcfile").getResponseCode());
 
-    // Values within the column type bounds.
-    HcatTestUtils.createTestDataFile(writeDataFile.getAbsolutePath(), new String[]{
-        String.format("%d\t%d", Short.MIN_VALUE, Byte.MIN_VALUE),
-        String.format("%d\t%d", Short.MAX_VALUE, Byte.MAX_VALUE)
-    });
-    smallTinyIntBoundsCheckHelper(writeDataFile.getAbsolutePath(), ExecJob.JOB_STATUS.COMPLETED);
+        // Values within the column type bounds.
+        HcatTestUtils.createTestDataFile(writeDataFile.getAbsolutePath(), new String[]{
+            String.format("%d\t%d", Short.MIN_VALUE, Byte.MIN_VALUE),
+            String.format("%d\t%d", Short.MAX_VALUE, Byte.MAX_VALUE)
+        });
+        smallTinyIntBoundsCheckHelper(writeDataFile.getAbsolutePath(), ExecJob.JOB_STATUS.COMPLETED);
 
-    // Values outside the column type bounds will fail at runtime.
-    HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/shortTooSmall.tsv", new String[]{
-        String.format("%d\t%d", Short.MIN_VALUE - 1, 0)});
-    smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/shortTooSmall.tsv", ExecJob.JOB_STATUS.FAILED);
+        // Values outside the column type bounds will fail at runtime.
+        HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/shortTooSmall.tsv", new String[]{
+            String.format("%d\t%d", Short.MIN_VALUE - 1, 0)});
+        smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/shortTooSmall.tsv", ExecJob.JOB_STATUS.FAILED);
 
-    HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/shortTooBig.tsv", new String[]{
-        String.format("%d\t%d", Short.MAX_VALUE + 1, 0)});
-    smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/shortTooBig.tsv", ExecJob.JOB_STATUS.FAILED);
+        HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/shortTooBig.tsv", new String[]{
+            String.format("%d\t%d", Short.MAX_VALUE + 1, 0)});
+        smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/shortTooBig.tsv", ExecJob.JOB_STATUS.FAILED);
 
-    HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/byteTooSmall.tsv", new String[]{
-        String.format("%d\t%d", 0, Byte.MIN_VALUE - 1)});
-    smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/byteTooSmall.tsv", ExecJob.JOB_STATUS.FAILED);
+        HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/byteTooSmall.tsv", new String[]{
+            String.format("%d\t%d", 0, Byte.MIN_VALUE - 1)});
+        smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/byteTooSmall.tsv", ExecJob.JOB_STATUS.FAILED);
 
-    HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/byteTooBig.tsv", new String[]{
-        String.format("%d\t%d", 0, Byte.MAX_VALUE + 1)});
-    smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/byteTooBig.tsv", ExecJob.JOB_STATUS.FAILED);
-  }
+        HcatTestUtils.createTestDataFile(TEST_DATA_DIR + "/byteTooBig.tsv", new String[]{
+            String.format("%d\t%d", 0, Byte.MAX_VALUE + 1)});
+        smallTinyIntBoundsCheckHelper(TEST_DATA_DIR + "/byteTooBig.tsv", ExecJob.JOB_STATUS.FAILED);
+    }
 
-  private void smallTinyIntBoundsCheckHelper(String data, ExecJob.JOB_STATUS expectedStatus)
-      throws Exception {
-    Assert.assertEquals(0, driver.run("drop table if exists test_tbl").getResponseCode());
-    Assert.assertEquals(0, driver.run("create table test_tbl" +
-        " (my_small_int smallint, my_tiny_int tinyint) stored as rcfile").getResponseCode());
+    private void smallTinyIntBoundsCheckHelper(String data, ExecJob.JOB_STATUS expectedStatus)
+        throws Exception {
+        Assert.assertEquals(0, driver.run("drop table if exists test_tbl").getResponseCode());
+        Assert.assertEquals(0, driver.run("create table test_tbl" +
+            " (my_small_int smallint, my_tiny_int tinyint) stored as rcfile").getResponseCode());
 
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("data = load '" + data +
-        "' using PigStorage('\t') as (my_small_int:int, my_tiny_int:int);");
-    server.registerQuery(
-        "store data into 'test_tbl' using org.apache.hcatalog.pig.HCatStorer();");
-    List<ExecJob> jobs = server.executeBatch();
-    Assert.assertEquals(expectedStatus, jobs.get(0).getStatus());
-  }
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("data = load '" + data +
+            "' using PigStorage('\t') as (my_small_int:int, my_tiny_int:int);");
+        server.registerQuery(
+            "store data into 'test_tbl' using org.apache.hcatalog.pig.HCatStorer();");
+        List<ExecJob> jobs = server.executeBatch();
+        Assert.assertEquals(expectedStatus, jobs.get(0).getStatus());
+    }
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorer.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorer.java
index c53eacf..2f2c9cb 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorer.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorer.java
@@ -37,562 +37,560 @@
 
 public class TestHCatStorer extends HCatBaseTest {
 
-  private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
-
-  @Test
-  public void testPartColsInData() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int) partitioned by (b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-    int LOOP_SIZE = 11;
-    String[] input = new String[LOOP_SIZE];
-    for(int i = 0; i < LOOP_SIZE; i++) {
-        input[i] = i + "\t1";
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-    server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('b=1');");
-    server.registerQuery("B = load 'default.junit_unparted' using "+HCatLoader.class.getName()+"();");
-    Iterator<Tuple> itr= server.openIterator("B");
-
-    int i = 0;
-
-    while(itr.hasNext()){
-      Tuple t = itr.next();
-      Assert.assertEquals(2, t.size());
-      Assert.assertEquals(t.get(0), i);
-      Assert.assertEquals(t.get(1), "1");
-      i++;
-    }
-
-    Assert.assertFalse(itr.hasNext());
-    Assert.assertEquals(11, i);
-  }
-
-  @Test
-  public void testMultiPartColsInData() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table employee");
-    String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
-        " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
-
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
-                          "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
-                          "111239\tSatya\t01/01/2001\tM\tIN\tKL",
-                          "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
-
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
-    PigServer pig = new PigServer(ExecType.LOCAL);
-    pig.setBatchOn();
-    pig.registerQuery("A = LOAD '"+INPUT_FILE_NAME+"' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
-        "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
-    pig.registerQuery("TN = FILTER A BY emp_state == 'TN';");
-    pig.registerQuery("KA = FILTER A BY emp_state == 'KA';");
-    pig.registerQuery("KL = FILTER A BY emp_state == 'KL';");
-    pig.registerQuery("AP = FILTER A BY emp_state == 'AP';");
-    pig.registerQuery("STORE TN INTO 'employee' USING "+HCatStorer.class.getName()+"('emp_country=IN,emp_state=TN');");
-    pig.registerQuery("STORE KA INTO 'employee' USING "+HCatStorer.class.getName()+"('emp_country=IN,emp_state=KA');");
-    pig.registerQuery("STORE KL INTO 'employee' USING "+HCatStorer.class.getName()+"('emp_country=IN,emp_state=KL');");
-    pig.registerQuery("STORE AP INTO 'employee' USING "+HCatStorer.class.getName()+"('emp_country=IN,emp_state=AP');");
-    pig.executeBatch();
-    driver.run("select * from employee");
-    ArrayList<String> results = new ArrayList<String>();
-    driver.getResults(results);
-    Assert.assertEquals(4, results.size());
-    Collections.sort(results);
-    Assert.assertEquals(inputData[0], results.get(0));
-    Assert.assertEquals(inputData[1], results.get(1));
-    Assert.assertEquals(inputData[2], results.get(2));
-    Assert.assertEquals(inputData[3], results.get(3));
-    driver.run("drop table employee");
-  }
-
-  @Test
-  public void testStoreInPartiitonedTbl() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int) partitioned by (b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-    int LOOP_SIZE = 11;
-    String[] input = new String[LOOP_SIZE];
-    for(int i = 0; i < LOOP_SIZE; i++) {
-        input[i] = i+"";
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int);");
-    server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('b=1');");
-    server.registerQuery("B = load 'default.junit_unparted' using "+HCatLoader.class.getName()+"();");
-    Iterator<Tuple> itr= server.openIterator("B");
-
-    int i = 0;
-
-    while(itr.hasNext()){
-      Tuple t = itr.next();
-      Assert.assertEquals(2, t.size());
-      Assert.assertEquals(t.get(0), i);
-      Assert.assertEquals(t.get(1), "1");
-      i++;
-    }
-
-    Assert.assertFalse(itr.hasNext());
-    Assert.assertEquals(11, i);
-  }
-
-  @Test
-  public void testNoAlias() throws IOException, CommandNeedRetryException{
-    driver.run("drop table junit_parted");
-    String createTable = "create table junit_parted(a int, b string) partitioned by (ds string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-    PigServer server = new PigServer(ExecType.LOCAL);
-    boolean errCaught = false;
-    try{
-      server.setBatchOn();
-      server.registerQuery("A = load '"+ INPUT_FILE_NAME +"' as (a:int, b:chararray);");
-      server.registerQuery("B = foreach A generate a+10, b;");
-      server.registerQuery("store B into 'junit_parted' using "+HCatStorer.class.getName()+"('ds=20100101');");
-      server.executeBatch();
-    }
-    catch(PigException fe){
-      PigException pe = LogUtils.getPigException(fe);
-      Assert.assertTrue(pe instanceof FrontendException);
-      Assert.assertEquals(PigHCatUtil.PIG_EXCEPTION_CODE, pe.getErrorCode());
-      Assert.assertTrue(pe.getMessage().contains("Column name for a field is not specified. Please provide the full schema as an argument to HCatStorer."));
-      errCaught = true;
-    }
-    Assert.assertTrue(errCaught);
-    errCaught = false;
-    try{
-      server.setBatchOn();
-      server.registerQuery("A = load '"+ INPUT_FILE_NAME +"' as (a:int, B:chararray);");
-      server.registerQuery("B = foreach A generate a, B;");
-      server.registerQuery("store B into 'junit_parted' using "+HCatStorer.class.getName()+"('ds=20100101');");
-      server.executeBatch();
-    }
-    catch(PigException fe){
-      PigException pe = LogUtils.getPigException(fe);
-      Assert.assertTrue(pe instanceof FrontendException);
-      Assert.assertEquals(PigHCatUtil.PIG_EXCEPTION_CODE, pe.getErrorCode());
-      Assert.assertTrue(pe.getMessage().contains("Column names should all be in lowercase. Invalid name found: B"));
-      errCaught = true;
-    }
-    driver.run("drop table junit_parted");
-    Assert.assertTrue(errCaught);
-  }
-
-  @Test
-  public void testStoreMultiTables() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-    driver.run("drop table junit_unparted2");
-    createTable = "create table junit_unparted2(a int, b string) stored as RCFILE";
-    retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        input[k++] = si + "\t"+j;
-      }
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+ INPUT_FILE_NAME +"' as (a:int, b:chararray);");
-    server.registerQuery("B = filter A by a < 2;");
-    server.registerQuery("store B into 'junit_unparted' using "+HCatStorer.class.getName()+"();");
-    server.registerQuery("C = filter A by a >= 2;");
-    server.registerQuery("store C into 'junit_unparted2' using "+HCatStorer.class.getName()+"();");
-    server.executeBatch();
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    driver.run("select * from junit_unparted2");
-    ArrayList<String> res2 = new ArrayList<String>();
-    driver.getResults(res2);
-
-    res.addAll(res2);
-    driver.run("drop table junit_unparted");
-    driver.run("drop table junit_unparted2");
-
-    Iterator<String> itr = res.iterator();
-    for(int i = 0; i < LOOP_SIZE*LOOP_SIZE; i++) {
-      Assert.assertEquals( input[i] ,itr.next());
-    }
-
-    Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testStoreWithNoSchema() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        input[k++] = si + "\t"+j;
-      }
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+ INPUT_FILE_NAME +"' as (a:int, b:chararray);");
-    server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('');");
-    server.executeBatch();
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    driver.run("drop table junit_unparted");
-    Iterator<String> itr = res.iterator();
-    for(int i = 0; i < LOOP_SIZE*LOOP_SIZE; i++) {
-      Assert.assertEquals( input[i] ,itr.next());
-    }
-
-    Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testStoreWithNoCtorArgs() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        input[k++] = si + "\t"+j;
-      }
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+ INPUT_FILE_NAME +"' as (a:int, b:chararray);");
-    server.registerQuery("store A into 'junit_unparted' using "+HCatStorer.class.getName()+"();");
-    server.executeBatch();
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    driver.run("drop table junit_unparted");
-    Iterator<String> itr = res.iterator();
-    for(int i = 0; i < LOOP_SIZE*LOOP_SIZE; i++) {
-      Assert.assertEquals( input[i] ,itr.next());
-    }
-
-    Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testEmptyStore() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        input[k++] = si + "\t"+j;
-      }
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-    server.registerQuery("B = filter A by a > 100;");
-    server.registerQuery("store B into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('','a:int,b:chararray');");
-    server.executeBatch();
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    driver.run("drop table junit_unparted");
-    Iterator<String> itr = res.iterator();
-    Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testBagNStruct() throws IOException, CommandNeedRetryException{
-  driver.run("drop table junit_unparted");
-  String createTable = "create table junit_unparted(b string,a struct<a1:int>,  arr_of_struct array<string>, " +
-      "arr_of_struct2 array<struct<s1:string,s2:string>>,  arr_of_struct3 array<struct<s3:string>>) stored as RCFILE";
-  int retCode = driver.run(createTable).getResponseCode();
-  if(retCode != 0) {
-    throw new IOException("Failed to create table.");
-  }
-
-  String[] inputData = new String[]{"zookeeper\t(2)\t{(pig)}\t{(pnuts,hdfs)}\t{(hadoop),(hcat)}",
-      "chubby\t(2)\t{(sawzall)}\t{(bigtable,gfs)}\t{(mapreduce),(hcat)}"};
-
-  HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
-
-  PigServer server = new PigServer(ExecType.LOCAL);
-  server.setBatchOn();
-  server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (b:chararray, a:tuple(a1:int), arr_of_struct:bag{mytup:tuple(s1:chararray)}, arr_of_struct2:bag{mytup:tuple(s1:chararray,s2:chararray)}, arr_of_struct3:bag{t3:tuple(s3:chararray)});");
-  server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('','b:chararray, a:tuple(a1:int)," +
-      " arr_of_struct:bag{mytup:tuple(s1:chararray)}, arr_of_struct2:bag{mytup:tuple(s1:chararray,s2:chararray)}, arr_of_struct3:bag{t3:tuple(s3:chararray)}');");
-  server.executeBatch();
-
-  driver.run("select * from junit_unparted");
-  ArrayList<String> res = new ArrayList<String>();
-  driver.getResults(res);
-  driver.run("drop table junit_unparted");
-  Iterator<String> itr = res.iterator();
-  Assert.assertEquals("zookeeper\t{\"a1\":2}\t[\"pig\"]\t[{\"s1\":\"pnuts\",\"s2\":\"hdfs\"}]\t[{\"s3\":\"hadoop\"},{\"s3\":\"hcat\"}]", itr.next());
-  Assert.assertEquals("chubby\t{\"a1\":2}\t[\"sawzall\"]\t[{\"s1\":\"bigtable\",\"s2\":\"gfs\"}]\t[{\"s3\":\"mapreduce\"},{\"s3\":\"hcat\"}]",itr.next());
- Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testStoreFuncAllSimpleTypes() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b float, c double, d bigint, e string, f binary, g binary) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int i =0;
-    String[] input = new String[3];
-    input[i++]= "0\t\t\t\t\t\t"; //Empty values except first column
-    input[i++]= "\t" + i * 2.1f +"\t"+ i*1.1d + "\t" + i * 2L +"\t"+"lets hcat"+"\tbinary-data"; //First column empty
-    input[i++]= i + "\t" + i * 2.1f +"\t"+ i*1.1d + "\t" + i * 2L +"\t"+"lets hcat"+"\tbinary-data";
-
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:float, c:double, d:long, e:chararray, f:bytearray);");
-    //null gets stored into column g which is a binary field.
-    server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('','a:int, b:float, c:double, d:long, e:chararray,f:bytearray');");
-    server.executeBatch();
-
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-
-    Iterator<String> itr = res.iterator();
-    Assert.assertEquals( "0\tNULL\tNULL\tNULL\tNULL\tnull\tnull" ,itr.next());
-    Assert.assertEquals( "NULL\t4.2\t2.2\t4\tlets hcat\tbinary-data\tnull" ,itr.next());
-    Assert.assertEquals( "3\t6.2999997\t3.3000000000000003\t6\tlets hcat\tbinary-data\tnull",itr.next());
-    Assert.assertFalse(itr.hasNext());
-
-    server.registerQuery("B = load 'junit_unparted' using "+HCatLoader.class.getName()+";");
-    Iterator<Tuple> iter = server.openIterator("B");
-    int count = 0;
-    int num5nulls = 0;
-    while(iter.hasNext()){
-        Tuple t = iter.next();
-        if(t.get(5) == null){
-            num5nulls++;
-        }else {
-          Assert.assertTrue(t.get(5) instanceof DataByteArray);
-        }
-      Assert.assertNull(t.get(6));
-        count++;
-    }
-    Assert.assertEquals(3, count);
-    Assert.assertEquals(1, num5nulls);
-    driver.run("drop table junit_unparted");
-  }
-
-  @Test
-  public void testStoreFuncSimple() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_unparted");
-    String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    int LOOP_SIZE = 3;
-    String[] inputData = new String[LOOP_SIZE*LOOP_SIZE];
-    int k = 0;
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        inputData[k++] = si + "\t"+j;
-      }
-    }
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-    server.registerQuery("store A into 'default.junit_unparted' using "+HCatStorer.class.getName()+"('','a:int,b:chararray');");
-    server.executeBatch();
-
-    driver.run("select * from junit_unparted");
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    driver.run("drop table junit_unparted");
-    Iterator<String> itr = res.iterator();
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        Assert.assertEquals( si + "\t"+j,itr.next());
-      }
-    }
-   Assert.assertFalse(itr.hasNext());
-
-  }
-
-  @Test
-  public void testDynamicPartitioningMultiPartColsInDataPartialSpec() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table if exists employee");
-    String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
-        " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
-
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
-                          "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
-                          "111239\tSatya\t01/01/2001\tM\tIN\tKL",
-                          "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
-
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
-    PigServer pig = new PigServer(ExecType.LOCAL);
-    pig.setBatchOn();
-    pig.registerQuery("A = LOAD '"+INPUT_FILE_NAME+"' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
-        "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
-    pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
-    pig.registerQuery("STORE IN INTO 'employee' USING "+HCatStorer.class.getName()+"('emp_country=IN');");
-    pig.executeBatch();
-    driver.run("select * from employee");
-    ArrayList<String> results = new ArrayList<String>();
-    driver.getResults(results);
-    Assert.assertEquals(4, results.size());
-    Collections.sort(results);
-    Assert.assertEquals(inputData[0], results.get(0));
-    Assert.assertEquals(inputData[1], results.get(1));
-    Assert.assertEquals(inputData[2], results.get(2));
-    Assert.assertEquals(inputData[3], results.get(3));
-    driver.run("drop table employee");
-  }
-
-  @Test
-  public void testDynamicPartitioningMultiPartColsInDataNoSpec() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table if exists employee");
-    String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
-        " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
-
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table.");
-    }
-
-    String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
-                          "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
-                          "111239\tSatya\t01/01/2001\tM\tIN\tKL",
-                          "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
-
-    HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
-    PigServer pig = new PigServer(ExecType.LOCAL);
-    pig.setBatchOn();
-    pig.registerQuery("A = LOAD '"+INPUT_FILE_NAME+"' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
-        "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
-    pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
-    pig.registerQuery("STORE IN INTO 'employee' USING "+HCatStorer.class.getName()+"();");
-    pig.executeBatch();
-    driver.run("select * from employee");
-    ArrayList<String> results = new ArrayList<String>();
-    driver.getResults(results);
-    Assert.assertEquals(4, results.size());
-    Collections.sort(results);
-    Assert.assertEquals(inputData[0], results.get(0));
-    Assert.assertEquals(inputData[1], results.get(1));
-    Assert.assertEquals(inputData[2], results.get(2));
-    Assert.assertEquals(inputData[3], results.get(3));
-    driver.run("drop table employee");
-  }
+    private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
 
     @Test
-    public void testDynamicPartitioningMultiPartColsNoDataInDataNoSpec() throws IOException, CommandNeedRetryException{
+    public void testPartColsInData() throws IOException, CommandNeedRetryException {
 
-      driver.run("drop table if exists employee");
-      String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
-          " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int) partitioned by (b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+        int LOOP_SIZE = 11;
+        String[] input = new String[LOOP_SIZE];
+        for (int i = 0; i < LOOP_SIZE; i++) {
+            input[i] = i + "\t1";
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('b=1');");
+        server.registerQuery("B = load 'default.junit_unparted' using " + HCatLoader.class.getName() + "();");
+        Iterator<Tuple> itr = server.openIterator("B");
 
-      int retCode = driver.run(createTable).getResponseCode();
-      if(retCode != 0) {
-        throw new IOException("Failed to create table.");
-      }
+        int i = 0;
 
-      String[] inputData = {};
-      HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+        while (itr.hasNext()) {
+            Tuple t = itr.next();
+            Assert.assertEquals(2, t.size());
+            Assert.assertEquals(t.get(0), i);
+            Assert.assertEquals(t.get(1), "1");
+            i++;
+        }
 
-      PigServer pig = new PigServer(ExecType.LOCAL);
-      pig.setBatchOn();
-      pig.registerQuery("A = LOAD '"+INPUT_FILE_NAME+"' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
-          "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
-      pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
-      pig.registerQuery("STORE IN INTO 'employee' USING "+HCatStorer.class.getName()+"();");
-      pig.executeBatch();
-      driver.run("select * from employee");
-      ArrayList<String> results = new ArrayList<String>();
-      driver.getResults(results);
-      Assert.assertEquals(0, results.size());
-      driver.run("drop table employee");
+        Assert.assertFalse(itr.hasNext());
+        Assert.assertEquals(11, i);
+    }
+
+    @Test
+    public void testMultiPartColsInData() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table employee");
+        String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
+            " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
+
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
+            "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
+            "111239\tSatya\t01/01/2001\tM\tIN\tKL",
+            "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
+
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+        PigServer pig = new PigServer(ExecType.LOCAL);
+        pig.setBatchOn();
+        pig.registerQuery("A = LOAD '" + INPUT_FILE_NAME + "' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
+            "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
+        pig.registerQuery("TN = FILTER A BY emp_state == 'TN';");
+        pig.registerQuery("KA = FILTER A BY emp_state == 'KA';");
+        pig.registerQuery("KL = FILTER A BY emp_state == 'KL';");
+        pig.registerQuery("AP = FILTER A BY emp_state == 'AP';");
+        pig.registerQuery("STORE TN INTO 'employee' USING " + HCatStorer.class.getName() + "('emp_country=IN,emp_state=TN');");
+        pig.registerQuery("STORE KA INTO 'employee' USING " + HCatStorer.class.getName() + "('emp_country=IN,emp_state=KA');");
+        pig.registerQuery("STORE KL INTO 'employee' USING " + HCatStorer.class.getName() + "('emp_country=IN,emp_state=KL');");
+        pig.registerQuery("STORE AP INTO 'employee' USING " + HCatStorer.class.getName() + "('emp_country=IN,emp_state=AP');");
+        pig.executeBatch();
+        driver.run("select * from employee");
+        ArrayList<String> results = new ArrayList<String>();
+        driver.getResults(results);
+        Assert.assertEquals(4, results.size());
+        Collections.sort(results);
+        Assert.assertEquals(inputData[0], results.get(0));
+        Assert.assertEquals(inputData[1], results.get(1));
+        Assert.assertEquals(inputData[2], results.get(2));
+        Assert.assertEquals(inputData[3], results.get(3));
+        driver.run("drop table employee");
+    }
+
+    @Test
+    public void testStoreInPartiitonedTbl() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int) partitioned by (b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+        int LOOP_SIZE = 11;
+        String[] input = new String[LOOP_SIZE];
+        for (int i = 0; i < LOOP_SIZE; i++) {
+            input[i] = i + "";
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int);");
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('b=1');");
+        server.registerQuery("B = load 'default.junit_unparted' using " + HCatLoader.class.getName() + "();");
+        Iterator<Tuple> itr = server.openIterator("B");
+
+        int i = 0;
+
+        while (itr.hasNext()) {
+            Tuple t = itr.next();
+            Assert.assertEquals(2, t.size());
+            Assert.assertEquals(t.get(0), i);
+            Assert.assertEquals(t.get(1), "1");
+            i++;
+        }
+
+        Assert.assertFalse(itr.hasNext());
+        Assert.assertEquals(11, i);
+    }
+
+    @Test
+    public void testNoAlias() throws IOException, CommandNeedRetryException {
+        driver.run("drop table junit_parted");
+        String createTable = "create table junit_parted(a int, b string) partitioned by (ds string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+        PigServer server = new PigServer(ExecType.LOCAL);
+        boolean errCaught = false;
+        try {
+            server.setBatchOn();
+            server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+            server.registerQuery("B = foreach A generate a+10, b;");
+            server.registerQuery("store B into 'junit_parted' using " + HCatStorer.class.getName() + "('ds=20100101');");
+            server.executeBatch();
+        } catch (PigException fe) {
+            PigException pe = LogUtils.getPigException(fe);
+            Assert.assertTrue(pe instanceof FrontendException);
+            Assert.assertEquals(PigHCatUtil.PIG_EXCEPTION_CODE, pe.getErrorCode());
+            Assert.assertTrue(pe.getMessage().contains("Column name for a field is not specified. Please provide the full schema as an argument to HCatStorer."));
+            errCaught = true;
+        }
+        Assert.assertTrue(errCaught);
+        errCaught = false;
+        try {
+            server.setBatchOn();
+            server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, B:chararray);");
+            server.registerQuery("B = foreach A generate a, B;");
+            server.registerQuery("store B into 'junit_parted' using " + HCatStorer.class.getName() + "('ds=20100101');");
+            server.executeBatch();
+        } catch (PigException fe) {
+            PigException pe = LogUtils.getPigException(fe);
+            Assert.assertTrue(pe instanceof FrontendException);
+            Assert.assertEquals(PigHCatUtil.PIG_EXCEPTION_CODE, pe.getErrorCode());
+            Assert.assertTrue(pe.getMessage().contains("Column names should all be in lowercase. Invalid name found: B"));
+            errCaught = true;
+        }
+        driver.run("drop table junit_parted");
+        Assert.assertTrue(errCaught);
+    }
+
+    @Test
+    public void testStoreMultiTables() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+        driver.run("drop table junit_unparted2");
+        createTable = "create table junit_unparted2(a int, b string) stored as RCFILE";
+        retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                input[k++] = si + "\t" + j;
+            }
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("B = filter A by a < 2;");
+        server.registerQuery("store B into 'junit_unparted' using " + HCatStorer.class.getName() + "();");
+        server.registerQuery("C = filter A by a >= 2;");
+        server.registerQuery("store C into 'junit_unparted2' using " + HCatStorer.class.getName() + "();");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("select * from junit_unparted2");
+        ArrayList<String> res2 = new ArrayList<String>();
+        driver.getResults(res2);
+
+        res.addAll(res2);
+        driver.run("drop table junit_unparted");
+        driver.run("drop table junit_unparted2");
+
+        Iterator<String> itr = res.iterator();
+        for (int i = 0; i < LOOP_SIZE * LOOP_SIZE; i++) {
+            Assert.assertEquals(input[i], itr.next());
+        }
+
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testStoreWithNoSchema() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                input[k++] = si + "\t" + j;
+            }
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('');");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("drop table junit_unparted");
+        Iterator<String> itr = res.iterator();
+        for (int i = 0; i < LOOP_SIZE * LOOP_SIZE; i++) {
+            Assert.assertEquals(input[i], itr.next());
+        }
+
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testStoreWithNoCtorArgs() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                input[k++] = si + "\t" + j;
+            }
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into 'junit_unparted' using " + HCatStorer.class.getName() + "();");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("drop table junit_unparted");
+        Iterator<String> itr = res.iterator();
+        for (int i = 0; i < LOOP_SIZE * LOOP_SIZE; i++) {
+            Assert.assertEquals(input[i], itr.next());
+        }
+
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testEmptyStore() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                input[k++] = si + "\t" + j;
+            }
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("B = filter A by a > 100;");
+        server.registerQuery("store B into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('','a:int,b:chararray');");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("drop table junit_unparted");
+        Iterator<String> itr = res.iterator();
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testBagNStruct() throws IOException, CommandNeedRetryException {
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(b string,a struct<a1:int>,  arr_of_struct array<string>, " +
+            "arr_of_struct2 array<struct<s1:string,s2:string>>,  arr_of_struct3 array<struct<s3:string>>) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        String[] inputData = new String[]{"zookeeper\t(2)\t{(pig)}\t{(pnuts,hdfs)}\t{(hadoop),(hcat)}",
+            "chubby\t(2)\t{(sawzall)}\t{(bigtable,gfs)}\t{(mapreduce),(hcat)}"};
+
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (b:chararray, a:tuple(a1:int), arr_of_struct:bag{mytup:tuple(s1:chararray)}, arr_of_struct2:bag{mytup:tuple(s1:chararray,s2:chararray)}, arr_of_struct3:bag{t3:tuple(s3:chararray)});");
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('','b:chararray, a:tuple(a1:int)," +
+            " arr_of_struct:bag{mytup:tuple(s1:chararray)}, arr_of_struct2:bag{mytup:tuple(s1:chararray,s2:chararray)}, arr_of_struct3:bag{t3:tuple(s3:chararray)}');");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("drop table junit_unparted");
+        Iterator<String> itr = res.iterator();
+        Assert.assertEquals("zookeeper\t{\"a1\":2}\t[\"pig\"]\t[{\"s1\":\"pnuts\",\"s2\":\"hdfs\"}]\t[{\"s3\":\"hadoop\"},{\"s3\":\"hcat\"}]", itr.next());
+        Assert.assertEquals("chubby\t{\"a1\":2}\t[\"sawzall\"]\t[{\"s1\":\"bigtable\",\"s2\":\"gfs\"}]\t[{\"s3\":\"mapreduce\"},{\"s3\":\"hcat\"}]", itr.next());
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testStoreFuncAllSimpleTypes() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b float, c double, d bigint, e string, f binary, g binary) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int i = 0;
+        String[] input = new String[3];
+        input[i++] = "0\t\t\t\t\t\t"; //Empty values except first column
+        input[i++] = "\t" + i * 2.1f + "\t" + i * 1.1d + "\t" + i * 2L + "\t" + "lets hcat" + "\tbinary-data"; //First column empty
+        input[i++] = i + "\t" + i * 2.1f + "\t" + i * 1.1d + "\t" + i * 2L + "\t" + "lets hcat" + "\tbinary-data";
+
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, input);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:float, c:double, d:long, e:chararray, f:bytearray);");
+        //null gets stored into column g which is a binary field.
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('','a:int, b:float, c:double, d:long, e:chararray,f:bytearray');");
+        server.executeBatch();
+
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+
+        Iterator<String> itr = res.iterator();
+        Assert.assertEquals("0\tNULL\tNULL\tNULL\tNULL\tnull\tnull", itr.next());
+        Assert.assertEquals("NULL\t4.2\t2.2\t4\tlets hcat\tbinary-data\tnull", itr.next());
+        Assert.assertEquals("3\t6.2999997\t3.3000000000000003\t6\tlets hcat\tbinary-data\tnull", itr.next());
+        Assert.assertFalse(itr.hasNext());
+
+        server.registerQuery("B = load 'junit_unparted' using " + HCatLoader.class.getName() + ";");
+        Iterator<Tuple> iter = server.openIterator("B");
+        int count = 0;
+        int num5nulls = 0;
+        while (iter.hasNext()) {
+            Tuple t = iter.next();
+            if (t.get(5) == null) {
+                num5nulls++;
+            } else {
+                Assert.assertTrue(t.get(5) instanceof DataByteArray);
+            }
+            Assert.assertNull(t.get(6));
+            count++;
+        }
+        Assert.assertEquals(3, count);
+        Assert.assertEquals(1, num5nulls);
+        driver.run("drop table junit_unparted");
+    }
+
+    @Test
+    public void testStoreFuncSimple() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_unparted");
+        String createTable = "create table junit_unparted(a int, b string) stored as RCFILE";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        int LOOP_SIZE = 3;
+        String[] inputData = new String[LOOP_SIZE * LOOP_SIZE];
+        int k = 0;
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                inputData[k++] = si + "\t" + j;
+            }
+        }
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into 'default.junit_unparted' using " + HCatStorer.class.getName() + "('','a:int,b:chararray');");
+        server.executeBatch();
+
+        driver.run("select * from junit_unparted");
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        driver.run("drop table junit_unparted");
+        Iterator<String> itr = res.iterator();
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                Assert.assertEquals(si + "\t" + j, itr.next());
+            }
+        }
+        Assert.assertFalse(itr.hasNext());
+
+    }
+
+    @Test
+    public void testDynamicPartitioningMultiPartColsInDataPartialSpec() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table if exists employee");
+        String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
+            " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
+
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
+            "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
+            "111239\tSatya\t01/01/2001\tM\tIN\tKL",
+            "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
+
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+        PigServer pig = new PigServer(ExecType.LOCAL);
+        pig.setBatchOn();
+        pig.registerQuery("A = LOAD '" + INPUT_FILE_NAME + "' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
+            "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
+        pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
+        pig.registerQuery("STORE IN INTO 'employee' USING " + HCatStorer.class.getName() + "('emp_country=IN');");
+        pig.executeBatch();
+        driver.run("select * from employee");
+        ArrayList<String> results = new ArrayList<String>();
+        driver.getResults(results);
+        Assert.assertEquals(4, results.size());
+        Collections.sort(results);
+        Assert.assertEquals(inputData[0], results.get(0));
+        Assert.assertEquals(inputData[1], results.get(1));
+        Assert.assertEquals(inputData[2], results.get(2));
+        Assert.assertEquals(inputData[3], results.get(3));
+        driver.run("drop table employee");
+    }
+
+    @Test
+    public void testDynamicPartitioningMultiPartColsInDataNoSpec() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table if exists employee");
+        String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
+            " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
+
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        String[] inputData = {"111237\tKrishna\t01/01/1990\tM\tIN\tTN",
+            "111238\tKalpana\t01/01/2000\tF\tIN\tKA",
+            "111239\tSatya\t01/01/2001\tM\tIN\tKL",
+            "111240\tKavya\t01/01/2002\tF\tIN\tAP"};
+
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+        PigServer pig = new PigServer(ExecType.LOCAL);
+        pig.setBatchOn();
+        pig.registerQuery("A = LOAD '" + INPUT_FILE_NAME + "' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
+            "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
+        pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
+        pig.registerQuery("STORE IN INTO 'employee' USING " + HCatStorer.class.getName() + "();");
+        pig.executeBatch();
+        driver.run("select * from employee");
+        ArrayList<String> results = new ArrayList<String>();
+        driver.getResults(results);
+        Assert.assertEquals(4, results.size());
+        Collections.sort(results);
+        Assert.assertEquals(inputData[0], results.get(0));
+        Assert.assertEquals(inputData[1], results.get(1));
+        Assert.assertEquals(inputData[2], results.get(2));
+        Assert.assertEquals(inputData[3], results.get(3));
+        driver.run("drop table employee");
+    }
+
+    @Test
+    public void testDynamicPartitioningMultiPartColsNoDataInDataNoSpec() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table if exists employee");
+        String createTable = "CREATE TABLE employee (emp_id INT, emp_name STRING, emp_start_date STRING , emp_gender STRING ) " +
+            " PARTITIONED BY (emp_country STRING , emp_state STRING ) STORED AS RCFILE";
+
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table.");
+        }
+
+        String[] inputData = {};
+        HcatTestUtils.createTestDataFile(INPUT_FILE_NAME, inputData);
+
+        PigServer pig = new PigServer(ExecType.LOCAL);
+        pig.setBatchOn();
+        pig.registerQuery("A = LOAD '" + INPUT_FILE_NAME + "' USING PigStorage() AS (emp_id:int,emp_name:chararray,emp_start_date:chararray," +
+            "emp_gender:chararray,emp_country:chararray,emp_state:chararray);");
+        pig.registerQuery("IN = FILTER A BY emp_country == 'IN';");
+        pig.registerQuery("STORE IN INTO 'employee' USING " + HCatStorer.class.getName() + "();");
+        pig.executeBatch();
+        driver.run("select * from employee");
+        ArrayList<String> results = new ArrayList<String>();
+        driver.getResults(results);
+        Assert.assertEquals(0, results.size());
+        driver.run("drop table employee");
     }
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorerMulti.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorerMulti.java
index 7dddad9..98fe887 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorerMulti.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestHCatStorerMulti.java
@@ -37,159 +37,160 @@
 import org.apache.pig.PigServer;
 
 public class TestHCatStorerMulti extends TestCase {
-  private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
-      "/build/test/data/" + TestHCatStorerMulti.class.getCanonicalName();
-  private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
-  private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
+    private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
+        "/build/test/data/" + TestHCatStorerMulti.class.getCanonicalName();
+    private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
+    private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
 
-  private static final String BASIC_TABLE = "junit_unparted_basic";
-  private static final String PARTITIONED_TABLE = "junit_parted_basic";
-  private static Driver driver;
+    private static final String BASIC_TABLE = "junit_unparted_basic";
+    private static final String PARTITIONED_TABLE = "junit_parted_basic";
+    private static Driver driver;
 
-  private static Map<Integer,Pair<Integer,String>> basicInputData;
+    private static Map<Integer, Pair<Integer, String>> basicInputData;
 
-  private void dropTable(String tablename) throws IOException, CommandNeedRetryException{
-    driver.run("drop table "+tablename);
-  }
-  private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException{
-    String createTable;
-    createTable = "create table "+tablename+"("+schema+") ";
-    if ((partitionedBy != null)&&(!partitionedBy.trim().isEmpty())){
-      createTable = createTable + "partitioned by ("+partitionedBy+") ";
-    }
-    createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
-    "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table. ["+createTable+"], return code from hive driver : ["+retCode+"]");
-    }
-  }
-
-  private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException{
-    createTable(tablename,schema,null);
-  }
-
-  @Override
-  protected void setUp() throws Exception {
-    if (driver == null){
-      HiveConf hiveConf = new HiveConf(this.getClass());
-      hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-      hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-      hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-      hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
-      driver = new Driver(hiveConf);
-      SessionState.start(new CliSessionState(hiveConf));
+    private void dropTable(String tablename) throws IOException, CommandNeedRetryException {
+        driver.run("drop table " + tablename);
     }
 
-    cleanup();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    cleanup();
-  }
-
-  public void testStoreBasicTable() throws Exception {
-
-
-    createTable(BASIC_TABLE,"a int, b string");
-
-    populateBasicFile();
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-    server.registerQuery("store A into '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatStorer();");
-
-    server.executeBatch();
-
-    driver.run("select * from "+BASIC_TABLE);
-    ArrayList<String> unpartitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
-    driver.getResults(unpartitionedTableValuesReadFromHiveDriver);
-    assertEquals(basicInputData.size(),unpartitionedTableValuesReadFromHiveDriver.size());
-  }
-
-  public void testStorePartitionedTable() throws Exception {
-    createTable(PARTITIONED_TABLE,"a int, b string","bkt string");
-
-    populateBasicFile();
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-
-    server.registerQuery("B2 = filter A by a < 2;");
-    server.registerQuery("store B2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
-    server.registerQuery("C2 = filter A by a >= 2;");
-    server.registerQuery("store C2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
-
-    server.executeBatch();
-
-    driver.run("select * from "+PARTITIONED_TABLE);
-    ArrayList<String> partitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
-    driver.getResults(partitionedTableValuesReadFromHiveDriver);
-    assertEquals(basicInputData.size(),partitionedTableValuesReadFromHiveDriver.size());
-  }
-
-  public void testStoreTableMulti() throws Exception {
-
-
-    createTable(BASIC_TABLE,"a int, b string");
-    createTable(PARTITIONED_TABLE,"a int, b string","bkt string");
-
-    populateBasicFile();
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-    server.setBatchOn();
-    server.registerQuery("A = load '"+INPUT_FILE_NAME+"' as (a:int, b:chararray);");
-    server.registerQuery("store A into '"+BASIC_TABLE+"' using org.apache.hcatalog.pig.HCatStorer();");
-
-    server.registerQuery("B2 = filter A by a < 2;");
-    server.registerQuery("store B2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
-    server.registerQuery("C2 = filter A by a >= 2;");
-    server.registerQuery("store C2 into '"+PARTITIONED_TABLE+"' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
-
-    server.executeBatch();
-
-    driver.run("select * from "+BASIC_TABLE);
-    ArrayList<String> unpartitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
-    driver.getResults(unpartitionedTableValuesReadFromHiveDriver);
-    driver.run("select * from "+PARTITIONED_TABLE);
-    ArrayList<String> partitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
-    driver.getResults(partitionedTableValuesReadFromHiveDriver);
-    assertEquals(basicInputData.size(),unpartitionedTableValuesReadFromHiveDriver.size());
-    assertEquals(basicInputData.size(),partitionedTableValuesReadFromHiveDriver.size());
-  }
-
-  private void populateBasicFile() throws IOException {
-    int LOOP_SIZE = 3;
-    String[] input = new String[LOOP_SIZE*LOOP_SIZE];
-    basicInputData = new HashMap<Integer,Pair<Integer,String>>();
-    int k = 0;
-    File file = new File(INPUT_FILE_NAME);
-    file.deleteOnExit();
-    FileWriter writer = new FileWriter(file);
-    for(int i = 1; i <= LOOP_SIZE; i++) {
-      String si = i + "";
-      for(int j=1;j<=LOOP_SIZE;j++) {
-        String sj = "S"+j+"S";
-        input[k] = si + "\t" + sj;
-        basicInputData.put(k, new Pair<Integer,String>(i,sj));
-        writer.write(input[k] + "\n");
-        k++;
-      }
+    private void createTable(String tablename, String schema, String partitionedBy) throws IOException, CommandNeedRetryException {
+        String createTable;
+        createTable = "create table " + tablename + "(" + schema + ") ";
+        if ((partitionedBy != null) && (!partitionedBy.trim().isEmpty())) {
+            createTable = createTable + "partitioned by (" + partitionedBy + ") ";
+        }
+        createTable = createTable + "stored as RCFILE tblproperties('hcat.isd'='org.apache.hcatalog.rcfile.RCFileInputDriver'," +
+            "'hcat.osd'='org.apache.hcatalog.rcfile.RCFileOutputDriver') ";
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table. [" + createTable + "], return code from hive driver : [" + retCode + "]");
+        }
     }
-    writer.close();
-  }
 
-  private void cleanup() throws IOException, CommandNeedRetryException {
-    File f = new File(TEST_WAREHOUSE_DIR);
-    if (f.exists()) {
-      FileUtil.fullyDelete(f);
+    private void createTable(String tablename, String schema) throws IOException, CommandNeedRetryException {
+        createTable(tablename, schema, null);
     }
-    new File(TEST_WAREHOUSE_DIR).mkdirs();
 
-    dropTable(BASIC_TABLE);
-    dropTable(PARTITIONED_TABLE);
-  }
+    @Override
+    protected void setUp() throws Exception {
+        if (driver == null) {
+            HiveConf hiveConf = new HiveConf(this.getClass());
+            hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+            hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+            hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+            hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
+            driver = new Driver(hiveConf);
+            SessionState.start(new CliSessionState(hiveConf));
+        }
+
+        cleanup();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        cleanup();
+    }
+
+    public void testStoreBasicTable() throws Exception {
+
+
+        createTable(BASIC_TABLE, "a int, b string");
+
+        populateBasicFile();
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
+
+        server.executeBatch();
+
+        driver.run("select * from " + BASIC_TABLE);
+        ArrayList<String> unpartitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
+        driver.getResults(unpartitionedTableValuesReadFromHiveDriver);
+        assertEquals(basicInputData.size(), unpartitionedTableValuesReadFromHiveDriver.size());
+    }
+
+    public void testStorePartitionedTable() throws Exception {
+        createTable(PARTITIONED_TABLE, "a int, b string", "bkt string");
+
+        populateBasicFile();
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+
+        server.registerQuery("B2 = filter A by a < 2;");
+        server.registerQuery("store B2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
+        server.registerQuery("C2 = filter A by a >= 2;");
+        server.registerQuery("store C2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
+
+        server.executeBatch();
+
+        driver.run("select * from " + PARTITIONED_TABLE);
+        ArrayList<String> partitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
+        driver.getResults(partitionedTableValuesReadFromHiveDriver);
+        assertEquals(basicInputData.size(), partitionedTableValuesReadFromHiveDriver.size());
+    }
+
+    public void testStoreTableMulti() throws Exception {
+
+
+        createTable(BASIC_TABLE, "a int, b string");
+        createTable(PARTITIONED_TABLE, "a int, b string", "bkt string");
+
+        populateBasicFile();
+
+        PigServer server = new PigServer(ExecType.LOCAL);
+        server.setBatchOn();
+        server.registerQuery("A = load '" + INPUT_FILE_NAME + "' as (a:int, b:chararray);");
+        server.registerQuery("store A into '" + BASIC_TABLE + "' using org.apache.hcatalog.pig.HCatStorer();");
+
+        server.registerQuery("B2 = filter A by a < 2;");
+        server.registerQuery("store B2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=0');");
+        server.registerQuery("C2 = filter A by a >= 2;");
+        server.registerQuery("store C2 into '" + PARTITIONED_TABLE + "' using org.apache.hcatalog.pig.HCatStorer('bkt=1');");
+
+        server.executeBatch();
+
+        driver.run("select * from " + BASIC_TABLE);
+        ArrayList<String> unpartitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
+        driver.getResults(unpartitionedTableValuesReadFromHiveDriver);
+        driver.run("select * from " + PARTITIONED_TABLE);
+        ArrayList<String> partitionedTableValuesReadFromHiveDriver = new ArrayList<String>();
+        driver.getResults(partitionedTableValuesReadFromHiveDriver);
+        assertEquals(basicInputData.size(), unpartitionedTableValuesReadFromHiveDriver.size());
+        assertEquals(basicInputData.size(), partitionedTableValuesReadFromHiveDriver.size());
+    }
+
+    private void populateBasicFile() throws IOException {
+        int LOOP_SIZE = 3;
+        String[] input = new String[LOOP_SIZE * LOOP_SIZE];
+        basicInputData = new HashMap<Integer, Pair<Integer, String>>();
+        int k = 0;
+        File file = new File(INPUT_FILE_NAME);
+        file.deleteOnExit();
+        FileWriter writer = new FileWriter(file);
+        for (int i = 1; i <= LOOP_SIZE; i++) {
+            String si = i + "";
+            for (int j = 1; j <= LOOP_SIZE; j++) {
+                String sj = "S" + j + "S";
+                input[k] = si + "\t" + sj;
+                basicInputData.put(k, new Pair<Integer, String>(i, sj));
+                writer.write(input[k] + "\n");
+                k++;
+            }
+        }
+        writer.close();
+    }
+
+    private void cleanup() throws IOException, CommandNeedRetryException {
+        File f = new File(TEST_WAREHOUSE_DIR);
+        if (f.exists()) {
+            FileUtil.fullyDelete(f);
+        }
+        new File(TEST_WAREHOUSE_DIR).mkdirs();
+
+        dropTable(BASIC_TABLE);
+        dropTable(PARTITIONED_TABLE);
+    }
 }
diff --git a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestPigHCatUtil.java b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestPigHCatUtil.java
index 0ce1088..73a6e73 100644
--- a/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestPigHCatUtil.java
+++ b/hcatalog-pig-adapter/src/test/java/org/apache/hcatalog/pig/TestPigHCatUtil.java
@@ -31,60 +31,60 @@
 
 public class TestPigHCatUtil {
 
-  @Test
-  public void testGetBagSubSchema() throws Exception {
+    @Test
+    public void testGetBagSubSchema() throws Exception {
 
-    // Define the expected schema.
-    ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
-    bagSubFieldSchemas[0] = new ResourceFieldSchema().setName("innertuple")
-        .setDescription("The tuple in the bag").setType(DataType.TUPLE);
+        // Define the expected schema.
+        ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
+        bagSubFieldSchemas[0] = new ResourceFieldSchema().setName("innertuple")
+            .setDescription("The tuple in the bag").setType(DataType.TUPLE);
 
-    ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
-    innerTupleFieldSchemas[0] =
-        new ResourceFieldSchema().setName("innerfield").setType(DataType.CHARARRAY);
+        ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
+        innerTupleFieldSchemas[0] =
+            new ResourceFieldSchema().setName("innerfield").setType(DataType.CHARARRAY);
 
-    bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
-    ResourceSchema expected = new ResourceSchema().setFields(bagSubFieldSchemas);
+        bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
+        ResourceSchema expected = new ResourceSchema().setFields(bagSubFieldSchemas);
 
-    // Get the actual converted schema.
-    HCatSchema hCatSchema = new HCatSchema(Lists.newArrayList(
-        new HCatFieldSchema("innerLlama", HCatFieldSchema.Type.STRING, null)));
-    HCatFieldSchema hCatFieldSchema =
-        new HCatFieldSchema("llama", HCatFieldSchema.Type.ARRAY, hCatSchema, null);
-    ResourceSchema actual = PigHCatUtil.getBagSubSchema(hCatFieldSchema);
+        // Get the actual converted schema.
+        HCatSchema hCatSchema = new HCatSchema(Lists.newArrayList(
+            new HCatFieldSchema("innerLlama", HCatFieldSchema.Type.STRING, null)));
+        HCatFieldSchema hCatFieldSchema =
+            new HCatFieldSchema("llama", HCatFieldSchema.Type.ARRAY, hCatSchema, null);
+        ResourceSchema actual = PigHCatUtil.getBagSubSchema(hCatFieldSchema);
 
-    Assert.assertEquals(expected.toString(), actual.toString());
-  }
+        Assert.assertEquals(expected.toString(), actual.toString());
+    }
 
-  @Test
-  public void testGetBagSubSchemaConfigured() throws Exception {
+    @Test
+    public void testGetBagSubSchemaConfigured() throws Exception {
 
-    // NOTE: pig-0.8 sets client system properties by actually getting the client
-    // system properties. Starting in pig-0.9 you must pass the properties in.
-    // When updating our pig dependency this will need updated.
-    System.setProperty(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME, "t");
-    System.setProperty(HCatConstants.HCAT_PIG_INNER_FIELD_NAME, "FIELDNAME_tuple");
-    UDFContext.getUDFContext().setClientSystemProps();
+        // NOTE: pig-0.8 sets client system properties by actually getting the client
+        // system properties. Starting in pig-0.9 you must pass the properties in.
+        // When updating our pig dependency this will need updated.
+        System.setProperty(HCatConstants.HCAT_PIG_INNER_TUPLE_NAME, "t");
+        System.setProperty(HCatConstants.HCAT_PIG_INNER_FIELD_NAME, "FIELDNAME_tuple");
+        UDFContext.getUDFContext().setClientSystemProps();
 
-    // Define the expected schema.
-    ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
-    bagSubFieldSchemas[0] = new ResourceFieldSchema().setName("t")
-        .setDescription("The tuple in the bag").setType(DataType.TUPLE);
+        // Define the expected schema.
+        ResourceFieldSchema[] bagSubFieldSchemas = new ResourceFieldSchema[1];
+        bagSubFieldSchemas[0] = new ResourceFieldSchema().setName("t")
+            .setDescription("The tuple in the bag").setType(DataType.TUPLE);
 
-    ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
-    innerTupleFieldSchemas[0] =
-        new ResourceFieldSchema().setName("llama_tuple").setType(DataType.CHARARRAY);
+        ResourceFieldSchema[] innerTupleFieldSchemas = new ResourceFieldSchema[1];
+        innerTupleFieldSchemas[0] =
+            new ResourceFieldSchema().setName("llama_tuple").setType(DataType.CHARARRAY);
 
-    bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
-    ResourceSchema expected = new ResourceSchema().setFields(bagSubFieldSchemas);
+        bagSubFieldSchemas[0].setSchema(new ResourceSchema().setFields(innerTupleFieldSchemas));
+        ResourceSchema expected = new ResourceSchema().setFields(bagSubFieldSchemas);
 
-    // Get the actual converted schema.
-    HCatSchema actualHCatSchema = new HCatSchema(Lists.newArrayList(
-        new HCatFieldSchema("innerLlama", HCatFieldSchema.Type.STRING, null)));
-    HCatFieldSchema actualHCatFieldSchema =
-        new HCatFieldSchema("llama", HCatFieldSchema.Type.ARRAY, actualHCatSchema, null);
-    ResourceSchema actual = PigHCatUtil.getBagSubSchema(actualHCatFieldSchema);
+        // Get the actual converted schema.
+        HCatSchema actualHCatSchema = new HCatSchema(Lists.newArrayList(
+            new HCatFieldSchema("innerLlama", HCatFieldSchema.Type.STRING, null)));
+        HCatFieldSchema actualHCatFieldSchema =
+            new HCatFieldSchema("llama", HCatFieldSchema.Type.ARRAY, actualHCatSchema, null);
+        ResourceSchema actual = PigHCatUtil.getBagSubSchema(actualHCatFieldSchema);
 
-    Assert.assertEquals(expected.toString(), actual.toString());
-  }
+        Assert.assertEquals(expected.toString(), actual.toString());
+    }
 }
diff --git a/shims/src/20/java/org/apache/hcatalog/shims/HCatHadoopShims20S.java b/shims/src/20/java/org/apache/hcatalog/shims/HCatHadoopShims20S.java
index 000689b..5deea06 100644
--- a/shims/src/20/java/org/apache/hcatalog/shims/HCatHadoopShims20S.java
+++ b/shims/src/20/java/org/apache/hcatalog/shims/HCatHadoopShims20S.java
@@ -46,9 +46,8 @@
         return new TaskAttemptID();
     }
 
-	@Override
-	public TaskAttemptContext createTaskAttemptContext(Configuration conf,
-			TaskAttemptID taskId) {
+    @Override
+    public TaskAttemptContext createTaskAttemptContext(Configuration conf, TaskAttemptID taskId) {
         return new TaskAttemptContext(conf, taskId);
     }
 
@@ -133,12 +132,12 @@
     @Override
     public String getPropertyName(PropertyName name) {
         switch (name) {
-            case CACHE_ARCHIVES:
-                return DistributedCache.CACHE_ARCHIVES;
-            case CACHE_FILES:
-                return DistributedCache.CACHE_FILES;
-            case CACHE_SYMLINK:
-                return DistributedCache.CACHE_SYMLINK;
+        case CACHE_ARCHIVES:
+            return DistributedCache.CACHE_ARCHIVES;
+        case CACHE_FILES:
+            return DistributedCache.CACHE_FILES;
+        case CACHE_SYMLINK:
+            return DistributedCache.CACHE_SYMLINK;
         }
 
         return "";
diff --git a/shims/src/23/java/org/apache/hcatalog/shims/HCatHadoopShims23.java b/shims/src/23/java/org/apache/hcatalog/shims/HCatHadoopShims23.java
index 57276a8..d7181cf 100644
--- a/shims/src/23/java/org/apache/hcatalog/shims/HCatHadoopShims23.java
+++ b/shims/src/23/java/org/apache/hcatalog/shims/HCatHadoopShims23.java
@@ -49,20 +49,20 @@
 
     @Override
     public org.apache.hadoop.mapreduce.TaskAttemptContext createTaskAttemptContext(Configuration conf,
-            org.apache.hadoop.mapreduce.TaskAttemptID taskId) {
+                                                                                   org.apache.hadoop.mapreduce.TaskAttemptID taskId) {
         return new org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl(conf, taskId);
     }
 
     @Override
     public org.apache.hadoop.mapred.TaskAttemptContext createTaskAttemptContext(org.apache.hadoop.mapred.JobConf conf,
-            org.apache.hadoop.mapred.TaskAttemptID taskId, Progressable progressable) {
+                                                                                org.apache.hadoop.mapred.TaskAttemptID taskId, Progressable progressable) {
         org.apache.hadoop.mapred.TaskAttemptContext newContext = null;
         try {
             java.lang.reflect.Constructor construct = org.apache.hadoop.mapred.TaskAttemptContextImpl.class.getDeclaredConstructor(
-                    org.apache.hadoop.mapred.JobConf.class, org.apache.hadoop.mapred.TaskAttemptID.class,
-                    Reporter.class);
+                org.apache.hadoop.mapred.JobConf.class, org.apache.hadoop.mapred.TaskAttemptID.class,
+                Reporter.class);
             construct.setAccessible(true);
-            newContext = (org.apache.hadoop.mapred.TaskAttemptContext)construct.newInstance(conf, taskId, (Reporter)progressable);
+            newContext = (org.apache.hadoop.mapred.TaskAttemptContext) construct.newInstance(conf, taskId, (Reporter) progressable);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -71,7 +71,7 @@
 
     @Override
     public JobContext createJobContext(Configuration conf,
-            JobID jobId) {
+                                       JobID jobId) {
         JobContext ctxt = new JobContextImpl(conf, jobId);
 
         return ctxt;
@@ -79,15 +79,15 @@
 
     @Override
     public org.apache.hadoop.mapred.JobContext createJobContext(org.apache.hadoop.mapred.JobConf conf,
-            org.apache.hadoop.mapreduce.JobID jobId, Progressable progressable) {
-        org.apache.hadoop.mapred.JobContext newContext = 
-            new org.apache.hadoop.mapred.JobContextImpl(conf, jobId, (org.apache.hadoop.mapred.Reporter)progressable);
+                                                                org.apache.hadoop.mapreduce.JobID jobId, Progressable progressable) {
+        org.apache.hadoop.mapred.JobContext newContext =
+            new org.apache.hadoop.mapred.JobContextImpl(conf, jobId, (org.apache.hadoop.mapred.Reporter) progressable);
         return newContext;
     }
 
     @Override
     public void commitJob(OutputFormat outputFormat, ResourceSchema schema,
-            String arg1, Job job) throws IOException {
+                          String arg1, Job job) throws IOException {
         // Do nothing as this was fixed by MAPREDUCE-1447.
     }
 
@@ -106,12 +106,12 @@
     @Override
     public String getPropertyName(PropertyName name) {
         switch (name) {
-            case CACHE_ARCHIVES:
-                return MRJobConfig.CACHE_ARCHIVES;
-            case CACHE_FILES:
-                return MRJobConfig.CACHE_FILES;
-            case CACHE_SYMLINK:
-                return MRJobConfig.CACHE_SYMLINK;
+        case CACHE_ARCHIVES:
+            return MRJobConfig.CACHE_ARCHIVES;
+        case CACHE_FILES:
+            return MRJobConfig.CACHE_FILES;
+        case CACHE_SYMLINK:
+            return MRJobConfig.CACHE_SYMLINK;
         }
 
         return "";
diff --git a/src/java/org/apache/hcatalog/cli/HCatCli.java b/src/java/org/apache/hcatalog/cli/HCatCli.java
index 6bef627..f305fe2 100644
--- a/src/java/org/apache/hcatalog/cli/HCatCli.java
+++ b/src/java/org/apache/hcatalog/cli/HCatCli.java
@@ -53,278 +53,278 @@
 
 public class HCatCli {
 
-  @SuppressWarnings("static-access")
-  public static void main(String[] args) {
+    @SuppressWarnings("static-access")
+    public static void main(String[] args) {
 
-    try {
-      LogUtils.initHiveLog4j();
-    } catch (LogInitializationException e) {
+        try {
+            LogUtils.initHiveLog4j();
+        } catch (LogInitializationException e) {
 
-    }
-
-    CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
-    ss.in = System.in;
-    try {
-      ss.out = new PrintStream(System.out, true, "UTF-8");
-      ss.err = new PrintStream(System.err, true, "UTF-8");
-    } catch (UnsupportedEncodingException e) {
-      System.exit(1);
-    }
-
-    HiveConf conf = ss.getConf();
-
-    HiveConf.setVar(conf, ConfVars.SEMANTIC_ANALYZER_HOOK, HCatSemanticAnalyzer.class.getName());
-
-    SessionState.start(ss);
-
-    Options options = new Options();
-
-    // -e 'quoted-query-string'
-    options.addOption(OptionBuilder
-        .hasArg()
-        .withArgName("exec")
-        .withDescription("hcat command given from command line")
-        .create('e'));
-
-    // -f <query-file>
-    options.addOption(OptionBuilder
-        .hasArg()
-        .withArgName("file")
-        .withDescription("hcat commands in file")
-        .create('f'));
-
-    // -g
-    options.addOption(OptionBuilder
-        .hasArg().
-        withArgName("group").
-        withDescription("group for the db/table specified in CREATE statement").
-        create('g'));
-
-    // -p
-    options.addOption(OptionBuilder
-        .hasArg()
-        .withArgName("perms")
-        .withDescription("permissions for the db/table specified in CREATE statement")
-        .create('p'));
-
-    // -D
-    options.addOption(OptionBuilder
-        .hasArgs(2)
-        .withArgName("property=value")
-        .withValueSeparator()
-        .withDescription("use hadoop value for given property")
-        .create('D'));
-
-    // [-h|--help]
-    options.addOption(new Option("h", "help", false, "Print help information"));
-
-    Parser parser = new GnuParser();
-    CommandLine cmdLine = null;
-
-    try {
-      cmdLine  = parser.parse(options,args);
-
-    } catch (ParseException e) {
-      printUsage(options, ss.err);
-      System.exit(1);
-    }
-    // -e
-    String execString = (String) cmdLine.getOptionValue('e');
-    // -f
-    String fileName = (String) cmdLine.getOptionValue('f');
-    // -h
-    if (cmdLine.hasOption('h')) {
-      printUsage(options,ss.out);
-      System.exit(0);
-    }
-
-    if (execString != null && fileName != null) {
-      ss.err.println("The '-e' and '-f' options cannot be specified simultaneously");
-      printUsage(options,ss.err);
-      System.exit(1);
-    }
-
-    // -p
-    String perms = (String)cmdLine.getOptionValue('p');
-    if(perms != null){
-      validatePermissions(ss, conf, perms);
-    }
-
-    // -g
-    String grp = (String) cmdLine.getOptionValue('g');
-    if(grp != null){
-      conf.set(HCatConstants.HCAT_GROUP, grp);
-    }
-
-    // -D
-    setConfProperties(conf, cmdLine.getOptionProperties("D"));
-
-    if (execString != null) {
-      System.exit(processLine(execString));
-    }
-
-    try {
-      if (fileName != null) {
-        System.exit(processFile(fileName));
-      }
-    } catch (FileNotFoundException e) {
-      ss.err.println("Input file not found. (" + e.getMessage() + ")");
-      System.exit(1);
-    } catch (IOException e) {
-      ss.err.println("Could not open input file for reading. (" + e.getMessage() + ")");
-      System.exit(1);
-    }
-
-    // -h
-    printUsage(options, ss.err);
-    System.exit(1);
-  }
-
-  private static void setConfProperties(HiveConf conf, Properties props) {
-    for(java.util.Map.Entry<Object, Object> e : props.entrySet())
-        conf.set((String) e.getKey(), (String) e.getValue());
-  }
-
-  private static int processLine(String line) {
-    int ret = 0;
-
-    String command = "";
-    for (String oneCmd : line.split(";")) {
-
-      if (StringUtils.endsWith(oneCmd, "\\")) {
-        command += StringUtils.chop(oneCmd) + ";";
-        continue;
-      } else {
-        command += oneCmd;
-      }
-      if (StringUtils.isBlank(command)) {
-        continue;
-      }
-
-      ret = processCmd(command);
-      command = "";
-    }
-    return ret;
-  }
-
-  private static int processFile(String fileName) throws IOException {
-    FileReader fileReader = null;
-    BufferedReader reader = null;
-    try {
-      fileReader = new FileReader(fileName);
-      reader = new BufferedReader(fileReader);
-      String line;
-      StringBuilder qsb = new StringBuilder();
-
-      while ((line = reader.readLine()) != null) {
-        qsb.append(line + "\n");
-      }
-
-      return (processLine(qsb.toString()));
-    } finally {
-      if (fileReader != null) {
-        fileReader.close();
-      }
-      if(reader != null) {
-        reader.close();
-      }
-    }
-  }
-
-  private static int processCmd(String cmd){
-
-    SessionState ss = SessionState.get();
-    long start = System.currentTimeMillis();
-
-    cmd = cmd.trim();
-    String firstToken = cmd.split("\\s+")[0].trim();
-
-    if(firstToken.equalsIgnoreCase("set")){
-      return new SetProcessor().run(cmd.substring(firstToken.length()).trim()).getResponseCode();
-    } else if (firstToken.equalsIgnoreCase("dfs")){
-      return new DfsProcessor(ss.getConf()).run(cmd.substring(firstToken.length()).trim()).getResponseCode();
-    }
-
-    HCatDriver driver = new HCatDriver();
-
-    int ret = driver.run(cmd).getResponseCode();
-
-    if (ret != 0) {
-      driver.close();
-      System.exit(ret);
-    }
-
-    ArrayList<String> res = new ArrayList<String>();
-    try {
-      while (driver.getResults(res)) {
-        for (String r : res) {
-          ss.out.println(r);
         }
-        res.clear();
-      }
-    } catch (IOException e) {
-      ss.err.println("Failed with exception " + e.getClass().getName() + ":"
-          + e.getMessage() + "\n" + org.apache.hadoop.util.StringUtils.stringifyException(e));
-      ret = 1;
-    } catch (CommandNeedRetryException e) {
-        ss.err.println("Failed with exception " + e.getClass().getName() + ":"
+
+        CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
+        ss.in = System.in;
+        try {
+            ss.out = new PrintStream(System.out, true, "UTF-8");
+            ss.err = new PrintStream(System.err, true, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            System.exit(1);
+        }
+
+        HiveConf conf = ss.getConf();
+
+        HiveConf.setVar(conf, ConfVars.SEMANTIC_ANALYZER_HOOK, HCatSemanticAnalyzer.class.getName());
+
+        SessionState.start(ss);
+
+        Options options = new Options();
+
+        // -e 'quoted-query-string'
+        options.addOption(OptionBuilder
+                .hasArg()
+                .withArgName("exec")
+                .withDescription("hcat command given from command line")
+                .create('e'));
+
+        // -f <query-file>
+        options.addOption(OptionBuilder
+                .hasArg()
+                .withArgName("file")
+                .withDescription("hcat commands in file")
+                .create('f'));
+
+        // -g
+        options.addOption(OptionBuilder
+                .hasArg().
+                withArgName("group").
+                withDescription("group for the db/table specified in CREATE statement").
+                create('g'));
+
+        // -p
+        options.addOption(OptionBuilder
+                .hasArg()
+                .withArgName("perms")
+                .withDescription("permissions for the db/table specified in CREATE statement")
+                .create('p'));
+
+        // -D
+        options.addOption(OptionBuilder
+                .hasArgs(2)
+                .withArgName("property=value")
+                .withValueSeparator()
+                .withDescription("use hadoop value for given property")
+                .create('D'));
+
+        // [-h|--help]
+        options.addOption(new Option("h", "help", false, "Print help information"));
+
+        Parser parser = new GnuParser();
+        CommandLine cmdLine = null;
+
+        try {
+            cmdLine = parser.parse(options, args);
+
+        } catch (ParseException e) {
+            printUsage(options, ss.err);
+            System.exit(1);
+        }
+        // -e
+        String execString = (String) cmdLine.getOptionValue('e');
+        // -f
+        String fileName = (String) cmdLine.getOptionValue('f');
+        // -h
+        if (cmdLine.hasOption('h')) {
+            printUsage(options, ss.out);
+            System.exit(0);
+        }
+
+        if (execString != null && fileName != null) {
+            ss.err.println("The '-e' and '-f' options cannot be specified simultaneously");
+            printUsage(options, ss.err);
+            System.exit(1);
+        }
+
+        // -p
+        String perms = (String) cmdLine.getOptionValue('p');
+        if (perms != null) {
+            validatePermissions(ss, conf, perms);
+        }
+
+        // -g
+        String grp = (String) cmdLine.getOptionValue('g');
+        if (grp != null) {
+            conf.set(HCatConstants.HCAT_GROUP, grp);
+        }
+
+        // -D
+        setConfProperties(conf, cmdLine.getOptionProperties("D"));
+
+        if (execString != null) {
+            System.exit(processLine(execString));
+        }
+
+        try {
+            if (fileName != null) {
+                System.exit(processFile(fileName));
+            }
+        } catch (FileNotFoundException e) {
+            ss.err.println("Input file not found. (" + e.getMessage() + ")");
+            System.exit(1);
+        } catch (IOException e) {
+            ss.err.println("Could not open input file for reading. (" + e.getMessage() + ")");
+            System.exit(1);
+        }
+
+        // -h
+        printUsage(options, ss.err);
+        System.exit(1);
+    }
+
+    private static void setConfProperties(HiveConf conf, Properties props) {
+        for (java.util.Map.Entry<Object, Object> e : props.entrySet())
+            conf.set((String) e.getKey(), (String) e.getValue());
+    }
+
+    private static int processLine(String line) {
+        int ret = 0;
+
+        String command = "";
+        for (String oneCmd : line.split(";")) {
+
+            if (StringUtils.endsWith(oneCmd, "\\")) {
+                command += StringUtils.chop(oneCmd) + ";";
+                continue;
+            } else {
+                command += oneCmd;
+            }
+            if (StringUtils.isBlank(command)) {
+                continue;
+            }
+
+            ret = processCmd(command);
+            command = "";
+        }
+        return ret;
+    }
+
+    private static int processFile(String fileName) throws IOException {
+        FileReader fileReader = null;
+        BufferedReader reader = null;
+        try {
+            fileReader = new FileReader(fileName);
+            reader = new BufferedReader(fileReader);
+            String line;
+            StringBuilder qsb = new StringBuilder();
+
+            while ((line = reader.readLine()) != null) {
+                qsb.append(line + "\n");
+            }
+
+            return (processLine(qsb.toString()));
+        } finally {
+            if (fileReader != null) {
+                fileReader.close();
+            }
+            if (reader != null) {
+                reader.close();
+            }
+        }
+    }
+
+    private static int processCmd(String cmd) {
+
+        SessionState ss = SessionState.get();
+        long start = System.currentTimeMillis();
+
+        cmd = cmd.trim();
+        String firstToken = cmd.split("\\s+")[0].trim();
+
+        if (firstToken.equalsIgnoreCase("set")) {
+            return new SetProcessor().run(cmd.substring(firstToken.length()).trim()).getResponseCode();
+        } else if (firstToken.equalsIgnoreCase("dfs")) {
+            return new DfsProcessor(ss.getConf()).run(cmd.substring(firstToken.length()).trim()).getResponseCode();
+        }
+
+        HCatDriver driver = new HCatDriver();
+
+        int ret = driver.run(cmd).getResponseCode();
+
+        if (ret != 0) {
+            driver.close();
+            System.exit(ret);
+        }
+
+        ArrayList<String> res = new ArrayList<String>();
+        try {
+            while (driver.getResults(res)) {
+                for (String r : res) {
+                    ss.out.println(r);
+                }
+                res.clear();
+            }
+        } catch (IOException e) {
+            ss.err.println("Failed with exception " + e.getClass().getName() + ":"
                 + e.getMessage() + "\n" + org.apache.hadoop.util.StringUtils.stringifyException(e));
             ret = 1;
+        } catch (CommandNeedRetryException e) {
+            ss.err.println("Failed with exception " + e.getClass().getName() + ":"
+                + e.getMessage() + "\n" + org.apache.hadoop.util.StringUtils.stringifyException(e));
+            ret = 1;
+        }
+
+        int cret = driver.close();
+        if (ret == 0) {
+            ret = cret;
+        }
+
+        long end = System.currentTimeMillis();
+        if (end > start) {
+            double timeTaken = (end - start) / 1000.0;
+            ss.err.println("Time taken: " + timeTaken + " seconds");
+        }
+        return ret;
     }
 
-    int cret = driver.close();
-    if (ret == 0) {
-      ret = cret;
+    private static void printUsage(Options options, OutputStream os) {
+        PrintWriter pw = new PrintWriter(os);
+        new HelpFormatter().printHelp(pw, 2 * HelpFormatter.DEFAULT_WIDTH,
+            "hcat { -e \"<query>\" | -f \"<filepath>\" } [ -g \"<group>\" ] [ -p \"<perms>\" ] [ -D\"<name>=<value>\" ]",
+            null, options, HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD,
+            null, false);
+        pw.flush();
     }
 
-    long end = System.currentTimeMillis();
-    if (end > start) {
-      double timeTaken = (end - start) / 1000.0;
-      ss.err.println("Time taken: " + timeTaken + " seconds");
+    private static void validatePermissions(CliSessionState ss, HiveConf conf, String perms) {
+        perms = perms.trim();
+        FsPermission fp = null;
+
+        if (perms.matches("^\\s*([r,w,x,-]{9})\\s*$")) {
+            fp = FsPermission.valueOf("d" + perms);
+        } else if (perms.matches("^\\s*([0-7]{3})\\s*$")) {
+            fp = new FsPermission(Short.decode("0" + perms));
+        } else {
+            ss.err.println("Invalid permission specification: " + perms);
+            System.exit(1);
+        }
+
+        if (!HCatUtil.validateMorePermissive(fp.getUserAction(), fp.getGroupAction())) {
+            ss.err.println("Invalid permission specification: " + perms + " : user permissions must be more permissive than group permission ");
+            System.exit(1);
+        }
+        if (!HCatUtil.validateMorePermissive(fp.getGroupAction(), fp.getOtherAction())) {
+            ss.err.println("Invalid permission specification: " + perms + " : group permissions must be more permissive than other permission ");
+            System.exit(1);
+        }
+        if ((!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getUserAction())) ||
+            (!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getGroupAction())) ||
+            (!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getOtherAction()))) {
+            ss.err.println("Invalid permission specification: " + perms + " : permissions must have execute permissions if read or write permissions are specified ");
+            System.exit(1);
+        }
+
+        conf.set(HCatConstants.HCAT_PERMS, "d" + fp.toString());
+
     }
-    return ret;
-  }
-
-  private static void printUsage(Options options, OutputStream os) {
-    PrintWriter pw = new PrintWriter(os);
-    new HelpFormatter().printHelp(pw, 2 * HelpFormatter.DEFAULT_WIDTH,
-      "hcat { -e \"<query>\" | -f \"<filepath>\" } [ -g \"<group>\" ] [ -p \"<perms>\" ] [ -D\"<name>=<value>\" ]",
-        null,options, HelpFormatter.DEFAULT_LEFT_PAD,HelpFormatter.DEFAULT_DESC_PAD,
-        null, false);
-    pw.flush();
-  }
-
-  private static void validatePermissions(CliSessionState ss, HiveConf conf, String perms) {
-    perms = perms.trim();
-    FsPermission fp = null;
-
-    if (perms.matches("^\\s*([r,w,x,-]{9})\\s*$")){
-      fp = FsPermission.valueOf("d"+perms);
-    } else if (perms.matches("^\\s*([0-7]{3})\\s*$")){
-      fp = new FsPermission(Short.decode("0"+perms));
-    } else {
-      ss.err.println("Invalid permission specification: "+perms);
-      System.exit(1);
-    }
-
-    if (!HCatUtil.validateMorePermissive(fp.getUserAction(),fp.getGroupAction())){
-      ss.err.println("Invalid permission specification: "+perms+" : user permissions must be more permissive than group permission ");
-      System.exit(1);
-    }
-    if (!HCatUtil.validateMorePermissive(fp.getGroupAction(),fp.getOtherAction())){
-      ss.err.println("Invalid permission specification: "+perms+" : group permissions must be more permissive than other permission ");
-      System.exit(1);
-    }
-    if ( (!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getUserAction())) ||
-        (!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getGroupAction())) ||
-        (!HCatUtil.validateExecuteBitPresentIfReadOrWrite(fp.getOtherAction())) ) {
-      ss.err.println("Invalid permission specification: "+perms+" : permissions must have execute permissions if read or write permissions are specified ");
-      System.exit(1);
-    }
-
-    conf.set(HCatConstants.HCAT_PERMS, "d"+fp.toString());
-
-  }
 
 
 }
diff --git a/src/java/org/apache/hcatalog/cli/HCatDriver.java b/src/java/org/apache/hcatalog/cli/HCatDriver.java
index 3c6ba1d..79b7a83 100644
--- a/src/java/org/apache/hcatalog/cli/HCatDriver.java
+++ b/src/java/org/apache/hcatalog/cli/HCatDriver.java
@@ -34,109 +34,109 @@
 
 public class HCatDriver extends Driver {
 
-  @Override
-  public CommandProcessorResponse run(String command) {
+    @Override
+    public CommandProcessorResponse run(String command) {
 
-    CommandProcessorResponse cpr = null;
-    try {
-      cpr = super.run(command);
-    } catch (CommandNeedRetryException e) {
-      return new CommandProcessorResponse(-1, e.toString(), "");
-    }
-
-    SessionState ss = SessionState.get();
-
-    if (cpr.getResponseCode() == 0){
-      // Only attempt to do this, if cmd was successful.
-      int rc = setFSPermsNGrp(ss);
-      cpr = new CommandProcessorResponse(rc);
-    }
-    // reset conf vars
-    ss.getConf().set(HCatConstants.HCAT_CREATE_DB_NAME, "");
-    ss.getConf().set(HCatConstants.HCAT_CREATE_TBL_NAME, "");
-
-    return cpr;
-  }
-
-  private int setFSPermsNGrp(SessionState ss) {
-
-    Configuration conf =ss.getConf();
-
-    String tblName = conf.get(HCatConstants.HCAT_CREATE_TBL_NAME,"");
-    if (tblName.isEmpty()) {
-      tblName = conf.get("import.destination.table", "");
-      conf.set("import.destination.table", "");
-    }
-    String dbName = conf.get(HCatConstants.HCAT_CREATE_DB_NAME, "");
-    String grp = conf.get(HCatConstants.HCAT_GROUP,null);
-    String permsStr = conf.get(HCatConstants.HCAT_PERMS,null);
-
-    if(tblName.isEmpty() && dbName.isEmpty()){
-      // it wasn't create db/table
-      return 0;
-    }
-
-    if(null == grp && null == permsStr) {
-      // there were no grp and perms to begin with.
-      return 0;
-    }
-
-    FsPermission perms = FsPermission.valueOf(permsStr);
-
-    if(!tblName.isEmpty()){
-      Hive db = null;
-      try{
-        db = Hive.get();
-        Table tbl =  db.getTable(tblName);
-        Path tblPath = tbl.getPath();
-
-        FileSystem fs = tblPath.getFileSystem(conf);
-        if(null != perms){
-          fs.setPermission(tblPath, perms);
+        CommandProcessorResponse cpr = null;
+        try {
+            cpr = super.run(command);
+        } catch (CommandNeedRetryException e) {
+            return new CommandProcessorResponse(-1, e.toString(), "");
         }
-        if(null != grp){
-          fs.setOwner(tblPath, null, grp);
-        }
-        return 0;
 
-      } catch (Exception e){
-          ss.err.println(String.format("Failed to set permissions/groups on TABLE: <%s> %s",tblName,e.getMessage()));
-          try {  // We need to drop the table.
-            if(null != db){ db.dropTable(tblName); }
-          } catch (HiveException he) {
-            ss.err.println(String.format("Failed to drop TABLE <%s> after failing to set permissions/groups on it. %s",tblName,e.getMessage()));
-          }
-          return 1;
-      }
-    }
-    else{
-      // looks like a db operation
-      if (dbName.isEmpty() || dbName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME)){
-        // We dont set perms or groups for default dir.
-        return 0;
-      }
-      else{
-        try{
-          Hive db = Hive.get();
-          Path dbPath = new Warehouse(conf).getDatabasePath(db.getDatabase(dbName));
-          FileSystem fs = dbPath.getFileSystem(conf);
-          if(perms != null){
-            fs.setPermission(dbPath, perms);
-          }
-          if(null != grp){
-            fs.setOwner(dbPath, null, grp);
-          }
-          return 0;
-        } catch (Exception e){
-          ss.err.println(String.format("Failed to set permissions and/or group on DB: <%s> %s", dbName, e.getMessage()));
-          try {
-            Hive.get().dropDatabase(dbName);
-          } catch (Exception e1) {
-            ss.err.println(String.format("Failed to drop DB <%s> after failing to set permissions/group on it. %s", dbName, e1.getMessage()));
-          }
-          return 1;
+        SessionState ss = SessionState.get();
+
+        if (cpr.getResponseCode() == 0) {
+            // Only attempt to do this, if cmd was successful.
+            int rc = setFSPermsNGrp(ss);
+            cpr = new CommandProcessorResponse(rc);
         }
-      }
+        // reset conf vars
+        ss.getConf().set(HCatConstants.HCAT_CREATE_DB_NAME, "");
+        ss.getConf().set(HCatConstants.HCAT_CREATE_TBL_NAME, "");
+
+        return cpr;
     }
-  }
+
+    private int setFSPermsNGrp(SessionState ss) {
+
+        Configuration conf = ss.getConf();
+
+        String tblName = conf.get(HCatConstants.HCAT_CREATE_TBL_NAME, "");
+        if (tblName.isEmpty()) {
+            tblName = conf.get("import.destination.table", "");
+            conf.set("import.destination.table", "");
+        }
+        String dbName = conf.get(HCatConstants.HCAT_CREATE_DB_NAME, "");
+        String grp = conf.get(HCatConstants.HCAT_GROUP, null);
+        String permsStr = conf.get(HCatConstants.HCAT_PERMS, null);
+
+        if (tblName.isEmpty() && dbName.isEmpty()) {
+            // it wasn't create db/table
+            return 0;
+        }
+
+        if (null == grp && null == permsStr) {
+            // there were no grp and perms to begin with.
+            return 0;
+        }
+
+        FsPermission perms = FsPermission.valueOf(permsStr);
+
+        if (!tblName.isEmpty()) {
+            Hive db = null;
+            try {
+                db = Hive.get();
+                Table tbl = db.getTable(tblName);
+                Path tblPath = tbl.getPath();
+
+                FileSystem fs = tblPath.getFileSystem(conf);
+                if (null != perms) {
+                    fs.setPermission(tblPath, perms);
+                }
+                if (null != grp) {
+                    fs.setOwner(tblPath, null, grp);
+                }
+                return 0;
+
+            } catch (Exception e) {
+                ss.err.println(String.format("Failed to set permissions/groups on TABLE: <%s> %s", tblName, e.getMessage()));
+                try {  // We need to drop the table.
+                    if (null != db) {
+                        db.dropTable(tblName);
+                    }
+                } catch (HiveException he) {
+                    ss.err.println(String.format("Failed to drop TABLE <%s> after failing to set permissions/groups on it. %s", tblName, e.getMessage()));
+                }
+                return 1;
+            }
+        } else {
+            // looks like a db operation
+            if (dbName.isEmpty() || dbName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME)) {
+                // We dont set perms or groups for default dir.
+                return 0;
+            } else {
+                try {
+                    Hive db = Hive.get();
+                    Path dbPath = new Warehouse(conf).getDatabasePath(db.getDatabase(dbName));
+                    FileSystem fs = dbPath.getFileSystem(conf);
+                    if (perms != null) {
+                        fs.setPermission(dbPath, perms);
+                    }
+                    if (null != grp) {
+                        fs.setOwner(dbPath, null, grp);
+                    }
+                    return 0;
+                } catch (Exception e) {
+                    ss.err.println(String.format("Failed to set permissions and/or group on DB: <%s> %s", dbName, e.getMessage()));
+                    try {
+                        Hive.get().dropDatabase(dbName);
+                    } catch (Exception e1) {
+                        ss.err.println(String.format("Failed to drop DB <%s> after failing to set permissions/group on it. %s", dbName, e1.getMessage()));
+                    }
+                    return 1;
+                }
+            }
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateDatabaseHook.java b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateDatabaseHook.java
index 71e8f39..9fa6e85 100644
--- a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateDatabaseHook.java
+++ b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateDatabaseHook.java
@@ -34,62 +34,62 @@
 import org.apache.hadoop.hive.ql.security.authorization.Privilege;
 import org.apache.hcatalog.common.HCatConstants;
 
-final class CreateDatabaseHook  extends HCatSemanticAnalyzerBase {
+final class CreateDatabaseHook extends HCatSemanticAnalyzerBase {
 
-  String databaseName;
+    String databaseName;
 
-  @Override
-  public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, ASTNode ast)
-  throws SemanticException {
+    @Override
+    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, ASTNode ast)
+        throws SemanticException {
 
-    Hive db;
-    try {
-      db = context.getHive();
-    } catch (HiveException e) {
-      throw new SemanticException("Couldn't get Hive DB instance in semantic analysis phase.", e);
-    }
-
-    // Analyze and create tbl properties object
-    int numCh = ast.getChildCount();
-
-    databaseName = BaseSemanticAnalyzer.getUnescapedName((ASTNode)ast.getChild(0));
-
-    for (int num = 1; num < numCh; num++) {
-      ASTNode child = (ASTNode) ast.getChild(num);
-
-      switch (child.getToken().getType()) {
-
-      case HiveParser.TOK_IFNOTEXISTS:
+        Hive db;
         try {
-          List<String> dbs = db.getDatabasesByPattern(databaseName);
-          if (dbs != null && dbs.size() > 0) { // db exists
-            return ast;
-          }
+            db = context.getHive();
         } catch (HiveException e) {
-          throw new SemanticException(e);
+            throw new SemanticException("Couldn't get Hive DB instance in semantic analysis phase.", e);
         }
-        break;
-      }
+
+        // Analyze and create tbl properties object
+        int numCh = ast.getChildCount();
+
+        databaseName = BaseSemanticAnalyzer.getUnescapedName((ASTNode) ast.getChild(0));
+
+        for (int num = 1; num < numCh; num++) {
+            ASTNode child = (ASTNode) ast.getChild(num);
+
+            switch (child.getToken().getType()) {
+
+            case HiveParser.TOK_IFNOTEXISTS:
+                try {
+                    List<String> dbs = db.getDatabasesByPattern(databaseName);
+                    if (dbs != null && dbs.size() > 0) { // db exists
+                        return ast;
+                    }
+                } catch (HiveException e) {
+                    throw new SemanticException(e);
+                }
+                break;
+            }
+        }
+
+        return ast;
     }
 
-    return ast;
-  }
-
-  @Override
-  public void postAnalyze(HiveSemanticAnalyzerHookContext context,
-      List<Task<? extends Serializable>> rootTasks) throws SemanticException {
-    context.getConf().set(HCatConstants.HCAT_CREATE_DB_NAME, databaseName);
-    super.postAnalyze(context, rootTasks);
-  }
-  
-  @Override
-  protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext context,
-      Hive hive, DDLWork work) throws HiveException {
-    CreateDatabaseDesc createDb = work.getCreateDatabaseDesc();
-    if (createDb != null) {
-      Database db = new Database(createDb.getName(), createDb.getComment(), 
-          createDb.getLocationUri(), createDb.getDatabaseProperties());
-      authorize(db, Privilege.CREATE);
+    @Override
+    public void postAnalyze(HiveSemanticAnalyzerHookContext context,
+                            List<Task<? extends Serializable>> rootTasks) throws SemanticException {
+        context.getConf().set(HCatConstants.HCAT_CREATE_DB_NAME, databaseName);
+        super.postAnalyze(context, rootTasks);
     }
-  }
+
+    @Override
+    protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext context,
+                                    Hive hive, DDLWork work) throws HiveException {
+        CreateDatabaseDesc createDb = work.getCreateDatabaseDesc();
+        if (createDb != null) {
+            Database db = new Database(createDb.getName(), createDb.getComment(),
+                createDb.getLocationUri(), createDb.getDatabaseProperties());
+            authorize(db, Privilege.CREATE);
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateTableHook.java b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateTableHook.java
index 169e776..002f057 100644
--- a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateTableHook.java
+++ b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/CreateTableHook.java
@@ -48,18 +48,18 @@
 final class CreateTableHook extends HCatSemanticAnalyzerBase {
 
     private String tableName;
-    
+
     @Override
     public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
-            ASTNode ast) throws SemanticException {
+                              ASTNode ast) throws SemanticException {
 
         Hive db;
         try {
             db = context.getHive();
         } catch (HiveException e) {
             throw new SemanticException(
-                    "Couldn't get Hive DB instance in semantic analysis phase.",
-                    e);
+                "Couldn't get Hive DB instance in semantic analysis phase.",
+                e);
         }
 
         // Analyze and create tbl properties object
@@ -67,7 +67,7 @@
 
         String inputFormat = null, outputFormat = null;
         tableName = BaseSemanticAnalyzer.getUnescapedName((ASTNode) ast
-                .getChild(0));
+            .getChild(0));
         boolean likeTable = false;
 
         for (int num = 1; num < numCh; num++) {
@@ -75,89 +75,89 @@
 
             switch (child.getToken().getType()) {
 
-                case HiveParser.TOK_QUERY: // CTAS
-                    throw new SemanticException(
-                            "Operation not supported. Create table as " +
-                            "Select is not a valid operation.");
+            case HiveParser.TOK_QUERY: // CTAS
+                throw new SemanticException(
+                    "Operation not supported. Create table as " +
+                        "Select is not a valid operation.");
 
-                case HiveParser.TOK_TABLEBUCKETS:
-                    break;
+            case HiveParser.TOK_TABLEBUCKETS:
+                break;
 
-                case HiveParser.TOK_TBLSEQUENCEFILE:
-                    inputFormat = HCatConstants.SEQUENCEFILE_INPUT;
-                    outputFormat = HCatConstants.SEQUENCEFILE_OUTPUT;
-                    break;
+            case HiveParser.TOK_TBLSEQUENCEFILE:
+                inputFormat = HCatConstants.SEQUENCEFILE_INPUT;
+                outputFormat = HCatConstants.SEQUENCEFILE_OUTPUT;
+                break;
 
-                case HiveParser.TOK_TBLTEXTFILE:
-                    inputFormat      = org.apache.hadoop.mapred.TextInputFormat.class.getName();
-                    outputFormat     = org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat.class.getName();
+            case HiveParser.TOK_TBLTEXTFILE:
+                inputFormat = org.apache.hadoop.mapred.TextInputFormat.class.getName();
+                outputFormat = org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat.class.getName();
 
-                    break;
+                break;
 
-                case HiveParser.TOK_LIKETABLE:
-                    likeTable = true;
-                    break;
+            case HiveParser.TOK_LIKETABLE:
+                likeTable = true;
+                break;
 
-                case HiveParser.TOK_IFNOTEXISTS:
-                    try {
-                        List<String> tables = db.getTablesByPattern(tableName);
-                        if (tables != null && tables.size() > 0) { // table
-                                                                   // exists
-                            return ast;
-                        }
-                    } catch (HiveException e) {
-                        throw new SemanticException(e);
-                    }
-                    break;
-
-                case HiveParser.TOK_TABLEPARTCOLS:
-                    List<FieldSchema> partCols = BaseSemanticAnalyzer
-                            .getColumns((ASTNode) child.getChild(0), false);
-                    for (FieldSchema fs : partCols) {
-                        if (!fs.getType().equalsIgnoreCase("string")) {
-                            throw new SemanticException(
-                                    "Operation not supported. HCatalog only " +
-                                    "supports partition columns of type string. "
-                                            + "For column: "
-                                            + fs.getName()
-                                            + " Found type: " + fs.getType());
-                        }
-                    }
-                    break;
-
-                case HiveParser.TOK_STORAGEHANDLER:
-                    String storageHandler = BaseSemanticAnalyzer
-                            .unescapeSQLString(child.getChild(0).getText());
-                    if (org.apache.commons.lang.StringUtils
-                            .isNotEmpty(storageHandler)) {
+            case HiveParser.TOK_IFNOTEXISTS:
+                try {
+                    List<String> tables = db.getTablesByPattern(tableName);
+                    if (tables != null && tables.size() > 0) { // table
+                        // exists
                         return ast;
                     }
+                } catch (HiveException e) {
+                    throw new SemanticException(e);
+                }
+                break;
 
-                    break;
-
-                case HiveParser.TOK_TABLEFILEFORMAT:
-                    if (child.getChildCount() < 2) {
+            case HiveParser.TOK_TABLEPARTCOLS:
+                List<FieldSchema> partCols = BaseSemanticAnalyzer
+                    .getColumns((ASTNode) child.getChild(0), false);
+                for (FieldSchema fs : partCols) {
+                    if (!fs.getType().equalsIgnoreCase("string")) {
                         throw new SemanticException(
-                                "Incomplete specification of File Format. " +
-                                "You must provide InputFormat, OutputFormat.");
+                            "Operation not supported. HCatalog only " +
+                                "supports partition columns of type string. "
+                                + "For column: "
+                                + fs.getName()
+                                + " Found type: " + fs.getType());
                     }
-                    inputFormat = BaseSemanticAnalyzer.unescapeSQLString(child
-                            .getChild(0).getText());
-                    outputFormat = BaseSemanticAnalyzer.unescapeSQLString(child
-                            .getChild(1).getText());
-                    break;
+                }
+                break;
 
-                case HiveParser.TOK_TBLRCFILE:
-                    inputFormat = RCFileInputFormat.class.getName();
-                    outputFormat = RCFileOutputFormat.class.getName();
-                    break;
+            case HiveParser.TOK_STORAGEHANDLER:
+                String storageHandler = BaseSemanticAnalyzer
+                    .unescapeSQLString(child.getChild(0).getText());
+                if (org.apache.commons.lang.StringUtils
+                    .isNotEmpty(storageHandler)) {
+                    return ast;
+                }
+
+                break;
+
+            case HiveParser.TOK_TABLEFILEFORMAT:
+                if (child.getChildCount() < 2) {
+                    throw new SemanticException(
+                        "Incomplete specification of File Format. " +
+                            "You must provide InputFormat, OutputFormat.");
+                }
+                inputFormat = BaseSemanticAnalyzer.unescapeSQLString(child
+                    .getChild(0).getText());
+                outputFormat = BaseSemanticAnalyzer.unescapeSQLString(child
+                    .getChild(1).getText());
+                break;
+
+            case HiveParser.TOK_TBLRCFILE:
+                inputFormat = RCFileInputFormat.class.getName();
+                outputFormat = RCFileOutputFormat.class.getName();
+                break;
 
             }
         }
-        
+
         if (!likeTable && (inputFormat == null || outputFormat == null)) {
             throw new SemanticException(
-                    "STORED AS specification is either incomplete or incorrect.");
+                "STORED AS specification is either incomplete or incorrect.");
         }
 
 
@@ -166,8 +166,8 @@
 
     @Override
     public void postAnalyze(HiveSemanticAnalyzerHookContext context,
-            List<Task<? extends Serializable>> rootTasks)
-            throws SemanticException {
+                            List<Task<? extends Serializable>> rootTasks)
+        throws SemanticException {
 
         if (rootTasks.size() == 0) {
             // There will be no DDL task created in case if its CREATE TABLE IF
@@ -175,12 +175,12 @@
             return;
         }
         CreateTableDesc desc = ((DDLTask) rootTasks.get(rootTasks.size() - 1))
-                .getWork().getCreateTblDesc();
+            .getWork().getCreateTblDesc();
         if (desc == null) {
-          // Desc will be null if its CREATE TABLE LIKE. Desc will be
-          // contained in CreateTableLikeDesc. Currently, HCat disallows CTLT in
-          // pre-hook. So, desc can never be null.
-          return;
+            // Desc will be null if its CREATE TABLE LIKE. Desc will be
+            // contained in CreateTableLikeDesc. Currently, HCat disallows CTLT in
+            // pre-hook. So, desc can never be null.
+            return;
         }
         Map<String, String> tblProps = desc.getTblProps();
         if (tblProps == null) {
@@ -196,11 +196,11 @@
         } else {
             try {
                 HCatStorageHandler storageHandlerInst = HCatUtil
-                        .getStorageHandler(context.getConf(),
-                                                     desc.getStorageHandler(),
-                                                     desc.getSerName(),
-                                                     desc.getInputFormat(),
-                                                     desc.getOutputFormat());
+                    .getStorageHandler(context.getConf(),
+                        desc.getStorageHandler(),
+                        desc.getSerName(),
+                        desc.getInputFormat(),
+                        desc.getOutputFormat());
                 //Authorization checks are performed by the storageHandler.getAuthorizationProvider(), if  
                 //StorageDelegationAuthorizationProvider is used.
             } catch (IOException e) {
@@ -209,33 +209,33 @@
         }
 
         if (desc != null) {
-          try {
-            Table table = context.getHive().newTable(desc.getTableName());
-            if (desc.getLocation() != null) {
-              table.setDataLocation(new Path(desc.getLocation()).toUri());
+            try {
+                Table table = context.getHive().newTable(desc.getTableName());
+                if (desc.getLocation() != null) {
+                    table.setDataLocation(new Path(desc.getLocation()).toUri());
+                }
+                if (desc.getStorageHandler() != null) {
+                    table.setProperty(
+                        org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE,
+                        desc.getStorageHandler());
+                }
+                for (Map.Entry<String, String> prop : tblProps.entrySet()) {
+                    table.setProperty(prop.getKey(), prop.getValue());
+                }
+                for (Map.Entry<String, String> prop : desc.getSerdeProps().entrySet()) {
+                    table.setSerdeParam(prop.getKey(), prop.getValue());
+                }
+                //TODO: set other Table properties as needed
+
+                //authorize against the table operation so that location permissions can be checked if any
+
+                if (HiveConf.getBoolVar(context.getConf(),
+                    HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {
+                    authorize(table, Privilege.CREATE);
+                }
+            } catch (HiveException ex) {
+                throw new SemanticException(ex);
             }
-            if (desc.getStorageHandler() != null) {
-              table.setProperty(
-                org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE,
-                desc.getStorageHandler());
-            }
-            for (Map.Entry<String, String> prop : tblProps.entrySet()) {
-              table.setProperty(prop.getKey(), prop.getValue());
-            }
-            for (Map.Entry<String, String> prop : desc.getSerdeProps().entrySet()) {
-              table.setSerdeParam(prop.getKey(), prop.getValue());
-            }
-            //TODO: set other Table properties as needed
-  
-            //authorize against the table operation so that location permissions can be checked if any
-            
-            if (HiveConf.getBoolVar(context.getConf(),
-                HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {
-              authorize(table, Privilege.CREATE);
-            }
-          } catch (HiveException ex) {
-            throw new SemanticException(ex);
-          }
         }
 
         desc.setTblProps(tblProps);
diff --git a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzer.java b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzer.java
index 2bd7490..b5151d0 100644
--- a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzer.java
+++ b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzer.java
@@ -50,326 +50,325 @@
 
 public class HCatSemanticAnalyzer extends HCatSemanticAnalyzerBase {
 
-  private AbstractSemanticAnalyzerHook hook;
-  private ASTNode ast;
+    private AbstractSemanticAnalyzerHook hook;
+    private ASTNode ast;
 
 
+    @Override
+    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, ASTNode ast)
+        throws SemanticException {
 
-  @Override
-  public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, ASTNode ast)
-      throws SemanticException {
+        this.ast = ast;
+        switch (ast.getToken().getType()) {
 
-      this.ast = ast;
-      switch (ast.getToken().getType()) {
+        // HCat wants to intercept following tokens and special-handle them.
+        case HiveParser.TOK_CREATETABLE:
+            hook = new CreateTableHook();
+            return hook.preAnalyze(context, ast);
 
-      // HCat wants to intercept following tokens and special-handle them.
-      case HiveParser.TOK_CREATETABLE:
-        hook = new CreateTableHook();
-        return hook.preAnalyze(context, ast);
+        case HiveParser.TOK_CREATEDATABASE:
+            hook = new CreateDatabaseHook();
+            return hook.preAnalyze(context, ast);
 
-      case HiveParser.TOK_CREATEDATABASE:
-        hook = new CreateDatabaseHook();
-        return hook.preAnalyze(context, ast);
+        case HiveParser.TOK_ALTERTABLE_PARTITION:
+            if (((ASTNode) ast.getChild(1)).getToken().getType() == HiveParser.TOK_ALTERTABLE_FILEFORMAT) {
+                return ast;
+            } else if (((ASTNode) ast.getChild(1)).getToken().getType() == HiveParser.TOK_ALTERTABLE_ALTERPARTS_MERGEFILES) {
+                // unsupported
+                throw new SemanticException("Operation not supported.");
+            } else {
+                return ast;
+            }
 
-      case HiveParser.TOK_ALTERTABLE_PARTITION:
-          if (((ASTNode)ast.getChild(1)).getToken().getType() == HiveParser.TOK_ALTERTABLE_FILEFORMAT) {
+            // HCat will allow these operations to be performed.
+            // Database DDL
+        case HiveParser.TOK_SHOWDATABASES:
+        case HiveParser.TOK_DROPDATABASE:
+        case HiveParser.TOK_SWITCHDATABASE:
+        case HiveParser.TOK_DESCDATABASE:
+        case HiveParser.TOK_ALTERDATABASE_PROPERTIES:
+
+            // Index DDL
+        case HiveParser.TOK_ALTERINDEX_PROPERTIES:
+        case HiveParser.TOK_CREATEINDEX:
+        case HiveParser.TOK_DROPINDEX:
+        case HiveParser.TOK_SHOWINDEXES:
+
+            // View DDL
+            // "alter view add partition" does not work because of the nature of implementation
+            // of the DDL in hive. Hive will internally invoke another Driver on the select statement,
+            // and HCat does not let "select" statement through. I cannot find a way to get around it
+            // without modifying hive code. So just leave it unsupported.
+            //case HiveParser.TOK_ALTERVIEW_ADDPARTS:
+        case HiveParser.TOK_ALTERVIEW_DROPPARTS:
+        case HiveParser.TOK_ALTERVIEW_PROPERTIES:
+        case HiveParser.TOK_ALTERVIEW_RENAME:
+        case HiveParser.TOK_CREATEVIEW:
+        case HiveParser.TOK_DROPVIEW:
+
+            // Authorization DDL
+        case HiveParser.TOK_CREATEROLE:
+        case HiveParser.TOK_DROPROLE:
+        case HiveParser.TOK_GRANT_ROLE:
+        case HiveParser.TOK_GRANT_WITH_OPTION:
+        case HiveParser.TOK_GRANT:
+        case HiveParser.TOK_REVOKE_ROLE:
+        case HiveParser.TOK_REVOKE:
+        case HiveParser.TOK_SHOW_GRANT:
+        case HiveParser.TOK_SHOW_ROLE_GRANT:
+
+            // Misc DDL
+        case HiveParser.TOK_LOCKTABLE:
+        case HiveParser.TOK_UNLOCKTABLE:
+        case HiveParser.TOK_SHOWLOCKS:
+        case HiveParser.TOK_DESCFUNCTION:
+        case HiveParser.TOK_SHOWFUNCTIONS:
+        case HiveParser.TOK_EXPLAIN:
+
+            // Table DDL
+        case HiveParser.TOK_ALTERTABLE_ADDPARTS:
+        case HiveParser.TOK_ALTERTABLE_ADDCOLS:
+        case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
+        case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
+        case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
+        case HiveParser.TOK_ALTERTABLE_DROPPARTS:
+        case HiveParser.TOK_ALTERTABLE_PROPERTIES:
+        case HiveParser.TOK_ALTERTABLE_RENAME:
+        case HiveParser.TOK_ALTERTABLE_RENAMECOL:
+        case HiveParser.TOK_ALTERTABLE_REPLACECOLS:
+        case HiveParser.TOK_ALTERTABLE_SERIALIZER:
+        case HiveParser.TOK_ALTERTABLE_TOUCH:
+        case HiveParser.TOK_DESCTABLE:
+        case HiveParser.TOK_DROPTABLE:
+        case HiveParser.TOK_SHOW_TABLESTATUS:
+        case HiveParser.TOK_SHOWPARTITIONS:
+        case HiveParser.TOK_SHOWTABLES:
             return ast;
-          } else if (((ASTNode)ast.getChild(1)).getToken().getType() == HiveParser.TOK_ALTERTABLE_ALTERPARTS_MERGEFILES){
-              // unsupported
-              throw new SemanticException("Operation not supported.");
-          } else {
-              return ast;
-          }
 
-      // HCat will allow these operations to be performed.
-      // Database DDL
-      case HiveParser.TOK_SHOWDATABASES:
-      case HiveParser.TOK_DROPDATABASE:
-      case HiveParser.TOK_SWITCHDATABASE:
-      case HiveParser.TOK_DESCDATABASE:
-      case HiveParser.TOK_ALTERDATABASE_PROPERTIES:
+        // In all other cases, throw an exception. Its a white-list of allowed operations.
+        default:
+            throw new SemanticException("Operation not supported.");
 
-      // Index DDL
-      case HiveParser.TOK_ALTERINDEX_PROPERTIES:
-      case HiveParser.TOK_CREATEINDEX:
-      case HiveParser.TOK_DROPINDEX:
-      case HiveParser.TOK_SHOWINDEXES:
-
-      // View DDL
-      // "alter view add partition" does not work because of the nature of implementation
-      // of the DDL in hive. Hive will internally invoke another Driver on the select statement,
-      // and HCat does not let "select" statement through. I cannot find a way to get around it
-      // without modifying hive code. So just leave it unsupported.
-      //case HiveParser.TOK_ALTERVIEW_ADDPARTS:
-      case HiveParser.TOK_ALTERVIEW_DROPPARTS:
-      case HiveParser.TOK_ALTERVIEW_PROPERTIES:
-      case HiveParser.TOK_ALTERVIEW_RENAME:
-      case HiveParser.TOK_CREATEVIEW:
-      case HiveParser.TOK_DROPVIEW:
-
-      // Authorization DDL
-      case HiveParser.TOK_CREATEROLE:
-      case HiveParser.TOK_DROPROLE:
-      case HiveParser.TOK_GRANT_ROLE:
-      case HiveParser.TOK_GRANT_WITH_OPTION:
-      case HiveParser.TOK_GRANT:
-      case HiveParser.TOK_REVOKE_ROLE:
-      case HiveParser.TOK_REVOKE:
-      case HiveParser.TOK_SHOW_GRANT:
-      case HiveParser.TOK_SHOW_ROLE_GRANT:
-
-      // Misc DDL
-      case HiveParser.TOK_LOCKTABLE:
-      case HiveParser.TOK_UNLOCKTABLE:
-      case HiveParser.TOK_SHOWLOCKS:
-      case HiveParser.TOK_DESCFUNCTION:
-      case HiveParser.TOK_SHOWFUNCTIONS:
-      case HiveParser.TOK_EXPLAIN:
-
-      // Table DDL
-      case HiveParser.TOK_ALTERTABLE_ADDPARTS:
-      case HiveParser.TOK_ALTERTABLE_ADDCOLS:
-      case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
-      case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
-      case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
-      case HiveParser.TOK_ALTERTABLE_DROPPARTS:
-      case HiveParser.TOK_ALTERTABLE_PROPERTIES:
-      case HiveParser.TOK_ALTERTABLE_RENAME:
-      case HiveParser.TOK_ALTERTABLE_RENAMECOL:
-      case HiveParser.TOK_ALTERTABLE_REPLACECOLS:
-      case HiveParser.TOK_ALTERTABLE_SERIALIZER:
-      case HiveParser.TOK_ALTERTABLE_TOUCH:
-      case HiveParser.TOK_DESCTABLE:
-      case HiveParser.TOK_DROPTABLE:
-      case HiveParser.TOK_SHOW_TABLESTATUS:
-      case HiveParser.TOK_SHOWPARTITIONS:
-      case HiveParser.TOK_SHOWTABLES:
-        return ast;
-
-      // In all other cases, throw an exception. Its a white-list of allowed operations.
-      default:
-        throw new SemanticException("Operation not supported.");
-
-      }
-  }
-
-  @Override
-  public void postAnalyze(HiveSemanticAnalyzerHookContext context,
-      List<Task<? extends Serializable>> rootTasks) throws SemanticException {
-
-    try{
-
-      switch (ast.getToken().getType()) {
-
-      case HiveParser.TOK_CREATETABLE:
-      case HiveParser.TOK_CREATEDATABASE:
-      case HiveParser.TOK_ALTERTABLE_PARTITION:
-
-      // HCat will allow these operations to be performed.
-      // Database DDL
-      case HiveParser.TOK_SHOWDATABASES:
-      case HiveParser.TOK_DROPDATABASE:
-      case HiveParser.TOK_SWITCHDATABASE:
-      case HiveParser.TOK_DESCDATABASE:
-      case HiveParser.TOK_ALTERDATABASE_PROPERTIES:
-
-      // Index DDL
-      case HiveParser.TOK_ALTERINDEX_PROPERTIES:
-      case HiveParser.TOK_CREATEINDEX:
-      case HiveParser.TOK_DROPINDEX:
-      case HiveParser.TOK_SHOWINDEXES:
-
-      // View DDL
-      //case HiveParser.TOK_ALTERVIEW_ADDPARTS:
-      case HiveParser.TOK_ALTERVIEW_DROPPARTS:
-      case HiveParser.TOK_ALTERVIEW_PROPERTIES:
-      case HiveParser.TOK_ALTERVIEW_RENAME:
-      case HiveParser.TOK_CREATEVIEW:
-      case HiveParser.TOK_DROPVIEW:
-
-      // Authorization DDL
-      case HiveParser.TOK_CREATEROLE:
-      case HiveParser.TOK_DROPROLE:
-      case HiveParser.TOK_GRANT_ROLE:
-      case HiveParser.TOK_GRANT_WITH_OPTION:
-      case HiveParser.TOK_GRANT:
-      case HiveParser.TOK_REVOKE_ROLE:
-      case HiveParser.TOK_REVOKE:
-      case HiveParser.TOK_SHOW_GRANT:
-      case HiveParser.TOK_SHOW_ROLE_GRANT:
-
-      // Misc DDL
-      case HiveParser.TOK_LOCKTABLE:
-      case HiveParser.TOK_UNLOCKTABLE:
-      case HiveParser.TOK_SHOWLOCKS:
-      case HiveParser.TOK_DESCFUNCTION:
-      case HiveParser.TOK_SHOWFUNCTIONS:
-      case HiveParser.TOK_EXPLAIN:
-
-      // Table DDL
-      case HiveParser.TOK_ALTERTABLE_ADDPARTS:
-      case HiveParser.TOK_ALTERTABLE_ADDCOLS:
-      case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
-      case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
-      case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
-      case HiveParser.TOK_ALTERTABLE_DROPPARTS:
-      case HiveParser.TOK_ALTERTABLE_PROPERTIES:
-      case HiveParser.TOK_ALTERTABLE_RENAME:
-      case HiveParser.TOK_ALTERTABLE_RENAMECOL:
-      case HiveParser.TOK_ALTERTABLE_REPLACECOLS:
-      case HiveParser.TOK_ALTERTABLE_SERIALIZER:
-      case HiveParser.TOK_ALTERTABLE_TOUCH:
-      case HiveParser.TOK_DESCTABLE:
-      case HiveParser.TOK_DROPTABLE:
-      case HiveParser.TOK_SHOW_TABLESTATUS:
-      case HiveParser.TOK_SHOWPARTITIONS:
-      case HiveParser.TOK_SHOWTABLES:
-        break;
-
-      default:
-        throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, "Unexpected token: "+ast.getToken());
-      }
-
-      authorizeDDL(context, rootTasks);
-
-    } catch(HCatException e){
-      throw new SemanticException(e);
-    } catch (HiveException e) {
-      throw new SemanticException(e);
-    }
-
-    if(hook != null){
-      hook.postAnalyze(context, rootTasks);
-    }
-  }
-
-  private String extractTableName (String compoundName) {
-    /* 
-     * the table name can potentially be a dot-format one with column names
-     * specified as part of the table name. e.g. a.b.c where b is a column in
-     * a and c is a field of the object/column b etc. For authorization 
-     * purposes, we should use only the first part of the dotted name format.
-     *
-     */
-
-   String [] words = compoundName.split("\\.");
-   return words[0];
-  }
-
-  @Override
-  protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext cntxt, Hive hive, DDLWork work)
-      throws HiveException {
-    // DB opereations, none of them are enforced by Hive right now.
-
-    ShowDatabasesDesc showDatabases = work.getShowDatabasesDesc();
-    if (showDatabases != null) {
-      authorize(HiveOperation.SHOWDATABASES.getInputRequiredPrivileges(),
-          HiveOperation.SHOWDATABASES.getOutputRequiredPrivileges());
-    }
-
-    DropDatabaseDesc dropDb = work.getDropDatabaseDesc();
-    if (dropDb != null) {
-      Database db = cntxt.getHive().getDatabase(dropDb.getDatabaseName());
-      authorize(db, Privilege.DROP);
-    }
-
-    DescDatabaseDesc descDb = work.getDescDatabaseDesc();
-    if (descDb != null) {
-      Database db = cntxt.getHive().getDatabase(descDb.getDatabaseName());
-      authorize(db, Privilege.SELECT);
-    }
-
-    SwitchDatabaseDesc switchDb = work.getSwitchDatabaseDesc();
-    if (switchDb != null) {
-      Database db = cntxt.getHive().getDatabase(switchDb.getDatabaseName());
-      authorize(db, Privilege.SELECT);
-    }
-
-    ShowTablesDesc showTables = work.getShowTblsDesc();
-    if (showTables != null) {
-      String dbName = showTables.getDbName() == null ? cntxt.getHive().getCurrentDatabase()
-          : showTables.getDbName();
-      authorize(cntxt.getHive().getDatabase(dbName), Privilege.SELECT);
-    }
-
-    ShowTableStatusDesc showTableStatus = work.getShowTblStatusDesc();
-    if (showTableStatus != null) {
-      String dbName = showTableStatus.getDbName() == null ? cntxt.getHive().getCurrentDatabase()
-          : showTableStatus.getDbName();
-      authorize(cntxt.getHive().getDatabase(dbName), Privilege.SELECT);
-    }
-
-    // TODO: add alter database support in HCat
-
-    // Table operations.
-
-    DropTableDesc dropTable = work.getDropTblDesc();
-    if (dropTable != null) {
-      if (dropTable.getPartSpecs() == null) {
-        // drop table is already enforced by Hive. We only check for table level location even if the
-        // table is partitioned.
-      } else {
-        //this is actually a ALTER TABLE DROP PARITITION statement
-        for (PartitionSpec partSpec : dropTable.getPartSpecs()) {
-          // partitions are not added as write entries in drop partitions in Hive
-          Table table = hive.getTable(hive.getCurrentDatabase(), dropTable.getTableName());
-          List<Partition> partitions = null;
-          try {
-            partitions = hive.getPartitionsByFilter(table, partSpec.toString());
-           } catch (Exception e) {
-            throw new HiveException(e);
-           }
-
-          for (Partition part : partitions) {
-            authorize(part, Privilege.DROP);
-          }
         }
-      }
     }
 
-    AlterTableDesc alterTable = work.getAlterTblDesc();
-    if (alterTable != null) {
-      Table table = hive.getTable(hive.getCurrentDatabase(), alterTable.getOldName(), false);
+    @Override
+    public void postAnalyze(HiveSemanticAnalyzerHookContext context,
+                            List<Task<? extends Serializable>> rootTasks) throws SemanticException {
 
-      Partition part = null;
-      if (alterTable.getPartSpec() != null) {
-        part = hive.getPartition(table, alterTable.getPartSpec(), false);
-      }
+        try {
 
-      String newLocation = alterTable.getNewLocation();
+            switch (ast.getToken().getType()) {
 
-      /* Hcat requires ALTER_DATA privileges for ALTER TABLE LOCATION statements
-       * for the old table/partition location and the new location.
-       */
-      if (alterTable.getOp() == AlterTableDesc.AlterTableTypes.ALTERLOCATION) {
-        if (part != null) {
-          authorize(part, Privilege.ALTER_DATA); // authorize for the old
-                                                 // location, and new location
-          part.setLocation(newLocation);
-          authorize(part, Privilege.ALTER_DATA);
-        } else {
-          authorize(table, Privilege.ALTER_DATA); // authorize for the old
-                                                  // location, and new location
-          table.getTTable().getSd().setLocation(newLocation);
-          authorize(table, Privilege.ALTER_DATA);
+            case HiveParser.TOK_CREATETABLE:
+            case HiveParser.TOK_CREATEDATABASE:
+            case HiveParser.TOK_ALTERTABLE_PARTITION:
+
+                // HCat will allow these operations to be performed.
+                // Database DDL
+            case HiveParser.TOK_SHOWDATABASES:
+            case HiveParser.TOK_DROPDATABASE:
+            case HiveParser.TOK_SWITCHDATABASE:
+            case HiveParser.TOK_DESCDATABASE:
+            case HiveParser.TOK_ALTERDATABASE_PROPERTIES:
+
+                // Index DDL
+            case HiveParser.TOK_ALTERINDEX_PROPERTIES:
+            case HiveParser.TOK_CREATEINDEX:
+            case HiveParser.TOK_DROPINDEX:
+            case HiveParser.TOK_SHOWINDEXES:
+
+                // View DDL
+                //case HiveParser.TOK_ALTERVIEW_ADDPARTS:
+            case HiveParser.TOK_ALTERVIEW_DROPPARTS:
+            case HiveParser.TOK_ALTERVIEW_PROPERTIES:
+            case HiveParser.TOK_ALTERVIEW_RENAME:
+            case HiveParser.TOK_CREATEVIEW:
+            case HiveParser.TOK_DROPVIEW:
+
+                // Authorization DDL
+            case HiveParser.TOK_CREATEROLE:
+            case HiveParser.TOK_DROPROLE:
+            case HiveParser.TOK_GRANT_ROLE:
+            case HiveParser.TOK_GRANT_WITH_OPTION:
+            case HiveParser.TOK_GRANT:
+            case HiveParser.TOK_REVOKE_ROLE:
+            case HiveParser.TOK_REVOKE:
+            case HiveParser.TOK_SHOW_GRANT:
+            case HiveParser.TOK_SHOW_ROLE_GRANT:
+
+                // Misc DDL
+            case HiveParser.TOK_LOCKTABLE:
+            case HiveParser.TOK_UNLOCKTABLE:
+            case HiveParser.TOK_SHOWLOCKS:
+            case HiveParser.TOK_DESCFUNCTION:
+            case HiveParser.TOK_SHOWFUNCTIONS:
+            case HiveParser.TOK_EXPLAIN:
+
+                // Table DDL
+            case HiveParser.TOK_ALTERTABLE_ADDPARTS:
+            case HiveParser.TOK_ALTERTABLE_ADDCOLS:
+            case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
+            case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
+            case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
+            case HiveParser.TOK_ALTERTABLE_DROPPARTS:
+            case HiveParser.TOK_ALTERTABLE_PROPERTIES:
+            case HiveParser.TOK_ALTERTABLE_RENAME:
+            case HiveParser.TOK_ALTERTABLE_RENAMECOL:
+            case HiveParser.TOK_ALTERTABLE_REPLACECOLS:
+            case HiveParser.TOK_ALTERTABLE_SERIALIZER:
+            case HiveParser.TOK_ALTERTABLE_TOUCH:
+            case HiveParser.TOK_DESCTABLE:
+            case HiveParser.TOK_DROPTABLE:
+            case HiveParser.TOK_SHOW_TABLESTATUS:
+            case HiveParser.TOK_SHOWPARTITIONS:
+            case HiveParser.TOK_SHOWTABLES:
+                break;
+
+            default:
+                throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, "Unexpected token: " + ast.getToken());
+            }
+
+            authorizeDDL(context, rootTasks);
+
+        } catch (HCatException e) {
+            throw new SemanticException(e);
+        } catch (HiveException e) {
+            throw new SemanticException(e);
         }
-      }
-      //other alter operations are already supported by Hive
+
+        if (hook != null) {
+            hook.postAnalyze(context, rootTasks);
+        }
     }
 
-    // we should be careful when authorizing table based on just the 
-    // table name. If columns have separate authorization domain, it 
-    // must be honored
-    DescTableDesc descTable = work.getDescTblDesc();
-    if (descTable != null) {
-      String tableName = extractTableName(descTable.getTableName());
-      authorizeTable(cntxt.getHive(), tableName, Privilege.SELECT);
+    private String extractTableName(String compoundName) {
+        /*
+        * the table name can potentially be a dot-format one with column names
+        * specified as part of the table name. e.g. a.b.c where b is a column in
+        * a and c is a field of the object/column b etc. For authorization
+        * purposes, we should use only the first part of the dotted name format.
+        *
+        */
+
+        String[] words = compoundName.split("\\.");
+        return words[0];
     }
 
-    ShowPartitionsDesc showParts = work.getShowPartsDesc();
-    if (showParts != null) {
-      String tableName = extractTableName(showParts.getTabName());
-      authorizeTable(cntxt.getHive(), tableName, Privilege.SELECT);
+    @Override
+    protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext cntxt, Hive hive, DDLWork work)
+        throws HiveException {
+        // DB opereations, none of them are enforced by Hive right now.
+
+        ShowDatabasesDesc showDatabases = work.getShowDatabasesDesc();
+        if (showDatabases != null) {
+            authorize(HiveOperation.SHOWDATABASES.getInputRequiredPrivileges(),
+                HiveOperation.SHOWDATABASES.getOutputRequiredPrivileges());
+        }
+
+        DropDatabaseDesc dropDb = work.getDropDatabaseDesc();
+        if (dropDb != null) {
+            Database db = cntxt.getHive().getDatabase(dropDb.getDatabaseName());
+            authorize(db, Privilege.DROP);
+        }
+
+        DescDatabaseDesc descDb = work.getDescDatabaseDesc();
+        if (descDb != null) {
+            Database db = cntxt.getHive().getDatabase(descDb.getDatabaseName());
+            authorize(db, Privilege.SELECT);
+        }
+
+        SwitchDatabaseDesc switchDb = work.getSwitchDatabaseDesc();
+        if (switchDb != null) {
+            Database db = cntxt.getHive().getDatabase(switchDb.getDatabaseName());
+            authorize(db, Privilege.SELECT);
+        }
+
+        ShowTablesDesc showTables = work.getShowTblsDesc();
+        if (showTables != null) {
+            String dbName = showTables.getDbName() == null ? cntxt.getHive().getCurrentDatabase()
+                : showTables.getDbName();
+            authorize(cntxt.getHive().getDatabase(dbName), Privilege.SELECT);
+        }
+
+        ShowTableStatusDesc showTableStatus = work.getShowTblStatusDesc();
+        if (showTableStatus != null) {
+            String dbName = showTableStatus.getDbName() == null ? cntxt.getHive().getCurrentDatabase()
+                : showTableStatus.getDbName();
+            authorize(cntxt.getHive().getDatabase(dbName), Privilege.SELECT);
+        }
+
+        // TODO: add alter database support in HCat
+
+        // Table operations.
+
+        DropTableDesc dropTable = work.getDropTblDesc();
+        if (dropTable != null) {
+            if (dropTable.getPartSpecs() == null) {
+                // drop table is already enforced by Hive. We only check for table level location even if the
+                // table is partitioned.
+            } else {
+                //this is actually a ALTER TABLE DROP PARITITION statement
+                for (PartitionSpec partSpec : dropTable.getPartSpecs()) {
+                    // partitions are not added as write entries in drop partitions in Hive
+                    Table table = hive.getTable(hive.getCurrentDatabase(), dropTable.getTableName());
+                    List<Partition> partitions = null;
+                    try {
+                        partitions = hive.getPartitionsByFilter(table, partSpec.toString());
+                    } catch (Exception e) {
+                        throw new HiveException(e);
+                    }
+
+                    for (Partition part : partitions) {
+                        authorize(part, Privilege.DROP);
+                    }
+                }
+            }
+        }
+
+        AlterTableDesc alterTable = work.getAlterTblDesc();
+        if (alterTable != null) {
+            Table table = hive.getTable(hive.getCurrentDatabase(), alterTable.getOldName(), false);
+
+            Partition part = null;
+            if (alterTable.getPartSpec() != null) {
+                part = hive.getPartition(table, alterTable.getPartSpec(), false);
+            }
+
+            String newLocation = alterTable.getNewLocation();
+
+            /* Hcat requires ALTER_DATA privileges for ALTER TABLE LOCATION statements
+            * for the old table/partition location and the new location.
+            */
+            if (alterTable.getOp() == AlterTableDesc.AlterTableTypes.ALTERLOCATION) {
+                if (part != null) {
+                    authorize(part, Privilege.ALTER_DATA); // authorize for the old
+                    // location, and new location
+                    part.setLocation(newLocation);
+                    authorize(part, Privilege.ALTER_DATA);
+                } else {
+                    authorize(table, Privilege.ALTER_DATA); // authorize for the old
+                    // location, and new location
+                    table.getTTable().getSd().setLocation(newLocation);
+                    authorize(table, Privilege.ALTER_DATA);
+                }
+            }
+            //other alter operations are already supported by Hive
+        }
+
+        // we should be careful when authorizing table based on just the
+        // table name. If columns have separate authorization domain, it
+        // must be honored
+        DescTableDesc descTable = work.getDescTblDesc();
+        if (descTable != null) {
+            String tableName = extractTableName(descTable.getTableName());
+            authorizeTable(cntxt.getHive(), tableName, Privilege.SELECT);
+        }
+
+        ShowPartitionsDesc showParts = work.getShowPartsDesc();
+        if (showParts != null) {
+            String tableName = extractTableName(showParts.getTabName());
+            authorizeTable(cntxt.getHive(), tableName, Privilege.SELECT);
+        }
     }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzerBase.java b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzerBase.java
index 4b394e1..df99a8e 100644
--- a/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzerBase.java
+++ b/src/java/org/apache/hcatalog/cli/SemanticAnalysis/HCatSemanticAnalyzerBase.java
@@ -38,142 +38,141 @@
 import org.apache.hadoop.hive.ql.security.authorization.Privilege;
 import org.apache.hadoop.hive.ql.session.SessionState;
 
-/** 
+/**
  * Base class for HCatSemanticAnalyzer hooks.
  */
 public class HCatSemanticAnalyzerBase extends AbstractSemanticAnalyzerHook {
 
-  private HiveAuthorizationProvider authProvider;
-  
-  protected String getDbName(Hive hive, String dbName) {
-    return dbName == null ? hive.getCurrentDatabase() : dbName;
-  }
-  
-  public HiveAuthorizationProvider getAuthProvider() {
-    if (authProvider == null) {
-      authProvider = SessionState.get().getAuthorizer();
-    }
-    
-    return authProvider;
-  }
+    private HiveAuthorizationProvider authProvider;
 
-  @Override
-  public void postAnalyze(HiveSemanticAnalyzerHookContext context,
-      List<Task<? extends Serializable>> rootTasks) throws SemanticException {
-    super.postAnalyze(context, rootTasks);
-    
-    //Authorize the operation.
-    authorizeDDL(context, rootTasks);
-  }
-  
-  /** 
-   * Checks for the given rootTasks, and calls authorizeDDLWork() for each DDLWork to 
-   * be authorized. The hooks should override this, or authorizeDDLWork to perform the 
-   * actual authorization.
-   */
-  /*
-   * Impl note: Hive provides authorization with it's own model, and calls the defined 
-   * HiveAuthorizationProvider from Driver.doAuthorization(). However, HCat has to 
-   * do additional calls to the auth provider to implement expected behavior for 
-   * StorageDelegationAuthorizationProvider. This means, that the defined auth provider 
-   * is called by both Hive and HCat. The following are missing from Hive's implementation,
-   * and when they are fixed in Hive, we can remove the HCat-specific auth checks.   
-   * 1. CREATE DATABASE/TABLE, ADD PARTITION statements does not call 
-   * HiveAuthorizationProvider.authorize() with the candidate objects, which means that
-   * we cannot do checks against defined LOCATION.
-   * 2. HiveOperation does not define sufficient Privileges for most of the operations, 
-   * especially database operations. 
-   * 3. For some of the operations, Hive SemanticAnalyzer does not add the changed 
-   * object as a WriteEntity or ReadEntity.
-   * 
-   * @see https://issues.apache.org/jira/browse/HCATALOG-244
-   * @see https://issues.apache.org/jira/browse/HCATALOG-245
-   */
-  protected void authorizeDDL(HiveSemanticAnalyzerHookContext context, 
-      List<Task<? extends Serializable>> rootTasks)  throws SemanticException {
-    
-    if (!HiveConf.getBoolVar(context.getConf(),
-        HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {
-      return;
+    protected String getDbName(Hive hive, String dbName) {
+        return dbName == null ? hive.getCurrentDatabase() : dbName;
     }
-    
-    Hive hive;
-    try {
-      hive = context.getHive();
-    
-      for (Task<? extends Serializable> task : rootTasks) {
-        if (task.getWork() instanceof DDLWork) {
-          DDLWork work = (DDLWork)task.getWork();
-          if (work != null) {
-            authorizeDDLWork(context, hive, work);
-          }
+
+    public HiveAuthorizationProvider getAuthProvider() {
+        if (authProvider == null) {
+            authProvider = SessionState.get().getAuthorizer();
         }
-      }
-    } catch (SemanticException ex) {
-      throw ex;
-    } catch (AuthorizationException ex) {
-      throw ex;
-    } catch (Exception ex) {
-      throw new SemanticException(ex);
-    }
-  }
-  
-  /** 
-   * Authorized the given DDLWork. Does nothing by default. Override this 
-   * and delegate to the relevant method in HiveAuthorizationProvider obtained by 
-   * getAuthProvider().
-   */
-  protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext context,
-      Hive hive, DDLWork work) throws HiveException {
-  }
 
-  protected void authorize(Privilege[] inputPrivs, Privilege[] outputPrivs)
-      throws AuthorizationException, SemanticException {
-    try {
-      getAuthProvider().authorize(inputPrivs, outputPrivs);
-    } catch (HiveException ex) {
-      throw new SemanticException(ex);
+        return authProvider;
     }
-  }
-  
-  protected void authorize(Database db, Privilege priv) 
-      throws AuthorizationException, SemanticException {
-    try {
-      getAuthProvider().authorize(db, null, new Privilege[] {priv});
-    } catch (HiveException ex) {
-      throw new SemanticException(ex);
+
+    @Override
+    public void postAnalyze(HiveSemanticAnalyzerHookContext context,
+                            List<Task<? extends Serializable>> rootTasks) throws SemanticException {
+        super.postAnalyze(context, rootTasks);
+
+        //Authorize the operation.
+        authorizeDDL(context, rootTasks);
     }
-  }
-  
-  protected void authorizeTable(Hive hive, String tableName, Privilege priv) 
-      throws AuthorizationException, HiveException {
-    Table table;
-    try{
-      table = hive.getTable(tableName);
+
+    /**
+     * Checks for the given rootTasks, and calls authorizeDDLWork() for each DDLWork to
+     * be authorized. The hooks should override this, or authorizeDDLWork to perform the
+     * actual authorization.
+     */
+    /*
+    * Impl note: Hive provides authorization with it's own model, and calls the defined
+    * HiveAuthorizationProvider from Driver.doAuthorization(). However, HCat has to
+    * do additional calls to the auth provider to implement expected behavior for
+    * StorageDelegationAuthorizationProvider. This means, that the defined auth provider
+    * is called by both Hive and HCat. The following are missing from Hive's implementation,
+    * and when they are fixed in Hive, we can remove the HCat-specific auth checks.
+    * 1. CREATE DATABASE/TABLE, ADD PARTITION statements does not call
+    * HiveAuthorizationProvider.authorize() with the candidate objects, which means that
+    * we cannot do checks against defined LOCATION.
+    * 2. HiveOperation does not define sufficient Privileges for most of the operations,
+    * especially database operations.
+    * 3. For some of the operations, Hive SemanticAnalyzer does not add the changed
+    * object as a WriteEntity or ReadEntity.
+    *
+    * @see https://issues.apache.org/jira/browse/HCATALOG-244
+    * @see https://issues.apache.org/jira/browse/HCATALOG-245
+    */
+    protected void authorizeDDL(HiveSemanticAnalyzerHookContext context,
+                                List<Task<? extends Serializable>> rootTasks) throws SemanticException {
+
+        if (!HiveConf.getBoolVar(context.getConf(),
+            HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {
+            return;
+        }
+
+        Hive hive;
+        try {
+            hive = context.getHive();
+
+            for (Task<? extends Serializable> task : rootTasks) {
+                if (task.getWork() instanceof DDLWork) {
+                    DDLWork work = (DDLWork) task.getWork();
+                    if (work != null) {
+                        authorizeDDLWork(context, hive, work);
+                    }
+                }
+            }
+        } catch (SemanticException ex) {
+            throw ex;
+        } catch (AuthorizationException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new SemanticException(ex);
+        }
     }
-    catch(InvalidTableException ite){
-      // Table itself doesn't exist in metastore, nothing to validate.
-      return;
+
+    /**
+     * Authorized the given DDLWork. Does nothing by default. Override this
+     * and delegate to the relevant method in HiveAuthorizationProvider obtained by
+     * getAuthProvider().
+     */
+    protected void authorizeDDLWork(HiveSemanticAnalyzerHookContext context,
+                                    Hive hive, DDLWork work) throws HiveException {
     }
-    
-    authorize(table, priv);
-  }
-  
-  protected void authorize(Table table, Privilege priv) 
-      throws AuthorizationException, SemanticException {
-    try {
-      getAuthProvider().authorize(table, new Privilege[] {priv}, null);
-    } catch (HiveException ex) {
-      throw new SemanticException(ex);
+
+    protected void authorize(Privilege[] inputPrivs, Privilege[] outputPrivs)
+        throws AuthorizationException, SemanticException {
+        try {
+            getAuthProvider().authorize(inputPrivs, outputPrivs);
+        } catch (HiveException ex) {
+            throw new SemanticException(ex);
+        }
     }
-  }
-  
-  protected void authorize(Partition part, Privilege priv) 
-      throws AuthorizationException, SemanticException {
-    try {
-      getAuthProvider().authorize(part, new Privilege[] {priv}, null);
-    } catch (HiveException ex) {
-      throw new SemanticException(ex);
+
+    protected void authorize(Database db, Privilege priv)
+        throws AuthorizationException, SemanticException {
+        try {
+            getAuthProvider().authorize(db, null, new Privilege[]{priv});
+        } catch (HiveException ex) {
+            throw new SemanticException(ex);
+        }
     }
-  }
+
+    protected void authorizeTable(Hive hive, String tableName, Privilege priv)
+        throws AuthorizationException, HiveException {
+        Table table;
+        try {
+            table = hive.getTable(tableName);
+        } catch (InvalidTableException ite) {
+            // Table itself doesn't exist in metastore, nothing to validate.
+            return;
+        }
+
+        authorize(table, priv);
+    }
+
+    protected void authorize(Table table, Privilege priv)
+        throws AuthorizationException, SemanticException {
+        try {
+            getAuthProvider().authorize(table, new Privilege[]{priv}, null);
+        } catch (HiveException ex) {
+            throw new SemanticException(ex);
+        }
+    }
+
+    protected void authorize(Partition part, Privilege priv)
+        throws AuthorizationException, SemanticException {
+        try {
+            getAuthProvider().authorize(part, new Privilege[]{priv}, null);
+        } catch (HiveException ex) {
+            throw new SemanticException(ex);
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/common/HCatConstants.java b/src/java/org/apache/hcatalog/common/HCatConstants.java
index ad5a355..626d91b 100644
--- a/src/java/org/apache/hcatalog/common/HCatConstants.java
+++ b/src/java/org/apache/hcatalog/common/HCatConstants.java
@@ -23,140 +23,140 @@
 
 public final class HCatConstants {
 
-  public static final String HIVE_RCFILE_IF_CLASS = "org.apache.hadoop.hive.ql.io.RCFileInputFormat";
-  public static final String HIVE_RCFILE_OF_CLASS = "org.apache.hadoop.hive.ql.io.RCFileOutputFormat";
+    public static final String HIVE_RCFILE_IF_CLASS = "org.apache.hadoop.hive.ql.io.RCFileInputFormat";
+    public static final String HIVE_RCFILE_OF_CLASS = "org.apache.hadoop.hive.ql.io.RCFileOutputFormat";
 
-  public static final String SEQUENCEFILE_INPUT = SequenceFileInputFormat.class.getName();
-  public static final String SEQUENCEFILE_OUTPUT = SequenceFileOutputFormat.class.getName();
+    public static final String SEQUENCEFILE_INPUT = SequenceFileInputFormat.class.getName();
+    public static final String SEQUENCEFILE_OUTPUT = SequenceFileOutputFormat.class.getName();
 
-  public static final String HCAT_PIG_STORAGE_CLASS = "org.apache.pig.builtin.PigStorage";
-  public static final String HCAT_PIG_LOADER = "hcat.pig.loader";
-  public static final String HCAT_PIG_LOADER_LOCATION_SET = HCAT_PIG_LOADER + ".location.set" ;
-  public static final String HCAT_PIG_LOADER_ARGS = "hcat.pig.loader.args";
-  public static final String HCAT_PIG_STORER = "hcat.pig.storer";
-  public static final String HCAT_PIG_STORER_ARGS = "hcat.pig.storer.args";
-  public static final String HCAT_PIG_ARGS_DELIMIT = "hcat.pig.args.delimiter";
-  public static final String HCAT_PIG_ARGS_DELIMIT_DEFAULT = ",";
-  public static final String HCAT_PIG_STORER_LOCATION_SET = HCAT_PIG_STORER + ".location.set" ;
-  public static final String HCAT_PIG_INNER_TUPLE_NAME = "hcat.pig.inner.tuple.name";
-  public static final String HCAT_PIG_INNER_TUPLE_NAME_DEFAULT = "innertuple";
-  public static final String HCAT_PIG_INNER_FIELD_NAME = "hcat.pig.inner.field.name";
-  public static final String HCAT_PIG_INNER_FIELD_NAME_DEFAULT = "innerfield";
+    public static final String HCAT_PIG_STORAGE_CLASS = "org.apache.pig.builtin.PigStorage";
+    public static final String HCAT_PIG_LOADER = "hcat.pig.loader";
+    public static final String HCAT_PIG_LOADER_LOCATION_SET = HCAT_PIG_LOADER + ".location.set";
+    public static final String HCAT_PIG_LOADER_ARGS = "hcat.pig.loader.args";
+    public static final String HCAT_PIG_STORER = "hcat.pig.storer";
+    public static final String HCAT_PIG_STORER_ARGS = "hcat.pig.storer.args";
+    public static final String HCAT_PIG_ARGS_DELIMIT = "hcat.pig.args.delimiter";
+    public static final String HCAT_PIG_ARGS_DELIMIT_DEFAULT = ",";
+    public static final String HCAT_PIG_STORER_LOCATION_SET = HCAT_PIG_STORER + ".location.set";
+    public static final String HCAT_PIG_INNER_TUPLE_NAME = "hcat.pig.inner.tuple.name";
+    public static final String HCAT_PIG_INNER_TUPLE_NAME_DEFAULT = "innertuple";
+    public static final String HCAT_PIG_INNER_FIELD_NAME = "hcat.pig.inner.field.name";
+    public static final String HCAT_PIG_INNER_FIELD_NAME_DEFAULT = "innerfield";
 
-  //The keys used to store info into the job Configuration
-  public static final String HCAT_KEY_BASE = "mapreduce.lib.hcat";
+    //The keys used to store info into the job Configuration
+    public static final String HCAT_KEY_BASE = "mapreduce.lib.hcat";
 
-  public static final String HCAT_KEY_OUTPUT_SCHEMA = HCAT_KEY_BASE + ".output.schema";
+    public static final String HCAT_KEY_OUTPUT_SCHEMA = HCAT_KEY_BASE + ".output.schema";
 
-  public static final String HCAT_KEY_JOB_INFO =  HCAT_KEY_BASE + ".job.info";
+    public static final String HCAT_KEY_JOB_INFO = HCAT_KEY_BASE + ".job.info";
 
-  // hcatalog specific configurations, that can be put in hive-site.xml
-  public static final String HCAT_HIVE_CLIENT_EXPIRY_TIME = "hcatalog.hive.client.cache.expiry.time";
+    // hcatalog specific configurations, that can be put in hive-site.xml
+    public static final String HCAT_HIVE_CLIENT_EXPIRY_TIME = "hcatalog.hive.client.cache.expiry.time";
 
     private HCatConstants() { // restrict instantiation
-  }
+    }
 
-  public static final String HCAT_TABLE_SCHEMA = "hcat.table.schema";
+    public static final String HCAT_TABLE_SCHEMA = "hcat.table.schema";
 
-  public static final String HCAT_METASTORE_URI = HiveConf.ConfVars.METASTOREURIS.varname;
+    public static final String HCAT_METASTORE_URI = HiveConf.ConfVars.METASTOREURIS.varname;
 
-  public static final String HCAT_PERMS = "hcat.perms";
+    public static final String HCAT_PERMS = "hcat.perms";
 
-  public static final String HCAT_GROUP = "hcat.group";
+    public static final String HCAT_GROUP = "hcat.group";
 
-  public static final String HCAT_CREATE_TBL_NAME = "hcat.create.tbl.name";
+    public static final String HCAT_CREATE_TBL_NAME = "hcat.create.tbl.name";
 
-  public static final String HCAT_CREATE_DB_NAME = "hcat.create.db.name";
+    public static final String HCAT_CREATE_DB_NAME = "hcat.create.db.name";
 
-  public static final String HCAT_METASTORE_PRINCIPAL
-          = HiveConf.ConfVars.METASTORE_KERBEROS_PRINCIPAL.varname;
+    public static final String HCAT_METASTORE_PRINCIPAL
+        = HiveConf.ConfVars.METASTORE_KERBEROS_PRINCIPAL.varname;
 
-  // IMPORTANT IMPORTANT IMPORTANT!!!!!
-  //The keys used to store info into the job Configuration.
-  //If any new keys are added, the HCatStorer needs to be updated. The HCatStorer
-  //updates the job configuration in the backend to insert these keys to avoid
-  //having to call setOutput from the backend (which would cause a metastore call
-  //from the map jobs)
-  public static final String HCAT_KEY_OUTPUT_BASE = "mapreduce.lib.hcatoutput";
-  public static final String HCAT_KEY_OUTPUT_INFO = HCAT_KEY_OUTPUT_BASE + ".info";
-  public static final String HCAT_KEY_HIVE_CONF = HCAT_KEY_OUTPUT_BASE + ".hive.conf";
-  public static final String HCAT_KEY_TOKEN_SIGNATURE = HCAT_KEY_OUTPUT_BASE + ".token.sig";
+    // IMPORTANT IMPORTANT IMPORTANT!!!!!
+    //The keys used to store info into the job Configuration.
+    //If any new keys are added, the HCatStorer needs to be updated. The HCatStorer
+    //updates the job configuration in the backend to insert these keys to avoid
+    //having to call setOutput from the backend (which would cause a metastore call
+    //from the map jobs)
+    public static final String HCAT_KEY_OUTPUT_BASE = "mapreduce.lib.hcatoutput";
+    public static final String HCAT_KEY_OUTPUT_INFO = HCAT_KEY_OUTPUT_BASE + ".info";
+    public static final String HCAT_KEY_HIVE_CONF = HCAT_KEY_OUTPUT_BASE + ".hive.conf";
+    public static final String HCAT_KEY_TOKEN_SIGNATURE = HCAT_KEY_OUTPUT_BASE + ".token.sig";
 
-  public static final String[] OUTPUT_CONFS_TO_SAVE = {
-    HCAT_KEY_OUTPUT_INFO,
-    HCAT_KEY_HIVE_CONF,
-    HCAT_KEY_TOKEN_SIGNATURE
+    public static final String[] OUTPUT_CONFS_TO_SAVE = {
+        HCAT_KEY_OUTPUT_INFO,
+        HCAT_KEY_HIVE_CONF,
+        HCAT_KEY_TOKEN_SIGNATURE
     };
 
 
-  public static final String HCAT_MSG_CLEAN_FREQ = "hcat.msg.clean.freq";
-  public static final String HCAT_MSG_EXPIRY_DURATION = "hcat.msg.expiry.duration";
+    public static final String HCAT_MSG_CLEAN_FREQ = "hcat.msg.clean.freq";
+    public static final String HCAT_MSG_EXPIRY_DURATION = "hcat.msg.expiry.duration";
 
-  public static final String HCAT_MSGBUS_TOPIC_NAME = "hcat.msgbus.topic.name";
-  public static final String HCAT_MSGBUS_TOPIC_NAMING_POLICY = "hcat.msgbus.topic.naming.policy";
-  public static final String HCAT_MSGBUS_TOPIC_PREFIX = "hcat.msgbus.topic.prefix";
+    public static final String HCAT_MSGBUS_TOPIC_NAME = "hcat.msgbus.topic.name";
+    public static final String HCAT_MSGBUS_TOPIC_NAMING_POLICY = "hcat.msgbus.topic.naming.policy";
+    public static final String HCAT_MSGBUS_TOPIC_PREFIX = "hcat.msgbus.topic.prefix";
 
-  public static final String HCAT_DYNAMIC_PTN_JOBID = HCAT_KEY_OUTPUT_BASE + "dynamic.jobid";
-  public static final boolean HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED = false;
+    public static final String HCAT_DYNAMIC_PTN_JOBID = HCAT_KEY_OUTPUT_BASE + "dynamic.jobid";
+    public static final boolean HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED = false;
 
-  // Message Bus related properties.
-  public static final String HCAT_DEFAULT_TOPIC_PREFIX = "hcat";
-  public static final String HCAT_EVENT = "HCAT_EVENT";
-  public static final String HCAT_ADD_PARTITION_EVENT = "HCAT_ADD_PARTITION";
-  public static final String HCAT_DROP_PARTITION_EVENT = "HCAT_DROP_PARTITION";
-  public static final String HCAT_PARTITION_DONE_EVENT = "HCAT_PARTITION_DONE";
-  public static final String HCAT_ADD_TABLE_EVENT = "HCAT_ADD_TABLE";
-  public static final String HCAT_DROP_TABLE_EVENT = "HCAT_DROP_TABLE";
-  public static final String HCAT_ADD_DATABASE_EVENT = "HCAT_ADD_DATABASE";
-  public static final String HCAT_DROP_DATABASE_EVENT = "HCAT_DROP_DATABASE";
+    // Message Bus related properties.
+    public static final String HCAT_DEFAULT_TOPIC_PREFIX = "hcat";
+    public static final String HCAT_EVENT = "HCAT_EVENT";
+    public static final String HCAT_ADD_PARTITION_EVENT = "HCAT_ADD_PARTITION";
+    public static final String HCAT_DROP_PARTITION_EVENT = "HCAT_DROP_PARTITION";
+    public static final String HCAT_PARTITION_DONE_EVENT = "HCAT_PARTITION_DONE";
+    public static final String HCAT_ADD_TABLE_EVENT = "HCAT_ADD_TABLE";
+    public static final String HCAT_DROP_TABLE_EVENT = "HCAT_DROP_TABLE";
+    public static final String HCAT_ADD_DATABASE_EVENT = "HCAT_ADD_DATABASE";
+    public static final String HCAT_DROP_DATABASE_EVENT = "HCAT_DROP_DATABASE";
 
-  // System environment variables
-  public static final String SYSENV_HADOOP_TOKEN_FILE_LOCATION = "HADOOP_TOKEN_FILE_LOCATION";
+    // System environment variables
+    public static final String SYSENV_HADOOP_TOKEN_FILE_LOCATION = "HADOOP_TOKEN_FILE_LOCATION";
 
-  // Hadoop Conf Var Names
-  public static final String CONF_MAPREDUCE_JOB_CREDENTIALS_BINARY = "mapreduce.job.credentials.binary";
+    // Hadoop Conf Var Names
+    public static final String CONF_MAPREDUCE_JOB_CREDENTIALS_BINARY = "mapreduce.job.credentials.binary";
 
-  //***************************************************************************
-  // Data-related configuration properties.
-  //***************************************************************************
+    //***************************************************************************
+    // Data-related configuration properties.
+    //***************************************************************************
 
-  /**
-   * {@value} (default: {@value #HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT}).
-   * Pig < 0.10.0 does not have boolean support, and scripts written for pre-boolean Pig versions
-   * will not expect boolean values when upgrading Pig. For integration the option is offered to
-   * convert boolean fields to integers by setting this Hadoop configuration key.
-   */
-  public static final String HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER =
-      "hcat.data.convert.boolean.to.integer";
-  public static final boolean HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT = false;
+    /**
+     * {@value} (default: {@value #HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT}).
+     * Pig < 0.10.0 does not have boolean support, and scripts written for pre-boolean Pig versions
+     * will not expect boolean values when upgrading Pig. For integration the option is offered to
+     * convert boolean fields to integers by setting this Hadoop configuration key.
+     */
+    public static final String HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER =
+        "hcat.data.convert.boolean.to.integer";
+    public static final boolean HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT = false;
 
-  /**
-   * {@value} (default: {@value #HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT}).
-   * Hive tables support tinyint and smallint columns, while not all processing frameworks support
-   * these types (Pig only has integer for example). Enable this property to promote tinyint and
-   * smallint columns to integer at runtime. Note that writes to tinyint and smallint columns
-   * enforce bounds checking and jobs will fail if attempting to write values outside the column
-   * bounds.
-   */
-  public static final String HCAT_DATA_TINY_SMALL_INT_PROMOTION =
-      "hcat.data.tiny.small.int.promotion";
-  public static final boolean HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT = false;
+    /**
+     * {@value} (default: {@value #HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT}).
+     * Hive tables support tinyint and smallint columns, while not all processing frameworks support
+     * these types (Pig only has integer for example). Enable this property to promote tinyint and
+     * smallint columns to integer at runtime. Note that writes to tinyint and smallint columns
+     * enforce bounds checking and jobs will fail if attempting to write values outside the column
+     * bounds.
+     */
+    public static final String HCAT_DATA_TINY_SMALL_INT_PROMOTION =
+        "hcat.data.tiny.small.int.promotion";
+    public static final boolean HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT = false;
 
-  /**
-   * {@value} (default: {@value #HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT}).
-   * Threshold for the ratio of bad records that will be silently skipped without causing a task
-   * failure. This is useful when processing large data sets with corrupt records, when its
-   * acceptable to skip some bad records.
-   */
-  public static final String HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY = "hcat.input.bad.record.threshold";
-  public static final float HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT = 0.0001f;
+    /**
+     * {@value} (default: {@value #HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT}).
+     * Threshold for the ratio of bad records that will be silently skipped without causing a task
+     * failure. This is useful when processing large data sets with corrupt records, when its
+     * acceptable to skip some bad records.
+     */
+    public static final String HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY = "hcat.input.bad.record.threshold";
+    public static final float HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT = 0.0001f;
 
-  /**
-   * {@value} (default: {@value #HCAT_INPUT_BAD_RECORD_MIN_DEFAULT}).
-   * Number of bad records that will be accepted before applying
-   * {@value #HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY}. This is necessary to prevent an initial bad
-   * record from causing a task failure.
-   */
-  public static final String HCAT_INPUT_BAD_RECORD_MIN_KEY = "hcat.input.bad.record.min";
-  public static final int HCAT_INPUT_BAD_RECORD_MIN_DEFAULT = 2;
+    /**
+     * {@value} (default: {@value #HCAT_INPUT_BAD_RECORD_MIN_DEFAULT}).
+     * Number of bad records that will be accepted before applying
+     * {@value #HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY}. This is necessary to prevent an initial bad
+     * record from causing a task failure.
+     */
+    public static final String HCAT_INPUT_BAD_RECORD_MIN_KEY = "hcat.input.bad.record.min";
+    public static final int HCAT_INPUT_BAD_RECORD_MIN_DEFAULT = 2;
 }
diff --git a/src/java/org/apache/hcatalog/common/HCatContext.java b/src/java/org/apache/hcatalog/common/HCatContext.java
index ac357ae..f19489c 100644
--- a/src/java/org/apache/hcatalog/common/HCatContext.java
+++ b/src/java/org/apache/hcatalog/common/HCatContext.java
@@ -27,28 +27,28 @@
  */
 public class HCatContext {
 
-  private static final HCatContext hCatContext = new HCatContext();
+    private static final HCatContext hCatContext = new HCatContext();
 
-  private final Configuration conf;
+    private final Configuration conf;
 
-  private HCatContext() {
-    conf = new Configuration();
-  }
-
-  public static HCatContext getInstance() {
-    return hCatContext;
-  }
-
-  public Configuration getConf() {
-    return conf;
-  }
-
-  /**
-   * Merge the given configuration into the HCatContext conf, overwriting any existing keys.
-   */
-  public void mergeConf(Configuration conf) {
-    for (Map.Entry<String, String> entry : conf) {
-      this.conf.set(entry.getKey(), entry.getValue());
+    private HCatContext() {
+        conf = new Configuration();
     }
-  }
+
+    public static HCatContext getInstance() {
+        return hCatContext;
+    }
+
+    public Configuration getConf() {
+        return conf;
+    }
+
+    /**
+     * Merge the given configuration into the HCatContext conf, overwriting any existing keys.
+     */
+    public void mergeConf(Configuration conf) {
+        for (Map.Entry<String, String> entry : conf) {
+            this.conf.set(entry.getKey(), entry.getValue());
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/common/HCatException.java b/src/java/org/apache/hcatalog/common/HCatException.java
index deb2e1f..ed51c60 100644
--- a/src/java/org/apache/hcatalog/common/HCatException.java
+++ b/src/java/org/apache/hcatalog/common/HCatException.java
@@ -24,134 +24,135 @@
  */
 public class HCatException extends IOException {
 
-  private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-  /** The error type enum for this exception. */
-  private final ErrorType errorType;
+    /** The error type enum for this exception. */
+    private final ErrorType errorType;
 
-  /**
-   * Instantiates a new hcat exception.
-   * @param errorType the error type
-   */
-  public HCatException(ErrorType errorType) {
-    this(errorType, null, null);
-  }
-
-
-  /**
-   * Instantiates a new hcat exception.
-   * @param errorType the error type
-   * @param cause the cause
-   */
-  public HCatException(ErrorType errorType, Throwable cause) {
-    this(errorType, null, cause);
-  }
-
-  /**
-   * Instantiates a new hcat exception.
-   * @param errorType the error type
-   * @param extraMessage extra messages to add to the message string
-   */
-  public HCatException(ErrorType errorType, String extraMessage) {
-    this(errorType, extraMessage, null);
-  }
-
-  /**
-   * Instantiates a new hcat exception.
-   * @param errorType the error type
-   * @param extraMessage extra messages to add to the message string
-   * @param cause the cause
-   */
-  public HCatException(ErrorType errorType, String extraMessage, Throwable cause) {
-    super(buildErrorMessage(
-        errorType,
-        extraMessage,
-        cause), cause);
-    this.errorType = errorType;
-  }
-
-
-  //TODO : remove default error type constructors after all exceptions
-  //are changed to use error types
-  /**
-   * Instantiates a new hcat exception.
-   * @param message the error message
-   */
-  public HCatException(String message) {
-    this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, null);
-  }
-
-  /**
-   * Instantiates a new hcat exception.
-   * @param message the error message
-   * @param cause the cause
-   */
-  public HCatException(String message, Throwable cause) {
-    this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, cause);
-  }
-
-
-  /**
-   * Builds the error message string. The error type message is appended with the extra message. If appendCause
-   * is true for the error type, then the message of the cause also is added to the message.
-   * @param type the error type
-   * @param extraMessage the extra message string
-   * @param cause the cause for the exception
-   * @return the exception message string
-   */
-  public static String buildErrorMessage(ErrorType type, String extraMessage, Throwable cause) {
-
-    //Initial message is just the error type message
-    StringBuffer message = new StringBuffer(HCatException.class.getName());
-    message.append(" : " + type.getErrorCode());
-    message.append(" : " + type.getErrorMessage());
-
-    if( extraMessage != null ) {
-      //Add the extra message value to buffer
-      message.append(" : " + extraMessage);
+    /**
+     * Instantiates a new hcat exception.
+     * @param errorType the error type
+     */
+    public HCatException(ErrorType errorType) {
+        this(errorType, null, null);
     }
 
-    if( type.appendCauseMessage() ) {
-      if( cause != null ) {
-        //Add the cause message to buffer
-        message.append(". Cause : " + cause.toString());
-      }
+
+    /**
+     * Instantiates a new hcat exception.
+     * @param errorType the error type
+     * @param cause the cause
+     */
+    public HCatException(ErrorType errorType, Throwable cause) {
+        this(errorType, null, cause);
     }
 
-    return message.toString();
-  }
+    /**
+     * Instantiates a new hcat exception.
+     * @param errorType the error type
+     * @param extraMessage extra messages to add to the message string
+     */
+    public HCatException(ErrorType errorType, String extraMessage) {
+        this(errorType, extraMessage, null);
+    }
+
+    /**
+     * Instantiates a new hcat exception.
+     * @param errorType the error type
+     * @param extraMessage extra messages to add to the message string
+     * @param cause the cause
+     */
+    public HCatException(ErrorType errorType, String extraMessage, Throwable cause) {
+        super(buildErrorMessage(
+            errorType,
+            extraMessage,
+            cause), cause);
+        this.errorType = errorType;
+    }
 
 
-  /**
-   * Is this a retriable error.
-   * @return is it retriable
-   */
-  public boolean isRetriable() {
-    return errorType.isRetriable();
-  }
+    //TODO : remove default error type constructors after all exceptions
+    //are changed to use error types
 
-  /**
-   * Gets the error type.
-   * @return the error type enum
-   */
-  public ErrorType getErrorType() {
-    return errorType;
-  }
+    /**
+     * Instantiates a new hcat exception.
+     * @param message the error message
+     */
+    public HCatException(String message) {
+        this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, null);
+    }
 
-  /**
-   * Gets the error code.
-   * @return the error code
-   */
-  public int getErrorCode() {
-    return errorType.getErrorCode();
-  }
+    /**
+     * Instantiates a new hcat exception.
+     * @param message the error message
+     * @param cause the cause
+     */
+    public HCatException(String message, Throwable cause) {
+        this(ErrorType.ERROR_INTERNAL_EXCEPTION, message, cause);
+    }
 
-  /* (non-Javadoc)
-   * @see java.lang.Throwable#toString()
-   */
-  @Override
-  public String toString() {
-    return getMessage();
-  }
+
+    /**
+     * Builds the error message string. The error type message is appended with the extra message. If appendCause
+     * is true for the error type, then the message of the cause also is added to the message.
+     * @param type the error type
+     * @param extraMessage the extra message string
+     * @param cause the cause for the exception
+     * @return the exception message string
+     */
+    public static String buildErrorMessage(ErrorType type, String extraMessage, Throwable cause) {
+
+        //Initial message is just the error type message
+        StringBuffer message = new StringBuffer(HCatException.class.getName());
+        message.append(" : " + type.getErrorCode());
+        message.append(" : " + type.getErrorMessage());
+
+        if (extraMessage != null) {
+            //Add the extra message value to buffer
+            message.append(" : " + extraMessage);
+        }
+
+        if (type.appendCauseMessage()) {
+            if (cause != null) {
+                //Add the cause message to buffer
+                message.append(". Cause : " + cause.toString());
+            }
+        }
+
+        return message.toString();
+    }
+
+
+    /**
+     * Is this a retriable error.
+     * @return is it retriable
+     */
+    public boolean isRetriable() {
+        return errorType.isRetriable();
+    }
+
+    /**
+     * Gets the error type.
+     * @return the error type enum
+     */
+    public ErrorType getErrorType() {
+        return errorType;
+    }
+
+    /**
+     * Gets the error code.
+     * @return the error code
+     */
+    public int getErrorCode() {
+        return errorType.getErrorCode();
+    }
+
+    /* (non-Javadoc)
+    * @see java.lang.Throwable#toString()
+    */
+    @Override
+    public String toString() {
+        return getMessage();
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/common/HCatUtil.java b/src/java/org/apache/hcatalog/common/HCatUtil.java
index bee4210..10446e1 100644
--- a/src/java/org/apache/hcatalog/common/HCatUtil.java
+++ b/src/java/org/apache/hcatalog/common/HCatUtil.java
@@ -75,7 +75,7 @@
 
     private static final Logger LOG = LoggerFactory.getLogger(HCatUtil.class);
     private static volatile HiveClientCache hiveClientCache;
-    private final static int DEFAULT_HIVE_CACHE_EXPIRY_TIME_SECONDS = 2*60;
+    private final static int DEFAULT_HIVE_CACHE_EXPIRY_TIME_SECONDS = 2 * 60;
 
     public static boolean checkJobContextIfRunningFromBackend(JobContext j) {
         if (j.getConfiguration().get("mapred.task.id", "").equals("")) {
@@ -105,7 +105,7 @@
         }
         try {
             ByteArrayInputStream serialObj = new ByteArrayInputStream(
-                    decodeBytes(str));
+                decodeBytes(str));
             ObjectInputStream objStream = new ObjectInputStream(serialObj);
             return objStream.readObject();
         } catch (Exception e) {
@@ -136,9 +136,9 @@
     }
 
     public static List<HCatFieldSchema> getHCatFieldSchemaList(
-            FieldSchema... fields) throws HCatException {
+        FieldSchema... fields) throws HCatException {
         List<HCatFieldSchema> result = new ArrayList<HCatFieldSchema>(
-                fields.length);
+            fields.length);
 
         for (FieldSchema f : fields) {
             result.add(HCatSchemaUtils.getHCatFieldSchema(f));
@@ -148,7 +148,7 @@
     }
 
     public static List<HCatFieldSchema> getHCatFieldSchemaList(
-            List<FieldSchema> fields) throws HCatException {
+        List<FieldSchema> fields) throws HCatException {
         if (fields == null) {
             return null;
         } else {
@@ -169,7 +169,7 @@
     }
 
     public static List<FieldSchema> getFieldSchemaList(
-            List<HCatFieldSchema> hcatFields) {
+        List<HCatFieldSchema> hcatFields) {
         if (hcatFields == null) {
             return null;
         } else {
@@ -183,7 +183,7 @@
 
     public static Table getTable(HiveMetaStoreClient client, String dbName, String tableName)
         throws NoSuchObjectException, TException, MetaException {
-      return new Table(client.getTable(dbName, tableName));
+        return new Table(client.getTable(dbName, tableName));
     }
 
     public static HCatSchema getTableSchemaWithPtnCols(Table table) throws IOException {
@@ -229,7 +229,7 @@
      * @throws IOException Signals that an I/O exception has occurred.
      */
     public static List<FieldSchema> validatePartitionSchema(Table table,
-            HCatSchema partitionSchema) throws IOException {
+                                                            HCatSchema partitionSchema) throws IOException {
         Map<String, FieldSchema> partitionKeyMap = new HashMap<String, FieldSchema>();
 
         for (FieldSchema field : table.getPartitionKeys()) {
@@ -242,7 +242,7 @@
         for (int i = 0; i < partitionSchema.getFields().size(); i++) {
 
             FieldSchema field = HCatSchemaUtils.getFieldSchema(partitionSchema
-                    .getFields().get(i));
+                .getFields().get(i));
 
             FieldSchema tableField;
             if (i < tableCols.size()) {
@@ -250,19 +250,19 @@
 
                 if (!tableField.getName().equalsIgnoreCase(field.getName())) {
                     throw new HCatException(
-                            ErrorType.ERROR_SCHEMA_COLUMN_MISMATCH,
-                            "Expected column <" + tableField.getName()
-                                    + "> at position " + (i + 1)
-                                    + ", found column <" + field.getName()
-                                    + ">");
+                        ErrorType.ERROR_SCHEMA_COLUMN_MISMATCH,
+                        "Expected column <" + tableField.getName()
+                            + "> at position " + (i + 1)
+                            + ", found column <" + field.getName()
+                            + ">");
                 }
             } else {
                 tableField = partitionKeyMap.get(field.getName().toLowerCase());
 
                 if (tableField != null) {
                     throw new HCatException(
-                            ErrorType.ERROR_SCHEMA_PARTITION_KEY, "Key <"
-                                    + field.getName() + ">");
+                        ErrorType.ERROR_SCHEMA_PARTITION_KEY, "Key <"
+                        + field.getName() + ">");
                 }
             }
 
@@ -272,16 +272,16 @@
             } else {
                 // field present in both. validate type has not changed
                 TypeInfo partitionType = TypeInfoUtils
-                        .getTypeInfoFromTypeString(field.getType());
+                    .getTypeInfoFromTypeString(field.getType());
                 TypeInfo tableType = TypeInfoUtils
-                        .getTypeInfoFromTypeString(tableField.getType());
+                    .getTypeInfoFromTypeString(tableField.getType());
 
                 if (!partitionType.equals(tableType)) {
                     throw new HCatException(
-                            ErrorType.ERROR_SCHEMA_TYPE_MISMATCH, "Column <"
-                                    + field.getName() + ">, expected <"
-                                    + tableType.getTypeName() + ">, got <"
-                                    + partitionType.getTypeName() + ">");
+                        ErrorType.ERROR_SCHEMA_TYPE_MISMATCH, "Column <"
+                        + field.getName() + ">, expected <"
+                        + tableType.getTypeName() + ">, got <"
+                        + partitionType.getTypeName() + ">");
                 }
             }
         }
@@ -304,16 +304,16 @@
      */
     public static boolean validateMorePermissive(FsAction first, FsAction second) {
         if ((first == FsAction.ALL) || (second == FsAction.NONE)
-                || (first == second)) {
+            || (first == second)) {
             return true;
         }
         switch (first) {
-            case READ_EXECUTE:
-                return ((second == FsAction.READ) || (second == FsAction.EXECUTE));
-            case READ_WRITE:
-                return ((second == FsAction.READ) || (second == FsAction.WRITE));
-            case WRITE_EXECUTE:
-                return ((second == FsAction.WRITE) || (second == FsAction.EXECUTE));
+        case READ_EXECUTE:
+            return ((second == FsAction.READ) || (second == FsAction.EXECUTE));
+        case READ_WRITE:
+            return ((second == FsAction.READ) || (second == FsAction.WRITE));
+        case WRITE_EXECUTE:
+            return ((second == FsAction.WRITE) || (second == FsAction.EXECUTE));
         }
         return false;
     }
@@ -329,18 +329,18 @@
      */
     public static boolean validateExecuteBitPresentIfReadOrWrite(FsAction perms) {
         if ((perms == FsAction.READ) || (perms == FsAction.WRITE)
-                || (perms == FsAction.READ_WRITE)) {
+            || (perms == FsAction.READ_WRITE)) {
             return false;
         }
         return true;
     }
 
     public static Token<org.apache.hadoop.mapreduce.security.token.delegation.DelegationTokenIdentifier> getJobTrackerDelegationToken(
-            Configuration conf, String userName) throws Exception {
+        Configuration conf, String userName) throws Exception {
         // LOG.info("getJobTrackerDelegationToken("+conf+","+userName+")");
         JobClient jcl = new JobClient(new JobConf(conf, HCatOutputFormat.class));
         Token<org.apache.hadoop.mapreduce.security.token.delegation.DelegationTokenIdentifier> t = jcl
-                .getDelegationToken(new Text(userName));
+            .getDelegationToken(new Text(userName));
         // LOG.info("got "+t);
         return t;
 
@@ -348,8 +348,8 @@
     }
 
     public static Token<? extends AbstractDelegationTokenIdentifier> extractThriftToken(
-            String tokenStrForm, String tokenSignature) throws MetaException,
-            TException, IOException {
+        String tokenStrForm, String tokenSignature) throws MetaException,
+        TException, IOException {
         // LOG.info("extractThriftToken("+tokenStrForm+","+tokenSignature+")");
         Token<? extends AbstractDelegationTokenIdentifier> t = new Token<DelegationTokenIdentifier>();
         t.decodeFromUrlString(tokenStrForm);
@@ -369,19 +369,19 @@
      */
     public static HCatStorageHandler getStorageHandler(Configuration conf, StorerInfo storerInfo) throws IOException {
         return getStorageHandler(conf,
-                                 storerInfo.getStorageHandlerClass(),
-                                 storerInfo.getSerdeClass(),
-                                 storerInfo.getIfClass(),
-                                 storerInfo.getOfClass());
+            storerInfo.getStorageHandlerClass(),
+            storerInfo.getSerdeClass(),
+            storerInfo.getIfClass(),
+            storerInfo.getOfClass());
     }
 
     public static HCatStorageHandler getStorageHandler(Configuration conf, PartInfo partitionInfo) throws IOException {
-      return HCatUtil.getStorageHandler(
-          conf,
-          partitionInfo.getStorageHandlerClassName(),
-          partitionInfo.getSerdeClassName(),
-          partitionInfo.getInputFormatClassName(),
-          partitionInfo.getOutputFormatClassName());
+        return HCatUtil.getStorageHandler(
+            conf,
+            partitionInfo.getStorageHandlerClassName(),
+            partitionInfo.getSerdeClassName(),
+            partitionInfo.getInputFormatClassName(),
+            partitionInfo.getOutputFormatClassName());
     }
 
     /**
@@ -401,9 +401,9 @@
                                                        String serDe,
                                                        String inputFormat,
                                                        String outputFormat)
-    throws IOException {
+        throws IOException {
 
-        if ((storageHandler == null) || (storageHandler.equals(FosterStorageHandler.class.getName()))){
+        if ((storageHandler == null) || (storageHandler.equals(FosterStorageHandler.class.getName()))) {
             try {
                 FosterStorageHandler fosterStorageHandler =
                     new FosterStorageHandler(inputFormat, outputFormat, serDe);
@@ -411,57 +411,57 @@
                 return fosterStorageHandler;
             } catch (ClassNotFoundException e) {
                 throw new IOException("Failed to load "
-                    + "foster storage handler",e);
+                    + "foster storage handler", e);
             }
         }
 
         try {
             Class<? extends HCatStorageHandler> handlerClass =
-                        (Class<? extends HCatStorageHandler>) Class
+                (Class<? extends HCatStorageHandler>) Class
                     .forName(storageHandler, true, JavaUtils.getClassLoader());
-            return (HCatStorageHandler)ReflectionUtils.newInstance(
-                                                            handlerClass, conf);
+            return (HCatStorageHandler) ReflectionUtils.newInstance(
+                handlerClass, conf);
         } catch (ClassNotFoundException e) {
             throw new IOException("Error in loading storage handler."
-                    + e.getMessage(), e);
+                + e.getMessage(), e);
         }
     }
 
-    public static Pair<String,String> getDbAndTableName(String tableName) throws IOException{
-      String[] dbTableNametokens = tableName.split("\\.");
-      if(dbTableNametokens.length == 1) {
-        return new Pair<String,String>(MetaStoreUtils.DEFAULT_DATABASE_NAME,tableName);
-      }else if (dbTableNametokens.length == 2) {
-        return new Pair<String, String>(dbTableNametokens[0], dbTableNametokens[1]);
-      }else{
-        throw new IOException("tableName expected in the form "
-            +"<databasename>.<table name> or <table name>. Got " + tableName);
-      }
+    public static Pair<String, String> getDbAndTableName(String tableName) throws IOException {
+        String[] dbTableNametokens = tableName.split("\\.");
+        if (dbTableNametokens.length == 1) {
+            return new Pair<String, String>(MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName);
+        } else if (dbTableNametokens.length == 2) {
+            return new Pair<String, String>(dbTableNametokens[0], dbTableNametokens[1]);
+        } else {
+            throw new IOException("tableName expected in the form "
+                + "<databasename>.<table name> or <table name>. Got " + tableName);
+        }
     }
 
     public static Map<String, String>
-      getInputJobProperties(HCatStorageHandler storageHandler,
-                            InputJobInfo inputJobInfo) {
+    getInputJobProperties(HCatStorageHandler storageHandler,
+                          InputJobInfo inputJobInfo) {
         TableDesc tableDesc = new TableDesc(storageHandler.getSerDeClass(),
-                  storageHandler.getInputFormatClass(),
-                  storageHandler.getOutputFormatClass(),
-                  inputJobInfo.getTableInfo().getStorerInfo().getProperties());
-        if(tableDesc.getJobProperties() == null) {
+            storageHandler.getInputFormatClass(),
+            storageHandler.getOutputFormatClass(),
+            inputJobInfo.getTableInfo().getStorerInfo().getProperties());
+        if (tableDesc.getJobProperties() == null) {
             tableDesc.setJobProperties(new HashMap<String, String>());
         }
 
-        Map<String,String> jobProperties = new HashMap<String,String>();
+        Map<String, String> jobProperties = new HashMap<String, String>();
         try {
             tableDesc.getJobProperties().put(
                 HCatConstants.HCAT_KEY_JOB_INFO,
                 HCatUtil.serialize(inputJobInfo));
 
             storageHandler.configureInputJobProperties(tableDesc,
-                                                                jobProperties);
+                jobProperties);
 
         } catch (IOException e) {
             throw new IllegalStateException(
-                "Failed to configure StorageHandler",e);
+                "Failed to configure StorageHandler", e);
         }
 
         return jobProperties;
@@ -469,36 +469,36 @@
 
 
     public static void
-      configureOutputStorageHandler(HCatStorageHandler storageHandler,
-                                    JobContext context,
-                                    OutputJobInfo outputJobInfo) {
+    configureOutputStorageHandler(HCatStorageHandler storageHandler,
+                                  JobContext context,
+                                  OutputJobInfo outputJobInfo) {
         //TODO replace IgnoreKeyTextOutputFormat with a
         //HiveOutputFormatWrapper in StorageHandler
         TableDesc tableDesc = new TableDesc(storageHandler.getSerDeClass(),
-                  storageHandler.getInputFormatClass(),
-                  IgnoreKeyTextOutputFormat.class,
-                  outputJobInfo.getTableInfo().getStorerInfo().getProperties());
-        if(tableDesc.getJobProperties() == null)
+            storageHandler.getInputFormatClass(),
+            IgnoreKeyTextOutputFormat.class,
+            outputJobInfo.getTableInfo().getStorerInfo().getProperties());
+        if (tableDesc.getJobProperties() == null)
             tableDesc.setJobProperties(new HashMap<String, String>());
-        for (Map.Entry<String,String> el: context.getConfiguration()) {
-           tableDesc.getJobProperties().put(el.getKey(),el.getValue());
+        for (Map.Entry<String, String> el : context.getConfiguration()) {
+            tableDesc.getJobProperties().put(el.getKey(), el.getValue());
         }
 
-        Map<String,String> jobProperties = new HashMap<String,String>();
+        Map<String, String> jobProperties = new HashMap<String, String>();
         try {
             tableDesc.getJobProperties().put(
                 HCatConstants.HCAT_KEY_OUTPUT_INFO,
                 HCatUtil.serialize(outputJobInfo));
 
             storageHandler.configureOutputJobProperties(tableDesc,
-                                                        jobProperties);
+                jobProperties);
 
-            for(Map.Entry<String,String> el: jobProperties.entrySet()) {
-                context.getConfiguration().set(el.getKey(),el.getValue());
+            for (Map.Entry<String, String> el : jobProperties.entrySet()) {
+                context.getConfiguration().set(el.getKey(), el.getValue());
             }
         } catch (IOException e) {
             throw new IllegalStateException(
-                "Failed to configure StorageHandler",e);
+                "Failed to configure StorageHandler", e);
         }
     }
 
@@ -509,8 +509,8 @@
      */
     public static void copyConf(Configuration src, Configuration dest) {
         dest.clear();
-        for(Map.Entry<String,String> el : src) {
-            dest.set(el.getKey(),el.getValue());
+        for (Map.Entry<String, String> el : src) {
+            dest.set(el.getKey(), el.getValue());
         }
     }
 
@@ -522,16 +522,16 @@
      * @throws IOException
      */
     public static HiveMetaStoreClient getHiveClient(HiveConf hiveConf)
-            throws MetaException, IOException {
+        throws MetaException, IOException {
 
         // Singleton behaviour: create the cache instance if required. The cache needs to be created lazily and
         // using the expiry time available in hiveConf.
 
-        if(hiveClientCache == null ) {
+        if (hiveClientCache == null) {
             synchronized (HiveMetaStoreClient.class) {
-                if(hiveClientCache == null) {
+                if (hiveClientCache == null) {
                     hiveClientCache = new HiveClientCache(hiveConf.getInt(HCatConstants.HCAT_HIVE_CLIENT_EXPIRY_TIME,
-                            DEFAULT_HIVE_CACHE_EXPIRY_TIME_SECONDS));
+                        DEFAULT_HIVE_CACHE_EXPIRY_TIME_SECONDS));
                 }
             }
         }
@@ -552,65 +552,63 @@
     }
 
     public static HiveConf getHiveConf(Configuration conf)
-      throws IOException {
+        throws IOException {
 
-      HiveConf hiveConf = new HiveConf(conf, HCatUtil.class);
+        HiveConf hiveConf = new HiveConf(conf, HCatUtil.class);
 
-      //copy the hive conf into the job conf and restore it
-      //in the backend context
-      if( conf.get(HCatConstants.HCAT_KEY_HIVE_CONF) == null ) {
-        conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-            HCatUtil.serialize(hiveConf.getAllProperties()));
-      } else {
-        //Copy configuration properties into the hive conf
-        Properties properties = (Properties) HCatUtil.deserialize(
-            conf.get(HCatConstants.HCAT_KEY_HIVE_CONF));
+        //copy the hive conf into the job conf and restore it
+        //in the backend context
+        if (conf.get(HCatConstants.HCAT_KEY_HIVE_CONF) == null) {
+            conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
+                HCatUtil.serialize(hiveConf.getAllProperties()));
+        } else {
+            //Copy configuration properties into the hive conf
+            Properties properties = (Properties) HCatUtil.deserialize(
+                conf.get(HCatConstants.HCAT_KEY_HIVE_CONF));
 
-        for(Map.Entry<Object, Object> prop : properties.entrySet() ) {
-          if( prop.getValue() instanceof String ) {
-            hiveConf.set((String) prop.getKey(), (String) prop.getValue());
-          } else if( prop.getValue() instanceof Integer ) {
-            hiveConf.setInt((String) prop.getKey(),
-                (Integer) prop.getValue());
-          } else if( prop.getValue() instanceof Boolean ) {
-            hiveConf.setBoolean((String) prop.getKey(),
-                (Boolean) prop.getValue());
-          } else if( prop.getValue() instanceof Long ) {
-            hiveConf.setLong((String) prop.getKey(), (Long) prop.getValue());
-          } else if( prop.getValue() instanceof Float ) {
-            hiveConf.setFloat((String) prop.getKey(),
-                (Float) prop.getValue());
-          }
+            for (Map.Entry<Object, Object> prop : properties.entrySet()) {
+                if (prop.getValue() instanceof String) {
+                    hiveConf.set((String) prop.getKey(), (String) prop.getValue());
+                } else if (prop.getValue() instanceof Integer) {
+                    hiveConf.setInt((String) prop.getKey(),
+                        (Integer) prop.getValue());
+                } else if (prop.getValue() instanceof Boolean) {
+                    hiveConf.setBoolean((String) prop.getKey(),
+                        (Boolean) prop.getValue());
+                } else if (prop.getValue() instanceof Long) {
+                    hiveConf.setLong((String) prop.getKey(), (Long) prop.getValue());
+                } else if (prop.getValue() instanceof Float) {
+                    hiveConf.setFloat((String) prop.getKey(),
+                        (Float) prop.getValue());
+                }
+            }
         }
-      }
 
-      if(conf.get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
-        hiveConf.set("hive.metastore.token.signature",
-                     conf.get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE));
-      }
+        if (conf.get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
+            hiveConf.set("hive.metastore.token.signature",
+                conf.get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE));
+        }
 
-      return hiveConf;
+        return hiveConf;
     }
 
 
-    public static JobConf getJobConfFromContext(JobContext jobContext)
-    {
-      JobConf jobConf;
-      // we need to convert the jobContext into a jobConf
-      // 0.18 jobConf (Hive) vs 0.20+ jobContext (HCat)
-      // begin conversion..
-      jobConf = new JobConf(jobContext.getConfiguration());
-      // ..end of conversion
+    public static JobConf getJobConfFromContext(JobContext jobContext) {
+        JobConf jobConf;
+        // we need to convert the jobContext into a jobConf
+        // 0.18 jobConf (Hive) vs 0.20+ jobContext (HCat)
+        // begin conversion..
+        jobConf = new JobConf(jobContext.getConfiguration());
+        // ..end of conversion
 
 
-      return jobConf;
+        return jobConf;
     }
 
     public static void copyJobPropertiesToJobConf(
-                    Map<String, String>jobProperties, JobConf jobConf)
-    {
-      for (Map.Entry<String, String> entry : jobProperties.entrySet()) {
-        jobConf.set(entry.getKey(), entry.getValue());
-      }
+        Map<String, String> jobProperties, JobConf jobConf) {
+        for (Map.Entry<String, String> entry : jobProperties.entrySet()) {
+            jobConf.set(entry.getKey(), entry.getValue());
+        }
     }
 }
diff --git a/src/java/org/apache/hcatalog/common/HiveClientCache.java b/src/java/org/apache/hcatalog/common/HiveClientCache.java
index e45ab3c..64dc690 100644
--- a/src/java/org/apache/hcatalog/common/HiveClientCache.java
+++ b/src/java/org/apache/hcatalog/common/HiveClientCache.java
@@ -57,11 +57,12 @@
     // Thread local variable containing each thread's unique ID, is used as one of the keys for the cache
     // causing each thread to get a different client even if the hiveConf is same.
     private static final ThreadLocal<Integer> threadId =
-            new ThreadLocal<Integer>() {
-                @Override protected Integer initialValue() {
-                    return nextId.getAndIncrement();
-                }
-            };
+        new ThreadLocal<Integer>() {
+            @Override
+            protected Integer initialValue() {
+                return nextId.getAndIncrement();
+            }
+        };
 
     private int getThreadId() {
         return threadId.get();
@@ -70,39 +71,39 @@
     /**
      * @param timeout the length of time in seconds after a client is created that it should be automatically removed
      */
-     public HiveClientCache(final int timeout) {
-         this.timeout = timeout;
-         RemovalListener<HiveClientCacheKey, CacheableHiveMetaStoreClient> removalListener =
-             new RemovalListener<HiveClientCacheKey, CacheableHiveMetaStoreClient>() {
-                 public void onRemoval(RemovalNotification<HiveClientCacheKey, CacheableHiveMetaStoreClient> notification) {
-                     CacheableHiveMetaStoreClient hiveMetaStoreClient = notification.getValue();
-                     if (hiveMetaStoreClient != null) {
-                         synchronized (CACHE_TEARDOWN_LOCK) {
+    public HiveClientCache(final int timeout) {
+        this.timeout = timeout;
+        RemovalListener<HiveClientCacheKey, CacheableHiveMetaStoreClient> removalListener =
+            new RemovalListener<HiveClientCacheKey, CacheableHiveMetaStoreClient>() {
+                public void onRemoval(RemovalNotification<HiveClientCacheKey, CacheableHiveMetaStoreClient> notification) {
+                    CacheableHiveMetaStoreClient hiveMetaStoreClient = notification.getValue();
+                    if (hiveMetaStoreClient != null) {
+                        synchronized (CACHE_TEARDOWN_LOCK) {
                             hiveMetaStoreClient.setExpiredFromCache();
                             hiveMetaStoreClient.tearDownIfUnused();
-                         }
-                     }
-                 }
-             };
-         hiveCache = CacheBuilder.newBuilder()
-                 .expireAfterWrite(timeout, TimeUnit.SECONDS)
-                 .removalListener(removalListener)
-                 .build();
+                        }
+                    }
+                }
+            };
+        hiveCache = CacheBuilder.newBuilder()
+            .expireAfterWrite(timeout, TimeUnit.SECONDS)
+            .removalListener(removalListener)
+            .build();
 
-         // Add a shutdown hook for cleanup, if there are elements remaining in the cache which were not cleaned up.
-         // This is the best effort approach. Ignore any error while doing so. Notice that most of the clients
-         // would get cleaned up via either the removalListener or the close() call, only the active clients
-         // that are in the cache or expired but being used in other threads wont get cleaned. The following code will only
-         // clean the active cache ones. The ones expired from cache but being hold by other threads are in the mercy
-         // of finalize() being called.
-         Thread cleanupHiveClientShutdownThread = new Thread() {
-             @Override
-             public void run() {
-                 LOG.info("Cleaning up hive client cache in ShutDown hook");
-                 closeAllClientsQuietly();
-             }
-         };
-         Runtime.getRuntime().addShutdownHook(cleanupHiveClientShutdownThread);
+        // Add a shutdown hook for cleanup, if there are elements remaining in the cache which were not cleaned up.
+        // This is the best effort approach. Ignore any error while doing so. Notice that most of the clients
+        // would get cleaned up via either the removalListener or the close() call, only the active clients
+        // that are in the cache or expired but being used in other threads wont get cleaned. The following code will only
+        // clean the active cache ones. The ones expired from cache but being hold by other threads are in the mercy
+        // of finalize() being called.
+        Thread cleanupHiveClientShutdownThread = new Thread() {
+            @Override
+            public void run() {
+                LOG.info("Cleaning up hive client cache in ShutDown hook");
+                closeAllClientsQuietly();
+            }
+        };
+        Runtime.getRuntime().addShutdownHook(cleanupHiveClientShutdownThread);
     }
 
     /**
@@ -215,36 +216,36 @@
             if (o == null || getClass() != o.getClass()) return false;
             HiveClientCacheKey that = (HiveClientCacheKey) o;
             return new EqualsBuilder().
-                    append(this.metaStoreURIs,
-                            that.metaStoreURIs).
-                    append(this.ugi, that.ugi).
-                    append(this.threadId, that.threadId).isEquals();
+                append(this.metaStoreURIs,
+                    that.metaStoreURIs).
+                append(this.ugi, that.ugi).
+                append(this.threadId, that.threadId).isEquals();
         }
 
         @Override
         public int hashCode() {
             return new HashCodeBuilder().
-                    append(metaStoreURIs).
-                    append(ugi).
-                    append(threadId).toHashCode();
+                append(metaStoreURIs).
+                append(ugi).
+                append(threadId).toHashCode();
         }
     }
 
     /**
      * Add # of current users on HiveMetaStoreClient, so that the client can be cleaned when no one is using it.
      */
-    public static class CacheableHiveMetaStoreClient extends HiveMetaStoreClient  {
-        private  AtomicInteger users = new AtomicInteger(0);
+    public static class CacheableHiveMetaStoreClient extends HiveMetaStoreClient {
+        private AtomicInteger users = new AtomicInteger(0);
         private volatile boolean expiredFromCache = false;
         private boolean isClosed = false;
         private final long expiryTime;
-        private static final int EXPIRY_TIME_EXTENSION_IN_MILLIS = 60*1000;
+        private static final int EXPIRY_TIME_EXTENSION_IN_MILLIS = 60 * 1000;
 
         public CacheableHiveMetaStoreClient(final HiveConf conf, final int timeout) throws MetaException {
             super(conf);
             // Extend the expiry time with some extra time on top of guava expiry time to make sure
             // that items closed() are for sure expired and would never be returned by guava.
-            this.expiryTime = System.currentTimeMillis() + timeout*1000 + EXPIRY_TIME_EXTENSION_IN_MILLIS;
+            this.expiryTime = System.currentTimeMillis() + timeout * 1000 + EXPIRY_TIME_EXTENSION_IN_MILLIS;
         }
 
         private void acquire() {
@@ -287,9 +288,9 @@
          * This *MUST* be called by anyone who uses this client.
          */
         @Override
-        public void close(){
+        public void close() {
             release();
-            if(System.currentTimeMillis() >= expiryTime)
+            if (System.currentTimeMillis() >= expiryTime)
                 setExpiredFromCache();
             tearDownIfUnused();
         }
@@ -300,7 +301,7 @@
          *  2. It has expired from the cache
          */
         private void tearDownIfUnused() {
-            if(users.get() == 0 && expiredFromCache) {
+            if (users.get() == 0 && expiredFromCache) {
                 this.tearDown();
             }
         }
@@ -310,11 +311,11 @@
          */
         protected synchronized void tearDown() {
             try {
-                if(!isClosed) {
+                if (!isClosed) {
                     super.close();
                 }
                 isClosed = true;
-            } catch(Exception e) {
+            } catch (Exception e) {
                 LOG.warn("Error closing hive metastore client. Ignored.", e);
             }
         }
diff --git a/src/java/org/apache/hcatalog/data/DataType.java b/src/java/org/apache/hcatalog/data/DataType.java
index a0a0739..687a67b 100644
--- a/src/java/org/apache/hcatalog/data/DataType.java
+++ b/src/java/org/apache/hcatalog/data/DataType.java
@@ -27,179 +27,180 @@
 
 public abstract class DataType {
 
-  public static final byte NULL      =   1;
-  public static final byte BOOLEAN   =   5;
-  public static final byte BYTE      =   6;
-  public static final byte INTEGER   =  10;
-  public static final byte SHORT     =  11;
-  public static final byte LONG      =  15;
-  public static final byte FLOAT     =  20;
-  public static final byte DOUBLE    =  25;
-  public static final byte STRING    =  55;
-  public static final byte BINARY    =  60;
+    public static final byte NULL = 1;
+    public static final byte BOOLEAN = 5;
+    public static final byte BYTE = 6;
+    public static final byte INTEGER = 10;
+    public static final byte SHORT = 11;
+    public static final byte LONG = 15;
+    public static final byte FLOAT = 20;
+    public static final byte DOUBLE = 25;
+    public static final byte STRING = 55;
+    public static final byte BINARY = 60;
 
-  public static final byte MAP       = 100;
-  public static final byte STRUCT    = 110;
-  public static final byte LIST      = 120;
-  public static final byte ERROR     =  -1;
+    public static final byte MAP = 100;
+    public static final byte STRUCT = 110;
+    public static final byte LIST = 120;
+    public static final byte ERROR = -1;
 
-  /**
-   * Determine the datatype of an object.
-   * @param o Object to test.
-   * @return byte code of the type, or ERROR if we don't know.
-   */
-  public static byte findType(Object o) {
-    if (o == null) {
-      return NULL;
-    }
-
-    Class<?> clazz = o.getClass();
-
-    // Try to put the most common first
-    if (clazz == String.class) {
-      return STRING;
-    } else if (clazz == Integer.class) {
-      return INTEGER;
-    } else if (clazz == Long.class) {
-      return LONG;
-    } else if (clazz == Float.class) {
-      return FLOAT;
-    } else if (clazz == Double.class) {
-      return DOUBLE;
-    } else if (clazz == Boolean.class) {
-      return BOOLEAN;
-    } else if (clazz == Byte.class) {
-      return BYTE;
-    } else if (clazz == Short.class) {
-      return SHORT;
-    } else if (o instanceof List<?>) {
-      return LIST;
-    } else if (o instanceof Map<?,?>) {
-      return MAP;
-    }else if (o instanceof byte[]) {
-        return BINARY;
-    } else {return ERROR;}
-  }
-
-  public static int compare(Object o1, Object o2) {
-
-    return compare(o1, o2, findType(o1),findType(o2));
-  }
-
-  public static int compare(Object o1, Object o2, byte dt1, byte dt2) {
-    if (dt1 == dt2) {
-      switch (dt1) {
-      case NULL:
-        return 0;
-
-      case BOOLEAN:
-        return ((Boolean)o1).compareTo((Boolean)o2);
-
-      case BYTE:
-        return ((Byte)o1).compareTo((Byte)o2);
-
-      case INTEGER:
-        return ((Integer)o1).compareTo((Integer)o2);
-
-      case LONG:
-        return ((Long)o1).compareTo((Long)o2);
-
-      case FLOAT:
-        return ((Float)o1).compareTo((Float)o2);
-
-      case DOUBLE:
-        return ((Double)o1).compareTo((Double)o2);
-
-      case STRING:
-        return ((String)o1).compareTo((String)o2);
-
-      case SHORT:
-        return ((Short)o1).compareTo((Short)o2);
-        
-      case BINARY:
-        return compareByteArray((byte[])o1, (byte[])o2);
-
-      case LIST:
-        List<?> l1 = (List<?>)o1;
-        List<?> l2 = (List<?>)o2;
-        int len = l1.size();
-        if(len != l2.size()) {
-          return len - l2.size();
-        } else{
-          for(int i =0; i < len; i++){
-            int cmpVal = compare(l1.get(i), l2.get(i));
-            if(cmpVal != 0) {
-              return cmpVal;
-            }
-          }
-          return 0;
+    /**
+     * Determine the datatype of an object.
+     * @param o Object to test.
+     * @return byte code of the type, or ERROR if we don't know.
+     */
+    public static byte findType(Object o) {
+        if (o == null) {
+            return NULL;
         }
 
-      case MAP: {
-        Map<?,?> m1 = (Map<?,?>)o1;
-        Map<?,?> m2 = (Map<?,?>)o2;
-        int sz1 = m1.size();
-        int sz2 = m2.size();
-        if (sz1 < sz2) {
-          return -1;
-        } else if (sz1 > sz2) {
-          return 1;
+        Class<?> clazz = o.getClass();
+
+        // Try to put the most common first
+        if (clazz == String.class) {
+            return STRING;
+        } else if (clazz == Integer.class) {
+            return INTEGER;
+        } else if (clazz == Long.class) {
+            return LONG;
+        } else if (clazz == Float.class) {
+            return FLOAT;
+        } else if (clazz == Double.class) {
+            return DOUBLE;
+        } else if (clazz == Boolean.class) {
+            return BOOLEAN;
+        } else if (clazz == Byte.class) {
+            return BYTE;
+        } else if (clazz == Short.class) {
+            return SHORT;
+        } else if (o instanceof List<?>) {
+            return LIST;
+        } else if (o instanceof Map<?, ?>) {
+            return MAP;
+        } else if (o instanceof byte[]) {
+            return BINARY;
         } else {
-          // This is bad, but we have to sort the keys of the maps in order
-          // to be commutative.
-          TreeMap<Object,Object> tm1 = new TreeMap<Object,Object>(m1);
-          TreeMap<Object, Object> tm2 = new TreeMap<Object,Object>(m2);
-          Iterator<Entry<Object, Object>> i1 = tm1.entrySet().iterator();
-          Iterator<Entry<Object, Object> > i2 = tm2.entrySet().iterator();
-          while (i1.hasNext()) {
-            Map.Entry<Object, Object> entry1 = i1.next();
-            Map.Entry<Object, Object> entry2 = i2.next();
-            int c = compare(entry1.getValue(), entry2.getValue());
-            if (c != 0) {
-              return c;
-            } else {
-              c = compare(entry1.getValue(), entry2.getValue());
-              if (c != 0) {
-                return c;
-              }
-            }
-          }
-          return 0;
+            return ERROR;
         }
-      }
-
-      default:
-        throw new RuntimeException("Unkown type " + dt1 +
-        " in compare");
-      }
-    } else {
-      return dt1 < dt2 ? -1 : 1;
-    }
-  }
-
-  private static int compareByteArray(byte[] o1, byte[] o2) {
-    
-    for(int i = 0; i < o1.length; i++){
-      if(i == o2.length){
-        return 1;
-      }
-      if(o1[i] == o2[i]){
-        continue;
-      }
-      if(o1[i] > o1[i]){
-        return 1;
-      }
-      else{
-        return -1;
-      }
     }
 
-    //bytes in o1 are same as o2
-    //in case o2 was longer
-    if(o2.length > o1.length){
-      return -1;
+    public static int compare(Object o1, Object o2) {
+
+        return compare(o1, o2, findType(o1), findType(o2));
     }
-    return 0; //equals
-  }
+
+    public static int compare(Object o1, Object o2, byte dt1, byte dt2) {
+        if (dt1 == dt2) {
+            switch (dt1) {
+            case NULL:
+                return 0;
+
+            case BOOLEAN:
+                return ((Boolean) o1).compareTo((Boolean) o2);
+
+            case BYTE:
+                return ((Byte) o1).compareTo((Byte) o2);
+
+            case INTEGER:
+                return ((Integer) o1).compareTo((Integer) o2);
+
+            case LONG:
+                return ((Long) o1).compareTo((Long) o2);
+
+            case FLOAT:
+                return ((Float) o1).compareTo((Float) o2);
+
+            case DOUBLE:
+                return ((Double) o1).compareTo((Double) o2);
+
+            case STRING:
+                return ((String) o1).compareTo((String) o2);
+
+            case SHORT:
+                return ((Short) o1).compareTo((Short) o2);
+
+            case BINARY:
+                return compareByteArray((byte[]) o1, (byte[]) o2);
+
+            case LIST:
+                List<?> l1 = (List<?>) o1;
+                List<?> l2 = (List<?>) o2;
+                int len = l1.size();
+                if (len != l2.size()) {
+                    return len - l2.size();
+                } else {
+                    for (int i = 0; i < len; i++) {
+                        int cmpVal = compare(l1.get(i), l2.get(i));
+                        if (cmpVal != 0) {
+                            return cmpVal;
+                        }
+                    }
+                    return 0;
+                }
+
+            case MAP: {
+                Map<?, ?> m1 = (Map<?, ?>) o1;
+                Map<?, ?> m2 = (Map<?, ?>) o2;
+                int sz1 = m1.size();
+                int sz2 = m2.size();
+                if (sz1 < sz2) {
+                    return -1;
+                } else if (sz1 > sz2) {
+                    return 1;
+                } else {
+                    // This is bad, but we have to sort the keys of the maps in order
+                    // to be commutative.
+                    TreeMap<Object, Object> tm1 = new TreeMap<Object, Object>(m1);
+                    TreeMap<Object, Object> tm2 = new TreeMap<Object, Object>(m2);
+                    Iterator<Entry<Object, Object>> i1 = tm1.entrySet().iterator();
+                    Iterator<Entry<Object, Object>> i2 = tm2.entrySet().iterator();
+                    while (i1.hasNext()) {
+                        Map.Entry<Object, Object> entry1 = i1.next();
+                        Map.Entry<Object, Object> entry2 = i2.next();
+                        int c = compare(entry1.getValue(), entry2.getValue());
+                        if (c != 0) {
+                            return c;
+                        } else {
+                            c = compare(entry1.getValue(), entry2.getValue());
+                            if (c != 0) {
+                                return c;
+                            }
+                        }
+                    }
+                    return 0;
+                }
+            }
+
+            default:
+                throw new RuntimeException("Unkown type " + dt1 +
+                    " in compare");
+            }
+        } else {
+            return dt1 < dt2 ? -1 : 1;
+        }
+    }
+
+    private static int compareByteArray(byte[] o1, byte[] o2) {
+
+        for (int i = 0; i < o1.length; i++) {
+            if (i == o2.length) {
+                return 1;
+            }
+            if (o1[i] == o2[i]) {
+                continue;
+            }
+            if (o1[i] > o1[i]) {
+                return 1;
+            } else {
+                return -1;
+            }
+        }
+
+        //bytes in o1 are same as o2
+        //in case o2 was longer
+        if (o2.length > o1.length) {
+            return -1;
+        }
+        return 0; //equals
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/data/DefaultHCatRecord.java b/src/java/org/apache/hcatalog/data/DefaultHCatRecord.java
index 25af53d..d8b30ee 100644
--- a/src/java/org/apache/hcatalog/data/DefaultHCatRecord.java
+++ b/src/java/org/apache/hcatalog/data/DefaultHCatRecord.java
@@ -31,20 +31,20 @@
 
     private List<Object> contents;
 
-    public DefaultHCatRecord(){
+    public DefaultHCatRecord() {
         contents = new ArrayList<Object>();
     }
 
-    public DefaultHCatRecord(int size){
+    public DefaultHCatRecord(int size) {
         contents = new ArrayList<Object>(size);
-        for(int i=0; i < size; i++){
+        for (int i = 0; i < size; i++) {
             contents.add(null);
         }
     }
 
     @Override
     public void remove(int idx) throws HCatException {
-      contents.remove(idx);
+        contents.remove(idx);
     }
 
     public DefaultHCatRecord(List<Object> list) {
@@ -76,7 +76,7 @@
 
         contents.clear();
         int len = in.readInt();
-        for(int i =0; i < len; i++){
+        for (int i = 0; i < len; i++) {
             contents.add(ReaderWriter.readDatum(in));
         }
     }
@@ -106,8 +106,8 @@
     public String toString() {
 
         StringBuilder sb = new StringBuilder();
-        for(Object o : contents) {
-            sb.append(o+"\t");
+        for (Object o : contents) {
+            sb.append(o + "\t");
         }
         return sb.toString();
     }
@@ -119,12 +119,12 @@
 
     @Override
     public void set(String fieldName, HCatSchema recordSchema, Object value) throws HCatException {
-        set(recordSchema.getPosition(fieldName),value);
+        set(recordSchema.getPosition(fieldName), value);
     }
 
     @Override
     public void copy(HCatRecord r) throws HCatException {
-      this.contents = r.getAll();
+        this.contents = r.getAll();
     }
 
 }
diff --git a/src/java/org/apache/hcatalog/data/HCatRecord.java b/src/java/org/apache/hcatalog/data/HCatRecord.java
index 5735b05..131d8d0 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecord.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecord.java
@@ -33,13 +33,16 @@
 public abstract class HCatRecord implements HCatRecordable {
 
     public abstract Object get(String fieldName, HCatSchema recordSchema) throws HCatException;
-    public abstract void set(String fieldName, HCatSchema recordSchema, Object value ) throws HCatException;
+
+    public abstract void set(String fieldName, HCatSchema recordSchema, Object value) throws HCatException;
+
     public abstract void remove(int idx) throws HCatException;
+
     public abstract void copy(HCatRecord r) throws HCatException;
 
-    protected Object get(String fieldName, HCatSchema recordSchema, Class clazz) throws HCatException{
+    protected Object get(String fieldName, HCatSchema recordSchema, Class clazz) throws HCatException {
         // TODO : if needed, verify that recordschema entry for fieldname matches appropriate type.
-        return get(fieldName,recordSchema);
+        return get(fieldName, recordSchema);
     }
 
     public Boolean getBoolean(String fieldName, HCatSchema recordSchema) throws HCatException {
@@ -47,15 +50,15 @@
     }
 
     public void setBoolean(String fieldName, HCatSchema recordSchema, Boolean value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
-    
+
     public byte[] getByteArray(String fieldName, HCatSchema recordSchema) throws HCatException {
         return (byte[]) get(fieldName, recordSchema, byte[].class);
     }
 
     public void setByteArray(String fieldName, HCatSchema recordSchema, byte[] value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Byte getByte(String fieldName, HCatSchema recordSchema) throws HCatException {
@@ -64,7 +67,7 @@
     }
 
     public void setByte(String fieldName, HCatSchema recordSchema, Byte value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Short getShort(String fieldName, HCatSchema recordSchema) throws HCatException {
@@ -73,73 +76,73 @@
     }
 
     public void setShort(String fieldName, HCatSchema recordSchema, Short value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Integer getInteger(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (Integer) get(fieldName,recordSchema, Integer.class);
+        return (Integer) get(fieldName, recordSchema, Integer.class);
     }
 
     public void setInteger(String fieldName, HCatSchema recordSchema, Integer value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Long getLong(String fieldName, HCatSchema recordSchema) throws HCatException {
         // BIGINT
-        return (Long) get(fieldName,recordSchema,Long.class);
+        return (Long) get(fieldName, recordSchema, Long.class);
     }
 
     public void setLong(String fieldName, HCatSchema recordSchema, Long value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Float getFloat(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (Float) get(fieldName,recordSchema,Float.class);
+        return (Float) get(fieldName, recordSchema, Float.class);
     }
 
     public void setFloat(String fieldName, HCatSchema recordSchema, Float value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public Double getDouble(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (Double) get(fieldName,recordSchema,Double.class);
+        return (Double) get(fieldName, recordSchema, Double.class);
     }
 
     public void setDouble(String fieldName, HCatSchema recordSchema, Double value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public String getString(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (String) get(fieldName,recordSchema,String.class);
+        return (String) get(fieldName, recordSchema, String.class);
     }
 
     public void setString(String fieldName, HCatSchema recordSchema, String value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     @SuppressWarnings("unchecked")
     public List<? extends Object> getStruct(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (List<? extends Object>) get(fieldName,recordSchema,List.class);
+        return (List<? extends Object>) get(fieldName, recordSchema, List.class);
     }
 
     public void setStruct(String fieldName, HCatSchema recordSchema, List<? extends Object> value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
     public List<?> getList(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (List<?>) get(fieldName,recordSchema,List.class);
+        return (List<?>) get(fieldName, recordSchema, List.class);
     }
 
     public void setList(String fieldName, HCatSchema recordSchema, List<?> value) throws HCatException {
-        set(fieldName,recordSchema,value);
+        set(fieldName, recordSchema, value);
     }
 
-    public Map<?,?> getMap(String fieldName, HCatSchema recordSchema) throws HCatException {
-        return (Map<?,?>) get(fieldName,recordSchema,Map.class);
+    public Map<?, ?> getMap(String fieldName, HCatSchema recordSchema) throws HCatException {
+        return (Map<?, ?>) get(fieldName, recordSchema, Map.class);
     }
 
-    public void setMap(String fieldName, HCatSchema recordSchema, Map<?,?> value) throws HCatException {
-        set(fieldName,recordSchema,value);
+    public void setMap(String fieldName, HCatSchema recordSchema, Map<?, ?> value) throws HCatException {
+        set(fieldName, recordSchema, value);
     }
 
 }
diff --git a/src/java/org/apache/hcatalog/data/HCatRecordObjectInspector.java b/src/java/org/apache/hcatalog/data/HCatRecordObjectInspector.java
index 060a66f..becadda 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecordObjectInspector.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecordObjectInspector.java
@@ -25,28 +25,28 @@
 
 public class HCatRecordObjectInspector extends StandardStructObjectInspector {
 
-  protected HCatRecordObjectInspector(List<String> structFieldNames,
-      List<ObjectInspector> structFieldObjectInspectors) {
-    super(structFieldNames, structFieldObjectInspectors);
-  }
-
-  @Override
-  public Object getStructFieldData(Object data, StructField fieldRef) {
-    if (data == null){
-      return new IllegalArgumentException("Data passed in to get field from was null!");
+    protected HCatRecordObjectInspector(List<String> structFieldNames,
+                                        List<ObjectInspector> structFieldObjectInspectors) {
+        super(structFieldNames, structFieldObjectInspectors);
     }
 
-    int fieldID = ((MyField) fieldRef).getFieldID();
-    if (!(fieldID >= 0 && fieldID < fields.size())){
-      throw new IllegalArgumentException("Invalid field index ["+fieldID+"]");
+    @Override
+    public Object getStructFieldData(Object data, StructField fieldRef) {
+        if (data == null) {
+            return new IllegalArgumentException("Data passed in to get field from was null!");
+        }
+
+        int fieldID = ((MyField) fieldRef).getFieldID();
+        if (!(fieldID >= 0 && fieldID < fields.size())) {
+            throw new IllegalArgumentException("Invalid field index [" + fieldID + "]");
+        }
+
+        return ((HCatRecord) data).get(fieldID);
     }
 
-    return ((HCatRecord) data).get(fieldID);
-  }
-
-  @Override
-  public List<Object> getStructFieldsDataAsList(Object o) {
-    return ((HCatRecord) o).getAll();
-  }
+    @Override
+    public List<Object> getStructFieldsDataAsList(Object o) {
+        return ((HCatRecord) o).getAll();
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/data/HCatRecordObjectInspectorFactory.java b/src/java/org/apache/hcatalog/data/HCatRecordObjectInspectorFactory.java
index 384d52f..de9f79d 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecordObjectInspectorFactory.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecordObjectInspectorFactory.java
@@ -38,94 +38,94 @@
  */
 public class HCatRecordObjectInspectorFactory {
 
-  private final static Logger LOG = LoggerFactory.getLogger(HCatRecordObjectInspectorFactory.class);
+    private final static Logger LOG = LoggerFactory.getLogger(HCatRecordObjectInspectorFactory.class);
 
-  static HashMap<TypeInfo, HCatRecordObjectInspector> cachedHCatRecordObjectInspectors =
-      new HashMap<TypeInfo, HCatRecordObjectInspector>();
-  static HashMap<TypeInfo, ObjectInspector> cachedObjectInspectors =
-      new HashMap<TypeInfo, ObjectInspector>();
+    static HashMap<TypeInfo, HCatRecordObjectInspector> cachedHCatRecordObjectInspectors =
+        new HashMap<TypeInfo, HCatRecordObjectInspector>();
+    static HashMap<TypeInfo, ObjectInspector> cachedObjectInspectors =
+        new HashMap<TypeInfo, ObjectInspector>();
 
-  /**
-   * Returns HCatRecordObjectInspector given a StructTypeInfo type definition for the record to look into
-   * @param typeInfo Type definition for the record to look into
-   * @return appropriate HCatRecordObjectInspector
-   * @throws SerDeException
-   */
-  public static HCatRecordObjectInspector getHCatRecordObjectInspector(
-      StructTypeInfo typeInfo) throws SerDeException {
-    HCatRecordObjectInspector oi = cachedHCatRecordObjectInspectors.get(typeInfo);
-    if (oi == null) {
+    /**
+     * Returns HCatRecordObjectInspector given a StructTypeInfo type definition for the record to look into
+     * @param typeInfo Type definition for the record to look into
+     * @return appropriate HCatRecordObjectInspector
+     * @throws SerDeException
+     */
+    public static HCatRecordObjectInspector getHCatRecordObjectInspector(
+        StructTypeInfo typeInfo) throws SerDeException {
+        HCatRecordObjectInspector oi = cachedHCatRecordObjectInspectors.get(typeInfo);
+        if (oi == null) {
 
-      LOG.debug("Got asked for OI for {} [{} ]",typeInfo.getCategory(),typeInfo.getTypeName());
-      switch (typeInfo.getCategory()) {
-      case STRUCT :
-        StructTypeInfo structTypeInfo = (StructTypeInfo) typeInfo;
-        List<String> fieldNames = structTypeInfo.getAllStructFieldNames();
-        List<TypeInfo> fieldTypeInfos = structTypeInfo.getAllStructFieldTypeInfos();
-        List<ObjectInspector> fieldObjectInspectors = new ArrayList<ObjectInspector>(fieldTypeInfos.size());
-        for (int i = 0; i < fieldTypeInfos.size(); i++) {
-          fieldObjectInspectors.add(getStandardObjectInspectorFromTypeInfo(fieldTypeInfos.get(i)));
+            LOG.debug("Got asked for OI for {} [{} ]", typeInfo.getCategory(), typeInfo.getTypeName());
+            switch (typeInfo.getCategory()) {
+            case STRUCT:
+                StructTypeInfo structTypeInfo = (StructTypeInfo) typeInfo;
+                List<String> fieldNames = structTypeInfo.getAllStructFieldNames();
+                List<TypeInfo> fieldTypeInfos = structTypeInfo.getAllStructFieldTypeInfos();
+                List<ObjectInspector> fieldObjectInspectors = new ArrayList<ObjectInspector>(fieldTypeInfos.size());
+                for (int i = 0; i < fieldTypeInfos.size(); i++) {
+                    fieldObjectInspectors.add(getStandardObjectInspectorFromTypeInfo(fieldTypeInfos.get(i)));
+                }
+                oi = new HCatRecordObjectInspector(fieldNames, fieldObjectInspectors);
+
+                break;
+            default:
+                // Hmm.. not good,
+                // the only type expected here is STRUCT, which maps to HCatRecord
+                // - anything else is an error. Return null as the inspector.
+                throw new SerDeException("TypeInfo [" + typeInfo.getTypeName()
+                    + "] was not of struct type - HCatRecord expected struct type, got ["
+                    + typeInfo.getCategory().toString() + "]");
+            }
+            cachedHCatRecordObjectInspectors.put(typeInfo, oi);
         }
-        oi = new HCatRecordObjectInspector(fieldNames,fieldObjectInspectors);
-
-        break;
-      default:
-        // Hmm.. not good,
-        // the only type expected here is STRUCT, which maps to HCatRecord
-        // - anything else is an error. Return null as the inspector.
-        throw new SerDeException("TypeInfo ["+typeInfo.getTypeName()
-            + "] was not of struct type - HCatRecord expected struct type, got ["
-            + typeInfo.getCategory().toString()+"]");
-      }
-      cachedHCatRecordObjectInspectors.put(typeInfo, oi);
+        return oi;
     }
-    return oi;
-  }
 
-  public static ObjectInspector getStandardObjectInspectorFromTypeInfo(TypeInfo typeInfo) {
+    public static ObjectInspector getStandardObjectInspectorFromTypeInfo(TypeInfo typeInfo) {
 
 
-    ObjectInspector oi = cachedObjectInspectors.get(typeInfo);
-    if (oi == null){
+        ObjectInspector oi = cachedObjectInspectors.get(typeInfo);
+        if (oi == null) {
 
-      LOG.debug("Got asked for OI for {}, [{}]",typeInfo.getCategory(), typeInfo.getTypeName());
-      switch (typeInfo.getCategory()) {
-      case PRIMITIVE:
-        oi = PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(
-            ((PrimitiveTypeInfo) typeInfo).getPrimitiveCategory());
-        break;
-      case STRUCT:
-        StructTypeInfo structTypeInfo = (StructTypeInfo) typeInfo;
-        List<String> fieldNames = structTypeInfo.getAllStructFieldNames();
-        List<TypeInfo> fieldTypeInfos = structTypeInfo.getAllStructFieldTypeInfos();
-        List<ObjectInspector> fieldObjectInspectors =
-            new ArrayList<ObjectInspector>(fieldTypeInfos.size());
-        for (int i = 0; i < fieldTypeInfos.size(); i++) {
-          fieldObjectInspectors.add(getStandardObjectInspectorFromTypeInfo(fieldTypeInfos.get(i)));
+            LOG.debug("Got asked for OI for {}, [{}]", typeInfo.getCategory(), typeInfo.getTypeName());
+            switch (typeInfo.getCategory()) {
+            case PRIMITIVE:
+                oi = PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(
+                    ((PrimitiveTypeInfo) typeInfo).getPrimitiveCategory());
+                break;
+            case STRUCT:
+                StructTypeInfo structTypeInfo = (StructTypeInfo) typeInfo;
+                List<String> fieldNames = structTypeInfo.getAllStructFieldNames();
+                List<TypeInfo> fieldTypeInfos = structTypeInfo.getAllStructFieldTypeInfos();
+                List<ObjectInspector> fieldObjectInspectors =
+                    new ArrayList<ObjectInspector>(fieldTypeInfos.size());
+                for (int i = 0; i < fieldTypeInfos.size(); i++) {
+                    fieldObjectInspectors.add(getStandardObjectInspectorFromTypeInfo(fieldTypeInfos.get(i)));
+                }
+                oi = ObjectInspectorFactory.getStandardStructObjectInspector(
+                    fieldNames, fieldObjectInspectors
+                );
+                break;
+            case LIST:
+                ObjectInspector elementObjectInspector = getStandardObjectInspectorFromTypeInfo(
+                    ((ListTypeInfo) typeInfo).getListElementTypeInfo());
+                oi = ObjectInspectorFactory.getStandardListObjectInspector(elementObjectInspector);
+                break;
+            case MAP:
+                ObjectInspector keyObjectInspector = getStandardObjectInspectorFromTypeInfo(
+                    ((MapTypeInfo) typeInfo).getMapKeyTypeInfo());
+                ObjectInspector valueObjectInspector = getStandardObjectInspectorFromTypeInfo(
+                    ((MapTypeInfo) typeInfo).getMapValueTypeInfo());
+                oi = ObjectInspectorFactory.getStandardMapObjectInspector(keyObjectInspector, valueObjectInspector);
+                break;
+            default:
+                oi = null;
+            }
+            cachedObjectInspectors.put(typeInfo, oi);
         }
-        oi = ObjectInspectorFactory.getStandardStructObjectInspector(
-            fieldNames, fieldObjectInspectors
-            );
-        break;
-      case LIST:
-        ObjectInspector elementObjectInspector = getStandardObjectInspectorFromTypeInfo(
-            ((ListTypeInfo)typeInfo).getListElementTypeInfo());
-        oi = ObjectInspectorFactory.getStandardListObjectInspector(elementObjectInspector);
-        break;
-      case MAP:
-        ObjectInspector keyObjectInspector = getStandardObjectInspectorFromTypeInfo(
-            ((MapTypeInfo)typeInfo).getMapKeyTypeInfo());
-        ObjectInspector valueObjectInspector = getStandardObjectInspectorFromTypeInfo(
-            ((MapTypeInfo)typeInfo).getMapValueTypeInfo());
-        oi = ObjectInspectorFactory.getStandardMapObjectInspector(keyObjectInspector,valueObjectInspector);
-        break;
-      default:
-        oi = null;
-      }
-      cachedObjectInspectors.put(typeInfo, oi);
+        return oi;
     }
-    return oi;
-  }
 
 
 }
diff --git a/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java b/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
index e827b27..ca204c3 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecordSerDe.java
@@ -54,254 +54,254 @@
 
     private static final Logger LOG = LoggerFactory.getLogger(HCatRecordSerDe.class);
 
-  public HCatRecordSerDe() throws SerDeException{
-  }
-
-  private List<String> columnNames;
-  private List<TypeInfo> columnTypes;
-  private StructTypeInfo rowTypeInfo;
-
-  private HCatRecordObjectInspector cachedObjectInspector;
-
-  @Override
-  public void initialize(Configuration conf, Properties tbl)
-      throws SerDeException {
-
-    LOG.debug("Initializing HCatRecordSerDe");
-    LOG.debug("props to serde: {}",tbl.entrySet());
-
-    // Get column names and types
-    String columnNameProperty = tbl.getProperty(Constants.LIST_COLUMNS);
-    String columnTypeProperty = tbl.getProperty(Constants.LIST_COLUMN_TYPES);
-
-    // all table column names
-    if (columnNameProperty.length() == 0) {
-      columnNames = new ArrayList<String>();
-    } else {
-      columnNames = Arrays.asList(columnNameProperty.split(","));
+    public HCatRecordSerDe() throws SerDeException {
     }
 
-    // all column types
-    if (columnTypeProperty.length() == 0) {
-      columnTypes = new ArrayList<TypeInfo>();
-    } else {
-      columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProperty);
+    private List<String> columnNames;
+    private List<TypeInfo> columnTypes;
+    private StructTypeInfo rowTypeInfo;
+
+    private HCatRecordObjectInspector cachedObjectInspector;
+
+    @Override
+    public void initialize(Configuration conf, Properties tbl)
+        throws SerDeException {
+
+        LOG.debug("Initializing HCatRecordSerDe");
+        LOG.debug("props to serde: {}", tbl.entrySet());
+
+        // Get column names and types
+        String columnNameProperty = tbl.getProperty(Constants.LIST_COLUMNS);
+        String columnTypeProperty = tbl.getProperty(Constants.LIST_COLUMN_TYPES);
+
+        // all table column names
+        if (columnNameProperty.length() == 0) {
+            columnNames = new ArrayList<String>();
+        } else {
+            columnNames = Arrays.asList(columnNameProperty.split(","));
+        }
+
+        // all column types
+        if (columnTypeProperty.length() == 0) {
+            columnTypes = new ArrayList<TypeInfo>();
+        } else {
+            columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProperty);
+        }
+
+
+        LOG.debug("columns: {} {}", columnNameProperty, columnNames);
+        LOG.debug("types: {} {}", columnTypeProperty, columnTypes);
+        assert (columnNames.size() == columnTypes.size());
+
+        rowTypeInfo = (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes);
+        cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
+    }
+
+    public void initialize(HCatSchema hsch) throws SerDeException {
+
+        LOG.debug("Initializing HCatRecordSerDe through HCatSchema {}.", hsch);
+
+        rowTypeInfo = (StructTypeInfo) TypeInfoUtils.getTypeInfoFromTypeString(hsch.getSchemaAsTypeString());
+        cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
+
     }
 
 
-    LOG.debug("columns: {} {}",columnNameProperty,columnNames);
-    LOG.debug("types: {} {}", columnTypeProperty, columnTypes);
-    assert (columnNames.size() == columnTypes.size());
+    /**
+     * The purpose of a deserialize method is to turn a data blob
+     * which is a writable representation of the data into an
+     * object that can then be parsed using the appropriate
+     * ObjectInspector. In this case, since HCatRecord is directly
+     * already the Writable object, there's no extra work to be done
+     * here. Most of the logic resides in the ObjectInspector to be
+     * able to return values from within the HCatRecord to hive when
+     * it wants it.
+     */
+    @Override
+    public Object deserialize(Writable data) throws SerDeException {
+        if (!(data instanceof HCatRecord)) {
+            throw new SerDeException(getClass().getName() + ": expects HCatRecord!");
+        }
 
-    rowTypeInfo = (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes);
-    cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
-  }
-
-  public void initialize(HCatSchema hsch) throws SerDeException {
-
-      LOG.debug("Initializing HCatRecordSerDe through HCatSchema {}." ,hsch);
-
-    rowTypeInfo = (StructTypeInfo) TypeInfoUtils.getTypeInfoFromTypeString(hsch.getSchemaAsTypeString());
-    cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
-
-  }
-
-
-  /**
-   * The purpose of a deserialize method is to turn a data blob
-   * which is a writable representation of the data into an
-   * object that can then be parsed using the appropriate
-   * ObjectInspector. In this case, since HCatRecord is directly
-   * already the Writable object, there's no extra work to be done
-   * here. Most of the logic resides in the ObjectInspector to be
-   * able to return values from within the HCatRecord to hive when
-   * it wants it.
-   */
-  @Override
-  public Object deserialize(Writable data) throws SerDeException {
-    if (!(data instanceof HCatRecord)) {
-      throw new SerDeException(getClass().getName() + ": expects HCatRecord!");
+        return (HCatRecord) data;
     }
 
-    return (HCatRecord) data;
-  }
-
-  /**
-   * The purpose of the serialize method is to turn an object-representation
-   * with a provided ObjectInspector into a Writable format, which
-   * the underlying layer can then use to write out.
-   *
-   * In this case, it means that Hive will call this method to convert
-   * an object with appropriate objectinspectors that it knows about,
-   * to write out a HCatRecord.
-   */
-  @Override
-  public Writable serialize(Object obj, ObjectInspector objInspector)
-      throws SerDeException {
-    if (objInspector.getCategory() != Category.STRUCT) {
-      throw new SerDeException(getClass().toString()
-          + " can only serialize struct types, but we got: "
-          + objInspector.getTypeName());
-    }
-    return new DefaultHCatRecord((List<Object>)serializeStruct(obj,(StructObjectInspector)objInspector));
-  }
-
-
-  /**
-   * Return serialized HCatRecord from an underlying
-   * object-representation, and readable by an ObjectInspector
-   * @param obj : Underlying object-representation
-   * @param soi : StructObjectInspector
-   * @return HCatRecord
-   */
-  private static List<?> serializeStruct(Object obj, StructObjectInspector soi)
-      throws SerDeException {
-
-    List<? extends StructField> fields = soi.getAllStructFieldRefs();
-    List<Object> list = soi.getStructFieldsDataAsList(obj);
-
-    if (list == null){
-      return null;
+    /**
+     * The purpose of the serialize method is to turn an object-representation
+     * with a provided ObjectInspector into a Writable format, which
+     * the underlying layer can then use to write out.
+     *
+     * In this case, it means that Hive will call this method to convert
+     * an object with appropriate objectinspectors that it knows about,
+     * to write out a HCatRecord.
+     */
+    @Override
+    public Writable serialize(Object obj, ObjectInspector objInspector)
+        throws SerDeException {
+        if (objInspector.getCategory() != Category.STRUCT) {
+            throw new SerDeException(getClass().toString()
+                + " can only serialize struct types, but we got: "
+                + objInspector.getTypeName());
+        }
+        return new DefaultHCatRecord((List<Object>) serializeStruct(obj, (StructObjectInspector) objInspector));
     }
 
-    List<Object> l = new ArrayList<Object>(fields.size());
 
-    if (fields != null){
-      for (int i = 0; i < fields.size(); i++) {
+    /**
+     * Return serialized HCatRecord from an underlying
+     * object-representation, and readable by an ObjectInspector
+     * @param obj : Underlying object-representation
+     * @param soi : StructObjectInspector
+     * @return HCatRecord
+     */
+    private static List<?> serializeStruct(Object obj, StructObjectInspector soi)
+        throws SerDeException {
 
-        // Get the field objectInspector and the field object.
-        ObjectInspector foi = fields.get(i).getFieldObjectInspector();
-        Object f = list.get(i);
-        Object res = serializeField(f, foi);
-        l.add(i, res);
-      }
-    }
-    return l;
-  }
+        List<? extends StructField> fields = soi.getAllStructFieldRefs();
+        List<Object> list = soi.getStructFieldsDataAsList(obj);
 
-  /**
-   * Return underlying Java Object from an object-representation
-   * that is readable by a provided ObjectInspector.
-   */
-  public static Object serializeField(Object field, ObjectInspector fieldObjectInspector)
-      throws SerDeException {
+        if (list == null) {
+            return null;
+        }
 
-    Object res;
-    if (fieldObjectInspector.getCategory() == Category.PRIMITIVE){
-      if (field != null && field instanceof Boolean &&
-          HCatContext.getInstance().getConf().getBoolean(
-              HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER,
-              HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT)) {
-        res = ((Boolean) field) ? 1 : 0;
-      } else if (field != null && field instanceof Short &&
-          HCatContext.getInstance().getConf().getBoolean(
-              HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION,
-              HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT)) {
-        res = new Integer((Short) field);
-      } else if (field != null && field instanceof Byte &&
-          HCatContext.getInstance().getConf().getBoolean(
-              HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION,
-              HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT)) {
-        res = new Integer((Byte) field);
-      } else {
-        res = ((PrimitiveObjectInspector) fieldObjectInspector).getPrimitiveJavaObject(field);
-      }
-    } else if (fieldObjectInspector.getCategory() == Category.STRUCT){
-      res = serializeStruct(field,(StructObjectInspector)fieldObjectInspector);
-    } else if (fieldObjectInspector.getCategory() == Category.LIST){
-      res = serializeList(field,(ListObjectInspector)fieldObjectInspector);
-    } else if (fieldObjectInspector.getCategory() == Category.MAP){
-      res = serializeMap(field,(MapObjectInspector)fieldObjectInspector);
-    } else {
-      throw new SerDeException(HCatRecordSerDe.class.toString()
-          + " does not know what to do with fields of unknown category: "
-          + fieldObjectInspector.getCategory() + " , type: " + fieldObjectInspector.getTypeName());
-    }
-    return res;
-  }
+        List<Object> l = new ArrayList<Object>(fields.size());
 
-  /**
-   * Helper method to return underlying Java Map from
-   * an object-representation that is readable by a provided
-   * MapObjectInspector
-   */
-  private static Map<?,?> serializeMap(Object f, MapObjectInspector moi) throws SerDeException {
-    ObjectInspector koi = moi.getMapKeyObjectInspector();
-    ObjectInspector voi = moi.getMapValueObjectInspector();
-    Map<Object,Object> m = new TreeMap<Object, Object>();
+        if (fields != null) {
+            for (int i = 0; i < fields.size(); i++) {
 
-    Map<?, ?> readMap = moi.getMap(f);
-    if (readMap == null) {
-      return null;
-    } else {
-      for (Map.Entry<?, ?> entry: readMap.entrySet()) {
-        m.put(serializeField(entry.getKey(),koi), serializeField(entry.getValue(),voi));
-      }
-    }
-    return m;
-  }
-
-  private static List<?> serializeList(Object f, ListObjectInspector loi) throws SerDeException {
-    List l = loi.getList(f);
-    if (l == null){
-      return null;
+                // Get the field objectInspector and the field object.
+                ObjectInspector foi = fields.get(i).getFieldObjectInspector();
+                Object f = list.get(i);
+                Object res = serializeField(f, foi);
+                l.add(i, res);
+            }
+        }
+        return l;
     }
 
-    ObjectInspector eloi = loi.getListElementObjectInspector();
-    if (eloi.getCategory() == Category.PRIMITIVE){
-      List<Object> list = new ArrayList<Object>(l.size());
-      for(int i = 0; i < l.size(); i++){
-        list.add(((PrimitiveObjectInspector)eloi).getPrimitiveJavaObject(l.get(i)));
-      }
-      return list;
-    } else if (eloi.getCategory() == Category.STRUCT){
-      List<List<?>> list = new ArrayList<List<?>>(l.size());
-      for (int i = 0 ; i < l.size() ; i++ ){
-        list.add(serializeStruct(l.get(i), (StructObjectInspector) eloi));
-      }
-      return list;
-    } else if (eloi.getCategory() == Category.LIST){
-      List<List<?>> list = new ArrayList<List<?>>(l.size());
-      for (int i = 0 ; i < l.size() ; i++ ){
-        list.add(serializeList(l.get(i), (ListObjectInspector) eloi));
-      }
-      return list;
-    } else if (eloi.getCategory() == Category.MAP){
-      List<Map<?,?>> list = new ArrayList<Map<?,?>>(l.size());
-      for (int i = 0 ; i < l.size() ; i++ ){
-        list.add(serializeMap(l.get(i), (MapObjectInspector) eloi));
-      }
-      return list;
-    } else {
-      throw new SerDeException(HCatRecordSerDe.class.toString()
-          + " does not know what to do with fields of unknown category: "
-          + eloi.getCategory() + " , type: " + eloi.getTypeName());
+    /**
+     * Return underlying Java Object from an object-representation
+     * that is readable by a provided ObjectInspector.
+     */
+    public static Object serializeField(Object field, ObjectInspector fieldObjectInspector)
+        throws SerDeException {
+
+        Object res;
+        if (fieldObjectInspector.getCategory() == Category.PRIMITIVE) {
+            if (field != null && field instanceof Boolean &&
+                HCatContext.getInstance().getConf().getBoolean(
+                    HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER,
+                    HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER_DEFAULT)) {
+                res = ((Boolean) field) ? 1 : 0;
+            } else if (field != null && field instanceof Short &&
+                HCatContext.getInstance().getConf().getBoolean(
+                    HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION,
+                    HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT)) {
+                res = new Integer((Short) field);
+            } else if (field != null && field instanceof Byte &&
+                HCatContext.getInstance().getConf().getBoolean(
+                    HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION,
+                    HCatConstants.HCAT_DATA_TINY_SMALL_INT_PROMOTION_DEFAULT)) {
+                res = new Integer((Byte) field);
+            } else {
+                res = ((PrimitiveObjectInspector) fieldObjectInspector).getPrimitiveJavaObject(field);
+            }
+        } else if (fieldObjectInspector.getCategory() == Category.STRUCT) {
+            res = serializeStruct(field, (StructObjectInspector) fieldObjectInspector);
+        } else if (fieldObjectInspector.getCategory() == Category.LIST) {
+            res = serializeList(field, (ListObjectInspector) fieldObjectInspector);
+        } else if (fieldObjectInspector.getCategory() == Category.MAP) {
+            res = serializeMap(field, (MapObjectInspector) fieldObjectInspector);
+        } else {
+            throw new SerDeException(HCatRecordSerDe.class.toString()
+                + " does not know what to do with fields of unknown category: "
+                + fieldObjectInspector.getCategory() + " , type: " + fieldObjectInspector.getTypeName());
+        }
+        return res;
     }
-  }
+
+    /**
+     * Helper method to return underlying Java Map from
+     * an object-representation that is readable by a provided
+     * MapObjectInspector
+     */
+    private static Map<?, ?> serializeMap(Object f, MapObjectInspector moi) throws SerDeException {
+        ObjectInspector koi = moi.getMapKeyObjectInspector();
+        ObjectInspector voi = moi.getMapValueObjectInspector();
+        Map<Object, Object> m = new TreeMap<Object, Object>();
+
+        Map<?, ?> readMap = moi.getMap(f);
+        if (readMap == null) {
+            return null;
+        } else {
+            for (Map.Entry<?, ?> entry : readMap.entrySet()) {
+                m.put(serializeField(entry.getKey(), koi), serializeField(entry.getValue(), voi));
+            }
+        }
+        return m;
+    }
+
+    private static List<?> serializeList(Object f, ListObjectInspector loi) throws SerDeException {
+        List l = loi.getList(f);
+        if (l == null) {
+            return null;
+        }
+
+        ObjectInspector eloi = loi.getListElementObjectInspector();
+        if (eloi.getCategory() == Category.PRIMITIVE) {
+            List<Object> list = new ArrayList<Object>(l.size());
+            for (int i = 0; i < l.size(); i++) {
+                list.add(((PrimitiveObjectInspector) eloi).getPrimitiveJavaObject(l.get(i)));
+            }
+            return list;
+        } else if (eloi.getCategory() == Category.STRUCT) {
+            List<List<?>> list = new ArrayList<List<?>>(l.size());
+            for (int i = 0; i < l.size(); i++) {
+                list.add(serializeStruct(l.get(i), (StructObjectInspector) eloi));
+            }
+            return list;
+        } else if (eloi.getCategory() == Category.LIST) {
+            List<List<?>> list = new ArrayList<List<?>>(l.size());
+            for (int i = 0; i < l.size(); i++) {
+                list.add(serializeList(l.get(i), (ListObjectInspector) eloi));
+            }
+            return list;
+        } else if (eloi.getCategory() == Category.MAP) {
+            List<Map<?, ?>> list = new ArrayList<Map<?, ?>>(l.size());
+            for (int i = 0; i < l.size(); i++) {
+                list.add(serializeMap(l.get(i), (MapObjectInspector) eloi));
+            }
+            return list;
+        } else {
+            throw new SerDeException(HCatRecordSerDe.class.toString()
+                + " does not know what to do with fields of unknown category: "
+                + eloi.getCategory() + " , type: " + eloi.getTypeName());
+        }
+    }
 
 
-  /**
-   * Return an object inspector that can read through the object
-   * that we return from deserialize(). To wit, that means we need
-   * to return an ObjectInspector that can read HCatRecord, given
-   * the type info for it during initialize(). This also means
-   * that this method cannot and should not be called before initialize()
-   */
-  @Override
-  public ObjectInspector getObjectInspector() throws SerDeException {
-    return (ObjectInspector) cachedObjectInspector;
-  }
+    /**
+     * Return an object inspector that can read through the object
+     * that we return from deserialize(). To wit, that means we need
+     * to return an ObjectInspector that can read HCatRecord, given
+     * the type info for it during initialize(). This also means
+     * that this method cannot and should not be called before initialize()
+     */
+    @Override
+    public ObjectInspector getObjectInspector() throws SerDeException {
+        return (ObjectInspector) cachedObjectInspector;
+    }
 
-  @Override
-  public Class<? extends Writable> getSerializedClass() {
-    return HCatRecord.class;
-  }
+    @Override
+    public Class<? extends Writable> getSerializedClass() {
+        return HCatRecord.class;
+    }
 
-  @Override
-  public SerDeStats getSerDeStats() {
-    // no support for statistics yet
-    return null;
-  }
+    @Override
+    public SerDeStats getSerDeStats() {
+        // no support for statistics yet
+        return null;
+    }
 
 
 }
diff --git a/src/java/org/apache/hcatalog/data/HCatRecordable.java b/src/java/org/apache/hcatalog/data/HCatRecordable.java
index 2d2c4fc..3656bb7 100644
--- a/src/java/org/apache/hcatalog/data/HCatRecordable.java
+++ b/src/java/org/apache/hcatalog/data/HCatRecordable.java
@@ -26,30 +26,30 @@
  */
 public interface HCatRecordable extends Writable {
 
-  /**
-   * Gets the field at the specified index.
-   * @param fieldNum the field number
-   * @return the object at the specified index
-   */
-  Object get(int fieldNum);
+    /**
+     * Gets the field at the specified index.
+     * @param fieldNum the field number
+     * @return the object at the specified index
+     */
+    Object get(int fieldNum);
 
-  /**
-   * Gets all the fields of the hcat record.
-   * @return the list of fields
-   */
-  List<Object> getAll();
+    /**
+     * Gets all the fields of the hcat record.
+     * @return the list of fields
+     */
+    List<Object> getAll();
 
-  /**
-   * Sets the field at the specified index.
-   * @param fieldNum the field number
-   * @param value the value to set
-   */
-  void set(int fieldNum, Object value);
+    /**
+     * Sets the field at the specified index.
+     * @param fieldNum the field number
+     * @param value the value to set
+     */
+    void set(int fieldNum, Object value);
 
-  /**
-   * Gets the size of the hcat record.
-   * @return the size
-   */
-  int size();
+    /**
+     * Gets the size of the hcat record.
+     * @return the size
+     */
+    int size();
 
 }
diff --git a/src/java/org/apache/hcatalog/data/JsonSerDe.java b/src/java/org/apache/hcatalog/data/JsonSerDe.java
index 29adc71..cac8e1a 100644
--- a/src/java/org/apache/hcatalog/data/JsonSerDe.java
+++ b/src/java/org/apache/hcatalog/data/JsonSerDe.java
@@ -72,503 +72,503 @@
 
 public class JsonSerDe implements SerDe {
 
-  private static final Logger LOG = LoggerFactory.getLogger(JsonSerDe.class);
-  private List<String> columnNames;
-  private List<TypeInfo> columnTypes;
+    private static final Logger LOG = LoggerFactory.getLogger(JsonSerDe.class);
+    private List<String> columnNames;
+    private List<TypeInfo> columnTypes;
 
-  private StructTypeInfo rowTypeInfo;
-  private HCatSchema schema;
+    private StructTypeInfo rowTypeInfo;
+    private HCatSchema schema;
 
-  private JsonFactory jsonFactory = null;
+    private JsonFactory jsonFactory = null;
 
-  private HCatRecordObjectInspector cachedObjectInspector;
+    private HCatRecordObjectInspector cachedObjectInspector;
 
-  @Override
-  public void initialize(Configuration conf, Properties tbl)
-      throws SerDeException {
+    @Override
+    public void initialize(Configuration conf, Properties tbl)
+        throws SerDeException {
 
 
-    LOG.debug("Initializing JsonSerDe");
-    LOG.debug("props to serde: {}",tbl.entrySet());
+        LOG.debug("Initializing JsonSerDe");
+        LOG.debug("props to serde: {}", tbl.entrySet());
 
 
-    // Get column names and types
-    String columnNameProperty = tbl.getProperty(Constants.LIST_COLUMNS);
-    String columnTypeProperty = tbl.getProperty(Constants.LIST_COLUMN_TYPES);
+        // Get column names and types
+        String columnNameProperty = tbl.getProperty(Constants.LIST_COLUMNS);
+        String columnTypeProperty = tbl.getProperty(Constants.LIST_COLUMN_TYPES);
 
-    // all table column names
-    if (columnNameProperty.length() == 0) {
-      columnNames = new ArrayList<String>();
-    } else {
-      columnNames = Arrays.asList(columnNameProperty.split(","));
-    }
-
-    // all column types
-    if (columnTypeProperty.length() == 0) {
-      columnTypes = new ArrayList<TypeInfo>();
-    } else {
-      columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProperty);
-    }
-
-    LOG.debug("columns: {}, {}" , columnNameProperty, columnNames);
-    LOG.debug("types: {}, {} ", columnTypeProperty, columnTypes);
-
-    assert (columnNames.size() == columnTypes.size());
-
-    rowTypeInfo = (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes);
-
-    cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
-    try {
-      schema = HCatSchemaUtils.getHCatSchema(rowTypeInfo).get(0).getStructSubSchema();
-      LOG.debug("schema : {}", schema);
-      LOG.debug("fields : {}", schema.getFieldNames());
-    } catch (HCatException e) {
-      throw new SerDeException(e);
-    }
-
-    jsonFactory = new JsonFactory();
-  }
-
-  /**
-   * Takes JSON string in Text form, and has to return an object representation above
-   * it that's readable by the corresponding object inspector.
-   *
-   * For this implementation, since we're using the jackson parser, we can construct
-   * our own object implementation, and we use HCatRecord for it
-   */
-  @Override
-  public Object deserialize(Writable blob) throws SerDeException {
-
-    Text t = (Text)blob;
-    JsonParser p;
-    List<Object> r = new ArrayList<Object>(Collections.nCopies(columnNames.size(), null));
-    try {
-      p = jsonFactory.createJsonParser(new ByteArrayInputStream((t.getBytes())));
-      if (p.nextToken() != JsonToken.START_OBJECT) {
-        throw new IOException("Start token not found where expected");
-      }
-      JsonToken token;
-      while( ((token = p.nextToken()) != JsonToken.END_OBJECT)&&(token != null)){
-        // iterate through each token, and create appropriate object here.
-        populateRecord(r,token,p,schema);
-      }
-    } catch (JsonParseException e) {
-      LOG.warn("Error [{}] parsing json text [{}].", e, t);
-      LOG.debug(null,e);
-      throw new SerDeException(e);
-    } catch (IOException e) {
-      LOG.warn("Error [{}] parsing json text [{}].", e, t);
-      LOG.debug(null,e);
-      throw new SerDeException(e);
-    }
-
-    return new DefaultHCatRecord(r);
-  }
-
-  private void populateRecord(List<Object> r, JsonToken token, JsonParser p, HCatSchema s) throws IOException {
-    if (token != JsonToken.FIELD_NAME){
-      throw new IOException("Field name expected");
-    }
-    String fieldName = p.getText();
-    int fpos;
-    try {
-      fpos = s.getPosition(fieldName);
-    } catch (NullPointerException npe){
-      fpos = getPositionFromHiveInternalColumnName(fieldName);
-      LOG.debug("NPE finding position for field [{}] in schema [{}]",fieldName,s);
-      if (!fieldName.equalsIgnoreCase(getHiveInternalColumnName(fpos))){
-        LOG.error("Hive internal column name {} and position "
-            +"encoding {} for the column name are at odds",fieldName,fpos);
-        throw npe;
-      }
-      if (fpos == -1){
-        return; // unknown field, we return.
-      }
-    }
-    HCatFieldSchema hcatFieldSchema = s.getFields().get(fpos);
-    Object currField = extractCurrentField(p, null, hcatFieldSchema,false);
-    r.set(fpos,currField);
-  }
-
-  public String getHiveInternalColumnName(int fpos) {
-    return HiveConf.getColumnInternalName(fpos);
-  }
-
-  public int getPositionFromHiveInternalColumnName(String internalName) {
-//    return HiveConf.getPositionFromInternalName(fieldName);
-    // The above line should have been all the implementation that
-    // we need, but due to a bug in that impl which recognizes
-    // only single-digit columns, we need another impl here.
-    Pattern internalPattern = Pattern.compile("_col([0-9]+)");
-    Matcher m = internalPattern.matcher(internalName);
-    if (!m.matches()){
-      return -1;
-    } else {
-      return Integer.parseInt(m.group(1));
-    }
-  }
-
-  /**
-   * Utility method to extract current expected field from given JsonParser
-   *
-   * To get the field, we need either a type or a hcatFieldSchema(necessary for complex types)
-   * It is possible that one of them can be null, and so, if so, the other is instantiated
-   * from the other
-   *
-   * isTokenCurrent is a boolean variable also passed in, which determines
-   * if the JsonParser is already at the token we expect to read next, or
-   * needs advancing to the next before we read.
-   */
-  private Object extractCurrentField(JsonParser p, Type t,
-      HCatFieldSchema hcatFieldSchema, boolean isTokenCurrent) throws IOException, JsonParseException,
-      HCatException {
-    Object val = null;
-    JsonToken valueToken;
-    if (isTokenCurrent){
-      valueToken = p.getCurrentToken();
-    } else {
-      valueToken = p.nextToken();
-    }
-
-    if (hcatFieldSchema != null){
-      t = hcatFieldSchema.getType();
-    }
-    switch(t) {
-    case INT:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getIntValue();
-      break;
-    case TINYINT:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getByteValue();
-      break;
-    case SMALLINT:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getShortValue();
-      break;
-    case BIGINT:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getLongValue();
-      break;
-    case BOOLEAN:
-      String bval = (valueToken == JsonToken.VALUE_NULL)?null:p.getText();
-      if (bval != null){
-        val = Boolean.valueOf(bval);
-      } else {
-        val = null;
-      }
-      break;
-    case FLOAT:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getFloatValue();
-      break;
-    case DOUBLE:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getDoubleValue();
-      break;
-    case STRING:
-      val = (valueToken == JsonToken.VALUE_NULL)?null:p.getText();
-      break;
-    case BINARY:
-      throw new IOException("JsonSerDe does not support BINARY type");
-    case ARRAY:
-      if (valueToken == JsonToken.VALUE_NULL){
-        val = null;
-        break;
-      }
-      if (valueToken != JsonToken.START_ARRAY){
-        throw new IOException("Start of Array expected");
-      }
-      List<Object> arr = new ArrayList<Object>();
-      while ((valueToken = p.nextToken()) != JsonToken.END_ARRAY) {
-        arr.add(extractCurrentField(p, null,hcatFieldSchema.getArrayElementSchema().get(0),true));
-      }
-      val = arr;
-      break;
-    case MAP:
-      if (valueToken == JsonToken.VALUE_NULL){
-        val = null;
-        break;
-      }
-      if (valueToken != JsonToken.START_OBJECT){
-        throw new IOException("Start of Object expected");
-      }
-      Map<Object,Object> map = new LinkedHashMap<Object,Object>();
-      Type keyType = hcatFieldSchema.getMapKeyType();
-      HCatFieldSchema valueSchema = hcatFieldSchema.getMapValueSchema().get(0);
-      while ((valueToken = p.nextToken()) != JsonToken.END_OBJECT) {
-        Object k = getObjectOfCorrespondingPrimitiveType(p.getCurrentName(),keyType);
-        Object v;
-        if (valueSchema.getType() == HCatFieldSchema.Type.STRUCT){
-          v = extractCurrentField(p,null, valueSchema,false);
+        // all table column names
+        if (columnNameProperty.length() == 0) {
+            columnNames = new ArrayList<String>();
         } else {
-          v = extractCurrentField(p,null, valueSchema,true);
+            columnNames = Arrays.asList(columnNameProperty.split(","));
         }
 
-        map.put(k, v);
-      }
-      val = map;
-      break;
-    case STRUCT:
-      if (valueToken == JsonToken.VALUE_NULL){
-        val = null;
-        break;
-      }
-      if (valueToken != JsonToken.START_OBJECT){
-        throw new IOException("Start of Object expected");
-      }
-      HCatSchema subSchema = hcatFieldSchema.getStructSubSchema();
-      int sz = subSchema.getFieldNames().size();
+        // all column types
+        if (columnTypeProperty.length() == 0) {
+            columnTypes = new ArrayList<TypeInfo>();
+        } else {
+            columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProperty);
+        }
 
-      List<Object> struct = new ArrayList<Object>(Collections.nCopies(sz, null));
-      while ((valueToken = p.nextToken()) != JsonToken.END_OBJECT) {
-        populateRecord(struct, valueToken, p, subSchema);
-      }
-      val = struct;
-      break;
+        LOG.debug("columns: {}, {}", columnNameProperty, columnNames);
+        LOG.debug("types: {}, {} ", columnTypeProperty, columnTypes);
+
+        assert (columnNames.size() == columnTypes.size());
+
+        rowTypeInfo = (StructTypeInfo) TypeInfoFactory.getStructTypeInfo(columnNames, columnTypes);
+
+        cachedObjectInspector = HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(rowTypeInfo);
+        try {
+            schema = HCatSchemaUtils.getHCatSchema(rowTypeInfo).get(0).getStructSubSchema();
+            LOG.debug("schema : {}", schema);
+            LOG.debug("fields : {}", schema.getFieldNames());
+        } catch (HCatException e) {
+            throw new SerDeException(e);
+        }
+
+        jsonFactory = new JsonFactory();
     }
-    return val;
-  }
 
-  private Object getObjectOfCorrespondingPrimitiveType(String s, Type t) throws IOException {
-    switch(t) {
-    case INT:
-      return Integer.valueOf(s);
-    case TINYINT:
-      return Byte.valueOf(s);
-    case SMALLINT:
-      return Short.valueOf(s);
-    case BIGINT:
-      return Long.valueOf(s);
-    case BOOLEAN:
-      return (s.equalsIgnoreCase("true"));
-    case FLOAT:
-      return Float.valueOf(s);
-    case DOUBLE:
-      return Double.valueOf(s);
-    case STRING:
-      return s;
-    case BINARY:
-      throw new IOException("JsonSerDe does not support BINARY type");
+    /**
+     * Takes JSON string in Text form, and has to return an object representation above
+     * it that's readable by the corresponding object inspector.
+     *
+     * For this implementation, since we're using the jackson parser, we can construct
+     * our own object implementation, and we use HCatRecord for it
+     */
+    @Override
+    public Object deserialize(Writable blob) throws SerDeException {
+
+        Text t = (Text) blob;
+        JsonParser p;
+        List<Object> r = new ArrayList<Object>(Collections.nCopies(columnNames.size(), null));
+        try {
+            p = jsonFactory.createJsonParser(new ByteArrayInputStream((t.getBytes())));
+            if (p.nextToken() != JsonToken.START_OBJECT) {
+                throw new IOException("Start token not found where expected");
+            }
+            JsonToken token;
+            while (((token = p.nextToken()) != JsonToken.END_OBJECT) && (token != null)) {
+                // iterate through each token, and create appropriate object here.
+                populateRecord(r, token, p, schema);
+            }
+        } catch (JsonParseException e) {
+            LOG.warn("Error [{}] parsing json text [{}].", e, t);
+            LOG.debug(null, e);
+            throw new SerDeException(e);
+        } catch (IOException e) {
+            LOG.warn("Error [{}] parsing json text [{}].", e, t);
+            LOG.debug(null, e);
+            throw new SerDeException(e);
+        }
+
+        return new DefaultHCatRecord(r);
     }
-    throw new IOException("Could not convert from string to map type "+t);
-  }
 
-  /**
-   * Given an object and object inspector pair, traverse the object
-   * and generate a Text representation of the object.
-   */
-  @Override
-  public Writable serialize(Object obj, ObjectInspector objInspector)
-      throws SerDeException {
-    StringBuilder sb = new StringBuilder();
-    try {
-
-      StructObjectInspector soi = (StructObjectInspector) objInspector;
-      List<? extends StructField> structFields = soi.getAllStructFieldRefs();
-      assert (columnNames.size() == structFields.size());
-      if (obj == null) {
-        sb.append("null");
-      } else {
-        sb.append(SerDeUtils.LBRACE);
-        for (int i = 0; i < structFields.size(); i++) {
-          if (i > 0) {
-            sb.append(SerDeUtils.COMMA);
-          }
-          sb.append(SerDeUtils.QUOTE);
-          sb.append(columnNames.get(i));
-          sb.append(SerDeUtils.QUOTE);
-          sb.append(SerDeUtils.COLON);
-          buildJSONString(sb, soi.getStructFieldData(obj, structFields.get(i)),
-              structFields.get(i).getFieldObjectInspector());
+    private void populateRecord(List<Object> r, JsonToken token, JsonParser p, HCatSchema s) throws IOException {
+        if (token != JsonToken.FIELD_NAME) {
+            throw new IOException("Field name expected");
         }
-        sb.append(SerDeUtils.RBRACE);
-      }
-
-    } catch (IOException e) {
-      LOG.warn("Error generating json text from object.", e);
-      throw new SerDeException(e);
+        String fieldName = p.getText();
+        int fpos;
+        try {
+            fpos = s.getPosition(fieldName);
+        } catch (NullPointerException npe) {
+            fpos = getPositionFromHiveInternalColumnName(fieldName);
+            LOG.debug("NPE finding position for field [{}] in schema [{}]", fieldName, s);
+            if (!fieldName.equalsIgnoreCase(getHiveInternalColumnName(fpos))) {
+                LOG.error("Hive internal column name {} and position "
+                    + "encoding {} for the column name are at odds", fieldName, fpos);
+                throw npe;
+            }
+            if (fpos == -1) {
+                return; // unknown field, we return.
+            }
+        }
+        HCatFieldSchema hcatFieldSchema = s.getFields().get(fpos);
+        Object currField = extractCurrentField(p, null, hcatFieldSchema, false);
+        r.set(fpos, currField);
     }
-    return new Text(sb.toString());
-  }
 
-  // TODO : code section copied over from SerDeUtils because of non-standard json production there
-  // should use quotes for all field names. We should fix this there, and then remove this copy.
-  // See http://jackson.codehaus.org/1.7.3/javadoc/org/codehaus/jackson/JsonParser.Feature.html#ALLOW_UNQUOTED_FIELD_NAMES
-  // for details - trying to enable Jackson to ignore that doesn't seem to work(compilation failure
-  // when attempting to use that feature, so having to change the production itself.
-  // Also, throws IOException when Binary is detected.
-  private static void buildJSONString(StringBuilder sb, Object o, ObjectInspector oi) throws IOException {
+    public String getHiveInternalColumnName(int fpos) {
+        return HiveConf.getColumnInternalName(fpos);
+    }
 
-    switch (oi.getCategory()) {
-    case PRIMITIVE: {
-      PrimitiveObjectInspector poi = (PrimitiveObjectInspector) oi;
-      if (o == null) {
-        sb.append("null");
-      } else {
-        switch (poi.getPrimitiveCategory()) {
-        case BOOLEAN: {
-          boolean b = ((BooleanObjectInspector) poi).get(o);
-          sb.append(b ? "true" : "false");
-          break;
+    public int getPositionFromHiveInternalColumnName(String internalName) {
+//    return HiveConf.getPositionFromInternalName(fieldName);
+        // The above line should have been all the implementation that
+        // we need, but due to a bug in that impl which recognizes
+        // only single-digit columns, we need another impl here.
+        Pattern internalPattern = Pattern.compile("_col([0-9]+)");
+        Matcher m = internalPattern.matcher(internalName);
+        if (!m.matches()) {
+            return -1;
+        } else {
+            return Integer.parseInt(m.group(1));
         }
-        case BYTE: {
-          sb.append(((ByteObjectInspector) poi).get(o));
-          break;
+    }
+
+    /**
+     * Utility method to extract current expected field from given JsonParser
+     *
+     * To get the field, we need either a type or a hcatFieldSchema(necessary for complex types)
+     * It is possible that one of them can be null, and so, if so, the other is instantiated
+     * from the other
+     *
+     * isTokenCurrent is a boolean variable also passed in, which determines
+     * if the JsonParser is already at the token we expect to read next, or
+     * needs advancing to the next before we read.
+     */
+    private Object extractCurrentField(JsonParser p, Type t,
+                                       HCatFieldSchema hcatFieldSchema, boolean isTokenCurrent) throws IOException, JsonParseException,
+        HCatException {
+        Object val = null;
+        JsonToken valueToken;
+        if (isTokenCurrent) {
+            valueToken = p.getCurrentToken();
+        } else {
+            valueToken = p.nextToken();
         }
-        case SHORT: {
-          sb.append(((ShortObjectInspector) poi).get(o));
-          break;
+
+        if (hcatFieldSchema != null) {
+            t = hcatFieldSchema.getType();
         }
-        case INT: {
-          sb.append(((IntObjectInspector) poi).get(o));
-          break;
+        switch (t) {
+        case INT:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getIntValue();
+            break;
+        case TINYINT:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getByteValue();
+            break;
+        case SMALLINT:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getShortValue();
+            break;
+        case BIGINT:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getLongValue();
+            break;
+        case BOOLEAN:
+            String bval = (valueToken == JsonToken.VALUE_NULL) ? null : p.getText();
+            if (bval != null) {
+                val = Boolean.valueOf(bval);
+            } else {
+                val = null;
+            }
+            break;
+        case FLOAT:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getFloatValue();
+            break;
+        case DOUBLE:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getDoubleValue();
+            break;
+        case STRING:
+            val = (valueToken == JsonToken.VALUE_NULL) ? null : p.getText();
+            break;
+        case BINARY:
+            throw new IOException("JsonSerDe does not support BINARY type");
+        case ARRAY:
+            if (valueToken == JsonToken.VALUE_NULL) {
+                val = null;
+                break;
+            }
+            if (valueToken != JsonToken.START_ARRAY) {
+                throw new IOException("Start of Array expected");
+            }
+            List<Object> arr = new ArrayList<Object>();
+            while ((valueToken = p.nextToken()) != JsonToken.END_ARRAY) {
+                arr.add(extractCurrentField(p, null, hcatFieldSchema.getArrayElementSchema().get(0), true));
+            }
+            val = arr;
+            break;
+        case MAP:
+            if (valueToken == JsonToken.VALUE_NULL) {
+                val = null;
+                break;
+            }
+            if (valueToken != JsonToken.START_OBJECT) {
+                throw new IOException("Start of Object expected");
+            }
+            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+            Type keyType = hcatFieldSchema.getMapKeyType();
+            HCatFieldSchema valueSchema = hcatFieldSchema.getMapValueSchema().get(0);
+            while ((valueToken = p.nextToken()) != JsonToken.END_OBJECT) {
+                Object k = getObjectOfCorrespondingPrimitiveType(p.getCurrentName(), keyType);
+                Object v;
+                if (valueSchema.getType() == HCatFieldSchema.Type.STRUCT) {
+                    v = extractCurrentField(p, null, valueSchema, false);
+                } else {
+                    v = extractCurrentField(p, null, valueSchema, true);
+                }
+
+                map.put(k, v);
+            }
+            val = map;
+            break;
+        case STRUCT:
+            if (valueToken == JsonToken.VALUE_NULL) {
+                val = null;
+                break;
+            }
+            if (valueToken != JsonToken.START_OBJECT) {
+                throw new IOException("Start of Object expected");
+            }
+            HCatSchema subSchema = hcatFieldSchema.getStructSubSchema();
+            int sz = subSchema.getFieldNames().size();
+
+            List<Object> struct = new ArrayList<Object>(Collections.nCopies(sz, null));
+            while ((valueToken = p.nextToken()) != JsonToken.END_OBJECT) {
+                populateRecord(struct, valueToken, p, subSchema);
+            }
+            val = struct;
+            break;
         }
-        case LONG: {
-          sb.append(((LongObjectInspector) poi).get(o));
-          break;
+        return val;
+    }
+
+    private Object getObjectOfCorrespondingPrimitiveType(String s, Type t) throws IOException {
+        switch (t) {
+        case INT:
+            return Integer.valueOf(s);
+        case TINYINT:
+            return Byte.valueOf(s);
+        case SMALLINT:
+            return Short.valueOf(s);
+        case BIGINT:
+            return Long.valueOf(s);
+        case BOOLEAN:
+            return (s.equalsIgnoreCase("true"));
+        case FLOAT:
+            return Float.valueOf(s);
+        case DOUBLE:
+            return Double.valueOf(s);
+        case STRING:
+            return s;
+        case BINARY:
+            throw new IOException("JsonSerDe does not support BINARY type");
         }
-        case FLOAT: {
-          sb.append(((FloatObjectInspector) poi).get(o));
-          break;
+        throw new IOException("Could not convert from string to map type " + t);
+    }
+
+    /**
+     * Given an object and object inspector pair, traverse the object
+     * and generate a Text representation of the object.
+     */
+    @Override
+    public Writable serialize(Object obj, ObjectInspector objInspector)
+        throws SerDeException {
+        StringBuilder sb = new StringBuilder();
+        try {
+
+            StructObjectInspector soi = (StructObjectInspector) objInspector;
+            List<? extends StructField> structFields = soi.getAllStructFieldRefs();
+            assert (columnNames.size() == structFields.size());
+            if (obj == null) {
+                sb.append("null");
+            } else {
+                sb.append(SerDeUtils.LBRACE);
+                for (int i = 0; i < structFields.size(); i++) {
+                    if (i > 0) {
+                        sb.append(SerDeUtils.COMMA);
+                    }
+                    sb.append(SerDeUtils.QUOTE);
+                    sb.append(columnNames.get(i));
+                    sb.append(SerDeUtils.QUOTE);
+                    sb.append(SerDeUtils.COLON);
+                    buildJSONString(sb, soi.getStructFieldData(obj, structFields.get(i)),
+                        structFields.get(i).getFieldObjectInspector());
+                }
+                sb.append(SerDeUtils.RBRACE);
+            }
+
+        } catch (IOException e) {
+            LOG.warn("Error generating json text from object.", e);
+            throw new SerDeException(e);
         }
-        case DOUBLE: {
-          sb.append(((DoubleObjectInspector) poi).get(o));
-          break;
+        return new Text(sb.toString());
+    }
+
+    // TODO : code section copied over from SerDeUtils because of non-standard json production there
+    // should use quotes for all field names. We should fix this there, and then remove this copy.
+    // See http://jackson.codehaus.org/1.7.3/javadoc/org/codehaus/jackson/JsonParser.Feature.html#ALLOW_UNQUOTED_FIELD_NAMES
+    // for details - trying to enable Jackson to ignore that doesn't seem to work(compilation failure
+    // when attempting to use that feature, so having to change the production itself.
+    // Also, throws IOException when Binary is detected.
+    private static void buildJSONString(StringBuilder sb, Object o, ObjectInspector oi) throws IOException {
+
+        switch (oi.getCategory()) {
+        case PRIMITIVE: {
+            PrimitiveObjectInspector poi = (PrimitiveObjectInspector) oi;
+            if (o == null) {
+                sb.append("null");
+            } else {
+                switch (poi.getPrimitiveCategory()) {
+                case BOOLEAN: {
+                    boolean b = ((BooleanObjectInspector) poi).get(o);
+                    sb.append(b ? "true" : "false");
+                    break;
+                }
+                case BYTE: {
+                    sb.append(((ByteObjectInspector) poi).get(o));
+                    break;
+                }
+                case SHORT: {
+                    sb.append(((ShortObjectInspector) poi).get(o));
+                    break;
+                }
+                case INT: {
+                    sb.append(((IntObjectInspector) poi).get(o));
+                    break;
+                }
+                case LONG: {
+                    sb.append(((LongObjectInspector) poi).get(o));
+                    break;
+                }
+                case FLOAT: {
+                    sb.append(((FloatObjectInspector) poi).get(o));
+                    break;
+                }
+                case DOUBLE: {
+                    sb.append(((DoubleObjectInspector) poi).get(o));
+                    break;
+                }
+                case STRING: {
+                    sb.append('"');
+                    sb.append(SerDeUtils.escapeString(((StringObjectInspector) poi)
+                        .getPrimitiveJavaObject(o)));
+                    sb.append('"');
+                    break;
+                }
+                case TIMESTAMP: {
+                    sb.append('"');
+                    sb.append(((TimestampObjectInspector) poi)
+                        .getPrimitiveWritableObject(o));
+                    sb.append('"');
+                    break;
+                }
+                case BINARY: {
+                    throw new IOException("JsonSerDe does not support BINARY type");
+                }
+                default:
+                    throw new RuntimeException("Unknown primitive type: "
+                        + poi.getPrimitiveCategory());
+                }
+            }
+            break;
         }
-        case STRING: {
-          sb.append('"');
-          sb.append(SerDeUtils.escapeString(((StringObjectInspector) poi)
-              .getPrimitiveJavaObject(o)));
-          sb.append('"');
-          break;
+        case LIST: {
+            ListObjectInspector loi = (ListObjectInspector) oi;
+            ObjectInspector listElementObjectInspector = loi
+                .getListElementObjectInspector();
+            List<?> olist = loi.getList(o);
+            if (olist == null) {
+                sb.append("null");
+            } else {
+                sb.append(SerDeUtils.LBRACKET);
+                for (int i = 0; i < olist.size(); i++) {
+                    if (i > 0) {
+                        sb.append(SerDeUtils.COMMA);
+                    }
+                    buildJSONString(sb, olist.get(i), listElementObjectInspector);
+                }
+                sb.append(SerDeUtils.RBRACKET);
+            }
+            break;
         }
-        case TIMESTAMP: {
-          sb.append('"');
-          sb.append(((TimestampObjectInspector) poi)
-              .getPrimitiveWritableObject(o));
-          sb.append('"');
-          break;
+        case MAP: {
+            MapObjectInspector moi = (MapObjectInspector) oi;
+            ObjectInspector mapKeyObjectInspector = moi.getMapKeyObjectInspector();
+            ObjectInspector mapValueObjectInspector = moi
+                .getMapValueObjectInspector();
+            Map<?, ?> omap = moi.getMap(o);
+            if (omap == null) {
+                sb.append("null");
+            } else {
+                sb.append(SerDeUtils.LBRACE);
+                boolean first = true;
+                for (Object entry : omap.entrySet()) {
+                    if (first) {
+                        first = false;
+                    } else {
+                        sb.append(SerDeUtils.COMMA);
+                    }
+                    Map.Entry<?, ?> e = (Map.Entry<?, ?>) entry;
+                    StringBuilder keyBuilder = new StringBuilder();
+                    buildJSONString(keyBuilder, e.getKey(), mapKeyObjectInspector);
+                    String keyString = keyBuilder.toString().trim();
+                    boolean doQuoting = (!keyString.isEmpty()) && (keyString.charAt(0) != SerDeUtils.QUOTE);
+                    if (doQuoting) {
+                        sb.append(SerDeUtils.QUOTE);
+                    }
+                    sb.append(keyString);
+                    if (doQuoting) {
+                        sb.append(SerDeUtils.QUOTE);
+                    }
+                    sb.append(SerDeUtils.COLON);
+                    buildJSONString(sb, e.getValue(), mapValueObjectInspector);
+                }
+                sb.append(SerDeUtils.RBRACE);
+            }
+            break;
         }
-        case BINARY: {
-          throw new IOException("JsonSerDe does not support BINARY type");
+        case STRUCT: {
+            StructObjectInspector soi = (StructObjectInspector) oi;
+            List<? extends StructField> structFields = soi.getAllStructFieldRefs();
+            if (o == null) {
+                sb.append("null");
+            } else {
+                sb.append(SerDeUtils.LBRACE);
+                for (int i = 0; i < structFields.size(); i++) {
+                    if (i > 0) {
+                        sb.append(SerDeUtils.COMMA);
+                    }
+                    sb.append(SerDeUtils.QUOTE);
+                    sb.append(structFields.get(i).getFieldName());
+                    sb.append(SerDeUtils.QUOTE);
+                    sb.append(SerDeUtils.COLON);
+                    buildJSONString(sb, soi.getStructFieldData(o, structFields.get(i)),
+                        structFields.get(i).getFieldObjectInspector());
+                }
+                sb.append(SerDeUtils.RBRACE);
+            }
+            break;
+        }
+        case UNION: {
+            UnionObjectInspector uoi = (UnionObjectInspector) oi;
+            if (o == null) {
+                sb.append("null");
+            } else {
+                sb.append(SerDeUtils.LBRACE);
+                sb.append(uoi.getTag(o));
+                sb.append(SerDeUtils.COLON);
+                buildJSONString(sb, uoi.getField(o),
+                    uoi.getObjectInspectors().get(uoi.getTag(o)));
+                sb.append(SerDeUtils.RBRACE);
+            }
+            break;
         }
         default:
-          throw new RuntimeException("Unknown primitive type: "
-              + poi.getPrimitiveCategory());
+            throw new RuntimeException("Unknown type in ObjectInspector!");
         }
-      }
-      break;
     }
-    case LIST: {
-      ListObjectInspector loi = (ListObjectInspector) oi;
-      ObjectInspector listElementObjectInspector = loi
-          .getListElementObjectInspector();
-      List<?> olist = loi.getList(o);
-      if (olist == null) {
-        sb.append("null");
-      } else {
-        sb.append(SerDeUtils.LBRACKET);
-        for (int i = 0; i < olist.size(); i++) {
-          if (i > 0) {
-            sb.append(SerDeUtils.COMMA);
-          }
-          buildJSONString(sb, olist.get(i), listElementObjectInspector);
-        }
-        sb.append(SerDeUtils.RBRACKET);
-      }
-      break;
-    }
-    case MAP: {
-      MapObjectInspector moi = (MapObjectInspector) oi;
-      ObjectInspector mapKeyObjectInspector = moi.getMapKeyObjectInspector();
-      ObjectInspector mapValueObjectInspector = moi
-          .getMapValueObjectInspector();
-      Map<?, ?> omap = moi.getMap(o);
-      if (omap == null) {
-        sb.append("null");
-      } else {
-        sb.append(SerDeUtils.LBRACE);
-        boolean first = true;
-        for (Object entry : omap.entrySet()) {
-          if (first) {
-            first = false;
-          } else {
-            sb.append(SerDeUtils.COMMA);
-          }
-          Map.Entry<?, ?> e = (Map.Entry<?, ?>) entry;
-          StringBuilder keyBuilder = new StringBuilder();
-          buildJSONString(keyBuilder, e.getKey(), mapKeyObjectInspector);
-          String keyString = keyBuilder.toString().trim();
-          boolean doQuoting =  (!keyString.isEmpty()) && (keyString.charAt(0)!= SerDeUtils.QUOTE);
-          if (doQuoting ){
-            sb.append(SerDeUtils.QUOTE);
-          }
-          sb.append(keyString);
-          if (doQuoting ){
-            sb.append(SerDeUtils.QUOTE);
-          }
-          sb.append(SerDeUtils.COLON);
-          buildJSONString(sb, e.getValue(), mapValueObjectInspector);
-        }
-        sb.append(SerDeUtils.RBRACE);
-      }
-      break;
-    }
-    case STRUCT: {
-      StructObjectInspector soi = (StructObjectInspector) oi;
-      List<? extends StructField> structFields = soi.getAllStructFieldRefs();
-      if (o == null) {
-        sb.append("null");
-      } else {
-        sb.append(SerDeUtils.LBRACE);
-        for (int i = 0; i < structFields.size(); i++) {
-          if (i > 0) {
-            sb.append(SerDeUtils.COMMA);
-          }
-          sb.append(SerDeUtils.QUOTE);
-          sb.append(structFields.get(i).getFieldName());
-          sb.append(SerDeUtils.QUOTE);
-          sb.append(SerDeUtils.COLON);
-          buildJSONString(sb, soi.getStructFieldData(o, structFields.get(i)),
-              structFields.get(i).getFieldObjectInspector());
-        }
-        sb.append(SerDeUtils.RBRACE);
-      }
-      break;
-    }
-    case UNION: {
-      UnionObjectInspector uoi = (UnionObjectInspector) oi;
-      if (o == null) {
-        sb.append("null");
-      } else {
-        sb.append(SerDeUtils.LBRACE);
-        sb.append(uoi.getTag(o));
-        sb.append(SerDeUtils.COLON);
-        buildJSONString(sb, uoi.getField(o),
-              uoi.getObjectInspectors().get(uoi.getTag(o)));
-        sb.append(SerDeUtils.RBRACE);
-      }
-      break;
-    }
-    default:
-      throw new RuntimeException("Unknown type in ObjectInspector!");
-    }
-  }
 
 
-  /**
-   *  Returns an object inspector for the specified schema that
-   *  is capable of reading in the object representation of the JSON string
-   */
-  @Override
-  public ObjectInspector getObjectInspector() throws SerDeException {
-    return cachedObjectInspector;
-  }
+    /**
+     *  Returns an object inspector for the specified schema that
+     *  is capable of reading in the object representation of the JSON string
+     */
+    @Override
+    public ObjectInspector getObjectInspector() throws SerDeException {
+        return cachedObjectInspector;
+    }
 
-  @Override
-  public Class<? extends Writable> getSerializedClass() {
-    return Text.class;
-  }
+    @Override
+    public Class<? extends Writable> getSerializedClass() {
+        return Text.class;
+    }
 
-  @Override
-  public SerDeStats getSerDeStats() {
-    // no support for statistics yet
-    return null;
-  }
+    @Override
+    public SerDeStats getSerDeStats() {
+        // no support for statistics yet
+        return null;
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/data/LazyHCatRecord.java b/src/java/org/apache/hcatalog/data/LazyHCatRecord.java
index 9917f5c..6bcb138 100644
--- a/src/java/org/apache/hcatalog/data/LazyHCatRecord.java
+++ b/src/java/org/apache/hcatalog/data/LazyHCatRecord.java
@@ -40,110 +40,106 @@
  */
 public class LazyHCatRecord extends HCatRecord {
 
-  public static final Logger LOG = LoggerFactory.getLogger(LazyHCatRecord.class.getName());
+    public static final Logger LOG = LoggerFactory.getLogger(LazyHCatRecord.class.getName());
 
-  private Object wrappedObject;
-  private StructObjectInspector soi;
-  
-  @Override
-  public Object get(int fieldNum) {
-    try {
-      StructField fref = soi.getAllStructFieldRefs().get(fieldNum);
-      return HCatRecordSerDe.serializeField(
-          soi.getStructFieldData(wrappedObject, fref),
-          fref.getFieldObjectInspector());
-    } catch (SerDeException e) {
-      throw new IllegalStateException("SerDe Exception deserializing",e);
-    }
-  }
-  
+    private Object wrappedObject;
+    private StructObjectInspector soi;
 
-  @Override
-  public List<Object> getAll() {
-    
-    List<Object> r = new ArrayList<Object>(this.size());
-    for (int i = 0; i < this.size(); i++){
-      r.add(i, get(i));
-    }
-    return r;
-  }
-
-  @Override
-  public void set(int fieldNum, Object value) {
-    throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
-  }
-
-  @Override
-  public int size() {
-    return soi.getAllStructFieldRefs().size();
-  }
-
-  @Override
-  public void readFields(DataInput in) throws IOException {
-    throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
-        + " an object/object inspector as a HCatRecord "
-        + "- it does not need to be read from DataInput.");
-  }
-
-  @Override
-  public void write(DataOutput out) throws IOException {
-    throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
-        + " an object/object inspector as a HCatRecord "
-        + "- it does not need to be written to a DataOutput.");
-  }
-
-  @Override
-  public Object get(String fieldName, HCatSchema recordSchema)
-      throws HCatException {
-    int idx = recordSchema.getPosition(fieldName);
-    return get(idx);
-  }
-
-  @Override
-  public void set(String fieldName, HCatSchema recordSchema, Object value)
-      throws HCatException {
-    throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
-  }
-
-  @Override
-  public void remove(int idx) throws HCatException {
-    throw new UnsupportedOperationException("not allowed to run remove() on LazyHCatRecord");
-  }
-
-  @Override
-  public void copy(HCatRecord r) throws HCatException {
-    throw new UnsupportedOperationException("not allowed to run copy() on LazyHCatRecord");
-  }
-  
-  public LazyHCatRecord(Object wrappedObject, ObjectInspector oi) throws Exception {
-    if (oi.getCategory() != Category.STRUCT) {
-      throw new SerDeException(getClass().toString() + " can only make a lazy hcat record from " +
-          "objects of struct types, but we got: " + oi.getTypeName());
+    @Override
+    public Object get(int fieldNum) {
+        try {
+            StructField fref = soi.getAllStructFieldRefs().get(fieldNum);
+            return HCatRecordSerDe.serializeField(
+                soi.getStructFieldData(wrappedObject, fref),
+                    fref.getFieldObjectInspector());
+        } catch (SerDeException e) {
+            throw new IllegalStateException("SerDe Exception deserializing",e);
+        }
     }
 
-    this.soi = (StructObjectInspector)oi;
-    this.wrappedObject = wrappedObject;
-  }
-
-  @Override
-  public String toString(){
-    StringBuilder sb = new StringBuilder();
-    for(int i = 0; i< size() ; i++) {
-      sb.append(get(i)+"\t");
+    @Override
+    public List<Object> getAll() {
+        List<Object> r = new ArrayList<Object>(this.size());
+        for (int i = 0; i < this.size(); i++){
+            r.add(i, get(i));
+        }
+        return r;
     }
-    return sb.toString();
-  }
 
-  /**
-   * Convert this LazyHCatRecord to a DefaultHCatRecord.  This is required
-   * before you can write out a record via write.
-   * @return an HCatRecord that can be serialized
-   * @throws HCatException
-   */
-  public HCatRecord getWritable() throws HCatException {
-    DefaultHCatRecord d = new DefaultHCatRecord();
-    d.copy(this);
-    return d;
-  }
+    @Override
+    public void set(int fieldNum, Object value) {
+        throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
+    }
 
+    @Override
+    public int size() {
+        return soi.getAllStructFieldRefs().size();
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
+            + " an object/object inspector as a HCatRecord "
+            + "- it does not need to be read from DataInput.");
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
+            + " an object/object inspector as a HCatRecord "
+            + "- it does not need to be written to a DataOutput.");
+    }
+
+    @Override
+    public Object get(String fieldName, HCatSchema recordSchema) throws HCatException {
+        int idx = recordSchema.getPosition(fieldName);
+        return get(idx);
+    }
+
+    @Override
+    public void set(String fieldName, HCatSchema recordSchema, Object value) throws HCatException {
+        throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
+    }
+
+    @Override
+    public void remove(int idx) throws HCatException {
+        throw new UnsupportedOperationException("not allowed to run remove() on LazyHCatRecord");
+    }
+
+    @Override
+    public void copy(HCatRecord r) throws HCatException {
+        throw new UnsupportedOperationException("not allowed to run copy() on LazyHCatRecord");
+    }
+
+    public LazyHCatRecord(Object wrappedObject, ObjectInspector oi) throws Exception {
+        if (oi.getCategory() != Category.STRUCT) {
+            throw new SerDeException(getClass().toString() +
+                " can only make a lazy hcat record from " +
+                "objects of struct types, but we got: " + oi.getTypeName());
+        }
+
+        this.soi = (StructObjectInspector)oi;
+        this.wrappedObject = wrappedObject;
+    }
+
+    @Override
+    public String toString(){
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0; i< size() ; i++) {
+            sb.append(get(i)+"\t");
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Convert this LazyHCatRecord to a DefaultHCatRecord.  This is required
+     * before you can write out a record via write.
+     * @return an HCatRecord that can be serialized
+     * @throws HCatException
+     */
+    public HCatRecord getWritable() throws HCatException {
+        DefaultHCatRecord d = new DefaultHCatRecord();
+        d.copy(this);
+        return d;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/Pair.java b/src/java/org/apache/hcatalog/data/Pair.java
index dea9d27..9eb525f 100644
--- a/src/java/org/apache/hcatalog/data/Pair.java
+++ b/src/java/org/apache/hcatalog/data/Pair.java
@@ -42,44 +42,44 @@
      */
     @Override
     public String toString() {
-        return "[" + first.toString() +"," + second.toString() + "]";
+        return "[" + first.toString() + "," + second.toString() + "]";
     }
 
     @Override
     public int hashCode() {
         return (((this.first == null ? 1 : this.first.hashCode()) * 17)
-                + (this.second == null ? 1 : this.second.hashCode()) * 19);
+            + (this.second == null ? 1 : this.second.hashCode()) * 19);
     }
 
     @Override
     public boolean equals(Object other) {
-        if(other == null) {
+        if (other == null) {
             return false;
         }
 
-        if(! (other instanceof Pair)) {
+        if (!(other instanceof Pair)) {
             return false;
         }
 
         Pair otherPair = (Pair) other;
 
-        if(this.first == null) {
-            if(otherPair.first != null) {
+        if (this.first == null) {
+            if (otherPair.first != null) {
                 return false;
             } else {
                 return true;
             }
         }
 
-        if(this.second == null) {
-            if(otherPair.second != null) {
+        if (this.second == null) {
+            if (otherPair.second != null) {
                 return false;
             } else {
                 return true;
             }
         }
 
-        if(this.first.equals(otherPair.first) && this.second.equals(otherPair.second)) {
+        if (this.first.equals(otherPair.first) && this.second.equals(otherPair.second)) {
             return true;
         } else {
             return false;
diff --git a/src/java/org/apache/hcatalog/data/ReaderWriter.java b/src/java/org/apache/hcatalog/data/ReaderWriter.java
index 4210133..79b4035 100644
--- a/src/java/org/apache/hcatalog/data/ReaderWriter.java
+++ b/src/java/org/apache/hcatalog/data/ReaderWriter.java
@@ -34,158 +34,158 @@
 
 public abstract class ReaderWriter {
 
-  private static final String UTF8 = "UTF-8";
+    private static final String UTF8 = "UTF-8";
 
-  public static Object readDatum(DataInput in) throws IOException {
+    public static Object readDatum(DataInput in) throws IOException {
 
-    byte type = in.readByte();
-    switch (type) {
+        byte type = in.readByte();
+        switch (type) {
 
-    case DataType.STRING:
-      byte[] buffer = new byte[in.readInt()];
-      in.readFully(buffer);
-      return new String(buffer,UTF8);
+        case DataType.STRING:
+            byte[] buffer = new byte[in.readInt()];
+            in.readFully(buffer);
+            return new String(buffer, UTF8);
 
-    case DataType.INTEGER:
-      VIntWritable vint = new VIntWritable();
-      vint.readFields(in);
-      return vint.get();
+        case DataType.INTEGER:
+            VIntWritable vint = new VIntWritable();
+            vint.readFields(in);
+            return vint.get();
 
-    case DataType.LONG:
-      VLongWritable vlong = new VLongWritable();
-      vlong.readFields(in);
-      return vlong.get();
+        case DataType.LONG:
+            VLongWritable vlong = new VLongWritable();
+            vlong.readFields(in);
+            return vlong.get();
 
-    case DataType.FLOAT:
-      return in.readFloat();
+        case DataType.FLOAT:
+            return in.readFloat();
 
-    case DataType.DOUBLE:
-      return in.readDouble();
+        case DataType.DOUBLE:
+            return in.readDouble();
 
-    case DataType.BOOLEAN:
-      return in.readBoolean();
+        case DataType.BOOLEAN:
+            return in.readBoolean();
 
-    case DataType.BYTE:
-      return in.readByte();
+        case DataType.BYTE:
+            return in.readByte();
 
-    case DataType.SHORT:
-      return in.readShort();
+        case DataType.SHORT:
+            return in.readShort();
 
-    case DataType.NULL:
-      return null;
-      
-    case DataType.BINARY:
-      int len = in.readInt();
-      byte[] ba = new byte[len];
-      in.readFully(ba);
-      return ba;
-      
-    case DataType.MAP:
-      int size = in.readInt();
-      Map<Object,Object> m = new HashMap<Object, Object>(size);
-      for (int i = 0; i < size; i++) {
-          m.put(readDatum(in), readDatum(in));
-      }
-      return m;
+        case DataType.NULL:
+            return null;
 
-    case DataType.LIST:
-      int sz = in.readInt();
-      List<Object> list = new ArrayList<Object>(sz);
-      for(int i=0; i < sz; i++) {
-        list.add(readDatum(in));
-      }
-      return list;
+        case DataType.BINARY:
+            int len = in.readInt();
+            byte[] ba = new byte[len];
+            in.readFully(ba);
+            return ba;
 
-    default:
-      throw new IOException("Unexpected data type " + type +
-          " found in stream.");
+        case DataType.MAP:
+            int size = in.readInt();
+            Map<Object, Object> m = new HashMap<Object, Object>(size);
+            for (int i = 0; i < size; i++) {
+                m.put(readDatum(in), readDatum(in));
+            }
+            return m;
+
+        case DataType.LIST:
+            int sz = in.readInt();
+            List<Object> list = new ArrayList<Object>(sz);
+            for (int i = 0; i < sz; i++) {
+                list.add(readDatum(in));
+            }
+            return list;
+
+        default:
+            throw new IOException("Unexpected data type " + type +
+                " found in stream.");
+        }
     }
-  }
 
-  public static void writeDatum(DataOutput out, Object val) throws IOException {
-    // write the data type
-    byte type = DataType.findType(val);
-    switch (type) {
-    case DataType.LIST:
-      out.writeByte(DataType.LIST);
-      List<?> list = (List<?>)val;
-      int sz = list.size();
-      out.writeInt(sz);
-      for (int i = 0; i < sz; i++) {
-        writeDatum(out, list.get(i));
-      }
-      return;
+    public static void writeDatum(DataOutput out, Object val) throws IOException {
+        // write the data type
+        byte type = DataType.findType(val);
+        switch (type) {
+        case DataType.LIST:
+            out.writeByte(DataType.LIST);
+            List<?> list = (List<?>) val;
+            int sz = list.size();
+            out.writeInt(sz);
+            for (int i = 0; i < sz; i++) {
+                writeDatum(out, list.get(i));
+            }
+            return;
 
-    case DataType.MAP:
-      out.writeByte(DataType.MAP);
-      Map<?,?> m = (Map<?, ?>)val;
-      out.writeInt(m.size());
-      Iterator<?> i =
-        m.entrySet().iterator();
-      while (i.hasNext()) {
-        Entry<?,?> entry = (Entry<?, ?>) i.next();
-        writeDatum(out, entry.getKey());
-        writeDatum(out, entry.getValue());
-      }
-      return;
+        case DataType.MAP:
+            out.writeByte(DataType.MAP);
+            Map<?, ?> m = (Map<?, ?>) val;
+            out.writeInt(m.size());
+            Iterator<?> i =
+                m.entrySet().iterator();
+            while (i.hasNext()) {
+                Entry<?, ?> entry = (Entry<?, ?>) i.next();
+                writeDatum(out, entry.getKey());
+                writeDatum(out, entry.getValue());
+            }
+            return;
 
-    case DataType.INTEGER:
-      out.writeByte(DataType.INTEGER);
-      new VIntWritable((Integer)val).write(out);
-      return;
+        case DataType.INTEGER:
+            out.writeByte(DataType.INTEGER);
+            new VIntWritable((Integer) val).write(out);
+            return;
 
-    case DataType.LONG:
-      out.writeByte(DataType.LONG);
-      new VLongWritable((Long)val).write(out);
-      return;
+        case DataType.LONG:
+            out.writeByte(DataType.LONG);
+            new VLongWritable((Long) val).write(out);
+            return;
 
-    case DataType.FLOAT:
-      out.writeByte(DataType.FLOAT);
-      out.writeFloat((Float)val);
-      return;
+        case DataType.FLOAT:
+            out.writeByte(DataType.FLOAT);
+            out.writeFloat((Float) val);
+            return;
 
-    case DataType.DOUBLE:
-      out.writeByte(DataType.DOUBLE);
-      out.writeDouble((Double)val);
-      return;
+        case DataType.DOUBLE:
+            out.writeByte(DataType.DOUBLE);
+            out.writeDouble((Double) val);
+            return;
 
-    case DataType.BOOLEAN:
-      out.writeByte(DataType.BOOLEAN);
-      out.writeBoolean((Boolean)val);
-      return;
+        case DataType.BOOLEAN:
+            out.writeByte(DataType.BOOLEAN);
+            out.writeBoolean((Boolean) val);
+            return;
 
-    case DataType.BYTE:
-      out.writeByte(DataType.BYTE);
-      out.writeByte((Byte)val);
-      return;
+        case DataType.BYTE:
+            out.writeByte(DataType.BYTE);
+            out.writeByte((Byte) val);
+            return;
 
-    case DataType.SHORT:
-      out.writeByte(DataType.SHORT);
-      out.writeShort((Short)val);
-      return;
+        case DataType.SHORT:
+            out.writeByte(DataType.SHORT);
+            out.writeShort((Short) val);
+            return;
 
-    case DataType.STRING:
-      String s = (String)val;
-      byte[] utfBytes = s.getBytes(ReaderWriter.UTF8);
-      out.writeByte(DataType.STRING);
-      out.writeInt(utfBytes.length);
-      out.write(utfBytes);
-      return;
+        case DataType.STRING:
+            String s = (String) val;
+            byte[] utfBytes = s.getBytes(ReaderWriter.UTF8);
+            out.writeByte(DataType.STRING);
+            out.writeInt(utfBytes.length);
+            out.write(utfBytes);
+            return;
 
-    case DataType.BINARY:
-      byte[] ba = (byte[])val;
-      out.writeByte(DataType.BINARY);
-      out.writeInt(ba.length);
-      out.write(ba);
-      return;
-      
-    case DataType.NULL:
-      out.writeByte(DataType.NULL);
-      return;
+        case DataType.BINARY:
+            byte[] ba = (byte[]) val;
+            out.writeByte(DataType.BINARY);
+            out.writeInt(ba.length);
+            out.write(ba);
+            return;
 
-    default:
-      throw new IOException("Unexpected data type " + type +
-          " found in stream.");
+        case DataType.NULL:
+            out.writeByte(DataType.NULL);
+            return;
+
+        default:
+            throw new IOException("Unexpected data type " + type +
+                " found in stream.");
+        }
     }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/data/schema/HCatFieldSchema.java b/src/java/org/apache/hcatalog/data/schema/HCatFieldSchema.java
index 39d26a7..720d7b0 100644
--- a/src/java/org/apache/hcatalog/data/schema/HCatFieldSchema.java
+++ b/src/java/org/apache/hcatalog/data/schema/HCatFieldSchema.java
@@ -46,20 +46,22 @@
         STRUCT;
 
         public static Category fromType(Type type) {
-            if (Type.ARRAY == type){
+            if (Type.ARRAY == type) {
                 return ARRAY;
-            }else if(Type.STRUCT == type){
+            } else if (Type.STRUCT == type) {
                 return STRUCT;
-            }else if (Type.MAP == type){
+            } else if (Type.MAP == type) {
                 return MAP;
-            }else{
+            } else {
                 return PRIMITIVE;
             }
         }
-    };
+    }
 
-    public boolean isComplex(){
-      return (category == Category.PRIMITIVE) ? false : true;
+    ;
+
+    public boolean isComplex() {
+        return (category == Category.PRIMITIVE) ? false : true;
     }
 
     /**
@@ -84,7 +86,7 @@
     private String typeString = null;
 
     @SuppressWarnings("unused")
-    private HCatFieldSchema(){
+    private HCatFieldSchema() {
         // preventing empty ctor from being callable
     }
 
@@ -92,7 +94,7 @@
      * Returns type of the field
      * @return type of the field
      */
-    public Type getType(){
+    public Type getType() {
         return type;
     }
 
@@ -100,7 +102,7 @@
      * Returns category of the field
      * @return category of the field
      */
-    public Category getCategory(){
+    public Category getCategory() {
         return category;
     }
 
@@ -108,11 +110,11 @@
      * Returns name of the field
      * @return name of the field
      */
-    public String getName(){
+    public String getName() {
         return fieldName;
     }
 
-    public String getComment(){
+    public String getComment() {
         return comment;
     }
 
@@ -123,7 +125,7 @@
      * @throws HCatException if call made on non-primitive types
      */
     public HCatFieldSchema(String fieldName, Type type, String comment) throws HCatException {
-        assertTypeInCategory(type,Category.PRIMITIVE,fieldName);
+        assertTypeInCategory(type, Category.PRIMITIVE, fieldName);
         this.fieldName = fieldName;
         this.type = type;
         this.category = Category.PRIMITIVE;
@@ -137,21 +139,21 @@
      * @param subSchema - subschema of the struct, or element schema of the elements in the array
      * @throws HCatException if call made on Primitive or Map types
      */
-    public HCatFieldSchema(String fieldName, Type type, HCatSchema subSchema,String comment) throws HCatException{
-        assertTypeNotInCategory(type,Category.PRIMITIVE);
-        assertTypeNotInCategory(type,Category.MAP);
+    public HCatFieldSchema(String fieldName, Type type, HCatSchema subSchema, String comment) throws HCatException {
+        assertTypeNotInCategory(type, Category.PRIMITIVE);
+        assertTypeNotInCategory(type, Category.MAP);
         this.fieldName = fieldName;
         this.type = type;
         this.category = Category.fromType(type);
         this.subSchema = subSchema;
-        if(type == Type.ARRAY){
-         this.subSchema.get(0).setName(null);
+        if (type == Type.ARRAY) {
+            this.subSchema.get(0).setName(null);
         }
         this.comment = comment;
     }
 
     private void setName(String name) {
-      this.fieldName = name;
+        this.fieldName = name;
     }
 
     /**
@@ -162,9 +164,9 @@
      * @param mapValueSchema - subschema of the value of the Map
      * @throws HCatException if call made on non-Map types
      */
-    public HCatFieldSchema(String fieldName, Type type, Type mapKeyType, HCatSchema mapValueSchema, String comment) throws HCatException{
-        assertTypeInCategory(type,Category.MAP, fieldName);
-        assertTypeInCategory(mapKeyType,Category.PRIMITIVE, fieldName);
+    public HCatFieldSchema(String fieldName, Type type, Type mapKeyType, HCatSchema mapValueSchema, String comment) throws HCatException {
+        assertTypeInCategory(type, Category.MAP, fieldName);
+        assertTypeInCategory(mapKeyType, Category.PRIMITIVE, fieldName);
         this.fieldName = fieldName;
         this.type = Type.MAP;
         this.category = Category.MAP;
@@ -175,66 +177,66 @@
     }
 
     public HCatSchema getStructSubSchema() throws HCatException {
-        assertTypeInCategory(this.type,Category.STRUCT, this.fieldName);
+        assertTypeInCategory(this.type, Category.STRUCT, this.fieldName);
         return subSchema;
     }
 
     public HCatSchema getArrayElementSchema() throws HCatException {
-        assertTypeInCategory(this.type,Category.ARRAY, this.fieldName);
+        assertTypeInCategory(this.type, Category.ARRAY, this.fieldName);
         return subSchema;
     }
 
     public Type getMapKeyType() throws HCatException {
-        assertTypeInCategory(this.type,Category.MAP, this.fieldName);
+        assertTypeInCategory(this.type, Category.MAP, this.fieldName);
         return mapKeyType;
     }
 
     public HCatSchema getMapValueSchema() throws HCatException {
-        assertTypeInCategory(this.type,Category.MAP, this.fieldName);
+        assertTypeInCategory(this.type, Category.MAP, this.fieldName);
         return subSchema;
     }
 
     private static void assertTypeInCategory(Type type, Category category, String fieldName) throws HCatException {
         Category typeCategory = Category.fromType(type);
-        if (typeCategory != category){
-            throw new HCatException("Type category mismatch. Expected "+category+" but type "+type+" in category "+typeCategory+ " (field "+fieldName+")");
+        if (typeCategory != category) {
+            throw new HCatException("Type category mismatch. Expected " + category + " but type " + type + " in category " + typeCategory + " (field " + fieldName + ")");
         }
     }
 
     private static void assertTypeNotInCategory(Type type, Category category) throws HCatException {
         Category typeCategory = Category.fromType(type);
-        if (typeCategory == category){
-            throw new HCatException("Type category mismatch. Expected type "+type+" not in category "+category+" but was so.");
+        if (typeCategory == category) {
+            throw new HCatException("Type category mismatch. Expected type " + type + " not in category " + category + " but was so.");
         }
     }
 
     @Override
     public String toString() {
-      return new ToStringBuilder(this)
-          .append("fieldName", fieldName)
-          .append("comment", comment)
-          .append("type", getTypeString())
-          .append("category", category)
-          .toString();
+        return new ToStringBuilder(this)
+            .append("fieldName", fieldName)
+            .append("comment", comment)
+            .append("type", getTypeString())
+            .append("category", category)
+            .toString();
     }
 
-    public String getTypeString(){
-        if (typeString != null){
+    public String getTypeString() {
+        if (typeString != null) {
             return typeString;
         }
 
         StringBuilder sb = new StringBuilder();
-        if (Category.PRIMITIVE == category){
+        if (Category.PRIMITIVE == category) {
             sb.append(type);
-        }else if (Category.STRUCT == category){
+        } else if (Category.STRUCT == category) {
             sb.append("struct<");
             sb.append(subSchema.getSchemaAsTypeString());
             sb.append(">");
-        }else if (Category.ARRAY == category){
+        } else if (Category.ARRAY == category) {
             sb.append("array<");
             sb.append(subSchema.getSchemaAsTypeString());
             sb.append(">");
-        }else if (Category.MAP == category){
+        } else if (Category.MAP == category) {
             sb.append("map<");
             sb.append(mapKeyType);
             sb.append(",");
diff --git a/src/java/org/apache/hcatalog/data/schema/HCatSchema.java b/src/java/org/apache/hcatalog/data/schema/HCatSchema.java
index b93a1b6..a18cb75 100644
--- a/src/java/org/apache/hcatalog/data/schema/HCatSchema.java
+++ b/src/java/org/apache/hcatalog/data/schema/HCatSchema.java
@@ -30,12 +30,12 @@
  * HCatSchema. This class is NOT thread-safe.
  */
 
-public class HCatSchema implements Serializable{
+public class HCatSchema implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     private final List<HCatFieldSchema> fieldSchemas;
-    private final Map<String,Integer> fieldPositionMap;
+    private final Map<String, Integer> fieldPositionMap;
     private final List<String> fieldNames;
 
     /**
@@ -44,44 +44,44 @@
      * on fieldSchemas won't get reflected in HCatSchema.  Each fieldSchema's name
      * in the list must be unique, otherwise throws IllegalArgumentException.
      */
-    public HCatSchema(final List<HCatFieldSchema> fieldSchemas){
+    public HCatSchema(final List<HCatFieldSchema> fieldSchemas) {
         this.fieldSchemas = new ArrayList<HCatFieldSchema>(fieldSchemas);
         int idx = 0;
-        fieldPositionMap = new HashMap<String,Integer>();
+        fieldPositionMap = new HashMap<String, Integer>();
         fieldNames = new ArrayList<String>();
-        for (HCatFieldSchema field : fieldSchemas){
-            if(field == null)
+        for (HCatFieldSchema field : fieldSchemas) {
+            if (field == null)
                 throw new IllegalArgumentException("Field cannot be null");
 
             String fieldName = field.getName();
-            if(fieldPositionMap.containsKey(fieldName))
+            if (fieldPositionMap.containsKey(fieldName))
                 throw new IllegalArgumentException("Field named " + fieldName +
-                                                   " already exists");
+                    " already exists");
             fieldPositionMap.put(fieldName, idx);
             fieldNames.add(fieldName);
             idx++;
         }
     }
 
-    public void append(final HCatFieldSchema hfs) throws HCatException{
-      if(hfs == null)
-        throw new HCatException("Attempt to append null HCatFieldSchema in HCatSchema.");
+    public void append(final HCatFieldSchema hfs) throws HCatException {
+        if (hfs == null)
+            throw new HCatException("Attempt to append null HCatFieldSchema in HCatSchema.");
 
-      String fieldName = hfs.getName();
-      if(fieldPositionMap.containsKey(fieldName))
-        throw new HCatException("Attempt to append HCatFieldSchema with already " +
-            "existing name: " + fieldName + ".");
+        String fieldName = hfs.getName();
+        if (fieldPositionMap.containsKey(fieldName))
+            throw new HCatException("Attempt to append HCatFieldSchema with already " +
+                "existing name: " + fieldName + ".");
 
-      this.fieldSchemas.add(hfs);
-      this.fieldNames.add(fieldName);
-      this.fieldPositionMap.put(fieldName, this.size()-1);
+        this.fieldSchemas.add(hfs);
+        this.fieldNames.add(fieldName);
+        this.fieldPositionMap.put(fieldName, this.size() - 1);
     }
 
     /**
      *  Users are not allowed to modify the list directly, since HCatSchema
      *  maintains internal state. Use append/remove to modify the schema.
      */
-    public List<HCatFieldSchema> getFields(){
+    public List<HCatFieldSchema> getFields() {
         return Collections.unmodifiableList(this.fieldSchemas);
     }
 
@@ -91,14 +91,14 @@
      * present, returns null.
      */
     public Integer getPosition(String fieldName) {
-      return fieldPositionMap.get(fieldName);
+        return fieldPositionMap.get(fieldName);
     }
 
     public HCatFieldSchema get(String fieldName) throws HCatException {
         return get(getPosition(fieldName));
     }
 
-    public List<String> getFieldNames(){
+    public List<String> getFieldNames() {
         return this.fieldNames;
     }
 
@@ -106,32 +106,32 @@
         return fieldSchemas.get(position);
     }
 
-    public int size(){
-      return fieldSchemas.size();
+    public int size() {
+        return fieldSchemas.size();
     }
 
     public void remove(final HCatFieldSchema hcatFieldSchema) throws HCatException {
 
-      if(!fieldSchemas.contains(hcatFieldSchema)){
-        throw new HCatException("Attempt to delete a non-existent column from HCat Schema: "+ hcatFieldSchema);
-      }
+        if (!fieldSchemas.contains(hcatFieldSchema)) {
+            throw new HCatException("Attempt to delete a non-existent column from HCat Schema: " + hcatFieldSchema);
+        }
 
-      fieldSchemas.remove(hcatFieldSchema);
-      fieldPositionMap.remove(hcatFieldSchema);
-      fieldNames.remove(hcatFieldSchema.getName());
+        fieldSchemas.remove(hcatFieldSchema);
+        fieldPositionMap.remove(hcatFieldSchema);
+        fieldNames.remove(hcatFieldSchema.getName());
     }
 
     @Override
     public String toString() {
         boolean first = true;
         StringBuilder sb = new StringBuilder();
-        for (HCatFieldSchema hfs : fieldSchemas){
-            if (!first){
+        for (HCatFieldSchema hfs : fieldSchemas) {
+            if (!first) {
                 sb.append(",");
-            }else{
+            } else {
                 first = false;
             }
-            if (hfs.getName() != null){
+            if (hfs.getName() != null) {
                 sb.append(hfs.getName());
                 sb.append(":");
             }
@@ -140,16 +140,16 @@
         return sb.toString();
     }
 
-    public String getSchemaAsTypeString(){
+    public String getSchemaAsTypeString() {
         boolean first = true;
         StringBuilder sb = new StringBuilder();
-        for (HCatFieldSchema hfs : fieldSchemas){
-            if (!first){
+        for (HCatFieldSchema hfs : fieldSchemas) {
+            if (!first) {
                 sb.append(",");
-            }else{
+            } else {
                 first = false;
             }
-            if (hfs.getName() != null){
+            if (hfs.getName() != null) {
                 sb.append(hfs.getName());
                 sb.append(":");
             }
@@ -170,7 +170,7 @@
             return false;
         }
         HCatSchema other = (HCatSchema) obj;
-       if (!this.getFields().equals(other.getFields())) {
+        if (!this.getFields().equals(other.getFields())) {
             return false;
         }
         return true;
diff --git a/src/java/org/apache/hcatalog/data/schema/HCatSchemaUtils.java b/src/java/org/apache/hcatalog/data/schema/HCatSchemaUtils.java
index ca7afa0..38a5fa9 100644
--- a/src/java/org/apache/hcatalog/data/schema/HCatSchemaUtils.java
+++ b/src/java/org/apache/hcatalog/data/schema/HCatSchemaUtils.java
@@ -38,15 +38,15 @@
 
 public class HCatSchemaUtils {
 
-    public static CollectionBuilder getStructSchemaBuilder(){
+    public static CollectionBuilder getStructSchemaBuilder() {
         return new CollectionBuilder();
     }
 
-    public static CollectionBuilder getListSchemaBuilder(){
+    public static CollectionBuilder getListSchemaBuilder() {
         return new CollectionBuilder();
     }
 
-    public static MapBuilder getMapSchemaBuilder(){
+    public static MapBuilder getMapSchemaBuilder() {
         return new MapBuilder();
     }
 
@@ -58,21 +58,21 @@
     public static class CollectionBuilder extends HCatSchemaBuilder { // for STRUCTS(multiple-add-calls) and LISTS(single-add-call)
         List<HCatFieldSchema> fieldSchemas = null;
 
-        CollectionBuilder(){
+        CollectionBuilder() {
             fieldSchemas = new ArrayList<HCatFieldSchema>();
         }
 
-        public CollectionBuilder addField(FieldSchema fieldSchema) throws HCatException{
+        public CollectionBuilder addField(FieldSchema fieldSchema) throws HCatException {
             return this.addField(getHCatFieldSchema(fieldSchema));
         }
 
-        public CollectionBuilder addField(HCatFieldSchema fieldColumnSchema){
+        public CollectionBuilder addField(HCatFieldSchema fieldColumnSchema) {
             fieldSchemas.add(fieldColumnSchema);
             return this;
         }
 
         @Override
-        public HCatSchema build() throws HCatException{
+        public HCatSchema build() throws HCatException {
             return new HCatSchema(fieldSchemas);
         }
 
@@ -86,7 +86,7 @@
         @Override
         public HCatSchema build() throws HCatException {
             List<HCatFieldSchema> fslist = new ArrayList<HCatFieldSchema>();
-            fslist.add(new HCatFieldSchema(null,Type.MAP,keyType,valueSchema,null));
+            fslist.add(new HCatFieldSchema(null, Type.MAP, keyType, valueSchema, null));
             return new HCatSchema(fslist);
         }
 
@@ -118,26 +118,26 @@
     private static HCatFieldSchema getHCatFieldSchema(String fieldName, TypeInfo fieldTypeInfo) throws HCatException {
         Category typeCategory = fieldTypeInfo.getCategory();
         HCatFieldSchema hCatFieldSchema;
-        if (Category.PRIMITIVE == typeCategory){
-            hCatFieldSchema = new HCatFieldSchema(fieldName,getPrimitiveHType(fieldTypeInfo),null);
+        if (Category.PRIMITIVE == typeCategory) {
+            hCatFieldSchema = new HCatFieldSchema(fieldName, getPrimitiveHType(fieldTypeInfo), null);
         } else if (Category.STRUCT == typeCategory) {
-            HCatSchema subSchema = constructHCatSchema((StructTypeInfo)fieldTypeInfo);
-            hCatFieldSchema = new HCatFieldSchema(fieldName,HCatFieldSchema.Type.STRUCT,subSchema,null);
+            HCatSchema subSchema = constructHCatSchema((StructTypeInfo) fieldTypeInfo);
+            hCatFieldSchema = new HCatFieldSchema(fieldName, HCatFieldSchema.Type.STRUCT, subSchema, null);
         } else if (Category.LIST == typeCategory) {
-            HCatSchema subSchema = getHCatSchema(((ListTypeInfo)fieldTypeInfo).getListElementTypeInfo());
-            hCatFieldSchema = new HCatFieldSchema(fieldName,HCatFieldSchema.Type.ARRAY,subSchema,null);
+            HCatSchema subSchema = getHCatSchema(((ListTypeInfo) fieldTypeInfo).getListElementTypeInfo());
+            hCatFieldSchema = new HCatFieldSchema(fieldName, HCatFieldSchema.Type.ARRAY, subSchema, null);
         } else if (Category.MAP == typeCategory) {
-            HCatFieldSchema.Type mapKeyType =  getPrimitiveHType(((MapTypeInfo)fieldTypeInfo).getMapKeyTypeInfo());
-            HCatSchema subSchema = getHCatSchema(((MapTypeInfo)fieldTypeInfo).getMapValueTypeInfo());
-            hCatFieldSchema = new HCatFieldSchema(fieldName,HCatFieldSchema.Type.MAP,mapKeyType,subSchema,null);
-        } else{
-            throw new TypeNotPresentException(fieldTypeInfo.getTypeName(),null);
+            HCatFieldSchema.Type mapKeyType = getPrimitiveHType(((MapTypeInfo) fieldTypeInfo).getMapKeyTypeInfo());
+            HCatSchema subSchema = getHCatSchema(((MapTypeInfo) fieldTypeInfo).getMapValueTypeInfo());
+            hCatFieldSchema = new HCatFieldSchema(fieldName, HCatFieldSchema.Type.MAP, mapKeyType, subSchema, null);
+        } else {
+            throw new TypeNotPresentException(fieldTypeInfo.getTypeName(), null);
         }
         return hCatFieldSchema;
     }
 
     private static Type getPrimitiveHType(TypeInfo basePrimitiveTypeInfo) {
-        switch(((PrimitiveTypeInfo)basePrimitiveTypeInfo).getPrimitiveCategory()) {
+        switch (((PrimitiveTypeInfo) basePrimitiveTypeInfo).getPrimitiveCategory()) {
         case BOOLEAN:
             return HCatContext.getInstance().getConf().getBoolean(
                 HCatConstants.HCAT_DATA_CONVERT_BOOLEAN_TO_INTEGER,
@@ -165,17 +165,17 @@
         case BINARY:
             return Type.BINARY;
         default:
-            throw new TypeNotPresentException(((PrimitiveTypeInfo)basePrimitiveTypeInfo).getTypeName(), null);
+            throw new TypeNotPresentException(((PrimitiveTypeInfo) basePrimitiveTypeInfo).getTypeName(), null);
         }
     }
 
-    public static HCatSchema getHCatSchema(Schema schema) throws HCatException{
+    public static HCatSchema getHCatSchema(Schema schema) throws HCatException {
         return getHCatSchema(schema.getFieldSchemas());
     }
 
-    public static HCatSchema getHCatSchema(List<? extends FieldSchema> fslist) throws HCatException{
+    public static HCatSchema getHCatSchema(List<? extends FieldSchema> fslist) throws HCatException {
         CollectionBuilder builder = getStructSchemaBuilder();
-        for (FieldSchema fieldSchema : fslist){
+        for (FieldSchema fieldSchema : fslist) {
             builder.addField(fieldSchema);
         }
         return builder.build();
@@ -183,8 +183,8 @@
 
     private static HCatSchema constructHCatSchema(StructTypeInfo stypeInfo) throws HCatException {
         CollectionBuilder builder = getStructSchemaBuilder();
-        for (String fieldName : ((StructTypeInfo)stypeInfo).getAllStructFieldNames()){
-            builder.addField(getHCatFieldSchema(fieldName,((StructTypeInfo)stypeInfo).getStructFieldTypeInfo(fieldName)));
+        for (String fieldName : ((StructTypeInfo) stypeInfo).getAllStructFieldNames()) {
+            builder.addField(getHCatFieldSchema(fieldName, ((StructTypeInfo) stypeInfo).getStructFieldTypeInfo(fieldName)));
         }
         return builder.build();
     }
@@ -192,22 +192,22 @@
     public static HCatSchema getHCatSchema(TypeInfo typeInfo) throws HCatException {
         Category typeCategory = typeInfo.getCategory();
         HCatSchema hCatSchema;
-        if (Category.PRIMITIVE == typeCategory){
-            hCatSchema = getStructSchemaBuilder().addField(new HCatFieldSchema(null,getPrimitiveHType(typeInfo),null)).build();
+        if (Category.PRIMITIVE == typeCategory) {
+            hCatSchema = getStructSchemaBuilder().addField(new HCatFieldSchema(null, getPrimitiveHType(typeInfo), null)).build();
         } else if (Category.STRUCT == typeCategory) {
             HCatSchema subSchema = constructHCatSchema((StructTypeInfo) typeInfo);
-            hCatSchema = getStructSchemaBuilder().addField(new HCatFieldSchema(null,Type.STRUCT,subSchema,null)).build();
+            hCatSchema = getStructSchemaBuilder().addField(new HCatFieldSchema(null, Type.STRUCT, subSchema, null)).build();
         } else if (Category.LIST == typeCategory) {
             CollectionBuilder builder = getListSchemaBuilder();
-            builder.addField(getHCatFieldSchema(null,((ListTypeInfo)typeInfo).getListElementTypeInfo()));
-            hCatSchema = new HCatSchema(Arrays.asList(new HCatFieldSchema("",Type.ARRAY, builder.build(), "")));
+            builder.addField(getHCatFieldSchema(null, ((ListTypeInfo) typeInfo).getListElementTypeInfo()));
+            hCatSchema = new HCatSchema(Arrays.asList(new HCatFieldSchema("", Type.ARRAY, builder.build(), "")));
         } else if (Category.MAP == typeCategory) {
-            HCatFieldSchema.Type mapKeyType =  getPrimitiveHType(((MapTypeInfo)typeInfo).getMapKeyTypeInfo());
-            HCatSchema subSchema = getHCatSchema(((MapTypeInfo)typeInfo).getMapValueTypeInfo());
+            HCatFieldSchema.Type mapKeyType = getPrimitiveHType(((MapTypeInfo) typeInfo).getMapKeyTypeInfo());
+            HCatSchema subSchema = getHCatSchema(((MapTypeInfo) typeInfo).getMapValueTypeInfo());
             MapBuilder builder = getMapSchemaBuilder();
             hCatSchema = builder.withKeyType(mapKeyType).withValueSchema(subSchema).build();
-        } else{
-            throw new TypeNotPresentException(typeInfo.getTypeName(),null);
+        } else {
+            throw new TypeNotPresentException(typeInfo.getTypeName(), null);
         }
         return hCatSchema;
     }
@@ -217,20 +217,20 @@
     }
 
     public static HCatSchema getHCatSchema(String schemaString) throws HCatException {
-        if ((schemaString == null) || (schemaString.trim().isEmpty())){
+        if ((schemaString == null) || (schemaString.trim().isEmpty())) {
             return new HCatSchema(new ArrayList<HCatFieldSchema>()); // empty HSchema construct
         }
-        HCatSchema outerSchema = getHCatSchemaFromTypeString("struct<"+schemaString+">");
+        HCatSchema outerSchema = getHCatSchemaFromTypeString("struct<" + schemaString + ">");
         return outerSchema.get(0).getStructSubSchema();
     }
 
-    public static FieldSchema getFieldSchema(HCatFieldSchema hcatFieldSchema){
-        return new FieldSchema(hcatFieldSchema.getName(),hcatFieldSchema.getTypeString(),hcatFieldSchema.getComment());
+    public static FieldSchema getFieldSchema(HCatFieldSchema hcatFieldSchema) {
+        return new FieldSchema(hcatFieldSchema.getName(), hcatFieldSchema.getTypeString(), hcatFieldSchema.getComment());
     }
 
-    public static List<FieldSchema> getFieldSchemas(List<HCatFieldSchema> hcatFieldSchemas){
+    public static List<FieldSchema> getFieldSchemas(List<HCatFieldSchema> hcatFieldSchemas) {
         List<FieldSchema> lfs = new ArrayList<FieldSchema>();
-        for (HCatFieldSchema hfs : hcatFieldSchemas){
+        for (HCatFieldSchema hfs : hcatFieldSchemas) {
             lfs.add(getFieldSchema(hfs));
         }
         return lfs;
diff --git a/src/java/org/apache/hcatalog/data/transfer/DataTransferFactory.java b/src/java/org/apache/hcatalog/data/transfer/DataTransferFactory.java
index 0f1a39c..f10ec8c 100644
--- a/src/java/org/apache/hcatalog/data/transfer/DataTransferFactory.java
+++ b/src/java/org/apache/hcatalog/data/transfer/DataTransferFactory.java
@@ -34,102 +34,102 @@
 
 public class DataTransferFactory {
 
-  /**
-   * This should be called once from master node to obtain an instance of
-   * {@link HCatReader}.
-   * 
-   * @param re
-   *          ReadEntity built using {@link ReadEntity.Builder}
-   * @param config
-   *          any configuration which master node wants to pass to HCatalog
-   * @return {@link HCatReader}
-   */
-  public static HCatReader getHCatReader(final ReadEntity re,
-      final Map<String, String> config) {
-    // In future, this may examine ReadEntity and/or config to return
-    // appropriate HCatReader
-    return new HCatInputFormatReader(re, config);
-  }
+    /**
+     * This should be called once from master node to obtain an instance of
+     * {@link HCatReader}.
+     *
+     * @param re
+     *          ReadEntity built using {@link ReadEntity.Builder}
+     * @param config
+     *          any configuration which master node wants to pass to HCatalog
+     * @return {@link HCatReader}
+     */
+    public static HCatReader getHCatReader(final ReadEntity re,
+                                           final Map<String, String> config) {
+        // In future, this may examine ReadEntity and/or config to return
+        // appropriate HCatReader
+        return new HCatInputFormatReader(re, config);
+    }
 
-  /**
-   * This should only be called once from every slave node to obtain an instance
-   * of {@link HCatReader}.
-   * 
-   * @param split
-   *          input split obtained at master node
-   * @param config
-   *          configuration obtained at master node
-   * @return {@link HCatReader}
-   */
-  public static HCatReader getHCatReader(final InputSplit split,
-      final Configuration config) {
-    // In future, this may examine config to return appropriate HCatReader
-    return getHCatReader(split, config, DefaultStateProvider.get());
-  }
+    /**
+     * This should only be called once from every slave node to obtain an instance
+     * of {@link HCatReader}.
+     *
+     * @param split
+     *          input split obtained at master node
+     * @param config
+     *          configuration obtained at master node
+     * @return {@link HCatReader}
+     */
+    public static HCatReader getHCatReader(final InputSplit split,
+                                           final Configuration config) {
+        // In future, this may examine config to return appropriate HCatReader
+        return getHCatReader(split, config, DefaultStateProvider.get());
+    }
 
-  /**
-   * This should only be called once from every slave node to obtain an instance
-   * of {@link HCatReader}. This should be called if an external system has some
-   * state to provide to HCatalog.
-   * 
-   * @param split
-   *          input split obtained at master node
-   * @param config
-   *          configuration obtained at master node
-   * @param sp
-   *          {@link StateProvider}
-   * @return {@link HCatReader}
-   */
-  public static HCatReader getHCatReader(final InputSplit split,
-      final Configuration config, StateProvider sp) {
-    // In future, this may examine config to return appropriate HCatReader
-    return new HCatInputFormatReader(split, config, sp);
-  }
+    /**
+     * This should only be called once from every slave node to obtain an instance
+     * of {@link HCatReader}. This should be called if an external system has some
+     * state to provide to HCatalog.
+     *
+     * @param split
+     *          input split obtained at master node
+     * @param config
+     *          configuration obtained at master node
+     * @param sp
+     *          {@link StateProvider}
+     * @return {@link HCatReader}
+     */
+    public static HCatReader getHCatReader(final InputSplit split,
+                                           final Configuration config, StateProvider sp) {
+        // In future, this may examine config to return appropriate HCatReader
+        return new HCatInputFormatReader(split, config, sp);
+    }
 
-  /**
-   * This should be called at master node to obtain an instance of
-   * {@link HCatWriter}.
-   * 
-   * @param we
-   *          WriteEntity built using {@link WriteEntity.Builder}
-   * @param config
-   *          any configuration which master wants to pass to HCatalog
-   * @return {@link HCatWriter}
-   */
-  public static HCatWriter getHCatWriter(final WriteEntity we,
-      final Map<String, String> config) {
-    // In future, this may examine WriteEntity and/or config to return
-    // appropriate HCatWriter
-    return new HCatOutputFormatWriter(we, config);
-  }
+    /**
+     * This should be called at master node to obtain an instance of
+     * {@link HCatWriter}.
+     *
+     * @param we
+     *          WriteEntity built using {@link WriteEntity.Builder}
+     * @param config
+     *          any configuration which master wants to pass to HCatalog
+     * @return {@link HCatWriter}
+     */
+    public static HCatWriter getHCatWriter(final WriteEntity we,
+                                           final Map<String, String> config) {
+        // In future, this may examine WriteEntity and/or config to return
+        // appropriate HCatWriter
+        return new HCatOutputFormatWriter(we, config);
+    }
 
-  /**
-   * This should be called at slave nodes to obtain an instance of
-   * {@link HCatWriter}.
-   * 
-   * @param cntxt
-   *          {@link WriterContext} obtained at master node
-   * @return {@link HCatWriter}
-   */
-  public static HCatWriter getHCatWriter(final WriterContext cntxt) {
-    // In future, this may examine context to return appropriate HCatWriter
-    return getHCatWriter(cntxt, DefaultStateProvider.get());
-  }
+    /**
+     * This should be called at slave nodes to obtain an instance of
+     * {@link HCatWriter}.
+     *
+     * @param cntxt
+     *          {@link WriterContext} obtained at master node
+     * @return {@link HCatWriter}
+     */
+    public static HCatWriter getHCatWriter(final WriterContext cntxt) {
+        // In future, this may examine context to return appropriate HCatWriter
+        return getHCatWriter(cntxt, DefaultStateProvider.get());
+    }
 
-  /**
-   * This should be called at slave nodes to obtain an instance of
-   * {@link HCatWriter}. If an external system has some mechanism for providing
-   * state to HCatalog, this constructor can be used.
-   * 
-   * @param cntxt
-   *          {@link WriterContext} obtained at master node
-   * @param sp
-   *          {@link StateProvider}
-   * @return {@link HCatWriter}
-   */
-  public static HCatWriter getHCatWriter(final WriterContext cntxt,
-      final StateProvider sp) {
-    // In future, this may examine context to return appropriate HCatWriter
-    return new HCatOutputFormatWriter(cntxt.getConf(), sp);
-  }
+    /**
+     * This should be called at slave nodes to obtain an instance of
+     * {@link HCatWriter}. If an external system has some mechanism for providing
+     * state to HCatalog, this constructor can be used.
+     *
+     * @param cntxt
+     *          {@link WriterContext} obtained at master node
+     * @param sp
+     *          {@link StateProvider}
+     * @return {@link HCatWriter}
+     */
+    public static HCatWriter getHCatWriter(final WriterContext cntxt,
+                                           final StateProvider sp) {
+        // In future, this may examine context to return appropriate HCatWriter
+        return new HCatOutputFormatWriter(cntxt.getConf(), sp);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/EntityBase.java b/src/java/org/apache/hcatalog/data/transfer/EntityBase.java
index bbca1f8..668057f 100644
--- a/src/java/org/apache/hcatalog/data/transfer/EntityBase.java
+++ b/src/java/org/apache/hcatalog/data/transfer/EntityBase.java
@@ -29,31 +29,31 @@
 
 abstract class EntityBase {
 
-  String region;
-  String tableName;
-  String dbName;
-  Map<String, String> partitionKVs;
+    String region;
+    String tableName;
+    String dbName;
+    Map<String, String> partitionKVs;
 
-  /**
-   * Common methods for {@link ReadEntity} and {@link WriteEntity}
-   */
+    /**
+     * Common methods for {@link ReadEntity} and {@link WriteEntity}
+     */
 
-  abstract static class Entity extends EntityBase {
+    abstract static class Entity extends EntityBase {
 
-    public String getRegion() {
-      return region;
+        public String getRegion() {
+            return region;
+        }
+
+        public String getTableName() {
+            return tableName;
+        }
+
+        public String getDbName() {
+            return dbName;
+        }
+
+        public Map<String, String> getPartitionKVs() {
+            return partitionKVs;
+        }
     }
-
-    public String getTableName() {
-      return tableName;
-    }
-
-    public String getDbName() {
-      return dbName;
-    }
-
-    public Map<String, String> getPartitionKVs() {
-      return partitionKVs;
-    }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/HCatReader.java b/src/java/org/apache/hcatalog/data/transfer/HCatReader.java
index d771dcb..84465f9 100644
--- a/src/java/org/apache/hcatalog/data/transfer/HCatReader.java
+++ b/src/java/org/apache/hcatalog/data/transfer/HCatReader.java
@@ -34,68 +34,68 @@
 
 public abstract class HCatReader {
 
-  /**
-   * This should be called at master node to obtain {@link ReaderContext} which
-   * then should be serialized and sent to slave nodes.
-   * 
-   * @return {@link ReaderContext}
-   * @throws HCatException
-   */
-  public abstract ReaderContext prepareRead() throws HCatException;
+    /**
+     * This should be called at master node to obtain {@link ReaderContext} which
+     * then should be serialized and sent to slave nodes.
+     *
+     * @return {@link ReaderContext}
+     * @throws HCatException
+     */
+    public abstract ReaderContext prepareRead() throws HCatException;
 
-  /**
-   * This should be called at slave nodes to read {@link HCatRecord}s
-   * 
-   * @return {@link Iterator} of {@link HCatRecord}
-   * @throws HCatException
-   */
-  public abstract Iterator<HCatRecord> read() throws HCatException;
+    /**
+     * This should be called at slave nodes to read {@link HCatRecord}s
+     *
+     * @return {@link Iterator} of {@link HCatRecord}
+     * @throws HCatException
+     */
+    public abstract Iterator<HCatRecord> read() throws HCatException;
 
-  /**
-   * This constructor will be invoked by {@link DataTransferFactory} at master
-   * node. Don't use this constructor. Instead, use {@link DataTransferFactory}
-   * 
-   * @param re
-   * @param config
-   */
-  protected HCatReader(final ReadEntity re, final Map<String, String> config) {
-    this(config);
-    this.re = re;
-  }
-
-  /**
-   * This constructor will be invoked by {@link DataTransferFactory} at slave
-   * nodes. Don't use this constructor. Instead, use {@link DataTransferFactory}
-   * 
-   * @param config
-   * @param sp
-   */
-
-  protected HCatReader(final Configuration config, StateProvider sp) {
-    this.conf = config;
-    this.sp = sp;
-  }
-
-  protected ReadEntity re; // This will be null at slaves.
-  protected Configuration conf;
-  protected ReaderContext info;
-  protected StateProvider sp; // This will be null at master.
-
-  private HCatReader(final Map<String, String> config) {
-    Configuration conf = new Configuration();
-    if (null != config) {
-      for (Entry<String, String> kv : config.entrySet()) {
-        conf.set(kv.getKey(), kv.getValue());
-      }
+    /**
+     * This constructor will be invoked by {@link DataTransferFactory} at master
+     * node. Don't use this constructor. Instead, use {@link DataTransferFactory}
+     *
+     * @param re
+     * @param config
+     */
+    protected HCatReader(final ReadEntity re, final Map<String, String> config) {
+        this(config);
+        this.re = re;
     }
-    this.conf = conf;
-  }
 
-  public Configuration getConf() {
-    if (null == conf) {
-      throw new IllegalStateException(
-          "HCatReader is not constructed correctly.");
+    /**
+     * This constructor will be invoked by {@link DataTransferFactory} at slave
+     * nodes. Don't use this constructor. Instead, use {@link DataTransferFactory}
+     *
+     * @param config
+     * @param sp
+     */
+
+    protected HCatReader(final Configuration config, StateProvider sp) {
+        this.conf = config;
+        this.sp = sp;
     }
-    return conf;
-  }
+
+    protected ReadEntity re; // This will be null at slaves.
+    protected Configuration conf;
+    protected ReaderContext info;
+    protected StateProvider sp; // This will be null at master.
+
+    private HCatReader(final Map<String, String> config) {
+        Configuration conf = new Configuration();
+        if (null != config) {
+            for (Entry<String, String> kv : config.entrySet()) {
+                conf.set(kv.getKey(), kv.getValue());
+            }
+        }
+        this.conf = conf;
+    }
+
+    public Configuration getConf() {
+        if (null == conf) {
+            throw new IllegalStateException(
+                "HCatReader is not constructed correctly.");
+        }
+        return conf;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/HCatWriter.java b/src/java/org/apache/hcatalog/data/transfer/HCatWriter.java
index 2e924bf..07c33c3 100644
--- a/src/java/org/apache/hcatalog/data/transfer/HCatWriter.java
+++ b/src/java/org/apache/hcatalog/data/transfer/HCatWriter.java
@@ -35,79 +35,79 @@
 
 public abstract class HCatWriter {
 
-  protected Configuration conf;
-  protected WriteEntity we; // This will be null at slave nodes.
-  protected WriterContext info;
-  protected StateProvider sp;
+    protected Configuration conf;
+    protected WriteEntity we; // This will be null at slave nodes.
+    protected WriterContext info;
+    protected StateProvider sp;
 
-  /**
-   * External system should invoke this method exactly once from a master node.
-   * 
-   * @return {@link WriterContext} This should be serialized and sent to slave
-   *         nodes to construct HCatWriter there.
-   * @throws HCatException
-   */
-  public abstract WriterContext prepareWrite() throws HCatException;
+    /**
+     * External system should invoke this method exactly once from a master node.
+     *
+     * @return {@link WriterContext} This should be serialized and sent to slave
+     *         nodes to construct HCatWriter there.
+     * @throws HCatException
+     */
+    public abstract WriterContext prepareWrite() throws HCatException;
 
-  /**
-   * This method should be used at slave needs to perform writes.
-   * 
-   * @param recordItr
-   *          {@link Iterator} records to be written into HCatalog.
-   * @throws {@link HCatException}
-   */
-  public abstract void write(final Iterator<HCatRecord> recordItr)
-      throws HCatException;
+    /**
+     * This method should be used at slave needs to perform writes.
+     *
+     * @param recordItr
+     *          {@link Iterator} records to be written into HCatalog.
+     * @throws {@link HCatException}
+     */
+    public abstract void write(final Iterator<HCatRecord> recordItr)
+        throws HCatException;
 
-  /**
-   * This method should be called at master node. Primary purpose of this is to
-   * do metadata commit.
-   * 
-   * @throws {@link HCatException}
-   */
-  public abstract void commit(final WriterContext context) throws HCatException;
+    /**
+     * This method should be called at master node. Primary purpose of this is to
+     * do metadata commit.
+     *
+     * @throws {@link HCatException}
+     */
+    public abstract void commit(final WriterContext context) throws HCatException;
 
-  /**
-   * This method should be called at master node. Primary purpose of this is to
-   * do cleanups in case of failures.
-   * 
-   * @throws {@link HCatException} *
-   */
-  public abstract void abort(final WriterContext context) throws HCatException;
+    /**
+     * This method should be called at master node. Primary purpose of this is to
+     * do cleanups in case of failures.
+     *
+     * @throws {@link HCatException} *
+     */
+    public abstract void abort(final WriterContext context) throws HCatException;
 
-  /**
-   * This constructor will be used at master node
-   * 
-   * @param we
-   *          WriteEntity defines where in storage records should be written to.
-   * @param config
-   *          Any configuration which external system wants to communicate to
-   *          HCatalog for performing writes.
-   */
-  protected HCatWriter(final WriteEntity we, final Map<String, String> config) {
-    this(config);
-    this.we = we;
-  }
-
-  /**
-   * This constructor will be used at slave nodes.
-   * 
-   * @param config
-   */
-  protected HCatWriter(final Configuration config, final StateProvider sp) {
-    this.conf = config;
-    this.sp = sp;
-  }
-
-  private HCatWriter(final Map<String, String> config) {
-    Configuration conf = new Configuration();
-    if (config != null) {
-      // user is providing config, so it could be null.
-      for (Entry<String, String> kv : config.entrySet()) {
-        conf.set(kv.getKey(), kv.getValue());
-      }
+    /**
+     * This constructor will be used at master node
+     *
+     * @param we
+     *          WriteEntity defines where in storage records should be written to.
+     * @param config
+     *          Any configuration which external system wants to communicate to
+     *          HCatalog for performing writes.
+     */
+    protected HCatWriter(final WriteEntity we, final Map<String, String> config) {
+        this(config);
+        this.we = we;
     }
 
-    this.conf = conf;
-  }
+    /**
+     * This constructor will be used at slave nodes.
+     *
+     * @param config
+     */
+    protected HCatWriter(final Configuration config, final StateProvider sp) {
+        this.conf = config;
+        this.sp = sp;
+    }
+
+    private HCatWriter(final Map<String, String> config) {
+        Configuration conf = new Configuration();
+        if (config != null) {
+            // user is providing config, so it could be null.
+            for (Entry<String, String> kv : config.entrySet()) {
+                conf.set(kv.getKey(), kv.getValue());
+            }
+        }
+
+        this.conf = conf;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/ReadEntity.java b/src/java/org/apache/hcatalog/data/transfer/ReadEntity.java
index 0cf5225..6787b10 100644
--- a/src/java/org/apache/hcatalog/data/transfer/ReadEntity.java
+++ b/src/java/org/apache/hcatalog/data/transfer/ReadEntity.java
@@ -22,67 +22,67 @@
 
 public class ReadEntity extends EntityBase.Entity {
 
-  private String filterString;
-
-  /**
-   * Don't instantiate {@link ReadEntity} directly. Use,
-   * {@link ReadEntity.Builder} instead.
-   * 
-   */
-  private ReadEntity() {
-    // Not allowed
-  }
-
-  private ReadEntity(Builder builder) {
-
-    this.region = builder.region;
-    this.dbName = builder.dbName;
-    this.tableName = builder.tableName;
-    this.partitionKVs = builder.partitionKVs;
-    this.filterString = builder.filterString;
-  }
-
-  public String getFilterString() {
-    return this.filterString;
-  }
-
-  /**
-   * This class should be used to build {@link ReadEntity}. It follows builder
-   * pattern, letting you build your {@link ReadEntity} with whatever level of
-   * detail you want.
-   * 
-   */
-  public static class Builder extends EntityBase {
-
     private String filterString;
 
-    public Builder withRegion(final String region) {
-      this.region = region;
-      return this;
+    /**
+     * Don't instantiate {@link ReadEntity} directly. Use,
+     * {@link ReadEntity.Builder} instead.
+     *
+     */
+    private ReadEntity() {
+        // Not allowed
     }
 
-    public Builder withDatabase(final String dbName) {
-      this.dbName = dbName;
-      return this;
+    private ReadEntity(Builder builder) {
+
+        this.region = builder.region;
+        this.dbName = builder.dbName;
+        this.tableName = builder.tableName;
+        this.partitionKVs = builder.partitionKVs;
+        this.filterString = builder.filterString;
     }
 
-    public Builder withTable(final String tblName) {
-      this.tableName = tblName;
-      return this;
+    public String getFilterString() {
+        return this.filterString;
     }
 
-    public Builder withPartition(final Map<String, String> partKVs) {
-      this.partitionKVs = partKVs;
-      return this;
-    }
+    /**
+     * This class should be used to build {@link ReadEntity}. It follows builder
+     * pattern, letting you build your {@link ReadEntity} with whatever level of
+     * detail you want.
+     *
+     */
+    public static class Builder extends EntityBase {
 
-    public Builder withFilter(String filterString) {
-      this.filterString = filterString;
-      return this;
-    }
+        private String filterString;
 
-    public ReadEntity build() {
-      return new ReadEntity(this);
+        public Builder withRegion(final String region) {
+            this.region = region;
+            return this;
+        }
+
+        public Builder withDatabase(final String dbName) {
+            this.dbName = dbName;
+            return this;
+        }
+
+        public Builder withTable(final String tblName) {
+            this.tableName = tblName;
+            return this;
+        }
+
+        public Builder withPartition(final Map<String, String> partKVs) {
+            this.partitionKVs = partKVs;
+            return this;
+        }
+
+        public Builder withFilter(String filterString) {
+            this.filterString = filterString;
+            return this;
+        }
+
+        public ReadEntity build() {
+            return new ReadEntity(this);
+        }
     }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/ReaderContext.java b/src/java/org/apache/hcatalog/data/transfer/ReaderContext.java
index da6d1a3..68d653a 100644
--- a/src/java/org/apache/hcatalog/data/transfer/ReaderContext.java
+++ b/src/java/org/apache/hcatalog/data/transfer/ReaderContext.java
@@ -38,51 +38,51 @@
  */
 public class ReaderContext implements Externalizable, Configurable {
 
-  private static final long serialVersionUID = -2656468331739574367L;
-  private List<InputSplit> splits;
-  private Configuration conf;
+    private static final long serialVersionUID = -2656468331739574367L;
+    private List<InputSplit> splits;
+    private Configuration conf;
 
-  public ReaderContext() {
-    this.splits = new ArrayList<InputSplit>();
-    this.conf = new Configuration();
-  }
-
-  public void setInputSplits(final List<InputSplit> splits) {
-    this.splits = splits;
-  }
-
-  public List<InputSplit> getSplits() {
-    return splits;
-  }
-
-  @Override
-  public Configuration getConf() {
-    return conf;
-  }
-
-  @Override
-  public void setConf(final Configuration config) {
-    conf = config;
-  }
-
-  @Override
-  public void writeExternal(ObjectOutput out) throws IOException {
-    conf.write(out);
-    out.writeInt(splits.size());
-    for (InputSplit split : splits) {
-      ((HCatSplit) split).write(out);
+    public ReaderContext() {
+        this.splits = new ArrayList<InputSplit>();
+        this.conf = new Configuration();
     }
-  }
 
-  @Override
-  public void readExternal(ObjectInput in) throws IOException,
-      ClassNotFoundException {
-    conf.readFields(in);
-    int numOfSplits = in.readInt();
-    for (int i = 0; i < numOfSplits; i++) {
-      HCatSplit split = new HCatSplit();
-      split.readFields(in);
-      splits.add(split);
+    public void setInputSplits(final List<InputSplit> splits) {
+        this.splits = splits;
     }
-  }
+
+    public List<InputSplit> getSplits() {
+        return splits;
+    }
+
+    @Override
+    public Configuration getConf() {
+        return conf;
+    }
+
+    @Override
+    public void setConf(final Configuration config) {
+        conf = config;
+    }
+
+    @Override
+    public void writeExternal(ObjectOutput out) throws IOException {
+        conf.write(out);
+        out.writeInt(splits.size());
+        for (InputSplit split : splits) {
+            ((HCatSplit) split).write(out);
+        }
+    }
+
+    @Override
+    public void readExternal(ObjectInput in) throws IOException,
+        ClassNotFoundException {
+        conf.readFields(in);
+        int numOfSplits = in.readInt();
+        for (int i = 0; i < numOfSplits; i++) {
+            HCatSplit split = new HCatSplit();
+            split.readFields(in);
+            splits.add(split);
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/WriteEntity.java b/src/java/org/apache/hcatalog/data/transfer/WriteEntity.java
index 4962bd9..3917a18 100644
--- a/src/java/org/apache/hcatalog/data/transfer/WriteEntity.java
+++ b/src/java/org/apache/hcatalog/data/transfer/WriteEntity.java
@@ -22,53 +22,53 @@
 
 public class WriteEntity extends EntityBase.Entity {
 
-  /**
-   * Don't instantiate {@link WriteEntity} directly. Use, {@link Builder} to
-   * build {@link WriteEntity}.
-   */
+    /**
+     * Don't instantiate {@link WriteEntity} directly. Use, {@link Builder} to
+     * build {@link WriteEntity}.
+     */
 
-  private WriteEntity() {
-    // Not allowed.
-  }
-
-  private WriteEntity(Builder builder) {
-    this.region = builder.region;
-    this.dbName = builder.dbName;
-    this.tableName = builder.tableName;
-    this.partitionKVs = builder.partitionKVs;
-  }
-
-  /**
-   * This class should be used to build {@link WriteEntity}. It follows builder
-   * pattern, letting you build your {@link WriteEntity} with whatever level of
-   * detail you want.
-   * 
-   */
-  public static class Builder extends EntityBase {
-
-    public Builder withRegion(final String region) {
-      this.region = region;
-      return this;
+    private WriteEntity() {
+        // Not allowed.
     }
 
-    public Builder withDatabase(final String dbName) {
-      this.dbName = dbName;
-      return this;
+    private WriteEntity(Builder builder) {
+        this.region = builder.region;
+        this.dbName = builder.dbName;
+        this.tableName = builder.tableName;
+        this.partitionKVs = builder.partitionKVs;
     }
 
-    public Builder withTable(final String tblName) {
-      this.tableName = tblName;
-      return this;
-    }
+    /**
+     * This class should be used to build {@link WriteEntity}. It follows builder
+     * pattern, letting you build your {@link WriteEntity} with whatever level of
+     * detail you want.
+     *
+     */
+    public static class Builder extends EntityBase {
 
-    public Builder withPartition(final Map<String, String> partKVs) {
-      this.partitionKVs = partKVs;
-      return this;
-    }
+        public Builder withRegion(final String region) {
+            this.region = region;
+            return this;
+        }
 
-    public WriteEntity build() {
-      return new WriteEntity(this);
-    }
+        public Builder withDatabase(final String dbName) {
+            this.dbName = dbName;
+            return this;
+        }
 
-  }
+        public Builder withTable(final String tblName) {
+            this.tableName = tblName;
+            return this;
+        }
+
+        public Builder withPartition(final Map<String, String> partKVs) {
+            this.partitionKVs = partKVs;
+            return this;
+        }
+
+        public WriteEntity build() {
+            return new WriteEntity(this);
+        }
+
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/WriterContext.java b/src/java/org/apache/hcatalog/data/transfer/WriterContext.java
index 6e67cfd..002ca07 100644
--- a/src/java/org/apache/hcatalog/data/transfer/WriterContext.java
+++ b/src/java/org/apache/hcatalog/data/transfer/WriterContext.java
@@ -34,31 +34,31 @@
  */
 public class WriterContext implements Externalizable, Configurable {
 
-  private static final long serialVersionUID = -5899374262971611840L;
-  private Configuration conf;
+    private static final long serialVersionUID = -5899374262971611840L;
+    private Configuration conf;
 
-  public WriterContext() {
-    conf = new Configuration();
-  }
+    public WriterContext() {
+        conf = new Configuration();
+    }
 
-  @Override
-  public Configuration getConf() {
-    return conf;
-  }
+    @Override
+    public Configuration getConf() {
+        return conf;
+    }
 
-  @Override
-  public void setConf(final Configuration config) {
-    this.conf = config;
-  }
+    @Override
+    public void setConf(final Configuration config) {
+        this.conf = config;
+    }
 
-  @Override
-  public void writeExternal(ObjectOutput out) throws IOException {
-    conf.write(out);
-  }
+    @Override
+    public void writeExternal(ObjectOutput out) throws IOException {
+        conf.write(out);
+    }
 
-  @Override
-  public void readExternal(ObjectInput in) throws IOException,
-      ClassNotFoundException {
-    conf.readFields(in);
-  }
+    @Override
+    public void readExternal(ObjectInput in) throws IOException,
+        ClassNotFoundException {
+        conf.readFields(in);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/impl/HCatInputFormatReader.java b/src/java/org/apache/hcatalog/data/transfer/impl/HCatInputFormatReader.java
index 663a6a6..cf9bba2 100644
--- a/src/java/org/apache/hcatalog/data/transfer/impl/HCatInputFormatReader.java
+++ b/src/java/org/apache/hcatalog/data/transfer/impl/HCatInputFormatReader.java
@@ -42,99 +42,99 @@
 
 /**
  * This reader reads via {@link HCatInputFormat}
- * 
+ *
  */
 public class HCatInputFormatReader extends HCatReader {
 
-  private InputSplit split;
+    private InputSplit split;
 
-  public HCatInputFormatReader(InputSplit split, Configuration config,
-      StateProvider sp) {
-    super(config, sp);
-    this.split = split;
-  }
-
-  public HCatInputFormatReader(ReadEntity info, Map<String, String> config) {
-    super(info, config);
-  }
-
-  @Override
-  public ReaderContext prepareRead() throws HCatException {
-
-    try {
-      Job job = new Job(conf);
-      InputJobInfo jobInfo = InputJobInfo.create(re.getDbName(),
-          re.getTableName(), re.getFilterString());
-      HCatInputFormat.setInput(job, jobInfo);
-      HCatInputFormat hcif = new HCatInputFormat();
-      ReaderContext cntxt = new ReaderContext();
-      cntxt.setInputSplits(hcif.getSplits(
-                  HCatHadoopShims.Instance.get().createJobContext(job.getConfiguration(), null)));
-      cntxt.setConf(job.getConfiguration());
-      return cntxt;
-    } catch (IOException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    } catch (InterruptedException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+    public HCatInputFormatReader(InputSplit split, Configuration config,
+                                 StateProvider sp) {
+        super(config, sp);
+        this.split = split;
     }
-  }
 
-  @Override
-  public Iterator<HCatRecord> read() throws HCatException {
-
-    HCatInputFormat inpFmt = new HCatInputFormat();
-    RecordReader<WritableComparable, HCatRecord> rr;
-    try {
-      TaskAttemptContext cntxt = HCatHadoopShims.Instance.get().createTaskAttemptContext(conf, new TaskAttemptID());
-      rr = inpFmt.createRecordReader(split, cntxt);
-      rr.initialize(split, cntxt);
-    } catch (IOException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    } catch (InterruptedException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    }
-    return new HCatRecordItr(rr);
-  }
-
-  private static class HCatRecordItr implements Iterator<HCatRecord> {
-
-    private RecordReader<WritableComparable, HCatRecord> curRecReader;
-
-    HCatRecordItr(RecordReader<WritableComparable, HCatRecord> rr) {
-      curRecReader = rr;
+    public HCatInputFormatReader(ReadEntity info, Map<String, String> config) {
+        super(info, config);
     }
 
     @Override
-    public boolean hasNext() {
-      try {
-        boolean retVal = curRecReader.nextKeyValue();
-        if (retVal) {
-          return true;
+    public ReaderContext prepareRead() throws HCatException {
+
+        try {
+            Job job = new Job(conf);
+            InputJobInfo jobInfo = InputJobInfo.create(re.getDbName(),
+                re.getTableName(), re.getFilterString());
+            HCatInputFormat.setInput(job, jobInfo);
+            HCatInputFormat hcif = new HCatInputFormat();
+            ReaderContext cntxt = new ReaderContext();
+            cntxt.setInputSplits(hcif.getSplits(
+                HCatHadoopShims.Instance.get().createJobContext(job.getConfiguration(), null)));
+            cntxt.setConf(job.getConfiguration());
+            return cntxt;
+        } catch (IOException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        } catch (InterruptedException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
         }
-        // if its false, we need to close recordReader.
-        curRecReader.close();
-        return false;
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      } catch (InterruptedException e) {
-        throw new RuntimeException(e);
-      }
     }
 
     @Override
-    public HCatRecord next() {
-      try {
-        return curRecReader.getCurrentValue();
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      } catch (InterruptedException e) {
-        throw new RuntimeException(e);
-      }
+    public Iterator<HCatRecord> read() throws HCatException {
+
+        HCatInputFormat inpFmt = new HCatInputFormat();
+        RecordReader<WritableComparable, HCatRecord> rr;
+        try {
+            TaskAttemptContext cntxt = HCatHadoopShims.Instance.get().createTaskAttemptContext(conf, new TaskAttemptID());
+            rr = inpFmt.createRecordReader(split, cntxt);
+            rr.initialize(split, cntxt);
+        } catch (IOException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        } catch (InterruptedException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        }
+        return new HCatRecordItr(rr);
     }
 
-    @Override
-    public void remove() {
-      throw new UnsupportedOperationException("Not allowed");
+    private static class HCatRecordItr implements Iterator<HCatRecord> {
+
+        private RecordReader<WritableComparable, HCatRecord> curRecReader;
+
+        HCatRecordItr(RecordReader<WritableComparable, HCatRecord> rr) {
+            curRecReader = rr;
+        }
+
+        @Override
+        public boolean hasNext() {
+            try {
+                boolean retVal = curRecReader.nextKeyValue();
+                if (retVal) {
+                    return true;
+                }
+                // if its false, we need to close recordReader.
+                curRecReader.close();
+                return false;
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public HCatRecord next() {
+            try {
+                return curRecReader.getCurrentValue();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public void remove() {
+            throw new UnsupportedOperationException("Not allowed");
+        }
     }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/impl/HCatOutputFormatWriter.java b/src/java/org/apache/hcatalog/data/transfer/impl/HCatOutputFormatWriter.java
index e3489fa..03e59e8 100644
--- a/src/java/org/apache/hcatalog/data/transfer/impl/HCatOutputFormatWriter.java
+++ b/src/java/org/apache/hcatalog/data/transfer/impl/HCatOutputFormatWriter.java
@@ -43,118 +43,118 @@
 
 /**
  * This writer writes via {@link HCatOutputFormat}
- * 
+ *
  */
 public class HCatOutputFormatWriter extends HCatWriter {
 
-  public HCatOutputFormatWriter(WriteEntity we, Map<String, String> config) {
-    super(we, config);
-  }
-
-  public HCatOutputFormatWriter(Configuration config, StateProvider sp) {
-    super(config, sp);
-  }
-
-  @Override
-  public WriterContext prepareWrite() throws HCatException {
-    OutputJobInfo jobInfo = OutputJobInfo.create(we.getDbName(),
-        we.getTableName(), we.getPartitionKVs());
-    Job job;
-    try {
-      job = new Job(conf);
-      HCatOutputFormat.setOutput(job, jobInfo);
-      HCatOutputFormat.setSchema(job, HCatOutputFormat.getTableSchema(job));
-      HCatOutputFormat outFormat = new HCatOutputFormat();
-      outFormat.checkOutputSpecs(job);
-      outFormat.getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
-              (job.getConfiguration(), HCatHadoopShims.Instance.get().createTaskAttemptID())).setupJob(job);
-    } catch (IOException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    } catch (InterruptedException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+    public HCatOutputFormatWriter(WriteEntity we, Map<String, String> config) {
+        super(we, config);
     }
-    WriterContext cntxt = new WriterContext();
-    cntxt.setConf(job.getConfiguration());
-    return cntxt;
-  }
 
-  @Override
-  public void write(Iterator<HCatRecord> recordItr) throws HCatException {
+    public HCatOutputFormatWriter(Configuration config, StateProvider sp) {
+        super(config, sp);
+    }
 
-    int id = sp.getId();
-    setVarsInConf(id);
-    HCatOutputFormat outFormat = new HCatOutputFormat();
-    TaskAttemptContext cntxt = HCatHadoopShims.Instance.get().createTaskAttemptContext
-        (conf, new TaskAttemptID(HCatHadoopShims.Instance.get().createTaskID(), id));
-    OutputCommitter committer = null;
-    RecordWriter<WritableComparable<?>, HCatRecord> writer;
-    try {
-      committer = outFormat.getOutputCommitter(cntxt);
-      committer.setupTask(cntxt);
-      writer = outFormat.getRecordWriter(cntxt);
-      while (recordItr.hasNext()) {
-        HCatRecord rec = recordItr.next();
-        writer.write(null, rec);
-      }
-      writer.close(cntxt);
-      if (committer.needsTaskCommit(cntxt)) {
-        committer.commitTask(cntxt);
-      }
-    } catch (IOException e) {
-      if (null != committer) {
+    @Override
+    public WriterContext prepareWrite() throws HCatException {
+        OutputJobInfo jobInfo = OutputJobInfo.create(we.getDbName(),
+            we.getTableName(), we.getPartitionKVs());
+        Job job;
         try {
-          committer.abortTask(cntxt);
-        } catch (IOException e1) {
-          throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, e1);
+            job = new Job(conf);
+            HCatOutputFormat.setOutput(job, jobInfo);
+            HCatOutputFormat.setSchema(job, HCatOutputFormat.getTableSchema(job));
+            HCatOutputFormat outFormat = new HCatOutputFormat();
+            outFormat.checkOutputSpecs(job);
+            outFormat.getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
+                (job.getConfiguration(), HCatHadoopShims.Instance.get().createTaskAttemptID())).setupJob(job);
+        } catch (IOException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        } catch (InterruptedException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
         }
-      }
-      throw new HCatException("Failed while writing", e);
-    } catch (InterruptedException e) {
-      if (null != committer) {
+        WriterContext cntxt = new WriterContext();
+        cntxt.setConf(job.getConfiguration());
+        return cntxt;
+    }
+
+    @Override
+    public void write(Iterator<HCatRecord> recordItr) throws HCatException {
+
+        int id = sp.getId();
+        setVarsInConf(id);
+        HCatOutputFormat outFormat = new HCatOutputFormat();
+        TaskAttemptContext cntxt = HCatHadoopShims.Instance.get().createTaskAttemptContext
+            (conf, new TaskAttemptID(HCatHadoopShims.Instance.get().createTaskID(), id));
+        OutputCommitter committer = null;
+        RecordWriter<WritableComparable<?>, HCatRecord> writer;
         try {
-          committer.abortTask(cntxt);
-        } catch (IOException e1) {
-          throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, e1);
+            committer = outFormat.getOutputCommitter(cntxt);
+            committer.setupTask(cntxt);
+            writer = outFormat.getRecordWriter(cntxt);
+            while (recordItr.hasNext()) {
+                HCatRecord rec = recordItr.next();
+                writer.write(null, rec);
+            }
+            writer.close(cntxt);
+            if (committer.needsTaskCommit(cntxt)) {
+                committer.commitTask(cntxt);
+            }
+        } catch (IOException e) {
+            if (null != committer) {
+                try {
+                    committer.abortTask(cntxt);
+                } catch (IOException e1) {
+                    throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, e1);
+                }
+            }
+            throw new HCatException("Failed while writing", e);
+        } catch (InterruptedException e) {
+            if (null != committer) {
+                try {
+                    committer.abortTask(cntxt);
+                } catch (IOException e1) {
+                    throw new HCatException(ErrorType.ERROR_INTERNAL_EXCEPTION, e1);
+                }
+            }
+            throw new HCatException("Failed while writing", e);
         }
-      }
-      throw new HCatException("Failed while writing", e);
     }
-  }
 
-  @Override
-  public void commit(WriterContext context) throws HCatException {
-    try {
-      new HCatOutputFormat().getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
-              (context.getConf(), HCatHadoopShims.Instance.get().createTaskAttemptID()))
-          .commitJob(HCatHadoopShims.Instance.get().createJobContext(context.getConf(), null));
-    } catch (IOException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    } catch (InterruptedException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+    @Override
+    public void commit(WriterContext context) throws HCatException {
+        try {
+            new HCatOutputFormat().getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
+                (context.getConf(), HCatHadoopShims.Instance.get().createTaskAttemptID()))
+                .commitJob(HCatHadoopShims.Instance.get().createJobContext(context.getConf(), null));
+        } catch (IOException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        } catch (InterruptedException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        }
     }
-  }
 
-  @Override
-  public void abort(WriterContext context) throws HCatException {
-    try {
-      new HCatOutputFormat().getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
-              (context.getConf(), HCatHadoopShims.Instance.get().createTaskAttemptID()))
-          .abortJob(HCatHadoopShims.Instance.get().createJobContext(context.getConf(), null),State.FAILED);
-    } catch (IOException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
-    } catch (InterruptedException e) {
-      throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+    @Override
+    public void abort(WriterContext context) throws HCatException {
+        try {
+            new HCatOutputFormat().getOutputCommitter(HCatHadoopShims.Instance.get().createTaskAttemptContext
+                (context.getConf(), HCatHadoopShims.Instance.get().createTaskAttemptID()))
+                .abortJob(HCatHadoopShims.Instance.get().createJobContext(context.getConf(), null), State.FAILED);
+        } catch (IOException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        } catch (InterruptedException e) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED, e);
+        }
     }
-  }
 
-  private void setVarsInConf(int id) {
+    private void setVarsInConf(int id) {
 
-    // Following two config keys are required by FileOutputFormat to work
-    // correctly.
-    // In usual case of Hadoop, JobTracker will set these before launching
-    // tasks.
-    // Since there is no jobtracker here, we set it ourself.
-    conf.setInt("mapred.task.partition", id);
-    conf.set("mapred.task.id", "attempt__0000_r_000000_" + id);
-  }
+        // Following two config keys are required by FileOutputFormat to work
+        // correctly.
+        // In usual case of Hadoop, JobTracker will set these before launching
+        // tasks.
+        // Since there is no jobtracker here, we set it ourself.
+        conf.setInt("mapred.task.partition", id);
+        conf.set("mapred.task.id", "attempt__0000_r_000000_" + id);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/state/DefaultStateProvider.java b/src/java/org/apache/hcatalog/data/transfer/state/DefaultStateProvider.java
index 339244d..e7455a3 100644
--- a/src/java/org/apache/hcatalog/data/transfer/state/DefaultStateProvider.java
+++ b/src/java/org/apache/hcatalog/data/transfer/state/DefaultStateProvider.java
@@ -23,25 +23,25 @@
 
 public class DefaultStateProvider implements StateProvider {
 
-  /**
-   * Default implementation. Here, ids are generated randomly.
-   */
-  @Override
-  public int getId() {
+    /**
+     * Default implementation. Here, ids are generated randomly.
+     */
+    @Override
+    public int getId() {
 
-    NumberFormat numberFormat = NumberFormat.getInstance();
-    numberFormat.setMinimumIntegerDigits(5);
-    numberFormat.setGroupingUsed(false);
-    return Integer
-        .parseInt(numberFormat.format(Math.abs(new Random().nextInt())));
-  }
-
-  private static StateProvider sp;
-
-  public static synchronized StateProvider get() {
-    if (null == sp) {
-      sp = new DefaultStateProvider();
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        numberFormat.setMinimumIntegerDigits(5);
+        numberFormat.setGroupingUsed(false);
+        return Integer
+            .parseInt(numberFormat.format(Math.abs(new Random().nextInt())));
     }
-    return sp;
-  }
+
+    private static StateProvider sp;
+
+    public static synchronized StateProvider get() {
+        if (null == sp) {
+            sp = new DefaultStateProvider();
+        }
+        return sp;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/data/transfer/state/StateProvider.java b/src/java/org/apache/hcatalog/data/transfer/state/StateProvider.java
index 2ab6251..ddf7364 100644
--- a/src/java/org/apache/hcatalog/data/transfer/state/StateProvider.java
+++ b/src/java/org/apache/hcatalog/data/transfer/state/StateProvider.java
@@ -25,10 +25,10 @@
  */
 public interface StateProvider {
 
-  /**
-   * This method should return id assigned to slave node.
-   * 
-   * @return id
-   */
-  public int getId();
+    /**
+     * This method should return id assigned to slave node.
+     *
+     * @return id
+     */
+    public int getId();
 }
diff --git a/src/java/org/apache/hcatalog/har/HarOutputCommitterPostProcessor.java b/src/java/org/apache/hcatalog/har/HarOutputCommitterPostProcessor.java
index 41a81b3..7e4dba4 100644
--- a/src/java/org/apache/hcatalog/har/HarOutputCommitterPostProcessor.java
+++ b/src/java/org/apache/hcatalog/har/HarOutputCommitterPostProcessor.java
@@ -32,93 +32,93 @@
 import org.apache.hcatalog.common.HCatException;
 
 public class HarOutputCommitterPostProcessor {
-  
-  boolean isEnabled = false;
-  
-  public boolean isEnabled() {
-    return isEnabled;
-  }
 
-  public void setEnabled(boolean enabled) {
-    this.isEnabled = enabled;
-  }
+    boolean isEnabled = false;
+
+    public boolean isEnabled() {
+        return isEnabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.isEnabled = enabled;
+    }
 
 
-  public void exec(JobContext context, Partition partition, Path partPath) throws IOException {
+    public void exec(JobContext context, Partition partition, Path partPath) throws IOException {
 //    LOG.info("Archiving partition ["+partPath.toString()+"]");
-    makeHar(context,partPath.toUri().toString(),harFile(partPath));
-    partition.getParameters().put(Constants.IS_ARCHIVED, "true");
-  }
-  
-  public String harFile(Path ptnPath) throws IOException{
-    String harFile = ptnPath.toString().replaceFirst("/+$", "") + ".har";
+        makeHar(context, partPath.toUri().toString(), harFile(partPath));
+        partition.getParameters().put(Constants.IS_ARCHIVED, "true");
+    }
+
+    public String harFile(Path ptnPath) throws IOException {
+        String harFile = ptnPath.toString().replaceFirst("/+$", "") + ".har";
 //    LOG.info("har file : " + harFile);
-    return harFile;
-  }
+        return harFile;
+    }
 
-  public String getParentFSPath(Path ptnPath) throws IOException {
-    return ptnPath.toUri().getPath().replaceFirst("/+$", "");
-  }
+    public String getParentFSPath(Path ptnPath) throws IOException {
+        return ptnPath.toUri().getPath().replaceFirst("/+$", "");
+    }
 
-  public String getProcessedLocation(Path ptnPath) throws IOException {
-    String harLocn = ("har://" + ptnPath.toUri().getPath()).replaceFirst("/+$", "") + ".har" + Path.SEPARATOR;
+    public String getProcessedLocation(Path ptnPath) throws IOException {
+        String harLocn = ("har://" + ptnPath.toUri().getPath()).replaceFirst("/+$", "") + ".har" + Path.SEPARATOR;
 //    LOG.info("har location : " + harLocn);
-    return harLocn;
-  }
-  
+        return harLocn;
+    }
 
-  /**
-   * Creates a har file from the contents of a given directory, using that as root.
-   * @param dir Directory to archive
-   * @param harFile The HAR file to create
-   */
-  public static void makeHar(JobContext context, String dir, String harFile) throws IOException{
+
+    /**
+     * Creates a har file from the contents of a given directory, using that as root.
+     * @param dir Directory to archive
+     * @param harFile The HAR file to create
+     */
+    public static void makeHar(JobContext context, String dir, String harFile) throws IOException {
 //    Configuration conf = context.getConfiguration();
 //    Credentials creds = context.getCredentials();
-    
+
 //    HCatUtil.logAllTokens(LOG,context);
-    
-    int lastSep = harFile.lastIndexOf(Path.SEPARATOR_CHAR);
-    Path archivePath = new Path(harFile.substring(0,lastSep));
-    final String[] args = {
-        "-archiveName",
-        harFile.substring(lastSep+1, harFile.length()),
-        "-p",
-        dir,
-        "*",
-        archivePath.toString()
-    };
+
+        int lastSep = harFile.lastIndexOf(Path.SEPARATOR_CHAR);
+        Path archivePath = new Path(harFile.substring(0, lastSep));
+        final String[] args = {
+            "-archiveName",
+            harFile.substring(lastSep + 1, harFile.length()),
+            "-p",
+            dir,
+            "*",
+            archivePath.toString()
+        };
 //    for (String arg : args){
 //      LOG.info("Args to har : "+ arg);
 //    }
-    try {
-      Configuration newConf = new Configuration();
-      FileSystem fs = archivePath.getFileSystem(newConf);
-      
-      String hadoopTokenFileLocationEnvSetting = System.getenv(HCatConstants.SYSENV_HADOOP_TOKEN_FILE_LOCATION);
-      if ((hadoopTokenFileLocationEnvSetting != null) && (!hadoopTokenFileLocationEnvSetting.isEmpty())){
-        newConf.set(HCatConstants.CONF_MAPREDUCE_JOB_CREDENTIALS_BINARY, hadoopTokenFileLocationEnvSetting);
+        try {
+            Configuration newConf = new Configuration();
+            FileSystem fs = archivePath.getFileSystem(newConf);
+
+            String hadoopTokenFileLocationEnvSetting = System.getenv(HCatConstants.SYSENV_HADOOP_TOKEN_FILE_LOCATION);
+            if ((hadoopTokenFileLocationEnvSetting != null) && (!hadoopTokenFileLocationEnvSetting.isEmpty())) {
+                newConf.set(HCatConstants.CONF_MAPREDUCE_JOB_CREDENTIALS_BINARY, hadoopTokenFileLocationEnvSetting);
 //      LOG.info("System.getenv(\"HADOOP_TOKEN_FILE_LOCATION\") =["+  System.getenv("HADOOP_TOKEN_FILE_LOCATION")+"]");
-      }
+            }
 //      for (FileStatus ds : fs.globStatus(new Path(dir, "*"))){
 //        LOG.info("src : "+ds.getPath().toUri().toString());
 //      }
 
-      final HadoopArchives har = new HadoopArchives(newConf);
-      int rc = ToolRunner.run(har, args);
-      if (rc!= 0){
-        throw new Exception("Har returned error code "+rc);
-      }
+            final HadoopArchives har = new HadoopArchives(newConf);
+            int rc = ToolRunner.run(har, args);
+            if (rc != 0) {
+                throw new Exception("Har returned error code " + rc);
+            }
 
 //      for (FileStatus hs : fs.globStatus(new Path(harFile, "*"))){
 //        LOG.info("dest : "+hs.getPath().toUri().toString());
 //      }
 //      doHarCheck(fs,harFile);
 //      LOG.info("Nuking " + dir);
-      fs.delete(new Path(dir), true);
-    } catch (Exception e){
-      throw new HCatException("Error creating Har ["+harFile+"] from ["+dir+"]", e);
+            fs.delete(new Path(dir), true);
+        } catch (Exception e) {
+            throw new HCatException("Error creating Har [" + harFile + "] from [" + dir + "]", e);
+        }
     }
-  }
 
 }
diff --git a/src/java/org/apache/hcatalog/listener/NotificationListener.java b/src/java/org/apache/hcatalog/listener/NotificationListener.java
index 8529c5a..0660042 100644
--- a/src/java/org/apache/hcatalog/listener/NotificationListener.java
+++ b/src/java/org/apache/hcatalog/listener/NotificationListener.java
@@ -75,299 +75,299 @@
  */
 public class NotificationListener extends MetaStoreEventListener {
 
-  private static final Logger LOG = LoggerFactory.getLogger(NotificationListener.class);
-  protected Session session;
-  protected Connection conn;
+    private static final Logger LOG = LoggerFactory.getLogger(NotificationListener.class);
+    protected Session session;
+    protected Connection conn;
 
-  /**
-   * Create message bus connection and session in constructor.
-   */
-  public NotificationListener(final Configuration conf) {
+    /**
+     * Create message bus connection and session in constructor.
+     */
+    public NotificationListener(final Configuration conf) {
 
-    super(conf);
-    createConnection();
-  }
-
-  private static String getTopicName(Partition partition,
-      ListenerEvent partitionEvent) throws MetaException {
-    try {
-      return partitionEvent.getHandler()
-          .get_table(partition.getDbName(), partition.getTableName())
-          .getParameters().get(HCatConstants.HCAT_MSGBUS_TOPIC_NAME);
-    } catch (NoSuchObjectException e) {
-      throw new MetaException(e.toString());
-    }
-  }
-
-  @Override
-  public void onAddPartition(AddPartitionEvent partitionEvent)
-      throws MetaException {
-    // Subscriber can get notification of newly add partition in a
-    // particular table by listening on a topic named "dbName.tableName"
-    // and message selector string as "HCAT_EVENT = HCAT_ADD_PARTITION"
-    if (partitionEvent.getStatus()) {
-
-      Partition partition = partitionEvent.getPartition();
-      String topicName = getTopicName(partition, partitionEvent);
-      if (topicName != null && !topicName.equals("")) {
-        send(partition, topicName, HCatConstants.HCAT_ADD_PARTITION_EVENT);
-      } else {
-        LOG.info("Topic name not found in metastore. Suppressing HCatalog notification for "
-            + partition.getDbName()
-            + "."
-            + partition.getTableName()
-            + " To enable notifications for this table, please do alter table set properties ("
-            + HCatConstants.HCAT_MSGBUS_TOPIC_NAME
-            + "=<dbname>.<tablename>) or whatever you want topic name to be.");
-      }
-    }
-
-  }
-
-  @Override
-  public void onDropPartition(DropPartitionEvent partitionEvent)
-      throws MetaException {
-    // Subscriber can get notification of dropped partition in a
-    // particular table by listening on a topic named "dbName.tableName"
-    // and message selector string as "HCAT_EVENT = HCAT_DROP_PARTITION"
-
-    // Datanucleus throws NPE when we try to serialize a partition object
-    // retrieved from metastore. To workaround that we reset following objects
-
-    if (partitionEvent.getStatus()) {
-      Partition partition = partitionEvent.getPartition();
-      StorageDescriptor sd = partition.getSd();
-      sd.setBucketCols(new ArrayList<String>());
-      sd.setSortCols(new ArrayList<Order>());
-      sd.setParameters(new HashMap<String, String>());
-      sd.getSerdeInfo().setParameters(new HashMap<String, String>());
-      String topicName = getTopicName(partition, partitionEvent);
-      if (topicName != null && !topicName.equals("")) {
-        send(partition, topicName, HCatConstants.HCAT_DROP_PARTITION_EVENT);
-      } else {
-        LOG.info("Topic name not found in metastore. Suppressing HCatalog notification for "
-            + partition.getDbName()
-            + "."
-            + partition.getTableName()
-            + " To enable notifications for this table, please do alter table set properties ("
-            + HCatConstants.HCAT_MSGBUS_TOPIC_NAME
-            + "=<dbname>.<tablename>) or whatever you want topic name to be.");
-      }
-    }
-  }
-
-  @Override
-  public void onCreateDatabase(CreateDatabaseEvent dbEvent)
-      throws MetaException {
-    // Subscriber can get notification about addition of a database in HCAT
-    // by listening on a topic named "HCAT" and message selector string
-    // as "HCAT_EVENT = HCAT_ADD_DATABASE"
-    if (dbEvent.getStatus())
-      send(dbEvent.getDatabase(), getTopicPrefix(dbEvent.getHandler()
-          .getHiveConf()), HCatConstants.HCAT_ADD_DATABASE_EVENT);
-  }
-
-  @Override
-  public void onDropDatabase(DropDatabaseEvent dbEvent) throws MetaException {
-    // Subscriber can get notification about drop of a database in HCAT
-    // by listening on a topic named "HCAT" and message selector string
-    // as "HCAT_EVENT = HCAT_DROP_DATABASE"
-    if (dbEvent.getStatus())
-      send(dbEvent.getDatabase(), getTopicPrefix(dbEvent.getHandler()
-          .getHiveConf()), HCatConstants.HCAT_DROP_DATABASE_EVENT);
-  }
-
-  @Override
-  public void onCreateTable(CreateTableEvent tableEvent) throws MetaException {
-    // Subscriber can get notification about addition of a table in HCAT
-    // by listening on a topic named "HCAT" and message selector string
-    // as "HCAT_EVENT = HCAT_ADD_TABLE"
-    if (tableEvent.getStatus()) {
-      Table tbl = tableEvent.getTable();
-      HMSHandler handler = tableEvent.getHandler();
-      HiveConf conf = handler.getHiveConf();
-      Table newTbl;
-      try {
-        newTbl = handler.get_table(tbl.getDbName(), tbl.getTableName())
-            .deepCopy();
-        newTbl.getParameters().put(
-            HCatConstants.HCAT_MSGBUS_TOPIC_NAME,
-            getTopicPrefix(conf) + "." + newTbl.getDbName().toLowerCase() + "."
-                + newTbl.getTableName().toLowerCase());
-        handler.alter_table(newTbl.getDbName(), newTbl.getTableName(), newTbl);
-      } catch (InvalidOperationException e) {
-        MetaException me = new MetaException(e.toString());
-        me.initCause(e);
-        throw me;
-      } catch (NoSuchObjectException e) {
-        MetaException me = new MetaException(e.toString());
-        me.initCause(e);
-        throw me;
-      }
-      send(newTbl, getTopicPrefix(conf) + "."
-          + newTbl.getDbName().toLowerCase(),
-          HCatConstants.HCAT_ADD_TABLE_EVENT);
-    }
-  }
-
-  private String getTopicPrefix(HiveConf conf) {
-    return conf.get(HCatConstants.HCAT_MSGBUS_TOPIC_PREFIX,
-        HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX);
-  }
-
-  @Override
-  public void onDropTable(DropTableEvent tableEvent) throws MetaException {
-    // Subscriber can get notification about drop of a table in HCAT
-    // by listening on a topic named "HCAT" and message selector string
-    // as "HCAT_EVENT = HCAT_DROP_TABLE"
-
-    // Datanucleus throws NPE when we try to serialize a table object
-    // retrieved from metastore. To workaround that we reset following objects
-
-    if (tableEvent.getStatus()) {
-      Table table = tableEvent.getTable();
-      StorageDescriptor sd = table.getSd();
-      sd.setBucketCols(new ArrayList<String>());
-      sd.setSortCols(new ArrayList<Order>());
-      sd.setParameters(new HashMap<String, String>());
-      sd.getSerdeInfo().setParameters(new HashMap<String, String>());
-      send(table, getTopicPrefix(tableEvent.getHandler().getHiveConf()) + "."
-          + table.getDbName().toLowerCase(),
-          HCatConstants.HCAT_DROP_TABLE_EVENT);
-    }
-  }
-
-  /**
-   * @param msgBody
-   *          is the metastore object. It is sent in full such that if
-   *          subscriber is really interested in details, it can reconstruct it
-   *          fully. In case of finalize_partition message this will be string
-   *          specification of the partition.
-   * @param topicName
-   *          is the name on message broker on which message is sent.
-   * @param event
-   *          is the value of HCAT_EVENT property in message. It can be used to
-   *          select messages in client side.
-   */
-  protected void send(Object msgBody, String topicName, String event) {
-
-    try {
-
-      Destination topic = null;
-      if (null == session) {
-        // this will happen, if we never able to establish a connection.
+        super(conf);
         createConnection();
-        if (null == session) {
-          // Still not successful, return from here.
-          LOG.error("Invalid session. Failed to send message on topic: "
-              + topicName + " event: " + event);
-          return;
-        }
-      }
-      try {
-        // Topics are created on demand. If it doesn't exist on broker it will
-        // be created when broker receives this message.
-        topic = session.createTopic(topicName);
-      } catch (IllegalStateException ise) {
-        // this will happen if we were able to establish connection once, but
-        // its no longer valid,
-        // ise is thrown, catch it and retry.
-        LOG.error("Seems like connection is lost. Retrying", ise);
-        createConnection();
-        topic = session.createTopic(topicName);
-      }
-      if (null == topic) {
-        // Still not successful, return from here.
-        LOG.error("Invalid session. Failed to send message on topic: "
-            + topicName + " event: " + event);
-        return;
-      }
-      MessageProducer producer = session.createProducer(topic);
-      Message msg;
-      if (msgBody instanceof Map) {
-        MapMessage mapMsg = session.createMapMessage();
-        Map<String, String> incomingMap = (Map<String, String>) msgBody;
-        for (Entry<String, String> partCol : incomingMap.entrySet()) {
-          mapMsg.setString(partCol.getKey(), partCol.getValue());
-        }
-        msg = mapMsg;
-      } else {
-        msg = session.createObjectMessage((Serializable) msgBody);
-      }
-
-      msg.setStringProperty(HCatConstants.HCAT_EVENT, event);
-      producer.send(msg);
-      // Message must be transacted before we return.
-      session.commit();
-    } catch (Exception e) {
-      // Gobble up the exception. Message delivery is best effort.
-      LOG.error("Failed to send message on topic: " + topicName + " event: "
-          + event, e);
     }
-  }
 
-  protected void createConnection() {
-
-    Context jndiCntxt;
-    try {
-      jndiCntxt = new InitialContext();
-      ConnectionFactory connFac = (ConnectionFactory) jndiCntxt
-          .lookup("ConnectionFactory");
-      Connection conn = connFac.createConnection();
-      conn.start();
-      conn.setExceptionListener(new ExceptionListener() {
-        @Override
-        public void onException(JMSException jmse) {
-          LOG.error(jmse.toString());
+    private static String getTopicName(Partition partition,
+                                       ListenerEvent partitionEvent) throws MetaException {
+        try {
+            return partitionEvent.getHandler()
+                .get_table(partition.getDbName(), partition.getTableName())
+                .getParameters().get(HCatConstants.HCAT_MSGBUS_TOPIC_NAME);
+        } catch (NoSuchObjectException e) {
+            throw new MetaException(e.toString());
         }
-      });
-      // We want message to be sent when session commits, thus we run in
-      // transacted mode.
-      session = conn.createSession(true, Session.SESSION_TRANSACTED);
-    } catch (NamingException e) {
-      LOG.error("JNDI error while setting up Message Bus connection. "
-          + "Please make sure file named 'jndi.properties' is in "
-          + "classpath and contains appropriate key-value pairs.", e);
-    } catch (JMSException e) {
-      LOG.error("Failed to initialize connection to message bus", e);
-    } catch (Throwable t) {
-      LOG.error("Unable to connect to JMS provider", t);
     }
-  }
 
-  @Override
-  protected void finalize() throws Throwable {
-    // Close the connection before dying.
-    try {
-      if (null != session)
-        session.close();
-      if (conn != null) {
-        conn.close();
-      }
+    @Override
+    public void onAddPartition(AddPartitionEvent partitionEvent)
+        throws MetaException {
+        // Subscriber can get notification of newly add partition in a
+        // particular table by listening on a topic named "dbName.tableName"
+        // and message selector string as "HCAT_EVENT = HCAT_ADD_PARTITION"
+        if (partitionEvent.getStatus()) {
 
-    } catch (Exception ignore) {
-      LOG.info("Failed to close message bus connection.", ignore);
+            Partition partition = partitionEvent.getPartition();
+            String topicName = getTopicName(partition, partitionEvent);
+            if (topicName != null && !topicName.equals("")) {
+                send(partition, topicName, HCatConstants.HCAT_ADD_PARTITION_EVENT);
+            } else {
+                LOG.info("Topic name not found in metastore. Suppressing HCatalog notification for "
+                    + partition.getDbName()
+                    + "."
+                    + partition.getTableName()
+                    + " To enable notifications for this table, please do alter table set properties ("
+                    + HCatConstants.HCAT_MSGBUS_TOPIC_NAME
+                    + "=<dbname>.<tablename>) or whatever you want topic name to be.");
+            }
+        }
+
     }
-  }
 
-  @Override
-  public void onLoadPartitionDone(LoadPartitionDoneEvent lpde)
-      throws MetaException {
-    if (lpde.getStatus())
-      send(
-          lpde.getPartitionName(),
-          lpde.getTable().getParameters()
-              .get(HCatConstants.HCAT_MSGBUS_TOPIC_NAME),
-          HCatConstants.HCAT_PARTITION_DONE_EVENT);
-  }
+    @Override
+    public void onDropPartition(DropPartitionEvent partitionEvent)
+        throws MetaException {
+        // Subscriber can get notification of dropped partition in a
+        // particular table by listening on a topic named "dbName.tableName"
+        // and message selector string as "HCAT_EVENT = HCAT_DROP_PARTITION"
 
-  @Override
-  public void onAlterPartition(AlterPartitionEvent ape) throws MetaException {
-    // no-op
-  }
+        // Datanucleus throws NPE when we try to serialize a partition object
+        // retrieved from metastore. To workaround that we reset following objects
 
-  @Override
-  public void onAlterTable(AlterTableEvent ate) throws MetaException {
-    // no-op
-  }
+        if (partitionEvent.getStatus()) {
+            Partition partition = partitionEvent.getPartition();
+            StorageDescriptor sd = partition.getSd();
+            sd.setBucketCols(new ArrayList<String>());
+            sd.setSortCols(new ArrayList<Order>());
+            sd.setParameters(new HashMap<String, String>());
+            sd.getSerdeInfo().setParameters(new HashMap<String, String>());
+            String topicName = getTopicName(partition, partitionEvent);
+            if (topicName != null && !topicName.equals("")) {
+                send(partition, topicName, HCatConstants.HCAT_DROP_PARTITION_EVENT);
+            } else {
+                LOG.info("Topic name not found in metastore. Suppressing HCatalog notification for "
+                    + partition.getDbName()
+                    + "."
+                    + partition.getTableName()
+                    + " To enable notifications for this table, please do alter table set properties ("
+                    + HCatConstants.HCAT_MSGBUS_TOPIC_NAME
+                    + "=<dbname>.<tablename>) or whatever you want topic name to be.");
+            }
+        }
+    }
+
+    @Override
+    public void onCreateDatabase(CreateDatabaseEvent dbEvent)
+        throws MetaException {
+        // Subscriber can get notification about addition of a database in HCAT
+        // by listening on a topic named "HCAT" and message selector string
+        // as "HCAT_EVENT = HCAT_ADD_DATABASE"
+        if (dbEvent.getStatus())
+            send(dbEvent.getDatabase(), getTopicPrefix(dbEvent.getHandler()
+                .getHiveConf()), HCatConstants.HCAT_ADD_DATABASE_EVENT);
+    }
+
+    @Override
+    public void onDropDatabase(DropDatabaseEvent dbEvent) throws MetaException {
+        // Subscriber can get notification about drop of a database in HCAT
+        // by listening on a topic named "HCAT" and message selector string
+        // as "HCAT_EVENT = HCAT_DROP_DATABASE"
+        if (dbEvent.getStatus())
+            send(dbEvent.getDatabase(), getTopicPrefix(dbEvent.getHandler()
+                .getHiveConf()), HCatConstants.HCAT_DROP_DATABASE_EVENT);
+    }
+
+    @Override
+    public void onCreateTable(CreateTableEvent tableEvent) throws MetaException {
+        // Subscriber can get notification about addition of a table in HCAT
+        // by listening on a topic named "HCAT" and message selector string
+        // as "HCAT_EVENT = HCAT_ADD_TABLE"
+        if (tableEvent.getStatus()) {
+            Table tbl = tableEvent.getTable();
+            HMSHandler handler = tableEvent.getHandler();
+            HiveConf conf = handler.getHiveConf();
+            Table newTbl;
+            try {
+                newTbl = handler.get_table(tbl.getDbName(), tbl.getTableName())
+                    .deepCopy();
+                newTbl.getParameters().put(
+                    HCatConstants.HCAT_MSGBUS_TOPIC_NAME,
+                    getTopicPrefix(conf) + "." + newTbl.getDbName().toLowerCase() + "."
+                        + newTbl.getTableName().toLowerCase());
+                handler.alter_table(newTbl.getDbName(), newTbl.getTableName(), newTbl);
+            } catch (InvalidOperationException e) {
+                MetaException me = new MetaException(e.toString());
+                me.initCause(e);
+                throw me;
+            } catch (NoSuchObjectException e) {
+                MetaException me = new MetaException(e.toString());
+                me.initCause(e);
+                throw me;
+            }
+            send(newTbl, getTopicPrefix(conf) + "."
+                + newTbl.getDbName().toLowerCase(),
+                HCatConstants.HCAT_ADD_TABLE_EVENT);
+        }
+    }
+
+    private String getTopicPrefix(HiveConf conf) {
+        return conf.get(HCatConstants.HCAT_MSGBUS_TOPIC_PREFIX,
+            HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX);
+    }
+
+    @Override
+    public void onDropTable(DropTableEvent tableEvent) throws MetaException {
+        // Subscriber can get notification about drop of a table in HCAT
+        // by listening on a topic named "HCAT" and message selector string
+        // as "HCAT_EVENT = HCAT_DROP_TABLE"
+
+        // Datanucleus throws NPE when we try to serialize a table object
+        // retrieved from metastore. To workaround that we reset following objects
+
+        if (tableEvent.getStatus()) {
+            Table table = tableEvent.getTable();
+            StorageDescriptor sd = table.getSd();
+            sd.setBucketCols(new ArrayList<String>());
+            sd.setSortCols(new ArrayList<Order>());
+            sd.setParameters(new HashMap<String, String>());
+            sd.getSerdeInfo().setParameters(new HashMap<String, String>());
+            send(table, getTopicPrefix(tableEvent.getHandler().getHiveConf()) + "."
+                + table.getDbName().toLowerCase(),
+                HCatConstants.HCAT_DROP_TABLE_EVENT);
+        }
+    }
+
+    /**
+     * @param msgBody
+     *          is the metastore object. It is sent in full such that if
+     *          subscriber is really interested in details, it can reconstruct it
+     *          fully. In case of finalize_partition message this will be string
+     *          specification of the partition.
+     * @param topicName
+     *          is the name on message broker on which message is sent.
+     * @param event
+     *          is the value of HCAT_EVENT property in message. It can be used to
+     *          select messages in client side.
+     */
+    protected void send(Object msgBody, String topicName, String event) {
+
+        try {
+
+            Destination topic = null;
+            if (null == session) {
+                // this will happen, if we never able to establish a connection.
+                createConnection();
+                if (null == session) {
+                    // Still not successful, return from here.
+                    LOG.error("Invalid session. Failed to send message on topic: "
+                        + topicName + " event: " + event);
+                    return;
+                }
+            }
+            try {
+                // Topics are created on demand. If it doesn't exist on broker it will
+                // be created when broker receives this message.
+                topic = session.createTopic(topicName);
+            } catch (IllegalStateException ise) {
+                // this will happen if we were able to establish connection once, but
+                // its no longer valid,
+                // ise is thrown, catch it and retry.
+                LOG.error("Seems like connection is lost. Retrying", ise);
+                createConnection();
+                topic = session.createTopic(topicName);
+            }
+            if (null == topic) {
+                // Still not successful, return from here.
+                LOG.error("Invalid session. Failed to send message on topic: "
+                    + topicName + " event: " + event);
+                return;
+            }
+            MessageProducer producer = session.createProducer(topic);
+            Message msg;
+            if (msgBody instanceof Map) {
+                MapMessage mapMsg = session.createMapMessage();
+                Map<String, String> incomingMap = (Map<String, String>) msgBody;
+                for (Entry<String, String> partCol : incomingMap.entrySet()) {
+                    mapMsg.setString(partCol.getKey(), partCol.getValue());
+                }
+                msg = mapMsg;
+            } else {
+                msg = session.createObjectMessage((Serializable) msgBody);
+            }
+
+            msg.setStringProperty(HCatConstants.HCAT_EVENT, event);
+            producer.send(msg);
+            // Message must be transacted before we return.
+            session.commit();
+        } catch (Exception e) {
+            // Gobble up the exception. Message delivery is best effort.
+            LOG.error("Failed to send message on topic: " + topicName + " event: "
+                + event, e);
+        }
+    }
+
+    protected void createConnection() {
+
+        Context jndiCntxt;
+        try {
+            jndiCntxt = new InitialContext();
+            ConnectionFactory connFac = (ConnectionFactory) jndiCntxt
+                .lookup("ConnectionFactory");
+            Connection conn = connFac.createConnection();
+            conn.start();
+            conn.setExceptionListener(new ExceptionListener() {
+                @Override
+                public void onException(JMSException jmse) {
+                    LOG.error(jmse.toString());
+                }
+            });
+            // We want message to be sent when session commits, thus we run in
+            // transacted mode.
+            session = conn.createSession(true, Session.SESSION_TRANSACTED);
+        } catch (NamingException e) {
+            LOG.error("JNDI error while setting up Message Bus connection. "
+                + "Please make sure file named 'jndi.properties' is in "
+                + "classpath and contains appropriate key-value pairs.", e);
+        } catch (JMSException e) {
+            LOG.error("Failed to initialize connection to message bus", e);
+        } catch (Throwable t) {
+            LOG.error("Unable to connect to JMS provider", t);
+        }
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        // Close the connection before dying.
+        try {
+            if (null != session)
+                session.close();
+            if (conn != null) {
+                conn.close();
+            }
+
+        } catch (Exception ignore) {
+            LOG.info("Failed to close message bus connection.", ignore);
+        }
+    }
+
+    @Override
+    public void onLoadPartitionDone(LoadPartitionDoneEvent lpde)
+        throws MetaException {
+        if (lpde.getStatus())
+            send(
+                lpde.getPartitionName(),
+                lpde.getTable().getParameters()
+                    .get(HCatConstants.HCAT_MSGBUS_TOPIC_NAME),
+                HCatConstants.HCAT_PARTITION_DONE_EVENT);
+    }
+
+    @Override
+    public void onAlterPartition(AlterPartitionEvent ape) throws MetaException {
+        // no-op
+    }
+
+    @Override
+    public void onAlterTable(AlterTableEvent ate) throws MetaException {
+        // no-op
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/DefaultOutputCommitterContainer.java b/src/java/org/apache/hcatalog/mapreduce/DefaultOutputCommitterContainer.java
index cc0ae9e..3b1df91 100644
--- a/src/java/org/apache/hcatalog/mapreduce/DefaultOutputCommitterContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/DefaultOutputCommitterContainer.java
@@ -45,7 +45,7 @@
      * @throws IOException
      */
     public DefaultOutputCommitterContainer(JobContext context, org.apache.hadoop.mapred.OutputCommitter baseCommitter) throws IOException {
-        super(context,baseCommitter);
+        super(context, baseCommitter);
     }
 
     @Override
@@ -95,8 +95,8 @@
             HiveConf hiveConf = HCatUtil.getHiveConf(context.getConfiguration());
             client = HCatUtil.getHiveClient(hiveConf);
             String tokenStrForm = client.getTokenStrForm();
-            if(tokenStrForm != null && context.getConfiguration().get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
-              client.cancelDelegationToken(tokenStrForm);
+            if (tokenStrForm != null && context.getConfiguration().get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
+                client.cancelDelegationToken(tokenStrForm);
             }
         } catch (Exception e) {
             LOG.warn("Failed to cancel delegation token", e);
diff --git a/src/java/org/apache/hcatalog/mapreduce/DefaultOutputFormatContainer.java b/src/java/org/apache/hcatalog/mapreduce/DefaultOutputFormatContainer.java
index e05fd01..a87e7bb 100644
--- a/src/java/org/apache/hcatalog/mapreduce/DefaultOutputFormatContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/DefaultOutputFormatContainer.java
@@ -42,8 +42,8 @@
     private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
 
     static {
-      NUMBER_FORMAT.setMinimumIntegerDigits(5);
-      NUMBER_FORMAT.setGroupingUsed(false);
+        NUMBER_FORMAT.setMinimumIntegerDigits(5);
+        NUMBER_FORMAT.setGroupingUsed(false);
     }
 
     public DefaultOutputFormatContainer(org.apache.hadoop.mapred.OutputFormat<WritableComparable<?>, Writable> of) {
@@ -52,7 +52,7 @@
 
     static synchronized String getOutputName(int partition) {
         return "part-" + NUMBER_FORMAT.format(partition);
-      }
+    }
 
     /**
      * Get the record writer for the job. Uses the storagehandler's OutputFormat
@@ -66,7 +66,7 @@
     getRecordWriter(TaskAttemptContext context) throws IOException, InterruptedException {
         String name = getOutputName(context.getTaskAttemptID().getTaskID().getId());
         return new DefaultRecordWriterContainer(context,
-                getBaseOutputFormat().getRecordWriter(null, new JobConf(context.getConfiguration()), name, InternalUtil.createReporter(context)));
+            getBaseOutputFormat().getRecordWriter(null, new JobConf(context.getConfiguration()), name, InternalUtil.createReporter(context)));
     }
 
 
@@ -80,7 +80,7 @@
      */
     @Override
     public OutputCommitter getOutputCommitter(TaskAttemptContext context)
-            throws IOException, InterruptedException {
+        throws IOException, InterruptedException {
         return new DefaultOutputCommitterContainer(context, new JobConf(context.getConfiguration()).getOutputCommitter());
     }
 
@@ -93,7 +93,7 @@
     public void checkOutputSpecs(JobContext context) throws IOException, InterruptedException {
         org.apache.hadoop.mapred.OutputFormat<? super WritableComparable<?>, ? super Writable> outputFormat = getBaseOutputFormat();
         JobConf jobConf = new JobConf(context.getConfiguration());
-        outputFormat.checkOutputSpecs(null,jobConf);
+        outputFormat.checkOutputSpecs(null, jobConf);
         HCatUtil.copyConf(jobConf, context.getConfiguration());
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/DefaultRecordWriterContainer.java b/src/java/org/apache/hcatalog/mapreduce/DefaultRecordWriterContainer.java
index 884791d..49cf05e 100644
--- a/src/java/org/apache/hcatalog/mapreduce/DefaultRecordWriterContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/DefaultRecordWriterContainer.java
@@ -49,32 +49,32 @@
      */
     public DefaultRecordWriterContainer(TaskAttemptContext context,
                                         org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable> baseRecordWriter) throws IOException, InterruptedException {
-        super(context,baseRecordWriter);
+        super(context, baseRecordWriter);
         jobInfo = HCatOutputFormat.getJobInfo(context);
         storageHandler = HCatUtil.getStorageHandler(context.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
         HCatOutputFormat.configureOutputStorageHandler(context);
-        serDe = ReflectionUtils.newInstance(storageHandler.getSerDeClass(),context.getConfiguration());
+        serDe = ReflectionUtils.newInstance(storageHandler.getSerDeClass(), context.getConfiguration());
         hcatRecordOI = InternalUtil.createStructObjectInspector(jobInfo.getOutputSchema());
         try {
             InternalUtil.initializeOutputSerDe(serDe, context.getConfiguration(), jobInfo);
         } catch (SerDeException e) {
-            throw new IOException("Failed to initialize SerDe",e);
+            throw new IOException("Failed to initialize SerDe", e);
         }
     }
 
     @Override
     public void close(TaskAttemptContext context) throws IOException,
-            InterruptedException {
+        InterruptedException {
         getBaseRecordWriter().close(InternalUtil.createReporter(context));
     }
 
     @Override
     public void write(WritableComparable<?> key, HCatRecord value) throws IOException,
-            InterruptedException {
+        InterruptedException {
         try {
             getBaseRecordWriter().write(null, serDe.serialize(value.getAll(), hcatRecordOI));
         } catch (SerDeException e) {
-            throw new IOException("Failed to serialize object",e);
+            throw new IOException("Failed to serialize object", e);
         }
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/FileOutputCommitterContainer.java b/src/java/org/apache/hcatalog/mapreduce/FileOutputCommitterContainer.java
index e593842..8e692dc 100644
--- a/src/java/org/apache/hcatalog/mapreduce/FileOutputCommitterContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/FileOutputCommitterContainer.java
@@ -87,34 +87,34 @@
      * @throws IOException
      */
     public FileOutputCommitterContainer(JobContext context,
-                                                          org.apache.hadoop.mapred.OutputCommitter baseCommitter) throws IOException {
+                                        org.apache.hadoop.mapred.OutputCommitter baseCommitter) throws IOException {
         super(context, baseCommitter);
         jobInfo = HCatOutputFormat.getJobInfo(context);
         dynamicPartitioningUsed = jobInfo.isDynamicPartitioningUsed();
 
         this.partitionsDiscovered = !dynamicPartitioningUsed;
-        cachedStorageHandler = HCatUtil.getStorageHandler(context.getConfiguration(),jobInfo.getTableInfo().getStorerInfo());
+        cachedStorageHandler = HCatUtil.getStorageHandler(context.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
     }
 
     @Override
     public void abortTask(TaskAttemptContext context) throws IOException {
-        if (!dynamicPartitioningUsed){
+        if (!dynamicPartitioningUsed) {
             getBaseOutputCommitter().abortTask(HCatMapRedUtil.createTaskAttemptContext(context));
         }
     }
 
     @Override
     public void commitTask(TaskAttemptContext context) throws IOException {
-        if (!dynamicPartitioningUsed){
+        if (!dynamicPartitioningUsed) {
             getBaseOutputCommitter().commitTask(HCatMapRedUtil.createTaskAttemptContext(context));
         }
     }
 
     @Override
     public boolean needsTaskCommit(TaskAttemptContext context) throws IOException {
-        if (!dynamicPartitioningUsed){
+        if (!dynamicPartitioningUsed) {
             return getBaseOutputCommitter().needsTaskCommit(HCatMapRedUtil.createTaskAttemptContext(context));
-        }else{
+        } else {
             // called explicitly through FileRecordWriterContainer.close() if dynamic - return false by default
             return false;
         }
@@ -122,7 +122,7 @@
 
     @Override
     public void setupJob(JobContext context) throws IOException {
-        if(getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
+        if (getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
             getBaseOutputCommitter().setupJob(HCatMapRedUtil.createJobContext(context));
         }
         // in dynamic usecase, called through FileRecordWriterContainer
@@ -130,7 +130,7 @@
 
     @Override
     public void setupTask(TaskAttemptContext context) throws IOException {
-        if (!dynamicPartitioningUsed){
+        if (!dynamicPartitioningUsed) {
             getBaseOutputCommitter().setupTask(HCatMapRedUtil.createTaskAttemptContext(context));
         }
     }
@@ -138,16 +138,15 @@
     @Override
     public void abortJob(JobContext jobContext, State state) throws IOException {
         org.apache.hadoop.mapred.JobContext
-                mapRedJobContext = HCatMapRedUtil.createJobContext(jobContext);
-        if (dynamicPartitioningUsed){
+            mapRedJobContext = HCatMapRedUtil.createJobContext(jobContext);
+        if (dynamicPartitioningUsed) {
             discoverPartitions(jobContext);
         }
 
-        if(getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
+        if (getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
             getBaseOutputCommitter().abortJob(mapRedJobContext, state);
-        }
-        else if (dynamicPartitioningUsed){
-            for(JobContext currContext : contextDiscoveredByPath.values()){
+        } else if (dynamicPartitioningUsed) {
+            for (JobContext currContext : contextDiscoveredByPath.values()) {
                 try {
                     new JobConf(currContext.getConfiguration()).getOutputCommitter().abortJob(currContext, state);
                 } catch (Exception e) {
@@ -166,12 +165,12 @@
             // In the latter case the HCAT_KEY_TOKEN_SIGNATURE property in
             // the conf will not be set
             String tokenStrForm = client.getTokenStrForm();
-            if(tokenStrForm != null && jobContext.getConfiguration().get
-                    (HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
+            if (tokenStrForm != null && jobContext.getConfiguration().get
+                (HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
                 client.cancelDelegationToken(tokenStrForm);
             }
-        } catch(Exception e) {
-            if( e instanceof HCatException ) {
+        } catch (Exception e) {
+            if (e instanceof HCatException) {
                 throw (HCatException) e;
             } else {
                 throw new HCatException(ErrorType.ERROR_PUBLISHING_PARTITION, e);
@@ -182,10 +181,10 @@
 
         Path src;
         OutputJobInfo jobInfo = HCatOutputFormat.getJobInfo(jobContext);
-        if (dynamicPartitioningUsed){
+        if (dynamicPartitioningUsed) {
             src = new Path(getPartitionRootLocation(jobInfo.getLocation(),
                 jobInfo.getTableInfo().getTable().getPartitionKeysSize()));
-        }else{
+        } else {
             src = new Path(jobInfo.getLocation());
         }
         FileSystem fs = src.getFileSystem(jobContext.getConfiguration());
@@ -195,31 +194,31 @@
 
     public static final String SUCCEEDED_FILE_NAME = "_SUCCESS";
     static final String SUCCESSFUL_JOB_OUTPUT_DIR_MARKER =
-            "mapreduce.fileoutputcommitter.marksuccessfuljobs";
+        "mapreduce.fileoutputcommitter.marksuccessfuljobs";
 
     private static boolean getOutputDirMarking(Configuration conf) {
         return conf.getBoolean(SUCCESSFUL_JOB_OUTPUT_DIR_MARKER,
-                false);
+            false);
     }
 
     @Override
     public void commitJob(JobContext jobContext) throws IOException {
-        if (dynamicPartitioningUsed){
+        if (dynamicPartitioningUsed) {
             discoverPartitions(jobContext);
         }
-        if(getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
+        if (getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
             getBaseOutputCommitter().commitJob(HCatMapRedUtil.createJobContext(jobContext));
         }
         // create _SUCCESS FILE if so requested.
         OutputJobInfo jobInfo = HCatOutputFormat.getJobInfo(jobContext);
-        if(getOutputDirMarking(jobContext.getConfiguration())) {
+        if (getOutputDirMarking(jobContext.getConfiguration())) {
             Path outputPath = new Path(jobInfo.getLocation());
             if (outputPath != null) {
                 FileSystem fileSys = outputPath.getFileSystem(jobContext.getConfiguration());
                 // create a file in the folder to mark it
                 if (fileSys.exists(outputPath)) {
                     Path filePath = new Path(outputPath, SUCCEEDED_FILE_NAME);
-                    if(!fileSys.exists(filePath)) { // may have been created by baseCommitter.commitJob()
+                    if (!fileSys.exists(filePath)) { // may have been created by baseCommitter.commitJob()
                         fileSys.create(filePath).close();
                     }
                 }
@@ -231,7 +230,7 @@
     @Override
     public void cleanupJob(JobContext context) throws IOException {
 
-        if (dynamicPartitioningUsed){
+        if (dynamicPartitioningUsed) {
             discoverPartitions(context);
         }
 
@@ -242,13 +241,12 @@
         Path tblPath = new Path(table.getTTable().getSd().getLocation());
         FileSystem fs = tblPath.getFileSystem(conf);
 
-        if( table.getPartitionKeys().size() == 0 ) {
+        if (table.getPartitionKeys().size() == 0) {
             //non partitioned table
-            if(getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
-               getBaseOutputCommitter().cleanupJob(HCatMapRedUtil.createJobContext(context));
-            }
-            else if (dynamicPartitioningUsed){
-                for(JobContext currContext : contextDiscoveredByPath.values()){
+            if (getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
+                getBaseOutputCommitter().cleanupJob(HCatMapRedUtil.createJobContext(context));
+            } else if (dynamicPartitioningUsed) {
+                for (JobContext currContext : contextDiscoveredByPath.values()) {
                     try {
                         JobConf jobConf = new JobConf(currContext.getConfiguration());
                         jobConf.getOutputCommitter().cleanupJob(currContext);
@@ -285,35 +283,35 @@
             FsPermission perms = tblStat.getPermission();
 
             List<Partition> partitionsToAdd = new ArrayList<Partition>();
-            if (!dynamicPartitioningUsed){
+            if (!dynamicPartitioningUsed) {
                 partitionsToAdd.add(
-                        constructPartition(
-                                context,
-                                tblPath.toString(), jobInfo.getPartitionValues()
-                                ,jobInfo.getOutputSchema(), getStorerParameterMap(storer)
-                                ,table, fs
-                                ,grpName,perms));
-            }else{
-                for (Entry<String,Map<String,String>> entry : partitionsDiscoveredByPath.entrySet()){
+                    constructPartition(
+                        context,
+                        tblPath.toString(), jobInfo.getPartitionValues()
+                        , jobInfo.getOutputSchema(), getStorerParameterMap(storer)
+                        , table, fs
+                        , grpName, perms));
+            } else {
+                for (Entry<String, Map<String, String>> entry : partitionsDiscoveredByPath.entrySet()) {
                     partitionsToAdd.add(
-                            constructPartition(
-                                    context,
-                                    getPartitionRootLocation(entry.getKey(),entry.getValue().size()), entry.getValue()
-                                    ,jobInfo.getOutputSchema(), getStorerParameterMap(storer)
-                                    ,table, fs
-                                    ,grpName,perms));
+                        constructPartition(
+                            context,
+                            getPartitionRootLocation(entry.getKey(), entry.getValue().size()), entry.getValue()
+                            , jobInfo.getOutputSchema(), getStorerParameterMap(storer)
+                            , table, fs
+                            , grpName, perms));
                 }
             }
 
             //Publish the new partition(s)
-            if (dynamicPartitioningUsed && harProcessor.isEnabled() && (!partitionsToAdd.isEmpty())){
+            if (dynamicPartitioningUsed && harProcessor.isEnabled() && (!partitionsToAdd.isEmpty())) {
 
                 Path src = new Path(ptnRootLocation);
 
                 // check here for each dir we're copying out, to see if it already exists, error out if so
-                moveTaskOutputs(fs, src, src, tblPath,true);
+                moveTaskOutputs(fs, src, src, tblPath, true);
 
-                moveTaskOutputs(fs, src, src, tblPath,false);
+                moveTaskOutputs(fs, src, src, tblPath, false);
                 fs.delete(src, true);
 
 
@@ -326,18 +324,18 @@
                 try {
                     client.add_partitions(partitionsToAdd);
                     partitionsAdded = partitionsToAdd;
-                } catch (Exception e){
+                } catch (Exception e) {
                     // There was an error adding partitions : rollback fs copy and rethrow
-                    for (Partition p : partitionsToAdd){
+                    for (Partition p : partitionsToAdd) {
                         Path ptnPath = new Path(harProcessor.getParentFSPath(new Path(p.getSd().getLocation())));
-                        if (fs.exists(ptnPath)){
-                            fs.delete(ptnPath,true);
+                        if (fs.exists(ptnPath)) {
+                            fs.delete(ptnPath, true);
                         }
                     }
                     throw e;
                 }
 
-            }else{
+            } else {
                 // no harProcessor, regular operation
 
                 // No duplicate partition publish case to worry about because we'll
@@ -346,37 +344,37 @@
                 client.add_partitions(partitionsToAdd);
                 partitionsAdded = partitionsToAdd;
 
-                if (dynamicPartitioningUsed && (partitionsAdded.size()>0)){
+                if (dynamicPartitioningUsed && (partitionsAdded.size() > 0)) {
                     Path src = new Path(ptnRootLocation);
-                    moveTaskOutputs(fs, src, src, tblPath,false);
+                    moveTaskOutputs(fs, src, src, tblPath, false);
                     fs.delete(src, true);
                 }
 
             }
 
-            if(getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
+            if (getBaseOutputCommitter() != null && !dynamicPartitioningUsed) {
                 getBaseOutputCommitter().cleanupJob(HCatMapRedUtil.createJobContext(context));
             }
 
-            if(Security.getInstance().isSecurityEnabled()) {
+            if (Security.getInstance().isSecurityEnabled()) {
                 Security.getInstance().cancelToken(client, context);
             }
         } catch (Exception e) {
 
-            if( partitionsAdded.size() > 0 ) {
+            if (partitionsAdded.size() > 0) {
                 try {
                     //baseCommitter.cleanupJob failed, try to clean up the metastore
-                    for (Partition p : partitionsAdded){
+                    for (Partition p : partitionsAdded) {
                         client.dropPartition(tableInfo.getDatabaseName(),
-                                tableInfo.getTableName(), p.getValues());
+                            tableInfo.getTableName(), p.getValues());
                     }
-                } catch(Exception te) {
+                } catch (Exception te) {
                     //Keep cause as the original exception
                     throw new HCatException(ErrorType.ERROR_PUBLISHING_PARTITION, e);
                 }
             }
 
-            if( e instanceof HCatException ) {
+            if (e instanceof HCatException) {
                 throw (HCatException) e;
             } else {
                 throw new HCatException(ErrorType.ERROR_PUBLISHING_PARTITION, e);
@@ -386,11 +384,11 @@
         }
     }
 
-    private String getPartitionRootLocation(String ptnLocn,int numPtnKeys) {
-        if (ptnRootLocation  == null){
+    private String getPartitionRootLocation(String ptnLocn, int numPtnKeys) {
+        if (ptnRootLocation == null) {
             // we only need to calculate it once, it'll be the same for other partitions in this job.
             Path ptnRoot = new Path(ptnLocn);
-            for (int i = 0; i < numPtnKeys; i++){
+            for (int i = 0; i < numPtnKeys; i++) {
 //          LOG.info("Getting parent of "+ptnRoot.getName());
                 ptnRoot = ptnRoot.getParent();
             }
@@ -416,11 +414,11 @@
      */
 
     private Partition constructPartition(
-            JobContext context,
-            String partLocnRoot, Map<String,String> partKVs,
-            HCatSchema outputSchema, Map<String, String> params,
-            Table table, FileSystem fs,
-            String grpName, FsPermission perms) throws IOException {
+        JobContext context,
+        String partLocnRoot, Map<String, String> partKVs,
+        HCatSchema outputSchema, Map<String, String> params,
+        Table table, FileSystem fs,
+        String grpName, FsPermission perms) throws IOException {
 
         Partition partition = new Partition();
         partition.setDbName(table.getDbName());
@@ -428,7 +426,7 @@
         partition.setSd(new StorageDescriptor(table.getTTable().getSd()));
 
         List<FieldSchema> fields = new ArrayList<FieldSchema>();
-        for(HCatFieldSchema fieldSchema : outputSchema.getFields()) {
+        for (HCatFieldSchema fieldSchema : outputSchema.getFields()) {
             fields.add(HCatSchemaUtils.getFieldSchema(fieldSchema));
         }
 
@@ -450,16 +448,16 @@
         }
         // Apply the group and permissions to the leaf partition and files.
         applyGroupAndPerms(fs, partPath, perms, grpName, true);
-        if (dynamicPartitioningUsed){
-            String dynamicPartitionDestination = getFinalDynamicPartitionDestination(table,partKVs);
-            if (harProcessor.isEnabled()){
+        if (dynamicPartitioningUsed) {
+            String dynamicPartitionDestination = getFinalDynamicPartitionDestination(table, partKVs);
+            if (harProcessor.isEnabled()) {
                 harProcessor.exec(context, partition, partPath);
                 partition.getSd().setLocation(
-                        harProcessor.getProcessedLocation(new Path(dynamicPartitionDestination)));
-            }else{
+                    harProcessor.getProcessedLocation(new Path(dynamicPartitionDestination)));
+            } else {
                 partition.getSd().setLocation(dynamicPartitionDestination);
             }
-        }else{
+        } else {
             partition.getSd().setLocation(partPath.toString());
         }
 
@@ -467,8 +465,8 @@
     }
 
     private void applyGroupAndPerms(FileSystem fs, Path dir, FsPermission permission,
-            String group, boolean recursive)
-            throws IOException {
+                                    String group, boolean recursive)
+        throws IOException {
         fs.setPermission(dir, permission);
         try {
             fs.setOwner(dir, null, group);
@@ -491,11 +489,11 @@
         }
     }
 
-    private String getFinalDynamicPartitionDestination(Table table, Map<String,String> partKVs) {
+    private String getFinalDynamicPartitionDestination(Table table, Map<String, String> partKVs) {
         // file:///tmp/hcat_junit_warehouse/employee/_DYN0.7770480401313761/emp_country=IN/emp_state=KA  ->
         // file:///tmp/hcat_junit_warehouse/employee/emp_country=IN/emp_state=KA
         Path partPath = new Path(table.getTTable().getSd().getLocation());
-        for(FieldSchema partKey : table.getPartitionKeys()){
+        for (FieldSchema partKey : table.getPartitionKeys()) {
             partPath = constructPartialPartPath(partPath, partKey.getName().toLowerCase(), partKVs);
         }
         return partPath.toString();
@@ -505,13 +503,13 @@
         Map<String, String> params = new HashMap<String, String>();
 
         //Copy table level hcat.* keys to the partition
-        for(Entry<Object, Object> entry : storer.getProperties().entrySet()) {
+        for (Entry<Object, Object> entry : storer.getProperties().entrySet()) {
             params.put(entry.getKey().toString(), entry.getValue().toString());
         }
         return params;
     }
 
-    private Path constructPartialPartPath(Path partialPath, String partKey, Map<String,String> partKVs){
+    private Path constructPartialPartPath(Path partialPath, String partKey, Map<String, String> partKVs) {
 
         StringBuilder sb = new StringBuilder(FileUtils.escapePathName(partKey));
         sb.append("=");
@@ -534,7 +532,7 @@
 
         List<FieldSchema> newColumns = HCatUtil.validatePartitionSchema(table, partitionSchema);
 
-        if( newColumns.size() != 0 ) {
+        if (newColumns.size() != 0) {
             List<FieldSchema> tableColumns = new ArrayList<FieldSchema>(table.getTTable().getSd().getCols());
             tableColumns.addAll(newColumns);
 
@@ -561,12 +559,12 @@
         if (fs.isFile(file)) {
             Path finalOutputPath = getFinalPath(file, src, dest);
 
-            if (dryRun){
+            if (dryRun) {
 //        LOG.info("Testing if moving ["+file+"] to ["+finalOutputPath+"] would cause a problem");
-                if (fs.exists(finalOutputPath)){
+                if (fs.exists(finalOutputPath)) {
                     throw new HCatException(ErrorType.ERROR_MOVE_FAILED, "Data already exists in " + finalOutputPath + ", duplicate publish possible.");
                 }
-            }else{
+            } else {
 //        LOG.info("Moving ["+file+"] to ["+finalOutputPath+"]");
                 if (!fs.rename(file, finalOutputPath)) {
                     if (!fs.delete(finalOutputPath, true)) {
@@ -577,15 +575,15 @@
                     }
                 }
             }
-        } else if(fs.getFileStatus(file).isDir()) {
+        } else if (fs.getFileStatus(file).isDir()) {
             FileStatus[] paths = fs.listStatus(file);
             Path finalOutputPath = getFinalPath(file, src, dest);
-            if (!dryRun){
+            if (!dryRun) {
                 fs.mkdirs(finalOutputPath);
             }
             if (paths != null) {
                 for (FileStatus path : paths) {
-                    moveTaskOutputs(fs, path.getPath(), src, dest,dryRun);
+                    moveTaskOutputs(fs, path.getPath(), src, dest, dryRun);
                 }
             }
         }
@@ -606,7 +604,7 @@
         URI relativePath = src.toUri().relativize(taskOutputUri);
         if (taskOutputUri == relativePath) {
             throw new HCatException(ErrorType.ERROR_MOVE_FAILED, "Can not get the relative path: base = " +
-                    src + " child = " + file);
+                src + " child = " + file);
         }
         if (relativePath.getPath().length() > 0) {
             return new Path(dest, relativePath.getPath());
@@ -619,7 +617,7 @@
      * Run to discover dynamic partitions available
      */
     private void discoverPartitions(JobContext context) throws IOException {
-        if (!partitionsDiscovered){
+        if (!partitionsDiscovered) {
             //      LOG.info("discover ptns called");
             OutputJobInfo jobInfo = HCatOutputFormat.getJobInfo(context);
 
@@ -639,33 +637,33 @@
             Path pathPattern = new Path(dynPathSpec);
             FileStatus[] status = fs.globStatus(pathPattern);
 
-            partitionsDiscoveredByPath = new LinkedHashMap<String,Map<String, String>>();
-            contextDiscoveredByPath = new LinkedHashMap<String,JobContext>();
+            partitionsDiscoveredByPath = new LinkedHashMap<String, Map<String, String>>();
+            contextDiscoveredByPath = new LinkedHashMap<String, JobContext>();
 
 
             if (status.length == 0) {
                 //        LOG.warn("No partition found genereated by dynamic partitioning in ["
                 //            +loadPath+"] with depth["+jobInfo.getTable().getPartitionKeysSize()
                 //            +"], dynSpec["+dynPathSpec+"]");
-            }else{
-                if ((maxDynamicPartitions != -1) && (status.length > maxDynamicPartitions)){
+            } else {
+                if ((maxDynamicPartitions != -1) && (status.length > maxDynamicPartitions)) {
                     this.partitionsDiscovered = true;
                     throw new HCatException(ErrorType.ERROR_TOO_MANY_DYNAMIC_PTNS,
-                            "Number of dynamic partitions being created "
-                                    + "exceeds configured max allowable partitions["
-                                    + maxDynamicPartitions
-                                    + "], increase parameter ["
-                                    + HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS.varname
-                                    + "] if needed.");
+                        "Number of dynamic partitions being created "
+                            + "exceeds configured max allowable partitions["
+                            + maxDynamicPartitions
+                            + "], increase parameter ["
+                            + HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS.varname
+                            + "] if needed.");
                 }
 
-                for (FileStatus st : status){
+                for (FileStatus st : status) {
                     LinkedHashMap<String, String> fullPartSpec = new LinkedHashMap<String, String>();
                     Warehouse.makeSpecFromName(fullPartSpec, st.getPath());
-                    partitionsDiscoveredByPath.put(st.getPath().toString(),fullPartSpec);
-                    JobContext currContext = HCatHadoopShims.Instance.get().createJobContext(context.getConfiguration(),context.getJobID());
+                    partitionsDiscoveredByPath.put(st.getPath().toString(), fullPartSpec);
+                    JobContext currContext = HCatHadoopShims.Instance.get().createJobContext(context.getConfiguration(), context.getJobID());
                     HCatOutputFormat.configureOutputStorageHandler(context, jobInfo, fullPartSpec);
-                    contextDiscoveredByPath.put(st.getPath().toString(),currContext);
+                    contextDiscoveredByPath.put(st.getPath().toString(), currContext);
                 }
             }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/FileOutputFormatContainer.java b/src/java/org/apache/hcatalog/mapreduce/FileOutputFormatContainer.java
index 0af8650..22d73da 100644
--- a/src/java/org/apache/hcatalog/mapreduce/FileOutputFormatContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/FileOutputFormatContainer.java
@@ -58,11 +58,11 @@
  */
 class FileOutputFormatContainer extends OutputFormatContainer {
 
-    private static final PathFilter hiddenFileFilter = new PathFilter(){
-      public boolean accept(Path p){
-        String name = p.getName();
-        return !name.startsWith("_") && !name.startsWith(".");
-      }
+    private static final PathFilter hiddenFileFilter = new PathFilter() {
+        public boolean accept(Path p) {
+            String name = p.getName();
+            return !name.startsWith("_") && !name.startsWith(".");
+        }
     };
 
     /**
@@ -80,32 +80,32 @@
         //Configure the output key and value classes.
         // This is required for writing null as key for file based tables.
         context.getConfiguration().set("mapred.output.key.class",
-                NullWritable.class.getName());
+            NullWritable.class.getName());
         String jobInfoString = context.getConfiguration().get(
-                HCatConstants.HCAT_KEY_OUTPUT_INFO);
+            HCatConstants.HCAT_KEY_OUTPUT_INFO);
         OutputJobInfo jobInfo = (OutputJobInfo) HCatUtil
-                .deserialize(jobInfoString);
+            .deserialize(jobInfoString);
         StorerInfo storeInfo = jobInfo.getTableInfo().getStorerInfo();
         HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(
-                context.getConfiguration(), storeInfo);
+            context.getConfiguration(), storeInfo);
         Class<? extends SerDe> serde = storageHandler.getSerDeClass();
         SerDe sd = (SerDe) ReflectionUtils.newInstance(serde,
-                context.getConfiguration());
+            context.getConfiguration());
         context.getConfiguration().set("mapred.output.value.class",
-                sd.getSerializedClass().getName());
+            sd.getSerializedClass().getName());
 
         // When Dynamic partitioning is used, the RecordWriter instance initialized here isn't used. Can use null.
         // (That's because records can't be written until the values of the dynamic partitions are deduced.
         // By that time, a new local instance of RecordWriter, with the correct output-path, will be constructed.)
         RecordWriter<WritableComparable<?>, HCatRecord> rw =
             new FileRecordWriterContainer(
-                HCatBaseOutputFormat.getJobInfo(context).isDynamicPartitioningUsed()?
-                    null:
+                HCatBaseOutputFormat.getJobInfo(context).isDynamicPartitioningUsed() ?
+                    null :
                     getBaseOutputFormat()
-                            .getRecordWriter(null,
-                                                     new JobConf(context.getConfiguration()),
-                                                                         FileOutputFormat.getUniqueName(new JobConf(context.getConfiguration()), "part"),
-                                                                         InternalUtil.createReporter(context)),
+                        .getRecordWriter(null,
+                            new JobConf(context.getConfiguration()),
+                            FileOutputFormat.getUniqueName(new JobConf(context.getConfiguration()), "part"),
+                            InternalUtil.createReporter(context)),
                 context);
         return rw;
     }
@@ -118,9 +118,9 @@
             HiveConf hiveConf = HCatUtil.getHiveConf(context.getConfiguration());
             client = HCatUtil.getHiveClient(hiveConf);
             handleDuplicatePublish(context,
-                    jobInfo,
-                    client,
-                    new Table(jobInfo.getTableInfo().getTable()));
+                jobInfo,
+                client,
+                new Table(jobInfo.getTableInfo().getTable()));
         } catch (MetaException e) {
             throw new IOException(e);
         } catch (TException e) {
@@ -131,11 +131,11 @@
             HCatUtil.closeHiveClientQuietly(client);
         }
 
-        if(!jobInfo.isDynamicPartitioningUsed()) {
+        if (!jobInfo.isDynamicPartitioningUsed()) {
             JobConf jobConf = new JobConf(context.getConfiguration());
             getBaseOutputFormat().checkOutputSpecs(null, jobConf);
             //checkoutputspecs might've set some properties we need to have context reflect that
-            HCatUtil.copyConf(jobConf,context.getConfiguration());
+            HCatUtil.copyConf(jobConf, context.getConfiguration());
         }
     }
 
@@ -144,9 +144,9 @@
         //this needs to be manually set, under normal circumstances MR Task does this
         setWorkOutputPath(context);
         return new FileOutputCommitterContainer(context,
-               HCatBaseOutputFormat.getJobInfo(context).isDynamicPartitioningUsed()?
-                       null:
-                       new JobConf(context.getConfiguration()).getOutputCommitter());
+            HCatBaseOutputFormat.getJobInfo(context).isDynamicPartitioningUsed() ?
+                null :
+                new JobConf(context.getConfiguration()).getOutputCommitter());
     }
 
     /**
@@ -162,7 +162,7 @@
      * @throws org.apache.thrift.TException
      */
     private static void handleDuplicatePublish(JobContext context, OutputJobInfo outputInfo,
-      HiveMetaStoreClient client, Table table) throws IOException, MetaException, TException, NoSuchObjectException {
+                                               HiveMetaStoreClient client, Table table) throws IOException, MetaException, TException, NoSuchObjectException {
 
         /*
         * For fully specified ptn, follow strict checks for existence of partitions in metadata
@@ -173,32 +173,32 @@
         *    there are a large number of partitions that match the partial specifications
         */
 
-        if( table.getPartitionKeys().size() > 0 ) {
-            if (!outputInfo.isDynamicPartitioningUsed()){
+        if (table.getPartitionKeys().size() > 0) {
+            if (!outputInfo.isDynamicPartitioningUsed()) {
                 List<String> partitionValues = getPartitionValueList(
-                        table, outputInfo.getPartitionValues());
+                    table, outputInfo.getPartitionValues());
                 // fully-specified partition
                 List<String> currentParts = client.listPartitionNames(outputInfo.getDatabaseName(),
-                        outputInfo.getTableName(), partitionValues, (short) 1);
+                    outputInfo.getTableName(), partitionValues, (short) 1);
 
-                if( currentParts.size() > 0 ) {
+                if (currentParts.size() > 0) {
                     throw new HCatException(ErrorType.ERROR_DUPLICATE_PARTITION);
                 }
             }
         } else {
             List<String> partitionValues = getPartitionValueList(
-                    table, outputInfo.getPartitionValues());
+                table, outputInfo.getPartitionValues());
             // non-partitioned table
 
             Path tablePath = new Path(table.getTTable().getSd().getLocation());
             FileSystem fs = tablePath.getFileSystem(context.getConfiguration());
 
-            if ( fs.exists(tablePath) ) {
+            if (fs.exists(tablePath)) {
                 FileStatus[] status = fs.globStatus(new Path(tablePath, "*"), hiddenFileFilter);
 
-                if( status.length > 0 ) {
+                if (status.length > 0) {
                     throw new HCatException(ErrorType.ERROR_NON_EMPTY_TABLE,
-                            table.getDbName() + "." + table.getTableName());
+                        table.getDbName() + "." + table.getTableName());
                 }
             }
         }
@@ -213,22 +213,22 @@
      */
     static List<String> getPartitionValueList(Table table, Map<String, String> valueMap) throws IOException {
 
-        if( valueMap.size() != table.getPartitionKeys().size() ) {
+        if (valueMap.size() != table.getPartitionKeys().size()) {
             throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES,
-                    "Table "
-                            + table.getTableName() + " has " +
-                            table.getPartitionKeys().size() + " partition keys, got "+
-                            valueMap.size());
+                "Table "
+                    + table.getTableName() + " has " +
+                    table.getPartitionKeys().size() + " partition keys, got " +
+                    valueMap.size());
         }
 
         List<String> values = new ArrayList<String>();
 
-        for(FieldSchema schema : table.getPartitionKeys()) {
+        for (FieldSchema schema : table.getPartitionKeys()) {
             String value = valueMap.get(schema.getName().toLowerCase());
 
-            if( value == null ) {
+            if (value == null) {
                 throw new HCatException(ErrorType.ERROR_MISSING_PARTITION_KEY,
-                        "Key " + schema.getName() + " of table " + table.getTableName());
+                    "Key " + schema.getName() + " of table " + table.getTableName());
             }
 
             values.add(value);
@@ -241,8 +241,8 @@
         String outputPath = context.getConfiguration().get("mapred.output.dir");
         //we need to do this to get the task path and set it for mapred implementation
         //since it can't be done automatically because of mapreduce->mapred abstraction
-        if(outputPath != null)
+        if (outputPath != null)
             context.getConfiguration().set("mapred.work.output.dir",
-                    new FileOutputCommitter(new Path(outputPath), context).getWorkPath().toString());
+                new FileOutputCommitter(new Path(outputPath), context).getWorkPath().toString());
     }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/FileRecordWriterContainer.java b/src/java/org/apache/hcatalog/mapreduce/FileRecordWriterContainer.java
index 9e21316..b69e2a7 100644
--- a/src/java/org/apache/hcatalog/mapreduce/FileRecordWriterContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/FileRecordWriterContainer.java
@@ -80,17 +80,17 @@
      */
     public FileRecordWriterContainer(org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable> baseWriter,
                                      TaskAttemptContext context) throws IOException, InterruptedException {
-        super(context,baseWriter);
+        super(context, baseWriter);
         this.context = context;
         jobInfo = HCatOutputFormat.getJobInfo(context);
 
         storageHandler = HCatUtil.getStorageHandler(context.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
-        serDe = ReflectionUtils.newInstance(storageHandler.getSerDeClass(),context.getConfiguration());
+        serDe = ReflectionUtils.newInstance(storageHandler.getSerDeClass(), context.getConfiguration());
         objectInspector = InternalUtil.createStructObjectInspector(jobInfo.getOutputSchema());
         try {
             InternalUtil.initializeOutputSerDe(serDe, context.getConfiguration(), jobInfo);
         } catch (SerDeException e) {
-            throw new IOException("Failed to inialize SerDe",e);
+            throw new IOException("Failed to inialize SerDe", e);
         }
 
         // If partition columns occur in data, we want to remove them.
@@ -99,9 +99,9 @@
         dynamicPartCols = jobInfo.getPosOfDynPartCols();
         maxDynamicPartitions = jobInfo.getMaxDynamicPartitions();
 
-        if((partColsToDel == null) || (dynamicPartitioningUsed && (dynamicPartCols == null))){
+        if ((partColsToDel == null) || (dynamicPartitioningUsed && (dynamicPartCols == null))) {
             throw new HCatException("It seems that setSchema() is not called on " +
-                    "HCatOutputFormat. Please make sure that method is called.");
+                "HCatOutputFormat. Please make sure that method is called.");
         }
 
 
@@ -112,10 +112,9 @@
             this.dynamicContexts = null;
             this.dynamicObjectInspectors = null;
             this.dynamicOutputJobInfo = null;
-        }
-        else {
-            this.baseDynamicSerDe = new HashMap<String,SerDe>();
-            this.baseDynamicWriters = new HashMap<String,org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable>>();
+        } else {
+            this.baseDynamicSerDe = new HashMap<String, SerDe>();
+            this.baseDynamicWriters = new HashMap<String, org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable>>();
             this.baseDynamicCommitters = new HashMap<String, org.apache.hadoop.mapred.OutputCommitter>();
             this.dynamicContexts = new HashMap<String, org.apache.hadoop.mapred.TaskAttemptContext>();
             this.dynamicObjectInspectors = new HashMap<String, ObjectInspector>();
@@ -132,17 +131,17 @@
 
     @Override
     public void close(TaskAttemptContext context) throws IOException,
-            InterruptedException {
+        InterruptedException {
         Reporter reporter = InternalUtil.createReporter(context);
-        if (dynamicPartitioningUsed){
-            for (org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable> bwriter : baseDynamicWriters.values()){
+        if (dynamicPartitioningUsed) {
+            for (org.apache.hadoop.mapred.RecordWriter<? super WritableComparable<?>, ? super Writable> bwriter : baseDynamicWriters.values()) {
                 //We are in RecordWriter.close() make sense that the context would be TaskInputOutput
                 bwriter.close(reporter);
             }
-            for(Map.Entry<String,org.apache.hadoop.mapred.OutputCommitter>entry : baseDynamicCommitters.entrySet()) {
+            for (Map.Entry<String, org.apache.hadoop.mapred.OutputCommitter> entry : baseDynamicCommitters.entrySet()) {
                 org.apache.hadoop.mapred.TaskAttemptContext currContext = dynamicContexts.get(entry.getKey());
                 OutputCommitter baseOutputCommitter = entry.getValue();
-                if (baseOutputCommitter.needsTaskCommit(currContext)){
+                if (baseOutputCommitter.needsTaskCommit(currContext)) {
                     baseOutputCommitter.commitTask(currContext);
                 }
                 org.apache.hadoop.mapred.JobContext currJobContext = HCatMapRedUtil.createJobContext(currContext);
@@ -155,93 +154,92 @@
 
     @Override
     public void write(WritableComparable<?> key, HCatRecord value) throws IOException,
-            InterruptedException {
+        InterruptedException {
 
         org.apache.hadoop.mapred.RecordWriter localWriter;
         ObjectInspector localObjectInspector;
         SerDe localSerDe;
         OutputJobInfo localJobInfo = null;
 
-        if (dynamicPartitioningUsed){
+        if (dynamicPartitioningUsed) {
             // calculate which writer to use from the remaining values - this needs to be done before we delete cols
             List<String> dynamicPartValues = new ArrayList<String>();
-            for (Integer colToAppend :  dynamicPartCols){
+            for (Integer colToAppend : dynamicPartCols) {
                 dynamicPartValues.add(value.get(colToAppend).toString());
             }
 
             String dynKey = dynamicPartValues.toString();
-            if (!baseDynamicWriters.containsKey(dynKey)){
-                if ((maxDynamicPartitions != -1) && (baseDynamicWriters.size() > maxDynamicPartitions)){
+            if (!baseDynamicWriters.containsKey(dynKey)) {
+                if ((maxDynamicPartitions != -1) && (baseDynamicWriters.size() > maxDynamicPartitions)) {
                     throw new HCatException(ErrorType.ERROR_TOO_MANY_DYNAMIC_PTNS,
-                            "Number of dynamic partitions being created "
-                                    + "exceeds configured max allowable partitions["
-                                    + maxDynamicPartitions
-                                    + "], increase parameter ["
-                                    + HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS.varname
-                                    + "] if needed.");
+                        "Number of dynamic partitions being created "
+                            + "exceeds configured max allowable partitions["
+                            + maxDynamicPartitions
+                            + "], increase parameter ["
+                            + HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS.varname
+                            + "] if needed.");
                 }
 
                 org.apache.hadoop.mapred.TaskAttemptContext currTaskContext = HCatMapRedUtil.createTaskAttemptContext(context);
                 configureDynamicStorageHandler(currTaskContext, dynamicPartValues);
-                localJobInfo= HCatBaseOutputFormat.getJobInfo(currTaskContext);
+                localJobInfo = HCatBaseOutputFormat.getJobInfo(currTaskContext);
 
                 //setup serDe
                 SerDe currSerDe = ReflectionUtils.newInstance(storageHandler.getSerDeClass(), currTaskContext.getJobConf());
                 try {
                     InternalUtil.initializeOutputSerDe(currSerDe, currTaskContext.getConfiguration(), localJobInfo);
                 } catch (SerDeException e) {
-                    throw new IOException("Failed to initialize SerDe",e);
+                    throw new IOException("Failed to initialize SerDe", e);
                 }
 
                 //create base OutputFormat
                 org.apache.hadoop.mapred.OutputFormat baseOF =
-                        ReflectionUtils.newInstance(storageHandler.getOutputFormatClass(), currTaskContext.getJobConf());
+                    ReflectionUtils.newInstance(storageHandler.getOutputFormatClass(), currTaskContext.getJobConf());
                 //check outputSpecs
-                baseOF.checkOutputSpecs(null,currTaskContext.getJobConf());
+                baseOF.checkOutputSpecs(null, currTaskContext.getJobConf());
                 //get Output Committer
-                org.apache.hadoop.mapred.OutputCommitter baseOutputCommitter =  currTaskContext.getJobConf().getOutputCommitter();
+                org.apache.hadoop.mapred.OutputCommitter baseOutputCommitter = currTaskContext.getJobConf().getOutputCommitter();
                 //create currJobContext the latest so it gets all the config changes
                 org.apache.hadoop.mapred.JobContext currJobContext = HCatMapRedUtil.createJobContext(currTaskContext);
                 //setupJob()
                 baseOutputCommitter.setupJob(currJobContext);
                 //recreate to refresh jobConf of currTask context
                 currTaskContext =
-                        HCatMapRedUtil.createTaskAttemptContext(currJobContext.getJobConf(),
-                                                                                        currTaskContext.getTaskAttemptID(),
-                                                                                        currTaskContext.getProgressible());
+                    HCatMapRedUtil.createTaskAttemptContext(currJobContext.getJobConf(),
+                        currTaskContext.getTaskAttemptID(),
+                        currTaskContext.getProgressible());
                 //set temp location
                 currTaskContext.getConfiguration().set("mapred.work.output.dir",
-                                new FileOutputCommitter(new Path(localJobInfo.getLocation()),currTaskContext).getWorkPath().toString());
+                    new FileOutputCommitter(new Path(localJobInfo.getLocation()), currTaskContext).getWorkPath().toString());
                 //setupTask()
                 baseOutputCommitter.setupTask(currTaskContext);
 
                 org.apache.hadoop.mapred.RecordWriter baseRecordWriter =
-                        baseOF.getRecordWriter(null,
-                                                            currTaskContext.getJobConf(),
-                                                            FileOutputFormat.getUniqueFile(currTaskContext, "part", ""),
-                                                            InternalUtil.createReporter(currTaskContext));
+                    baseOF.getRecordWriter(null,
+                        currTaskContext.getJobConf(),
+                        FileOutputFormat.getUniqueFile(currTaskContext, "part", ""),
+                        InternalUtil.createReporter(currTaskContext));
 
                 baseDynamicWriters.put(dynKey, baseRecordWriter);
-                baseDynamicSerDe.put(dynKey,currSerDe);
-                baseDynamicCommitters.put(dynKey,baseOutputCommitter);
-                dynamicContexts.put(dynKey,currTaskContext);
-                dynamicObjectInspectors.put(dynKey,InternalUtil.createStructObjectInspector(jobInfo.getOutputSchema()));
+                baseDynamicSerDe.put(dynKey, currSerDe);
+                baseDynamicCommitters.put(dynKey, baseOutputCommitter);
+                dynamicContexts.put(dynKey, currTaskContext);
+                dynamicObjectInspectors.put(dynKey, InternalUtil.createStructObjectInspector(jobInfo.getOutputSchema()));
                 dynamicOutputJobInfo.put(dynKey, HCatOutputFormat.getJobInfo(dynamicContexts.get(dynKey)));
             }
-            
+
             localJobInfo = dynamicOutputJobInfo.get(dynKey);
             localWriter = baseDynamicWriters.get(dynKey);
             localSerDe = baseDynamicSerDe.get(dynKey);
             localObjectInspector = dynamicObjectInspectors.get(dynKey);
-        }
-        else{
+        } else {
             localJobInfo = jobInfo;
             localWriter = getBaseRecordWriter();
             localSerDe = serDe;
             localObjectInspector = objectInspector;
         }
 
-        for(Integer colToDel : partColsToDel){
+        for (Integer colToDel : partColsToDel) {
             value.remove(colToDel);
         }
 
@@ -250,7 +248,7 @@
         try {
             localWriter.write(NullWritable.get(), localSerDe.serialize(value.getAll(), localObjectInspector));
         } catch (SerDeException e) {
-            throw new IOException("Failed to serialize object",e);
+            throw new IOException("Failed to serialize object", e);
         }
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/FosterStorageHandler.java b/src/java/org/apache/hcatalog/mapreduce/FosterStorageHandler.java
index 27a6ed6..3f368d8 100644
--- a/src/java/org/apache/hcatalog/mapreduce/FosterStorageHandler.java
+++ b/src/java/org/apache/hcatalog/mapreduce/FosterStorageHandler.java
@@ -52,18 +52,19 @@
     /** The directory under which data is initially written for a non partitioned table */
     protected static final String TEMP_DIR_NAME = "_TEMP";
 
-   private Class<? extends InputFormat> ifClass;
-   private Class<? extends OutputFormat> ofClass;
-   private Class<? extends SerDe> serDeClass;
+    private Class<? extends InputFormat> ifClass;
+    private Class<? extends OutputFormat> ofClass;
+    private Class<? extends SerDe> serDeClass;
 
     public FosterStorageHandler(String ifName, String ofName, String serdeName) throws ClassNotFoundException {
         this((Class<? extends InputFormat>) Class.forName(ifName),
-                (Class<? extends OutputFormat>) Class.forName(ofName),
-                (Class<? extends SerDe>) Class.forName(serdeName));
+            (Class<? extends OutputFormat>) Class.forName(ofName),
+            (Class<? extends SerDe>) Class.forName(serdeName));
     }
+
     public FosterStorageHandler(Class<? extends InputFormat> ifClass,
-                                               Class<? extends OutputFormat> ofClass,
-                                               Class<? extends SerDe> serDeClass) {
+                                Class<? extends OutputFormat> ofClass,
+                                Class<? extends SerDe> serDeClass) {
         this.ifClass = ifClass;
         this.ofClass = ofClass;
         this.serDeClass = serDeClass;
@@ -97,36 +98,35 @@
 
     @Override
     public void configureOutputJobProperties(TableDesc tableDesc,
-                                      Map<String, String> jobProperties) {
+                                             Map<String, String> jobProperties) {
         try {
             OutputJobInfo jobInfo = (OutputJobInfo)
-              HCatUtil.deserialize(tableDesc.getJobProperties().get(
-                                      HCatConstants.HCAT_KEY_OUTPUT_INFO));
+                HCatUtil.deserialize(tableDesc.getJobProperties().get(
+                    HCatConstants.HCAT_KEY_OUTPUT_INFO));
             String parentPath = jobInfo.getTableInfo().getTableLocation();
             String dynHash = tableDesc.getJobProperties().get(
-                                      HCatConstants.HCAT_DYNAMIC_PTN_JOBID);
+                HCatConstants.HCAT_DYNAMIC_PTN_JOBID);
 
             // For dynamic partitioned writes without all keyvalues specified,
             // we create a temp dir for the associated write job
-            if (dynHash != null){
+            if (dynHash != null) {
                 parentPath = new Path(parentPath,
-                                      DYNTEMP_DIR_NAME+dynHash).toString();
+                    DYNTEMP_DIR_NAME + dynHash).toString();
             }
 
             String outputLocation;
 
             // For non-partitioned tables, we send them to the temp dir
-            if(dynHash == null && jobInfo.getPartitionValues().size() == 0) {
+            if (dynHash == null && jobInfo.getPartitionValues().size() == 0) {
                 outputLocation = TEMP_DIR_NAME;
-            }
-            else {
+            } else {
                 List<String> cols = new ArrayList<String>();
                 List<String> values = new ArrayList<String>();
 
                 //Get the output location in the order partition keys are defined for the table.
-                for(String name:
+                for (String name :
                     jobInfo.getTableInfo().
-                    getPartitionColumns().getFieldNames()) {
+                        getPartitionColumns().getFieldNames()) {
                     String value = jobInfo.getPartitionValues().get(name);
                     cols.add(name);
                     values.add(value);
@@ -134,29 +134,29 @@
                 outputLocation = FileUtils.makePartName(cols, values);
             }
 
-            jobInfo.setLocation(new Path(parentPath,outputLocation).toString());
+            jobInfo.setLocation(new Path(parentPath, outputLocation).toString());
 
             //only set output dir if partition is fully materialized
-            if(jobInfo.getPartitionValues().size()
+            if (jobInfo.getPartitionValues().size()
                 == jobInfo.getTableInfo().getPartitionColumns().size()) {
                 jobProperties.put("mapred.output.dir", jobInfo.getLocation());
             }
 
             //TODO find a better home for this, RCFile specifc
             jobProperties.put(RCFile.COLUMN_NUMBER_CONF_STR,
-                              Integer.toOctalString(
-                                jobInfo.getOutputSchema().getFields().size()));
+                Integer.toOctalString(
+                    jobInfo.getOutputSchema().getFields().size()));
             jobProperties.put(HCatConstants.HCAT_KEY_OUTPUT_INFO,
-                              HCatUtil.serialize(jobInfo));
+                HCatUtil.serialize(jobInfo));
         } catch (IOException e) {
-            throw new IllegalStateException("Failed to set output path",e);
+            throw new IllegalStateException("Failed to set output path", e);
         }
 
     }
 
     @Override
     OutputFormatContainer getOutputFormatContainer(
-              org.apache.hadoop.mapred.OutputFormat outputFormat) {
+        org.apache.hadoop.mapred.OutputFormat outputFormat) {
         return new FileOutputFormatContainer(outputFormat);
     }
 
@@ -172,7 +172,7 @@
 
     @Override
     public HiveAuthorizationProvider getAuthorizationProvider()
-      throws HiveException {
+        throws HiveException {
         return new DefaultHiveAuthorizationProvider();
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatBaseInputFormat.java b/src/java/org/apache/hcatalog/mapreduce/HCatBaseInputFormat.java
index b484a02..6f77a23 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatBaseInputFormat.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatBaseInputFormat.java
@@ -46,272 +46,271 @@
 import org.apache.hcatalog.data.schema.HCatFieldSchema;
 import org.apache.hcatalog.data.schema.HCatSchema;
 
-public abstract class HCatBaseInputFormat 
-  extends InputFormat<WritableComparable, HCatRecord> {
-  
-  /**
-   * get the schema for the HCatRecord data returned by HCatInputFormat.
-   * 
-   * @param context the jobContext
-   * @throws IllegalArgumentException
-   */
-  private Class<? extends InputFormat> inputFileFormatClass;
+public abstract class HCatBaseInputFormat
+    extends InputFormat<WritableComparable, HCatRecord> {
 
-  // TODO needs to go in InitializeInput? as part of InputJobInfo
-  public static HCatSchema getOutputSchema(JobContext context) 
-    throws IOException {
-    String os = context.getConfiguration().get(
-                                HCatConstants.HCAT_KEY_OUTPUT_SCHEMA);
-    if (os == null) {
-      return getTableSchema(context);
-    } else {
-      return (HCatSchema) HCatUtil.deserialize(os);
-    }
-  }
-  
-  /**
-   * Set the schema for the HCatRecord data returned by HCatInputFormat.
-   * @param job the job object
-   * @param hcatSchema the schema to use as the consolidated schema
-   */
-  public static void setOutputSchema(Job job,HCatSchema hcatSchema) 
-    throws IOException {
-    job.getConfiguration().set(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA, 
-                               HCatUtil.serialize(hcatSchema));
-  }
+    /**
+     * get the schema for the HCatRecord data returned by HCatInputFormat.
+     *
+     * @param context the jobContext
+     * @throws IllegalArgumentException
+     */
+    private Class<? extends InputFormat> inputFileFormatClass;
 
-  protected static
-    org.apache.hadoop.mapred.InputFormat<WritableComparable, Writable>
-    getMapRedInputFormat (JobConf job, Class inputFormatClass) throws IOException {
-      return (
-          org.apache.hadoop.mapred.InputFormat<WritableComparable, Writable>) 
-        ReflectionUtils.newInstance(inputFormatClass, job);
-  }
-
-  /**
-   * Logically split the set of input files for the job. Returns the
-   * underlying InputFormat's splits
-   * @param jobContext the job context object
-   * @return the splits, an HCatInputSplit wrapper over the storage
-   *         handler InputSplits
-   * @throws IOException or InterruptedException
-   */
-  @Override
-  public List<InputSplit> getSplits(JobContext jobContext)
-  throws IOException, InterruptedException {
-
-    //Get the job info from the configuration,
-    //throws exception if not initialized
-    InputJobInfo inputJobInfo;
-    try {
-      inputJobInfo = getJobInfo(jobContext);
-    } catch (Exception e) {
-      throw new IOException(e);
+    // TODO needs to go in InitializeInput? as part of InputJobInfo
+    public static HCatSchema getOutputSchema(JobContext context)
+        throws IOException {
+        String os = context.getConfiguration().get(
+            HCatConstants.HCAT_KEY_OUTPUT_SCHEMA);
+        if (os == null) {
+            return getTableSchema(context);
+        } else {
+            return (HCatSchema) HCatUtil.deserialize(os);
+        }
     }
 
-    List<InputSplit> splits = new ArrayList<InputSplit>();
-    List<PartInfo> partitionInfoList = inputJobInfo.getPartitions();
-    if(partitionInfoList == null ) {
-      //No partitions match the specified partition filter
-      return splits;
+    /**
+     * Set the schema for the HCatRecord data returned by HCatInputFormat.
+     * @param job the job object
+     * @param hcatSchema the schema to use as the consolidated schema
+     */
+    public static void setOutputSchema(Job job, HCatSchema hcatSchema)
+        throws IOException {
+        job.getConfiguration().set(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA,
+            HCatUtil.serialize(hcatSchema));
     }
 
-    HCatStorageHandler storageHandler;
-    JobConf jobConf;
-    Configuration conf = jobContext.getConfiguration();
-    //For each matching partition, call getSplits on the underlying InputFormat
-    for(PartInfo partitionInfo : partitionInfoList) {
-      jobConf = HCatUtil.getJobConfFromContext(jobContext);
-      setInputPath(jobConf, partitionInfo.getLocation());
-      Map<String,String> jobProperties = partitionInfo.getJobProperties();
-
-      HCatSchema allCols = new HCatSchema(new LinkedList<HCatFieldSchema>());
-      for(HCatFieldSchema field: 
-          inputJobInfo.getTableInfo().getDataColumns().getFields())
-          allCols.append(field);
-      for(HCatFieldSchema field: 
-          inputJobInfo.getTableInfo().getPartitionColumns().getFields())
-          allCols.append(field);
-
-      HCatUtil.copyJobPropertiesToJobConf(jobProperties, jobConf);
-
-      storageHandler = HCatUtil.getStorageHandler(
-          jobConf, partitionInfo);
-
-      //Get the input format
-      Class inputFormatClass = storageHandler.getInputFormatClass();
-      org.apache.hadoop.mapred.InputFormat inputFormat = 
-                            getMapRedInputFormat(jobConf, inputFormatClass);
-
-      //Call getSplit on the InputFormat, create an
-      //HCatSplit for each underlying split
-      //NumSplits is 0 for our purposes
-      org.apache.hadoop.mapred.InputSplit[] baseSplits = 
-        inputFormat.getSplits(jobConf, 0);
-
-      for(org.apache.hadoop.mapred.InputSplit split : baseSplits) {
-        splits.add(new HCatSplit(
-            partitionInfo,
-            split,allCols));
-      }
+    protected static org.apache.hadoop.mapred.InputFormat<WritableComparable, Writable>
+    getMapRedInputFormat(JobConf job, Class inputFormatClass) throws IOException {
+        return (
+            org.apache.hadoop.mapred.InputFormat<WritableComparable, Writable>)
+            ReflectionUtils.newInstance(inputFormatClass, job);
     }
 
-    return splits;
-  }
+    /**
+     * Logically split the set of input files for the job. Returns the
+     * underlying InputFormat's splits
+     * @param jobContext the job context object
+     * @return the splits, an HCatInputSplit wrapper over the storage
+     *         handler InputSplits
+     * @throws IOException or InterruptedException
+     */
+    @Override
+    public List<InputSplit> getSplits(JobContext jobContext)
+        throws IOException, InterruptedException {
 
-  /**
-   * Create the RecordReader for the given InputSplit. Returns the underlying
-   * RecordReader if the required operations are supported and schema matches
-   * with HCatTable schema. Returns an HCatRecordReader if operations need to
-   * be implemented in HCat.
-   * @param split the split
-   * @param taskContext the task attempt context
-   * @return the record reader instance, either an HCatRecordReader(later) or
-   *         the underlying storage handler's RecordReader
-   * @throws IOException or InterruptedException
-   */
-  @Override
-  public RecordReader<WritableComparable, HCatRecord> 
-  createRecordReader(InputSplit split,
-      TaskAttemptContext taskContext) throws IOException, InterruptedException {
+        //Get the job info from the configuration,
+        //throws exception if not initialized
+        InputJobInfo inputJobInfo;
+        try {
+            inputJobInfo = getJobInfo(jobContext);
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
 
-    HCatSplit hcatSplit = InternalUtil.castToHCatSplit(split);
-    PartInfo partitionInfo = hcatSplit.getPartitionInfo();
-    JobContext jobContext = taskContext;
+        List<InputSplit> splits = new ArrayList<InputSplit>();
+        List<PartInfo> partitionInfoList = inputJobInfo.getPartitions();
+        if (partitionInfoList == null) {
+            //No partitions match the specified partition filter
+            return splits;
+        }
 
-    HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(
-        jobContext.getConfiguration(), partitionInfo);
-    
-    JobConf jobConf = HCatUtil.getJobConfFromContext(jobContext);
-    Map<String, String> jobProperties = partitionInfo.getJobProperties();
-    HCatUtil.copyJobPropertiesToJobConf(jobProperties, jobConf);
+        HCatStorageHandler storageHandler;
+        JobConf jobConf;
+        Configuration conf = jobContext.getConfiguration();
+        //For each matching partition, call getSplits on the underlying InputFormat
+        for (PartInfo partitionInfo : partitionInfoList) {
+            jobConf = HCatUtil.getJobConfFromContext(jobContext);
+            setInputPath(jobConf, partitionInfo.getLocation());
+            Map<String, String> jobProperties = partitionInfo.getJobProperties();
 
-    Map<String,String> valuesNotInDataCols = getColValsNotInDataColumns(
-        getOutputSchema(jobContext),partitionInfo
+            HCatSchema allCols = new HCatSchema(new LinkedList<HCatFieldSchema>());
+            for (HCatFieldSchema field :
+                inputJobInfo.getTableInfo().getDataColumns().getFields())
+                allCols.append(field);
+            for (HCatFieldSchema field :
+                inputJobInfo.getTableInfo().getPartitionColumns().getFields())
+                allCols.append(field);
+
+            HCatUtil.copyJobPropertiesToJobConf(jobProperties, jobConf);
+
+            storageHandler = HCatUtil.getStorageHandler(
+                jobConf, partitionInfo);
+
+            //Get the input format
+            Class inputFormatClass = storageHandler.getInputFormatClass();
+            org.apache.hadoop.mapred.InputFormat inputFormat =
+                getMapRedInputFormat(jobConf, inputFormatClass);
+
+            //Call getSplit on the InputFormat, create an
+            //HCatSplit for each underlying split
+            //NumSplits is 0 for our purposes
+            org.apache.hadoop.mapred.InputSplit[] baseSplits =
+                inputFormat.getSplits(jobConf, 0);
+
+            for (org.apache.hadoop.mapred.InputSplit split : baseSplits) {
+                splits.add(new HCatSplit(
+                    partitionInfo,
+                    split, allCols));
+            }
+        }
+
+        return splits;
+    }
+
+    /**
+     * Create the RecordReader for the given InputSplit. Returns the underlying
+     * RecordReader if the required operations are supported and schema matches
+     * with HCatTable schema. Returns an HCatRecordReader if operations need to
+     * be implemented in HCat.
+     * @param split the split
+     * @param taskContext the task attempt context
+     * @return the record reader instance, either an HCatRecordReader(later) or
+     *         the underlying storage handler's RecordReader
+     * @throws IOException or InterruptedException
+     */
+    @Override
+    public RecordReader<WritableComparable, HCatRecord>
+    createRecordReader(InputSplit split,
+                       TaskAttemptContext taskContext) throws IOException, InterruptedException {
+
+        HCatSplit hcatSplit = InternalUtil.castToHCatSplit(split);
+        PartInfo partitionInfo = hcatSplit.getPartitionInfo();
+        JobContext jobContext = taskContext;
+
+        HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(
+            jobContext.getConfiguration(), partitionInfo);
+
+        JobConf jobConf = HCatUtil.getJobConfFromContext(jobContext);
+        Map<String, String> jobProperties = partitionInfo.getJobProperties();
+        HCatUtil.copyJobPropertiesToJobConf(jobProperties, jobConf);
+
+        Map<String, String> valuesNotInDataCols = getColValsNotInDataColumns(
+            getOutputSchema(jobContext), partitionInfo
         );
 
-    return new HCatRecordReader(storageHandler, valuesNotInDataCols);
-  }
-
-
-  /**
-   * gets values for fields requested by output schema which will not be in the data
-   */
-  private static Map<String,String> getColValsNotInDataColumns(HCatSchema outputSchema,
-      PartInfo partInfo){
-    HCatSchema dataSchema = partInfo.getPartitionSchema();
-    Map<String,String> vals = new HashMap<String,String>();
-    for (String fieldName : outputSchema.getFieldNames()){
-      if (dataSchema.getPosition(fieldName) == null){
-        // this entry of output is not present in the output schema
-        // so, we first check the table schema to see if it is a part col
-        
-        if (partInfo.getPartitionValues().containsKey(fieldName)){
-          vals.put(fieldName, partInfo.getPartitionValues().get(fieldName));
-        } else {
-          vals.put(fieldName, null);
-        }
-      }
-    }
-    return vals;
-  }
-
-  /**
-   * Gets the HCatTable schema for the table specified in the HCatInputFormat.setInput call
-   * on the specified job context. This information is available only after HCatInputFormat.setInput
-   * has been called for a JobContext.
-   * @param context the context
-   * @return the table schema
-   * @throws IOException if HCatInputFormat.setInput has not been called 
-   *                     for the current context
-   */
-  public static HCatSchema getTableSchema(JobContext context) 
-  throws IOException {
-    InputJobInfo inputJobInfo = getJobInfo(context);
-      HCatSchema allCols = new HCatSchema(new LinkedList<HCatFieldSchema>());
-      for(HCatFieldSchema field: 
-          inputJobInfo.getTableInfo().getDataColumns().getFields())
-          allCols.append(field);
-      for(HCatFieldSchema field: 
-          inputJobInfo.getTableInfo().getPartitionColumns().getFields())
-          allCols.append(field);
-    return allCols;
-  }
-
-  /**
-   * Gets the InputJobInfo object by reading the Configuration and deserializing
-   * the string. If InputJobInfo is not present in the configuration, throws an
-   * exception since that means HCatInputFormat.setInput has not been called.
-   * @param jobContext the job context
-   * @return the InputJobInfo object
-   * @throws IOException the exception
-   */
-  private static InputJobInfo getJobInfo(JobContext jobContext) 
-    throws IOException {
-    String jobString = jobContext.getConfiguration().get(
-                                  HCatConstants.HCAT_KEY_JOB_INFO);
-    if( jobString == null ) {
-      throw new IOException("job information not found in JobContext."
-         + " HCatInputFormat.setInput() not called?");
+        return new HCatRecordReader(storageHandler, valuesNotInDataCols);
     }
 
-    return (InputJobInfo) HCatUtil.deserialize(jobString);
-  }
 
-  private void setInputPath(JobConf jobConf, String location) 
-  throws IOException{
+    /**
+     * gets values for fields requested by output schema which will not be in the data
+     */
+    private static Map<String, String> getColValsNotInDataColumns(HCatSchema outputSchema,
+                                                                  PartInfo partInfo) {
+        HCatSchema dataSchema = partInfo.getPartitionSchema();
+        Map<String, String> vals = new HashMap<String, String>();
+        for (String fieldName : outputSchema.getFieldNames()) {
+            if (dataSchema.getPosition(fieldName) == null) {
+                // this entry of output is not present in the output schema
+                // so, we first check the table schema to see if it is a part col
 
-    // ideally we should just call FileInputFormat.setInputPaths() here - but
-    // that won't work since FileInputFormat.setInputPaths() needs
-    // a Job object instead of a JobContext which we are handed here
-
-    int length = location.length();
-    int curlyOpen = 0;
-    int pathStart = 0;
-    boolean globPattern = false;
-    List<String> pathStrings = new ArrayList<String>();
-
-    for (int i=0; i<length; i++) {
-      char ch = location.charAt(i);
-      switch(ch) {
-      case '{' : {
-        curlyOpen++;
-        if (!globPattern) {
-          globPattern = true;
+                if (partInfo.getPartitionValues().containsKey(fieldName)) {
+                    vals.put(fieldName, partInfo.getPartitionValues().get(fieldName));
+                } else {
+                    vals.put(fieldName, null);
+                }
+            }
         }
-        break;
-      }
-      case '}' : {
-        curlyOpen--;
-        if (curlyOpen == 0 && globPattern) {
-          globPattern = false;
-        }
-        break;
-      }
-      case ',' : {
-        if (!globPattern) {
-          pathStrings.add(location.substring(pathStart, i));
-          pathStart = i + 1 ;
-        }
-        break;
-      }
-      }
-    }
-    pathStrings.add(location.substring(pathStart, length));
-
-    Path[] paths = StringUtils.stringToPath(pathStrings.toArray(new String[0]));
-
-    FileSystem fs = FileSystem.get(jobConf);
-    Path path = paths[0].makeQualified(fs);
-    StringBuilder str = new StringBuilder(StringUtils.escapeString(
-                                                          path.toString()));
-    for(int i = 1; i < paths.length;i++) {
-      str.append(StringUtils.COMMA_STR);
-      path = paths[i].makeQualified(fs);
-      str.append(StringUtils.escapeString(path.toString()));
+        return vals;
     }
 
-    jobConf.set("mapred.input.dir", str.toString());
-  }
+    /**
+     * Gets the HCatTable schema for the table specified in the HCatInputFormat.setInput call
+     * on the specified job context. This information is available only after HCatInputFormat.setInput
+     * has been called for a JobContext.
+     * @param context the context
+     * @return the table schema
+     * @throws IOException if HCatInputFormat.setInput has not been called
+     *                     for the current context
+     */
+    public static HCatSchema getTableSchema(JobContext context)
+        throws IOException {
+        InputJobInfo inputJobInfo = getJobInfo(context);
+        HCatSchema allCols = new HCatSchema(new LinkedList<HCatFieldSchema>());
+        for (HCatFieldSchema field :
+            inputJobInfo.getTableInfo().getDataColumns().getFields())
+            allCols.append(field);
+        for (HCatFieldSchema field :
+            inputJobInfo.getTableInfo().getPartitionColumns().getFields())
+            allCols.append(field);
+        return allCols;
+    }
+
+    /**
+     * Gets the InputJobInfo object by reading the Configuration and deserializing
+     * the string. If InputJobInfo is not present in the configuration, throws an
+     * exception since that means HCatInputFormat.setInput has not been called.
+     * @param jobContext the job context
+     * @return the InputJobInfo object
+     * @throws IOException the exception
+     */
+    private static InputJobInfo getJobInfo(JobContext jobContext)
+        throws IOException {
+        String jobString = jobContext.getConfiguration().get(
+            HCatConstants.HCAT_KEY_JOB_INFO);
+        if (jobString == null) {
+            throw new IOException("job information not found in JobContext."
+                + " HCatInputFormat.setInput() not called?");
+        }
+
+        return (InputJobInfo) HCatUtil.deserialize(jobString);
+    }
+
+    private void setInputPath(JobConf jobConf, String location)
+        throws IOException {
+
+        // ideally we should just call FileInputFormat.setInputPaths() here - but
+        // that won't work since FileInputFormat.setInputPaths() needs
+        // a Job object instead of a JobContext which we are handed here
+
+        int length = location.length();
+        int curlyOpen = 0;
+        int pathStart = 0;
+        boolean globPattern = false;
+        List<String> pathStrings = new ArrayList<String>();
+
+        for (int i = 0; i < length; i++) {
+            char ch = location.charAt(i);
+            switch (ch) {
+            case '{': {
+                curlyOpen++;
+                if (!globPattern) {
+                    globPattern = true;
+                }
+                break;
+            }
+            case '}': {
+                curlyOpen--;
+                if (curlyOpen == 0 && globPattern) {
+                    globPattern = false;
+                }
+                break;
+            }
+            case ',': {
+                if (!globPattern) {
+                    pathStrings.add(location.substring(pathStart, i));
+                    pathStart = i + 1;
+                }
+                break;
+            }
+            }
+        }
+        pathStrings.add(location.substring(pathStart, length));
+
+        Path[] paths = StringUtils.stringToPath(pathStrings.toArray(new String[0]));
+
+        FileSystem fs = FileSystem.get(jobConf);
+        Path path = paths[0].makeQualified(fs);
+        StringBuilder str = new StringBuilder(StringUtils.escapeString(
+            path.toString()));
+        for (int i = 1; i < paths.length; i++) {
+            str.append(StringUtils.COMMA_STR);
+            path = paths[i].makeQualified(fs);
+            str.append(StringUtils.escapeString(path.toString()));
+        }
+
+        jobConf.set("mapred.input.dir", str.toString());
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatBaseOutputFormat.java b/src/java/org/apache/hcatalog/mapreduce/HCatBaseOutputFormat.java
index 3d934c5..d741b7f 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatBaseOutputFormat.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatBaseOutputFormat.java
@@ -39,99 +39,99 @@
 
 //  static final private Log LOG = LogFactory.getLog(HCatBaseOutputFormat.class);
 
-  /**
-   * Gets the table schema for the table specified in the HCatOutputFormat.setOutput call
-   * on the specified job context.
-   * @param context the context
-   * @return the table schema
-   * @throws IOException if HCatOutputFromat.setOutput has not been called for the passed context
-   */
-  public static HCatSchema getTableSchema(JobContext context) throws IOException {
-      OutputJobInfo jobInfo = getJobInfo(context);
-      return jobInfo.getTableInfo().getDataColumns();
-  }
+    /**
+     * Gets the table schema for the table specified in the HCatOutputFormat.setOutput call
+     * on the specified job context.
+     * @param context the context
+     * @return the table schema
+     * @throws IOException if HCatOutputFromat.setOutput has not been called for the passed context
+     */
+    public static HCatSchema getTableSchema(JobContext context) throws IOException {
+        OutputJobInfo jobInfo = getJobInfo(context);
+        return jobInfo.getTableInfo().getDataColumns();
+    }
 
-  /**
-   * Check for validity of the output-specification for the job.
-   * @param context information about the job
-   * @throws IOException when output should not be attempted
-   */
-  @Override
-  public void checkOutputSpecs(JobContext context
-                                        ) throws IOException, InterruptedException {
-    getOutputFormat(context).checkOutputSpecs(context);
-  }
+    /**
+     * Check for validity of the output-specification for the job.
+     * @param context information about the job
+     * @throws IOException when output should not be attempted
+     */
+    @Override
+    public void checkOutputSpecs(JobContext context
+    ) throws IOException, InterruptedException {
+        getOutputFormat(context).checkOutputSpecs(context);
+    }
 
-  /**
-   * Gets the output format instance.
-   * @param context the job context
-   * @return the output format instance
-   * @throws IOException
-   */
-  protected OutputFormat<WritableComparable<?>, HCatRecord> getOutputFormat(JobContext context) throws IOException {
-      OutputJobInfo jobInfo = getJobInfo(context);
-      HCatStorageHandler  storageHandler = HCatUtil.getStorageHandler(context.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
-      //why do we need this?
-      configureOutputStorageHandler(context);
-      return storageHandler.getOutputFormatContainer(ReflectionUtils.newInstance(storageHandler.getOutputFormatClass(),context.getConfiguration()));
-  }
+    /**
+     * Gets the output format instance.
+     * @param context the job context
+     * @return the output format instance
+     * @throws IOException
+     */
+    protected OutputFormat<WritableComparable<?>, HCatRecord> getOutputFormat(JobContext context) throws IOException {
+        OutputJobInfo jobInfo = getJobInfo(context);
+        HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(context.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
+        //why do we need this?
+        configureOutputStorageHandler(context);
+        return storageHandler.getOutputFormatContainer(ReflectionUtils.newInstance(storageHandler.getOutputFormatClass(), context.getConfiguration()));
+    }
 
-  /**
-   * Gets the HCatOuputJobInfo object by reading the Configuration and deserializing
-   * the string. If InputJobInfo is not present in the configuration, throws an
-   * exception since that means HCatOutputFormat.setOutput has not been called.
-   * @param jobContext the job context
-   * @return the OutputJobInfo object
-   * @throws IOException the IO exception
-   */
-  public static OutputJobInfo getJobInfo(JobContext jobContext) throws IOException {
-      String jobString = jobContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
-      if( jobString == null ) {
-          throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED);
-      }
+    /**
+     * Gets the HCatOuputJobInfo object by reading the Configuration and deserializing
+     * the string. If InputJobInfo is not present in the configuration, throws an
+     * exception since that means HCatOutputFormat.setOutput has not been called.
+     * @param jobContext the job context
+     * @return the OutputJobInfo object
+     * @throws IOException the IO exception
+     */
+    public static OutputJobInfo getJobInfo(JobContext jobContext) throws IOException {
+        String jobString = jobContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
+        if (jobString == null) {
+            throw new HCatException(ErrorType.ERROR_NOT_INITIALIZED);
+        }
 
-      return (OutputJobInfo) HCatUtil.deserialize(jobString);
-  }
+        return (OutputJobInfo) HCatUtil.deserialize(jobString);
+    }
 
-  /**
-   * Configure the output storage handler
-   * @param jobContext the job context
-   * @throws IOException
-   */
-  @SuppressWarnings("unchecked")
-  static void configureOutputStorageHandler(
-          JobContext jobContext) throws IOException {
-    configureOutputStorageHandler(jobContext,(List<String>)null);
-  }
+    /**
+     * Configure the output storage handler
+     * @param jobContext the job context
+     * @throws IOException
+     */
+    @SuppressWarnings("unchecked")
+    static void configureOutputStorageHandler(
+        JobContext jobContext) throws IOException {
+        configureOutputStorageHandler(jobContext, (List<String>) null);
+    }
 
-  /**
-   * Configure the output storage handler with allowing specification of missing dynamic partvals
-   * @param jobContext the job context
-   * @param dynamicPartVals
-   * @throws IOException
-   */
-  @SuppressWarnings("unchecked")
-  static void configureOutputStorageHandler(
-          JobContext jobContext, List<String> dynamicPartVals) throws IOException {
-      try {
-          OutputJobInfo jobInfo = (OutputJobInfo)HCatUtil.deserialize(jobContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
-          HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(jobContext.getConfiguration(),jobInfo.getTableInfo().getStorerInfo());
+    /**
+     * Configure the output storage handler with allowing specification of missing dynamic partvals
+     * @param jobContext the job context
+     * @param dynamicPartVals
+     * @throws IOException
+     */
+    @SuppressWarnings("unchecked")
+    static void configureOutputStorageHandler(
+        JobContext jobContext, List<String> dynamicPartVals) throws IOException {
+        try {
+            OutputJobInfo jobInfo = (OutputJobInfo) HCatUtil.deserialize(jobContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+            HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(jobContext.getConfiguration(), jobInfo.getTableInfo().getStorerInfo());
 
-          Map<String, String> partitionValues = jobInfo.getPartitionValues();
-          String location = jobInfo.getLocation();
+            Map<String, String> partitionValues = jobInfo.getPartitionValues();
+            String location = jobInfo.getLocation();
 
-          if (dynamicPartVals != null){
-            // dynamic part vals specified
-            List<String> dynamicPartKeys = jobInfo.getDynamicPartitioningKeys();
-            if (dynamicPartVals.size() != dynamicPartKeys.size()){
-              throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES, 
-                  "Unable to configure dynamic partitioning for storage handler, mismatch between"
-                  + " number of partition values obtained["+dynamicPartVals.size()
-                  + "] and number of partition values required["+dynamicPartKeys.size()+"]");
-            }
-            for (int i = 0; i < dynamicPartKeys.size(); i++){
-              partitionValues.put(dynamicPartKeys.get(i), dynamicPartVals.get(i));
-            }
+            if (dynamicPartVals != null) {
+                // dynamic part vals specified
+                List<String> dynamicPartKeys = jobInfo.getDynamicPartitioningKeys();
+                if (dynamicPartVals.size() != dynamicPartKeys.size()) {
+                    throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES,
+                        "Unable to configure dynamic partitioning for storage handler, mismatch between"
+                            + " number of partition values obtained[" + dynamicPartVals.size()
+                            + "] and number of partition values required[" + dynamicPartKeys.size() + "]");
+                }
+                for (int i = 0; i < dynamicPartKeys.size(); i++) {
+                    partitionValues.put(dynamicPartKeys.get(i), dynamicPartVals.get(i));
+                }
 
 //            // re-home location, now that we know the rest of the partvals
 //            Table table = jobInfo.getTableInfo().getTable();
@@ -140,85 +140,85 @@
 //            for(FieldSchema schema : table.getPartitionKeys()) {
 //              partitionCols.add(schema.getName());
 //            }
-            jobInfo.setPartitionValues(partitionValues);
-          }
+                jobInfo.setPartitionValues(partitionValues);
+            }
 
-          HCatUtil.configureOutputStorageHandler(storageHandler,jobContext,jobInfo);
-      } catch(Exception e) {
-        if (e instanceof HCatException){
-          throw (HCatException)e;
-        }else{
-          throw new HCatException(ErrorType.ERROR_INIT_STORAGE_HANDLER, e);
+            HCatUtil.configureOutputStorageHandler(storageHandler, jobContext, jobInfo);
+        } catch (Exception e) {
+            if (e instanceof HCatException) {
+                throw (HCatException) e;
+            } else {
+                throw new HCatException(ErrorType.ERROR_INIT_STORAGE_HANDLER, e);
+            }
         }
-      }
-  }
-
-  /**
-   * Configure the output storage handler, with allowing specification 
-   * of partvals from which it picks the dynamic partvals
-   * @param context the job context
-   * @param jobInfo the output job info
-   * @param fullPartSpec
-   * @throws IOException
-   */
-
-  protected static void configureOutputStorageHandler(
-      JobContext context, OutputJobInfo jobInfo,
-      Map<String, String> fullPartSpec) throws IOException {
-    List<String> dynamicPartKeys = jobInfo.getDynamicPartitioningKeys();
-    if ((dynamicPartKeys == null)||(dynamicPartKeys.isEmpty())){
-      configureOutputStorageHandler(context, (List<String>) null);
-    }else{
-      List<String> dynKeyVals = new ArrayList<String>();
-      for (String dynamicPartKey : dynamicPartKeys){
-        dynKeyVals.add(fullPartSpec.get(dynamicPartKey));
-      }
-      configureOutputStorageHandler(context, dynKeyVals);
-    }
-  }
-
-
-  protected static void setPartDetails(OutputJobInfo jobInfo, final HCatSchema schema,
-      Map<String, String> partMap) throws HCatException, IOException {
-    List<Integer> posOfPartCols = new ArrayList<Integer>();
-    List<Integer> posOfDynPartCols = new ArrayList<Integer>();
-
-    // If partition columns occur in data, we want to remove them.
-    // So, find out positions of partition columns in schema provided by user.
-    // We also need to update the output Schema with these deletions.
-    
-    // Note that, output storage handlers never sees partition columns in data
-    // or schema.
-
-    HCatSchema schemaWithoutParts = new HCatSchema(schema.getFields());
-    for(String partKey : partMap.keySet()){
-      Integer idx;
-      if((idx = schema.getPosition(partKey)) != null){
-        posOfPartCols.add(idx);
-        schemaWithoutParts.remove(schema.get(partKey));
-      }
     }
 
-    // Also, if dynamic partitioning is being used, we want to
-    // set appropriate list of columns for the columns to be dynamically specified.
-    // These would be partition keys too, so would also need to be removed from 
-    // output schema and partcols
+    /**
+     * Configure the output storage handler, with allowing specification
+     * of partvals from which it picks the dynamic partvals
+     * @param context the job context
+     * @param jobInfo the output job info
+     * @param fullPartSpec
+     * @throws IOException
+     */
 
-    if (jobInfo.isDynamicPartitioningUsed()){
-      for (String partKey : jobInfo.getDynamicPartitioningKeys()){
-        Integer idx;
-        if((idx = schema.getPosition(partKey)) != null){
-          posOfPartCols.add(idx);
-          posOfDynPartCols.add(idx);
-          schemaWithoutParts.remove(schema.get(partKey));
+    protected static void configureOutputStorageHandler(
+        JobContext context, OutputJobInfo jobInfo,
+        Map<String, String> fullPartSpec) throws IOException {
+        List<String> dynamicPartKeys = jobInfo.getDynamicPartitioningKeys();
+        if ((dynamicPartKeys == null) || (dynamicPartKeys.isEmpty())) {
+            configureOutputStorageHandler(context, (List<String>) null);
+        } else {
+            List<String> dynKeyVals = new ArrayList<String>();
+            for (String dynamicPartKey : dynamicPartKeys) {
+                dynKeyVals.add(fullPartSpec.get(dynamicPartKey));
+            }
+            configureOutputStorageHandler(context, dynKeyVals);
         }
-      }
     }
-    
-    HCatUtil.validatePartitionSchema(
-        new Table(jobInfo.getTableInfo().getTable()), schemaWithoutParts);
-    jobInfo.setPosOfPartCols(posOfPartCols);
-    jobInfo.setPosOfDynPartCols(posOfDynPartCols);
-    jobInfo.setOutputSchema(schemaWithoutParts);
-  }
+
+
+    protected static void setPartDetails(OutputJobInfo jobInfo, final HCatSchema schema,
+                                         Map<String, String> partMap) throws HCatException, IOException {
+        List<Integer> posOfPartCols = new ArrayList<Integer>();
+        List<Integer> posOfDynPartCols = new ArrayList<Integer>();
+
+        // If partition columns occur in data, we want to remove them.
+        // So, find out positions of partition columns in schema provided by user.
+        // We also need to update the output Schema with these deletions.
+
+        // Note that, output storage handlers never sees partition columns in data
+        // or schema.
+
+        HCatSchema schemaWithoutParts = new HCatSchema(schema.getFields());
+        for (String partKey : partMap.keySet()) {
+            Integer idx;
+            if ((idx = schema.getPosition(partKey)) != null) {
+                posOfPartCols.add(idx);
+                schemaWithoutParts.remove(schema.get(partKey));
+            }
+        }
+
+        // Also, if dynamic partitioning is being used, we want to
+        // set appropriate list of columns for the columns to be dynamically specified.
+        // These would be partition keys too, so would also need to be removed from
+        // output schema and partcols
+
+        if (jobInfo.isDynamicPartitioningUsed()) {
+            for (String partKey : jobInfo.getDynamicPartitioningKeys()) {
+                Integer idx;
+                if ((idx = schema.getPosition(partKey)) != null) {
+                    posOfPartCols.add(idx);
+                    posOfDynPartCols.add(idx);
+                    schemaWithoutParts.remove(schema.get(partKey));
+                }
+            }
+        }
+
+        HCatUtil.validatePartitionSchema(
+            new Table(jobInfo.getTableInfo().getTable()), schemaWithoutParts);
+        jobInfo.setPosOfPartCols(posOfPartCols);
+        jobInfo.setPosOfDynPartCols(posOfDynPartCols);
+        jobInfo.setOutputSchema(schemaWithoutParts);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatInputFormat.java b/src/java/org/apache/hcatalog/mapreduce/HCatInputFormat.java
index f1d8276..b668d7a 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatInputFormat.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatInputFormat.java
@@ -25,23 +25,23 @@
 /** The InputFormat to use to read data from HCatalog. */
 public class HCatInputFormat extends HCatBaseInputFormat {
 
-  /**
-   * Set the input information to use for the job. This queries the metadata server 
-   * with the specified partition predicates, gets the matching partitions, and 
-   * puts the information in the conf object. The inputInfo object is updated 
-   * with information needed in the client context.
-   * @param job the job object
-   * @param inputJobInfo the input information about the table to read
-   * @throws IOException the exception in communicating with the metadata server
-   */
-  public static void setInput(Job job,
-      InputJobInfo inputJobInfo) throws IOException {
-    try {
-      InitializeInput.setInput(job, inputJobInfo);
-    } catch (Exception e) {
-      throw new IOException(e);
+    /**
+     * Set the input information to use for the job. This queries the metadata server
+     * with the specified partition predicates, gets the matching partitions, and
+     * puts the information in the conf object. The inputInfo object is updated
+     * with information needed in the client context.
+     * @param job the job object
+     * @param inputJobInfo the input information about the table to read
+     * @throws IOException the exception in communicating with the metadata server
+     */
+    public static void setInput(Job job,
+                                InputJobInfo inputJobInfo) throws IOException {
+        try {
+            InitializeInput.setInput(job, inputJobInfo);
+        } catch (Exception e) {
+            throw new IOException(e);
+        }
     }
-  }
 
 
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatOutputFormat.java b/src/java/org/apache/hcatalog/mapreduce/HCatOutputFormat.java
index e095e4d..30c9e6b 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatOutputFormat.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatOutputFormat.java
@@ -66,135 +66,135 @@
      */
     @SuppressWarnings("unchecked")
     public static void setOutput(Job job, OutputJobInfo outputJobInfo) throws IOException {
-      HiveMetaStoreClient client = null;
+        HiveMetaStoreClient client = null;
 
-      try {
+        try {
 
-        Configuration conf = job.getConfiguration();
-        HiveConf hiveConf = HCatUtil.getHiveConf(conf);
-        client = HCatUtil.getHiveClient(hiveConf);
-        Table table = HCatUtil.getTable(client, outputJobInfo.getDatabaseName(),
-            outputJobInfo.getTableName());
+            Configuration conf = job.getConfiguration();
+            HiveConf hiveConf = HCatUtil.getHiveConf(conf);
+            client = HCatUtil.getHiveClient(hiveConf);
+            Table table = HCatUtil.getTable(client, outputJobInfo.getDatabaseName(),
+                outputJobInfo.getTableName());
 
-        List<String> indexList = client.listIndexNames(outputJobInfo.getDatabaseName(), outputJobInfo.getTableName(), Short.MAX_VALUE);
+            List<String> indexList = client.listIndexNames(outputJobInfo.getDatabaseName(), outputJobInfo.getTableName(), Short.MAX_VALUE);
 
-        for (String indexName : indexList) {
-            Index index = client.getIndex(outputJobInfo.getDatabaseName(), outputJobInfo.getTableName(), indexName);
-            if (!index.isDeferredRebuild()) {
-                throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a table with an automatic index from Pig/Mapreduce is not supported");
+            for (String indexName : indexList) {
+                Index index = client.getIndex(outputJobInfo.getDatabaseName(), outputJobInfo.getTableName(), indexName);
+                if (!index.isDeferredRebuild()) {
+                    throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a table with an automatic index from Pig/Mapreduce is not supported");
+                }
             }
-        }
-        StorageDescriptor sd = table.getTTable().getSd();
+            StorageDescriptor sd = table.getTTable().getSd();
 
-        if (sd.isCompressed()) {
-            throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a compressed partition from Pig/Mapreduce is not supported");
-        }
-
-        if (sd.getBucketCols()!=null && !sd.getBucketCols().isEmpty()) {
-            throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a partition with bucket definition from Pig/Mapreduce is not supported");
-        }
-
-        if (sd.getSortCols()!=null && !sd.getSortCols().isEmpty()) {
-            throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a partition with sorted column definition from Pig/Mapreduce is not supported");
-        }
-
-        if (table.getTTable().getPartitionKeysSize() == 0 ){
-          if ((outputJobInfo.getPartitionValues() != null) && (!outputJobInfo.getPartitionValues().isEmpty())){
-            // attempt made to save partition values in non-partitioned table - throw error.
-            throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES,
-                "Partition values specified for non-partitioned table");
-          }
-          // non-partitioned table
-          outputJobInfo.setPartitionValues(new HashMap<String, String>());
-
-        } else {
-          // partitioned table, we expect partition values
-          // convert user specified map to have lower case key names
-          Map<String, String> valueMap = new HashMap<String, String>();
-          if (outputJobInfo.getPartitionValues() != null){
-            for(Map.Entry<String, String> entry : outputJobInfo.getPartitionValues().entrySet()) {
-              valueMap.put(entry.getKey().toLowerCase(), entry.getValue());
-            }
-          }
-
-          if ((outputJobInfo.getPartitionValues() == null)
-              || (outputJobInfo.getPartitionValues().size() < table.getTTable().getPartitionKeysSize())){
-            // dynamic partition usecase - partition values were null, or not all were specified
-            // need to figure out which keys are not specified.
-            List<String> dynamicPartitioningKeys = new ArrayList<String>();
-            boolean firstItem = true;
-            for (FieldSchema fs : table.getPartitionKeys()){
-              if (!valueMap.containsKey(fs.getName().toLowerCase())){
-                dynamicPartitioningKeys.add(fs.getName().toLowerCase());
-              }
+            if (sd.isCompressed()) {
+                throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a compressed partition from Pig/Mapreduce is not supported");
             }
 
-            if (valueMap.size() + dynamicPartitioningKeys.size() != table.getTTable().getPartitionKeysSize()){
-              // If this isn't equal, then bogus key values have been inserted, error out.
-              throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES,"Invalid partition keys specified");
+            if (sd.getBucketCols() != null && !sd.getBucketCols().isEmpty()) {
+                throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a partition with bucket definition from Pig/Mapreduce is not supported");
             }
 
-            outputJobInfo.setDynamicPartitioningKeys(dynamicPartitioningKeys);
-            String dynHash;
-            if ((dynHash = conf.get(HCatConstants.HCAT_DYNAMIC_PTN_JOBID)) == null){
-              dynHash = String.valueOf(Math.random());
+            if (sd.getSortCols() != null && !sd.getSortCols().isEmpty()) {
+                throw new HCatException(ErrorType.ERROR_NOT_SUPPORTED, "Store into a partition with sorted column definition from Pig/Mapreduce is not supported");
+            }
+
+            if (table.getTTable().getPartitionKeysSize() == 0) {
+                if ((outputJobInfo.getPartitionValues() != null) && (!outputJobInfo.getPartitionValues().isEmpty())) {
+                    // attempt made to save partition values in non-partitioned table - throw error.
+                    throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES,
+                        "Partition values specified for non-partitioned table");
+                }
+                // non-partitioned table
+                outputJobInfo.setPartitionValues(new HashMap<String, String>());
+
+            } else {
+                // partitioned table, we expect partition values
+                // convert user specified map to have lower case key names
+                Map<String, String> valueMap = new HashMap<String, String>();
+                if (outputJobInfo.getPartitionValues() != null) {
+                    for (Map.Entry<String, String> entry : outputJobInfo.getPartitionValues().entrySet()) {
+                        valueMap.put(entry.getKey().toLowerCase(), entry.getValue());
+                    }
+                }
+
+                if ((outputJobInfo.getPartitionValues() == null)
+                    || (outputJobInfo.getPartitionValues().size() < table.getTTable().getPartitionKeysSize())) {
+                    // dynamic partition usecase - partition values were null, or not all were specified
+                    // need to figure out which keys are not specified.
+                    List<String> dynamicPartitioningKeys = new ArrayList<String>();
+                    boolean firstItem = true;
+                    for (FieldSchema fs : table.getPartitionKeys()) {
+                        if (!valueMap.containsKey(fs.getName().toLowerCase())) {
+                            dynamicPartitioningKeys.add(fs.getName().toLowerCase());
+                        }
+                    }
+
+                    if (valueMap.size() + dynamicPartitioningKeys.size() != table.getTTable().getPartitionKeysSize()) {
+                        // If this isn't equal, then bogus key values have been inserted, error out.
+                        throw new HCatException(ErrorType.ERROR_INVALID_PARTITION_VALUES, "Invalid partition keys specified");
+                    }
+
+                    outputJobInfo.setDynamicPartitioningKeys(dynamicPartitioningKeys);
+                    String dynHash;
+                    if ((dynHash = conf.get(HCatConstants.HCAT_DYNAMIC_PTN_JOBID)) == null) {
+                        dynHash = String.valueOf(Math.random());
 //              LOG.info("New dynHash : ["+dynHash+"]");
 //            }else{
 //              LOG.info("Old dynHash : ["+dynHash+"]");
+                    }
+                    conf.set(HCatConstants.HCAT_DYNAMIC_PTN_JOBID, dynHash);
+
+                }
+
+                outputJobInfo.setPartitionValues(valueMap);
             }
-            conf.set(HCatConstants.HCAT_DYNAMIC_PTN_JOBID, dynHash);
 
-          }
+            HCatSchema tableSchema = HCatUtil.extractSchema(table);
+            StorerInfo storerInfo =
+                InternalUtil.extractStorerInfo(table.getTTable().getSd(), table.getParameters());
 
-          outputJobInfo.setPartitionValues(valueMap);
+            List<String> partitionCols = new ArrayList<String>();
+            for (FieldSchema schema : table.getPartitionKeys()) {
+                partitionCols.add(schema.getName());
+            }
+
+            HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(job.getConfiguration(), storerInfo);
+
+            //Serialize the output info into the configuration
+            outputJobInfo.setTableInfo(HCatTableInfo.valueOf(table.getTTable()));
+            outputJobInfo.setOutputSchema(tableSchema);
+            harRequested = getHarRequested(hiveConf);
+            outputJobInfo.setHarRequested(harRequested);
+            maxDynamicPartitions = getMaxDynamicPartitions(hiveConf);
+            outputJobInfo.setMaximumDynamicPartitions(maxDynamicPartitions);
+
+            HCatUtil.configureOutputStorageHandler(storageHandler, job, outputJobInfo);
+
+            Path tblPath = new Path(table.getTTable().getSd().getLocation());
+
+            /*  Set the umask in conf such that files/dirs get created with table-dir
+            * permissions. Following three assumptions are made:
+            * 1. Actual files/dirs creation is done by RecordWriter of underlying
+            * output format. It is assumed that they use default permissions while creation.
+            * 2. Default Permissions = FsPermission.getDefault() = 777.
+            * 3. UMask is honored by underlying filesystem.
+            */
+
+            FsPermission.setUMask(conf, FsPermission.getDefault().applyUMask(
+                tblPath.getFileSystem(conf).getFileStatus(tblPath).getPermission()));
+
+            if (Security.getInstance().isSecurityEnabled()) {
+                Security.getInstance().handleSecurity(job, outputJobInfo, client, conf, harRequested);
+            }
+        } catch (Exception e) {
+            if (e instanceof HCatException) {
+                throw (HCatException) e;
+            } else {
+                throw new HCatException(ErrorType.ERROR_SET_OUTPUT, e);
+            }
+        } finally {
+            HCatUtil.closeHiveClientQuietly(client);
         }
-
-        HCatSchema tableSchema = HCatUtil.extractSchema(table);
-        StorerInfo storerInfo =
-            InternalUtil.extractStorerInfo(table.getTTable().getSd(), table.getParameters());
-
-        List<String> partitionCols = new ArrayList<String>();
-        for(FieldSchema schema : table.getPartitionKeys()) {
-          partitionCols.add(schema.getName());
-        }
-
-       HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(job.getConfiguration(), storerInfo);
-
-        //Serialize the output info into the configuration
-        outputJobInfo.setTableInfo(HCatTableInfo.valueOf(table.getTTable()));
-        outputJobInfo.setOutputSchema(tableSchema);
-        harRequested = getHarRequested(hiveConf);
-        outputJobInfo.setHarRequested(harRequested);
-        maxDynamicPartitions = getMaxDynamicPartitions(hiveConf);
-        outputJobInfo.setMaximumDynamicPartitions(maxDynamicPartitions);
-
-        HCatUtil.configureOutputStorageHandler(storageHandler,job,outputJobInfo);
-
-        Path tblPath = new Path(table.getTTable().getSd().getLocation());
-
-        /*  Set the umask in conf such that files/dirs get created with table-dir
-         * permissions. Following three assumptions are made:
-         * 1. Actual files/dirs creation is done by RecordWriter of underlying
-         * output format. It is assumed that they use default permissions while creation.
-         * 2. Default Permissions = FsPermission.getDefault() = 777.
-         * 3. UMask is honored by underlying filesystem.
-         */
-
-        FsPermission.setUMask(conf, FsPermission.getDefault().applyUMask(
-            tblPath.getFileSystem(conf).getFileStatus(tblPath).getPermission()));
-
-        if(Security.getInstance().isSecurityEnabled()) {
-            Security.getInstance().handleSecurity(job, outputJobInfo, client, conf, harRequested);
-        }
-      } catch(Exception e) {
-        if( e instanceof HCatException ) {
-          throw (HCatException) e;
-        } else {
-          throw new HCatException(ErrorType.ERROR_SET_OUTPUT, e);
-        }
-      } finally {
-        HCatUtil.closeHiveClientQuietly(client);
-      }
     }
 
     /**
@@ -207,7 +207,7 @@
     public static void setSchema(final Job job, final HCatSchema schema) throws IOException {
 
         OutputJobInfo jobInfo = getJobInfo(job);
-        Map<String,String> partMap = jobInfo.getPartitionValues();
+        Map<String, String> partMap = jobInfo.getPartitionValues();
         setPartDetails(jobInfo, schema, partMap);
         job.getConfiguration().set(HCatConstants.HCAT_KEY_OUTPUT_INFO, HCatUtil.serialize(jobInfo));
     }
@@ -222,9 +222,9 @@
      */
     @Override
     public RecordWriter<WritableComparable<?>, HCatRecord>
-        getRecordWriter(TaskAttemptContext context)
+    getRecordWriter(TaskAttemptContext context)
         throws IOException, InterruptedException {
-      return getOutputFormat(context).getRecordWriter(context);
+        return getOutputFormat(context).getRecordWriter(context);
     }
 
 
@@ -238,25 +238,25 @@
      */
     @Override
     public OutputCommitter getOutputCommitter(TaskAttemptContext context
-                                       ) throws IOException, InterruptedException {
+    ) throws IOException, InterruptedException {
         return getOutputFormat(context).getOutputCommitter(context);
     }
 
     private static int getMaxDynamicPartitions(HiveConf hConf) {
-      // by default the bounds checking for maximum number of
-      // dynamic partitions is disabled (-1)
-      int maxDynamicPartitions = -1;
+        // by default the bounds checking for maximum number of
+        // dynamic partitions is disabled (-1)
+        int maxDynamicPartitions = -1;
 
-      if (HCatConstants.HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED){
-        maxDynamicPartitions = hConf.getIntVar(
-                                HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS);
-      }
+        if (HCatConstants.HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED) {
+            maxDynamicPartitions = hConf.getIntVar(
+                HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS);
+        }
 
-      return maxDynamicPartitions;
+        return maxDynamicPartitions;
     }
 
     private static boolean getHarRequested(HiveConf hConf) {
-      return hConf.getBoolVar(HiveConf.ConfVars.HIVEARCHIVEENABLED);
+        return hConf.getBoolVar(HiveConf.ConfVars.HIVEARCHIVEENABLED);
     }
 
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatRecordReader.java b/src/java/org/apache/hcatalog/mapreduce/HCatRecordReader.java
index c038619..e91d12c 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatRecordReader.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatRecordReader.java
@@ -61,7 +61,7 @@
 
     private Deserializer deserializer;
 
-    private Map<String,String> valuesNotInDataCols;
+    private Map<String, String> valuesNotInDataCols;
 
     private HCatSchema outputSchema = null;
     private HCatSchema dataSchema = null;
@@ -70,9 +70,9 @@
      * Instantiates a new hcat record reader.
      */
     public HCatRecordReader(HCatStorageHandler storageHandler,
-                     Map<String,String> valuesNotInDataCols) {
-      this.storageHandler = storageHandler;
-      this.valuesNotInDataCols = valuesNotInDataCols;
+                            Map<String, String> valuesNotInDataCols) {
+        this.storageHandler = storageHandler;
+        this.valuesNotInDataCols = valuesNotInDataCols;
     }
 
     /* (non-Javadoc)
@@ -82,62 +82,62 @@
      */
     @Override
     public void initialize(org.apache.hadoop.mapreduce.InputSplit split,
-        TaskAttemptContext taskContext) throws IOException, InterruptedException {
+                           TaskAttemptContext taskContext) throws IOException, InterruptedException {
 
-      HCatSplit hcatSplit = InternalUtil.castToHCatSplit(split);
+        HCatSplit hcatSplit = InternalUtil.castToHCatSplit(split);
 
-      baseRecordReader = createBaseRecordReader(hcatSplit, storageHandler, taskContext);
-      createDeserializer(hcatSplit, storageHandler, taskContext);
+        baseRecordReader = createBaseRecordReader(hcatSplit, storageHandler, taskContext);
+        createDeserializer(hcatSplit, storageHandler, taskContext);
 
-      // Pull the output schema out of the TaskAttemptContext
-      outputSchema = (HCatSchema) HCatUtil.deserialize(
-          taskContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA));
+        // Pull the output schema out of the TaskAttemptContext
+        outputSchema = (HCatSchema) HCatUtil.deserialize(
+            taskContext.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA));
 
-      if (outputSchema == null) {
-        outputSchema = hcatSplit.getTableSchema();
-      }
+        if (outputSchema == null) {
+            outputSchema = hcatSplit.getTableSchema();
+        }
 
-      // Pull the table schema out of the Split info
-      // TODO This should be passed in the TaskAttemptContext instead
-      dataSchema = hcatSplit.getDataSchema();
+        // Pull the table schema out of the Split info
+        // TODO This should be passed in the TaskAttemptContext instead
+        dataSchema = hcatSplit.getDataSchema();
 
-      errorTracker = new InputErrorTracker(taskContext.getConfiguration());
+        errorTracker = new InputErrorTracker(taskContext.getConfiguration());
     }
 
     private org.apache.hadoop.mapred.RecordReader createBaseRecordReader(HCatSplit hcatSplit,
-        HCatStorageHandler storageHandler, TaskAttemptContext taskContext) throws IOException {
+                                                                         HCatStorageHandler storageHandler, TaskAttemptContext taskContext) throws IOException {
 
-      JobConf jobConf = HCatUtil.getJobConfFromContext(taskContext);
-      HCatUtil.copyJobPropertiesToJobConf(hcatSplit.getPartitionInfo().getJobProperties(), jobConf);
-      org.apache.hadoop.mapred.InputFormat inputFormat =
-          HCatInputFormat.getMapRedInputFormat(jobConf, storageHandler.getInputFormatClass());
-      return inputFormat.getRecordReader(hcatSplit.getBaseSplit(), jobConf,
-          InternalUtil.createReporter(taskContext));
+        JobConf jobConf = HCatUtil.getJobConfFromContext(taskContext);
+        HCatUtil.copyJobPropertiesToJobConf(hcatSplit.getPartitionInfo().getJobProperties(), jobConf);
+        org.apache.hadoop.mapred.InputFormat inputFormat =
+            HCatInputFormat.getMapRedInputFormat(jobConf, storageHandler.getInputFormatClass());
+        return inputFormat.getRecordReader(hcatSplit.getBaseSplit(), jobConf,
+            InternalUtil.createReporter(taskContext));
     }
 
     private void createDeserializer(HCatSplit hcatSplit, HCatStorageHandler storageHandler,
-        TaskAttemptContext taskContext) throws IOException {
+                                    TaskAttemptContext taskContext) throws IOException {
 
-      deserializer = ReflectionUtils.newInstance(storageHandler.getSerDeClass(),
-          taskContext.getConfiguration());
+        deserializer = ReflectionUtils.newInstance(storageHandler.getSerDeClass(),
+            taskContext.getConfiguration());
 
-      try {
-        InternalUtil.initializeDeserializer(deserializer, storageHandler.getConf(),
-            hcatSplit.getPartitionInfo().getTableInfo(),
-            hcatSplit.getPartitionInfo().getPartitionSchema());
-      } catch (SerDeException e) {
-        throw new IOException("Failed initializing deserializer "
-            + storageHandler.getSerDeClass().getName(), e);
-      }
+        try {
+            InternalUtil.initializeDeserializer(deserializer, storageHandler.getConf(),
+                hcatSplit.getPartitionInfo().getTableInfo(),
+                hcatSplit.getPartitionInfo().getPartitionSchema());
+        } catch (SerDeException e) {
+            throw new IOException("Failed initializing deserializer "
+                + storageHandler.getSerDeClass().getName(), e);
+        }
     }
 
-  /* (non-Javadoc)
-     * @see org.apache.hadoop.mapreduce.RecordReader#getCurrentKey()
-     */
+    /* (non-Javadoc)
+    * @see org.apache.hadoop.mapreduce.RecordReader#getCurrentKey()
+    */
     @Override
     public WritableComparable getCurrentKey()
-    throws IOException, InterruptedException {
-      return currentKey;
+        throws IOException, InterruptedException {
+        return currentKey;
     }
 
     /* (non-Javadoc)
@@ -145,140 +145,140 @@
      */
     @Override
     public HCatRecord getCurrentValue() throws IOException, InterruptedException {
-      return currentHCatRecord;
+        return currentHCatRecord;
     }
 
     /* (non-Javadoc)
      * @see org.apache.hadoop.mapreduce.RecordReader#getProgress()
      */
     @Override
-    public float getProgress()  {
+    public float getProgress() {
         try {
-          return baseRecordReader.getProgress();
+            return baseRecordReader.getProgress();
         } catch (IOException e) {
-            LOG.warn("Exception in HCatRecord reader",e);
+            LOG.warn("Exception in HCatRecord reader", e);
         }
         return 0.0f; // errored
     }
 
-  /**
-   * Check if the wrapped RecordReader has another record, and if so convert it into an
-   * HCatRecord. We both check for records and convert here so a configurable percent of
-   * bad records can be tolerated.
-   *
-   * @return if there is a next record
-   * @throws IOException on error
-   * @throws InterruptedException on error
-   */
-  @Override
-  public boolean nextKeyValue() throws IOException, InterruptedException {
-    if (currentKey == null) {
-      currentKey = baseRecordReader.createKey();
-      currentValue = baseRecordReader.createValue();
-    }
-
-    while (baseRecordReader.next(currentKey, currentValue)) {
-      HCatRecord r = null;
-      Throwable t = null;
-
-      errorTracker.incRecords();
-
-      try {
-        Object o = deserializer.deserialize(currentValue);
-        r = new LazyHCatRecord(o, deserializer.getObjectInspector());
-      } catch (Throwable throwable) {
-        t = throwable;
-      }
-
-      if (r == null) {
-        errorTracker.incErrors(t);
-        continue;
-      }
-
-      DefaultHCatRecord dr = new DefaultHCatRecord(outputSchema.size());
-      int i = 0;
-      for (String fieldName : outputSchema.getFieldNames()) {
-        if (dataSchema.getPosition(fieldName) != null) {
-          dr.set(i, r.get(fieldName, dataSchema));
-        } else {
-          dr.set(i, valuesNotInDataCols.get(fieldName));
-        }
-        i++;
-      }
-
-      currentHCatRecord = dr;
-      return true;
-    }
-
-    return false;
-  }
-
-  /* (non-Javadoc)
-     * @see org.apache.hadoop.mapreduce.RecordReader#close()
+    /**
+     * Check if the wrapped RecordReader has another record, and if so convert it into an
+     * HCatRecord. We both check for records and convert here so a configurable percent of
+     * bad records can be tolerated.
+     *
+     * @return if there is a next record
+     * @throws IOException on error
+     * @throws InterruptedException on error
      */
     @Override
+    public boolean nextKeyValue() throws IOException, InterruptedException {
+        if (currentKey == null) {
+            currentKey = baseRecordReader.createKey();
+            currentValue = baseRecordReader.createValue();
+        }
+
+        while (baseRecordReader.next(currentKey, currentValue)) {
+            HCatRecord r = null;
+            Throwable t = null;
+
+            errorTracker.incRecords();
+
+            try {
+                Object o = deserializer.deserialize(currentValue);
+                r = new LazyHCatRecord(o, deserializer.getObjectInspector());
+            } catch (Throwable throwable) {
+                t = throwable;
+            }
+
+            if (r == null) {
+                errorTracker.incErrors(t);
+                continue;
+            }
+
+            DefaultHCatRecord dr = new DefaultHCatRecord(outputSchema.size());
+            int i = 0;
+            for (String fieldName : outputSchema.getFieldNames()) {
+                if (dataSchema.getPosition(fieldName) != null) {
+                    dr.set(i, r.get(fieldName, dataSchema));
+                } else {
+                    dr.set(i, valuesNotInDataCols.get(fieldName));
+                }
+                i++;
+            }
+
+            currentHCatRecord = dr;
+            return true;
+        }
+
+        return false;
+    }
+
+    /* (non-Javadoc)
+    * @see org.apache.hadoop.mapreduce.RecordReader#close()
+    */
+    @Override
     public void close() throws IOException {
         baseRecordReader.close();
     }
 
-  /**
-   * Tracks number of of errors in input and throws a Runtime exception
-   * if the rate of errors crosses a limit.
-   * <br/>
-   * The intention is to skip over very rare file corruption or incorrect
-   * input, but catch programmer errors (incorrect format, or incorrect
-   * deserializers etc).
-   *
-   * This class was largely copied from Elephant-Bird (thanks @rangadi!)
-   * https://github.com/kevinweil/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/mapreduce/input/LzoRecordReader.java
-   */
-  static class InputErrorTracker {
-    long numRecords;
-    long numErrors;
+    /**
+     * Tracks number of of errors in input and throws a Runtime exception
+     * if the rate of errors crosses a limit.
+     * <br/>
+     * The intention is to skip over very rare file corruption or incorrect
+     * input, but catch programmer errors (incorrect format, or incorrect
+     * deserializers etc).
+     *
+     * This class was largely copied from Elephant-Bird (thanks @rangadi!)
+     * https://github.com/kevinweil/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/mapreduce/input/LzoRecordReader.java
+     */
+    static class InputErrorTracker {
+        long numRecords;
+        long numErrors;
 
-    double errorThreshold; // max fraction of errors allowed
-    long minErrors; // throw error only after this many errors
+        double errorThreshold; // max fraction of errors allowed
+        long minErrors; // throw error only after this many errors
 
-    InputErrorTracker(Configuration conf) {
-      errorThreshold = conf.getFloat(HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY,
-          HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT);
-      minErrors = conf.getLong(HCatConstants.HCAT_INPUT_BAD_RECORD_MIN_KEY,
-          HCatConstants.HCAT_INPUT_BAD_RECORD_MIN_DEFAULT);
-      numRecords = 0;
-      numErrors = 0;
+        InputErrorTracker(Configuration conf) {
+            errorThreshold = conf.getFloat(HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY,
+                HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_DEFAULT);
+            minErrors = conf.getLong(HCatConstants.HCAT_INPUT_BAD_RECORD_MIN_KEY,
+                HCatConstants.HCAT_INPUT_BAD_RECORD_MIN_DEFAULT);
+            numRecords = 0;
+            numErrors = 0;
+        }
+
+        void incRecords() {
+            numRecords++;
+        }
+
+        void incErrors(Throwable cause) {
+            numErrors++;
+            if (numErrors > numRecords) {
+                // incorrect use of this class
+                throw new RuntimeException("Forgot to invoke incRecords()?");
+            }
+
+            if (cause == null) {
+                cause = new Exception("Unknown error");
+            }
+
+            if (errorThreshold <= 0) { // no errors are tolerated
+                throw new RuntimeException("error while reading input records", cause);
+            }
+
+            LOG.warn("Error while reading an input record ("
+                + numErrors + " out of " + numRecords + " so far ): ", cause);
+
+            double errRate = numErrors / (double) numRecords;
+
+            // will always excuse the first error. We can decide if single
+            // error crosses threshold inside close() if we want to.
+            if (numErrors >= minErrors && errRate > errorThreshold) {
+                LOG.error(numErrors + " out of " + numRecords
+                    + " crosses configured threshold (" + errorThreshold + ")");
+                throw new RuntimeException("error rate while reading input records crossed threshold", cause);
+            }
+        }
     }
-
-    void incRecords() {
-      numRecords++;
-    }
-
-    void incErrors(Throwable cause) {
-      numErrors++;
-      if (numErrors > numRecords) {
-        // incorrect use of this class
-        throw new RuntimeException("Forgot to invoke incRecords()?");
-      }
-
-      if (cause == null) {
-        cause = new Exception("Unknown error");
-      }
-
-      if (errorThreshold <= 0) { // no errors are tolerated
-        throw new RuntimeException("error while reading input records", cause);
-      }
-
-      LOG.warn("Error while reading an input record ("
-          + numErrors + " out of " + numRecords + " so far ): ", cause);
-
-      double errRate = numErrors / (double) numRecords;
-
-      // will always excuse the first error. We can decide if single
-      // error crosses threshold inside close() if we want to.
-      if (numErrors >= minErrors && errRate > errorThreshold) {
-        LOG.error(numErrors + " out of " + numRecords
-            + " crosses configured threshold (" + errorThreshold + ")");
-        throw new RuntimeException("error rate while reading input records crossed threshold", cause);
-      }
-    }
-  }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatSplit.java b/src/java/org/apache/hcatalog/mapreduce/HCatSplit.java
index c510b9c..c92d665 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatSplit.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatSplit.java
@@ -33,7 +33,7 @@
 
 /** The HCatSplit wrapper around the InputSplit returned by the underlying InputFormat */
 public class HCatSplit extends InputSplit
-  implements Writable,org.apache.hadoop.mapred.InputSplit {
+    implements Writable, org.apache.hadoop.mapred.InputSplit {
 
     private static final Logger LOG = LoggerFactory.getLogger(HCatSplit.class);
     /** The partition info for the split. */
@@ -61,13 +61,13 @@
      * @param tableSchema the table level schema
      */
     public HCatSplit(PartInfo partitionInfo,
-        org.apache.hadoop.mapred.InputSplit baseMapRedSplit,
-        HCatSchema tableSchema) {
+                     org.apache.hadoop.mapred.InputSplit baseMapRedSplit,
+                     HCatSchema tableSchema) {
 
-      this.partitionInfo = partitionInfo;
-      // dataSchema can be obtained from partitionInfo.getPartitionSchema()
-      this.baseMapRedSplit = baseMapRedSplit;
-      this.tableSchema = tableSchema;
+        this.partitionInfo = partitionInfo;
+        // dataSchema can be obtained from partitionInfo.getPartitionSchema()
+        this.baseMapRedSplit = baseMapRedSplit;
+        this.tableSchema = tableSchema;
     }
 
     /**
@@ -99,7 +99,7 @@
      * @return the table schema
      */
     public HCatSchema getTableSchema() {
-      return this.tableSchema;
+        return this.tableSchema;
     }
 
     /* (non-Javadoc)
@@ -108,9 +108,9 @@
     @Override
     public long getLength() {
         try {
-          return baseMapRedSplit.getLength();
+            return baseMapRedSplit.getLength();
         } catch (IOException e) {
-          LOG.warn("Exception in HCatSplit",e);
+            LOG.warn("Exception in HCatSplit", e);
         }
         return 0; // we errored
     }
@@ -121,9 +121,9 @@
     @Override
     public String[] getLocations() {
         try {
-          return baseMapRedSplit.getLocations();
+            return baseMapRedSplit.getLocations();
         } catch (IOException e) {
-            LOG.warn("Exception in HCatSplit",e);
+            LOG.warn("Exception in HCatSplit", e);
         }
         return new String[0]; // we errored
     }
@@ -139,23 +139,23 @@
 
         String baseSplitClassName = WritableUtils.readString(input);
         org.apache.hadoop.mapred.InputSplit split;
-        try{
+        try {
             Class<? extends org.apache.hadoop.mapred.InputSplit> splitClass =
                 (Class<? extends org.apache.hadoop.mapred.InputSplit>) Class.forName(baseSplitClassName);
 
             //Class.forName().newInstance() does not work if the underlying
             //InputSplit has package visibility
             Constructor<? extends org.apache.hadoop.mapred.InputSplit>
-              constructor =
+                constructor =
                 splitClass.getDeclaredConstructor(new Class[]{});
             constructor.setAccessible(true);
 
             split = constructor.newInstance();
             // read baseSplit from input
-            ((Writable)split).readFields(input);
+            ((Writable) split).readFields(input);
             this.baseMapRedSplit = split;
-        }catch(Exception e){
-            throw new IOException ("Exception from " + baseSplitClassName, e);
+        } catch (Exception e) {
+            throw new IOException("Exception from " + baseSplitClassName, e);
         }
 
         String tableSchemaString = WritableUtils.readString(input);
@@ -173,7 +173,7 @@
         WritableUtils.writeString(output, partitionInfoString);
 
         WritableUtils.writeString(output, baseMapRedSplit.getClass().getName());
-        Writable baseSplitWritable = (Writable)baseMapRedSplit;
+        Writable baseSplitWritable = (Writable) baseMapRedSplit;
         //write  baseSplit into output
         baseSplitWritable.write(output);
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatStorageHandler.java b/src/java/org/apache/hcatalog/mapreduce/HCatStorageHandler.java
index d1ebf63..1ebcaa4 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatStorageHandler.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatStorageHandler.java
@@ -34,6 +34,7 @@
 public abstract class HCatStorageHandler implements HiveStorageHandler {
 
     //TODO move this to HiveStorageHandler
+
     /**
      * This method is called to allow the StorageHandlers the chance
      * to populate the JobContext.getConfiguration() with properties that
@@ -53,6 +54,7 @@
     public abstract void configureInputJobProperties(TableDesc tableDesc, Map<String, String> jobProperties);
 
     //TODO move this to HiveStorageHandler
+
     /**
      * This method is called to allow the StorageHandlers the chance
      * to populate the JobContext.getConfiguration() with properties that
@@ -72,46 +74,46 @@
     public abstract void configureOutputJobProperties(TableDesc tableDesc, Map<String, String> jobProperties);
 
     /**
-     * 
-     * 
+     *
+     *
      * @return authorization provider
      * @throws HiveException
      */
     public abstract HiveAuthorizationProvider getAuthorizationProvider()
-            throws HiveException;
-    
+        throws HiveException;
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.hadoop.hive.ql.metadata.HiveStorageHandler#
-     * configureTableJobProperties(org.apache.hadoop.hive.ql.plan.TableDesc,
-     * java.util.Map)
-     */
+    * (non-Javadoc)
+    *
+    * @see org.apache.hadoop.hive.ql.metadata.HiveStorageHandler#
+    * configureTableJobProperties(org.apache.hadoop.hive.ql.plan.TableDesc,
+    * java.util.Map)
+    */
     @Override
     @Deprecated
     public final void configureTableJobProperties(TableDesc tableDesc,
-            Map<String, String> jobProperties) {
+                                                  Map<String, String> jobProperties) {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.hadoop.conf.Configurable#getConf()
-     */
+    * (non-Javadoc)
+    *
+    * @see org.apache.hadoop.conf.Configurable#getConf()
+    */
     @Override
     public abstract Configuration getConf();
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.hadoop.conf.Configurable#setConf(org.apache.hadoop.conf.
-     * Configuration)
-     */
+    * (non-Javadoc)
+    *
+    * @see org.apache.hadoop.conf.Configurable#setConf(org.apache.hadoop.conf.
+    * Configuration)
+    */
     @Override
     public abstract void setConf(Configuration conf);
 
     OutputFormatContainer getOutputFormatContainer(OutputFormat outputFormat) {
         return new DefaultOutputFormatContainer(outputFormat);
     }
-    
+
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/HCatTableInfo.java b/src/java/org/apache/hcatalog/mapreduce/HCatTableInfo.java
index 11f93e9..8e69b7e 100644
--- a/src/java/org/apache/hcatalog/mapreduce/HCatTableInfo.java
+++ b/src/java/org/apache/hcatalog/mapreduce/HCatTableInfo.java
@@ -35,150 +35,152 @@
 public class HCatTableInfo implements Serializable {
 
 
-  private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-  /** The db and table names */
-  private final String databaseName;
-  private final String tableName;
+    /** The db and table names */
+    private final String databaseName;
+    private final String tableName;
 
-  /** The table schema. */
-  private final HCatSchema dataColumns;
-  private final HCatSchema partitionColumns;
+    /** The table schema. */
+    private final HCatSchema dataColumns;
+    private final HCatSchema partitionColumns;
 
-  /** The table being written to */
-  private final Table table;
+    /** The table being written to */
+    private final Table table;
 
-  /** The storer info */
-  private StorerInfo storerInfo;
+    /** The storer info */
+    private StorerInfo storerInfo;
 
-  /**
-   * Initializes a new HCatTableInfo instance to be used with {@link HCatInputFormat}
-   * for reading data from a table.
-   * work with hadoop security, the kerberos principal name of the server - else null
-   * The principal name should be of the form:
-   * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com"
-   * The special string _HOST will be replaced automatically with the correct host name
-   * @param databaseName the db name
-   * @param tableName the table name
-   * @param dataColumns schema of columns which contain data
-   * @param partitionColumns schema of partition columns
-   * @param storerInfo information about storage descriptor
-   * @param table hive metastore table class
-   */
-  HCatTableInfo(
-      String databaseName,
-      String tableName,
-      HCatSchema dataColumns,
-      HCatSchema partitionColumns,
-      StorerInfo storerInfo,
-      Table table) {
-    this.databaseName = (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
-    this.tableName = tableName;
-    this.dataColumns = dataColumns;
-    this.table = table;
-    this.storerInfo = storerInfo;
-    this.partitionColumns = partitionColumns;
-  }
+    /**
+     * Initializes a new HCatTableInfo instance to be used with {@link HCatInputFormat}
+     * for reading data from a table.
+     * work with hadoop security, the kerberos principal name of the server - else null
+     * The principal name should be of the form:
+     * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com"
+     * The special string _HOST will be replaced automatically with the correct host name
+     * @param databaseName the db name
+     * @param tableName the table name
+     * @param dataColumns schema of columns which contain data
+     * @param partitionColumns schema of partition columns
+     * @param storerInfo information about storage descriptor
+     * @param table hive metastore table class
+     */
+    HCatTableInfo(
+        String databaseName,
+        String tableName,
+        HCatSchema dataColumns,
+        HCatSchema partitionColumns,
+        StorerInfo storerInfo,
+        Table table) {
+        this.databaseName = (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
+        this.tableName = tableName;
+        this.dataColumns = dataColumns;
+        this.table = table;
+        this.storerInfo = storerInfo;
+        this.partitionColumns = partitionColumns;
+    }
 
-  /**
-   * Gets the value of databaseName
-   * @return the databaseName
-   */
-  public String getDatabaseName() {
-    return databaseName;
-  }
+    /**
+     * Gets the value of databaseName
+     * @return the databaseName
+     */
+    public String getDatabaseName() {
+        return databaseName;
+    }
 
-  /**
-   * Gets the value of tableName
-   * @return the tableName
-   */
-  public String getTableName() {
-    return tableName;
-  }
+    /**
+     * Gets the value of tableName
+     * @return the tableName
+     */
+    public String getTableName() {
+        return tableName;
+    }
 
-  /**
-   * @return return schema of data columns as defined in meta store
-   */
-  public HCatSchema getDataColumns() {
-    return dataColumns;
-  }
+    /**
+     * @return return schema of data columns as defined in meta store
+     */
+    public HCatSchema getDataColumns() {
+        return dataColumns;
+    }
 
-  /**
-   * @return schema of partition columns
-   */
-  public HCatSchema getPartitionColumns() {
-    return partitionColumns;
-  }
+    /**
+     * @return schema of partition columns
+     */
+    public HCatSchema getPartitionColumns() {
+        return partitionColumns;
+    }
 
-  /**
-   * @return the storerInfo
-   */
-  public StorerInfo getStorerInfo() {
-    return storerInfo;
-  }
+    /**
+     * @return the storerInfo
+     */
+    public StorerInfo getStorerInfo() {
+        return storerInfo;
+    }
 
-  public String getTableLocation() {
-      return table.getSd().getLocation();
-  }
+    public String getTableLocation() {
+        return table.getSd().getLocation();
+    }
 
-  /**
-   * minimize dependency on hive classes so this is package private
-   * this should eventually no longer be used
-   * @return hive metastore representation of table
-   */
-  Table getTable() {
-    return table;
-  }
+    /**
+     * minimize dependency on hive classes so this is package private
+     * this should eventually no longer be used
+     * @return hive metastore representation of table
+     */
+    Table getTable() {
+        return table;
+    }
 
-  /**
-   * create an HCatTableInfo instance from the supplied Hive Table instance
-   * @param table to create an instance from
-   * @return HCatTableInfo
-   * @throws IOException
-   */
-  static HCatTableInfo valueOf(Table table) throws IOException {
-    // Explicitly use {@link org.apache.hadoop.hive.ql.metadata.Table} when getting the schema,
-    // but store @{link org.apache.hadoop.hive.metastore.api.Table} as this class is serialized
-    // into the job conf.
-    org.apache.hadoop.hive.ql.metadata.Table mTable =
-        new org.apache.hadoop.hive.ql.metadata.Table(table);
-    HCatSchema schema = HCatUtil.extractSchema(mTable);
-    StorerInfo storerInfo =
-        InternalUtil.extractStorerInfo(table.getSd(), table.getParameters());
-    HCatSchema partitionColumns = HCatUtil.getPartitionColumns(mTable);
-    return new HCatTableInfo(table.getDbName(), table.getTableName(), schema,
-        partitionColumns, storerInfo, table);
-  }
+    /**
+     * create an HCatTableInfo instance from the supplied Hive Table instance
+     * @param table to create an instance from
+     * @return HCatTableInfo
+     * @throws IOException
+     */
+    static HCatTableInfo valueOf(Table table) throws IOException {
+        // Explicitly use {@link org.apache.hadoop.hive.ql.metadata.Table} when getting the schema,
+        // but store @{link org.apache.hadoop.hive.metastore.api.Table} as this class is serialized
+        // into the job conf.
+        org.apache.hadoop.hive.ql.metadata.Table mTable =
+            new org.apache.hadoop.hive.ql.metadata.Table(table);
+        HCatSchema schema = HCatUtil.extractSchema(mTable);
+        StorerInfo storerInfo =
+            InternalUtil.extractStorerInfo(table.getSd(), table.getParameters());
+        HCatSchema partitionColumns = HCatUtil.getPartitionColumns(mTable);
+        return new HCatTableInfo(table.getDbName(), table.getTableName(), schema,
+            partitionColumns, storerInfo, table);
+    }
 
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
 
-    HCatTableInfo tableInfo = (HCatTableInfo) o;
+        HCatTableInfo tableInfo = (HCatTableInfo) o;
 
-    if (dataColumns != null ? !dataColumns.equals(tableInfo.dataColumns) : tableInfo.dataColumns != null) return false;
-    if (databaseName != null ? !databaseName.equals(tableInfo.databaseName) : tableInfo.databaseName != null) return false;
-    if (partitionColumns != null ? !partitionColumns.equals(tableInfo.partitionColumns) : tableInfo.partitionColumns != null)
-      return false;
-    if (storerInfo != null ? !storerInfo.equals(tableInfo.storerInfo) : tableInfo.storerInfo != null) return false;
-    if (table != null ? !table.equals(tableInfo.table) : tableInfo.table != null) return false;
-    if (tableName != null ? !tableName.equals(tableInfo.tableName) : tableInfo.tableName != null) return false;
+        if (dataColumns != null ? !dataColumns.equals(tableInfo.dataColumns) : tableInfo.dataColumns != null)
+            return false;
+        if (databaseName != null ? !databaseName.equals(tableInfo.databaseName) : tableInfo.databaseName != null)
+            return false;
+        if (partitionColumns != null ? !partitionColumns.equals(tableInfo.partitionColumns) : tableInfo.partitionColumns != null)
+            return false;
+        if (storerInfo != null ? !storerInfo.equals(tableInfo.storerInfo) : tableInfo.storerInfo != null) return false;
+        if (table != null ? !table.equals(tableInfo.table) : tableInfo.table != null) return false;
+        if (tableName != null ? !tableName.equals(tableInfo.tableName) : tableInfo.tableName != null) return false;
 
-    return true;
-  }
+        return true;
+    }
 
 
-  @Override
-  public int hashCode() {
-    int result = databaseName != null ? databaseName.hashCode() : 0;
-    result = 31 * result + (tableName != null ? tableName.hashCode() : 0);
-    result = 31 * result + (dataColumns != null ? dataColumns.hashCode() : 0);
-    result = 31 * result + (partitionColumns != null ? partitionColumns.hashCode() : 0);
-    result = 31 * result + (table != null ? table.hashCode() : 0);
-    result = 31 * result + (storerInfo != null ? storerInfo.hashCode() : 0);
-    return result;
-  }
+    @Override
+    public int hashCode() {
+        int result = databaseName != null ? databaseName.hashCode() : 0;
+        result = 31 * result + (tableName != null ? tableName.hashCode() : 0);
+        result = 31 * result + (dataColumns != null ? dataColumns.hashCode() : 0);
+        result = 31 * result + (partitionColumns != null ? partitionColumns.hashCode() : 0);
+        result = 31 * result + (table != null ? table.hashCode() : 0);
+        result = 31 * result + (storerInfo != null ? storerInfo.hashCode() : 0);
+        return result;
+    }
 
 }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/InitializeInput.java b/src/java/org/apache/hcatalog/mapreduce/InitializeInput.java
index f14e359..ce65623 100644
--- a/src/java/org/apache/hcatalog/mapreduce/InitializeInput.java
+++ b/src/java/org/apache/hcatalog/mapreduce/InitializeInput.java
@@ -50,136 +50,136 @@
 
     private static final Logger LOG = LoggerFactory.getLogger(InitializeInput.class);
 
-  /**
-   * Set the input to use for the Job. This queries the metadata server with the specified
-   * partition predicates, gets the matching partitions, and puts the information in the job
-   * configuration object.
-   *
-   * To ensure a known InputJobInfo state, only the database name, table name, filter, and
-   * properties are preserved. All other modification from the given InputJobInfo are discarded.
-   *
-   * After calling setInput, InputJobInfo can be retrieved from the job configuration as follows:
-   * {code}
-   * InputJobInfo inputInfo = (InputJobInfo) HCatUtil.deserialize(
-   *     job.getConfiguration().get(HCatConstants.HCAT_KEY_JOB_INFO));
-   * {code}
-   *
-   * @param job the job object
-   * @param theirInputJobInfo information on the Input to read
-   * @throws Exception
-   */
-  public static void setInput(Job job, InputJobInfo theirInputJobInfo) throws Exception {
-    InputJobInfo inputJobInfo = InputJobInfo.create(
-        theirInputJobInfo.getDatabaseName(),
-        theirInputJobInfo.getTableName(),
-        theirInputJobInfo.getFilter());
-    inputJobInfo.getProperties().putAll(theirInputJobInfo.getProperties());
-    job.getConfiguration().set(
-        HCatConstants.HCAT_KEY_JOB_INFO,
-        HCatUtil.serialize(getInputJobInfo(job, inputJobInfo, null)));
-  }
+    /**
+     * Set the input to use for the Job. This queries the metadata server with the specified
+     * partition predicates, gets the matching partitions, and puts the information in the job
+     * configuration object.
+     *
+     * To ensure a known InputJobInfo state, only the database name, table name, filter, and
+     * properties are preserved. All other modification from the given InputJobInfo are discarded.
+     *
+     * After calling setInput, InputJobInfo can be retrieved from the job configuration as follows:
+     * {code}
+     * InputJobInfo inputInfo = (InputJobInfo) HCatUtil.deserialize(
+     *     job.getConfiguration().get(HCatConstants.HCAT_KEY_JOB_INFO));
+     * {code}
+     *
+     * @param job the job object
+     * @param theirInputJobInfo information on the Input to read
+     * @throws Exception
+     */
+    public static void setInput(Job job, InputJobInfo theirInputJobInfo) throws Exception {
+        InputJobInfo inputJobInfo = InputJobInfo.create(
+            theirInputJobInfo.getDatabaseName(),
+            theirInputJobInfo.getTableName(),
+            theirInputJobInfo.getFilter());
+        inputJobInfo.getProperties().putAll(theirInputJobInfo.getProperties());
+        job.getConfiguration().set(
+            HCatConstants.HCAT_KEY_JOB_INFO,
+            HCatUtil.serialize(getInputJobInfo(job, inputJobInfo, null)));
+    }
 
-  /**
-   * Returns the given InputJobInfo after populating with data queried from the metadata service.
-   */
-  private static InputJobInfo getInputJobInfo(
-      Job job, InputJobInfo inputJobInfo, String locationFilter) throws Exception {
+    /**
+     * Returns the given InputJobInfo after populating with data queried from the metadata service.
+     */
+    private static InputJobInfo getInputJobInfo(
+        Job job, InputJobInfo inputJobInfo, String locationFilter) throws Exception {
 
-    HiveMetaStoreClient client = null;
-    HiveConf hiveConf = null;
-    try {
-      if (job != null){
-        hiveConf = HCatUtil.getHiveConf(job.getConfiguration());
-      } else {
-        hiveConf = new HiveConf(HCatInputFormat.class);
-      }
-      client = HCatUtil.getHiveClient(hiveConf);
-      Table table = HCatUtil.getTable(client, inputJobInfo.getDatabaseName(),
-          inputJobInfo.getTableName());
+        HiveMetaStoreClient client = null;
+        HiveConf hiveConf = null;
+        try {
+            if (job != null) {
+                hiveConf = HCatUtil.getHiveConf(job.getConfiguration());
+            } else {
+                hiveConf = new HiveConf(HCatInputFormat.class);
+            }
+            client = HCatUtil.getHiveClient(hiveConf);
+            Table table = HCatUtil.getTable(client, inputJobInfo.getDatabaseName(),
+                inputJobInfo.getTableName());
 
-      List<PartInfo> partInfoList = new ArrayList<PartInfo>();
+            List<PartInfo> partInfoList = new ArrayList<PartInfo>();
 
-      inputJobInfo.setTableInfo(HCatTableInfo.valueOf(table.getTTable()));
-      if( table.getPartitionKeys().size() != 0 ) {
-        //Partitioned table
-        List<Partition> parts = client.listPartitionsByFilter(inputJobInfo.getDatabaseName(),
-                                                              inputJobInfo.getTableName(),
-                                                              inputJobInfo.getFilter(),
-                                                              (short) -1);
+            inputJobInfo.setTableInfo(HCatTableInfo.valueOf(table.getTTable()));
+            if (table.getPartitionKeys().size() != 0) {
+                //Partitioned table
+                List<Partition> parts = client.listPartitionsByFilter(inputJobInfo.getDatabaseName(),
+                    inputJobInfo.getTableName(),
+                    inputJobInfo.getFilter(),
+                    (short) -1);
 
-        // Default to 100,000 partitions if hive.metastore.maxpartition is not defined
-        int maxPart = hiveConf.getInt("hcat.metastore.maxpartitions", 100000);
-        if (parts != null && parts.size() > maxPart) {
-          throw new HCatException(ErrorType.ERROR_EXCEED_MAXPART, "total number of partitions is " + parts.size());
+                // Default to 100,000 partitions if hive.metastore.maxpartition is not defined
+                int maxPart = hiveConf.getInt("hcat.metastore.maxpartitions", 100000);
+                if (parts != null && parts.size() > maxPart) {
+                    throw new HCatException(ErrorType.ERROR_EXCEED_MAXPART, "total number of partitions is " + parts.size());
+                }
+
+                // populate partition info
+                for (Partition ptn : parts) {
+                    HCatSchema schema = HCatUtil.extractSchema(
+                        new org.apache.hadoop.hive.ql.metadata.Partition(table, ptn));
+                    PartInfo partInfo = extractPartInfo(schema, ptn.getSd(),
+                        ptn.getParameters(), job.getConfiguration(), inputJobInfo);
+                    partInfo.setPartitionValues(createPtnKeyValueMap(table, ptn));
+                    partInfoList.add(partInfo);
+                }
+
+            } else {
+                //Non partitioned table
+                HCatSchema schema = HCatUtil.extractSchema(table);
+                PartInfo partInfo = extractPartInfo(schema, table.getTTable().getSd(),
+                    table.getParameters(), job.getConfiguration(), inputJobInfo);
+                partInfo.setPartitionValues(new HashMap<String, String>());
+                partInfoList.add(partInfo);
+            }
+            inputJobInfo.setPartitions(partInfoList);
+
+            return inputJobInfo;
+        } finally {
+            HCatUtil.closeHiveClientQuietly(client);
         }
 
-        // populate partition info
-        for (Partition ptn : parts){
-          HCatSchema schema = HCatUtil.extractSchema(
-              new org.apache.hadoop.hive.ql.metadata.Partition(table, ptn));
-          PartInfo partInfo = extractPartInfo(schema, ptn.getSd(),
-              ptn.getParameters(), job.getConfiguration(), inputJobInfo);
-          partInfo.setPartitionValues(createPtnKeyValueMap(table, ptn));
-          partInfoList.add(partInfo);
+    }
+
+    private static Map<String, String> createPtnKeyValueMap(Table table, Partition ptn) throws IOException {
+        List<String> values = ptn.getValues();
+        if (values.size() != table.getPartitionKeys().size()) {
+            throw new IOException("Partition values in partition inconsistent with table definition, table "
+                + table.getTableName() + " has "
+                + table.getPartitionKeys().size()
+                + " partition keys, partition has " + values.size() + "partition values");
         }
 
-      }else{
-        //Non partitioned table
-        HCatSchema schema = HCatUtil.extractSchema(table);
-        PartInfo partInfo = extractPartInfo(schema, table.getTTable().getSd(),
-            table.getParameters(), job.getConfiguration(), inputJobInfo);
-        partInfo.setPartitionValues(new HashMap<String,String>());
-        partInfoList.add(partInfo);
-      }
-      inputJobInfo.setPartitions(partInfoList);
+        Map<String, String> ptnKeyValues = new HashMap<String, String>();
 
-      return inputJobInfo;
-    } finally {
-      HCatUtil.closeHiveClientQuietly(client);
+        int i = 0;
+        for (FieldSchema schema : table.getPartitionKeys()) {
+            // CONCERN : the way this mapping goes, the order *needs* to be preserved for table.getPartitionKeys() and ptn.getValues()
+            ptnKeyValues.put(schema.getName().toLowerCase(), values.get(i));
+            i++;
+        }
+
+        return ptnKeyValues;
     }
 
-  }
+    private static PartInfo extractPartInfo(HCatSchema schema, StorageDescriptor sd,
+                                            Map<String, String> parameters, Configuration conf,
+                                            InputJobInfo inputJobInfo) throws IOException {
 
-  private static Map<String, String> createPtnKeyValueMap(Table table, Partition ptn) throws IOException{
-    List<String> values = ptn.getValues();
-    if( values.size() != table.getPartitionKeys().size() ) {
-      throw new IOException("Partition values in partition inconsistent with table definition, table "
-          + table.getTableName() + " has "
-          + table.getPartitionKeys().size()
-          + " partition keys, partition has " + values.size() + "partition values" );
+        StorerInfo storerInfo = InternalUtil.extractStorerInfo(sd, parameters);
+
+        Properties hcatProperties = new Properties();
+        HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(conf, storerInfo);
+
+        // copy the properties from storageHandler to jobProperties
+        Map<String, String> jobProperties = HCatUtil.getInputJobProperties(storageHandler, inputJobInfo);
+
+        for (String key : parameters.keySet()) {
+            hcatProperties.put(key, parameters.get(key));
+        }
+        // FIXME
+        // Bloating partinfo with inputJobInfo is not good
+        return new PartInfo(schema, storageHandler, sd.getLocation(),
+            hcatProperties, jobProperties, inputJobInfo.getTableInfo());
     }
 
-    Map<String,String> ptnKeyValues = new HashMap<String,String>();
-
-    int i = 0;
-    for(FieldSchema schema : table.getPartitionKeys()) {
-      // CONCERN : the way this mapping goes, the order *needs* to be preserved for table.getPartitionKeys() and ptn.getValues()
-      ptnKeyValues.put(schema.getName().toLowerCase(), values.get(i));
-      i++;
-    }
-
-    return ptnKeyValues;
-  }
-
-  private static PartInfo extractPartInfo(HCatSchema schema, StorageDescriptor sd,
-      Map<String,String> parameters, Configuration conf,
-      InputJobInfo inputJobInfo) throws IOException{
-
-    StorerInfo storerInfo = InternalUtil.extractStorerInfo(sd,parameters);
-
-    Properties hcatProperties = new Properties();
-    HCatStorageHandler storageHandler = HCatUtil.getStorageHandler(conf, storerInfo);
-
-    // copy the properties from storageHandler to jobProperties
-    Map<String, String>jobProperties = HCatUtil.getInputJobProperties(storageHandler, inputJobInfo);
-
-    for (String key : parameters.keySet()){
-        hcatProperties.put(key, parameters.get(key));
-    }
-    // FIXME
-    // Bloating partinfo with inputJobInfo is not good
-    return new PartInfo(schema, storageHandler, sd.getLocation(),
-        hcatProperties, jobProperties, inputJobInfo.getTableInfo());
-  }
-
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/InputJobInfo.java b/src/java/org/apache/hcatalog/mapreduce/InputJobInfo.java
index f39e6eb..f2b3890 100644
--- a/src/java/org/apache/hcatalog/mapreduce/InputJobInfo.java
+++ b/src/java/org/apache/hcatalog/mapreduce/InputJobInfo.java
@@ -24,114 +24,114 @@
 import java.util.Properties;
 
 /** The class used to serialize and store the information read from the metadata server */
-public class InputJobInfo implements Serializable{
+public class InputJobInfo implements Serializable {
 
-  /** The serialization version */
-  private static final long serialVersionUID = 1L;
+    /** The serialization version */
+    private static final long serialVersionUID = 1L;
 
-  /** The db and table names. */
-  private final String databaseName;
-  private final String tableName;
+    /** The db and table names. */
+    private final String databaseName;
+    private final String tableName;
 
-  /** meta information of the table to be read from */
-  private HCatTableInfo tableInfo;
+    /** meta information of the table to be read from */
+    private HCatTableInfo tableInfo;
 
-  /** The partition filter */
-  private String filter;
+    /** The partition filter */
+    private String filter;
 
-  /** The list of partitions matching the filter. */
-  private List<PartInfo> partitions;
+    /** The list of partitions matching the filter. */
+    private List<PartInfo> partitions;
 
-  /** implementation specific job properties */
-  private Properties properties;
+    /** implementation specific job properties */
+    private Properties properties;
 
-  /**
-   * Initializes a new InputJobInfo
-   * for reading data from a table.
-   * @param databaseName the db name
-   * @param tableName the table name
-   * @param filter the partition filter
-   */
+    /**
+     * Initializes a new InputJobInfo
+     * for reading data from a table.
+     * @param databaseName the db name
+     * @param tableName the table name
+     * @param filter the partition filter
+     */
 
-  public static InputJobInfo create(String databaseName,
-      String tableName,
-      String filter) {
-    return new InputJobInfo(databaseName, tableName, filter);
-  }
+    public static InputJobInfo create(String databaseName,
+                                      String tableName,
+                                      String filter) {
+        return new InputJobInfo(databaseName, tableName, filter);
+    }
 
-  
-  private InputJobInfo(String databaseName,
-                       String tableName,
-                       String filter) {
-    this.databaseName = (databaseName == null) ? 
-                        MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
-    this.tableName = tableName;
-    this.filter = filter;
-    this.properties = new Properties();
-  }
 
-  /**
-   * Gets the value of databaseName
-   * @return the databaseName
-   */
-  public String getDatabaseName() {
-    return databaseName;
-  }
+    private InputJobInfo(String databaseName,
+                         String tableName,
+                         String filter) {
+        this.databaseName = (databaseName == null) ?
+            MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
+        this.tableName = tableName;
+        this.filter = filter;
+        this.properties = new Properties();
+    }
 
-  /**
-   * Gets the value of tableName
-   * @return the tableName
-   */
-  public String getTableName() {
-    return tableName;
-  }
+    /**
+     * Gets the value of databaseName
+     * @return the databaseName
+     */
+    public String getDatabaseName() {
+        return databaseName;
+    }
 
-  /**
-   * Gets the table's meta information
-   * @return the HCatTableInfo
-   */
-  public HCatTableInfo getTableInfo() {
-    return tableInfo;
-  }
+    /**
+     * Gets the value of tableName
+     * @return the tableName
+     */
+    public String getTableName() {
+        return tableName;
+    }
 
-  /**
-   * set the tablInfo instance
-   * this should be the same instance
-   * determined by this object's DatabaseName and TableName
-   * @param tableInfo
-   */
-  void setTableInfo(HCatTableInfo tableInfo) {
-    this.tableInfo = tableInfo;
-  }
+    /**
+     * Gets the table's meta information
+     * @return the HCatTableInfo
+     */
+    public HCatTableInfo getTableInfo() {
+        return tableInfo;
+    }
 
-  /**
-   * Gets the value of partition filter
-   * @return the filter string
-   */
-  public String getFilter() {
-    return filter;
-  }
+    /**
+     * set the tablInfo instance
+     * this should be the same instance
+     * determined by this object's DatabaseName and TableName
+     * @param tableInfo
+     */
+    void setTableInfo(HCatTableInfo tableInfo) {
+        this.tableInfo = tableInfo;
+    }
 
-  /**
-   * @return partition info
-   */
-  public List<PartInfo> getPartitions() {
-    return partitions;
-  }
+    /**
+     * Gets the value of partition filter
+     * @return the filter string
+     */
+    public String getFilter() {
+        return filter;
+    }
 
-  /**
-   * @return partition info  list
-   */
-  void setPartitions(List<PartInfo> partitions) {
-    this.partitions = partitions;
-  }
+    /**
+     * @return partition info
+     */
+    public List<PartInfo> getPartitions() {
+        return partitions;
+    }
 
-  /**
-   * Set/Get Property information to be passed down to *StorageHandler implementation
-   * put implementation specific storage handler configurations here
-   * @return the implementation specific job properties 
-   */
-  public Properties getProperties() {
-    return properties;
-  }
+    /**
+     * @return partition info  list
+     */
+    void setPartitions(List<PartInfo> partitions) {
+        this.partitions = partitions;
+    }
+
+    /**
+     * Set/Get Property information to be passed down to *StorageHandler implementation
+     * put implementation specific storage handler configurations here
+     * @return the implementation specific job properties
+     */
+    public Properties getProperties() {
+        return properties;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/InternalUtil.java b/src/java/org/apache/hcatalog/mapreduce/InternalUtil.java
index 10a0ee9..8064623 100644
--- a/src/java/org/apache/hcatalog/mapreduce/InternalUtil.java
+++ b/src/java/org/apache/hcatalog/mapreduce/InternalUtil.java
@@ -57,132 +57,132 @@
 
     static StorerInfo extractStorerInfo(StorageDescriptor sd, Map<String, String> properties) throws IOException {
         Properties hcatProperties = new Properties();
-        for (String key : properties.keySet()){
+        for (String key : properties.keySet()) {
             hcatProperties.put(key, properties.get(key));
         }
 
         // also populate with StorageDescriptor->SerDe.Parameters
-        for (Map.Entry<String, String>param :
+        for (Map.Entry<String, String> param :
             sd.getSerdeInfo().getParameters().entrySet()) {
-          hcatProperties.put(param.getKey(), param.getValue());
+            hcatProperties.put(param.getKey(), param.getValue());
         }
 
 
         return new StorerInfo(
-                sd.getInputFormat(), sd.getOutputFormat(), sd.getSerdeInfo().getSerializationLib(),
-                properties.get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE),
-                hcatProperties);
+            sd.getInputFormat(), sd.getOutputFormat(), sd.getSerdeInfo().getSerializationLib(),
+            properties.get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE),
+            hcatProperties);
     }
 
-  static StructObjectInspector createStructObjectInspector(HCatSchema outputSchema) throws IOException {
+    static StructObjectInspector createStructObjectInspector(HCatSchema outputSchema) throws IOException {
 
-    if(outputSchema == null ) {
-      throw new IOException("Invalid output schema specified");
+        if (outputSchema == null) {
+            throw new IOException("Invalid output schema specified");
+        }
+
+        List<ObjectInspector> fieldInspectors = new ArrayList<ObjectInspector>();
+        List<String> fieldNames = new ArrayList<String>();
+
+        for (HCatFieldSchema hcatFieldSchema : outputSchema.getFields()) {
+            TypeInfo type = TypeInfoUtils.getTypeInfoFromTypeString(hcatFieldSchema.getTypeString());
+
+            fieldNames.add(hcatFieldSchema.getName());
+            fieldInspectors.add(getObjectInspector(type));
+        }
+
+        StructObjectInspector structInspector = ObjectInspectorFactory.
+            getStandardStructObjectInspector(fieldNames, fieldInspectors);
+        return structInspector;
     }
 
-    List<ObjectInspector> fieldInspectors = new ArrayList<ObjectInspector>();
-    List<String> fieldNames = new ArrayList<String>();
+    private static ObjectInspector getObjectInspector(TypeInfo type) throws IOException {
 
-    for(HCatFieldSchema hcatFieldSchema : outputSchema.getFields()) {
-      TypeInfo type = TypeInfoUtils.getTypeInfoFromTypeString(hcatFieldSchema.getTypeString());
+        switch (type.getCategory()) {
 
-      fieldNames.add(hcatFieldSchema.getName());
-      fieldInspectors.add(getObjectInspector(type));
+        case PRIMITIVE:
+            PrimitiveTypeInfo primitiveType = (PrimitiveTypeInfo) type;
+            return PrimitiveObjectInspectorFactory.
+                getPrimitiveJavaObjectInspector(primitiveType.getPrimitiveCategory());
+
+        case MAP:
+            MapTypeInfo mapType = (MapTypeInfo) type;
+            MapObjectInspector mapInspector = ObjectInspectorFactory.getStandardMapObjectInspector(
+                getObjectInspector(mapType.getMapKeyTypeInfo()), getObjectInspector(mapType.getMapValueTypeInfo()));
+            return mapInspector;
+
+        case LIST:
+            ListTypeInfo listType = (ListTypeInfo) type;
+            ListObjectInspector listInspector = ObjectInspectorFactory.getStandardListObjectInspector(
+                getObjectInspector(listType.getListElementTypeInfo()));
+            return listInspector;
+
+        case STRUCT:
+            StructTypeInfo structType = (StructTypeInfo) type;
+            List<TypeInfo> fieldTypes = structType.getAllStructFieldTypeInfos();
+
+            List<ObjectInspector> fieldInspectors = new ArrayList<ObjectInspector>();
+            for (TypeInfo fieldType : fieldTypes) {
+                fieldInspectors.add(getObjectInspector(fieldType));
+            }
+
+            StructObjectInspector structInspector = ObjectInspectorFactory.getStandardStructObjectInspector(
+                structType.getAllStructFieldNames(), fieldInspectors);
+            return structInspector;
+
+        default:
+            throw new IOException("Unknown field schema type");
+        }
     }
 
-    StructObjectInspector structInspector = ObjectInspectorFactory.
-        getStandardStructObjectInspector(fieldNames, fieldInspectors);
-    return structInspector;
-  }
-
-  private static ObjectInspector getObjectInspector(TypeInfo type) throws IOException {
-
-    switch(type.getCategory()) {
-
-    case PRIMITIVE :
-      PrimitiveTypeInfo primitiveType = (PrimitiveTypeInfo) type;
-      return PrimitiveObjectInspectorFactory.
-        getPrimitiveJavaObjectInspector(primitiveType.getPrimitiveCategory());
-
-    case MAP :
-      MapTypeInfo mapType = (MapTypeInfo) type;
-      MapObjectInspector mapInspector = ObjectInspectorFactory.getStandardMapObjectInspector(
-          getObjectInspector(mapType.getMapKeyTypeInfo()), getObjectInspector(mapType.getMapValueTypeInfo()));
-      return mapInspector;
-
-    case LIST :
-      ListTypeInfo listType = (ListTypeInfo) type;
-      ListObjectInspector listInspector = ObjectInspectorFactory.getStandardListObjectInspector(
-          getObjectInspector(listType.getListElementTypeInfo()));
-      return listInspector;
-
-    case STRUCT :
-      StructTypeInfo structType = (StructTypeInfo) type;
-      List<TypeInfo> fieldTypes = structType.getAllStructFieldTypeInfos();
-
-      List<ObjectInspector> fieldInspectors = new ArrayList<ObjectInspector>();
-      for(TypeInfo fieldType : fieldTypes) {
-        fieldInspectors.add(getObjectInspector(fieldType));
-      }
-
-      StructObjectInspector structInspector = ObjectInspectorFactory.getStandardStructObjectInspector(
-          structType.getAllStructFieldNames(), fieldInspectors);
-      return structInspector;
-
-    default :
-      throw new IOException("Unknown field schema type");
+    //TODO this has to find a better home, it's also hardcoded as default in hive would be nice
+    // if the default was decided by the serde
+    static void initializeOutputSerDe(SerDe serDe, Configuration conf, OutputJobInfo jobInfo)
+        throws SerDeException {
+        serDe.initialize(conf, getSerdeProperties(jobInfo.getTableInfo(), jobInfo.getOutputSchema()));
     }
-  }
 
-  //TODO this has to find a better home, it's also hardcoded as default in hive would be nice
-  // if the default was decided by the serde
-  static void initializeOutputSerDe(SerDe serDe, Configuration conf, OutputJobInfo jobInfo)
-      throws SerDeException {
-    serDe.initialize(conf, getSerdeProperties(jobInfo.getTableInfo(), jobInfo.getOutputSchema()));
-  }
-
-  static void initializeDeserializer(Deserializer deserializer, Configuration conf,
-      HCatTableInfo info, HCatSchema schema) throws SerDeException {
-    Properties props = getSerdeProperties(info, schema);
-    LOG.info("Initializing " + deserializer.getClass().getName() + " with properties " + props);
-    deserializer.initialize(conf, props);
-  }
-
-  private static Properties getSerdeProperties(HCatTableInfo info, HCatSchema s)
-      throws SerDeException {
-    Properties props = new Properties();
-    List<FieldSchema> fields = HCatUtil.getFieldSchemaList(s.getFields());
-    props.setProperty(org.apache.hadoop.hive.serde.Constants.LIST_COLUMNS,
-        MetaStoreUtils.getColumnNamesFromFieldSchema(fields));
-    props.setProperty(org.apache.hadoop.hive.serde.Constants.LIST_COLUMN_TYPES,
-        MetaStoreUtils.getColumnTypesFromFieldSchema(fields));
-
-    // setting these props to match LazySimpleSerde
-    props.setProperty(org.apache.hadoop.hive.serde.Constants.SERIALIZATION_NULL_FORMAT, "\\N");
-    props.setProperty(org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
-
-    //add props from params set in table schema
-    props.putAll(info.getStorerInfo().getProperties());
-
-    return props;
-  }
-
-static Reporter createReporter(TaskAttemptContext context) {
-      return new ProgressReporter(context);
-  }
-
-  /**
-   * Casts an InputSplit into a HCatSplit, providing a useful error message if the cast fails.
-   * @param split the InputSplit
-   * @return the HCatSplit
-   * @throws IOException
-   */
-  public static HCatSplit castToHCatSplit(InputSplit split) throws IOException {
-    if (split instanceof HCatSplit) {
-      return (HCatSplit) split;
-    } else {
-      throw new IOException("Split must be " + HCatSplit.class.getName()
-          + " but found " + split.getClass().getName());
+    static void initializeDeserializer(Deserializer deserializer, Configuration conf,
+                                       HCatTableInfo info, HCatSchema schema) throws SerDeException {
+        Properties props = getSerdeProperties(info, schema);
+        LOG.info("Initializing " + deserializer.getClass().getName() + " with properties " + props);
+        deserializer.initialize(conf, props);
     }
-  }
+
+    private static Properties getSerdeProperties(HCatTableInfo info, HCatSchema s)
+        throws SerDeException {
+        Properties props = new Properties();
+        List<FieldSchema> fields = HCatUtil.getFieldSchemaList(s.getFields());
+        props.setProperty(org.apache.hadoop.hive.serde.Constants.LIST_COLUMNS,
+            MetaStoreUtils.getColumnNamesFromFieldSchema(fields));
+        props.setProperty(org.apache.hadoop.hive.serde.Constants.LIST_COLUMN_TYPES,
+            MetaStoreUtils.getColumnTypesFromFieldSchema(fields));
+
+        // setting these props to match LazySimpleSerde
+        props.setProperty(org.apache.hadoop.hive.serde.Constants.SERIALIZATION_NULL_FORMAT, "\\N");
+        props.setProperty(org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
+
+        //add props from params set in table schema
+        props.putAll(info.getStorerInfo().getProperties());
+
+        return props;
+    }
+
+    static Reporter createReporter(TaskAttemptContext context) {
+        return new ProgressReporter(context);
+    }
+
+    /**
+     * Casts an InputSplit into a HCatSplit, providing a useful error message if the cast fails.
+     * @param split the InputSplit
+     * @return the HCatSplit
+     * @throws IOException
+     */
+    public static HCatSplit castToHCatSplit(InputSplit split) throws IOException {
+        if (split instanceof HCatSplit) {
+            return (HCatSplit) split;
+        } else {
+            throw new IOException("Split must be " + HCatSplit.class.getName()
+                + " but found " + split.getClass().getName());
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/MultiOutputFormat.java b/src/java/org/apache/hcatalog/mapreduce/MultiOutputFormat.java
index 134c052..284c46a 100644
--- a/src/java/org/apache/hcatalog/mapreduce/MultiOutputFormat.java
+++ b/src/java/org/apache/hcatalog/mapreduce/MultiOutputFormat.java
@@ -207,7 +207,7 @@
      * @throws InterruptedException
      */
     public static <K, V> void write(String alias, K key, V value, TaskInputOutputContext context)
-            throws IOException, InterruptedException {
+        throws IOException, InterruptedException {
         KeyValue<K, V> keyval = new KeyValue<K, V>(key, value);
         context.write(new Text(alias), keyval);
     }
@@ -227,14 +227,14 @@
 
     @Override
     public RecordWriter<Writable, Writable> getRecordWriter(TaskAttemptContext context)
-            throws IOException,
-            InterruptedException {
+        throws IOException,
+        InterruptedException {
         return new MultiRecordWriter(context);
     }
 
     @Override
     public OutputCommitter getOutputCommitter(TaskAttemptContext context) throws IOException,
-            InterruptedException {
+        InterruptedException {
         return new MultiOutputCommitter(context);
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/OutputFormatContainer.java b/src/java/org/apache/hcatalog/mapreduce/OutputFormatContainer.java
index db60253..50aeb35 100644
--- a/src/java/org/apache/hcatalog/mapreduce/OutputFormatContainer.java
+++ b/src/java/org/apache/hcatalog/mapreduce/OutputFormatContainer.java
@@ -38,7 +38,7 @@
     /**
      * @param of OutputFormat this instance will contain
      */
-    public OutputFormatContainer(org.apache.hadoop.mapred.OutputFormat<? super WritableComparable<?>,? super Writable> of) {
+    public OutputFormatContainer(org.apache.hadoop.mapred.OutputFormat<? super WritableComparable<?>, ? super Writable> of) {
         this.of = of;
     }
 
diff --git a/src/java/org/apache/hcatalog/mapreduce/OutputJobInfo.java b/src/java/org/apache/hcatalog/mapreduce/OutputJobInfo.java
index 0d77e25..f00cea5 100644
--- a/src/java/org/apache/hcatalog/mapreduce/OutputJobInfo.java
+++ b/src/java/org/apache/hcatalog/mapreduce/OutputJobInfo.java
@@ -31,238 +31,239 @@
 /** The class used to serialize and store the output related information  */
 public class OutputJobInfo implements Serializable {
 
-  /** The db and table names. */
-  private final String databaseName;
-  private final String tableName;
+    /** The db and table names. */
+    private final String databaseName;
+    private final String tableName;
 
-  /** The serialization version. */
-  private static final long serialVersionUID = 1L;
+    /** The serialization version. */
+    private static final long serialVersionUID = 1L;
 
-  /** The table info provided by user. */
-  private HCatTableInfo tableInfo;
+    /** The table info provided by user. */
+    private HCatTableInfo tableInfo;
 
-  /** The output schema. This is given to us by user.  This wont contain any
-   * partition columns ,even if user has specified them.
-   * */
-  private HCatSchema outputSchema;
+    /** The output schema. This is given to us by user.  This wont contain any
+     * partition columns ,even if user has specified them.
+     * */
+    private HCatSchema outputSchema;
 
-  /** The location of the partition being written */
-  private String location;
+    /** The location of the partition being written */
+    private String location;
 
-  /** The partition values to publish to, if used for output*/
-  private Map<String, String> partitionValues;
+    /** The partition values to publish to, if used for output*/
+    private Map<String, String> partitionValues;
 
-  private List<Integer> posOfPartCols;
-  private List<Integer> posOfDynPartCols;
+    private List<Integer> posOfPartCols;
+    private List<Integer> posOfDynPartCols;
 
-  private Properties properties;
+    private Properties properties;
 
-  private int maxDynamicPartitions;
+    private int maxDynamicPartitions;
 
-  /** List of keys for which values were not specified at write setup time, to be infered at write time */
-  private List<String> dynamicPartitioningKeys;
+    /** List of keys for which values were not specified at write setup time, to be infered at write time */
+    private List<String> dynamicPartitioningKeys;
 
-  private boolean harRequested;
+    private boolean harRequested;
 
-  /**
-   * Initializes a new OutputJobInfo instance
-   * for writing data from a table.
-   * @param databaseName the db name
-   * @param tableName the table name
-   * @param partitionValues The partition values to publish to, can be null or empty Map to
-   * work with hadoop security, the kerberos principal name of the server - else null
-   * The principal name should be of the form:
-   * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com"
-   * The special string _HOST will be replaced automatically with the correct host name
-   * indicate write to a unpartitioned table. For partitioned tables, this map should
-   * contain keys for all partition columns with corresponding values.
-   */
-  public static OutputJobInfo create(String databaseName,
-                                     String tableName,
-                                     Map<String, String> partitionValues) {
-    return new OutputJobInfo(databaseName,
-        tableName,
-        partitionValues);
-  }
+    /**
+     * Initializes a new OutputJobInfo instance
+     * for writing data from a table.
+     * @param databaseName the db name
+     * @param tableName the table name
+     * @param partitionValues The partition values to publish to, can be null or empty Map to
+     * work with hadoop security, the kerberos principal name of the server - else null
+     * The principal name should be of the form:
+     * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com"
+     * The special string _HOST will be replaced automatically with the correct host name
+     * indicate write to a unpartitioned table. For partitioned tables, this map should
+     * contain keys for all partition columns with corresponding values.
+     */
+    public static OutputJobInfo create(String databaseName,
+                                       String tableName,
+                                       Map<String, String> partitionValues) {
+        return new OutputJobInfo(databaseName,
+            tableName,
+            partitionValues);
+    }
 
-  private OutputJobInfo(String databaseName,
-                        String tableName,
-                        Map<String, String> partitionValues) {
-    this.databaseName =  (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
-    this.tableName = tableName;
-    this.partitionValues = partitionValues;
-    this.properties = new Properties();
-  }
+    private OutputJobInfo(String databaseName,
+                          String tableName,
+                          Map<String, String> partitionValues) {
+        this.databaseName = (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
+        this.tableName = tableName;
+        this.partitionValues = partitionValues;
+        this.properties = new Properties();
+    }
 
-  /**
-   * @return the posOfPartCols
-   */
-  protected List<Integer> getPosOfPartCols() {
-    return posOfPartCols;
-  }
+    /**
+     * @return the posOfPartCols
+     */
+    protected List<Integer> getPosOfPartCols() {
+        return posOfPartCols;
+    }
 
-  /**
-   * @return the posOfDynPartCols
-   */
-  protected List<Integer> getPosOfDynPartCols() {
-    return posOfDynPartCols;
-  }
+    /**
+     * @return the posOfDynPartCols
+     */
+    protected List<Integer> getPosOfDynPartCols() {
+        return posOfDynPartCols;
+    }
 
-  /**
-   * @param posOfPartCols the posOfPartCols to set
-   */
-  protected void setPosOfPartCols(List<Integer> posOfPartCols) {
-    // sorting the list in the descending order so that deletes happen back-to-front
-    Collections.sort(posOfPartCols, new Comparator<Integer> () {
-      @Override
-      public int compare(Integer earlier, Integer later) {
-        return (earlier > later) ? -1 : ((earlier == later) ? 0 : 1);
-      }
-    });
-    this.posOfPartCols = posOfPartCols;
-  }
+    /**
+     * @param posOfPartCols the posOfPartCols to set
+     */
+    protected void setPosOfPartCols(List<Integer> posOfPartCols) {
+        // sorting the list in the descending order so that deletes happen back-to-front
+        Collections.sort(posOfPartCols, new Comparator<Integer>() {
+            @Override
+            public int compare(Integer earlier, Integer later) {
+                return (earlier > later) ? -1 : ((earlier == later) ? 0 : 1);
+            }
+        });
+        this.posOfPartCols = posOfPartCols;
+    }
 
-  /**
+    /**
      * @param posOfDynPartCols the posOfDynPartCols to set
      */
     protected void setPosOfDynPartCols(List<Integer> posOfDynPartCols) {
-      // Important - no sorting here! We retain order, it's used to match with values at runtime
-      this.posOfDynPartCols = posOfDynPartCols;
+        // Important - no sorting here! We retain order, it's used to match with values at runtime
+        this.posOfDynPartCols = posOfDynPartCols;
     }
 
-  /**
-   * @return the tableInfo
-   */
-  public HCatTableInfo getTableInfo() {
-    return tableInfo;
-  }
+    /**
+     * @return the tableInfo
+     */
+    public HCatTableInfo getTableInfo() {
+        return tableInfo;
+    }
 
-  /**
-   * @return the outputSchema
-   */
-  public HCatSchema getOutputSchema() {
-    return outputSchema;
-  }
+    /**
+     * @return the outputSchema
+     */
+    public HCatSchema getOutputSchema() {
+        return outputSchema;
+    }
 
-  /**
-   * @param schema the outputSchema to set
-   */
-  public void setOutputSchema(HCatSchema schema) {
-    this.outputSchema = schema;
-  }
+    /**
+     * @param schema the outputSchema to set
+     */
+    public void setOutputSchema(HCatSchema schema) {
+        this.outputSchema = schema;
+    }
 
-  /**
-   * @return the location
-   */
-  public String getLocation() {
-    return location;
-  }
+    /**
+     * @return the location
+     */
+    public String getLocation() {
+        return location;
+    }
 
-  /**
-   * @param location location to write to
-   */
-  public void setLocation(String location) {
-    this.location = location;
-  }
-  /**
-   * Sets the value of partitionValues
-   * @param partitionValues the partition values to set
-   */
-  void setPartitionValues(Map<String, String>  partitionValues) {
-    this.partitionValues = partitionValues;
-  }
+    /**
+     * @param location location to write to
+     */
+    public void setLocation(String location) {
+        this.location = location;
+    }
 
-  /**
-   * Gets the value of partitionValues
-   * @return the partitionValues
-   */
-  public Map<String, String> getPartitionValues() {
-    return partitionValues;
-  }
+    /**
+     * Sets the value of partitionValues
+     * @param partitionValues the partition values to set
+     */
+    void setPartitionValues(Map<String, String> partitionValues) {
+        this.partitionValues = partitionValues;
+    }
 
-  /**
-   * set the tablInfo instance
-   * this should be the same instance
-   * determined by this object's DatabaseName and TableName
-   * @param tableInfo
-   */
-  void setTableInfo(HCatTableInfo tableInfo) {
-    this.tableInfo = tableInfo;
-  }
+    /**
+     * Gets the value of partitionValues
+     * @return the partitionValues
+     */
+    public Map<String, String> getPartitionValues() {
+        return partitionValues;
+    }
 
-  /**
-   * @return database name of table to write to
-   */
-  public String getDatabaseName() {
-    return databaseName;
-  }
+    /**
+     * set the tablInfo instance
+     * this should be the same instance
+     * determined by this object's DatabaseName and TableName
+     * @param tableInfo
+     */
+    void setTableInfo(HCatTableInfo tableInfo) {
+        this.tableInfo = tableInfo;
+    }
 
-  /**
-   * @return name of table to write to
-   */
-  public String getTableName() {
-    return tableName;
-  }
+    /**
+     * @return database name of table to write to
+     */
+    public String getDatabaseName() {
+        return databaseName;
+    }
 
-  /**
-   * Set/Get Property information to be passed down to *StorageHandler implementation
-   * put implementation specific storage handler configurations here
-   * @return the implementation specific job properties 
-   */
-  public Properties getProperties() {
-    return properties;
-  }
+    /**
+     * @return name of table to write to
+     */
+    public String getTableName() {
+        return tableName;
+    }
 
-  /**
-   * Set maximum number of allowable dynamic partitions
-   * @param maxDynamicPartitions
-   */
-  public void setMaximumDynamicPartitions(int maxDynamicPartitions){
-    this.maxDynamicPartitions = maxDynamicPartitions;
-  }
+    /**
+     * Set/Get Property information to be passed down to *StorageHandler implementation
+     * put implementation specific storage handler configurations here
+     * @return the implementation specific job properties
+     */
+    public Properties getProperties() {
+        return properties;
+    }
 
-  /**
-   * Returns maximum number of allowable dynamic partitions
-   * @return maximum number of allowable dynamic partitions
-   */
-  public int getMaxDynamicPartitions() {
-    return this.maxDynamicPartitions;
-  }
+    /**
+     * Set maximum number of allowable dynamic partitions
+     * @param maxDynamicPartitions
+     */
+    public void setMaximumDynamicPartitions(int maxDynamicPartitions) {
+        this.maxDynamicPartitions = maxDynamicPartitions;
+    }
 
-  /**
-   * Sets whether or not hadoop archiving has been requested for this job
-   * @param harRequested
-   */
-  public void setHarRequested(boolean harRequested){
-    this.harRequested = harRequested;
-  }
+    /**
+     * Returns maximum number of allowable dynamic partitions
+     * @return maximum number of allowable dynamic partitions
+     */
+    public int getMaxDynamicPartitions() {
+        return this.maxDynamicPartitions;
+    }
 
-  /**
-   * Returns whether or not hadoop archiving has been requested for this job
-   * @return whether or not hadoop archiving has been requested for this job
-   */
-  public boolean getHarRequested() {
-    return this.harRequested;
-  }
+    /**
+     * Sets whether or not hadoop archiving has been requested for this job
+     * @param harRequested
+     */
+    public void setHarRequested(boolean harRequested) {
+        this.harRequested = harRequested;
+    }
 
-  /**
-   * Returns whether or not Dynamic Partitioning is used
-   * @return whether or not dynamic partitioning is currently enabled and used
-   */
-  public boolean isDynamicPartitioningUsed() {
-    return !((dynamicPartitioningKeys == null) || (dynamicPartitioningKeys.isEmpty()));
-  }
+    /**
+     * Returns whether or not hadoop archiving has been requested for this job
+     * @return whether or not hadoop archiving has been requested for this job
+     */
+    public boolean getHarRequested() {
+        return this.harRequested;
+    }
 
-  /**
-   * Sets the list of dynamic partitioning keys used for outputting without specifying all the keys
-   * @param dynamicPartitioningKeys
-   */
-  public void setDynamicPartitioningKeys(List<String> dynamicPartitioningKeys) {
-    this.dynamicPartitioningKeys = dynamicPartitioningKeys;
-  }
+    /**
+     * Returns whether or not Dynamic Partitioning is used
+     * @return whether or not dynamic partitioning is currently enabled and used
+     */
+    public boolean isDynamicPartitioningUsed() {
+        return !((dynamicPartitioningKeys == null) || (dynamicPartitioningKeys.isEmpty()));
+    }
 
-  public List<String> getDynamicPartitioningKeys(){
-    return this.dynamicPartitioningKeys;
-  }
+    /**
+     * Sets the list of dynamic partitioning keys used for outputting without specifying all the keys
+     * @param dynamicPartitioningKeys
+     */
+    public void setDynamicPartitioningKeys(List<String> dynamicPartitioningKeys) {
+        this.dynamicPartitioningKeys = dynamicPartitioningKeys;
+    }
+
+    public List<String> getDynamicPartitioningKeys() {
+        return this.dynamicPartitioningKeys;
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/PartInfo.java b/src/java/org/apache/hcatalog/mapreduce/PartInfo.java
index 7fe0a9d..63bcb43 100644
--- a/src/java/org/apache/hcatalog/mapreduce/PartInfo.java
+++ b/src/java/org/apache/hcatalog/mapreduce/PartInfo.java
@@ -26,138 +26,138 @@
 /** The Class used to serialize the partition information read from the metadata server that maps to a partition. */
 public class PartInfo implements Serializable {
 
-  /** The serialization version */
-  private static final long serialVersionUID = 1L;
+    /** The serialization version */
+    private static final long serialVersionUID = 1L;
 
-  /** The partition schema. */
-  private final HCatSchema partitionSchema;
+    /** The partition schema. */
+    private final HCatSchema partitionSchema;
 
-  /** The information about which input storage handler to use */
-  private final String storageHandlerClassName;
-  private final String inputFormatClassName;
-  private final String outputFormatClassName;
-  private final String serdeClassName;
+    /** The information about which input storage handler to use */
+    private final String storageHandlerClassName;
+    private final String inputFormatClassName;
+    private final String outputFormatClassName;
+    private final String serdeClassName;
 
-  /** HCat-specific properties set at the partition */
-  private final Properties hcatProperties;
+    /** HCat-specific properties set at the partition */
+    private final Properties hcatProperties;
 
-  /** The data location. */
-  private final String location;
+    /** The data location. */
+    private final String location;
 
-  /** The map of partition key names and their values. */
-  private Map<String,String> partitionValues;
+    /** The map of partition key names and their values. */
+    private Map<String, String> partitionValues;
 
-  /** Job properties associated with this parition */
-  Map<String,String> jobProperties;
+    /** Job properties associated with this parition */
+    Map<String, String> jobProperties;
 
-  /** the table info associated with this partition */
-  HCatTableInfo tableInfo;
+    /** the table info associated with this partition */
+    HCatTableInfo tableInfo;
 
-  /**
-   * Instantiates a new hcat partition info.
-   * @param partitionSchema the partition schema
-   * @param storageHandler the storage handler
-   * @param location the location
-   * @param hcatProperties hcat-specific properties at the partition
-   * @param jobProperties the job properties
-   * @param tableInfo the table information
-   */
-  public PartInfo(HCatSchema partitionSchema, HCatStorageHandler storageHandler,
-                  String location, Properties hcatProperties, 
-                  Map<String,String> jobProperties, HCatTableInfo tableInfo){
-    this.partitionSchema = partitionSchema;
-    this.location = location;
-    this.hcatProperties = hcatProperties;
-    this.jobProperties = jobProperties;
-    this.tableInfo = tableInfo;
+    /**
+     * Instantiates a new hcat partition info.
+     * @param partitionSchema the partition schema
+     * @param storageHandler the storage handler
+     * @param location the location
+     * @param hcatProperties hcat-specific properties at the partition
+     * @param jobProperties the job properties
+     * @param tableInfo the table information
+     */
+    public PartInfo(HCatSchema partitionSchema, HCatStorageHandler storageHandler,
+                    String location, Properties hcatProperties,
+                    Map<String, String> jobProperties, HCatTableInfo tableInfo) {
+        this.partitionSchema = partitionSchema;
+        this.location = location;
+        this.hcatProperties = hcatProperties;
+        this.jobProperties = jobProperties;
+        this.tableInfo = tableInfo;
 
-    this.storageHandlerClassName = storageHandler.getClass().getName();
-    this.inputFormatClassName = storageHandler.getInputFormatClass().getName();
-    this.serdeClassName = storageHandler.getSerDeClass().getName();
-    this.outputFormatClassName = storageHandler.getOutputFormatClass().getName();
-}
+        this.storageHandlerClassName = storageHandler.getClass().getName();
+        this.inputFormatClassName = storageHandler.getInputFormatClass().getName();
+        this.serdeClassName = storageHandler.getSerDeClass().getName();
+        this.outputFormatClassName = storageHandler.getOutputFormatClass().getName();
+    }
 
-  /**
-   * Gets the value of partitionSchema.
-   * @return the partitionSchema
-   */
-  public HCatSchema getPartitionSchema() {
-    return partitionSchema;
-  }
+    /**
+     * Gets the value of partitionSchema.
+     * @return the partitionSchema
+     */
+    public HCatSchema getPartitionSchema() {
+        return partitionSchema;
+    }
 
-  /**
-   * @return the storage handler class name
-   */
-  public String getStorageHandlerClassName() {
-    return storageHandlerClassName;
-  }
+    /**
+     * @return the storage handler class name
+     */
+    public String getStorageHandlerClassName() {
+        return storageHandlerClassName;
+    }
 
-  /**
-   * @return the inputFormatClassName
-   */
-  public String getInputFormatClassName() {
-    return inputFormatClassName;
-  }
+    /**
+     * @return the inputFormatClassName
+     */
+    public String getInputFormatClassName() {
+        return inputFormatClassName;
+    }
 
-  /**
-   * @return the outputFormatClassName
-   */
-  public String getOutputFormatClassName() {
-    return outputFormatClassName;
-  }
+    /**
+     * @return the outputFormatClassName
+     */
+    public String getOutputFormatClassName() {
+        return outputFormatClassName;
+    }
 
-  /**
-   * @return the serdeClassName
-   */
-  public String getSerdeClassName() {
-    return serdeClassName;
-  }
+    /**
+     * @return the serdeClassName
+     */
+    public String getSerdeClassName() {
+        return serdeClassName;
+    }
 
-  /**
-   * Gets the input storage handler properties.
-   * @return HCat-specific properties set at the partition 
-   */
-  public Properties getInputStorageHandlerProperties() {
-    return hcatProperties;
-  }
+    /**
+     * Gets the input storage handler properties.
+     * @return HCat-specific properties set at the partition
+     */
+    public Properties getInputStorageHandlerProperties() {
+        return hcatProperties;
+    }
 
-  /**
-   * Gets the value of location.
-   * @return the location
-   */
-  public String getLocation() {
-    return location;
-  }
+    /**
+     * Gets the value of location.
+     * @return the location
+     */
+    public String getLocation() {
+        return location;
+    }
 
-  /**
-   * Sets the partition values.
-   * @param partitionValues the new partition values
-   */
-  public void setPartitionValues(Map<String,String> partitionValues) {
-    this.partitionValues = partitionValues;
-  }
+    /**
+     * Sets the partition values.
+     * @param partitionValues the new partition values
+     */
+    public void setPartitionValues(Map<String, String> partitionValues) {
+        this.partitionValues = partitionValues;
+    }
 
-  /**
-   * Gets the partition values.
-   * @return the partition values
-   */
-  public Map<String,String> getPartitionValues() {
-    return partitionValues;
-  }
+    /**
+     * Gets the partition values.
+     * @return the partition values
+     */
+    public Map<String, String> getPartitionValues() {
+        return partitionValues;
+    }
 
-  /**
-   * Gets the job properties.
-   * @return a map of the job properties
-   */
-  public Map<String,String> getJobProperties() {
-    return jobProperties;
-  }
+    /**
+     * Gets the job properties.
+     * @return a map of the job properties
+     */
+    public Map<String, String> getJobProperties() {
+        return jobProperties;
+    }
 
-  /**
-   * Gets the HCatalog table information.
-   * @return the table information
-   */
-  public HCatTableInfo getTableInfo() {
-    return tableInfo;
-  }
+    /**
+     * Gets the HCatalog table information.
+     * @return the table information
+     */
+    public HCatTableInfo getTableInfo() {
+        return tableInfo;
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/ProgressReporter.java b/src/java/org/apache/hcatalog/mapreduce/ProgressReporter.java
index 0ef359c..936204b 100644
--- a/src/java/org/apache/hcatalog/mapreduce/ProgressReporter.java
+++ b/src/java/org/apache/hcatalog/mapreduce/ProgressReporter.java
@@ -27,65 +27,65 @@
 
 class ProgressReporter extends StatusReporter implements Reporter {
 
-  private TaskInputOutputContext context = null;
-  private TaskAttemptContext taskAttemptContext = null;
+    private TaskInputOutputContext context = null;
+    private TaskAttemptContext taskAttemptContext = null;
 
-  public ProgressReporter(TaskAttemptContext context) {
-    if (context instanceof TaskInputOutputContext) {
-      this.context = (TaskInputOutputContext) context;
-    } else {
-      taskAttemptContext = context;
+    public ProgressReporter(TaskAttemptContext context) {
+        if (context instanceof TaskInputOutputContext) {
+            this.context = (TaskInputOutputContext) context;
+        } else {
+            taskAttemptContext = context;
+        }
     }
-  }
 
-  @Override
-  public void setStatus(String status) {
-    if (context != null) {
-      context.setStatus(status);
+    @Override
+    public void setStatus(String status) {
+        if (context != null) {
+            context.setStatus(status);
+        }
     }
-  }
 
-  @Override
-  public Counters.Counter getCounter(Enum<?> name) {
-    return (context != null) ? (Counters.Counter) context.getCounter(name) : null;
-  }
-
-  @Override
-  public Counters.Counter getCounter(String group, String name) {
-    return (context != null) ? (Counters.Counter) context.getCounter(group, name) : null;
-  }
-
-  @Override
-  public void incrCounter(Enum<?> key, long amount) {
-    if (context != null) {
-      context.getCounter(key).increment(amount);
+    @Override
+    public Counters.Counter getCounter(Enum<?> name) {
+        return (context != null) ? (Counters.Counter) context.getCounter(name) : null;
     }
-  }
 
-  @Override
-  public void incrCounter(String group, String counter, long amount) {
-    if (context != null) {
-      context.getCounter(group, counter).increment(amount);
+    @Override
+    public Counters.Counter getCounter(String group, String name) {
+        return (context != null) ? (Counters.Counter) context.getCounter(group, name) : null;
     }
-  }
 
-  @Override
-  public InputSplit getInputSplit() throws UnsupportedOperationException {
-    return null;
-  }
-
-  public float getProgress() {
-      /* Required to build against 0.23 Reporter and StatusReporter. */
-      /* TODO: determine the progress. */
-      return 0.0f;
-  }
-
-  @Override
-  public void progress() {
-    if (context != null) {
-      context.progress();
-    } else {
-      taskAttemptContext.progress();
+    @Override
+    public void incrCounter(Enum<?> key, long amount) {
+        if (context != null) {
+            context.getCounter(key).increment(amount);
+        }
     }
-  }
+
+    @Override
+    public void incrCounter(String group, String counter, long amount) {
+        if (context != null) {
+            context.getCounter(group, counter).increment(amount);
+        }
+    }
+
+    @Override
+    public InputSplit getInputSplit() throws UnsupportedOperationException {
+        return null;
+    }
+
+    public float getProgress() {
+        /* Required to build against 0.23 Reporter and StatusReporter. */
+        /* TODO: determine the progress. */
+        return 0.0f;
+    }
+
+    @Override
+    public void progress() {
+        if (context != null) {
+            context.progress();
+        } else {
+            taskAttemptContext.progress();
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/Security.java b/src/java/org/apache/hcatalog/mapreduce/Security.java
index 2ff7e2f..041a898 100644
--- a/src/java/org/apache/hcatalog/mapreduce/Security.java
+++ b/src/java/org/apache/hcatalog/mapreduce/Security.java
@@ -44,134 +44,134 @@
 
 final class Security {
 
-  private static final Logger LOG = LoggerFactory.getLogger(HCatOutputFormat.class);
-  
-  // making sure this is not initialized unless needed
-  private static final class LazyHolder {
-    public static final Security INSTANCE = new Security();
-  }
+    private static final Logger LOG = LoggerFactory.getLogger(HCatOutputFormat.class);
 
-  public static Security getInstance() {
-    return LazyHolder.INSTANCE;
-  }
-
-  boolean isSecurityEnabled() {
-      try {
-          Method m = UserGroupInformation.class.getMethod("isSecurityEnabled");
-          return (Boolean)m.invoke(null, (Object[])null);
-      } catch (NoSuchMethodException e) {
-          LOG.info("Security is not supported by this version of hadoop.", e);
-      } catch (InvocationTargetException e) {
-          String msg = "Failed to call isSecurityEnabled()";
-          LOG.info(msg, e);
-          throw new IllegalStateException(msg,e);
-      } catch (IllegalAccessException e) {
-          String msg = "Failed to call isSecurityEnabled()";
-          LOG.info(msg, e);
-          throw new IllegalStateException(msg,e);
-      }
-      return false;
-  }
-
-  // a signature string to associate with a HCatTableInfo - essentially
-  // a concatenation of dbname, tablename and partition keyvalues.
-  String getTokenSignature(OutputJobInfo outputJobInfo) {
-    StringBuilder result = new StringBuilder("");
-    String dbName = outputJobInfo.getDatabaseName();
-    if(dbName != null) {
-      result.append(dbName);
+    // making sure this is not initialized unless needed
+    private static final class LazyHolder {
+        public static final Security INSTANCE = new Security();
     }
-    String tableName = outputJobInfo.getTableName();
-    if(tableName != null) {
-      result.append("." + tableName);
+
+    public static Security getInstance() {
+        return LazyHolder.INSTANCE;
     }
-    Map<String, String> partValues = outputJobInfo.getPartitionValues();
-    if(partValues != null) {
-      for(Entry<String, String> entry: partValues.entrySet()) {
-        result.append("/");
-        result.append(entry.getKey());
-        result.append("=");
-        result.append(entry.getValue());
-      }
 
-    }
-    return result.toString();
-  }
-
-  void handleSecurity(
-      Job job, 
-      OutputJobInfo outputJobInfo,
-      HiveMetaStoreClient client, 
-      Configuration conf,
-      boolean harRequested)
-      throws IOException, MetaException, TException, Exception {
-    if(UserGroupInformation.isSecurityEnabled()){
-      UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
-      // check if oozie has set up a hcat deleg. token - if so use it
-      TokenSelector<? extends TokenIdentifier> hiveTokenSelector = new DelegationTokenSelector();
-      //Oozie does not change the service field of the token
-      //hence by default token generation will have a value of "new Text("")"
-      //HiveClient will look for a use TokenSelector.selectToken() with service
-      //set to empty "Text" if hive.metastore.token.signature property is set to null
-      Token<? extends TokenIdentifier> hiveToken = hiveTokenSelector.selectToken(
-        new Text(), ugi.getTokens());
-      if(hiveToken == null) {
-        // we did not get token set up by oozie, let's get them ourselves here.
-        // we essentially get a token per unique Output HCatTableInfo - this is
-        // done because through Pig, setOutput() method is called multiple times
-        // We want to only get the token once per unique output HCatTableInfo -
-        // we cannot just get one token since in multi-query case (> 1 store in 1 job)
-        // or the case when a single pig script results in > 1 jobs, the single
-        // token will get cancelled by the output committer and the subsequent
-        // stores will fail - by tying the token with the concatenation of
-        // dbname, tablename and partition keyvalues of the output
-        // TableInfo, we can have as many tokens as there are stores and the TokenSelector
-        // will correctly pick the right tokens which the committer will use and
-        // cancel.
-        String tokenSignature = getTokenSignature(outputJobInfo);
-        // get delegation tokens from hcat server and store them into the "job"
-        // These will be used in to publish partitions to
-        // hcat normally in OutputCommitter.commitJob()
-        // when the JobTracker in Hadoop MapReduce starts supporting renewal of
-        // arbitrary tokens, the renewer should be the principal of the JobTracker
-        hiveToken = HCatUtil.extractThriftToken(client.getDelegationToken(ugi.getUserName()), tokenSignature);
-
-        if (harRequested){
-          TokenSelector<? extends TokenIdentifier> jtTokenSelector =
-            new org.apache.hadoop.mapreduce.security.token.delegation.DelegationTokenSelector();
-          Token jtToken = jtTokenSelector.selectToken(org.apache.hadoop.security.SecurityUtil.buildTokenService(
-                      HCatHadoopShims.Instance.get().getResourceManagerAddress(conf)), ugi.getTokens());
-          if(jtToken == null) {
-            //we don't need to cancel this token as the TokenRenewer for JT tokens
-            //takes care of cancelling them
-            job.getCredentials().addToken(new Text("hcat jt token"),
-                HCatUtil.getJobTrackerDelegationToken(conf,ugi.getUserName()));
-          }
+    boolean isSecurityEnabled() {
+        try {
+            Method m = UserGroupInformation.class.getMethod("isSecurityEnabled");
+            return (Boolean) m.invoke(null, (Object[]) null);
+        } catch (NoSuchMethodException e) {
+            LOG.info("Security is not supported by this version of hadoop.", e);
+        } catch (InvocationTargetException e) {
+            String msg = "Failed to call isSecurityEnabled()";
+            LOG.info(msg, e);
+            throw new IllegalStateException(msg, e);
+        } catch (IllegalAccessException e) {
+            String msg = "Failed to call isSecurityEnabled()";
+            LOG.info(msg, e);
+            throw new IllegalStateException(msg, e);
         }
-        
-        job.getCredentials().addToken(new Text(ugi.getUserName() +"_"+ tokenSignature), hiveToken);
-        // this will be used by the outputcommitter to pass on to the metastore client
-        // which in turn will pass on to the TokenSelector so that it can select
-        // the right token.
-        job.getConfiguration().set(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE, tokenSignature);
-      }
+        return false;
     }
-  }
 
-  // we should cancel hcat token if it was acquired by hcat
-  // and not if it was supplied (ie Oozie). In the latter
-  // case the HCAT_KEY_TOKEN_SIGNATURE property in the conf will not be set
-  void cancelToken(HiveMetaStoreClient client, JobContext context) throws IOException, MetaException {
-    String tokenStrForm = client.getTokenStrForm();
-    if(tokenStrForm != null && context.getConfiguration().get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
-      try {
-        client.cancelDelegationToken(tokenStrForm);
-      } catch (TException e) {
-        String msg = "Failed to cancel delegation token";
-        LOG.error(msg,e);
-        throw new IOException(msg,e);
-      }
+    // a signature string to associate with a HCatTableInfo - essentially
+    // a concatenation of dbname, tablename and partition keyvalues.
+    String getTokenSignature(OutputJobInfo outputJobInfo) {
+        StringBuilder result = new StringBuilder("");
+        String dbName = outputJobInfo.getDatabaseName();
+        if (dbName != null) {
+            result.append(dbName);
+        }
+        String tableName = outputJobInfo.getTableName();
+        if (tableName != null) {
+            result.append("." + tableName);
+        }
+        Map<String, String> partValues = outputJobInfo.getPartitionValues();
+        if (partValues != null) {
+            for (Entry<String, String> entry : partValues.entrySet()) {
+                result.append("/");
+                result.append(entry.getKey());
+                result.append("=");
+                result.append(entry.getValue());
+            }
+
+        }
+        return result.toString();
     }
-  }
+
+    void handleSecurity(
+        Job job,
+        OutputJobInfo outputJobInfo,
+        HiveMetaStoreClient client,
+        Configuration conf,
+        boolean harRequested)
+        throws IOException, MetaException, TException, Exception {
+        if (UserGroupInformation.isSecurityEnabled()) {
+            UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
+            // check if oozie has set up a hcat deleg. token - if so use it
+            TokenSelector<? extends TokenIdentifier> hiveTokenSelector = new DelegationTokenSelector();
+            //Oozie does not change the service field of the token
+            //hence by default token generation will have a value of "new Text("")"
+            //HiveClient will look for a use TokenSelector.selectToken() with service
+            //set to empty "Text" if hive.metastore.token.signature property is set to null
+            Token<? extends TokenIdentifier> hiveToken = hiveTokenSelector.selectToken(
+                new Text(), ugi.getTokens());
+            if (hiveToken == null) {
+                // we did not get token set up by oozie, let's get them ourselves here.
+                // we essentially get a token per unique Output HCatTableInfo - this is
+                // done because through Pig, setOutput() method is called multiple times
+                // We want to only get the token once per unique output HCatTableInfo -
+                // we cannot just get one token since in multi-query case (> 1 store in 1 job)
+                // or the case when a single pig script results in > 1 jobs, the single
+                // token will get cancelled by the output committer and the subsequent
+                // stores will fail - by tying the token with the concatenation of
+                // dbname, tablename and partition keyvalues of the output
+                // TableInfo, we can have as many tokens as there are stores and the TokenSelector
+                // will correctly pick the right tokens which the committer will use and
+                // cancel.
+                String tokenSignature = getTokenSignature(outputJobInfo);
+                // get delegation tokens from hcat server and store them into the "job"
+                // These will be used in to publish partitions to
+                // hcat normally in OutputCommitter.commitJob()
+                // when the JobTracker in Hadoop MapReduce starts supporting renewal of
+                // arbitrary tokens, the renewer should be the principal of the JobTracker
+                hiveToken = HCatUtil.extractThriftToken(client.getDelegationToken(ugi.getUserName()), tokenSignature);
+
+                if (harRequested) {
+                    TokenSelector<? extends TokenIdentifier> jtTokenSelector =
+                        new org.apache.hadoop.mapreduce.security.token.delegation.DelegationTokenSelector();
+                    Token jtToken = jtTokenSelector.selectToken(org.apache.hadoop.security.SecurityUtil.buildTokenService(
+                        HCatHadoopShims.Instance.get().getResourceManagerAddress(conf)), ugi.getTokens());
+                    if (jtToken == null) {
+                        //we don't need to cancel this token as the TokenRenewer for JT tokens
+                        //takes care of cancelling them
+                        job.getCredentials().addToken(new Text("hcat jt token"),
+                            HCatUtil.getJobTrackerDelegationToken(conf, ugi.getUserName()));
+                    }
+                }
+
+                job.getCredentials().addToken(new Text(ugi.getUserName() + "_" + tokenSignature), hiveToken);
+                // this will be used by the outputcommitter to pass on to the metastore client
+                // which in turn will pass on to the TokenSelector so that it can select
+                // the right token.
+                job.getConfiguration().set(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE, tokenSignature);
+            }
+        }
+    }
+
+    // we should cancel hcat token if it was acquired by hcat
+    // and not if it was supplied (ie Oozie). In the latter
+    // case the HCAT_KEY_TOKEN_SIGNATURE property in the conf will not be set
+    void cancelToken(HiveMetaStoreClient client, JobContext context) throws IOException, MetaException {
+        String tokenStrForm = client.getTokenStrForm();
+        if (tokenStrForm != null && context.getConfiguration().get(HCatConstants.HCAT_KEY_TOKEN_SIGNATURE) != null) {
+            try {
+                client.cancelDelegationToken(tokenStrForm);
+            } catch (TException e) {
+                String msg = "Failed to cancel delegation token";
+                LOG.error(msg, e);
+                throw new IOException(msg, e);
+            }
+        }
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/mapreduce/StorerInfo.java b/src/java/org/apache/hcatalog/mapreduce/StorerInfo.java
index e404b61..57ec4c3 100644
--- a/src/java/org/apache/hcatalog/mapreduce/StorerInfo.java
+++ b/src/java/org/apache/hcatalog/mapreduce/StorerInfo.java
@@ -47,12 +47,12 @@
      * @param properties the properties for the storage handler
      */
     public StorerInfo(String ifClass, String ofClass, String serdeClass, String storageHandlerClass, Properties properties) {
-      super();
-      this.ifClass =ifClass;
-      this.ofClass = ofClass;
-      this.serdeClass = serdeClass;
-      this.storageHandlerClass = storageHandlerClass;
-      this.properties = properties;
+        super();
+        this.ifClass = ifClass;
+        this.ofClass = ofClass;
+        this.serdeClass = serdeClass;
+        this.storageHandlerClass = storageHandlerClass;
+        this.properties = properties;
     }
 
     /**
@@ -94,14 +94,14 @@
      * @return the storer properties
      */
     public Properties getProperties() {
-      return properties;
+        return properties;
     }
 
     /**
      * @param properties the storer properties to set 
      */
     public void setProperties(Properties properties) {
-      this.properties = properties;
+        this.properties = properties;
     }
 
 
diff --git a/src/java/org/apache/hcatalog/oozie/JavaAction.java b/src/java/org/apache/hcatalog/oozie/JavaAction.java
index ef20ce5..f45f0e3 100644
--- a/src/java/org/apache/hcatalog/oozie/JavaAction.java
+++ b/src/java/org/apache/hcatalog/oozie/JavaAction.java
@@ -27,14 +27,14 @@
 
 public class JavaAction {
 
-  public static void main(String[] args) throws Exception{
+    public static void main(String[] args) throws Exception {
 
-    HiveConf conf = new HiveConf();
-    conf.addResource(new Path("file:///", System.getProperty("oozie.action.conf.xml")));
-    conf.setVar(ConfVars.SEMANTIC_ANALYZER_HOOK, HCatSemanticAnalyzer.class.getName());
-    conf.setBoolVar(ConfVars.METASTORE_USE_THRIFT_SASL, true);
-    SessionState.start(new CliSessionState(conf));
-    new CliDriver().processLine(args[0]);
-  }
+        HiveConf conf = new HiveConf();
+        conf.addResource(new Path("file:///", System.getProperty("oozie.action.conf.xml")));
+        conf.setVar(ConfVars.SEMANTIC_ANALYZER_HOOK, HCatSemanticAnalyzer.class.getName());
+        conf.setBoolVar(ConfVars.METASTORE_USE_THRIFT_SASL, true);
+        SessionState.start(new CliSessionState(conf));
+        new CliDriver().processLine(args[0]);
+    }
 
 }
diff --git a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceInputFormat.java b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceInputFormat.java
index 6ca0cd8..5301530 100644
--- a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceInputFormat.java
+++ b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceInputFormat.java
@@ -29,22 +29,21 @@
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 
-public class RCFileMapReduceInputFormat<K extends LongWritable,V extends BytesRefArrayWritable>
-extends FileInputFormat<LongWritable, BytesRefArrayWritable>
-{
+public class RCFileMapReduceInputFormat<K extends LongWritable, V extends BytesRefArrayWritable>
+    extends FileInputFormat<LongWritable, BytesRefArrayWritable> {
 
-  @Override
-  public RecordReader<LongWritable,BytesRefArrayWritable> createRecordReader(InputSplit split,
-      TaskAttemptContext context) throws IOException, InterruptedException {
+    @Override
+    public RecordReader<LongWritable, BytesRefArrayWritable> createRecordReader(InputSplit split,
+                                                                                TaskAttemptContext context) throws IOException, InterruptedException {
 
-    context.setStatus(split.toString());
-    return new RCFileMapReduceRecordReader<LongWritable,BytesRefArrayWritable>();
-  }
+        context.setStatus(split.toString());
+        return new RCFileMapReduceRecordReader<LongWritable, BytesRefArrayWritable>();
+    }
 
-  @Override
-  public List<InputSplit> getSplits(JobContext job) throws IOException {
+    @Override
+    public List<InputSplit> getSplits(JobContext job) throws IOException {
 
-    job.getConfiguration().setLong("mapred.min.split.size", SequenceFile.SYNC_INTERVAL);
-    return super.getSplits(job);
-  }
+        job.getConfiguration().setLong("mapred.min.split.size", SequenceFile.SYNC_INTERVAL);
+        return super.getSplits(job);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceOutputFormat.java b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceOutputFormat.java
index 792d7a2..665b2dc 100644
--- a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceOutputFormat.java
+++ b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceOutputFormat.java
@@ -39,66 +39,66 @@
 public class RCFileMapReduceOutputFormat extends
     FileOutputFormat<WritableComparable<?>, BytesRefArrayWritable> {
 
-  /**
-   * Set number of columns into the given configuration.
-   * @param conf
-   *          configuration instance which need to set the column number
-   * @param columnNum
-   *          column number for RCFile's Writer
-   *
-   */
-  public static void setColumnNumber(Configuration conf, int columnNum) {
-    assert columnNum > 0;
-    conf.setInt(RCFile.COLUMN_NUMBER_CONF_STR, columnNum);
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.hadoop.mapreduce.lib.output.FileOutputFormat#getRecordWriter(org.apache.hadoop.mapreduce.TaskAttemptContext)
-   */
-  @Override
-  public org.apache.hadoop.mapreduce.RecordWriter<WritableComparable<?>, BytesRefArrayWritable> getRecordWriter(
-      TaskAttemptContext task) throws IOException, InterruptedException {
-
-    //FileOutputFormat.getWorkOutputPath takes TaskInputOutputContext instead of
-    //TaskAttemptContext, so can't use that here
-    FileOutputCommitter committer = (FileOutputCommitter) getOutputCommitter(task);
-    Path outputPath = committer.getWorkPath();
-
-    FileSystem fs = outputPath.getFileSystem(task.getConfiguration());
-
-    if (!fs.exists(outputPath)) {
-      fs.mkdirs(outputPath);
+    /**
+     * Set number of columns into the given configuration.
+     * @param conf
+     *          configuration instance which need to set the column number
+     * @param columnNum
+     *          column number for RCFile's Writer
+     *
+     */
+    public static void setColumnNumber(Configuration conf, int columnNum) {
+        assert columnNum > 0;
+        conf.setInt(RCFile.COLUMN_NUMBER_CONF_STR, columnNum);
     }
 
-    Path file = getDefaultWorkFile(task, "");
+    /* (non-Javadoc)
+    * @see org.apache.hadoop.mapreduce.lib.output.FileOutputFormat#getRecordWriter(org.apache.hadoop.mapreduce.TaskAttemptContext)
+    */
+    @Override
+    public org.apache.hadoop.mapreduce.RecordWriter<WritableComparable<?>, BytesRefArrayWritable> getRecordWriter(
+        TaskAttemptContext task) throws IOException, InterruptedException {
 
-    CompressionCodec codec = null;
-    if (getCompressOutput(task)) {
-      Class<?> codecClass = getOutputCompressorClass(task, DefaultCodec.class);
-      codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, task.getConfiguration());
+        //FileOutputFormat.getWorkOutputPath takes TaskInputOutputContext instead of
+        //TaskAttemptContext, so can't use that here
+        FileOutputCommitter committer = (FileOutputCommitter) getOutputCommitter(task);
+        Path outputPath = committer.getWorkPath();
+
+        FileSystem fs = outputPath.getFileSystem(task.getConfiguration());
+
+        if (!fs.exists(outputPath)) {
+            fs.mkdirs(outputPath);
+        }
+
+        Path file = getDefaultWorkFile(task, "");
+
+        CompressionCodec codec = null;
+        if (getCompressOutput(task)) {
+            Class<?> codecClass = getOutputCompressorClass(task, DefaultCodec.class);
+            codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, task.getConfiguration());
+        }
+
+        final RCFile.Writer out = new RCFile.Writer(fs, task.getConfiguration(), file, task, codec);
+
+        return new RecordWriter<WritableComparable<?>, BytesRefArrayWritable>() {
+
+            /* (non-Javadoc)
+            * @see org.apache.hadoop.mapreduce.RecordWriter#write(java.lang.Object, java.lang.Object)
+            */
+            @Override
+            public void write(WritableComparable<?> key, BytesRefArrayWritable value)
+                throws IOException {
+                out.append(value);
+            }
+
+            /* (non-Javadoc)
+            * @see org.apache.hadoop.mapreduce.RecordWriter#close(org.apache.hadoop.mapreduce.TaskAttemptContext)
+            */
+            @Override
+            public void close(TaskAttemptContext task) throws IOException, InterruptedException {
+                out.close();
+            }
+        };
     }
 
-    final RCFile.Writer out = new RCFile.Writer(fs, task.getConfiguration(), file, task, codec);
-
-    return new RecordWriter<WritableComparable<?>, BytesRefArrayWritable>() {
-
-      /* (non-Javadoc)
-       * @see org.apache.hadoop.mapreduce.RecordWriter#write(java.lang.Object, java.lang.Object)
-       */
-      @Override
-      public void write(WritableComparable<?> key, BytesRefArrayWritable value)
-          throws IOException {
-        out.append(value);
-      }
-
-      /* (non-Javadoc)
-       * @see org.apache.hadoop.mapreduce.RecordWriter#close(org.apache.hadoop.mapreduce.TaskAttemptContext)
-       */
-      @Override
-      public void close(TaskAttemptContext task) throws IOException, InterruptedException {
-        out.close();
-      }
-    };
-  }
-
 }
diff --git a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceRecordReader.java b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceRecordReader.java
index 7a30eaa..126866a 100644
--- a/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceRecordReader.java
+++ b/src/java/org/apache/hcatalog/rcfile/RCFileMapReduceRecordReader.java
@@ -31,90 +31,90 @@
 import org.apache.hadoop.mapreduce.lib.input.FileSplit;
 
 public class RCFileMapReduceRecordReader<K extends LongWritable, V extends BytesRefArrayWritable>
-  extends RecordReader<LongWritable,BytesRefArrayWritable>{
+    extends RecordReader<LongWritable, BytesRefArrayWritable> {
 
-  private Reader in;
-  private long start;
-  private long end;
-  private boolean more = true;
+    private Reader in;
+    private long start;
+    private long end;
+    private boolean more = true;
 
-  // key and value objects are created once in initialize() and then reused
-  // for every getCurrentKey() and getCurrentValue() call. This is important
-  // since RCFile makes an assumption of this fact.
+    // key and value objects are created once in initialize() and then reused
+    // for every getCurrentKey() and getCurrentValue() call. This is important
+    // since RCFile makes an assumption of this fact.
 
-  private LongWritable key;
-  private BytesRefArrayWritable value;
+    private LongWritable key;
+    private BytesRefArrayWritable value;
 
-  @Override
-  public void close() throws IOException {
-    in.close();
-  }
-
-  @Override
-  public LongWritable getCurrentKey() throws IOException, InterruptedException {
-    return key;
-  }
-
-  @Override
-  public BytesRefArrayWritable getCurrentValue() throws IOException, InterruptedException {
-    return value;
-  }
-
-  @Override
-  public float getProgress() throws IOException, InterruptedException {
-    if (end == start) {
-      return 0.0f;
-    } else {
-      return Math.min(1.0f, (in.getPosition() - start) / (float) (end - start));
-    }
-  }
-
-  @Override
-  public boolean nextKeyValue() throws IOException, InterruptedException {
-
-    more = next(key);
-    if (more) {
-      in.getCurrentRow(value);
+    @Override
+    public void close() throws IOException {
+        in.close();
     }
 
-    return more;
-  }
-
-  private boolean next(LongWritable key) throws IOException {
-    if (!more) {
-      return false;
+    @Override
+    public LongWritable getCurrentKey() throws IOException, InterruptedException {
+        return key;
     }
 
-    more = in.next(key);
-    if (!more) {
-      return false;
+    @Override
+    public BytesRefArrayWritable getCurrentValue() throws IOException, InterruptedException {
+        return value;
     }
 
-    if (in.lastSeenSyncPos() >= end) {
-      more = false;
-      return more;
-    }
-    return more;
-  }
-
-  @Override
-  public void initialize(InputSplit split, TaskAttemptContext context) throws IOException,
-      InterruptedException {
-
-    FileSplit fSplit = (FileSplit)split;
-    Path path = fSplit.getPath();
-    Configuration conf = context.getConfiguration();
-    this.in = new RCFile.Reader(path.getFileSystem(conf), path, conf);
-    this.end = fSplit.getStart() + fSplit.getLength();
-
-    if(fSplit.getStart() > in.getPosition()) {
-      in.sync(fSplit.getStart());
+    @Override
+    public float getProgress() throws IOException, InterruptedException {
+        if (end == start) {
+            return 0.0f;
+        } else {
+            return Math.min(1.0f, (in.getPosition() - start) / (float) (end - start));
+        }
     }
 
-    this.start = in.getPosition();
-    more = start < end;
+    @Override
+    public boolean nextKeyValue() throws IOException, InterruptedException {
 
-    key = new LongWritable();
-    value = new BytesRefArrayWritable();
-  }
+        more = next(key);
+        if (more) {
+            in.getCurrentRow(value);
+        }
+
+        return more;
+    }
+
+    private boolean next(LongWritable key) throws IOException {
+        if (!more) {
+            return false;
+        }
+
+        more = in.next(key);
+        if (!more) {
+            return false;
+        }
+
+        if (in.lastSeenSyncPos() >= end) {
+            more = false;
+            return more;
+        }
+        return more;
+    }
+
+    @Override
+    public void initialize(InputSplit split, TaskAttemptContext context) throws IOException,
+        InterruptedException {
+
+        FileSplit fSplit = (FileSplit) split;
+        Path path = fSplit.getPath();
+        Configuration conf = context.getConfiguration();
+        this.in = new RCFile.Reader(path.getFileSystem(conf), path, conf);
+        this.end = fSplit.getStart() + fSplit.getLength();
+
+        if (fSplit.getStart() > in.getPosition()) {
+            in.sync(fSplit.getStart());
+        }
+
+        this.start = in.getPosition();
+        more = start < end;
+
+        key = new LongWritable();
+        value = new BytesRefArrayWritable();
+    }
 }
diff --git a/src/java/org/apache/hcatalog/security/HdfsAuthorizationProvider.java b/src/java/org/apache/hcatalog/security/HdfsAuthorizationProvider.java
index a7c3311..cbafa0a 100644
--- a/src/java/org/apache/hcatalog/security/HdfsAuthorizationProvider.java
+++ b/src/java/org/apache/hcatalog/security/HdfsAuthorizationProvider.java
@@ -48,272 +48,281 @@
 import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.UserGroupInformation;
 
-/** 
+/**
  * An AuthorizationProvider, which checks against the data access level permissions on HDFS.
  * It makes sense to eventually move this class to Hive, so that all hive users can
  * use this authorization model. 
  */
 public class HdfsAuthorizationProvider extends HiveAuthorizationProviderBase {
 
-  protected Warehouse wh;
-  
-  //Config variables : create an enum to store them if we have more
-  private static final String PROXY_USER_NAME = "proxy.user.name";
+    protected Warehouse wh;
 
-  public HdfsAuthorizationProvider() {
-    super();
-  }
-  
-  public HdfsAuthorizationProvider(Configuration conf) {
-    super();
-    setConf(conf);
-  }
-  
-  @Override
-  public void setConf(Configuration conf) {
-    super.setConf(conf);
-    try {
-      this.wh = new Warehouse(conf);
-    } catch (MetaException ex) {
-      throw new RuntimeException(ex);
-    }
-  }
-  
-  protected FsAction getFsAction(Privilege priv, Path path) {
-    
-    switch (priv.getPriv()) {
-    case ALL            : throw new AuthorizationException("no matching Action for Privilege.All");
-    case ALTER_DATA     : return FsAction.WRITE;   
-    case ALTER_METADATA : return FsAction.WRITE;  
-    case CREATE         : return FsAction.WRITE;
-    case DROP           : return FsAction.WRITE;
-    case INDEX          : return FsAction.WRITE;
-    case LOCK           : return FsAction.WRITE;
-    case SELECT         : return FsAction.READ;
-    case SHOW_DATABASE  : return FsAction.READ;
-    case UNKNOWN        : 
-    default             : throw new AuthorizationException("Unknown privilege");
-    }
-  }
-  
-  protected EnumSet<FsAction> getFsActions(Privilege[] privs, Path path) {
-    EnumSet<FsAction> actions = EnumSet.noneOf(FsAction.class);
-    
-    if (privs == null) {
-      return actions;
-    }
-    
-    for (Privilege priv : privs) {
-      actions.add(getFsAction(priv, path));
-    }
-    
-    return actions;
-  }
-  
-  private static final String DATABASE_WAREHOUSE_SUFFIX = ".db";
+    //Config variables : create an enum to store them if we have more
+    private static final String PROXY_USER_NAME = "proxy.user.name";
 
-  private Path getDefaultDatabasePath(String dbName) throws MetaException {
-    if (dbName.equalsIgnoreCase(DEFAULT_DATABASE_NAME)) {
-      return wh.getWhRoot();
-    }
-    return new Path(wh.getWhRoot(), dbName.toLowerCase() + DATABASE_WAREHOUSE_SUFFIX);
-  }
-  
-  protected Path getDbLocation(Database db) throws HiveException {
-    try {
-      String location = db.getLocationUri();
-      if (location == null) {
-        return getDefaultDatabasePath(db.getName());
-      } else {
-        return wh.getDnsPath(wh.getDatabasePath(db));
-      }
-    } catch (MetaException ex) {
-      throw new HiveException(ex.getMessage());
-    }
-  }
-  
-  @Override
-  public void authorize(Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    //Authorize for global level permissions at the warehouse dir
-    Path root;
-    try {
-      root = wh.getWhRoot();
-      authorize(root, readRequiredPriv, writeRequiredPriv);
-    } catch (MetaException ex) {
-      throw new HiveException(ex);
-    }
-  }
-
-  @Override
-  public void authorize(Database db, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    if (db == null) {
-      return;
+    public HdfsAuthorizationProvider() {
+        super();
     }
 
-    Path path = getDbLocation(db);
-    
-    authorize(path, readRequiredPriv, writeRequiredPriv);
-  }
-
-  @Override
-  public void authorize(Table table, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    if (table == null) {
-      return;
-    }
-    
-    //unlike Hive's model, this can be called at CREATE TABLE as well, since we should authorize 
-    //against the table's declared location
-    Path path = null;
-    try {
-      if (table.getTTable().getSd().getLocation() == null
-          || table.getTTable().getSd().getLocation().isEmpty()) {
-            path = wh.getTablePath(hive_db.getDatabase(table.getDbName()), table.getTableName());
-      } else {
-         path = table.getPath();
-      }
-    } catch (MetaException ex) {
-      throw new HiveException(ex);
-    }
-    
-    authorize(path, readRequiredPriv, writeRequiredPriv);
-  }
-
-  //TODO: HiveAuthorizationProvider should expose this interface instead of #authorize(Partition, Privilege[], Privilege[])
-  public void authorize(Table table, Partition part, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    
-    if (part == null || part.getLocation() == null) {
-      authorize(table, readRequiredPriv, writeRequiredPriv);
-    } else {
-      authorize(part.getPartitionPath(), readRequiredPriv, writeRequiredPriv);
-    }
-  }
-
-  @Override
-  public void authorize(Partition part, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    if (part == null) {
-      return;
-    }
-    authorize(part.getTable(), part, readRequiredPriv, writeRequiredPriv);
-  }
-
-  @Override
-  public void authorize(Table table, Partition part, List<String> columns,
-      Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) throws HiveException,
-      AuthorizationException {
-    //columns cannot live in different files, just check for partition level permissions
-    authorize(table, part, readRequiredPriv, writeRequiredPriv);
-  }
-  
-  /** 
-   * Authorization privileges against a path.
-   * @param path a filesystem path
-   * @param readRequiredPriv a list of privileges needed for inputs.
-   * @param writeRequiredPriv a list of privileges needed for outputs.
-   */
-  public void authorize(Path path, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) 
-      throws HiveException, AuthorizationException {
-    try {
-      EnumSet<FsAction> actions = getFsActions(readRequiredPriv, path);
-      actions.addAll(getFsActions(writeRequiredPriv, path));
-      if (actions.isEmpty()) {
-        return;
-      }
-      
-      checkPermissions(getConf(), path, actions);
-      
-    } catch (AccessControlException ex) {
-      throw new AuthorizationException(ex);
-    } catch (LoginException ex) {
-      throw new AuthorizationException(ex);
-    } catch (IOException ex) {
-      throw new HiveException(ex);
-    }
-  }
-  
-  /**
-   * Checks the permissions for the given path and current user on Hadoop FS. If the given path 
-   * does not exists, it checks for it's parent folder.
-   */
-  protected static void checkPermissions(final Configuration conf, final Path path, 
-      final EnumSet<FsAction> actions) throws IOException, LoginException {
-
-    if (path == null) {
-      throw new IllegalArgumentException("path is null");
+    public HdfsAuthorizationProvider(Configuration conf) {
+        super();
+        setConf(conf);
     }
 
-    HadoopShims shims = ShimLoader.getHadoopShims();
-    final UserGroupInformation ugi;
-    if(conf.get(PROXY_USER_NAME) != null){
-        ugi = UserGroupInformation.createRemoteUser(conf.get(PROXY_USER_NAME));
-    }
-    else {
-        ugi = shims.getUGIForConf(conf);
-    }
-    final String user = shims.getShortUserName(ugi);  
-        
-    final FileSystem fs = path.getFileSystem(conf);
-
-    if (fs.exists(path)) {
-      checkPermissions(fs, path, actions, user, ugi.getGroupNames());
-    } else if (path.getParent() != null) {
-      // find the ancestor which exists to check it's permissions
-      Path par = path.getParent();
-      while (par != null) {
-        if (fs.exists(par)) {
-          break;
+    @Override
+    public void setConf(Configuration conf) {
+        super.setConf(conf);
+        try {
+            this.wh = new Warehouse(conf);
+        } catch (MetaException ex) {
+            throw new RuntimeException(ex);
         }
-        par = par.getParent();
-      }
-
-      checkPermissions(fs, par, actions, user, ugi.getGroupNames());
-    }
-  }
-  
-  /**
-   * Checks the permissions for the given path and current user on Hadoop FS. If the given path 
-   * does not exists, it returns.
-   */
-  @SuppressWarnings("deprecation")
-  protected static void checkPermissions(final FileSystem fs, final Path path,
-      final EnumSet<FsAction> actions, String user, String[] groups) throws IOException,
-      AccessControlException {
-    
-    final FileStatus stat;
-
-    try {
-      stat = fs.getFileStatus(path);
-    } catch (FileNotFoundException fnfe) {
-      // File named by path doesn't exist; nothing to validate.
-      return;
-    } catch (org.apache.hadoop.fs.permission.AccessControlException ace) {
-      // Older hadoop version will throw this @deprecated Exception.
-      throw new AccessControlException(ace.getMessage());
     }
 
-    final FsPermission dirPerms = stat.getPermission();
-    final String grp = stat.getGroup();
+    protected FsAction getFsAction(Privilege priv, Path path) {
 
-    for (FsAction action : actions) {
-      if (user.equals(stat.getOwner())) {
-        if (dirPerms.getUserAction().implies(action)) {
-          continue;
+        switch (priv.getPriv()) {
+        case ALL:
+            throw new AuthorizationException("no matching Action for Privilege.All");
+        case ALTER_DATA:
+            return FsAction.WRITE;
+        case ALTER_METADATA:
+            return FsAction.WRITE;
+        case CREATE:
+            return FsAction.WRITE;
+        case DROP:
+            return FsAction.WRITE;
+        case INDEX:
+            return FsAction.WRITE;
+        case LOCK:
+            return FsAction.WRITE;
+        case SELECT:
+            return FsAction.READ;
+        case SHOW_DATABASE:
+            return FsAction.READ;
+        case UNKNOWN:
+        default:
+            throw new AuthorizationException("Unknown privilege");
         }
-      }
-      if (ArrayUtils.contains(groups, grp)) {
-        if (dirPerms.getGroupAction().implies(action)) {
-          continue;
-        }
-      }
-      if (dirPerms.getOtherAction().implies(action)) {
-        continue;
-      }
-      throw new AccessControlException("action " + action + " not permitted on path " 
-          + path + " for user " + user);
     }
-  }
+
+    protected EnumSet<FsAction> getFsActions(Privilege[] privs, Path path) {
+        EnumSet<FsAction> actions = EnumSet.noneOf(FsAction.class);
+
+        if (privs == null) {
+            return actions;
+        }
+
+        for (Privilege priv : privs) {
+            actions.add(getFsAction(priv, path));
+        }
+
+        return actions;
+    }
+
+    private static final String DATABASE_WAREHOUSE_SUFFIX = ".db";
+
+    private Path getDefaultDatabasePath(String dbName) throws MetaException {
+        if (dbName.equalsIgnoreCase(DEFAULT_DATABASE_NAME)) {
+            return wh.getWhRoot();
+        }
+        return new Path(wh.getWhRoot(), dbName.toLowerCase() + DATABASE_WAREHOUSE_SUFFIX);
+    }
+
+    protected Path getDbLocation(Database db) throws HiveException {
+        try {
+            String location = db.getLocationUri();
+            if (location == null) {
+                return getDefaultDatabasePath(db.getName());
+            } else {
+                return wh.getDnsPath(wh.getDatabasePath(db));
+            }
+        } catch (MetaException ex) {
+            throw new HiveException(ex.getMessage());
+        }
+    }
+
+    @Override
+    public void authorize(Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        //Authorize for global level permissions at the warehouse dir
+        Path root;
+        try {
+            root = wh.getWhRoot();
+            authorize(root, readRequiredPriv, writeRequiredPriv);
+        } catch (MetaException ex) {
+            throw new HiveException(ex);
+        }
+    }
+
+    @Override
+    public void authorize(Database db, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        if (db == null) {
+            return;
+        }
+
+        Path path = getDbLocation(db);
+
+        authorize(path, readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Table table, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        if (table == null) {
+            return;
+        }
+
+        //unlike Hive's model, this can be called at CREATE TABLE as well, since we should authorize
+        //against the table's declared location
+        Path path = null;
+        try {
+            if (table.getTTable().getSd().getLocation() == null
+                || table.getTTable().getSd().getLocation().isEmpty()) {
+                path = wh.getTablePath(hive_db.getDatabase(table.getDbName()), table.getTableName());
+            } else {
+                path = table.getPath();
+            }
+        } catch (MetaException ex) {
+            throw new HiveException(ex);
+        }
+
+        authorize(path, readRequiredPriv, writeRequiredPriv);
+    }
+
+    //TODO: HiveAuthorizationProvider should expose this interface instead of #authorize(Partition, Privilege[], Privilege[])
+    public void authorize(Table table, Partition part, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+
+        if (part == null || part.getLocation() == null) {
+            authorize(table, readRequiredPriv, writeRequiredPriv);
+        } else {
+            authorize(part.getPartitionPath(), readRequiredPriv, writeRequiredPriv);
+        }
+    }
+
+    @Override
+    public void authorize(Partition part, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        if (part == null) {
+            return;
+        }
+        authorize(part.getTable(), part, readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Table table, Partition part, List<String> columns,
+                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
+        //columns cannot live in different files, just check for partition level permissions
+        authorize(table, part, readRequiredPriv, writeRequiredPriv);
+    }
+
+    /**
+     * Authorization privileges against a path.
+     * @param path a filesystem path
+     * @param readRequiredPriv a list of privileges needed for inputs.
+     * @param writeRequiredPriv a list of privileges needed for outputs.
+     */
+    public void authorize(Path path, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        try {
+            EnumSet<FsAction> actions = getFsActions(readRequiredPriv, path);
+            actions.addAll(getFsActions(writeRequiredPriv, path));
+            if (actions.isEmpty()) {
+                return;
+            }
+
+            checkPermissions(getConf(), path, actions);
+
+        } catch (AccessControlException ex) {
+            throw new AuthorizationException(ex);
+        } catch (LoginException ex) {
+            throw new AuthorizationException(ex);
+        } catch (IOException ex) {
+            throw new HiveException(ex);
+        }
+    }
+
+    /**
+     * Checks the permissions for the given path and current user on Hadoop FS. If the given path
+     * does not exists, it checks for it's parent folder.
+     */
+    protected static void checkPermissions(final Configuration conf, final Path path,
+                                           final EnumSet<FsAction> actions) throws IOException, LoginException {
+
+        if (path == null) {
+            throw new IllegalArgumentException("path is null");
+        }
+
+        HadoopShims shims = ShimLoader.getHadoopShims();
+        final UserGroupInformation ugi;
+        if (conf.get(PROXY_USER_NAME) != null) {
+            ugi = UserGroupInformation.createRemoteUser(conf.get(PROXY_USER_NAME));
+        } else {
+            ugi = shims.getUGIForConf(conf);
+        }
+        final String user = shims.getShortUserName(ugi);
+
+        final FileSystem fs = path.getFileSystem(conf);
+
+        if (fs.exists(path)) {
+            checkPermissions(fs, path, actions, user, ugi.getGroupNames());
+        } else if (path.getParent() != null) {
+            // find the ancestor which exists to check it's permissions
+            Path par = path.getParent();
+            while (par != null) {
+                if (fs.exists(par)) {
+                    break;
+                }
+                par = par.getParent();
+            }
+
+            checkPermissions(fs, par, actions, user, ugi.getGroupNames());
+        }
+    }
+
+    /**
+     * Checks the permissions for the given path and current user on Hadoop FS. If the given path
+     * does not exists, it returns.
+     */
+    @SuppressWarnings("deprecation")
+    protected static void checkPermissions(final FileSystem fs, final Path path,
+                                           final EnumSet<FsAction> actions, String user, String[] groups) throws IOException,
+        AccessControlException {
+
+        final FileStatus stat;
+
+        try {
+            stat = fs.getFileStatus(path);
+        } catch (FileNotFoundException fnfe) {
+            // File named by path doesn't exist; nothing to validate.
+            return;
+        } catch (org.apache.hadoop.fs.permission.AccessControlException ace) {
+            // Older hadoop version will throw this @deprecated Exception.
+            throw new AccessControlException(ace.getMessage());
+        }
+
+        final FsPermission dirPerms = stat.getPermission();
+        final String grp = stat.getGroup();
+
+        for (FsAction action : actions) {
+            if (user.equals(stat.getOwner())) {
+                if (dirPerms.getUserAction().implies(action)) {
+                    continue;
+                }
+            }
+            if (ArrayUtils.contains(groups, grp)) {
+                if (dirPerms.getGroupAction().implies(action)) {
+                    continue;
+                }
+            }
+            if (dirPerms.getOtherAction().implies(action)) {
+                continue;
+            }
+            throw new AccessControlException("action " + action + " not permitted on path "
+                + path + " for user " + user);
+        }
+    }
 }
diff --git a/src/java/org/apache/hcatalog/security/StorageDelegationAuthorizationProvider.java b/src/java/org/apache/hcatalog/security/StorageDelegationAuthorizationProvider.java
index 86ab414..546296c 100644
--- a/src/java/org/apache/hcatalog/security/StorageDelegationAuthorizationProvider.java
+++ b/src/java/org/apache/hcatalog/security/StorageDelegationAuthorizationProvider.java
@@ -42,93 +42,93 @@
  */
 public class StorageDelegationAuthorizationProvider extends HiveAuthorizationProviderBase {
 
-  protected HiveAuthorizationProvider hdfsAuthorizer = new HdfsAuthorizationProvider();
-  
-  protected static Map<String, String> authProviders = new HashMap<String,String>();
-  
-  @Override
-  public void setConf(Configuration conf) {
-    super.setConf(conf);
-    hdfsAuthorizer.setConf(conf);
-  }
-  
-  @Override
-  public void setAuthenticator(HiveAuthenticationProvider authenticator) {
-    super.setAuthenticator(authenticator);
-    hdfsAuthorizer.setAuthenticator(authenticator);
-  }
-  
-  static {
-    registerAuthProvider("org.apache.hadoop.hive.hbase.HBaseStorageHandler",
-        "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
-    registerAuthProvider("org.apache.hcatalog.hbase.HBaseHCatStorageHandler", 
-        "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
-  }
-  
-  //workaround until Hive adds StorageHandler.getAuthorizationProvider(). Remove these parts afterwards
-  public static void registerAuthProvider(String storageHandlerClass, 
-      String authProviderClass) {
-    authProviders.put(storageHandlerClass, authProviderClass);
-  }
-  
-  /** Returns the StorageHandler of the Table obtained from the HCatStorageHandler */
-  protected HiveAuthorizationProvider getDelegate(Table table) throws HiveException {
-    HiveStorageHandler handler =  table.getStorageHandler();
-    
-    if (handler != null) {
-      if (handler instanceof HCatStorageHandler) {
-       return ((HCatStorageHandler) handler).getAuthorizationProvider();
-      } else {
-        String authProviderClass = authProviders.get(handler.getClass().getCanonicalName());
-        
-        if (authProviderClass != null) {
-          try {
-            ReflectionUtils.newInstance(getConf().getClassByName(authProviderClass), getConf());
-          } catch (ClassNotFoundException ex) {
-            throw new HiveException("Cannot instantiate delegation AuthotizationProvider");
-          }
-        }
-        
-        //else we do not have anything to delegate to
-        throw new HiveException(String.format("Storage Handler for table:%s is not an instance " +
-            "of HCatStorageHandler", table.getTableName()));
-      }
-    } else {
-      //return an authorizer for HDFS
-      return hdfsAuthorizer;
+    protected HiveAuthorizationProvider hdfsAuthorizer = new HdfsAuthorizationProvider();
+
+    protected static Map<String, String> authProviders = new HashMap<String, String>();
+
+    @Override
+    public void setConf(Configuration conf) {
+        super.setConf(conf);
+        hdfsAuthorizer.setConf(conf);
     }
-  }
-  
-  @Override
-  public void authorize(Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    //global authorizations against warehouse hdfs directory
-    hdfsAuthorizer.authorize(readRequiredPriv, writeRequiredPriv);
-  }
 
-  @Override
-  public void authorize(Database db, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    //db's are tied to a hdfs location
-    hdfsAuthorizer.authorize(db, readRequiredPriv, writeRequiredPriv);
-  }
+    @Override
+    public void setAuthenticator(HiveAuthenticationProvider authenticator) {
+        super.setAuthenticator(authenticator);
+        hdfsAuthorizer.setAuthenticator(authenticator);
+    }
 
-  @Override
-  public void authorize(Table table, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-      throws HiveException, AuthorizationException {
-    getDelegate(table).authorize(table, readRequiredPriv, writeRequiredPriv);
-  }
+    static {
+        registerAuthProvider("org.apache.hadoop.hive.hbase.HBaseStorageHandler",
+            "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
+        registerAuthProvider("org.apache.hcatalog.hbase.HBaseHCatStorageHandler",
+            "org.apache.hcatalog.hbase.HBaseAuthorizationProvider");
+    }
 
-  @Override
-  public void authorize(Partition part, Privilege[] readRequiredPriv, 
-      Privilege[] writeRequiredPriv) throws HiveException, AuthorizationException {
-    getDelegate(part.getTable()).authorize(part, readRequiredPriv, writeRequiredPriv);
-  }
+    //workaround until Hive adds StorageHandler.getAuthorizationProvider(). Remove these parts afterwards
+    public static void registerAuthProvider(String storageHandlerClass,
+                                            String authProviderClass) {
+        authProviders.put(storageHandlerClass, authProviderClass);
+    }
 
-  @Override
-  public void authorize(Table table, Partition part, List<String> columns,
-      Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) throws HiveException,
-      AuthorizationException {
-    getDelegate(table).authorize(table, part, columns, readRequiredPriv, writeRequiredPriv);
-  }
+    /** Returns the StorageHandler of the Table obtained from the HCatStorageHandler */
+    protected HiveAuthorizationProvider getDelegate(Table table) throws HiveException {
+        HiveStorageHandler handler = table.getStorageHandler();
+
+        if (handler != null) {
+            if (handler instanceof HCatStorageHandler) {
+                return ((HCatStorageHandler) handler).getAuthorizationProvider();
+            } else {
+                String authProviderClass = authProviders.get(handler.getClass().getCanonicalName());
+
+                if (authProviderClass != null) {
+                    try {
+                        ReflectionUtils.newInstance(getConf().getClassByName(authProviderClass), getConf());
+                    } catch (ClassNotFoundException ex) {
+                        throw new HiveException("Cannot instantiate delegation AuthotizationProvider");
+                    }
+                }
+
+                //else we do not have anything to delegate to
+                throw new HiveException(String.format("Storage Handler for table:%s is not an instance " +
+                    "of HCatStorageHandler", table.getTableName()));
+            }
+        } else {
+            //return an authorizer for HDFS
+            return hdfsAuthorizer;
+        }
+    }
+
+    @Override
+    public void authorize(Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        //global authorizations against warehouse hdfs directory
+        hdfsAuthorizer.authorize(readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Database db, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        //db's are tied to a hdfs location
+        hdfsAuthorizer.authorize(db, readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Table table, Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
+        getDelegate(table).authorize(table, readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Partition part, Privilege[] readRequiredPriv,
+                          Privilege[] writeRequiredPriv) throws HiveException, AuthorizationException {
+        getDelegate(part.getTable()).authorize(part, readRequiredPriv, writeRequiredPriv);
+    }
+
+    @Override
+    public void authorize(Table table, Partition part, List<String> columns,
+                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
+        getDelegate(table).authorize(table, part, columns, readRequiredPriv, writeRequiredPriv);
+    }
 }
diff --git a/src/java/org/apache/hcatalog/shims/HCatHadoopShims.java b/src/java/org/apache/hcatalog/shims/HCatHadoopShims.java
index 2be4509..ee693b4 100644
--- a/src/java/org/apache/hcatalog/shims/HCatHadoopShims.java
+++ b/src/java/org/apache/hcatalog/shims/HCatHadoopShims.java
@@ -39,53 +39,55 @@
  **/
 public interface HCatHadoopShims {
 
-  enum PropertyName { CACHE_ARCHIVES, CACHE_FILES, CACHE_SYMLINK };
+    enum PropertyName {CACHE_ARCHIVES, CACHE_FILES, CACHE_SYMLINK}
 
-  public static abstract class Instance {
-    static HCatHadoopShims instance = selectShim();
+    ;
 
-    public static HCatHadoopShims get() {
-      return instance;
+    public static abstract class Instance {
+        static HCatHadoopShims instance = selectShim();
+
+        public static HCatHadoopShims get() {
+            return instance;
+        }
+
+        private static HCatHadoopShims selectShim() {
+            // piggyback on Hive's detection logic
+            String major = ShimLoader.getMajorVersion();
+            String shimFQN = "org.apache.hcatalog.shims.HCatHadoopShims20S";
+            if (major.startsWith("0.23")) {
+                shimFQN = "org.apache.hcatalog.shims.HCatHadoopShims23";
+            }
+            try {
+                Class<? extends HCatHadoopShims> clasz = Class.forName(shimFQN)
+                    .asSubclass(HCatHadoopShims.class);
+                return clasz.newInstance();
+            } catch (Exception e) {
+                throw new RuntimeException("Failed to instantiate: " + shimFQN, e);
+            }
+        }
     }
 
-    private static HCatHadoopShims selectShim() {
-      // piggyback on Hive's detection logic
-      String major = ShimLoader.getMajorVersion();
-      String shimFQN = "org.apache.hcatalog.shims.HCatHadoopShims20S";
-      if (major.startsWith("0.23")) {
-        shimFQN = "org.apache.hcatalog.shims.HCatHadoopShims23";
-      }
-      try {
-        Class<? extends HCatHadoopShims> clasz = Class.forName(shimFQN)
-            .asSubclass(HCatHadoopShims.class);
-        return clasz.newInstance();
-      } catch (Exception e) {
-        throw new RuntimeException("Failed to instantiate: " + shimFQN, e);
-      }
-    }
-  }
+    public TaskID createTaskID();
 
-  public TaskID createTaskID();
+    public TaskAttemptID createTaskAttemptID();
 
-  public TaskAttemptID createTaskAttemptID();
+    public org.apache.hadoop.mapreduce.TaskAttemptContext createTaskAttemptContext(Configuration conf,
+                                                                                   TaskAttemptID taskId);
 
-  public org.apache.hadoop.mapreduce.TaskAttemptContext createTaskAttemptContext(Configuration conf,
-          TaskAttemptID taskId);
+    public org.apache.hadoop.mapred.TaskAttemptContext createTaskAttemptContext(JobConf conf,
+                                                                                org.apache.hadoop.mapred.TaskAttemptID taskId, Progressable progressable);
 
-  public org.apache.hadoop.mapred.TaskAttemptContext createTaskAttemptContext(JobConf conf,
-          org.apache.hadoop.mapred.TaskAttemptID taskId, Progressable progressable);
+    public JobContext createJobContext(Configuration conf, JobID jobId);
 
-  public JobContext createJobContext(Configuration conf, JobID jobId);
+    public org.apache.hadoop.mapred.JobContext createJobContext(JobConf conf, JobID jobId, Progressable progressable);
 
-  public org.apache.hadoop.mapred.JobContext createJobContext(JobConf conf, JobID jobId, Progressable progressable);
+    public void commitJob(OutputFormat outputFormat, ResourceSchema schema,
+                          String arg1, Job job) throws IOException;
 
-  public void commitJob(OutputFormat outputFormat, ResourceSchema schema,
-          String arg1, Job job) throws IOException;
+    public void abortJob(OutputFormat outputFormat, Job job) throws IOException;
 
-  public void abortJob(OutputFormat outputFormat, Job job) throws IOException;
+    /* Referring to job tracker in 0.20 and resource manager in 0.23 */
+    public InetSocketAddress getResourceManagerAddress(Configuration conf);
 
-  /* Referring to job tracker in 0.20 and resource manager in 0.23 */
-  public InetSocketAddress getResourceManagerAddress(Configuration conf);
-
-  public String getPropertyName(PropertyName name);
+    public String getPropertyName(PropertyName name);
 }
diff --git a/src/java/org/apache/hcatalog/storagehandler/DummyHCatAuthProvider.java b/src/java/org/apache/hcatalog/storagehandler/DummyHCatAuthProvider.java
index 33bdee0..6c31c10 100644
--- a/src/java/org/apache/hcatalog/storagehandler/DummyHCatAuthProvider.java
+++ b/src/java/org/apache/hcatalog/storagehandler/DummyHCatAuthProvider.java
@@ -35,109 +35,109 @@
  * dummy authorization functionality for other classes to extend and override.
  */
 class DummyHCatAuthProvider implements HiveAuthorizationProvider {
-    
+
     @Override
     public Configuration getConf() {
         return null;
     }
-    
+
     @Override
     public void setConf(Configuration conf) {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #init(org.apache.hadoop.conf.Configuration)
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #init(org.apache.hadoop.conf.Configuration)
+    */
     @Override
     public void init(Configuration conf) throws HiveException {
     }
-    
+
     @Override
     public HiveAuthenticationProvider getAuthenticator() {
         return null;
     }
-    
+
     @Override
     public void setAuthenticator(HiveAuthenticationProvider authenticator) {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.metastore.api.Database,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.metastore.api.Database,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Database db, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Table table, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Partition,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Partition,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Partition part, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
-     * org.apache.hadoop.hive.ql.metadata.Partition, java.util.List,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
+    * org.apache.hadoop.hive.ql.metadata.Partition, java.util.List,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Table table, Partition part, List<String> columns,
-            Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-            throws HiveException, AuthorizationException {
+                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
     }
-    
+
 }
diff --git a/src/test/e2e/hcatalog/build.xml b/src/test/e2e/hcatalog/build.xml
index 6ca71ec..f2fc1e1 100644
--- a/src/test/e2e/hcatalog/build.xml
+++ b/src/test/e2e/hcatalog/build.xml
@@ -17,314 +17,314 @@
 
 <project name="TestHarnessHCatTests" default="test">
 
-  <property name="hcat.jar"
-    value="${hcat.dir}/share/hcatalog/hcatalog-${hcatalog.version}.jar"/>
+    <property name="hcat.jar"
+              value="${hcat.dir}/share/hcatalog/hcatalog-${hcatalog.version}.jar"/>
 
-  <!-- Separate property name for udfs' build.xml -->
-  <property name="hcat.jarfile" value="${hcat.jar}"/>
-  <property name="udf.dir" value="${basedir}/udfs"/>
-  <property name="udf.java.dir" value="${udf.dir}/java"/>
-  <property name="udf.jar" value="${udf.java.dir}/testudf.jar"/>
-  <property name="params.dir" value="${basedir}/paramfiles"/>
-  <property name="lib.dir" value="${basedir}/lib"/>
-  <property name="rctool.java.dir" value="${basedir}/tools/generate/java"/>
+    <!-- Separate property name for udfs' build.xml -->
+    <property name="hcat.jarfile" value="${hcat.jar}"/>
+    <property name="udf.dir" value="${basedir}/udfs"/>
+    <property name="udf.java.dir" value="${udf.dir}/java"/>
+    <property name="udf.jar" value="${udf.java.dir}/testudf.jar"/>
+    <property name="params.dir" value="${basedir}/paramfiles"/>
+    <property name="lib.dir" value="${basedir}/lib"/>
+    <property name="rctool.java.dir" value="${basedir}/tools/generate/java"/>
 
-  <property name="tar.name" value="${basedir}/hcattests.tar"/>
-  <property name="tar.dir" value="${basedir}/tar"/>
-  <property name="test.src" value="${basedir}/tests"/>
-  <property name="driver.src" value="${basedir}/drivers"/>
-  <property name="deployer.src" value="${basedir}/deployers"/>
-  <property name="conf.src" value="${basedir}/conf"/>
-  <property name="tool.src" value="${basedir}/tools"/>
-  <property name="data.dir" value="${basedir}/data"/>
+    <property name="tar.name" value="${basedir}/hcattests.tar"/>
+    <property name="tar.dir" value="${basedir}/tar"/>
+    <property name="test.src" value="${basedir}/tests"/>
+    <property name="driver.src" value="${basedir}/drivers"/>
+    <property name="deployer.src" value="${basedir}/deployers"/>
+    <property name="conf.src" value="${basedir}/conf"/>
+    <property name="tool.src" value="${basedir}/tools"/>
+    <property name="data.dir" value="${basedir}/data"/>
 
-  <property name="harness.dir" value="${basedir}/../harness"/>
-  <property name="harness.tar" value="${harness.dir}/harness.tar"/>
-  <property name="test.location" value="${basedir}/testdist"/>
-  <property name="benchmark.location" value="${test.location}/benchmarks"/>
-  <!--<property name="hadoop.core.path" value="${harness.hadoop.home}"/>-->
-  <property name="hadoop.core.path" value="${hadoop.home}"/>
-  <!-- Override on command line to use rpm.conf -->
-  <property name="harness.conf" value="${test.location}/conf/default.conf"/>
-  <!-- Default value for output directory -->
-  <property name="harness.PH_LOCAL" value="out"/>
+    <property name="harness.dir" value="${basedir}/../harness"/>
+    <property name="harness.tar" value="${harness.dir}/harness.tar"/>
+    <property name="test.location" value="${basedir}/testdist"/>
+    <property name="benchmark.location" value="${test.location}/benchmarks"/>
+    <!--<property name="hadoop.core.path" value="${harness.hadoop.home}"/>-->
+    <property name="hadoop.core.path" value="${hadoop.home}"/>
+    <!-- Override on command line to use rpm.conf -->
+    <property name="harness.conf" value="${test.location}/conf/default.conf"/>
+    <!-- Default value for output directory -->
+    <property name="harness.PH_LOCAL" value="out"/>
 
-  <property name="hadoopversion" value="20" />
+    <property name="hadoopversion" value="20"/>
 
-  <condition property="isHadoop23">
-    <equals arg1="${hadoopversion}" arg2="23"/>
-  </condition>
+    <condition property="isHadoop23">
+        <equals arg1="${hadoopversion}" arg2="23"/>
+    </condition>
 
-  <!-- Build the UDFs -->
-  <target name="udfs" >
-    <ant dir="${udf.java.dir}"/>
-  </target>
+    <!-- Build the UDFs -->
+    <target name="udfs">
+        <ant dir="${udf.java.dir}"/>
+    </target>
 
-  <path id="hadoop.core.jar.location">
-    <fileset dir="${hadoop.core.path}">
-      <include name="hadoop-core-*.jar" unless="isHadoop23"/>
-      <include name="**/hadoop-common-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-auth-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-hdfs-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-mapreduce-client-core-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-yarn-api-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-yarn-common-*.jar" if="isHadoop23"/>
-      <include name="**/hadoop-annotations-*.jar" if="isHadoop23"/>
-    </fileset>
-  </path>
-
-  <path id="hive.serde.jar.location">
-    <!-- <fileset dir="${hive.dir}/build/serde"> -->
-    <fileset dir="${hive.home}/lib">
-      <include name="hive-serde-*.jar"/>
-    </fileset>
-  </path>
-
-  <path id="hive.ql.jar.location">
-    <!--<fileset dir="${hive.dir}/build/ql"> -->
-    <fileset dir="${hive.home}/lib">
-      <include name="hive-exec-*.jar"/>
-    </fileset>
-  </path>
-
-  <!-- Build the RCfile data generator -->
-  <target name="rctool" depends="property-check">
-    <ant dir="${rctool.java.dir}">
-      <property name="hive.serde.jarfile" refid="hive.serde.jar.location"/>
-      <property name="hive.ql.jarfile" refid="hive.ql.jar.location"/>
-      <property name="hadoop.core.jarfile" refid="hadoop.core.jar.location"/>
-    </ant>
-  </target>
-
-  <!-- Build an archive to use in the tests -->
-  <target name="tar" description="Create tar file with hcat modules">
-    <mkdir dir="${tar.dir}"/>
-    <mkdir dir="${tar.dir}/tests"/>
-    <mkdir dir="${tar.dir}/drivers"/>
-    <mkdir dir="${tar.dir}/deployers"/>
-    <mkdir dir="${tar.dir}/conf"/>
-    <mkdir dir="${tar.dir}/libexec"/>
-    <mkdir dir="${tar.dir}/libexec/PigTest"/>
-    <mkdir dir="${tar.dir}/libexec/PigTest/test"/>
-    <mkdir dir="${tar.dir}/libexec/PigTest/generate"/>
-    <mkdir dir="${tar.dir}/lib"/>
-    <mkdir dir="${tar.dir}/lib/java"/>
-    <mkdir dir="${tar.dir}/paramfiles"/>
-
-    <copy todir="${tar.dir}/tests">
-        <fileset dir="${test.src}">
+    <path id="hadoop.core.jar.location">
+        <fileset dir="${hadoop.core.path}">
+            <include name="hadoop-core-*.jar" unless="isHadoop23"/>
+            <include name="**/hadoop-common-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-auth-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-hdfs-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-mapreduce-client-core-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-yarn-api-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-yarn-common-*.jar" if="isHadoop23"/>
+            <include name="**/hadoop-annotations-*.jar" if="isHadoop23"/>
         </fileset>
-    </copy>
-    
-    <copy todir="${tar.dir}/data">
-        <fileset dir="${data.dir}">
+    </path>
+
+    <path id="hive.serde.jar.location">
+        <!-- <fileset dir="${hive.dir}/build/serde"> -->
+        <fileset dir="${hive.home}/lib">
+            <include name="hive-serde-*.jar"/>
         </fileset>
-    </copy>
+    </path>
+
+    <path id="hive.ql.jar.location">
+        <!--<fileset dir="${hive.dir}/build/ql"> -->
+        <fileset dir="${hive.home}/lib">
+            <include name="hive-exec-*.jar"/>
+        </fileset>
+    </path>
+
+    <!-- Build the RCfile data generator -->
+    <target name="rctool" depends="property-check">
+        <ant dir="${rctool.java.dir}">
+            <property name="hive.serde.jarfile" refid="hive.serde.jar.location"/>
+            <property name="hive.ql.jarfile" refid="hive.ql.jar.location"/>
+            <property name="hadoop.core.jarfile" refid="hadoop.core.jar.location"/>
+        </ant>
+    </target>
+
+    <!-- Build an archive to use in the tests -->
+    <target name="tar" description="Create tar file with hcat modules">
+        <mkdir dir="${tar.dir}"/>
+        <mkdir dir="${tar.dir}/tests"/>
+        <mkdir dir="${tar.dir}/drivers"/>
+        <mkdir dir="${tar.dir}/deployers"/>
+        <mkdir dir="${tar.dir}/conf"/>
+        <mkdir dir="${tar.dir}/libexec"/>
+        <mkdir dir="${tar.dir}/libexec/PigTest"/>
+        <mkdir dir="${tar.dir}/libexec/PigTest/test"/>
+        <mkdir dir="${tar.dir}/libexec/PigTest/generate"/>
+        <mkdir dir="${tar.dir}/lib"/>
+        <mkdir dir="${tar.dir}/lib/java"/>
+        <mkdir dir="${tar.dir}/paramfiles"/>
+
+        <copy todir="${tar.dir}/tests">
+            <fileset dir="${test.src}">
+            </fileset>
+        </copy>
+
+        <copy todir="${tar.dir}/data">
+            <fileset dir="${data.dir}">
+            </fileset>
+        </copy>
 
 
-    <copy todir="${tar.dir}">
-      <fileset dir="${driver.src}">
-        <exclude name="TestDriverScript.pm"/>
-      </fileset>
-      <fileset dir="${deployer.src}"/>
-    </copy>
+        <copy todir="${tar.dir}">
+            <fileset dir="${driver.src}">
+                <exclude name="TestDriverScript.pm"/>
+            </fileset>
+            <fileset dir="${deployer.src}"/>
+        </copy>
 
 
-    <copy todir="${tar.dir}/conf">
-      <fileset dir="${conf.src}"/>
-    </copy>
+        <copy todir="${tar.dir}/conf">
+            <fileset dir="${conf.src}"/>
+        </copy>
 
-    <copy todir="${tar.dir}/libexec/HCatTest">
-      <fileset dir="${tool.src}/test"/>
-      <fileset dir="${tool.src}/generate"/>
-      <fileset dir="${tool.src}/install"/>
-    </copy>
+        <copy todir="${tar.dir}/libexec/HCatTest">
+            <fileset dir="${tool.src}/test"/>
+            <fileset dir="${tool.src}/generate"/>
+            <fileset dir="${tool.src}/install"/>
+        </copy>
 
-    <copy todir="${tar.dir}/lib/java">
-      <fileset file="${udf.jar}"/>
-    </copy>
+        <copy todir="${tar.dir}/lib/java">
+            <fileset file="${udf.jar}"/>
+        </copy>
 
-    <copy todir="${tar.dir}/paramfiles">
-      <fileset file="${params.dir}/params_3"/>
-    </copy>
+        <copy todir="${tar.dir}/paramfiles">
+            <fileset file="${params.dir}/params_3"/>
+        </copy>
 
-    <tar destfile="${tar.name}" basedir="${tar.dir}"/>
-  </target>
+        <tar destfile="${tar.name}" basedir="${tar.dir}"/>
+    </target>
 
-  <!-- Get the tarball for the harness -->
-  <target name="build-harness">
-    <ant dir="${harness.dir}" inheritAll="false"/>
-  </target>
+    <!-- Get the tarball for the harness -->
+    <target name="build-harness">
+        <ant dir="${harness.dir}" inheritAll="false"/>
+    </target>
 
-  <!-- Check that the necessary properties are setup -->
-  <target name="property-check">
-    <!--
-    <fail message="Please set the property hadoop.home to the location Hadoop is installed "
-      unless="hadoop.home"/>
-      -->
-    <fail message="Please set the property hadoop.home to the location Hadoop is installed ">
-      <condition>
-        <and>
-          <not>
-            <isset property="hadoop.home"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
-    <fail message="Please set the property harness.cluster.conf to the location Hadoop conf is installed ">
-      <condition>
-        <and>
-          <not>
-            <isset property="harness.cluster.conf"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
-    <fail message="Please set the property hive.home to the location Hive is installed ">
-      <condition>
-        <and>
-          <not>
-            <isset property="hive.home"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
-    <fail message="Please set the property hcat.home to the location HCatalog is installed ">
-      <condition>
-        <and>
-          <not>
-            <isset property="hcat.home"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
-    <fail message="Please set the property pig.home to the location Pig is installed ">
-    <condition>
-        <and>
-          <not>
-            <isset property="pig.home"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
+    <!-- Check that the necessary properties are setup -->
+    <target name="property-check">
+        <!--
+      <fail message="Please set the property hadoop.home to the location Hadoop is installed "
+        unless="hadoop.home"/>
+        -->
+        <fail message="Please set the property hadoop.home to the location Hadoop is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="hadoop.home"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+        <fail message="Please set the property harness.cluster.conf to the location Hadoop conf is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="harness.cluster.conf"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+        <fail message="Please set the property hive.home to the location Hive is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="hive.home"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+        <fail message="Please set the property hcat.home to the location HCatalog is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="hcat.home"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+        <fail message="Please set the property pig.home to the location Pig is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="pig.home"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
 
-    <fail message="Please set the property hbase.home to the location HBase is installed ">
-      <condition>
-        <and>
-          <not>
-            <isset property="hbase.home"/>
-          </not>
-          <not>
-            <contains string="${harness.conf}" substring="rpm.conf"/>
-          </not>
-        </and>
-      </condition>
-    </fail>
-  </target>
+        <fail message="Please set the property hbase.home to the location HBase is installed ">
+            <condition>
+                <and>
+                    <not>
+                        <isset property="hbase.home"/>
+                    </not>
+                    <not>
+                        <contains string="${harness.conf}" substring="rpm.conf"/>
+                    </not>
+                </and>
+            </condition>
+        </fail>
+    </target>
 
-  <!-- Prep the test area -->
-  <target name="init-test" depends="build-harness, tar">
-    <mkdir dir="${test.location}"/>
-    <mkdir dir="${benchmark.location}"/>
+    <!-- Prep the test area -->
+    <target name="init-test" depends="build-harness, tar">
+        <mkdir dir="${test.location}"/>
+        <mkdir dir="${benchmark.location}"/>
 
-    <untar src="${tar.name}" dest="${test.location}"/>
-    <untar src="${harness.tar}" dest="${test.location}"/>
+        <untar src="${tar.name}" dest="${test.location}"/>
+        <untar src="${harness.tar}" dest="${test.location}"/>
 
-    <chmod perm="ugo+x" type="file">
-      <fileset dir="${test.location}/libexec" />
-      <fileset file="${test.location}/test_harness.pl"/>
-    </chmod>
+        <chmod perm="ugo+x" type="file">
+            <fileset dir="${test.location}/libexec"/>
+            <fileset file="${test.location}/test_harness.pl"/>
+        </chmod>
 
-  </target>
+    </target>
 
-  <target name="test" depends="property-check, udfs, tar, init-test">
+    <target name="test" depends="property-check, udfs, tar, init-test">
 
-    <!-- If they have not specified tests to run then null it out -->
-     <property name="tests.to.run" value=""/> 
-    <echo />
-    <exec executable="./test_harness.pl" dir="${test.location}" failonerror="true">
-      <env key="HARNESS_ROOT" value="."/>
-      <env key="PH_LOCAL" value="${harness.PH_LOCAL}"/>
-      <env key="HADOOP_HOME" value="${hadoop.home}"/>
-      <env key="HADOOP_CONF_DIR" value="${harness.cluster.conf}"/>
-      <env key="HIVE_HOME" value="${hive.home}"/>
-      <env key="HCAT_HOME" value="${hcat.home}"/>
-      <env key="PIG_HOME" value="${pig.home}"/>
-      <env key="HBASE_HOME" value="${hbase.home}"/>
-      <arg line="-conf ${harness.conf}"/>
-      <arg line="${tests.to.run}"/>
-      <arg value="${test.location}/tests/pig.conf"/>
-      <arg value="${test.location}/tests/hive.conf"/>
-      <arg value="${test.location}/tests/hcat.conf"/>
-      <arg value="${test.location}/tests/hadoop.conf"/>
-    </exec>
-  </target>
+        <!-- If they have not specified tests to run then null it out -->
+        <property name="tests.to.run" value=""/>
+        <echo/>
+        <exec executable="./test_harness.pl" dir="${test.location}" failonerror="true">
+            <env key="HARNESS_ROOT" value="."/>
+            <env key="PH_LOCAL" value="${harness.PH_LOCAL}"/>
+            <env key="HADOOP_HOME" value="${hadoop.home}"/>
+            <env key="HADOOP_CONF_DIR" value="${harness.cluster.conf}"/>
+            <env key="HIVE_HOME" value="${hive.home}"/>
+            <env key="HCAT_HOME" value="${hcat.home}"/>
+            <env key="PIG_HOME" value="${pig.home}"/>
+            <env key="HBASE_HOME" value="${hbase.home}"/>
+            <arg line="-conf ${harness.conf}"/>
+            <arg line="${tests.to.run}"/>
+            <arg value="${test.location}/tests/pig.conf"/>
+            <arg value="${test.location}/tests/hive.conf"/>
+            <arg value="${test.location}/tests/hcat.conf"/>
+            <arg value="${test.location}/tests/hadoop.conf"/>
+        </exec>
+    </target>
 
-  <target name="init-deploy" depends="rctool">
-     <!-- For now default to the existing cluster deployer, since 
+    <target name="init-deploy" depends="rctool">
+        <!-- For now default to the existing cluster deployer, since
     it's all there is.  Once the local deployer is available that
     should be the default. -->
-   <property name="deploy.conf"
-        value="${test.location}/conf/existing_deployer.conf"/>
-  </target>
+        <property name="deploy.conf"
+                  value="${test.location}/conf/existing_deployer.conf"/>
+    </target>
 
-  <target name="deploy-base" depends="property-check, tar, init-test, init-deploy">
-    <exec executable="./test_harness.pl" dir="${test.location}"
-      failonerror="true">
-      <env key="HARNESS_ROOT" value="."/>
-      <env key="PH_LOCAL" value="${harness.PH_LOCAL}"/>
-      <env key="HADOOP_HOME" value="${hadoop.home}"/>
-      <env key="HIVE_HOME" value="${hive.home}"/>
-      <env key="HCAT_HOME" value="${hcat.home}"/>
-      <env key="PIG_HOME" value="${pig.home}"/>
-      <env key="HBASE_HOME" value="${hbase.home}"/>
-      <arg line="-conf ${harness.conf}"/>
-      <arg value="-deploycfg"/>
-      <arg value="${deploy.conf}"/>
-      <arg value="${deploy.opt}"/>
-      <!-- Give a bogus test so it just does the deployment -->
-      <arg value="-t"/>
-      <arg value="NoSuchTest"/>
-    </exec>
-  </target>
+    <target name="deploy-base" depends="property-check, tar, init-test, init-deploy">
+        <exec executable="./test_harness.pl" dir="${test.location}"
+              failonerror="true">
+            <env key="HARNESS_ROOT" value="."/>
+            <env key="PH_LOCAL" value="${harness.PH_LOCAL}"/>
+            <env key="HADOOP_HOME" value="${hadoop.home}"/>
+            <env key="HIVE_HOME" value="${hive.home}"/>
+            <env key="HCAT_HOME" value="${hcat.home}"/>
+            <env key="PIG_HOME" value="${pig.home}"/>
+            <env key="HBASE_HOME" value="${hbase.home}"/>
+            <arg line="-conf ${harness.conf}"/>
+            <arg value="-deploycfg"/>
+            <arg value="${deploy.conf}"/>
+            <arg value="${deploy.opt}"/>
+            <!-- Give a bogus test so it just does the deployment -->
+            <arg value="-t"/>
+            <arg value="NoSuchTest"/>
+        </exec>
+    </target>
 
-  <target name="deploy">
-    <antcall target="deploy-base">
-      <param name="deploy.opt" value="-deploy"/>
-    </antcall>
-  </target>
+    <target name="deploy">
+        <antcall target="deploy-base">
+            <param name="deploy.opt" value="-deploy"/>
+        </antcall>
+    </target>
 
-  <target name="undeploy">
-    <antcall target="deploy-base">
-      <param name="deploy.opt" value="-undeploy"/>
-    </antcall>
-  </target>
+    <target name="undeploy">
+        <antcall target="deploy-base">
+            <param name="deploy.opt" value="-undeploy"/>
+        </antcall>
+    </target>
 
-  <target name="deploy-test" depends="deploy, test"/>
+    <target name="deploy-test" depends="deploy, test"/>
 
-  <target name="deploy-test-undeploy" depends="deploy, test, undeploy"/>
+    <target name="deploy-test-undeploy" depends="deploy, test, undeploy"/>
 
-  <target name="clean">
-    <delete dir="${test.location}"/>
-    <delete file="${tar.name}"/>
-    <delete dir="${tar.dir}"/>
-    <ant dir="${udf.java.dir}" target="clean"/>
-  </target>
+    <target name="clean">
+        <delete dir="${test.location}"/>
+        <delete file="${tar.name}"/>
+        <delete dir="${tar.dir}"/>
+        <ant dir="${udf.java.dir}" target="clean"/>
+    </target>
 
 </project>
 
diff --git a/src/test/e2e/hcatalog/tools/generate/java/build.xml b/src/test/e2e/hcatalog/tools/generate/java/build.xml
index 2b2d321..11337d8 100644
--- a/src/test/e2e/hcatalog/tools/generate/java/build.xml
+++ b/src/test/e2e/hcatalog/tools/generate/java/build.xml
@@ -15,57 +15,56 @@
 
 <project name="Hive-Data-Generator" default="generator-jar">
 
-    <property name="generator.jarfile" value="hive-gen.jar" />
-    <property name="generator.build.dir" value="${basedir}/build" />
-    <property name="generator.src.dir" value="${basedir}/org" />
+    <property name="generator.jarfile" value="hive-gen.jar"/>
+    <property name="generator.build.dir" value="${basedir}/build"/>
+    <property name="generator.src.dir" value="${basedir}/org"/>
 
 
     <path id="generator-classpath">
-        <fileset file="${hive.serde.jarfile}" />
-        <fileset file="${hive.ql.jarfile}" />
-        <fileset file="${hadoop.core.jarfile}" />
+        <fileset file="${hive.serde.jarfile}"/>
+        <fileset file="${hive.ql.jarfile}"/>
+        <fileset file="${hadoop.core.jarfile}"/>
     </path>
 
     <target name="init">
-        <mkdir dir="${generator.build.dir}" />
+        <mkdir dir="${generator.build.dir}"/>
     </target>
 
     <target name="clean">
-        <delete dir="${generator.build.dir}" />
-        <delete file="${generator.jarfile}" />
+        <delete dir="${generator.build.dir}"/>
+        <delete file="${generator.jarfile}"/>
     </target>
 
     <target name="generator-compile"
             depends="init, serde.jar.check, ql.jar.check, hadoop.jar.check">
         <echo>*** Compiling UDFs ***</echo>
-        <javac srcdir="${generator.src.dir}" destdir="${generator.build.dir}" debug="on" includeantruntime="false" includes="**/*.java">
-            <classpath refid="generator-classpath" />
+        <javac srcdir="${generator.src.dir}" destdir="${generator.build.dir}" debug="on" includeantruntime="false"
+               includes="**/*.java">
+            <classpath refid="generator-classpath"/>
         </javac>
     </target>
 
     <target name="generator-jar" depends="generator-compile">
         <echo>*** Creating UDF jar ***</echo>
         <jar duplicate="preserve" jarfile="${generator.jarfile}">
-	    <fileset dir="build"/>
+            <fileset dir="build"/>
         </jar>
     </target>
 
-	<target name="serde.jar.check" unless="hive.serde.jarfile">
-	 	<fail message="'hive.serde.jarfile' is not defined. 
-		Please pass -Dhive.serde.jarfile=&lt;Hive serde jar to use&gt; to Ant on the command-line." />
-	</target>
+    <target name="serde.jar.check" unless="hive.serde.jarfile">
+        <fail message="'hive.serde.jarfile' is not defined.
+		Please pass -Dhive.serde.jarfile=&lt;Hive serde jar to use&gt; to Ant on the command-line."/>
+    </target>
 
-	<target name="ql.jar.check" unless="hive.ql.jarfile">
-	 	<fail message="'hive.ql.jarfile' is not defined. 
-		Please pass -Dhive.ql.jarfile=&lt;Hive ql jar to use&gt; to Ant on the command-line." />
-	</target>
+    <target name="ql.jar.check" unless="hive.ql.jarfile">
+        <fail message="'hive.ql.jarfile' is not defined.
+		Please pass -Dhive.ql.jarfile=&lt;Hive ql jar to use&gt; to Ant on the command-line."/>
+    </target>
 
-	<target name="hadoop.jar.check" unless="hadoop.core.jarfile">
-	 	<fail message="'hadoop.core.jarfile' is not defined. 
-		Please pass -Dhadoop.core.jarfile=&lt;Hadoop core jar to use&gt; to Ant on the command-line." />
-	</target>
-
-
+    <target name="hadoop.jar.check" unless="hadoop.core.jarfile">
+        <fail message="'hadoop.core.jarfile' is not defined.
+		Please pass -Dhadoop.core.jarfile=&lt;Hadoop core jar to use&gt; to Ant on the command-line."/>
+    </target>
 
 
 </project>
diff --git a/src/test/e2e/hcatalog/tools/generate/java/org/apache/hadoop/hive/tools/generate/RCFileGenerator.java b/src/test/e2e/hcatalog/tools/generate/java/org/apache/hadoop/hive/tools/generate/RCFileGenerator.java
index 1ac5382..a2e8d9e 100644
--- a/src/test/e2e/hcatalog/tools/generate/java/org/apache/hadoop/hive/tools/generate/RCFileGenerator.java
+++ b/src/test/e2e/hcatalog/tools/generate/java/org/apache/hadoop/hive/tools/generate/RCFileGenerator.java
@@ -46,24 +46,24 @@
     private static Random rand;
 
     private static Path getFile(String filename) throws Exception {
-       return new Path(basedir, filename);
+        return new Path(basedir, filename);
     }
 
     private static String[] firstName = {"alice", "bob", "calvin", "david",
-      "ethan", "fred", "gabriella", "holly", "irene", "jessica", "katie",
-      "luke", "mike", "nick", "oscar", "priscilla", "quinn", "rachel",
-      "sarah", "tom", "ulysses", "victor", "wendy", "xavier", "yuri",
-      "zach"};
+        "ethan", "fred", "gabriella", "holly", "irene", "jessica", "katie",
+        "luke", "mike", "nick", "oscar", "priscilla", "quinn", "rachel",
+        "sarah", "tom", "ulysses", "victor", "wendy", "xavier", "yuri",
+        "zach"};
 
     private static String[] lastName = {"allen", "brown", "carson",
-      "davidson", "ellison", "falkner", "garcia", "hernandez", "ichabod",
-      "johnson", "king", "laertes", "miller", "nixon", "ovid", "polk",
-      "quirinius", "robinson", "steinbeck", "thompson", "underhill",
-      "van buren", "white", "xylophone", "young", "zipper"};
+        "davidson", "ellison", "falkner", "garcia", "hernandez", "ichabod",
+        "johnson", "king", "laertes", "miller", "nixon", "ovid", "polk",
+        "quirinius", "robinson", "steinbeck", "thompson", "underhill",
+        "van buren", "white", "xylophone", "young", "zipper"};
 
     private static String randomName() {
         StringBuffer buf =
-            new StringBuffer(firstName[rand.nextInt(firstName.length)]);
+                new StringBuffer(firstName[rand.nextInt(firstName.length)]);
         buf.append(' ');
         buf.append(lastName[rand.nextInt(lastName.length)]);
         return buf.toString();
@@ -115,8 +115,8 @@
     }
 
     private static void usage() {
-        System.err.println("Usage: rcfilegen format number_of_rows " + 
-            "output_file plain_output_file");
+        System.err.println("Usage: rcfilegen format number_of_rows " +
+                "output_file plain_output_file");
         System.err.println("  format one of:  student voter alltypes");
         System.exit(1);
     }
@@ -140,7 +140,7 @@
                                 int numRows,
                                 String output, String plainOutput) throws Exception {
         int numFields = 0;
-        if (format.equals("student")) { 
+        if (format.equals("student")) {
             rand = new Random(numRows);
             numFields = 3;
         } else if (format.equals("voter")) {
@@ -153,8 +153,8 @@
 
         RCFileOutputFormat.setColumnNumber(conf, numFields);
         RCFile.Writer writer = new RCFile.Writer(fs, conf, getFile(output),
-            null, new DefaultCodec());
-        
+                null, new DefaultCodec());
+
         PrintWriter pw = new PrintWriter(new FileWriter(plainOutput));
 
         for (int j = 0; j < numRows; j++) {
@@ -164,30 +164,30 @@
 
             if (format.equals("student")) {
                 byte[][] f = {
-                    randomName().getBytes("UTF-8"),
-                    Integer.valueOf(randomAge()).toString().getBytes("UTF-8"),
-                    Double.valueOf(randomGpa()).toString().getBytes("UTF-8")
+                        randomName().getBytes("UTF-8"),
+                        Integer.valueOf(randomAge()).toString().getBytes("UTF-8"),
+                        Double.valueOf(randomGpa()).toString().getBytes("UTF-8")
                 };
                 fields = f;
             } else if (format.equals("voter")) {
                 byte[][] f = {
-                    randomName().getBytes("UTF-8"),
-                    Integer.valueOf(randomAge()).toString().getBytes("UTF-8"),
-                    randomRegistration().getBytes("UTF-8"),
-                    Double.valueOf(randomContribution()).toString().getBytes("UTF-8")
+                        randomName().getBytes("UTF-8"),
+                        Integer.valueOf(randomAge()).toString().getBytes("UTF-8"),
+                        randomRegistration().getBytes("UTF-8"),
+                        Double.valueOf(randomContribution()).toString().getBytes("UTF-8")
                 };
                 fields = f;
             } else if (format.equals("alltypes")) {
                 byte[][] f = {
-                    Integer.valueOf(rand.nextInt(Byte.MAX_VALUE)).toString().getBytes("UTF-8"),
-                    Integer.valueOf(rand.nextInt(Short.MAX_VALUE)).toString().getBytes("UTF-8"),
-                    Integer.valueOf(rand.nextInt()).toString().getBytes("UTF-8"),
-                    Long.valueOf(rand.nextLong()).toString().getBytes("UTF-8"),
-                    Float.valueOf(rand.nextFloat() * 1000).toString().getBytes("UTF-8"),
-                    Double.valueOf(rand.nextDouble() * 1000000).toString().getBytes("UTF-8"),
-                    randomName().getBytes("UTF-8"),
-                    randomMap(),
-                    randomArray()
+                        Integer.valueOf(rand.nextInt(Byte.MAX_VALUE)).toString().getBytes("UTF-8"),
+                        Integer.valueOf(rand.nextInt(Short.MAX_VALUE)).toString().getBytes("UTF-8"),
+                        Integer.valueOf(rand.nextInt()).toString().getBytes("UTF-8"),
+                        Long.valueOf(rand.nextLong()).toString().getBytes("UTF-8"),
+                        Float.valueOf(rand.nextFloat() * 1000).toString().getBytes("UTF-8"),
+                        Double.valueOf(rand.nextDouble() * 1000000).toString().getBytes("UTF-8"),
+                        randomName().getBytes("UTF-8"),
+                        randomMap(),
+                        randomArray()
                 };
                 fields = f;
             }
@@ -195,10 +195,10 @@
 
             for (int i = 0; i < fields.length; i++) {
                 BytesRefWritable field = new BytesRefWritable(fields[i], 0,
-                    fields[i].length);
+                        fields[i].length);
                 row.set(i, field);
                 pw.print(new String(fields[i]));
-                if (i!=fields.length-1)
+                if (i != fields.length - 1)
                     pw.print("\t");
                 else
                     pw.println();
@@ -209,6 +209,6 @@
 
         writer.close();
         pw.close();
-  }
+    }
 }
 
diff --git a/src/test/e2e/hcatalog/udfs/java/build.xml b/src/test/e2e/hcatalog/udfs/java/build.xml
index 497ba0a..6486882 100644
--- a/src/test/e2e/hcatalog/udfs/java/build.xml
+++ b/src/test/e2e/hcatalog/udfs/java/build.xml
@@ -15,35 +15,35 @@
 
 <project name="HCatalog-test-utils" default="udf-jar">
 
-    <property name="udf.jarfile" value="testudf.jar" />
-    <property name="udfs.build.dir" value="${basedir}/build" />
-    <property name="udfs.src.dir" value="${basedir}/org/" />
+    <property name="udf.jarfile" value="testudf.jar"/>
+    <property name="udfs.build.dir" value="${basedir}/build"/>
+    <property name="udfs.src.dir" value="${basedir}/org/"/>
 
     <path id="udf-classpath">
-       <fileset file="../../../../../../build/hcatalog/*.jar" />
-       <fileset file="../../../../../../build/ivy/lib/default/*.jar" />
+        <fileset file="../../../../../../build/hcatalog/*.jar"/>
+        <fileset file="../../../../../../build/ivy/lib/default/*.jar"/>
     </path>
 
     <target name="init">
-        <mkdir dir="${udfs.build.dir}" />
+        <mkdir dir="${udfs.build.dir}"/>
     </target>
 
     <target name="clean">
-        <delete dir="${udfs.build.dir}" />
-        <delete file="${udf.jarfile}" />
+        <delete dir="${udfs.build.dir}"/>
+        <delete file="${udf.jarfile}"/>
     </target>
 
     <target name="udf-compile" depends="init">
         <echo>*** Compiling UDFs ***</echo>
         <javac srcdir="${udfs.src.dir}" destdir="${udfs.build.dir}" debug="on">
-            <classpath refid="udf-classpath" />
+            <classpath refid="udf-classpath"/>
         </javac>
     </target>
 
     <target name="udf-jar" depends="udf-compile">
         <echo>*** Creating UDF jar ***</echo>
         <jar duplicate="preserve" jarfile="${udf.jarfile}">
-	    <fileset dir="build"/>
+            <fileset dir="build"/>
         </jar>
     </target>
 </project>
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderMaster.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderMaster.java
index 0d0c625..7bbf3ff 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderMaster.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderMaster.java
@@ -37,34 +37,34 @@
 
 public class DataReaderMaster {
 
-	public static void main(String[] args) throws FileNotFoundException, IOException {
+    public static void main(String[] args) throws FileNotFoundException, IOException {
 
-		// This config contains all the configuration that master node wants to provide
-		// to the HCatalog.
-		Properties externalConfigs = new Properties();
-		externalConfigs.load(new FileReader(args[0]));
-		Map<String,String> config = new HashMap<String, String>();
-		
-		for (Entry<Object, Object> kv : externalConfigs.entrySet()){
-			config.put((String)kv.getKey(), (String)kv.getValue());
-		}
-		
-		// This piece of code runs in master node and gets necessary context.
-		ReaderContext context = runsInMaster(config);
+        // This config contains all the configuration that master node wants to provide
+        // to the HCatalog.
+        Properties externalConfigs = new Properties();
+        externalConfigs.load(new FileReader(args[0]));
+        Map<String, String> config = new HashMap<String, String>();
 
-		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(args[1])));
-		oos.writeObject(context);
-		oos.flush();
-		oos.close();
-		// Master node will serialize readercontext and will make it available  at slaves.
-	}
+        for (Entry<Object, Object> kv : externalConfigs.entrySet()) {
+            config.put((String) kv.getKey(), (String) kv.getValue());
+        }
 
-	private static ReaderContext runsInMaster(Map<String,String> config) throws HCatException {
+        // This piece of code runs in master node and gets necessary context.
+        ReaderContext context = runsInMaster(config);
 
-		ReadEntity.Builder builder = new ReadEntity.Builder();
-		ReadEntity entity = builder.withTable(config.get("table")).build();
-		HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
-		ReaderContext cntxt = reader.prepareRead();
-		return cntxt;
-	}
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(args[1])));
+        oos.writeObject(context);
+        oos.flush();
+        oos.close();
+        // Master node will serialize readercontext and will make it available  at slaves.
+    }
+
+    private static ReaderContext runsInMaster(Map<String, String> config) throws HCatException {
+
+        ReadEntity.Builder builder = new ReadEntity.Builder();
+        ReadEntity entity = builder.withTable(config.get("table")).build();
+        HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
+        ReaderContext cntxt = reader.prepareRead();
+        return cntxt;
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderSlave.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderSlave.java
index b3cf98c..84ee681 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderSlave.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataReaderSlave.java
@@ -34,28 +34,28 @@
 
 public class DataReaderSlave {
 
-	public static void main(String[] args) throws IOException, ClassNotFoundException {
-		
-		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(args[0])));
-		ReaderContext cntxt = (ReaderContext) ois.readObject();
-		ois.close();
-		
-		String[] inpSlitsToRead = args[1].split(",");
-		List<InputSplit> splits = cntxt.getSplits();
-		
-		for (int i = 0; i < inpSlitsToRead.length; i++){
-			InputSplit split = splits.get(Integer.parseInt(inpSlitsToRead[i]));
-			HCatReader reader = DataTransferFactory.getHCatReader(split, cntxt.getConf());
-			Iterator<HCatRecord> itr = reader.read();
-			File f = new File(args[2]+"-"+i);
-			f.delete();
-			BufferedWriter outFile = new BufferedWriter(new FileWriter(f)); 
-			while(itr.hasNext()){
-				String rec = itr.next().toString().replaceFirst("\\s+$", "");
-				System.err.println(rec);
-				outFile.write(rec+"\n");
-			}
-			outFile.close();
-		}
-	}
+    public static void main(String[] args) throws IOException, ClassNotFoundException {
+
+        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(args[0])));
+        ReaderContext cntxt = (ReaderContext) ois.readObject();
+        ois.close();
+
+        String[] inpSlitsToRead = args[1].split(",");
+        List<InputSplit> splits = cntxt.getSplits();
+
+        for (int i = 0; i < inpSlitsToRead.length; i++) {
+            InputSplit split = splits.get(Integer.parseInt(inpSlitsToRead[i]));
+            HCatReader reader = DataTransferFactory.getHCatReader(split, cntxt.getConf());
+            Iterator<HCatRecord> itr = reader.read();
+            File f = new File(args[2] + "-" + i);
+            f.delete();
+            BufferedWriter outFile = new BufferedWriter(new FileWriter(f));
+            while (itr.hasNext()) {
+                String rec = itr.next().toString().replaceFirst("\\s+$", "");
+                System.err.println(rec);
+                outFile.write(rec + "\n");
+            }
+            outFile.close();
+        }
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterMaster.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterMaster.java
index 909b23f..e3cea56 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterMaster.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterMaster.java
@@ -39,57 +39,57 @@
 
 public class DataWriterMaster {
 
-	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
+    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
 
-		// This config contains all the configuration that master node wants to provide
-		// to the HCatalog.
-		Properties externalConfigs = new Properties();
-		externalConfigs.load(new FileReader(args[0]));
-		Map<String,String> config = new HashMap<String, String>();
+        // This config contains all the configuration that master node wants to provide
+        // to the HCatalog.
+        Properties externalConfigs = new Properties();
+        externalConfigs.load(new FileReader(args[0]));
+        Map<String, String> config = new HashMap<String, String>();
 
-		for (Entry<Object, Object> kv : externalConfigs.entrySet()){
-			System.err.println("k: " + kv.getKey() + "\t v: " + kv.getValue());
-			config.put((String)kv.getKey(), (String)kv.getValue());
-		}
+        for (Entry<Object, Object> kv : externalConfigs.entrySet()) {
+            System.err.println("k: " + kv.getKey() + "\t v: " + kv.getValue());
+            config.put((String) kv.getKey(), (String) kv.getValue());
+        }
 
-		if(args.length == 3 && "commit".equalsIgnoreCase(args[2])){
-			// Then, master commits if everything goes well.
-			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(args[1])));
-			WriterContext cntxt = (WriterContext)ois.readObject();
-			commit(config,true, cntxt);		
-			System.exit(0);
-		}
-		// This piece of code runs in master node and gets necessary context.
-		WriterContext cntxt = runsInMaster(config);
-		
-		
-		// Master node will serialize writercontext and will make it available at slaves.
-		File f = new File(args[1]);
-		f.delete();
-		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
-		oos.writeObject(cntxt);
-		oos.flush();
-		oos.close();
-	}
+        if (args.length == 3 && "commit".equalsIgnoreCase(args[2])) {
+            // Then, master commits if everything goes well.
+            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(args[1])));
+            WriterContext cntxt = (WriterContext) ois.readObject();
+            commit(config, true, cntxt);
+            System.exit(0);
+        }
+        // This piece of code runs in master node and gets necessary context.
+        WriterContext cntxt = runsInMaster(config);
 
-	private static WriterContext runsInMaster(Map<String, String> config) throws HCatException {
 
-		WriteEntity.Builder builder = new WriteEntity.Builder();
-		WriteEntity entity = builder.withTable(config.get("table")).build();
-		HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
-		WriterContext info = writer.prepareWrite();
-		return info;
-	}
+        // Master node will serialize writercontext and will make it available at slaves.
+        File f = new File(args[1]);
+        f.delete();
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
+        oos.writeObject(cntxt);
+        oos.flush();
+        oos.close();
+    }
 
-	private static void commit(Map<String, String> config, boolean status, WriterContext cntxt) throws HCatException {
+    private static WriterContext runsInMaster(Map<String, String> config) throws HCatException {
 
-		WriteEntity.Builder builder = new WriteEntity.Builder();
-		WriteEntity entity = builder.withTable(config.get("table")).build();
-		HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
-		if(status){
-			writer.commit(cntxt);			
-		} else {
-			writer.abort(cntxt);
-		}
-	} 
+        WriteEntity.Builder builder = new WriteEntity.Builder();
+        WriteEntity entity = builder.withTable(config.get("table")).build();
+        HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
+        WriterContext info = writer.prepareWrite();
+        return info;
+    }
+
+    private static void commit(Map<String, String> config, boolean status, WriterContext cntxt) throws HCatException {
+
+        WriteEntity.Builder builder = new WriteEntity.Builder();
+        WriteEntity entity = builder.withTable(config.get("table")).build();
+        HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
+        if (status) {
+            writer.commit(cntxt);
+        } else {
+            writer.abort(cntxt);
+        }
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterSlave.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterSlave.java
index fe72b84..21d0a24 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterSlave.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/DataWriterSlave.java
@@ -36,51 +36,51 @@
 
 public class DataWriterSlave {
 
-	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
-		
-		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(args[0]));
-		WriterContext cntxt = (WriterContext) ois.readObject();
-		ois.close();
-		
-		HCatWriter writer = DataTransferFactory.getHCatWriter(cntxt);
-		writer.write(new HCatRecordItr(args[1]));
-		
-	}
-	
-	private static class HCatRecordItr implements Iterator<HCatRecord> {
+    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
 
-		BufferedReader reader;
-		String curLine;
-		
-		public HCatRecordItr(String fileName) throws FileNotFoundException {
-			reader = new BufferedReader(new FileReader(new File(fileName)));
-		}
-		
-		@Override
-		public boolean hasNext() {
-			try {
-				curLine = reader.readLine();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			return null == curLine ? false : true;
-		}
+        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(args[0]));
+        WriterContext cntxt = (WriterContext) ois.readObject();
+        ois.close();
 
-		@Override
-		public HCatRecord next() {
+        HCatWriter writer = DataTransferFactory.getHCatWriter(cntxt);
+        writer.write(new HCatRecordItr(args[1]));
 
-			String[] fields = curLine.split("\t");
-			List<Object> data = new ArrayList<Object>(3);
-			data.add(fields[0]);
-			data.add(Integer.parseInt(fields[1]));
-			data.add(Double.parseDouble(fields[2]));
-			return new DefaultHCatRecord(data);
-		}
+    }
 
-		@Override
-		public void remove() {
-			// TODO Auto-generated method stub
-			
-		}
-	}
+    private static class HCatRecordItr implements Iterator<HCatRecord> {
+
+        BufferedReader reader;
+        String curLine;
+
+        public HCatRecordItr(String fileName) throws FileNotFoundException {
+            reader = new BufferedReader(new FileReader(new File(fileName)));
+        }
+
+        @Override
+        public boolean hasNext() {
+            try {
+                curLine = reader.readLine();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return null == curLine ? false : true;
+        }
+
+        @Override
+        public HCatRecord next() {
+
+            String[] fields = curLine.split("\t");
+            List<Object> data = new ArrayList<Object>(3);
+            data.add(fields[0]);
+            data.add(Integer.parseInt(fields[1]));
+            data.add(Double.parseDouble(fields[2]));
+            return new DefaultHCatRecord(data);
+        }
+
+        @Override
+        public void remove() {
+            // TODO Auto-generated method stub
+
+        }
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/GroupByAge.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/GroupByAge.java
index 0675099..e47f209 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/GroupByAge.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/GroupByAge.java
@@ -45,7 +45,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -53,40 +53,40 @@
 public class GroupByAge extends Configured implements Tool {
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, IntWritable, IntWritable> {
+        Mapper<WritableComparable, HCatRecord, IntWritable, IntWritable> {
 
         int age;
-        
+
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, IntWritable, IntWritable>.Context context)
-                throws IOException, InterruptedException {
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, IntWritable, IntWritable>.Context context)
+            throws IOException, InterruptedException {
             age = (Integer) value.get(1);
             context.write(new IntWritable(age), new IntWritable(1));
         }
     }
-    
+
     public static class Reduce extends Reducer<IntWritable, IntWritable,
-    WritableComparable, HCatRecord> {
+        WritableComparable, HCatRecord> {
 
 
-      @Override
-      protected void reduce(IntWritable key, java.lang.Iterable<IntWritable>
-        values, org.apache.hadoop.mapreduce.Reducer<IntWritable,IntWritable,WritableComparable,HCatRecord>.Context context)
-        throws IOException ,InterruptedException {
-          int sum = 0;
-          Iterator<IntWritable> iter = values.iterator();
-          while (iter.hasNext()) {
-              sum++;
-              iter.next();
-          }
-          HCatRecord record = new DefaultHCatRecord(2);
-          record.set(0, key.get());
-          record.set(1, sum);
-          
-          context.write(null, record);
+        @Override
+        protected void reduce(IntWritable key, java.lang.Iterable<IntWritable>
+            values, org.apache.hadoop.mapreduce.Reducer<IntWritable, IntWritable, WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            int sum = 0;
+            Iterator<IntWritable> iter = values.iterator();
+            while (iter.hasNext()) {
+                sum++;
+                iter.next();
+            }
+            HCatRecord record = new DefaultHCatRecord(2);
+            record.set(0, key.get());
+            record.set(1, sum);
+
+            context.write(null, record);
         }
     }
 
@@ -100,12 +100,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "GroupByAge");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, null));
+            inputTableName, null));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -117,10 +117,10 @@
         job.setOutputKeyClass(WritableComparable.class);
         job.setOutputValueClass(DefaultHCatRecord.class);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, null));
+            outputTableName, null));
         HCatSchema s = HCatOutputFormat.getTableSchema(job);
         System.err.println("INFO: output schema explicitly set for writing:"
-                + s);
+            + s);
         HCatOutputFormat.setSchema(job, s);
         job.setOutputFormatClass(HCatOutputFormat.class);
         return (job.waitForCompletion(true) ? 0 : 1);
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HBaseReadWrite.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HBaseReadWrite.java
index d72bf6f..25e9d29 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HBaseReadWrite.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HBaseReadWrite.java
@@ -48,7 +48,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -56,7 +56,7 @@
 public class HBaseReadWrite extends Configured implements Tool {
 
     public static class HBaseWriteMap extends
-            Mapper<LongWritable, Text, Text, Text> {
+        Mapper<LongWritable, Text, Text, Text> {
 
         String name;
         String age;
@@ -64,21 +64,21 @@
 
         @Override
         protected void map(
-                LongWritable key,
-                Text value,
-                org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, Text>.Context context)
-                throws IOException, InterruptedException {
+            LongWritable key,
+            Text value,
+            org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, Text>.Context context)
+            throws IOException, InterruptedException {
             String line = value.toString();
             String[] tokens = line.split("\t");
             name = tokens[0];
-            
+
             context.write(new Text(name), value);
         }
     }
-    
+
 
     public static class HBaseWriteReduce extends
-            Reducer<Text, Text, WritableComparable, HCatRecord> {
+        Reducer<Text, Text, WritableComparable, HCatRecord> {
 
         String name;
         String age;
@@ -86,7 +86,7 @@
 
         @Override
         protected void reduce(Text key, Iterable<Text> values, Context context)
-                throws IOException, InterruptedException {
+            throws IOException, InterruptedException {
             name = key.toString();
             int count = 0;
             double sum = 0;
@@ -96,21 +96,21 @@
                 name = tokens[0];
                 age = tokens[1];
                 gpa = tokens[2];
-                
+
                 count++;
                 sum += Double.parseDouble(gpa.toString());
             }
-            
+
             HCatRecord record = new DefaultHCatRecord(2);
             record.set(0, name);
             record.set(1, Double.toString(sum));
-            
+
             context.write(null, record);
         }
     }
 
     public static class HBaseReadMap extends
-            Mapper<WritableComparable, HCatRecord, Text, Text> {
+        Mapper<WritableComparable, HCatRecord, Text, Text> {
 
         String name;
         String age;
@@ -118,16 +118,16 @@
 
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Text, Text>.Context context)
-                throws IOException, InterruptedException {
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Text, Text>.Context context)
+            throws IOException, InterruptedException {
             name = (String) value.get(0);
             gpa = (String) value.get(1);
             context.write(new Text(name), new Text(gpa));
         }
     }
-    
+
 
     public int run(String[] args) throws Exception {
         Configuration conf = getConf();
@@ -140,13 +140,13 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         conf.set("hcat.hbase.output.bulkMode", "false");
         Job job = new Job(conf, "HBaseWrite");
         FileInputFormat.setInputPaths(job, inputDir);
-        
+
         job.setInputFormatClass(TextInputFormat.class);
         job.setOutputFormatClass(HCatOutputFormat.class);
         job.setJarByClass(HBaseReadWrite.class);
@@ -157,16 +157,16 @@
         job.setOutputKeyClass(WritableComparable.class);
         job.setOutputValueClass(DefaultHCatRecord.class);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                tableName, null));
-        
+            tableName, null));
+
         boolean succ = job.waitForCompletion(true);
-        
+
         if (!succ) return 1;
-        
+
         job = new Job(conf, "HBaseRead");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName, tableName,
-                null));
-        
+            null));
+
         job.setInputFormatClass(HCatInputFormat.class);
         job.setOutputFormatClass(TextOutputFormat.class);
         job.setJarByClass(HBaseReadWrite.class);
@@ -175,11 +175,11 @@
         job.setOutputValueClass(Text.class);
         job.setNumReduceTasks(0);
         TextOutputFormat.setOutputPath(job, new Path(outputDir));
-        
+
         succ = job.waitForCompletion(true);
-        
+
         if (!succ) return 2;
-        
+
         return 0;
     }
 
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java
index 5c80644..c9b1653 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTestDriver.java
@@ -25,36 +25,35 @@
  * human-readable description.
  */
 public class HCatTestDriver {
-  
-  public static void main(String argv[]){
-    int exitCode = -1;
-    ProgramDriver pgd = new ProgramDriver();
-    try {
-      pgd.addClass("typedatacheck", TypeDataCheck.class, 
-                   "A map/reduce program that checks the type of each field and" +
-                   " outputs the entire table (to test hcat).");
-      pgd.addClass("sumnumbers", SumNumbers.class, 
-      "A map/reduce program that performs a group by on the first column and a " +
-      "SUM operation on the other columns of the \"numbers\" table.");
-      pgd.addClass("storenumbers", StoreNumbers.class, "A map/reduce program that " +
-      		"reads from the \"numbers\" table and adds 10 to each fields and writes " +
-      				"to the \"numbers_partitioned\" table into the datestamp=20100101 " +
-      				"partition OR the \"numbers_empty_initially\" table based on a " +
-      				"cmdline arg");
-      pgd.addClass("storecomplex", StoreComplex.class, "A map/reduce program that " +
-              "reads from the \"complex\" table and stores as-is into the " +
-              "\"complex_empty_initially\" table.");
-      pgd.addClass("storedemo", StoreDemo.class, "demo prog.");
-      pgd.driver(argv);
-      
-      // Success
-      exitCode = 0;
+
+    public static void main(String argv[]) {
+        int exitCode = -1;
+        ProgramDriver pgd = new ProgramDriver();
+        try {
+            pgd.addClass("typedatacheck", TypeDataCheck.class,
+                "A map/reduce program that checks the type of each field and" +
+                    " outputs the entire table (to test hcat).");
+            pgd.addClass("sumnumbers", SumNumbers.class,
+                "A map/reduce program that performs a group by on the first column and a " +
+                    "SUM operation on the other columns of the \"numbers\" table.");
+            pgd.addClass("storenumbers", StoreNumbers.class, "A map/reduce program that " +
+                "reads from the \"numbers\" table and adds 10 to each fields and writes " +
+                "to the \"numbers_partitioned\" table into the datestamp=20100101 " +
+                "partition OR the \"numbers_empty_initially\" table based on a " +
+                "cmdline arg");
+            pgd.addClass("storecomplex", StoreComplex.class, "A map/reduce program that " +
+                "reads from the \"complex\" table and stores as-is into the " +
+                "\"complex_empty_initially\" table.");
+            pgd.addClass("storedemo", StoreDemo.class, "demo prog.");
+            pgd.driver(argv);
+
+            // Success
+            exitCode = 0;
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+
+        System.exit(exitCode);
     }
-    catch(Throwable e){
-      e.printStackTrace();
-    }
-    
-    System.exit(exitCode);
-  }
 }
 	
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java
index 1ce838d..3f7dfbe 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheck.java
@@ -33,25 +33,25 @@
 /**
  * This UDF can be used to check that a tuple presented by HCatLoader has the
  * right types for the fields
- * 
+ *
  * Usage is :
- * 
+ *
  * register testudf.jar;
  * a = load 'numbers' using HCatLoader(...);
  * b = foreach a generate HCatTypeCheck('intnum1000:int,id:int,intnum5:int,intnum100:int,intnum:int,longnum:long,floatnum:float,doublenum:double', *);
  * store b into 'output';
- * 
+ *
  * The schema string (the first argument to the UDF) is of the form one would provide in a 
  * pig load statement.
- * 
+ *
  * The output should only contain the value '1' in all rows. (This UDF returns
  * the integer value 1 if all fields have the right type, else throws IOException)
- *  
+ *
  */
 public class HCatTypeCheck extends EvalFunc<Integer> {
 
     static HashMap<Byte, Class<?>> typeMap = new HashMap<Byte, Class<?>>();
-    
+
     @Override
     public Integer exec(Tuple input) throws IOException {
         String schemaStr = (String) input.get(0);
@@ -61,13 +61,13 @@
         } catch (Exception e) {
             throw new IOException(e);
         }
-        for(int i = 0; i < s.size(); i++) {
-            check(s.getField(i).type, input.get(i+1)); // input.get(i+1) since input.get(0) is the schema;
+        for (int i = 0; i < s.size(); i++) {
+            check(s.getField(i).type, input.get(i + 1)); // input.get(i+1) since input.get(0) is the schema;
         }
         return 1;
     }
-    
-    static {    
+
+    static {
         typeMap.put(DataType.INTEGER, Integer.class);
         typeMap.put(DataType.LONG, Long.class);
         typeMap.put(DataType.FLOAT, Float.class);
@@ -77,34 +77,33 @@
         typeMap.put(DataType.MAP, Map.class);
         typeMap.put(DataType.BAG, DataBag.class);
     }
-    
-    
-    
+
+
     private void die(String expectedType, Object o) throws IOException {
-        throw new IOException("Expected " + expectedType + ", got " +  
-              o.getClass().getName());
+        throw new IOException("Expected " + expectedType + ", got " +
+            o.getClass().getName());
     }
-    
-    
+
+
     private String check(Byte type, Object o) throws IOException {
-        if(o == null) {
+        if (o == null) {
             return "";
         }
-        if(check(typeMap.get(type), o)) {
-            if(type.equals(DataType.MAP)) {
+        if (check(typeMap.get(type), o)) {
+            if (type.equals(DataType.MAP)) {
                 Map<String, String> m = (Map<String, String>) o;
                 check(m);
-            } else if(type.equals(DataType.BAG)) {
+            } else if (type.equals(DataType.BAG)) {
                 DataBag bg = (DataBag) o;
                 for (Tuple tuple : bg) {
                     Map<String, String> m = (Map<String, String>) tuple.get(0);
                     check(m);
                 }
-            } else if(type.equals(DataType.TUPLE)) {
+            } else if (type.equals(DataType.TUPLE)) {
                 Tuple t = (Tuple) o;
-                if(!check(Integer.class, t.get(0)) ||
-                        !check(String.class, t.get(1)) ||
-                                !check(Double.class, t.get(2))) {
+                if (!check(Integer.class, t.get(0)) ||
+                    !check(String.class, t.get(1)) ||
+                    !check(Double.class, t.get(2))) {
                     die("t:tuple(num:int,str:string,dbl:double)", t);
                 }
             }
@@ -113,26 +112,26 @@
         }
         return o.toString();
     }
-    
+
     /**
-    * @param m
-    * @throws IOException 
-    */
+     * @param m
+     * @throws IOException
+     */
     private void check(Map<String, String> m) throws IOException {
-      for(Entry<String, String> e: m.entrySet()) {
-          // just access key and value to ensure they are correct
-          if(!check(String.class, e.getKey())) {
-              die("String", e.getKey());
-          }
-          if(!check(String.class, e.getValue())) {
-              die("String", e.getValue());
-          }
-      }
-      
+        for (Entry<String, String> e : m.entrySet()) {
+            // just access key and value to ensure they are correct
+            if (!check(String.class, e.getKey())) {
+                die("String", e.getKey());
+            }
+            if (!check(String.class, e.getValue())) {
+                die("String", e.getValue());
+            }
+        }
+
     }
-    
+
     private boolean check(Class<?> expected, Object actual) {
-        if(actual == null) {
+        if (actual == null) {
             return true;
         }
         return expected.isAssignableFrom(actual.getClass());
@@ -140,11 +139,11 @@
 
     Schema getSchemaFromString(String schemaString) throws Exception {
         /** ByteArrayInputStream stream = new ByteArrayInputStream(schemaString.getBytes()) ;
-        QueryParser queryParser = new QueryParser(stream) ;
-        Schema schema = queryParser.TupleSchema() ;
-        Schema.setSchemaDefaultType(schema, org.apache.pig.data.DataType.BYTEARRAY);
-        return schema;
-        */
+         QueryParser queryParser = new QueryParser(stream) ;
+         Schema schema = queryParser.TupleSchema() ;
+         Schema.setSchemaDefaultType(schema, org.apache.pig.data.DataType.BYTEARRAY);
+         return schema;
+         */
         return Utils.getSchemaFromString(schemaString);
     }
 
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java
index 930756e..43a6a53 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/HCatTypeCheckHive.java
@@ -40,101 +40,102 @@
 
 /**
  * A hive udf to check types of the fields read from hcat. A sample hive query which can use this is:
- * 
+ *
  * create temporary function typecheck as 'org.apache.hcatalog.utils.HCatTypeCheckHive';
  * select typecheck('map<string,string>+struct<num:int,str:string,dbl:double>+array<map<string,string>>+int', 
  * mymap, mytuple, bagofmap, rownum) from complex;
- * 
- * 
+ *
+ *
  * The first argument to the UDF is a string representing the schema of the columns in the table. 
  * The columns in the tables are the remaining args to it.
  * The schema specification consists of the types as given by "describe <table>"
  * with each column's type separated from the next column's type by a '+'
- * 
+ *
  * The UDF will throw an exception (and cause the query to fail) if it does not
  * encounter the correct types.
- * 
+ *
  * The output is a string representation of the data , type and hive category.
  * It is not advisable to use this against large dataset since the output would also
  * be large. 
- * 
+ *
  */
 public final class HCatTypeCheckHive extends GenericUDF {
 
-ObjectInspector[] argOIs;
-@Override
-public Object evaluate(DeferredObject[] args) throws HiveException {
-    List<Object> row = new ArrayList<Object>();
-    String typesStr = (String) getJavaObject(args[0].get(), argOIs[0], new ArrayList<Category>());
-    String[] types = typesStr.split("\\+");
-    for(int i = 0; i < types.length; i++) {
-        types[i] = types[i].toLowerCase();
-    }
-    for(int i = 1; i < args.length; i++) {
-        ObjectInspector oi = argOIs[i];
-        List<ObjectInspector.Category> categories = new ArrayList<ObjectInspector.Category>();
-        Object o = getJavaObject(args[i].get(),oi, categories);
-        try {
-            if(o != null) {
-                Util.check(types[i-1], o);
+    ObjectInspector[] argOIs;
+
+    @Override
+    public Object evaluate(DeferredObject[] args) throws HiveException {
+        List<Object> row = new ArrayList<Object>();
+        String typesStr = (String) getJavaObject(args[0].get(), argOIs[0], new ArrayList<Category>());
+        String[] types = typesStr.split("\\+");
+        for (int i = 0; i < types.length; i++) {
+            types[i] = types[i].toLowerCase();
+        }
+        for (int i = 1; i < args.length; i++) {
+            ObjectInspector oi = argOIs[i];
+            List<ObjectInspector.Category> categories = new ArrayList<ObjectInspector.Category>();
+            Object o = getJavaObject(args[i].get(), oi, categories);
+            try {
+                if (o != null) {
+                    Util.check(types[i - 1], o);
+                }
+            } catch (IOException e) {
+                throw new HiveException(e);
             }
-        } catch (IOException e) {
-            throw new HiveException(e);
+            row.add(o == null ? "null" : o);
+            row.add(":" + (o == null ? "null" : o.getClass()) + ":" + categories);
         }
-        row.add(o == null ? "null" : o);
-        row.add(":" + (o == null ? "null" : o.getClass()) + ":" + categories);
+        return row.toString();
     }
-    return row.toString();
-}
 
-private Object getJavaObject(Object o, ObjectInspector oi, List<Category> categories) {
-    if(categories != null) {
-        categories.add(oi.getCategory());
+    private Object getJavaObject(Object o, ObjectInspector oi, List<Category> categories) {
+        if (categories != null) {
+            categories.add(oi.getCategory());
+        }
+        if (oi.getCategory() == ObjectInspector.Category.LIST) {
+            List<?> l = ((ListObjectInspector) oi).getList(o);
+            List<Object> result = new ArrayList<Object>();
+            ObjectInspector elemOI = ((ListObjectInspector) oi).getListElementObjectInspector();
+            for (Object lo : l) {
+                result.add(getJavaObject(lo, elemOI, categories));
+            }
+            return result;
+        } else if (oi.getCategory() == ObjectInspector.Category.MAP) {
+            Map<?, ?> m = ((MapObjectInspector) oi).getMap(o);
+            Map<String, String> result = new HashMap<String, String>();
+            ObjectInspector koi = ((MapObjectInspector) oi).getMapKeyObjectInspector();
+            ObjectInspector voi = ((MapObjectInspector) oi).getMapValueObjectInspector();
+            for (Entry<?, ?> e : m.entrySet()) {
+                result.put((String) getJavaObject(e.getKey(), koi, null),
+                    (String) getJavaObject(e.getValue(), voi, null));
+            }
+            return result;
+
+        } else if (oi.getCategory() == ObjectInspector.Category.STRUCT) {
+            List<Object> s = ((StructObjectInspector) oi).getStructFieldsDataAsList(o);
+            List<? extends StructField> sf = ((StructObjectInspector) oi).getAllStructFieldRefs();
+            List<Object> result = new ArrayList<Object>();
+            for (int i = 0; i < s.size(); i++) {
+                result.add(getJavaObject(s.get(i), sf.get(i).getFieldObjectInspector(), categories));
+            }
+            return result;
+        } else if (oi.getCategory() == ObjectInspector.Category.PRIMITIVE) {
+            return ((PrimitiveObjectInspector) oi).getPrimitiveJavaObject(o);
+        }
+        throw new RuntimeException("Unexpected error!");
     }
-    if(oi.getCategory() == ObjectInspector.Category.LIST) {
-        List<?> l = ((ListObjectInspector)oi).getList(o);
-        List<Object> result = new ArrayList<Object>();
-        ObjectInspector elemOI = ((ListObjectInspector)oi).getListElementObjectInspector();
-        for(Object lo : l) {
-            result.add(getJavaObject(lo, elemOI, categories));    
-        }
-        return result;
-    } else if (oi.getCategory() == ObjectInspector.Category.MAP) {
-        Map<?,?> m = ((MapObjectInspector)oi).getMap(o);
-        Map<String, String> result = new HashMap<String, String>();
-        ObjectInspector koi = ((MapObjectInspector)oi).getMapKeyObjectInspector();
-        ObjectInspector voi = ((MapObjectInspector)oi).getMapValueObjectInspector();
-        for(Entry<?,?> e: m.entrySet()) {
-            result.put((String)getJavaObject(e.getKey(), koi, null), 
-                    (String)getJavaObject(e.getValue(), voi, null));
-        }
-        return result;
-        
-    } else if (oi.getCategory() == ObjectInspector.Category.STRUCT) {
-        List<Object> s = ((StructObjectInspector)oi).getStructFieldsDataAsList(o);
-        List<? extends StructField> sf = ((StructObjectInspector)oi).getAllStructFieldRefs();
-        List<Object> result = new ArrayList<Object>();
-        for(int i = 0; i < s.size(); i++) {
-            result.add(getJavaObject(s.get(i), sf.get(i).getFieldObjectInspector(), categories));
-        }
-        return result;
-    } else if(oi.getCategory() == ObjectInspector.Category.PRIMITIVE) {
-        return ((PrimitiveObjectInspector)oi).getPrimitiveJavaObject(o);
+
+    @Override
+    public String getDisplayString(String[] arg0) {
+        return null;
     }
-    throw new RuntimeException("Unexpected error!");
-}
 
-@Override
-public String getDisplayString(String[] arg0) {
-    return null;
-}
-
-@Override
-public ObjectInspector initialize(ObjectInspector[] argOIs)
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] argOIs)
         throws UDFArgumentException {
-    this.argOIs = argOIs;
-    return ObjectInspectorFactory.getReflectionObjectInspector(String.class, 
+        this.argOIs = argOIs;
+        return ObjectInspectorFactory.getReflectionObjectInspector(String.class,
             ObjectInspectorOptions.JAVA);
-}
+    }
 
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadJson.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadJson.java
index a3d7df3..c52bac4 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadJson.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadJson.java
@@ -43,69 +43,69 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce program
  * to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class ReadJson extends Configured implements Tool {
-    
-  public static class Map
-       extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord>{
-      
-      String s;
-      Integer i;
-      Double d;
-      
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          IntWritable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        s = value.get(0)==null?null:(String)value.get(0);
-        i = value.get(1)==null?null:(Integer)value.get(1);
-        d = value.get(2)==null?null:(Double)value.get(2);
-        
-        HCatRecord record = new DefaultHCatRecord(3);
-        record.set(0, s);
-        record.set(1, i);
-        record.set(2, d);
-        
-        context.write(null, record);
 
+    public static class Map
+        extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord> {
+
+        String s;
+        Integer i;
+        Double d;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               IntWritable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            s = value.get(0) == null ? null : (String) value.get(0);
+            i = value.get(1) == null ? null : (Integer) value.get(1);
+            d = value.get(2) == null ? null : (Double) value.get(2);
+
+            HCatRecord record = new DefaultHCatRecord(3);
+            record.set(0, s);
+            record.set(1, i);
+            record.set(2, d);
+
+            context.write(null, record);
+
+        }
     }
-  }
-  
-   public int run(String[] args) throws Exception {
-    Configuration conf = getConf();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
 
-    String serverUri = args[0];
-    String tableName = args[1];
-    String outputDir = args[2];
-    String dbName = null;
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "ReadJson");
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-    job.setJarByClass(ReadJson.class);
-    job.setMapperClass(Map.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setOutputValueClass(HCatRecord.class);
-    job.setNumReduceTasks(0);
-    FileOutputFormat.setOutputPath(job, new Path(outputDir));
-    return (job.waitForCompletion(true) ? 0 : 1);
-  }
-   
-   public static void main(String[] args) throws Exception {
-       int exitCode = ToolRunner.run(new ReadJson(), args);
-       System.exit(exitCode);
-   }
+    public int run(String[] args) throws Exception {
+        Configuration conf = getConf();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+
+        String serverUri = args[0];
+        String tableName = args[1];
+        String outputDir = args[2];
+        String dbName = null;
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "ReadJson");
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+        job.setJarByClass(ReadJson.class);
+        job.setMapperClass(Map.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setOutputValueClass(HCatRecord.class);
+        job.setNumReduceTasks(0);
+        FileOutputFormat.setOutputPath(job, new Path(outputDir));
+        return (job.waitForCompletion(true) ? 0 : 1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        int exitCode = ToolRunner.run(new ReadJson(), args);
+        System.exit(exitCode);
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadRC.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadRC.java
index 5bafc04..116c993 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadRC.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadRC.java
@@ -43,70 +43,70 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce program
  * to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class ReadRC extends Configured implements Tool {
-    
-  public static class Map
-       extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord>{
-      
-      String name;
-      int age;
-      double gpa;
-      
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          IntWritable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        name = (String)value.get(0);
-        age = (Integer)value.get(1);
-        gpa = (Double)value.get(2);
-        gpa = Math.floor(gpa) + 0.1;
-        
-        HCatRecord record = new DefaultHCatRecord(3);
-        record.set(0, name);
-        record.set(1, age);
-        record.set(2, gpa);
-        
-        context.write(null, record);
 
+    public static class Map
+        extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord> {
+
+        String name;
+        int age;
+        double gpa;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               IntWritable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            name = (String) value.get(0);
+            age = (Integer) value.get(1);
+            gpa = (Double) value.get(2);
+            gpa = Math.floor(gpa) + 0.1;
+
+            HCatRecord record = new DefaultHCatRecord(3);
+            record.set(0, name);
+            record.set(1, age);
+            record.set(2, gpa);
+
+            context.write(null, record);
+
+        }
     }
-  }
-  
-   public int run(String[] args) throws Exception {
-    Configuration conf = getConf();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
 
-    String serverUri = args[0];
-    String tableName = args[1];
-    String outputDir = args[2];
-    String dbName = null;
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "ReadRC");
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-    job.setJarByClass(ReadRC.class);
-    job.setMapperClass(Map.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setOutputValueClass(HCatRecord.class);
-    job.setNumReduceTasks(0);
-    FileOutputFormat.setOutputPath(job, new Path(outputDir));
-    return (job.waitForCompletion(true) ? 0 : 1);
-  }
-   
-   public static void main(String[] args) throws Exception {
-       int exitCode = ToolRunner.run(new ReadRC(), args);
-       System.exit(exitCode);
-   }
+    public int run(String[] args) throws Exception {
+        Configuration conf = getConf();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+
+        String serverUri = args[0];
+        String tableName = args[1];
+        String outputDir = args[2];
+        String dbName = null;
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "ReadRC");
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+        job.setJarByClass(ReadRC.class);
+        job.setMapperClass(Map.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setOutputValueClass(HCatRecord.class);
+        job.setNumReduceTasks(0);
+        FileOutputFormat.setOutputPath(job, new Path(outputDir));
+        return (job.waitForCompletion(true) ? 0 : 1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        int exitCode = ToolRunner.run(new ReadRC(), args);
+        System.exit(exitCode);
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadText.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadText.java
index 9f15c01..c3c6c72 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadText.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadText.java
@@ -43,81 +43,81 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce program
  * to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class ReadText extends Configured implements Tool {
-    
-  public static class Map
-       extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord>{
-      
-      byte t;
-      short si;
-      int i;
-      long b;
-      float f;
-      double d;
-      String s;
-      
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          IntWritable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        t = (Byte)value.get(0);
-        si = (Short)value.get(1);
-        i = (Integer)value.get(2);
-        b = (Long)value.get(3);
-        f = (Float)value.get(4);
-        d = (Double)value.get(5);
-        s = (String)value.get(6);
-        
-        HCatRecord record = new DefaultHCatRecord(7);
-        record.set(0, t);
-        record.set(1, si);
-        record.set(2, i);
-        record.set(3, b);
-        record.set(4, f);
-        record.set(5, d);
-        record.set(6, s);
-        
-        context.write(null, record);
 
+    public static class Map
+        extends Mapper<WritableComparable, HCatRecord, IntWritable, HCatRecord> {
+
+        byte t;
+        short si;
+        int i;
+        long b;
+        float f;
+        double d;
+        String s;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               IntWritable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            t = (Byte) value.get(0);
+            si = (Short) value.get(1);
+            i = (Integer) value.get(2);
+            b = (Long) value.get(3);
+            f = (Float) value.get(4);
+            d = (Double) value.get(5);
+            s = (String) value.get(6);
+
+            HCatRecord record = new DefaultHCatRecord(7);
+            record.set(0, t);
+            record.set(1, si);
+            record.set(2, i);
+            record.set(3, b);
+            record.set(4, f);
+            record.set(5, d);
+            record.set(6, s);
+
+            context.write(null, record);
+
+        }
     }
-  }
-  
-   public int run(String[] args) throws Exception {
-    Configuration conf = getConf();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
 
-    String serverUri = args[0];
-    String tableName = args[1];
-    String outputDir = args[2];
-    String dbName = null;
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "ReadText");
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-    job.setJarByClass(ReadText.class);
-    job.setMapperClass(Map.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setOutputValueClass(HCatRecord.class);
-    job.setNumReduceTasks(0);
-    FileOutputFormat.setOutputPath(job, new Path(outputDir));
-    return (job.waitForCompletion(true) ? 0 : 1);
-  }
-   
-   public static void main(String[] args) throws Exception {
-       int exitCode = ToolRunner.run(new ReadText(), args);
-       System.exit(exitCode);
-   }
+    public int run(String[] args) throws Exception {
+        Configuration conf = getConf();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+
+        String serverUri = args[0];
+        String tableName = args[1];
+        String outputDir = args[2];
+        String dbName = null;
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "ReadText");
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+        job.setJarByClass(ReadText.class);
+        job.setMapperClass(Map.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setOutputValueClass(HCatRecord.class);
+        job.setNumReduceTasks(0);
+        FileOutputFormat.setOutputPath(job, new Path(outputDir));
+        return (job.waitForCompletion(true) ? 0 : 1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        int exitCode = ToolRunner.run(new ReadText(), args);
+        System.exit(exitCode);
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadWrite.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadWrite.java
index f3b9824..a158a80 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadWrite.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/ReadWrite.java
@@ -43,7 +43,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -51,7 +51,7 @@
 public class ReadWrite extends Configured implements Tool {
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, Text, HCatRecord> {
+        Mapper<WritableComparable, HCatRecord, Text, HCatRecord> {
 
         String name;
         int age;
@@ -59,10 +59,10 @@
 
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Text, HCatRecord>.Context context)
-                throws IOException, InterruptedException {
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Text, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
             name = (String) value.get(0);
             age = (Integer) value.get(1);
             gpa = (Double) value.get(2);
@@ -81,12 +81,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "ReadWrite");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, null));
+            inputTableName, null));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -95,10 +95,10 @@
         job.setOutputKeyClass(Text.class);
         job.setOutputValueClass(DefaultHCatRecord.class);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, null));
+            outputTableName, null));
         HCatSchema s = HCatInputFormat.getTableSchema(job);
         System.err.println("INFO: output schema explicitly set for writing:"
-                + s);
+            + s);
         HCatOutputFormat.setSchema(job, s);
         job.setOutputFormatClass(HCatOutputFormat.class);
         return (job.waitForCompletion(true) ? 0 : 1);
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SimpleRead.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SimpleRead.java
index e911451..ebcdd3a 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SimpleRead.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SimpleRead.java
@@ -43,65 +43,65 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce program
  * to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class SimpleRead extends Configured implements Tool {
 
     private static final String TABLE_NAME = "studenttab10k";
     private static final String TAB = "\t";
-    
-  public static class Map
-       extends Mapper<WritableComparable, HCatRecord, Text, IntWritable>{
-      
-      String name;
-      int age;
-      double gpa;
-      
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          Text,IntWritable>.Context context) 
-    throws IOException ,InterruptedException {
-        name = (String) value.get(0);
-        age = (Integer) value.get(1);
-        gpa = (Double) value.get(2);
-        context.write(new Text(name), new IntWritable(age));
 
+    public static class Map
+        extends Mapper<WritableComparable, HCatRecord, Text, IntWritable> {
+
+        String name;
+        int age;
+        double gpa;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               Text, IntWritable>.Context context)
+            throws IOException, InterruptedException {
+            name = (String) value.get(0);
+            age = (Integer) value.get(1);
+            gpa = (Double) value.get(2);
+            context.write(new Text(name), new IntWritable(age));
+
+        }
     }
-  }
-  
-   public int run(String[] args) throws Exception {
-    Configuration conf = getConf();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
 
-    String serverUri = args[0];
-    String tableName = args[1];
-    String outputDir = args[2];
-    String dbName = null;
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "SimpleRead");
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-    job.setJarByClass(SimpleRead.class);
-    job.setMapperClass(Map.class);
-    job.setOutputKeyClass(Text.class);
-    job.setOutputValueClass(IntWritable.class);
-    FileOutputFormat.setOutputPath(job, new Path(outputDir));
-    return (job.waitForCompletion(true) ? 0 : 1);
-  }
-   
-   public static void main(String[] args) throws Exception {
-       int exitCode = ToolRunner.run(new SimpleRead(), args);
-       System.exit(exitCode);
-   }
+    public int run(String[] args) throws Exception {
+        Configuration conf = getConf();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+
+        String serverUri = args[0];
+        String tableName = args[1];
+        String outputDir = args[2];
+        String dbName = null;
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "SimpleRead");
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+        job.setJarByClass(SimpleRead.class);
+        job.setMapperClass(Map.class);
+        job.setOutputKeyClass(Text.class);
+        job.setOutputValueClass(IntWritable.class);
+        FileOutputFormat.setOutputPath(job, new Path(outputDir));
+        return (job.waitForCompletion(true) ? 0 : 1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        int exitCode = ToolRunner.run(new SimpleRead(), args);
+        System.exit(exitCode);
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java
index da344fb..b78bf83 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreComplex.java
@@ -43,93 +43,93 @@
  * table and writes to "complex_nopart_empty_initially" table. It reads data from complex which
  * is an unpartitioned table and stores the data as-is into complex_empty_initially table
  * (which is also unpartitioned)
- * 
+ *
  * Usage: hadoop jar testudf.jar storecomplex <serveruri> <-libjars hive-hcat jar>  
-        The hcat jar location should be specified as file://<full path to jar>
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class StoreComplex {
 
     private static final String COMPLEX_TABLE_NAME = "complex";
     private static final String COMPLEX_NOPART_EMPTY_INITIALLY_TABLE_NAME = "complex_nopart_empty_initially";
-    
-    
-  public static class ComplexMapper 
-       extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>{
-      
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          WritableComparable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        // just write out the value as-is
-        context.write(new IntWritable(0), value);
 
-    }
-  }
-  
-  
-   public static void main(String[] args) throws Exception {
-    Configuration conf = new Configuration();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
-    String[] otherArgs = new String[1];
-    int j = 0;
-    for(int i = 0; i < args.length; i++) {
-        if(args[i].equals("-libjars")) {
-            // generic options parser doesn't seem to work!
-            conf.set("tmpjars", args[i+1]);
-            i = i+1; // skip it , the for loop will skip its value                
-        } else {
-            otherArgs[j++] = args[i];
+
+    public static class ComplexMapper
+        extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            // just write out the value as-is
+            context.write(new IntWritable(0), value);
+
         }
     }
-    if (otherArgs.length != 1) {
-      usage();
-    }
-    String serverUri = otherArgs[0];
-    String tableName = COMPLEX_TABLE_NAME;
-    String dbName = "default";
-    Map<String, String> outputPartitionKvps = new HashMap<String, String>();
-    String outputTableName = null;
-    outputTableName = COMPLEX_NOPART_EMPTY_INITIALLY_TABLE_NAME;
-    // test with null or empty randomly
-    if(new Random().nextInt(2) == 0) {
-        System.err.println("INFO: output partition keys set to null for writing");
-        outputPartitionKvps = null;
-    }
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "storecomplex");
-    // initialize HCatInputFormat
 
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    HCatOutputFormat.setOutput(job, OutputJobInfo.create(
+
+    public static void main(String[] args) throws Exception {
+        Configuration conf = new Configuration();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+        String[] otherArgs = new String[1];
+        int j = 0;
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-libjars")) {
+                // generic options parser doesn't seem to work!
+                conf.set("tmpjars", args[i + 1]);
+                i = i + 1; // skip it , the for loop will skip its value
+            } else {
+                otherArgs[j++] = args[i];
+            }
+        }
+        if (otherArgs.length != 1) {
+            usage();
+        }
+        String serverUri = otherArgs[0];
+        String tableName = COMPLEX_TABLE_NAME;
+        String dbName = "default";
+        Map<String, String> outputPartitionKvps = new HashMap<String, String>();
+        String outputTableName = null;
+        outputTableName = COMPLEX_NOPART_EMPTY_INITIALLY_TABLE_NAME;
+        // test with null or empty randomly
+        if (new Random().nextInt(2) == 0) {
+            System.err.println("INFO: output partition keys set to null for writing");
+            outputPartitionKvps = null;
+        }
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "storecomplex");
+        // initialize HCatInputFormat
+
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+        HCatOutputFormat.setOutput(job, OutputJobInfo.create(
             dbName, outputTableName, outputPartitionKvps));
-    
-    
-    HCatSchema s = HCatInputFormat.getTableSchema(job);
-    HCatOutputFormat.setSchema(job, s);
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(HCatOutputFormat.class);
-    job.setJarByClass(StoreComplex.class);
-    job.setMapperClass(ComplexMapper.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setOutputValueClass(DefaultHCatRecord.class);
-    System.exit(job.waitForCompletion(true) ? 0 : 1);
-  }
+
+
+        HCatSchema s = HCatInputFormat.getTableSchema(job);
+        HCatOutputFormat.setSchema(job, s);
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(HCatOutputFormat.class);
+        job.setJarByClass(StoreComplex.class);
+        job.setMapperClass(ComplexMapper.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setOutputValueClass(DefaultHCatRecord.class);
+        System.exit(job.waitForCompletion(true) ? 0 : 1);
+    }
 
 
     /**
-     * 
+     *
      */
     private static void usage() {
         System.err.println("Usage: hadoop jar testudf.jar storecomplex <serveruri> <-libjars hive-hcat jar>\n" +
-        "The hcat jar location should be specified as file://<full path to jar>\n");
+            "The hcat jar location should be specified as file://<full path to jar>\n");
         System.exit(2);
-        
+
     }
-   
+
 
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java
index d35ceac..e1c3b45 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreDemo.java
@@ -48,104 +48,105 @@
  * 'numbers_nopart_pig_empty_initially' (unpartitioned) table with the tinyint
  * and smallint columns in "numbers" being stored as "int" (since pig cannot handle
  * tinyint and smallint)
- * 
+ *
  * Usage: hadoop jar storenumbers <serveruri> <part|nopart|nopart_pig> <-libjars hive-hcat jar>
-        If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table.
-        If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table.
-        If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table.
-        The hcat jar location should be specified as file://<full path to jar>
+ If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table.
+ If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table.
+ If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table.
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class StoreDemo {
 
     private static final String NUMBERS_PARTITIONED_TABLE_NAME = "demo_partitioned";
     private static final String NUMBERS_TABLE_NAME = "demo";
-    
-  public static class SumMapper 
-       extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>{
-      
-    
-      Integer intnum;
-     
-      Double doublenum;
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          WritableComparable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        intnum = ((Integer)value.get(0));
-        value.set(0, intnum + 20);
-        doublenum = ((Double) value.get(1));
-        value.set(1, (Double) (doublenum + 20));
-        context.write(new IntWritable(0), value);
 
-    }
-  }
-  
-  
-   public static void main(String[] args) throws Exception {
-    Configuration conf = new Configuration();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
-    String[] otherArgs = new String[1];
-    int j = 0;
-    for(int i = 0; i < args.length; i++) {
-        if(args[i].equals("-libjars")) {
-            // generic options parser doesn't seem to work!
-            conf.set("tmpjars", args[i+1]);
-            i = i+1; // skip it , the for loop will skip its value                
-        } else {
-            otherArgs[j++] = args[i];
+    public static class SumMapper
+        extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+
+
+        Integer intnum;
+
+        Double doublenum;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            intnum = ((Integer) value.get(0));
+            value.set(0, intnum + 20);
+            doublenum = ((Double) value.get(1));
+            value.set(1, (Double) (doublenum + 20));
+            context.write(new IntWritable(0), value);
+
         }
     }
-    if (otherArgs.length != 1) {
-      usage();
-    }
-    String serverUri = otherArgs[0];
-    
-    String tableName = NUMBERS_TABLE_NAME;
-    String dbName = "default";
-    Map<String, String> outputPartitionKvps = new HashMap<String, String>();
-    String outputTableName = NUMBERS_PARTITIONED_TABLE_NAME;
-    outputPartitionKvps.put("datestamp", "20100102");
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "storedemo");
-    // initialize HCatInputFormat
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    HCatOutputFormat.setOutput(job, OutputJobInfo.create(
+
+
+    public static void main(String[] args) throws Exception {
+        Configuration conf = new Configuration();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+        String[] otherArgs = new String[1];
+        int j = 0;
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-libjars")) {
+                // generic options parser doesn't seem to work!
+                conf.set("tmpjars", args[i + 1]);
+                i = i + 1; // skip it , the for loop will skip its value
+            } else {
+                otherArgs[j++] = args[i];
+            }
+        }
+        if (otherArgs.length != 1) {
+            usage();
+        }
+        String serverUri = otherArgs[0];
+
+        String tableName = NUMBERS_TABLE_NAME;
+        String dbName = "default";
+        Map<String, String> outputPartitionKvps = new HashMap<String, String>();
+        String outputTableName = NUMBERS_PARTITIONED_TABLE_NAME;
+        outputPartitionKvps.put("datestamp", "20100102");
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "storedemo");
+        // initialize HCatInputFormat
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+        HCatOutputFormat.setOutput(job, OutputJobInfo.create(
             dbName, outputTableName, outputPartitionKvps));
-    // test with and without specifying schema randomly
-    HCatSchema s = HCatInputFormat.getTableSchema(job);
-    System.err.println("INFO: output schema explicitly set for writing:" + s);
-    HCatOutputFormat.setSchema(job, s);
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(HCatOutputFormat.class);
-    job.setJarByClass(StoreDemo.class);
-    job.setMapperClass(SumMapper.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setNumReduceTasks(0);
-    job.setOutputValueClass(DefaultHCatRecord.class);
-    System.exit(job.waitForCompletion(true) ? 0 : 1);
-  }
+        // test with and without specifying schema randomly
+        HCatSchema s = HCatInputFormat.getTableSchema(job);
+        System.err.println("INFO: output schema explicitly set for writing:" + s);
+        HCatOutputFormat.setSchema(job, s);
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(HCatOutputFormat.class);
+        job.setJarByClass(StoreDemo.class);
+        job.setMapperClass(SumMapper.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setNumReduceTasks(0);
+        job.setOutputValueClass(DefaultHCatRecord.class);
+        System.exit(job.waitForCompletion(true) ? 0 : 1);
+    }
 
 
     /**
-     * 
+     *
      */
     private static void usage() {
         System.err.println("Usage: hadoop jar storenumbers <serveruri> <part|nopart|nopart_pig> <-libjars hive-hcat jar>\n" +
-                "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " +
-                "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " +
-                "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " +
-                "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" +
-        "The hcat jar location should be specified as file://<full path to jar>\n");
-    System.exit(2);
-        
+            "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " +
+            "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " +
+            "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " +
+            "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" +
+            "The hcat jar location should be specified as file://<full path to jar>\n");
+        System.exit(2);
+
     }
-   
+
 
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java
index 5c0a93d..2c906b7 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/StoreNumbers.java
@@ -52,12 +52,12 @@
  * 'numbers_nopart_pig_empty_initially' (unpartitioned) table with the tinyint
  * and smallint columns in "numbers" being stored as "int" (since pig cannot handle
  * tinyint and smallint)
- * 
+ *
  * Usage: hadoop jar storenumbers <serveruri> <part|nopart|nopart_pig> <-libjars hive-hcat jar>
-        If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table.
-        If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table.
-        If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table.
-        The hcat jar location should be specified as file://<full path to jar>
+ If the second argument is "part" data is written to datestamp = '2010101' partition of the numbers_part_empty_initially table.
+ If the second argument is "nopart", data is written to the unpartitioned numbers_nopart_empty_initially table.
+ If the second argument is "nopart_pig", data is written to the unpartitioned numbers_nopart_pig_empty_initially table.
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class StoreNumbers {
 
@@ -66,167 +66,167 @@
     private static final String NUMBERS_NON_PARTITIONED_TABLE_NAME = "numbers_nopart_empty_initially";
     private static final String NUMBERS_NON_PARTITIONED_PIG_TABLE_NAME = "numbers_nopart_pig_empty_initially";
     private static final String IS_PIG_NON_PART_TABLE = "is.pig.non.part.table";
-    
-  public static class SumMapper 
-       extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>{
-      
-      Integer intnum1000;
-      // though id is given as a Short by hcat, the map will emit it as an
-      // IntWritable so we can just sum in the reduce
-      Short id;
-      
-      // though intnum5 is handed as a Byte by hcat, the map() will emit it as
-      // an IntWritable so we can just sum in the reduce
-      Byte intnum5;
-      Integer intnum100;
-      Integer intnum;
-      Long longnum;
-      Float floatnum;
-      Double doublenum;
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          WritableComparable,HCatRecord>.Context context) 
-    throws IOException ,InterruptedException {
-        boolean isnoPartPig = context.getConfiguration().getBoolean(IS_PIG_NON_PART_TABLE, false);
-        intnum1000 = ((Integer)value.get(0));
-        id = ((Short) value.get(1));
-        intnum5 = (((Byte)value.get(2)));
-        intnum100 = (((Integer) value.get(3)));
-        intnum = ((Integer) value.get(4));
-        longnum = ((Long) value.get(5));
-        floatnum = ((Float) value.get(6));
-        doublenum = ((Double) value.get(7));
-        HCatRecord output = new DefaultHCatRecord(8);
-        output.set(0, intnum1000 + 10);
-        if(isnoPartPig)
-        {
-            output.set(1, ((int)(id + 10)));
-        } else {
-            output.set(1, ((short)(id + 10)));
-        }
-        if(isnoPartPig) {
-            output.set(2,  (int)(intnum5 + 10));
-        } else {
-            output.set(2, (byte) (intnum5 + 10));
-        }
-        
-        output.set(3, intnum100 + 10);
-        output.set(4, intnum + 10);
-        output.set(5, (long) (longnum + 10));
-        output.set(6, (float) (floatnum + 10));
-        output.set(7, (double) (doublenum + 10));
-        for(int i = 0; i < 8; i++) {
-            System.err.println("XXX: class:" + output.get(i).getClass());
-        }
-        context.write(new IntWritable(0), output);
 
-    }
-  }
-  
-  
-   public static void main(String[] args) throws Exception {
-    Configuration conf = new Configuration();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
-    String[] otherArgs = new String[2];
-    int j = 0;
-    for(int i = 0; i < args.length; i++) {
-        if(args[i].equals("-libjars")) {
-            // generic options parser doesn't seem to work!
-            conf.set("tmpjars", args[i+1]);
-            i = i+1; // skip it , the for loop will skip its value                
-        } else {
-            otherArgs[j++] = args[i];
-        }
-    }
-    if (otherArgs.length != 2) {
-      usage();
-    }
-    String serverUri = otherArgs[0];
-    if(otherArgs[1] == null || (
-            !otherArgs[1].equalsIgnoreCase("part") && !otherArgs[1].equalsIgnoreCase("nopart"))
-            && !otherArgs[1].equalsIgnoreCase("nopart_pig")) {
-        usage();
-    }
-    boolean writeToPartitionedTable = (otherArgs[1].equalsIgnoreCase("part"));
-    boolean writeToNonPartPigTable = (otherArgs[1].equalsIgnoreCase("nopart_pig"));
-    String tableName = NUMBERS_TABLE_NAME;
-    String dbName = "default";
-    Map<String, String> outputPartitionKvps = new HashMap<String, String>();
-    String outputTableName = null;
-    conf.set(IS_PIG_NON_PART_TABLE, "false");
-    if(writeToPartitionedTable) {
-        outputTableName = NUMBERS_PARTITIONED_TABLE_NAME;
-        outputPartitionKvps.put("datestamp", "20100101");
-    } else {
-        if(writeToNonPartPigTable) {
-            conf.set(IS_PIG_NON_PART_TABLE, "true");
-            outputTableName = NUMBERS_NON_PARTITIONED_PIG_TABLE_NAME;
-        } else {
-            outputTableName = NUMBERS_NON_PARTITIONED_TABLE_NAME;
-        }
-        // test with null or empty randomly
-        if(new Random().nextInt(2) == 0) {
-            outputPartitionKvps = null;
-        }
-    }
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "storenumbers");
-    
-    // initialize HCatInputFormat
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    HCatOutputFormat.setOutput(job, OutputJobInfo.create(
-            dbName, outputTableName, outputPartitionKvps));
-    // test with and without specifying schema randomly
-    HCatSchema s = HCatInputFormat.getTableSchema(job);
-    if(writeToNonPartPigTable) {
-        List<HCatFieldSchema> newHfsList = new ArrayList<HCatFieldSchema>();
-        // change smallint and tinyint to int
-        for(HCatFieldSchema hfs: s.getFields()){
-            if(hfs.getTypeString().equals("smallint")) {
-                newHfsList.add(new HCatFieldSchema(hfs.getName(), 
-                        HCatFieldSchema.Type.INT, hfs.getComment()));
-            } else if(hfs.getTypeString().equals("tinyint")) {
-                newHfsList.add(new HCatFieldSchema(hfs.getName(), 
-                        HCatFieldSchema.Type.INT, hfs.getComment()));
+    public static class SumMapper
+        extends Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+
+        Integer intnum1000;
+        // though id is given as a Short by hcat, the map will emit it as an
+        // IntWritable so we can just sum in the reduce
+        Short id;
+
+        // though intnum5 is handed as a Byte by hcat, the map() will emit it as
+        // an IntWritable so we can just sum in the reduce
+        Byte intnum5;
+        Integer intnum100;
+        Integer intnum;
+        Long longnum;
+        Float floatnum;
+        Double doublenum;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            boolean isnoPartPig = context.getConfiguration().getBoolean(IS_PIG_NON_PART_TABLE, false);
+            intnum1000 = ((Integer) value.get(0));
+            id = ((Short) value.get(1));
+            intnum5 = (((Byte) value.get(2)));
+            intnum100 = (((Integer) value.get(3)));
+            intnum = ((Integer) value.get(4));
+            longnum = ((Long) value.get(5));
+            floatnum = ((Float) value.get(6));
+            doublenum = ((Double) value.get(7));
+            HCatRecord output = new DefaultHCatRecord(8);
+            output.set(0, intnum1000 + 10);
+            if (isnoPartPig) {
+                output.set(1, ((int) (id + 10)));
             } else {
-                newHfsList.add(hfs);
+                output.set(1, ((short) (id + 10)));
+            }
+            if (isnoPartPig) {
+                output.set(2, (int) (intnum5 + 10));
+            } else {
+                output.set(2, (byte) (intnum5 + 10));
+            }
+
+            output.set(3, intnum100 + 10);
+            output.set(4, intnum + 10);
+            output.set(5, (long) (longnum + 10));
+            output.set(6, (float) (floatnum + 10));
+            output.set(7, (double) (doublenum + 10));
+            for (int i = 0; i < 8; i++) {
+                System.err.println("XXX: class:" + output.get(i).getClass());
+            }
+            context.write(new IntWritable(0), output);
+
+        }
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        Configuration conf = new Configuration();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+        String[] otherArgs = new String[2];
+        int j = 0;
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-libjars")) {
+                // generic options parser doesn't seem to work!
+                conf.set("tmpjars", args[i + 1]);
+                i = i + 1; // skip it , the for loop will skip its value
+            } else {
+                otherArgs[j++] = args[i];
             }
         }
-        s = new HCatSchema(newHfsList);
-    } 
-    HCatOutputFormat.setSchema(job, s);
-    
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(HCatOutputFormat.class);
-    job.setJarByClass(StoreNumbers.class);
-    job.setMapperClass(SumMapper.class);
-    job.setOutputKeyClass(IntWritable.class);
-    job.setNumReduceTasks(0);
-    job.setOutputValueClass(DefaultHCatRecord.class);
-    System.exit(job.waitForCompletion(true) ? 0 : 1);
-  }
+        if (otherArgs.length != 2) {
+            usage();
+        }
+        String serverUri = otherArgs[0];
+        if (otherArgs[1] == null || (
+            !otherArgs[1].equalsIgnoreCase("part") && !otherArgs[1].equalsIgnoreCase("nopart"))
+            && !otherArgs[1].equalsIgnoreCase("nopart_pig")) {
+            usage();
+        }
+        boolean writeToPartitionedTable = (otherArgs[1].equalsIgnoreCase("part"));
+        boolean writeToNonPartPigTable = (otherArgs[1].equalsIgnoreCase("nopart_pig"));
+        String tableName = NUMBERS_TABLE_NAME;
+        String dbName = "default";
+        Map<String, String> outputPartitionKvps = new HashMap<String, String>();
+        String outputTableName = null;
+        conf.set(IS_PIG_NON_PART_TABLE, "false");
+        if (writeToPartitionedTable) {
+            outputTableName = NUMBERS_PARTITIONED_TABLE_NAME;
+            outputPartitionKvps.put("datestamp", "20100101");
+        } else {
+            if (writeToNonPartPigTable) {
+                conf.set(IS_PIG_NON_PART_TABLE, "true");
+                outputTableName = NUMBERS_NON_PARTITIONED_PIG_TABLE_NAME;
+            } else {
+                outputTableName = NUMBERS_NON_PARTITIONED_TABLE_NAME;
+            }
+            // test with null or empty randomly
+            if (new Random().nextInt(2) == 0) {
+                outputPartitionKvps = null;
+            }
+        }
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "storenumbers");
+
+        // initialize HCatInputFormat
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+        HCatOutputFormat.setOutput(job, OutputJobInfo.create(
+            dbName, outputTableName, outputPartitionKvps));
+        // test with and without specifying schema randomly
+        HCatSchema s = HCatInputFormat.getTableSchema(job);
+        if (writeToNonPartPigTable) {
+            List<HCatFieldSchema> newHfsList = new ArrayList<HCatFieldSchema>();
+            // change smallint and tinyint to int
+            for (HCatFieldSchema hfs : s.getFields()) {
+                if (hfs.getTypeString().equals("smallint")) {
+                    newHfsList.add(new HCatFieldSchema(hfs.getName(),
+                        HCatFieldSchema.Type.INT, hfs.getComment()));
+                } else if (hfs.getTypeString().equals("tinyint")) {
+                    newHfsList.add(new HCatFieldSchema(hfs.getName(),
+                        HCatFieldSchema.Type.INT, hfs.getComment()));
+                } else {
+                    newHfsList.add(hfs);
+                }
+            }
+            s = new HCatSchema(newHfsList);
+        }
+        HCatOutputFormat.setSchema(job, s);
+
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(HCatOutputFormat.class);
+        job.setJarByClass(StoreNumbers.class);
+        job.setMapperClass(SumMapper.class);
+        job.setOutputKeyClass(IntWritable.class);
+        job.setNumReduceTasks(0);
+        job.setOutputValueClass(DefaultHCatRecord.class);
+        System.exit(job.waitForCompletion(true) ? 0 : 1);
+    }
 
 
     /**
-     * 
+     *
      */
     private static void usage() {
         System.err.println("Usage: hadoop jar storenumbers <serveruri> <part|nopart|nopart_pig> <-libjars hive-hcat jar>\n" +
-                "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " +
-                "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " +
-                "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " +
-                "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" +
-        "The hcat jar location should be specified as file://<full path to jar>\n");
-    System.exit(2);
-        
+            "\tIf the second argument is \"part\" data is written to datestamp = '2010101' partition of " +
+            "the numbers_part_empty_initially table.\n\tIf the second argument is \"nopart\", data is written to " +
+            "the unpartitioned numbers_nopart_empty_initially table.\n\tIf the second argument is \"nopart_pig\", " +
+            "data is written to the unpartitioned numbers_nopart_pig_empty_initially table.\nt" +
+            "The hcat jar location should be specified as file://<full path to jar>\n");
+        System.exit(2);
+
     }
-   
+
 
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java
index a001493..84b5e6d 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/SumNumbers.java
@@ -47,211 +47,211 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce program
  * to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter
+ The hcat jar location should be specified as file://<full path to jar>
  */
 public class SumNumbers {
 
     private static final String NUMBERS_TABLE_NAME = "numbers";
     private static final String TAB = "\t";
-    
-  public static class SumMapper 
-       extends Mapper<WritableComparable, HCatRecord, IntWritable, SumNumbers.ArrayWritable>{
-      
-      IntWritable intnum1000;
-      // though id is given as a Short by hcat, the map will emit it as an
-      // IntWritable so we can just sum in the reduce
-      IntWritable id;
-      
-      // though intnum5 is handed as a Byte by hcat, the map() will emit it as
-      // an IntWritable so we can just sum in the reduce
-      IntWritable intnum5;
-      IntWritable intnum100;
-      IntWritable intnum;
-      LongWritable longnum;
-      FloatWritable floatnum;
-      DoubleWritable doublenum;
-    @Override
-  protected void map(WritableComparable key, HCatRecord value, 
-          org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,
-          IntWritable,SumNumbers.ArrayWritable>.Context context) 
-    throws IOException ,InterruptedException {
-        intnum1000 = new IntWritable((Integer)value.get(0));
-        id = new IntWritable((Short) value.get(1));
-        intnum5 = new IntWritable(((Byte)value.get(2)));
-        intnum100 = new IntWritable(((Integer) value.get(3)));
-        intnum = new IntWritable((Integer) value.get(4));
-        longnum = new LongWritable((Long) value.get(5));
-        floatnum = new FloatWritable((Float) value.get(6));
-        doublenum = new DoubleWritable((Double) value.get(7));
-        SumNumbers.ArrayWritable outputValue = new SumNumbers.ArrayWritable(id, 
+
+    public static class SumMapper
+        extends Mapper<WritableComparable, HCatRecord, IntWritable, SumNumbers.ArrayWritable> {
+
+        IntWritable intnum1000;
+        // though id is given as a Short by hcat, the map will emit it as an
+        // IntWritable so we can just sum in the reduce
+        IntWritable id;
+
+        // though intnum5 is handed as a Byte by hcat, the map() will emit it as
+        // an IntWritable so we can just sum in the reduce
+        IntWritable intnum5;
+        IntWritable intnum100;
+        IntWritable intnum;
+        LongWritable longnum;
+        FloatWritable floatnum;
+        DoubleWritable doublenum;
+
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord,
+                               IntWritable, SumNumbers.ArrayWritable>.Context context)
+            throws IOException, InterruptedException {
+            intnum1000 = new IntWritable((Integer) value.get(0));
+            id = new IntWritable((Short) value.get(1));
+            intnum5 = new IntWritable(((Byte) value.get(2)));
+            intnum100 = new IntWritable(((Integer) value.get(3)));
+            intnum = new IntWritable((Integer) value.get(4));
+            longnum = new LongWritable((Long) value.get(5));
+            floatnum = new FloatWritable((Float) value.get(6));
+            doublenum = new DoubleWritable((Double) value.get(7));
+            SumNumbers.ArrayWritable outputValue = new SumNumbers.ArrayWritable(id,
                 intnum5, intnum100, intnum, longnum, floatnum, doublenum);
-        context.write(intnum1000, outputValue);
+            context.write(intnum1000, outputValue);
 
-    }
-  }
-  
-  public static class SumReducer extends Reducer<IntWritable, SumNumbers.ArrayWritable, 
-  LongWritable, Text> {
-      
-      
-    LongWritable dummyLong = null;
-      @Override
-    protected void reduce(IntWritable key, java.lang.Iterable<ArrayWritable> 
-      values, org.apache.hadoop.mapreduce.Reducer<IntWritable,ArrayWritable,LongWritable,Text>.Context context) 
-      throws IOException ,InterruptedException {
-          String output = key.toString() + TAB;
-          Long sumid = 0l;
-          Long sumintnum5 = 0l;
-          Long sumintnum100 = 0l;
-          Long sumintnum = 0l;
-          Long sumlongnum = 0l;
-          Float sumfloatnum = 0.0f;
-          Double sumdoublenum = 0.0;
-          for (ArrayWritable value : values) {
-            sumid += value.id.get();
-            sumintnum5 += value.intnum5.get();
-            sumintnum100 += value.intnum100.get();
-            sumintnum += value.intnum.get();
-            sumlongnum += value.longnum.get();
-            sumfloatnum += value.floatnum.get();
-            sumdoublenum += value.doublenum.get();
-        }
-          output += sumid + TAB;
-          output += sumintnum5 + TAB;
-          output += sumintnum100 + TAB;
-          output += sumintnum + TAB;
-          output += sumlongnum + TAB;
-          output += sumfloatnum + TAB;
-          output += sumdoublenum + TAB;
-          context.write(dummyLong, new Text(output));
-      }
-  }
-  
-   public static void main(String[] args) throws Exception {
-    Configuration conf = new Configuration();
-    args = new GenericOptionsParser(conf, args).getRemainingArgs();
-    String[] otherArgs = new String[4];
-    int j = 0;
-    for(int i = 0; i < args.length; i++) {
-        if(args[i].equals("-libjars")) {
-            // generic options parser doesn't seem to work!
-            conf.set("tmpjars", args[i+1]);
-            i = i+1; // skip it , the for loop will skip its value                
-        } else {
-            otherArgs[j++] = args[i];
         }
     }
-    if (otherArgs.length != 4) {
-      System.err.println("Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>\n" +
-            "The <tab|ctrla> argument controls the output delimiter.\n" +
-            "The hcat jar location should be specified as file://<full path to jar>\n");
-      System.exit(2);
-    }
-    String serverUri = otherArgs[0];
-    String tableName = NUMBERS_TABLE_NAME;
-    String outputDir = otherArgs[1];
-    String dbName = "default";
-    
-    String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-    if(principalID != null)
-    conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
-    Job job = new Job(conf, "sumnumbers");
-    HCatInputFormat.setInput(job, InputJobInfo.create(
-    		dbName, tableName, null));
-    // initialize HCatOutputFormat
-    
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-    job.setJarByClass(SumNumbers.class);
-    job.setMapperClass(SumMapper.class);
-    job.setReducerClass(SumReducer.class);
-    job.setMapOutputKeyClass(IntWritable.class);
-    job.setMapOutputValueClass(ArrayWritable.class);
-    job.setOutputKeyClass(LongWritable.class);
-    job.setOutputValueClass(Text.class);
-    FileOutputFormat.setOutputPath(job, new Path(outputDir));
-    System.exit(job.waitForCompletion(true) ? 0 : 1);
-  }
-   
-   public static class ArrayWritable implements Writable {
 
-       // though id is given as a Short by hcat, the map will emit it as an
-       // IntWritable so we can just sum in the reduce
-       IntWritable id;
-       
-       // though intnum5 is handed as a Byte by hcat, the map() will emit it as
-       // an IntWritable so we can just sum in the reduce
-       IntWritable intnum5;
-       
-       IntWritable intnum100;
-       IntWritable intnum;
-       LongWritable longnum;
-       FloatWritable floatnum;
-       DoubleWritable doublenum;
-       
-       /**
-     * 
-     */
-    public ArrayWritable() {
-        id = new IntWritable();
-        intnum5 = new IntWritable();
-        intnum100 = new IntWritable();
-        intnum = new IntWritable();
-        longnum = new LongWritable();
-        floatnum = new FloatWritable();
-        doublenum = new DoubleWritable();
-    }
-    
-    
-       
-    /**
-     * @param id
-     * @param intnum5
-     * @param intnum100
-     * @param intnum
-     * @param longnum
-     * @param floatnum
-     * @param doublenum
-     */
-    public ArrayWritable(IntWritable id, IntWritable intnum5,
-            IntWritable intnum100, IntWritable intnum, LongWritable longnum,
-            FloatWritable floatnum, DoubleWritable doublenum) {
-        this.id = id;
-        this.intnum5 = intnum5;
-        this.intnum100 = intnum100;
-        this.intnum = intnum;
-        this.longnum = longnum;
-        this.floatnum = floatnum;
-        this.doublenum = doublenum;
-    }
+    public static class SumReducer extends Reducer<IntWritable, SumNumbers.ArrayWritable,
+        LongWritable, Text> {
 
 
+        LongWritable dummyLong = null;
 
-    @Override
-    public void readFields(DataInput in) throws IOException {
-        id.readFields(in);
-        intnum5.readFields(in);
-        intnum100.readFields(in);
-        intnum.readFields(in);
-        longnum.readFields(in);
-        floatnum.readFields(in);
-        doublenum.readFields(in);
+        @Override
+        protected void reduce(IntWritable key, java.lang.Iterable<ArrayWritable>
+            values, org.apache.hadoop.mapreduce.Reducer<IntWritable, ArrayWritable, LongWritable, Text>.Context context)
+            throws IOException, InterruptedException {
+            String output = key.toString() + TAB;
+            Long sumid = 0l;
+            Long sumintnum5 = 0l;
+            Long sumintnum100 = 0l;
+            Long sumintnum = 0l;
+            Long sumlongnum = 0l;
+            Float sumfloatnum = 0.0f;
+            Double sumdoublenum = 0.0;
+            for (ArrayWritable value : values) {
+                sumid += value.id.get();
+                sumintnum5 += value.intnum5.get();
+                sumintnum100 += value.intnum100.get();
+                sumintnum += value.intnum.get();
+                sumlongnum += value.longnum.get();
+                sumfloatnum += value.floatnum.get();
+                sumdoublenum += value.doublenum.get();
+            }
+            output += sumid + TAB;
+            output += sumintnum5 + TAB;
+            output += sumintnum100 + TAB;
+            output += sumintnum + TAB;
+            output += sumlongnum + TAB;
+            output += sumfloatnum + TAB;
+            output += sumdoublenum + TAB;
+            context.write(dummyLong, new Text(output));
+        }
     }
 
-    @Override
-    public void write(DataOutput out) throws IOException {
-        id.write(out);
-        intnum5.write(out);
-        intnum100.write(out);
-        intnum.write(out);
-        longnum.write(out);
-        floatnum.write(out);
-        doublenum.write(out);
-        
+    public static void main(String[] args) throws Exception {
+        Configuration conf = new Configuration();
+        args = new GenericOptionsParser(conf, args).getRemainingArgs();
+        String[] otherArgs = new String[4];
+        int j = 0;
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].equals("-libjars")) {
+                // generic options parser doesn't seem to work!
+                conf.set("tmpjars", args[i + 1]);
+                i = i + 1; // skip it , the for loop will skip its value
+            } else {
+                otherArgs[j++] = args[i];
+            }
+        }
+        if (otherArgs.length != 4) {
+            System.err.println("Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat jar>\n" +
+                "The <tab|ctrla> argument controls the output delimiter.\n" +
+                "The hcat jar location should be specified as file://<full path to jar>\n");
+            System.exit(2);
+        }
+        String serverUri = otherArgs[0];
+        String tableName = NUMBERS_TABLE_NAME;
+        String outputDir = otherArgs[1];
+        String dbName = "default";
+
+        String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+        if (principalID != null)
+            conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+        Job job = new Job(conf, "sumnumbers");
+        HCatInputFormat.setInput(job, InputJobInfo.create(
+            dbName, tableName, null));
+        // initialize HCatOutputFormat
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+        job.setJarByClass(SumNumbers.class);
+        job.setMapperClass(SumMapper.class);
+        job.setReducerClass(SumReducer.class);
+        job.setMapOutputKeyClass(IntWritable.class);
+        job.setMapOutputValueClass(ArrayWritable.class);
+        job.setOutputKeyClass(LongWritable.class);
+        job.setOutputValueClass(Text.class);
+        FileOutputFormat.setOutputPath(job, new Path(outputDir));
+        System.exit(job.waitForCompletion(true) ? 0 : 1);
     }
-       
-   }
+
+    public static class ArrayWritable implements Writable {
+
+        // though id is given as a Short by hcat, the map will emit it as an
+        // IntWritable so we can just sum in the reduce
+        IntWritable id;
+
+        // though intnum5 is handed as a Byte by hcat, the map() will emit it as
+        // an IntWritable so we can just sum in the reduce
+        IntWritable intnum5;
+
+        IntWritable intnum100;
+        IntWritable intnum;
+        LongWritable longnum;
+        FloatWritable floatnum;
+        DoubleWritable doublenum;
+
+        /**
+         *
+         */
+        public ArrayWritable() {
+            id = new IntWritable();
+            intnum5 = new IntWritable();
+            intnum100 = new IntWritable();
+            intnum = new IntWritable();
+            longnum = new LongWritable();
+            floatnum = new FloatWritable();
+            doublenum = new DoubleWritable();
+        }
+
+
+        /**
+         * @param id
+         * @param intnum5
+         * @param intnum100
+         * @param intnum
+         * @param longnum
+         * @param floatnum
+         * @param doublenum
+         */
+        public ArrayWritable(IntWritable id, IntWritable intnum5,
+                             IntWritable intnum100, IntWritable intnum, LongWritable longnum,
+                             FloatWritable floatnum, DoubleWritable doublenum) {
+            this.id = id;
+            this.intnum5 = intnum5;
+            this.intnum100 = intnum100;
+            this.intnum = intnum;
+            this.longnum = longnum;
+            this.floatnum = floatnum;
+            this.doublenum = doublenum;
+        }
+
+
+        @Override
+        public void readFields(DataInput in) throws IOException {
+            id.readFields(in);
+            intnum5.readFields(in);
+            intnum100.readFields(in);
+            intnum.readFields(in);
+            longnum.readFields(in);
+            floatnum.readFields(in);
+            doublenum.readFields(in);
+        }
+
+        @Override
+        public void write(DataOutput out) throws IOException {
+            id.write(out);
+            intnum5.write(out);
+            intnum100.write(out);
+            intnum.write(out);
+            longnum.write(out);
+            floatnum.write(out);
+            doublenum.write(out);
+
+        }
+
+    }
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java
index 44ede23..3eeb2e4 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/TypeDataCheck.java
@@ -44,138 +44,139 @@
  * objective by checking the type of the Objects representing the columns against
  * the schema provided as a cmdline arg. It achieves the second objective by
  * writing the data as Text to be compared against golden results.
- * 
+ *
  * The schema specification consists of the types as given by "describe <table>"
  * with each column's type separated from the next column's type by a '+'
- * 
+ *
  * Can be used against "numbers" and "complex" tables.
- * 
+ *
  * Usage: hadoop jar testudf.jar typedatacheck <serveruri> <tablename> 
  * <hive types of cols + delimited> <output dir> <tab|ctrla> <-libjars hive-hcat jar>
-            The <tab|ctrla> argument controls the output delimiter.
-            The hcat jar location should be specified as file://<full path to jar>
+ The <tab|ctrla> argument controls the output delimiter.
+ The hcat jar location should be specified as file://<full path to jar>
  */
-public class TypeDataCheck implements Tool{
+public class TypeDataCheck implements Tool {
 
-	static String SCHEMA_KEY = "schema";
-	static String DELIM = "delim";
-	private static Configuration conf = new Configuration();
+    static String SCHEMA_KEY = "schema";
+    static String DELIM = "delim";
+    private static Configuration conf = new Configuration();
 
-	public static class TypeDataCheckMapper 
-	extends Mapper<WritableComparable, HCatRecord, Long, Text>{
+    public static class TypeDataCheckMapper
+        extends Mapper<WritableComparable, HCatRecord, Long, Text> {
 
-		Long dummykey = null;
-		String[] types;
-		String delim = "\u0001";      
-		@Override
-		protected void setup(org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,Long,Text>.Context context) 
-		throws IOException ,InterruptedException {
-			String typesStr = context.getConfiguration().get(SCHEMA_KEY);
-			delim = context.getConfiguration().get(DELIM);
-			if(delim.equals("tab")) {
-				delim = "\t";
-			} else if (delim.equals("ctrla")) {
-				delim = "\u0001";
-			}
-			types = typesStr.split("\\+");
-			for(int i = 0; i < types.length; i++) {
-				types[i] = types[i].toLowerCase();
-			}
+        Long dummykey = null;
+        String[] types;
+        String delim = "\u0001";
+
+        @Override
+        protected void setup(org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Long, Text>.Context context)
+            throws IOException, InterruptedException {
+            String typesStr = context.getConfiguration().get(SCHEMA_KEY);
+            delim = context.getConfiguration().get(DELIM);
+            if (delim.equals("tab")) {
+                delim = "\t";
+            } else if (delim.equals("ctrla")) {
+                delim = "\u0001";
+            }
+            types = typesStr.split("\\+");
+            for (int i = 0; i < types.length; i++) {
+                types[i] = types[i].toLowerCase();
+            }
 
 
-		}
+        }
 
-		String check(HCatRecord r) throws IOException {
-			String s = "";
-			for(int i = 0; i < r.size(); i++) {
-				s += Util.check(types[i], r.get(i));
-				if(i != r.size() - 1) {
-					s += delim;
-				}
-			}
-			return s;
-		}
+        String check(HCatRecord r) throws IOException {
+            String s = "";
+            for (int i = 0; i < r.size(); i++) {
+                s += Util.check(types[i], r.get(i));
+                if (i != r.size() - 1) {
+                    s += delim;
+                }
+            }
+            return s;
+        }
 
-		@Override
-		protected void map(WritableComparable key, HCatRecord value, 
-				org.apache.hadoop.mapreduce.Mapper<WritableComparable,HCatRecord,Long,Text>.Context context) 
-		throws IOException ,InterruptedException {
-			context.write(dummykey, new Text(check(value)));
-		}
-	}
+        @Override
+        protected void map(WritableComparable key, HCatRecord value,
+                           org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, Long, Text>.Context context)
+            throws IOException, InterruptedException {
+            context.write(dummykey, new Text(check(value)));
+        }
+    }
 
-	public static void main(String[] args) throws Exception {
-		TypeDataCheck self = new TypeDataCheck();
-		System.exit(ToolRunner.run(conf, self, args));
-	}
+    public static void main(String[] args) throws Exception {
+        TypeDataCheck self = new TypeDataCheck();
+        System.exit(ToolRunner.run(conf, self, args));
+    }
 
-	public int run(String[] args) {
-		try {
-			args = new GenericOptionsParser(conf, args).getRemainingArgs();
-			String[] otherArgs = new String[5];
-			int j = 0;
-			for(int i = 0; i < args.length; i++) {
-				if(args[i].equals("-libjars")) {
-                                        conf.set("tmpjars",args[i+1]);
-					i = i+1; // skip it , the for loop will skip its value                
-				} else {
-					otherArgs[j++] = args[i];
-				}
-			}
-			if (otherArgs.length !=5 ) {
-				System.err.println("Other args:" + Arrays.asList(otherArgs));
-				System.err.println("Usage: hadoop jar testudf.jar typedatacheck " +
-						"<serveruri> <tablename> <hive types of cols + delimited> " +
-						"<output dir> <tab|ctrla> <-libjars hive-hcat jar>\n" +
-						"The <tab|ctrla> argument controls the output delimiter.\n" +
-				"The hcat jar location should be specified as file://<full path to jar>\n");
-				System.err.println(" The <tab|ctrla> argument controls the output delimiter.");
-				System.exit(2);
-			}
-			String serverUri = otherArgs[0];
-			String tableName = otherArgs[1];
-			String schemaStr = otherArgs[2];
-			String outputDir = otherArgs[3];
-			String outputdelim = otherArgs[4];
-			if(!outputdelim.equals("tab") && !outputdelim.equals("ctrla")) {
-				System.err.println("ERROR: Specify 'tab' or 'ctrla' for output delimiter");
-			}
-			String dbName = "default";
+    public int run(String[] args) {
+        try {
+            args = new GenericOptionsParser(conf, args).getRemainingArgs();
+            String[] otherArgs = new String[5];
+            int j = 0;
+            for (int i = 0; i < args.length; i++) {
+                if (args[i].equals("-libjars")) {
+                    conf.set("tmpjars", args[i + 1]);
+                    i = i + 1; // skip it , the for loop will skip its value
+                } else {
+                    otherArgs[j++] = args[i];
+                }
+            }
+            if (otherArgs.length != 5) {
+                System.err.println("Other args:" + Arrays.asList(otherArgs));
+                System.err.println("Usage: hadoop jar testudf.jar typedatacheck " +
+                    "<serveruri> <tablename> <hive types of cols + delimited> " +
+                    "<output dir> <tab|ctrla> <-libjars hive-hcat jar>\n" +
+                    "The <tab|ctrla> argument controls the output delimiter.\n" +
+                    "The hcat jar location should be specified as file://<full path to jar>\n");
+                System.err.println(" The <tab|ctrla> argument controls the output delimiter.");
+                System.exit(2);
+            }
+            String serverUri = otherArgs[0];
+            String tableName = otherArgs[1];
+            String schemaStr = otherArgs[2];
+            String outputDir = otherArgs[3];
+            String outputdelim = otherArgs[4];
+            if (!outputdelim.equals("tab") && !outputdelim.equals("ctrla")) {
+                System.err.println("ERROR: Specify 'tab' or 'ctrla' for output delimiter");
+            }
+            String dbName = "default";
 
-			String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
-			if(principalID != null){
-				conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);				
-			}
-			Job job = new Job(conf, "typedatacheck");
-			// initialize HCatInputFormat
-			HCatInputFormat.setInput(job, InputJobInfo.create(
-					dbName, tableName, null));
-			HCatSchema s = HCatInputFormat.getTableSchema(job);
-			job.getConfiguration().set(SCHEMA_KEY, schemaStr);
-			job.getConfiguration().set(DELIM, outputdelim);
-			job.setInputFormatClass(HCatInputFormat.class);
-			job.setOutputFormatClass(TextOutputFormat.class);
-			job.setJarByClass(TypeDataCheck.class);
-			job.setMapperClass(TypeDataCheckMapper.class);
-			job.setNumReduceTasks(0);
-			job.setOutputKeyClass(Long.class);
-			job.setOutputValueClass(Text.class);
-			FileOutputFormat.setOutputPath(job, new Path(outputDir));
-			System.exit(job.waitForCompletion(true) ? 0 : 1);
-			return 0;
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
+            String principalID = System.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            if (principalID != null) {
+                conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
+            }
+            Job job = new Job(conf, "typedatacheck");
+            // initialize HCatInputFormat
+            HCatInputFormat.setInput(job, InputJobInfo.create(
+                dbName, tableName, null));
+            HCatSchema s = HCatInputFormat.getTableSchema(job);
+            job.getConfiguration().set(SCHEMA_KEY, schemaStr);
+            job.getConfiguration().set(DELIM, outputdelim);
+            job.setInputFormatClass(HCatInputFormat.class);
+            job.setOutputFormatClass(TextOutputFormat.class);
+            job.setJarByClass(TypeDataCheck.class);
+            job.setMapperClass(TypeDataCheckMapper.class);
+            job.setNumReduceTasks(0);
+            job.setOutputKeyClass(Long.class);
+            job.setOutputValueClass(Text.class);
+            FileOutputFormat.setOutputPath(job, new Path(outputDir));
+            System.exit(job.waitForCompletion(true) ? 0 : 1);
+            return 0;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
 
-	@Override
-	public Configuration getConf() {
-		return conf;
-	}
+    @Override
+    public Configuration getConf() {
+        return conf;
+    }
 
-	@Override
-	public void setConf(Configuration conf) {
-		TypeDataCheck.conf = conf;
-	}
+    @Override
+    public void setConf(Configuration conf) {
+        TypeDataCheck.conf = conf;
+    }
 
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java
index 8e34116..1876069 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/Util.java
@@ -27,8 +27,8 @@
 public class Util {
 
     static Map<String, Class<?>> typeMap = new HashMap<String, Class<?>>();
-    
-    static{
+
+    static {
         typeMap.put("tinyint", Byte.class);
         typeMap.put("smallint", Short.class);
         typeMap.put("int", Integer.class);
@@ -41,31 +41,31 @@
         typeMap.put("map<string,string>", Map.class);
         typeMap.put("array<map<string,string>>", List.class);
     }
-    
+
     public static void die(String expectedType, Object o) throws IOException {
-        throw new IOException("Expected " + expectedType + ", got " +  
-              o.getClass().getName());
+        throw new IOException("Expected " + expectedType + ", got " +
+            o.getClass().getName());
     }
-    
-    
+
+
     public static String check(String type, Object o) throws IOException {
-        if(o == null) {
+        if (o == null) {
             return "null";
         }
-        if(check(typeMap.get(type), o)) {
-            if(type.equals("map<string,string>")) {
+        if (check(typeMap.get(type), o)) {
+            if (type.equals("map<string,string>")) {
                 Map<String, String> m = (Map<String, String>) o;
                 check(m);
-            } else if(type.equals("array<map<string,string>>")) {
+            } else if (type.equals("array<map<string,string>>")) {
                 List<Map<String, String>> listOfMaps = (List<Map<String, String>>) o;
-                for(Map<String, String> m: listOfMaps) {
+                for (Map<String, String> m : listOfMaps) {
                     check(m);
                 }
-            } else if(type.equals("struct<num:int,str:string,dbl:double>")) {
+            } else if (type.equals("struct<num:int,str:string,dbl:double>")) {
                 List<Object> l = (List<Object>) o;
-                if(!check(Integer.class, l.get(0)) ||
-                        !check(String.class, l.get(1)) ||
-                                !check(Double.class, l.get(2))) {
+                if (!check(Integer.class, l.get(0)) ||
+                    !check(String.class, l.get(1)) ||
+                    !check(Double.class, l.get(2))) {
                     die("struct<num:int,str:string,dbl:double>", l);
                 }
             }
@@ -74,32 +74,32 @@
         }
         return o.toString();
     }
-    
-    /**
-   * @param m
-   * @throws IOException 
-   */
-  public static void check(Map<String, String> m) throws IOException {
-      if(m == null) {
-          return;
-      }
-      for(Entry<String, String> e: m.entrySet()) {
-          // just access key and value to ensure they are correct
-          if(!check(String.class, e.getKey())) {
-              die("String", e.getKey());
-          }
-          if(!check(String.class, e.getValue())) {
-              die("String", e.getValue());
-          }
-      }
-      
-  }
 
-  public static boolean check(Class<?> expected, Object actual) {
-        if(actual == null) {
+    /**
+     * @param m
+     * @throws IOException
+     */
+    public static void check(Map<String, String> m) throws IOException {
+        if (m == null) {
+            return;
+        }
+        for (Entry<String, String> e : m.entrySet()) {
+            // just access key and value to ensure they are correct
+            if (!check(String.class, e.getKey())) {
+                die("String", e.getKey());
+            }
+            if (!check(String.class, e.getValue())) {
+                die("String", e.getValue());
+            }
+        }
+
+    }
+
+    public static boolean check(Class<?> expected, Object actual) {
+        if (actual == null) {
             return true;
         }
         return expected.isAssignableFrom(actual.getClass());
     }
-    
+
 }
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteJson.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteJson.java
index 994feec..1426162 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteJson.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteJson.java
@@ -42,7 +42,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -50,7 +50,7 @@
 public class WriteJson extends Configured implements Tool {
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+        Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
 
         String s;
         Integer i;
@@ -58,19 +58,19 @@
 
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
-                throws IOException, InterruptedException {
-            s = value.get(0)==null?null:(String)value.get(0);
-            i = value.get(1)==null?null:(Integer)value.get(1);
-            d = value.get(2)==null?null:(Double)value.get(2);
-            
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            s = value.get(0) == null ? null : (String) value.get(0);
+            i = value.get(1) == null ? null : (Integer) value.get(1);
+            d = value.get(2) == null ? null : (Double) value.get(2);
+
             HCatRecord record = new DefaultHCatRecord(5);
             record.set(0, s);
             record.set(1, i);
             record.set(2, d);
-            
+
             context.write(null, record);
 
         }
@@ -86,12 +86,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "WriteJson");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, null));
+            inputTableName, null));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -101,10 +101,10 @@
         job.setOutputValueClass(DefaultHCatRecord.class);
         job.setNumReduceTasks(0);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, null));
+            outputTableName, null));
         HCatSchema s = HCatInputFormat.getTableSchema(job);
         System.err.println("INFO: output schema explicitly set for writing:"
-                + s);
+            + s);
         HCatOutputFormat.setSchema(job, s);
         job.setOutputFormatClass(HCatOutputFormat.class);
         return (job.waitForCompletion(true) ? 0 : 1);
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteRC.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteRC.java
index c3e84d5..b4dfdfa 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteRC.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteRC.java
@@ -42,7 +42,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -50,29 +50,29 @@
 public class WriteRC extends Configured implements Tool {
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+        Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
 
         String name;
         Integer age;
         Double gpa;
-        
+
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
-                throws IOException, InterruptedException {
-            name = value.get(0)==null?null:(String)value.get(0);
-            age = value.get(1)==null?null:(Integer)value.get(1);
-            gpa = value.get(2)==null?null:(Double)value.get(2);
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            name = value.get(0) == null ? null : (String) value.get(0);
+            age = value.get(1) == null ? null : (Integer) value.get(1);
+            gpa = value.get(2) == null ? null : (Double) value.get(2);
 
             if (gpa != null) gpa = Math.floor(gpa) + 0.1;
-            
+
             HCatRecord record = new DefaultHCatRecord(5);
             record.set(0, name);
             record.set(1, age);
             record.set(2, gpa);
-            
+
             context.write(null, record);
 
         }
@@ -88,12 +88,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "WriteRC");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, null));
+            inputTableName, null));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -103,10 +103,10 @@
         job.setOutputValueClass(DefaultHCatRecord.class);
         job.setNumReduceTasks(0);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, null));
+            outputTableName, null));
         HCatSchema s = HCatInputFormat.getTableSchema(job);
         System.err.println("INFO: output schema explicitly set for writing:"
-                + s);
+            + s);
         HCatOutputFormat.setSchema(job, s);
         job.setOutputFormatClass(HCatOutputFormat.class);
         return (job.waitForCompletion(true) ? 0 : 1);
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteText.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteText.java
index de47cf2..4662739 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteText.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteText.java
@@ -42,7 +42,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar sumnumbers <serveruri> <output dir> <-libjars hive-hcat
  * jar> The <tab|ctrla> argument controls the output delimiter The hcat jar
  * location should be specified as file://<full path to jar>
@@ -50,7 +50,7 @@
 public class WriteText extends Configured implements Tool {
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+        Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
 
         byte t;
         short si;
@@ -62,18 +62,18 @@
 
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
-                throws IOException, InterruptedException {
-            t = (Byte)value.get(0);
-            si = (Short)value.get(1);
-            i = (Integer)value.get(2);
-            b = (Long)value.get(3);
-            f = (Float)value.get(4);
-            d = (Double)value.get(5);
-            s = (String)value.get(6);
-            
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            t = (Byte) value.get(0);
+            si = (Short) value.get(1);
+            i = (Integer) value.get(2);
+            b = (Long) value.get(3);
+            f = (Float) value.get(4);
+            d = (Double) value.get(5);
+            s = (String) value.get(6);
+
             HCatRecord record = new DefaultHCatRecord(7);
             record.set(0, t);
             record.set(1, si);
@@ -82,7 +82,7 @@
             record.set(4, f);
             record.set(5, d);
             record.set(6, s);
-            
+
             context.write(null, record);
 
         }
@@ -98,12 +98,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "WriteText");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, null));
+            inputTableName, null));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -113,10 +113,10 @@
         job.setOutputValueClass(DefaultHCatRecord.class);
         job.setNumReduceTasks(0);
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, null));
+            outputTableName, null));
         HCatSchema s = HCatInputFormat.getTableSchema(job);
         System.err.println("INFO: output schema explicitly set for writing:"
-                + s);
+            + s);
         HCatOutputFormat.setSchema(job, s);
         job.setOutputFormatClass(HCatOutputFormat.class);
         return (job.waitForCompletion(true) ? 0 : 1);
diff --git a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteTextPartitioned.java b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteTextPartitioned.java
index a2e6167..1854082 100644
--- a/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteTextPartitioned.java
+++ b/src/test/e2e/hcatalog/udfs/java/org/apache/hcatalog/utils/WriteTextPartitioned.java
@@ -46,7 +46,7 @@
  * table. It performs a group by on the first column and a SUM operation on the
  * other columns. This is to simulate a typical operation in a map reduce
  * program to test that hcat hands the right data to the map reduce program
- * 
+ *
  * Usage: hadoop jar org.apache.hcatalog.utils.HBaseReadWrite -libjars
  * &lt;hcat_jar&gt; * &lt;serveruri&gt; &lt;input_tablename&gt; &lt;output_tablename&gt; [filter]
  * If filter is given it will be provided as the partition to write to.
@@ -56,23 +56,23 @@
     static String filter = null;
 
     public static class Map extends
-            Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
+        Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord> {
 
         @Override
         protected void map(
-                WritableComparable key,
-                HCatRecord value,
-                org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
-                throws IOException, InterruptedException {
-            String name = (String)value.get(0);
-            int age = (Integer)value.get(1);
-            String ds = (String)value.get(3);
-            
+            WritableComparable key,
+            HCatRecord value,
+            org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, WritableComparable, HCatRecord>.Context context)
+            throws IOException, InterruptedException {
+            String name = (String) value.get(0);
+            int age = (Integer) value.get(1);
+            String ds = (String) value.get(3);
+
             HCatRecord record = (filter == null ? new DefaultHCatRecord(3) : new DefaultHCatRecord(2));
             record.set(0, name);
             record.set(1, age);
             if (filter == null) record.set(2, ds);
-            
+
             context.write(null, record);
 
         }
@@ -89,12 +89,12 @@
         String dbName = null;
 
         String principalID = System
-                .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
+            .getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
         if (principalID != null)
             conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
         Job job = new Job(conf, "WriteTextPartitioned");
         HCatInputFormat.setInput(job, InputJobInfo.create(dbName,
-                inputTableName, filter));
+            inputTableName, filter));
         // initialize HCatOutputFormat
 
         job.setInputFormatClass(HCatInputFormat.class);
@@ -112,7 +112,7 @@
             partitionVals.put(s[0], val);
         }
         HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName,
-                outputTableName, partitionVals));
+            outputTableName, partitionVals));
         HCatSchema s = HCatInputFormat.getTableSchema(job);
         // Build the schema for this table, which is slightly different than the
         // schema for the input table
diff --git a/src/test/e2e/templeton/build.xml b/src/test/e2e/templeton/build.xml
index fe74212..ed85eba 100644
--- a/src/test/e2e/templeton/build.xml
+++ b/src/test/e2e/templeton/build.xml
@@ -17,77 +17,76 @@
 
 <project name="TestHarnessTempletonTests" default="test">
 
-  <!-- Separate property name for udfs' build.xml -->
-  <property name="e2e.lib.dir" value="${basedir}/lib"/>
+    <!-- Separate property name for udfs' build.xml -->
+    <property name="e2e.lib.dir" value="${basedir}/lib"/>
 
-  <property name="test.src" value="${basedir}/tests"/>
-  <property name="driver.src" value="${basedir}/drivers"/>
-  <property name="harness.dir" value="${basedir}/../harness"/>
-  <property name="inpdir.local" value="${basedir}/inpdir/"/>
-  <property name="test.location" value="${basedir}/testWorkDir"/>
-  <property name="driver.src" value="${basedir}/drivers"/>
+    <property name="test.src" value="${basedir}/tests"/>
+    <property name="driver.src" value="${basedir}/drivers"/>
+    <property name="harness.dir" value="${basedir}/../harness"/>
+    <property name="inpdir.local" value="${basedir}/inpdir/"/>
+    <property name="test.location" value="${basedir}/testWorkDir"/>
+    <property name="driver.src" value="${basedir}/drivers"/>
 
-  <!-- Check that the necessary properties are setup -->
-  <target name="property-check">
-    <fail message="Please set the property harness.webhdfs.url to the namenode base url of the cluster"
-      unless="harness.webhdfs.url"/>
-    <fail message="Please set the property harness.templeton.url to the templeton server base url of the cluster"
-      unless="harness.templeton.url"/>
-    <fail message="Please set the property inpdir.hdfs to the test input directory on hdfs"
-      unless="inpdir.hdfs"/>
-  </target>
+    <!-- Check that the necessary properties are setup -->
+    <target name="property-check">
+        <fail message="Please set the property harness.webhdfs.url to the namenode base url of the cluster"
+              unless="harness.webhdfs.url"/>
+        <fail message="Please set the property harness.templeton.url to the templeton server base url of the cluster"
+              unless="harness.templeton.url"/>
+        <fail message="Please set the property inpdir.hdfs to the test input directory on hdfs"
+              unless="inpdir.hdfs"/>
+    </target>
 
-  <!-- Prep the test area -->
-  <target name="init-test">
-    <mkdir dir="${test.location}"/>
-  </target>
+    <!-- Prep the test area -->
+    <target name="init-test">
+        <mkdir dir="${test.location}"/>
+    </target>
 
-  <target name="test" depends="property-check, init-test" >
-    <property name="tests.to.run" value=""/>
-    <exec executable="${harness.dir}/test_harness.pl" dir="${test.location}" failonerror="true">
-      <env key="HARNESS_ROOT" value="${harness.dir}"/>
-      <env key="DRIVER_ROOT" value="${basedir}/drivers"/>
-      <env key="TH_WORKING_DIR" value="${test.location}"/>
-      <env key="TH_INPDIR_LOCAL" value="${inpdir.local}"/>
-      <env key="TH_INPDIR_HDFS" value="${inpdir.hdfs}"/>
-      <env key="TH_OUT" value="."/>
-      <env key="TH_ROOT" value="."/>
-      <env key="WEBHDFS_URL" value="${harness.webhdfs.url}"/>
-      <env key="TEMPLETON_URL" value="${harness.templeton.url}"/>
-      <env key="USER_NAME" value="${test.user.name}"/>
-      <env key="HARNESS_CONF" value="${basedir}/conf/default.conf"/>
-      <env key="SECURE_MODE" value="${secure.mode}"/>
-      <arg line="${tests.to.run}"/>
-      <arg value="${basedir}/tests/serverstatus.conf"/>
-      <arg value="${basedir}/tests/ddl.conf"/>
-      <arg value="${basedir}/tests/jobsubmission.conf"/>
-    </exec>
-  </target>
+    <target name="test" depends="property-check, init-test">
+        <property name="tests.to.run" value=""/>
+        <exec executable="${harness.dir}/test_harness.pl" dir="${test.location}" failonerror="true">
+            <env key="HARNESS_ROOT" value="${harness.dir}"/>
+            <env key="DRIVER_ROOT" value="${basedir}/drivers"/>
+            <env key="TH_WORKING_DIR" value="${test.location}"/>
+            <env key="TH_INPDIR_LOCAL" value="${inpdir.local}"/>
+            <env key="TH_INPDIR_HDFS" value="${inpdir.hdfs}"/>
+            <env key="TH_OUT" value="."/>
+            <env key="TH_ROOT" value="."/>
+            <env key="WEBHDFS_URL" value="${harness.webhdfs.url}"/>
+            <env key="TEMPLETON_URL" value="${harness.templeton.url}"/>
+            <env key="USER_NAME" value="${test.user.name}"/>
+            <env key="HARNESS_CONF" value="${basedir}/conf/default.conf"/>
+            <env key="SECURE_MODE" value="${secure.mode}"/>
+            <arg line="${tests.to.run}"/>
+            <arg value="${basedir}/tests/serverstatus.conf"/>
+            <arg value="${basedir}/tests/ddl.conf"/>
+            <arg value="${basedir}/tests/jobsubmission.conf"/>
+        </exec>
+    </target>
 
-  <target name="test-hcat-authorization" depends="property-check, init-test" >
-    <property name="tests.to.run" value=""/>
-    <exec executable="${harness.dir}/test_harness.pl" dir="${test.location}" failonerror="true">
-      <env key="HARNESS_ROOT" value="${harness.dir}"/>
-      <env key="DRIVER_ROOT" value="${basedir}/drivers"/>
-      <env key="TH_WORKING_DIR" value="${test.location}"/>
-      <env key="TH_INPDIR_LOCAL" value="${inpdir.local}"/>
-      <env key="TH_INPDIR_HDFS" value="${inpdir.hdfs}"/>
-      <env key="TH_OUT" value="."/>
-      <env key="TH_ROOT" value="."/>
-      <env key="WEBHDFS_URL" value="${harness.webhdfs.url}"/>
-      <env key="TEMPLETON_URL" value="${harness.templeton.url}"/>
-      <env key="USER_NAME" value="${test.user.name}"/>
-      <env key="GROUP_NAME" value="${test.group.name}"/>
-      <env key="GROUP_USER_NAME" value="${test.group.user.name}"/>
-      <env key="OTHER_USER_NAME" value="${test.other.user.name}"/>
-      <env key="HARNESS_CONF" value="${basedir}/conf/default.conf"/>
-      <env key="SECURE_MODE" value="${secure.mode}"/>
-      <env key="KEYTAB_DIR" value="${keytab.dir}"/>
-      <arg line="${tests.to.run}"/>
-      <arg value="${basedir}/tests/hcatperms.conf"/>
-    </exec>
-  </target>
-
+    <target name="test-hcat-authorization" depends="property-check, init-test">
+        <property name="tests.to.run" value=""/>
+        <exec executable="${harness.dir}/test_harness.pl" dir="${test.location}" failonerror="true">
+            <env key="HARNESS_ROOT" value="${harness.dir}"/>
+            <env key="DRIVER_ROOT" value="${basedir}/drivers"/>
+            <env key="TH_WORKING_DIR" value="${test.location}"/>
+            <env key="TH_INPDIR_LOCAL" value="${inpdir.local}"/>
+            <env key="TH_INPDIR_HDFS" value="${inpdir.hdfs}"/>
+            <env key="TH_OUT" value="."/>
+            <env key="TH_ROOT" value="."/>
+            <env key="WEBHDFS_URL" value="${harness.webhdfs.url}"/>
+            <env key="TEMPLETON_URL" value="${harness.templeton.url}"/>
+            <env key="USER_NAME" value="${test.user.name}"/>
+            <env key="GROUP_NAME" value="${test.group.name}"/>
+            <env key="GROUP_USER_NAME" value="${test.group.user.name}"/>
+            <env key="OTHER_USER_NAME" value="${test.other.user.name}"/>
+            <env key="HARNESS_CONF" value="${basedir}/conf/default.conf"/>
+            <env key="SECURE_MODE" value="${secure.mode}"/>
+            <env key="KEYTAB_DIR" value="${keytab.dir}"/>
+            <arg line="${tests.to.run}"/>
+            <arg value="${basedir}/tests/hcatperms.conf"/>
+        </exec>
+    </target>
 
 
 </project>
diff --git a/src/test/org/apache/hcatalog/ExitException.java b/src/test/org/apache/hcatalog/ExitException.java
index 4b56efd..5e429c5 100644
--- a/src/test/org/apache/hcatalog/ExitException.java
+++ b/src/test/org/apache/hcatalog/ExitException.java
@@ -18,20 +18,20 @@
 
 package org.apache.hcatalog;
 
-public  class ExitException extends SecurityException {
-  private static final long serialVersionUID = -1982617086752946683L;
-  private final int status;
+public class ExitException extends SecurityException {
+    private static final long serialVersionUID = -1982617086752946683L;
+    private final int status;
 
-  /**
-   * @return the status
-   */
-  public int getStatus() {
-    return status;
-  }
+    /**
+     * @return the status
+     */
+    public int getStatus() {
+        return status;
+    }
 
-  public ExitException(int status) {
+    public ExitException(int status) {
 
-    super("Raising exception, instead of System.exit(). Return code was: "+status);
-    this.status = status;
-  }
+        super("Raising exception, instead of System.exit(). Return code was: " + status);
+        this.status = status;
+    }
 }
diff --git a/src/test/org/apache/hcatalog/HcatTestUtils.java b/src/test/org/apache/hcatalog/HcatTestUtils.java
index e1f3e0e..3348339 100644
--- a/src/test/org/apache/hcatalog/HcatTestUtils.java
+++ b/src/test/org/apache/hcatalog/HcatTestUtils.java
@@ -33,74 +33,74 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** 
+/**
  * Utility methods for tests
  */
 public class HcatTestUtils {
-  private static final Logger LOG = LoggerFactory.getLogger(HcatTestUtils.class);
+    private static final Logger LOG = LoggerFactory.getLogger(HcatTestUtils.class);
 
-  public static FsPermission perm007 = FsPermission.createImmutable((short) 0007); // -------rwx
-  public static FsPermission perm070 = FsPermission.createImmutable((short) 0070); // ----rwx---
-  public static FsPermission perm700 = FsPermission.createImmutable((short) 0700); // -rwx------
-  public static FsPermission perm755 = FsPermission.createImmutable((short) 0755); // -rwxr-xr-x
-  public static FsPermission perm777 = FsPermission.createImmutable((short) 0777); // -rwxrwxrwx
-  public static FsPermission perm300 = FsPermission.createImmutable((short) 0300); // --wx------
-  public static FsPermission perm500 = FsPermission.createImmutable((short) 0500); // -r-x------
-  public static FsPermission perm555 = FsPermission.createImmutable((short) 0555); // -r-xr-xr-x
-  
-  /** 
-   * Returns the database path.
-   */
-  public static Path getDbPath(Hive hive, Warehouse wh, String dbName) throws MetaException, HiveException {
-    return wh.getDatabasePath(hive.getDatabase(dbName)); 
-  }
-  
-  /** 
-   * Removes all databases and tables from the metastore
-   */
-  public static void cleanupHMS(Hive hive, Warehouse wh, FsPermission defaultPerm) 
-      throws HiveException, MetaException, NoSuchObjectException {
-    for (String dbName : hive.getAllDatabases()) {
-      if (dbName.equals("default")) {
-        continue;
-      }
-      try {
-        Path path = getDbPath(hive, wh, dbName);
-        FileSystem whFs = path.getFileSystem(hive.getConf());
-        whFs.setPermission(path, defaultPerm);
-      } catch(IOException ex) {
-        //ignore
-      }
-      hive.dropDatabase(dbName, true, true, true);
-    }
-    
-    //clean tables in default db
-    for (String tablename : hive.getAllTables("default")) {
-      hive.dropTable("default", tablename, true, true);
-    }
-  }
+    public static FsPermission perm007 = FsPermission.createImmutable((short) 0007); // -------rwx
+    public static FsPermission perm070 = FsPermission.createImmutable((short) 0070); // ----rwx---
+    public static FsPermission perm700 = FsPermission.createImmutable((short) 0700); // -rwx------
+    public static FsPermission perm755 = FsPermission.createImmutable((short) 0755); // -rwxr-xr-x
+    public static FsPermission perm777 = FsPermission.createImmutable((short) 0777); // -rwxrwxrwx
+    public static FsPermission perm300 = FsPermission.createImmutable((short) 0300); // --wx------
+    public static FsPermission perm500 = FsPermission.createImmutable((short) 0500); // -r-x------
+    public static FsPermission perm555 = FsPermission.createImmutable((short) 0555); // -r-xr-xr-x
 
-  public static void createTestDataFile(String filename, String[] lines) throws IOException {
-    FileWriter writer = null;
-    try {
-      File file = new File(filename);
-      file.deleteOnExit();
-      writer = new FileWriter(file);
-      for (String line : lines) {
-        writer.write(line + "\n");
-      }
-    } finally {
-      if (writer != null) {
-        writer.close();
-      }
+    /**
+     * Returns the database path.
+     */
+    public static Path getDbPath(Hive hive, Warehouse wh, String dbName) throws MetaException, HiveException {
+        return wh.getDatabasePath(hive.getDatabase(dbName));
     }
 
-  }
+    /**
+     * Removes all databases and tables from the metastore
+     */
+    public static void cleanupHMS(Hive hive, Warehouse wh, FsPermission defaultPerm)
+        throws HiveException, MetaException, NoSuchObjectException {
+        for (String dbName : hive.getAllDatabases()) {
+            if (dbName.equals("default")) {
+                continue;
+            }
+            try {
+                Path path = getDbPath(hive, wh, dbName);
+                FileSystem whFs = path.getFileSystem(hive.getConf());
+                whFs.setPermission(path, defaultPerm);
+            } catch (IOException ex) {
+                //ignore
+            }
+            hive.dropDatabase(dbName, true, true, true);
+        }
 
-  public static boolean isHadoop23() {
-      String version = org.apache.hadoop.util.VersionInfo.getVersion();
-      if (version.matches("\\b0\\.23\\..+\\b"))
-          return true;
-      return false;
-  }
+        //clean tables in default db
+        for (String tablename : hive.getAllTables("default")) {
+            hive.dropTable("default", tablename, true, true);
+        }
+    }
+
+    public static void createTestDataFile(String filename, String[] lines) throws IOException {
+        FileWriter writer = null;
+        try {
+            File file = new File(filename);
+            file.deleteOnExit();
+            writer = new FileWriter(file);
+            for (String line : lines) {
+                writer.write(line + "\n");
+            }
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+
+    }
+
+    public static boolean isHadoop23() {
+        String version = org.apache.hadoop.util.VersionInfo.getVersion();
+        if (version.matches("\\b0\\.23\\..+\\b"))
+            return true;
+        return false;
+    }
 }
diff --git a/src/test/org/apache/hcatalog/MiniCluster.java b/src/test/org/apache/hcatalog/MiniCluster.java
index fc8aa5c..d7b54e6 100644
--- a/src/test/org/apache/hcatalog/MiniCluster.java
+++ b/src/test/org/apache/hcatalog/MiniCluster.java
@@ -42,152 +42,159 @@
  * environment for Pig to run on top of the mini cluster.
  */
 public class MiniCluster {
-  private MiniDFSCluster m_dfs = null;
-  private MiniMRCluster m_mr = null;
-  private FileSystem m_fileSys = null;
-  private JobConf m_conf = null;
+    private MiniDFSCluster m_dfs = null;
+    private MiniMRCluster m_mr = null;
+    private FileSystem m_fileSys = null;
+    private JobConf m_conf = null;
 
-  private final static MiniCluster INSTANCE = new MiniCluster();
-  private static boolean isSetup = true;
+    private final static MiniCluster INSTANCE = new MiniCluster();
+    private static boolean isSetup = true;
 
-  private MiniCluster() {
-    setupMiniDfsAndMrClusters();
-  }
-
-  private void setupMiniDfsAndMrClusters() {
-    try {
-      final int dataNodes = 1;     // There will be 4 data nodes
-      final int taskTrackers = 1;  // There will be 4 task tracker nodes
-      Configuration config = new Configuration();
-
-      // Builds and starts the mini dfs and mapreduce clusters
-      System.setProperty("hadoop.log.dir", ".");
-      m_dfs = new MiniDFSCluster(config, dataNodes, true, null);
-
-      m_fileSys = m_dfs.getFileSystem();
-      m_mr = new MiniMRCluster(taskTrackers, m_fileSys.getUri().toString(), 1);
-
-      // Create the configuration hadoop-site.xml file
-      File conf_dir = new File(System.getProperty("user.home"), "pigtest/conf/");
-      conf_dir.mkdirs();
-      File conf_file = new File(conf_dir, "hadoop-site.xml");
-
-      // Write the necessary config info to hadoop-site.xml
-      m_conf = m_mr.createJobConf();
-      m_conf.setInt("mapred.submit.replication", 1);
-      m_conf.set("dfs.datanode.address", "0.0.0.0:0");
-      m_conf.set("dfs.datanode.http.address", "0.0.0.0:0");
-      m_conf.writeXml(new FileOutputStream(conf_file));
-
-      // Set the system properties needed by Pig
-      System.setProperty("cluster", m_conf.get("mapred.job.tracker"));
-      System.setProperty("namenode", m_conf.get("fs.default.name"));
-      System.setProperty("junit.hadoop.conf", conf_dir.getPath());
-    } catch (IOException e) {
-      throw new RuntimeException(e);
+    private MiniCluster() {
+        setupMiniDfsAndMrClusters();
     }
-  }
 
-  /**
-   * Returns the single instance of class MiniClusterBuilder that
-   * represents the resouces for a mini dfs cluster and a mini
-   * mapreduce cluster.
-   */
-  public static MiniCluster buildCluster() {
-    if(! isSetup){
-      INSTANCE.setupMiniDfsAndMrClusters();
-      isSetup = true;
+    private void setupMiniDfsAndMrClusters() {
+        try {
+            final int dataNodes = 1;     // There will be 4 data nodes
+            final int taskTrackers = 1;  // There will be 4 task tracker nodes
+            Configuration config = new Configuration();
+
+            // Builds and starts the mini dfs and mapreduce clusters
+            System.setProperty("hadoop.log.dir", ".");
+            m_dfs = new MiniDFSCluster(config, dataNodes, true, null);
+
+            m_fileSys = m_dfs.getFileSystem();
+            m_mr = new MiniMRCluster(taskTrackers, m_fileSys.getUri().toString(), 1);
+
+            // Create the configuration hadoop-site.xml file
+            File conf_dir = new File(System.getProperty("user.home"), "pigtest/conf/");
+            conf_dir.mkdirs();
+            File conf_file = new File(conf_dir, "hadoop-site.xml");
+
+            // Write the necessary config info to hadoop-site.xml
+            m_conf = m_mr.createJobConf();
+            m_conf.setInt("mapred.submit.replication", 1);
+            m_conf.set("dfs.datanode.address", "0.0.0.0:0");
+            m_conf.set("dfs.datanode.http.address", "0.0.0.0:0");
+            m_conf.writeXml(new FileOutputStream(conf_file));
+
+            // Set the system properties needed by Pig
+            System.setProperty("cluster", m_conf.get("mapred.job.tracker"));
+            System.setProperty("namenode", m_conf.get("fs.default.name"));
+            System.setProperty("junit.hadoop.conf", conf_dir.getPath());
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
-    return INSTANCE;
-  }
 
-  public void shutDown(){
-    INSTANCE.shutdownMiniDfsAndMrClusters();
-  }
-
-  @Override
-  protected void finalize() {
-    shutdownMiniDfsAndMrClusters();
-  }
-
-  private void shutdownMiniDfsAndMrClusters() {
-    isSetup = false;
-    try {
-      if (m_fileSys != null) { m_fileSys.close(); }
-    } catch (IOException e) {
-      e.printStackTrace();
+    /**
+     * Returns the single instance of class MiniClusterBuilder that
+     * represents the resouces for a mini dfs cluster and a mini
+     * mapreduce cluster.
+     */
+    public static MiniCluster buildCluster() {
+        if (!isSetup) {
+            INSTANCE.setupMiniDfsAndMrClusters();
+            isSetup = true;
+        }
+        return INSTANCE;
     }
-    if (m_dfs != null) { m_dfs.shutdown(); }
-    if (m_mr != null) { m_mr.shutdown(); }
-    m_fileSys = null;
-    m_dfs = null;
-    m_mr = null;
-  }
 
-  public Properties getProperties() {
-    errorIfNotSetup();
-    Properties properties = new Properties();
-    assert m_conf != null;
-    Iterator<Map.Entry<String, String>> iter = m_conf.iterator();
-    while (iter.hasNext()) {
-        Map.Entry<String, String> entry = iter.next();
-        properties.put(entry.getKey(), entry.getValue());
+    public void shutDown() {
+        INSTANCE.shutdownMiniDfsAndMrClusters();
     }
-    return properties;
-  }
 
-  public void setProperty(String name, String value) {
-    errorIfNotSetup();
-    m_conf.set(name, value);
-  }
+    @Override
+    protected void finalize() {
+        shutdownMiniDfsAndMrClusters();
+    }
 
-  public FileSystem getFileSystem() {
-    errorIfNotSetup();
-    return m_fileSys;
-  }
+    private void shutdownMiniDfsAndMrClusters() {
+        isSetup = false;
+        try {
+            if (m_fileSys != null) {
+                m_fileSys.close();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        if (m_dfs != null) {
+            m_dfs.shutdown();
+        }
+        if (m_mr != null) {
+            m_mr.shutdown();
+        }
+        m_fileSys = null;
+        m_dfs = null;
+        m_mr = null;
+    }
 
-  /**
-   * Throw RunTimeException if isSetup is false
-   */
-   private void errorIfNotSetup(){
-     if(isSetup) {
-       return;
-     }
-     String msg = "function called on MiniCluster that has been shutdown";
-     throw new RuntimeException(msg);
-   }
+    public Properties getProperties() {
+        errorIfNotSetup();
+        Properties properties = new Properties();
+        assert m_conf != null;
+        Iterator<Map.Entry<String, String>> iter = m_conf.iterator();
+        while (iter.hasNext()) {
+            Map.Entry<String, String> entry = iter.next();
+            properties.put(entry.getKey(), entry.getValue());
+        }
+        return properties;
+    }
 
-   static public void createInputFile(MiniCluster miniCluster, String fileName,
-       String[] inputData)
-   throws IOException {
-     FileSystem fs = miniCluster.getFileSystem();
-     createInputFile(fs, fileName, inputData);
-   }
+    public void setProperty(String name, String value) {
+        errorIfNotSetup();
+        m_conf.set(name, value);
+    }
 
-   static public void createInputFile(FileSystem fs, String fileName,
-       String[] inputData) throws IOException {
-     Path path = new Path(fileName);
-     if(fs.exists(path)) {
-       throw new IOException("File " + fileName + " already exists on the minicluster");
-     }
-     FSDataOutputStream stream = fs.create(path);
-     PrintWriter pw = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
-     for (int i=0; i<inputData.length; i++){
-       pw.println(inputData[i]);
-     }
-     pw.close();
+    public FileSystem getFileSystem() {
+        errorIfNotSetup();
+        return m_fileSys;
+    }
 
-   }
-   /**
-    * Helper to remove a dfs file from the minicluster DFS
-    *
-    * @param miniCluster reference to the Minicluster where the file should be deleted
-    * @param fileName pathname of the file to be deleted
-    * @throws IOException
-    */
-   static public void deleteFile(MiniCluster miniCluster, String fileName)
-   throws IOException {
-     FileSystem fs = miniCluster.getFileSystem();
-     fs.delete(new Path(fileName), true);
-   }
+    /**
+     * Throw RunTimeException if isSetup is false
+     */
+    private void errorIfNotSetup() {
+        if (isSetup) {
+            return;
+        }
+        String msg = "function called on MiniCluster that has been shutdown";
+        throw new RuntimeException(msg);
+    }
+
+    static public void createInputFile(MiniCluster miniCluster, String fileName,
+                                       String[] inputData)
+        throws IOException {
+        FileSystem fs = miniCluster.getFileSystem();
+        createInputFile(fs, fileName, inputData);
+    }
+
+    static public void createInputFile(FileSystem fs, String fileName,
+                                       String[] inputData) throws IOException {
+        Path path = new Path(fileName);
+        if (fs.exists(path)) {
+            throw new IOException("File " + fileName + " already exists on the minicluster");
+        }
+        FSDataOutputStream stream = fs.create(path);
+        PrintWriter pw = new PrintWriter(new OutputStreamWriter(stream, "UTF-8"));
+        for (int i = 0; i < inputData.length; i++) {
+            pw.println(inputData[i]);
+        }
+        pw.close();
+
+    }
+
+    /**
+     * Helper to remove a dfs file from the minicluster DFS
+     *
+     * @param miniCluster reference to the Minicluster where the file should be deleted
+     * @param fileName pathname of the file to be deleted
+     * @throws IOException
+     */
+    static public void deleteFile(MiniCluster miniCluster, String fileName)
+        throws IOException {
+        FileSystem fs = miniCluster.getFileSystem();
+        fs.delete(new Path(fileName), true);
+    }
 }
diff --git a/src/test/org/apache/hcatalog/NoExitSecurityManager.java b/src/test/org/apache/hcatalog/NoExitSecurityManager.java
index 8e775a7..b475602 100644
--- a/src/test/org/apache/hcatalog/NoExitSecurityManager.java
+++ b/src/test/org/apache/hcatalog/NoExitSecurityManager.java
@@ -22,20 +22,20 @@
 
 public class NoExitSecurityManager extends SecurityManager {
 
-  @Override
-  public void checkPermission(Permission perm) {
-    // allow anything.
-  }
+    @Override
+    public void checkPermission(Permission perm) {
+        // allow anything.
+    }
 
-  @Override
-  public void checkPermission(Permission perm, Object context) {
-    // allow anything.
-  }
+    @Override
+    public void checkPermission(Permission perm, Object context) {
+        // allow anything.
+    }
 
-  @Override
-  public void checkExit(int status) {
+    @Override
+    public void checkExit(int status) {
 
-    super.checkExit(status);
-    throw new ExitException(status);
-  }
+        super.checkExit(status);
+        throw new ExitException(status);
+    }
 }
diff --git a/src/test/org/apache/hcatalog/cli/DummyStorageHandler.java b/src/test/org/apache/hcatalog/cli/DummyStorageHandler.java
index f1d8b13..ecc105e 100644
--- a/src/test/org/apache/hcatalog/cli/DummyStorageHandler.java
+++ b/src/test/org/apache/hcatalog/cli/DummyStorageHandler.java
@@ -91,7 +91,7 @@
 
     @Override
     public HiveAuthorizationProvider getAuthorizationProvider()
-            throws HiveException {
+        throws HiveException {
         return new DummyAuthProvider();
     }
 
@@ -140,8 +140,8 @@
          */
         @Override
         public void authorize(Privilege[] readRequiredPriv,
-                Privilege[] writeRequiredPriv) throws HiveException,
-                AuthorizationException {
+                              Privilege[] writeRequiredPriv) throws HiveException,
+            AuthorizationException {
         }
 
         /* @param db
@@ -153,8 +153,8 @@
          */
         @Override
         public void authorize(Database db, Privilege[] readRequiredPriv,
-                Privilege[] writeRequiredPriv) throws HiveException,
-                AuthorizationException {
+                              Privilege[] writeRequiredPriv) throws HiveException,
+            AuthorizationException {
         }
 
         /* @param table
@@ -166,8 +166,8 @@
          */
         @Override
         public void authorize(org.apache.hadoop.hive.ql.metadata.Table table, Privilege[] readRequiredPriv,
-                Privilege[] writeRequiredPriv) throws HiveException,
-                AuthorizationException {
+                              Privilege[] writeRequiredPriv) throws HiveException,
+            AuthorizationException {
         }
 
         /* @param part
@@ -179,8 +179,8 @@
          */
         @Override
         public void authorize(Partition part, Privilege[] readRequiredPriv,
-                Privilege[] writeRequiredPriv) throws HiveException,
-                AuthorizationException {
+                              Privilege[] writeRequiredPriv) throws HiveException,
+            AuthorizationException {
         }
 
         /* @param table
@@ -194,8 +194,8 @@
          */
         @Override
         public void authorize(org.apache.hadoop.hive.ql.metadata.Table table, Partition part, List<String> columns,
-                Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-                throws HiveException, AuthorizationException {
+                              Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+            throws HiveException, AuthorizationException {
         }
 
     }
@@ -205,7 +205,7 @@
      * mapred.InputFormat required by HiveStorageHandler.
      */
     class DummyInputFormat implements
-            InputFormat<WritableComparable, HCatRecord> {
+        InputFormat<WritableComparable, HCatRecord> {
 
         /*
          * @see
@@ -215,8 +215,8 @@
          */
         @Override
         public RecordReader<WritableComparable, HCatRecord> getRecordReader(
-                InputSplit split, JobConf jobconf, Reporter reporter)
-                throws IOException {
+            InputSplit split, JobConf jobconf, Reporter reporter)
+            throws IOException {
             throw new IOException("This operation is not supported.");
         }
 
@@ -227,7 +227,7 @@
          */
         @Override
         public InputSplit[] getSplits(JobConf jobconf, int number)
-                throws IOException {
+            throws IOException {
             throw new IOException("This operation is not supported.");
         }
     }
@@ -237,8 +237,8 @@
      * mapred.OutputFormat and HiveOutputFormat required by HiveStorageHandler.
      */
     class DummyOutputFormat implements
-            OutputFormat<WritableComparable<?>, HCatRecord>,
-            HiveOutputFormat<WritableComparable<?>, HCatRecord> {
+        OutputFormat<WritableComparable<?>, HCatRecord>,
+        HiveOutputFormat<WritableComparable<?>, HCatRecord> {
 
         /*
          * @see
@@ -247,7 +247,7 @@
          */
         @Override
         public void checkOutputSpecs(FileSystem fs, JobConf jobconf)
-                throws IOException {
+            throws IOException {
             throw new IOException("This operation is not supported.");
 
         }
@@ -260,8 +260,8 @@
          */
         @Override
         public RecordWriter<WritableComparable<?>, HCatRecord> getRecordWriter(
-                FileSystem fs, JobConf jobconf, String str,
-                Progressable progress) throws IOException {
+            FileSystem fs, JobConf jobconf, String str,
+            Progressable progress) throws IOException {
             throw new IOException("This operation is not supported.");
         }
 
@@ -274,10 +274,10 @@
          */
         @Override
         public org.apache.hadoop.hive.ql.exec.FileSinkOperator.RecordWriter getHiveRecordWriter(
-                JobConf jc, Path finalOutPath,
-                Class<? extends Writable> valueClass, boolean isCompressed,
-                Properties tableProperties, Progressable progress)
-                throws IOException {
+            JobConf jc, Path finalOutPath,
+            Class<? extends Writable> valueClass, boolean isCompressed,
+            Properties tableProperties, Progressable progress)
+            throws IOException {
             throw new IOException("This operation is not supported.");
         }
 
diff --git a/src/test/org/apache/hcatalog/cli/TestPermsGrp.java b/src/test/org/apache/hcatalog/cli/TestPermsGrp.java
index c5abe4d..96c0013 100644
--- a/src/test/org/apache/hcatalog/cli/TestPermsGrp.java
+++ b/src/test/org/apache/hcatalog/cli/TestPermsGrp.java
@@ -53,179 +53,177 @@
 
 public class TestPermsGrp extends TestCase {
 
-  private boolean isServerRunning = false;
-  private static final int msPort = 20101;
-  private HiveConf hcatConf;
-  private Warehouse clientWH;
-  private HiveMetaStoreClient msc;
-  private static final Logger LOG = LoggerFactory.getLogger(TestPermsGrp.class);
+    private boolean isServerRunning = false;
+    private static final int msPort = 20101;
+    private HiveConf hcatConf;
+    private Warehouse clientWH;
+    private HiveMetaStoreClient msc;
+    private static final Logger LOG = LoggerFactory.getLogger(TestPermsGrp.class);
 
-  @Override
-  protected void tearDown() throws Exception {
-    System.setSecurityManager(securityManager);
-  }
-
-  @Override
-  protected void setUp() throws Exception {
-
-    if(isServerRunning) {
-      return;
+    @Override
+    protected void tearDown() throws Exception {
+        System.setSecurityManager(securityManager);
     }
 
-    MetaStoreUtils.startMetaStore(msPort, ShimLoader.getHadoopThriftAuthBridge());
+    @Override
+    protected void setUp() throws Exception {
 
-    isServerRunning = true;
+        if (isServerRunning) {
+            return;
+        }
 
-    securityManager = System.getSecurityManager();
-    System.setSecurityManager(new NoExitSecurityManager());
+        MetaStoreUtils.startMetaStore(msPort, ShimLoader.getHadoopThriftAuthBridge());
 
-    hcatConf = new HiveConf(this.getClass());
-    hcatConf.set("hive.metastore.local", "false");
-    hcatConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://127.0.0.1:" + msPort);
-    hcatConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTRETRIES, 3);
+        isServerRunning = true;
 
-    hcatConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
-    hcatConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hcatConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hcatConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    clientWH = new Warehouse(hcatConf);
-    msc = new HiveMetaStoreClient(hcatConf,null);
-    System.setProperty(HiveConf.ConfVars.PREEXECHOOKS.varname, " ");
-    System.setProperty(HiveConf.ConfVars.POSTEXECHOOKS.varname, " ");
-  }
+        securityManager = System.getSecurityManager();
+        System.setSecurityManager(new NoExitSecurityManager());
 
+        hcatConf = new HiveConf(this.getClass());
+        hcatConf.set("hive.metastore.local", "false");
+        hcatConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://127.0.0.1:" + msPort);
+        hcatConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTRETRIES, 3);
 
-  public void testCustomPerms() throws Exception {
-
-    String dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
-    String tblName = "simptbl";
-    String typeName = "Person";
-
-    try {
-
-      // Lets first test for default permissions, this is the case when user specified nothing.
-      Table tbl = getTable(dbName,tblName,typeName);
-      msc.createTable(tbl);
-      Database db = Hive.get(hcatConf).getDatabase(dbName);
-      Path dfsPath = clientWH.getTablePath(db, tblName);
-      cleanupTbl(dbName, tblName, typeName);
-
-      // Next user did specify perms.
-      try{
-        HCatCli.main(new String[]{"-e","create table simptbl (name string) stored as RCFILE", "-p","rwx-wx---"});
-      }
-      catch(Exception e){
-        assertTrue(e instanceof ExitException);
-        assertEquals(((ExitException)e).getStatus(), 0);
-      }
-      dfsPath = clientWH.getTablePath(db, tblName);
-      assertTrue(dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath).getPermission().equals(FsPermission.valueOf("drwx-wx---")));
-
-      cleanupTbl(dbName, tblName, typeName);
-
-      // User specified perms in invalid format.
-      hcatConf.set(HCatConstants.HCAT_PERMS, "rwx");
-      // make sure create table fails.
-      try{
-        HCatCli.main(new String[]{"-e","create table simptbl (name string) stored as RCFILE", "-p","rwx"});
-        assert false;
-      }catch(Exception me){
-        assertTrue(me instanceof ExitException);
-      }
-      // No physical dir gets created.
-      dfsPath = clientWH.getTablePath(db,tblName);
-      try{
-        dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath);
-        assert false;
-      } catch(Exception fnfe){
-        assertTrue(fnfe instanceof FileNotFoundException);
-      }
-
-      // And no metadata gets created.
-      try{
-        msc.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, tblName);
-        assert false;
-      }catch (Exception e){
-        assertTrue(e instanceof NoSuchObjectException);
-        assertEquals("default.simptbl table not found", e.getMessage());
-      }
-
-      // test for invalid group name
-      hcatConf.set(HCatConstants.HCAT_PERMS, "drw-rw-rw-");
-      hcatConf.set(HCatConstants.HCAT_GROUP, "THIS_CANNOT_BE_A_VALID_GRP_NAME_EVER");
-
-      try{
-        // create table must fail.
-        HCatCli.main(new String[]{"-e","create table simptbl (name string) stored as RCFILE", "-p","rw-rw-rw-","-g","THIS_CANNOT_BE_A_VALID_GRP_NAME_EVER"});
-        assert false;
-      }catch (Exception me){
-        assertTrue(me instanceof SecurityException);
-      }
-
-      try{
-        // no metadata should get created.
-        msc.getTable(dbName, tblName);
-        assert false;
-      }catch (Exception e){
-        assertTrue(e instanceof NoSuchObjectException);
-        assertEquals("default.simptbl table not found", e.getMessage());
-      }
-      try{
-        // neither dir should get created.
-        dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath);
-        assert false;
-      } catch(Exception e){
-        assertTrue(e instanceof FileNotFoundException);
-      }
-
-    } catch (Exception e) {
-        LOG.error("testCustomPerms failed.", e);
-      throw e;
+        hcatConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
+        hcatConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hcatConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hcatConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        clientWH = new Warehouse(hcatConf);
+        msc = new HiveMetaStoreClient(hcatConf, null);
+        System.setProperty(HiveConf.ConfVars.PREEXECHOOKS.varname, " ");
+        System.setProperty(HiveConf.ConfVars.POSTEXECHOOKS.varname, " ");
     }
-  }
 
-  private void silentDropDatabase(String dbName) throws MetaException, TException {
-    try {
-      for (String tableName : msc.getTables(dbName, "*")) {
-        msc.dropTable(dbName, tableName);
-      }
 
-    } catch (NoSuchObjectException e) {
+    public void testCustomPerms() throws Exception {
+
+        String dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
+        String tblName = "simptbl";
+        String typeName = "Person";
+
+        try {
+
+            // Lets first test for default permissions, this is the case when user specified nothing.
+            Table tbl = getTable(dbName, tblName, typeName);
+            msc.createTable(tbl);
+            Database db = Hive.get(hcatConf).getDatabase(dbName);
+            Path dfsPath = clientWH.getTablePath(db, tblName);
+            cleanupTbl(dbName, tblName, typeName);
+
+            // Next user did specify perms.
+            try {
+                HCatCli.main(new String[]{"-e", "create table simptbl (name string) stored as RCFILE", "-p", "rwx-wx---"});
+            } catch (Exception e) {
+                assertTrue(e instanceof ExitException);
+                assertEquals(((ExitException) e).getStatus(), 0);
+            }
+            dfsPath = clientWH.getTablePath(db, tblName);
+            assertTrue(dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath).getPermission().equals(FsPermission.valueOf("drwx-wx---")));
+
+            cleanupTbl(dbName, tblName, typeName);
+
+            // User specified perms in invalid format.
+            hcatConf.set(HCatConstants.HCAT_PERMS, "rwx");
+            // make sure create table fails.
+            try {
+                HCatCli.main(new String[]{"-e", "create table simptbl (name string) stored as RCFILE", "-p", "rwx"});
+                assert false;
+            } catch (Exception me) {
+                assertTrue(me instanceof ExitException);
+            }
+            // No physical dir gets created.
+            dfsPath = clientWH.getTablePath(db, tblName);
+            try {
+                dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath);
+                assert false;
+            } catch (Exception fnfe) {
+                assertTrue(fnfe instanceof FileNotFoundException);
+            }
+
+            // And no metadata gets created.
+            try {
+                msc.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, tblName);
+                assert false;
+            } catch (Exception e) {
+                assertTrue(e instanceof NoSuchObjectException);
+                assertEquals("default.simptbl table not found", e.getMessage());
+            }
+
+            // test for invalid group name
+            hcatConf.set(HCatConstants.HCAT_PERMS, "drw-rw-rw-");
+            hcatConf.set(HCatConstants.HCAT_GROUP, "THIS_CANNOT_BE_A_VALID_GRP_NAME_EVER");
+
+            try {
+                // create table must fail.
+                HCatCli.main(new String[]{"-e", "create table simptbl (name string) stored as RCFILE", "-p", "rw-rw-rw-", "-g", "THIS_CANNOT_BE_A_VALID_GRP_NAME_EVER"});
+                assert false;
+            } catch (Exception me) {
+                assertTrue(me instanceof SecurityException);
+            }
+
+            try {
+                // no metadata should get created.
+                msc.getTable(dbName, tblName);
+                assert false;
+            } catch (Exception e) {
+                assertTrue(e instanceof NoSuchObjectException);
+                assertEquals("default.simptbl table not found", e.getMessage());
+            }
+            try {
+                // neither dir should get created.
+                dfsPath.getFileSystem(hcatConf).getFileStatus(dfsPath);
+                assert false;
+            } catch (Exception e) {
+                assertTrue(e instanceof FileNotFoundException);
+            }
+
+        } catch (Exception e) {
+            LOG.error("testCustomPerms failed.", e);
+            throw e;
+        }
     }
-  }
 
-  private void cleanupTbl(String dbName, String tblName, String typeName) throws NoSuchObjectException, MetaException, TException, InvalidOperationException{
+    private void silentDropDatabase(String dbName) throws MetaException, TException {
+        try {
+            for (String tableName : msc.getTables(dbName, "*")) {
+                msc.dropTable(dbName, tableName);
+            }
 
-    msc.dropTable(dbName, tblName);
-    msc.dropType(typeName);
-  }
+        } catch (NoSuchObjectException e) {
+        }
+    }
 
-  private Table getTable(String dbName, String tblName, String typeName) throws NoSuchObjectException, MetaException, TException, AlreadyExistsException, InvalidObjectException{
+    private void cleanupTbl(String dbName, String tblName, String typeName) throws NoSuchObjectException, MetaException, TException, InvalidOperationException {
 
-    msc.dropTable(dbName, tblName);
-    silentDropDatabase(dbName);
+        msc.dropTable(dbName, tblName);
+        msc.dropType(typeName);
+    }
+
+    private Table getTable(String dbName, String tblName, String typeName) throws NoSuchObjectException, MetaException, TException, AlreadyExistsException, InvalidObjectException {
+
+        msc.dropTable(dbName, tblName);
+        silentDropDatabase(dbName);
 
 
-    msc.dropType(typeName);
-    Type typ1 = new Type();
-    typ1.setName(typeName);
-    typ1.setFields(new ArrayList<FieldSchema>(1));
-    typ1.getFields().add(new FieldSchema("name", Constants.STRING_TYPE_NAME, ""));
-    msc.createType(typ1);
+        msc.dropType(typeName);
+        Type typ1 = new Type();
+        typ1.setName(typeName);
+        typ1.setFields(new ArrayList<FieldSchema>(1));
+        typ1.getFields().add(new FieldSchema("name", Constants.STRING_TYPE_NAME, ""));
+        msc.createType(typ1);
 
-    Table tbl = new Table();
-    tbl.setDbName(dbName);
-    tbl.setTableName(tblName);
-    StorageDescriptor sd = new StorageDescriptor();
-    tbl.setSd(sd);
-    sd.setCols(typ1.getFields());
+        Table tbl = new Table();
+        tbl.setDbName(dbName);
+        tbl.setTableName(tblName);
+        StorageDescriptor sd = new StorageDescriptor();
+        tbl.setSd(sd);
+        sd.setCols(typ1.getFields());
 
-    sd.setSerdeInfo(new SerDeInfo());
-    return tbl;
-  }
+        sd.setSerdeInfo(new SerDeInfo());
+        return tbl;
+    }
 
 
-
-  private SecurityManager securityManager;
+    private SecurityManager securityManager;
 
 }
diff --git a/src/test/org/apache/hcatalog/cli/TestSemanticAnalysis.java b/src/test/org/apache/hcatalog/cli/TestSemanticAnalysis.java
index a8924ab..20a36c5 100644
--- a/src/test/org/apache/hcatalog/cli/TestSemanticAnalysis.java
+++ b/src/test/org/apache/hcatalog/cli/TestSemanticAnalysis.java
@@ -52,340 +52,339 @@
 
 public class TestSemanticAnalysis extends HCatBaseTest {
 
-  private static final Logger LOG = LoggerFactory.getLogger(TestSemanticAnalysis.class);
-  private static final String TBL_NAME = "junit_sem_analysis";
+    private static final Logger LOG = LoggerFactory.getLogger(TestSemanticAnalysis.class);
+    private static final String TBL_NAME = "junit_sem_analysis";
 
-  private Driver hcatDriver = null;
-  private String query;
+    private Driver hcatDriver = null;
+    private String query;
 
-  @Before
-  public void setUpHCatDriver() throws IOException {
-    if (hcatDriver == null) {
-      HiveConf hcatConf = new HiveConf(hiveConf);
-      hcatConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-          HCatSemanticAnalyzer.class.getName());
-      hcatDriver = new Driver(hcatConf);
-      SessionState.start(new CliSessionState(hcatConf));
-    }
-  }
-
-  @Test
-  public void testDescDB() throws CommandNeedRetryException, IOException {
-    hcatDriver.run("drop database mydb cascade");
-    assertEquals(0, hcatDriver.run("create database mydb").getResponseCode());
-    CommandProcessorResponse resp = hcatDriver.run("describe database mydb");
-    assertEquals(0, resp.getResponseCode());
-    ArrayList<String> result = new ArrayList<String>();
-    hcatDriver.getResults(result);
-    assertTrue(result.get(0).contains("mydb.db"));
-    hcatDriver.run("drop database mydb cascade");
-  }
-
-  @Test
-  public void testCreateTblWithLowerCasePartNames() throws CommandNeedRetryException, MetaException, TException, NoSuchObjectException{
-    driver.run("drop table junit_sem_analysis");
-    CommandProcessorResponse resp = driver.run("create table junit_sem_analysis (a int) partitioned by (B string) stored as TEXTFILE");
-    assertEquals(resp.getResponseCode(), 0);
-    assertEquals(null, resp.getErrorMessage());
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    assertEquals("Partition key name case problem", "b" , tbl.getPartitionKeys().get(0).getName());
-    driver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAlterTblFFpart() throws MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
-
-    driver.run("drop table junit_sem_analysis");
-    driver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as TEXTFILE");
-    driver.run("alter table junit_sem_analysis add partition (b='2010-10-10')");
-    hcatDriver.run("alter table junit_sem_analysis partition (b='2010-10-10') set fileformat RCFILE");
-
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    assertEquals(TextInputFormat.class.getName(), tbl.getSd().getInputFormat());
-    assertEquals(HiveIgnoreKeyTextOutputFormat.class.getName(),tbl.getSd().getOutputFormat());
-
-    List<String> partVals = new ArrayList<String>(1);
-    partVals.add("2010-10-10");
-    Partition part = client.getPartition(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME, partVals);
-
-    assertEquals(RCFileInputFormat.class.getName(),part.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(),part.getSd().getOutputFormat());
-
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testUsNonExistentDB() throws CommandNeedRetryException {
-      CommandProcessorResponse resp = hcatDriver.run("use no_such_db");
-      assertEquals(1, resp.getResponseCode());
-  }
-
-  @Test
-  public void testDatabaseOperations() throws MetaException, CommandNeedRetryException {
-
-    List<String> dbs = client.getAllDatabases();
-    String testDb1 = "testdatabaseoperatons1";
-    String testDb2 = "testdatabaseoperatons2";
-
-    if (dbs.contains(testDb1.toLowerCase())){
-      assertEquals(0,hcatDriver.run("drop database "+testDb1).getResponseCode());
+    @Before
+    public void setUpHCatDriver() throws IOException {
+        if (hcatDriver == null) {
+            HiveConf hcatConf = new HiveConf(hiveConf);
+            hcatConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
+                    HCatSemanticAnalyzer.class.getName());
+            hcatDriver = new Driver(hcatConf);
+            SessionState.start(new CliSessionState(hcatConf));
+        }
     }
 
-    if (dbs.contains(testDb2.toLowerCase())){
-      assertEquals(0,hcatDriver.run("drop database "+testDb2).getResponseCode());
+    @Test
+    public void testDescDB() throws CommandNeedRetryException, IOException {
+        hcatDriver.run("drop database mydb cascade");
+        assertEquals(0, hcatDriver.run("create database mydb").getResponseCode());
+        CommandProcessorResponse resp = hcatDriver.run("describe database mydb");
+        assertEquals(0, resp.getResponseCode());
+        ArrayList<String> result = new ArrayList<String>();
+        hcatDriver.getResults(result);
+        assertTrue(result.get(0).contains("mydb.db"));
+        hcatDriver.run("drop database mydb cascade");
     }
 
-    assertEquals(0,hcatDriver.run("create database "+testDb1).getResponseCode());
-    assertTrue(client.getAllDatabases().contains(testDb1));
-    assertEquals(0, hcatDriver.run("create database if not exists " + testDb1).getResponseCode());
-    assertTrue(client.getAllDatabases().contains(testDb1));
-    assertEquals(0,hcatDriver.run("create database if not exists "+testDb2).getResponseCode());
-    assertTrue(client.getAllDatabases().contains(testDb2));
-
-    assertEquals(0,hcatDriver.run("drop database "+testDb1).getResponseCode());
-    assertEquals(0,hcatDriver.run("drop database "+testDb2).getResponseCode());
-    assertFalse(client.getAllDatabases().contains(testDb1));
-    assertFalse(client.getAllDatabases().contains(testDb2));
-  }
-
-  @Test
-  public void testCreateTableIfNotExists() throws MetaException, TException, NoSuchObjectException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table "+ TBL_NAME);
-    hcatDriver.run("create table junit_sem_analysis (a int) stored as RCFILE");
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    List<FieldSchema> cols = tbl.getSd().getCols();
-    assertEquals(1, cols.size());
-    assertTrue(cols.get(0).equals(new FieldSchema("a", "int", null)));
-    assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
-
-    CommandProcessorResponse resp = hcatDriver.run("create table if not exists junit_sem_analysis (a int) stored as RCFILE");
-    assertEquals(0, resp.getResponseCode());
-    assertNull(resp.getErrorMessage());
-    tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    cols = tbl.getSd().getCols();
-    assertEquals(1, cols.size());
-    assertTrue(cols.get(0).equals(new FieldSchema("a", "int",null)));
-    assertEquals(RCFileInputFormat.class.getName(),tbl.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(),tbl.getSd().getOutputFormat());
-
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAlterTblTouch() throws CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis touch");
-    assertEquals(0, response.getResponseCode());
-
-    hcatDriver.run("alter table junit_sem_analysis touch partition (b='12')");
-    assertEquals(0, response.getResponseCode());
-
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testChangeColumns() throws CommandNeedRetryException{
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int, c string) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis change a a1 int");
-    assertEquals(0, response.getResponseCode());
-
-    response = hcatDriver.run("alter table junit_sem_analysis change a1 a string");
-    assertEquals(0, response.getResponseCode());
-
-    response = hcatDriver.run("alter table junit_sem_analysis change a a int after c");
-    assertEquals(0, response.getResponseCode());
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAddReplaceCols() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int, c string) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis replace columns (a1 tinyint)");
-    assertEquals(0, response.getResponseCode());
-
-    response = hcatDriver.run("alter table junit_sem_analysis add columns (d tinyint)");
-    assertEquals(0, response.getResponseCode());
-    assertNull(response.getErrorMessage());
-
-    response = hcatDriver.run("describe extended junit_sem_analysis");
-    assertEquals(0, response.getResponseCode());
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    List<FieldSchema> cols = tbl.getSd().getCols();
-    assertEquals(2, cols.size());
-    assertTrue(cols.get(0).equals(new FieldSchema("a1", "tinyint", null)));
-    assertTrue(cols.get(1).equals(new FieldSchema("d", "tinyint", null)));
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAlterTblClusteredBy() throws CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis clustered by (a) into 7 buckets");
-    assertEquals(0, response.getResponseCode());
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAlterTableSetFF() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
-
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(),tbl.getSd().getOutputFormat());
-
-    hcatDriver.run("alter table junit_sem_analysis set fileformat INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
-        "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver'");
-    hcatDriver.run("desc extended junit_sem_analysis");
-
-    tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    assertEquals(RCFileInputFormat.class.getName(),tbl.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(),tbl.getSd().getOutputFormat());
-
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAddPartFail() throws CommandNeedRetryException{
-
-    driver.run("drop table junit_sem_analysis");
-    driver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis add partition (b='2') location 'README.txt'");
-    assertEquals(0, response.getResponseCode());
-    driver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAddPartPass() throws IOException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
-    CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis add partition (b='2') location '" + TEST_DATA_DIR + "'");
-    assertEquals(0, response.getResponseCode());
-    assertNull(response.getErrorMessage());
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testCTAS() throws CommandNeedRetryException{
-    hcatDriver.run("drop table junit_sem_analysis");
-    query = "create table junit_sem_analysis (a int) as select * from tbl2";
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(40000, response.getResponseCode());
-    assertTrue(response.getErrorMessage().contains("FAILED: SemanticException Operation not supported. Create table as Select is not a valid operation."));
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testStoredAs() throws CommandNeedRetryException{
-    hcatDriver.run("drop table junit_sem_analysis");
-    query = "create table junit_sem_analysis (a int)";
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(0, response.getResponseCode());
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testAddDriverInfo() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string)  stored as " +
-        "INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
-        "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver' ";
-    assertEquals(0,hcatDriver.run(query).getResponseCode());
-
-    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
-    assertEquals(RCFileInputFormat.class.getName(),tbl.getSd().getInputFormat());
-    assertEquals(RCFileOutputFormat.class.getName(),tbl.getSd().getOutputFormat());
-
-    hcatDriver.run("drop table junit_sem_analysis");
-  }
-
-  @Test
-  public void testInvalidateNonStringPartition() throws IOException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b int)  stored as RCFILE";
-
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(40000,response.getResponseCode());
-    assertEquals("FAILED: SemanticException Operation not supported. HCatalog only supports partition columns of type string. For column: b Found type: int",
-        response.getErrorMessage());
-
-  }
-
-  @Test
-  public void testInvalidateSeqFileStoredAs() throws IOException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string)  stored as SEQUENCEFILE";
-
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(0,response.getResponseCode());
-
-  }
-
-  @Test
-  public void testInvalidateTextFileStoredAs() throws IOException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string)  stored as TEXTFILE";
-
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(0,response.getResponseCode());
-
-  }
-
-  @Test
-  public void testInvalidateClusteredBy() throws IOException, CommandNeedRetryException{
-
-    hcatDriver.run("drop table junit_sem_analysis");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string) clustered by (a) into 10 buckets stored as TEXTFILE";
-
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(0,response.getResponseCode());
-  }
-
-  @Test
-  public void testCTLFail() throws IOException, CommandNeedRetryException{
-
-    driver.run("drop table junit_sem_analysis");
-    driver.run("drop table like_table");
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE";
-
-    driver.run(query);
-    query = "create table like_table like junit_sem_analysis";
-    CommandProcessorResponse response = hcatDriver.run(query);
-    assertEquals(0,response.getResponseCode());
-  }
-
-  @Test
-  public void testCTLPass() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException{
-
-    try{
-      hcatDriver.run("drop table junit_sem_analysis");
+    @Test
+    public void testCreateTblWithLowerCasePartNames() throws CommandNeedRetryException, MetaException, TException, NoSuchObjectException {
+        driver.run("drop table junit_sem_analysis");
+        CommandProcessorResponse resp = driver.run("create table junit_sem_analysis (a int) partitioned by (B string) stored as TEXTFILE");
+        assertEquals(resp.getResponseCode(), 0);
+        assertEquals(null, resp.getErrorMessage());
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        assertEquals("Partition key name case problem", "b", tbl.getPartitionKeys().get(0).getName());
+        driver.run("drop table junit_sem_analysis");
     }
-    catch( Exception e){
-      LOG.error("Error in drop table.",e);
-    }
-    query =  "create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE";
 
-    hcatDriver.run(query);
-    String likeTbl = "like_table";
-    hcatDriver.run("drop table "+likeTbl);
-    query = "create table like_table like junit_sem_analysis";
-    CommandProcessorResponse resp = hcatDriver.run(query);
-    assertEquals(0, resp.getResponseCode());
+    @Test
+    public void testAlterTblFFpart() throws MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        driver.run("drop table junit_sem_analysis");
+        driver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as TEXTFILE");
+        driver.run("alter table junit_sem_analysis add partition (b='2010-10-10')");
+        hcatDriver.run("alter table junit_sem_analysis partition (b='2010-10-10') set fileformat RCFILE");
+
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        assertEquals(TextInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(HiveIgnoreKeyTextOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        List<String> partVals = new ArrayList<String>(1);
+        partVals.add("2010-10-10");
+        Partition part = client.getPartition(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME, partVals);
+
+        assertEquals(RCFileInputFormat.class.getName(), part.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), part.getSd().getOutputFormat());
+
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testUsNonExistentDB() throws CommandNeedRetryException {
+        CommandProcessorResponse resp = hcatDriver.run("use no_such_db");
+        assertEquals(1, resp.getResponseCode());
+    }
+
+    @Test
+    public void testDatabaseOperations() throws MetaException, CommandNeedRetryException {
+
+        List<String> dbs = client.getAllDatabases();
+        String testDb1 = "testdatabaseoperatons1";
+        String testDb2 = "testdatabaseoperatons2";
+
+        if (dbs.contains(testDb1.toLowerCase())) {
+            assertEquals(0, hcatDriver.run("drop database " + testDb1).getResponseCode());
+        }
+
+        if (dbs.contains(testDb2.toLowerCase())) {
+            assertEquals(0, hcatDriver.run("drop database " + testDb2).getResponseCode());
+        }
+
+        assertEquals(0, hcatDriver.run("create database " + testDb1).getResponseCode());
+        assertTrue(client.getAllDatabases().contains(testDb1));
+        assertEquals(0, hcatDriver.run("create database if not exists " + testDb1).getResponseCode());
+        assertTrue(client.getAllDatabases().contains(testDb1));
+        assertEquals(0, hcatDriver.run("create database if not exists " + testDb2).getResponseCode());
+        assertTrue(client.getAllDatabases().contains(testDb2));
+
+        assertEquals(0, hcatDriver.run("drop database " + testDb1).getResponseCode());
+        assertEquals(0, hcatDriver.run("drop database " + testDb2).getResponseCode());
+        assertFalse(client.getAllDatabases().contains(testDb1));
+        assertFalse(client.getAllDatabases().contains(testDb2));
+    }
+
+    @Test
+    public void testCreateTableIfNotExists() throws MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table " + TBL_NAME);
+        hcatDriver.run("create table junit_sem_analysis (a int) stored as RCFILE");
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        List<FieldSchema> cols = tbl.getSd().getCols();
+        assertEquals(1, cols.size());
+        assertTrue(cols.get(0).equals(new FieldSchema("a", "int", null)));
+        assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        CommandProcessorResponse resp = hcatDriver.run("create table if not exists junit_sem_analysis (a int) stored as RCFILE");
+        assertEquals(0, resp.getResponseCode());
+        assertNull(resp.getErrorMessage());
+        tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        cols = tbl.getSd().getCols();
+        assertEquals(1, cols.size());
+        assertTrue(cols.get(0).equals(new FieldSchema("a", "int", null)));
+        assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAlterTblTouch() throws CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis touch");
+        assertEquals(0, response.getResponseCode());
+
+        hcatDriver.run("alter table junit_sem_analysis touch partition (b='12')");
+        assertEquals(0, response.getResponseCode());
+
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testChangeColumns() throws CommandNeedRetryException {
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int, c string) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis change a a1 int");
+        assertEquals(0, response.getResponseCode());
+
+        response = hcatDriver.run("alter table junit_sem_analysis change a1 a string");
+        assertEquals(0, response.getResponseCode());
+
+        response = hcatDriver.run("alter table junit_sem_analysis change a a int after c");
+        assertEquals(0, response.getResponseCode());
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAddReplaceCols() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int, c string) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis replace columns (a1 tinyint)");
+        assertEquals(0, response.getResponseCode());
+
+        response = hcatDriver.run("alter table junit_sem_analysis add columns (d tinyint)");
+        assertEquals(0, response.getResponseCode());
+        assertNull(response.getErrorMessage());
+
+        response = hcatDriver.run("describe extended junit_sem_analysis");
+        assertEquals(0, response.getResponseCode());
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        List<FieldSchema> cols = tbl.getSd().getCols();
+        assertEquals(2, cols.size());
+        assertTrue(cols.get(0).equals(new FieldSchema("a1", "tinyint", null)));
+        assertTrue(cols.get(1).equals(new FieldSchema("d", "tinyint", null)));
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAlterTblClusteredBy() throws CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis clustered by (a) into 7 buckets");
+        assertEquals(0, response.getResponseCode());
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAlterTableSetFF() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
+
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        hcatDriver.run("alter table junit_sem_analysis set fileformat INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
+                "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver'");
+        hcatDriver.run("desc extended junit_sem_analysis");
+
+        tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAddPartFail() throws CommandNeedRetryException {
+
+        driver.run("drop table junit_sem_analysis");
+        driver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis add partition (b='2') location 'README.txt'");
+        assertEquals(0, response.getResponseCode());
+        driver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAddPartPass() throws IOException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        hcatDriver.run("create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE");
+        CommandProcessorResponse response = hcatDriver.run("alter table junit_sem_analysis add partition (b='2') location '" + TEST_DATA_DIR + "'");
+        assertEquals(0, response.getResponseCode());
+        assertNull(response.getErrorMessage());
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testCTAS() throws CommandNeedRetryException {
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) as select * from tbl2";
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(40000, response.getResponseCode());
+        assertTrue(response.getErrorMessage().contains("FAILED: SemanticException Operation not supported. Create table as Select is not a valid operation."));
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testStoredAs() throws CommandNeedRetryException {
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int)";
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(0, response.getResponseCode());
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testAddDriverInfo() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) partitioned by (b string)  stored as " +
+                "INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
+                "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver' ";
+        assertEquals(0, hcatDriver.run(query).getResponseCode());
+
+        Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, TBL_NAME);
+        assertEquals(RCFileInputFormat.class.getName(), tbl.getSd().getInputFormat());
+        assertEquals(RCFileOutputFormat.class.getName(), tbl.getSd().getOutputFormat());
+
+        hcatDriver.run("drop table junit_sem_analysis");
+    }
+
+    @Test
+    public void testInvalidateNonStringPartition() throws IOException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) partitioned by (b int)  stored as RCFILE";
+
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(40000, response.getResponseCode());
+        assertEquals("FAILED: SemanticException Operation not supported. HCatalog only supports partition columns of type string. For column: b Found type: int",
+                response.getErrorMessage());
+
+    }
+
+    @Test
+    public void testInvalidateSeqFileStoredAs() throws IOException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) partitioned by (b string)  stored as SEQUENCEFILE";
+
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(0, response.getResponseCode());
+
+    }
+
+    @Test
+    public void testInvalidateTextFileStoredAs() throws IOException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) partitioned by (b string)  stored as TEXTFILE";
+
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(0, response.getResponseCode());
+
+    }
+
+    @Test
+    public void testInvalidateClusteredBy() throws IOException, CommandNeedRetryException {
+
+        hcatDriver.run("drop table junit_sem_analysis");
+        query = "create table junit_sem_analysis (a int) partitioned by (b string) clustered by (a) into 10 buckets stored as TEXTFILE";
+
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(0, response.getResponseCode());
+    }
+
+    @Test
+    public void testCTLFail() throws IOException, CommandNeedRetryException {
+
+        driver.run("drop table junit_sem_analysis");
+        driver.run("drop table like_table");
+        query = "create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE";
+
+        driver.run(query);
+        query = "create table like_table like junit_sem_analysis";
+        CommandProcessorResponse response = hcatDriver.run(query);
+        assertEquals(0, response.getResponseCode());
+    }
+
+    @Test
+    public void testCTLPass() throws IOException, MetaException, TException, NoSuchObjectException, CommandNeedRetryException {
+
+        try {
+            hcatDriver.run("drop table junit_sem_analysis");
+        } catch (Exception e) {
+            LOG.error("Error in drop table.", e);
+        }
+        query = "create table junit_sem_analysis (a int) partitioned by (b string) stored as RCFILE";
+
+        hcatDriver.run(query);
+        String likeTbl = "like_table";
+        hcatDriver.run("drop table " + likeTbl);
+        query = "create table like_table like junit_sem_analysis";
+        CommandProcessorResponse resp = hcatDriver.run(query);
+        assertEquals(0, resp.getResponseCode());
 //    Table tbl = client.getTable(MetaStoreUtils.DEFAULT_DATABASE_NAME, likeTbl);
 //    assertEquals(likeTbl,tbl.getTableName());
 //    List<FieldSchema> cols = tbl.getSd().getCols();
@@ -399,7 +398,7 @@
 //
 //    hcatDriver.run("drop table junit_sem_analysis");
 //    hcatDriver.run("drop table "+likeTbl);
-  }
+    }
 
 // This test case currently fails, since add partitions don't inherit anything from tables.
 
diff --git a/src/test/org/apache/hcatalog/cli/TestUseDatabase.java b/src/test/org/apache/hcatalog/cli/TestUseDatabase.java
index 403a13f..e97a9c2 100644
--- a/src/test/org/apache/hcatalog/cli/TestUseDatabase.java
+++ b/src/test/org/apache/hcatalog/cli/TestUseDatabase.java
@@ -31,46 +31,46 @@
 import org.apache.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzer;
 
 /* Unit test for GitHub Howl issue #3 */
-public class TestUseDatabase extends TestCase{
+public class TestUseDatabase extends TestCase {
 
-  private Driver hcatDriver;
+    private Driver hcatDriver;
 
-  @Override
-  protected void setUp() throws Exception {
+    @Override
+    protected void setUp() throws Exception {
 
-    HiveConf hcatConf = new HiveConf(this.getClass());
-    hcatConf.set(ConfVars.PREEXECHOOKS.varname, "");
-    hcatConf.set(ConfVars.POSTEXECHOOKS.varname, "");
-    hcatConf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        HiveConf hcatConf = new HiveConf(this.getClass());
+        hcatConf.set(ConfVars.PREEXECHOOKS.varname, "");
+        hcatConf.set(ConfVars.POSTEXECHOOKS.varname, "");
+        hcatConf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
 
-    hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
-    hcatDriver = new Driver(hcatConf);
-    SessionState.start(new CliSessionState(hcatConf));
-  }
+        hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
+        hcatDriver = new Driver(hcatConf);
+        SessionState.start(new CliSessionState(hcatConf));
+    }
 
-  String query;
-  private final String dbName = "testUseDatabase_db";
-  private final String tblName = "testUseDatabase_tbl";
+    String query;
+    private final String dbName = "testUseDatabase_db";
+    private final String tblName = "testUseDatabase_tbl";
 
-  public void testAlterTablePass() throws IOException, CommandNeedRetryException{
+    public void testAlterTablePass() throws IOException, CommandNeedRetryException {
 
-    hcatDriver.run("create database " + dbName);
-    hcatDriver.run("use " + dbName);
-    hcatDriver.run("create table " + tblName + " (a int) partitioned by (b string) stored as RCFILE");
+        hcatDriver.run("create database " + dbName);
+        hcatDriver.run("use " + dbName);
+        hcatDriver.run("create table " + tblName + " (a int) partitioned by (b string) stored as RCFILE");
 
-    CommandProcessorResponse response;
+        CommandProcessorResponse response;
 
-    response = hcatDriver.run("alter table " + tblName + " add partition (b='2') location '/tmp'");
-    assertEquals(0, response.getResponseCode());
-    assertNull(response.getErrorMessage());
+        response = hcatDriver.run("alter table " + tblName + " add partition (b='2') location '/tmp'");
+        assertEquals(0, response.getResponseCode());
+        assertNull(response.getErrorMessage());
 
-    response = hcatDriver.run("alter table " + tblName + " set fileformat INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
-        "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver'");
-    assertEquals(0, response.getResponseCode());
-    assertNull(response.getErrorMessage());
+        response = hcatDriver.run("alter table " + tblName + " set fileformat INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT " +
+                "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver 'mydriver' outputdriver 'yourdriver'");
+        assertEquals(0, response.getResponseCode());
+        assertNull(response.getErrorMessage());
 
-    hcatDriver.run("drop table " + tblName);
-    hcatDriver.run("drop database " + dbName);
-  }
+        hcatDriver.run("drop table " + tblName);
+        hcatDriver.run("drop database " + dbName);
+    }
 
 }
diff --git a/src/test/org/apache/hcatalog/common/TestHCatUtil.java b/src/test/org/apache/hcatalog/common/TestHCatUtil.java
index 29675ce..0adba5a 100644
--- a/src/test/org/apache/hcatalog/common/TestHCatUtil.java
+++ b/src/test/org/apache/hcatalog/common/TestHCatUtil.java
@@ -41,142 +41,142 @@
 
 public class TestHCatUtil {
 
-  @Test
-  public void testFsPermissionOperation(){
+    @Test
+    public void testFsPermissionOperation() {
 
-    HashMap<String,Integer> permsCode = new HashMap<String,Integer>();
+        HashMap<String, Integer> permsCode = new HashMap<String, Integer>();
 
-    for (int i = 0; i < 8; i++){
-      for (int j = 0; j < 8; j++){
-        for (int k = 0; k < 8; k++){
-          StringBuilder sb = new StringBuilder();
-          sb.append("0");
-          sb.append(i);
-          sb.append(j);
-          sb.append(k);
-          Integer code = (((i*8)+j)*8)+k;
-          String perms = (new FsPermission(Short.decode(sb.toString()))).toString();
-          if (permsCode.containsKey(perms)){
-            Assert.assertEquals("permissions(" + perms + ") mapped to multiple codes", code, permsCode.get(perms));
-          }
-          permsCode.put(perms, code);
-          assertFsPermissionTransformationIsGood(perms);
+        for (int i = 0; i < 8; i++) {
+            for (int j = 0; j < 8; j++) {
+                for (int k = 0; k < 8; k++) {
+                    StringBuilder sb = new StringBuilder();
+                    sb.append("0");
+                    sb.append(i);
+                    sb.append(j);
+                    sb.append(k);
+                    Integer code = (((i * 8) + j) * 8) + k;
+                    String perms = (new FsPermission(Short.decode(sb.toString()))).toString();
+                    if (permsCode.containsKey(perms)) {
+                        Assert.assertEquals("permissions(" + perms + ") mapped to multiple codes", code, permsCode.get(perms));
+                    }
+                    permsCode.put(perms, code);
+                    assertFsPermissionTransformationIsGood(perms);
+                }
+            }
         }
-      }
     }
-  }
 
-  private void assertFsPermissionTransformationIsGood(String perms) {
-    Assert.assertEquals(perms, FsPermission.valueOf("-" + perms).toString());
-  }
+    private void assertFsPermissionTransformationIsGood(String perms) {
+        Assert.assertEquals(perms, FsPermission.valueOf("-" + perms).toString());
+    }
 
-  @Test
-  public void testValidateMorePermissive(){
-    assertConsistentFsPermissionBehaviour(FsAction.ALL,true,true,true,true,true,true,true,true);
-    assertConsistentFsPermissionBehaviour(FsAction.READ,false,true,false,true,false,false,false,false);
-    assertConsistentFsPermissionBehaviour(FsAction.WRITE,false,true,false,false,true,false,false,false);
-    assertConsistentFsPermissionBehaviour(FsAction.EXECUTE,false,true,true,false,false,false,false,false);
-    assertConsistentFsPermissionBehaviour(FsAction.READ_EXECUTE,false,true,true,true,false,true,false,false);
-    assertConsistentFsPermissionBehaviour(FsAction.READ_WRITE,false,true,false,true,true,false,true,false);
-    assertConsistentFsPermissionBehaviour(FsAction.WRITE_EXECUTE,false,true,true,false,true,false,false,true);
-    assertConsistentFsPermissionBehaviour(FsAction.NONE,false,true,false,false,false,false,false,false);
-  }
+    @Test
+    public void testValidateMorePermissive() {
+        assertConsistentFsPermissionBehaviour(FsAction.ALL, true, true, true, true, true, true, true, true);
+        assertConsistentFsPermissionBehaviour(FsAction.READ, false, true, false, true, false, false, false, false);
+        assertConsistentFsPermissionBehaviour(FsAction.WRITE, false, true, false, false, true, false, false, false);
+        assertConsistentFsPermissionBehaviour(FsAction.EXECUTE, false, true, true, false, false, false, false, false);
+        assertConsistentFsPermissionBehaviour(FsAction.READ_EXECUTE, false, true, true, true, false, true, false, false);
+        assertConsistentFsPermissionBehaviour(FsAction.READ_WRITE, false, true, false, true, true, false, true, false);
+        assertConsistentFsPermissionBehaviour(FsAction.WRITE_EXECUTE, false, true, true, false, true, false, false, true);
+        assertConsistentFsPermissionBehaviour(FsAction.NONE, false, true, false, false, false, false, false, false);
+    }
 
 
-  private void assertConsistentFsPermissionBehaviour(
-      FsAction base, boolean versusAll, boolean versusNone,
-      boolean versusX, boolean versusR, boolean versusW,
-      boolean versusRX, boolean versusRW,  boolean versusWX){
+    private void assertConsistentFsPermissionBehaviour(
+            FsAction base, boolean versusAll, boolean versusNone,
+            boolean versusX, boolean versusR, boolean versusW,
+            boolean versusRX, boolean versusRW, boolean versusWX) {
 
-    Assert.assertTrue(versusAll == HCatUtil.validateMorePermissive(base, FsAction.ALL));
-    Assert.assertTrue(versusX == HCatUtil.validateMorePermissive(base, FsAction.EXECUTE));
-    Assert.assertTrue(versusNone == HCatUtil.validateMorePermissive(base, FsAction.NONE));
-    Assert.assertTrue(versusR == HCatUtil.validateMorePermissive(base, FsAction.READ));
-    Assert.assertTrue(versusRX == HCatUtil.validateMorePermissive(base, FsAction.READ_EXECUTE));
-    Assert.assertTrue(versusRW == HCatUtil.validateMorePermissive(base, FsAction.READ_WRITE));
-    Assert.assertTrue(versusW == HCatUtil.validateMorePermissive(base, FsAction.WRITE));
-    Assert.assertTrue(versusWX == HCatUtil.validateMorePermissive(base, FsAction.WRITE_EXECUTE));
-  }
+        Assert.assertTrue(versusAll == HCatUtil.validateMorePermissive(base, FsAction.ALL));
+        Assert.assertTrue(versusX == HCatUtil.validateMorePermissive(base, FsAction.EXECUTE));
+        Assert.assertTrue(versusNone == HCatUtil.validateMorePermissive(base, FsAction.NONE));
+        Assert.assertTrue(versusR == HCatUtil.validateMorePermissive(base, FsAction.READ));
+        Assert.assertTrue(versusRX == HCatUtil.validateMorePermissive(base, FsAction.READ_EXECUTE));
+        Assert.assertTrue(versusRW == HCatUtil.validateMorePermissive(base, FsAction.READ_WRITE));
+        Assert.assertTrue(versusW == HCatUtil.validateMorePermissive(base, FsAction.WRITE));
+        Assert.assertTrue(versusWX == HCatUtil.validateMorePermissive(base, FsAction.WRITE_EXECUTE));
+    }
 
-  @Test
-  public void testExecutePermissionsCheck(){
-    Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.ALL));
-    Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.NONE));
-    Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.EXECUTE));
-    Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ_EXECUTE));
-    Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.WRITE_EXECUTE));
+    @Test
+    public void testExecutePermissionsCheck() {
+        Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.ALL));
+        Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.NONE));
+        Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.EXECUTE));
+        Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ_EXECUTE));
+        Assert.assertTrue(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.WRITE_EXECUTE));
 
-    Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ));
-    Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.WRITE));
-    Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ_WRITE));
+        Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ));
+        Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.WRITE));
+        Assert.assertFalse(HCatUtil.validateExecuteBitPresentIfReadOrWrite(FsAction.READ_WRITE));
 
-  }
+    }
 
-  @Test
-  public void testGetTableSchemaWithPtnColsApi() throws IOException {
-    // Check the schema of a table with one field & no partition keys.
-    StorageDescriptor sd = new StorageDescriptor(
-        Lists.newArrayList(new FieldSchema("username", Constants.STRING_TYPE_NAME, null)),
-        "location", "org.apache.hadoop.mapred.TextInputFormat",
-        "org.apache.hadoop.mapred.TextOutputFormat", false, -1, new SerDeInfo(),
-        new ArrayList<String>(), new ArrayList<Order>(), new HashMap<String, String>());
-    org.apache.hadoop.hive.metastore.api.Table apiTable =
-        new org.apache.hadoop.hive.metastore.api.Table("test_tblname", "test_dbname", "test_owner",
-            0, 0, 0, sd, new ArrayList<FieldSchema>(), new HashMap<String, String>(),
-            "viewOriginalText", "viewExpandedText", TableType.EXTERNAL_TABLE.name());
-    Table table = new Table(apiTable);
+    @Test
+    public void testGetTableSchemaWithPtnColsApi() throws IOException {
+        // Check the schema of a table with one field & no partition keys.
+        StorageDescriptor sd = new StorageDescriptor(
+                Lists.newArrayList(new FieldSchema("username", Constants.STRING_TYPE_NAME, null)),
+                "location", "org.apache.hadoop.mapred.TextInputFormat",
+                "org.apache.hadoop.mapred.TextOutputFormat", false, -1, new SerDeInfo(),
+                new ArrayList<String>(), new ArrayList<Order>(), new HashMap<String, String>());
+        org.apache.hadoop.hive.metastore.api.Table apiTable =
+                new org.apache.hadoop.hive.metastore.api.Table("test_tblname", "test_dbname", "test_owner",
+                        0, 0, 0, sd, new ArrayList<FieldSchema>(), new HashMap<String, String>(),
+                        "viewOriginalText", "viewExpandedText", TableType.EXTERNAL_TABLE.name());
+        Table table = new Table(apiTable);
 
-    List<HCatFieldSchema> expectedHCatSchema =
-        Lists.newArrayList(new HCatFieldSchema("username", HCatFieldSchema.Type.STRING, null));
+        List<HCatFieldSchema> expectedHCatSchema =
+                Lists.newArrayList(new HCatFieldSchema("username", HCatFieldSchema.Type.STRING, null));
 
-    Assert.assertEquals(new HCatSchema(expectedHCatSchema),
-        HCatUtil.getTableSchemaWithPtnCols(table));
+        Assert.assertEquals(new HCatSchema(expectedHCatSchema),
+                HCatUtil.getTableSchemaWithPtnCols(table));
 
-    // Add a partition key & ensure its reflected in the schema.
-    List<FieldSchema> partitionKeys =
-        Lists.newArrayList(new FieldSchema("dt", Constants.STRING_TYPE_NAME, null));
-    table.getTTable().setPartitionKeys(partitionKeys);
-    expectedHCatSchema.add(new HCatFieldSchema("dt", HCatFieldSchema.Type.STRING, null));
-    Assert.assertEquals(new HCatSchema(expectedHCatSchema),
-        HCatUtil.getTableSchemaWithPtnCols(table));
-  }
+        // Add a partition key & ensure its reflected in the schema.
+        List<FieldSchema> partitionKeys =
+                Lists.newArrayList(new FieldSchema("dt", Constants.STRING_TYPE_NAME, null));
+        table.getTTable().setPartitionKeys(partitionKeys);
+        expectedHCatSchema.add(new HCatFieldSchema("dt", HCatFieldSchema.Type.STRING, null));
+        Assert.assertEquals(new HCatSchema(expectedHCatSchema),
+                HCatUtil.getTableSchemaWithPtnCols(table));
+    }
 
-  /**
-   * Hive represents tables in two ways:
-   * <ul>
-   *   <li>org.apache.hadoop.hive.metastore.api.Table - exactly whats stored in the metastore</li>
-   *   <li>org.apache.hadoop.hive.ql.metadata.Table - adds business logic over api.Table</li>
-   * </ul>
-   * Here we check SerDe-reported fields are included in the table schema.
-   */
-  @Test
-  public void testGetTableSchemaWithPtnColsSerDeReportedFields() throws IOException {
-    Map<String, String> parameters = Maps.newHashMap();
-    parameters.put(Constants.SERIALIZATION_CLASS,
-        "org.apache.hadoop.hive.serde2.thrift.test.IntString");
-    parameters.put(Constants.SERIALIZATION_FORMAT, "org.apache.thrift.protocol.TBinaryProtocol");
+    /**
+     * Hive represents tables in two ways:
+     * <ul>
+     *   <li>org.apache.hadoop.hive.metastore.api.Table - exactly whats stored in the metastore</li>
+     *   <li>org.apache.hadoop.hive.ql.metadata.Table - adds business logic over api.Table</li>
+     * </ul>
+     * Here we check SerDe-reported fields are included in the table schema.
+     */
+    @Test
+    public void testGetTableSchemaWithPtnColsSerDeReportedFields() throws IOException {
+        Map<String, String> parameters = Maps.newHashMap();
+        parameters.put(Constants.SERIALIZATION_CLASS,
+                "org.apache.hadoop.hive.serde2.thrift.test.IntString");
+        parameters.put(Constants.SERIALIZATION_FORMAT, "org.apache.thrift.protocol.TBinaryProtocol");
 
-    SerDeInfo serDeInfo = new SerDeInfo(null,
-        "org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer", parameters);
+        SerDeInfo serDeInfo = new SerDeInfo(null,
+                "org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer", parameters);
 
-    // StorageDescriptor has an empty list of fields - SerDe will report them.
-    StorageDescriptor sd = new StorageDescriptor(new ArrayList<FieldSchema>(), "location",
-        "org.apache.hadoop.mapred.TextInputFormat", "org.apache.hadoop.mapred.TextOutputFormat",
-        false, -1, serDeInfo, new ArrayList<String>(), new ArrayList<Order>(),
-        new HashMap<String, String>());
+        // StorageDescriptor has an empty list of fields - SerDe will report them.
+        StorageDescriptor sd = new StorageDescriptor(new ArrayList<FieldSchema>(), "location",
+                "org.apache.hadoop.mapred.TextInputFormat", "org.apache.hadoop.mapred.TextOutputFormat",
+                false, -1, serDeInfo, new ArrayList<String>(), new ArrayList<Order>(),
+                new HashMap<String, String>());
 
-    org.apache.hadoop.hive.metastore.api.Table apiTable =
-        new org.apache.hadoop.hive.metastore.api.Table("test_tblname", "test_dbname", "test_owner",
-            0, 0, 0, sd, new ArrayList<FieldSchema>(), new HashMap<String, String>(),
-            "viewOriginalText", "viewExpandedText", TableType.EXTERNAL_TABLE.name());
-    Table table = new Table(apiTable);
+        org.apache.hadoop.hive.metastore.api.Table apiTable =
+                new org.apache.hadoop.hive.metastore.api.Table("test_tblname", "test_dbname", "test_owner",
+                        0, 0, 0, sd, new ArrayList<FieldSchema>(), new HashMap<String, String>(),
+                        "viewOriginalText", "viewExpandedText", TableType.EXTERNAL_TABLE.name());
+        Table table = new Table(apiTable);
 
-    List<HCatFieldSchema> expectedHCatSchema = Lists.newArrayList(
-        new HCatFieldSchema("myint", HCatFieldSchema.Type.INT, null),
-        new HCatFieldSchema("mystring", HCatFieldSchema.Type.STRING, null),
-        new HCatFieldSchema("underscore_int", HCatFieldSchema.Type.INT, null));
+        List<HCatFieldSchema> expectedHCatSchema = Lists.newArrayList(
+                new HCatFieldSchema("myint", HCatFieldSchema.Type.INT, null),
+                new HCatFieldSchema("mystring", HCatFieldSchema.Type.STRING, null),
+                new HCatFieldSchema("underscore_int", HCatFieldSchema.Type.INT, null));
 
-    Assert.assertEquals(new HCatSchema(expectedHCatSchema),
-        HCatUtil.getTableSchemaWithPtnCols(table));
-  }
+        Assert.assertEquals(new HCatSchema(expectedHCatSchema),
+                HCatUtil.getTableSchemaWithPtnCols(table));
+    }
 }
diff --git a/src/test/org/apache/hcatalog/common/TestHiveClientCache.java b/src/test/org/apache/hcatalog/common/TestHiveClientCache.java
index 91c9e38..286f32c 100644
--- a/src/test/org/apache/hcatalog/common/TestHiveClientCache.java
+++ b/src/test/org/apache/hcatalog/common/TestHiveClientCache.java
@@ -34,6 +34,7 @@
 import org.apache.thrift.TException;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -74,13 +75,13 @@
     public void testCacheHit() throws IOException, MetaException, LoginException {
 
         HiveClientCache cache = new HiveClientCache(1000);
-        HiveMetaStoreClient  client = cache.get(hiveConf);
+        HiveMetaStoreClient client = cache.get(hiveConf);
         assertNotNull(client);
         client.close(); // close shouldn't matter
 
         // Setting a non important configuration should return the same client only
         hiveConf.setIntVar(HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS, 10);
-        HiveMetaStoreClient  client2 = cache.get(hiveConf);
+        HiveMetaStoreClient client2 = cache.get(hiveConf);
         assertNotNull(client2);
         assertEquals(client, client2);
         client2.close();
@@ -89,12 +90,12 @@
     @Test
     public void testCacheMiss() throws IOException, MetaException, LoginException {
         HiveClientCache cache = new HiveClientCache(1000);
-        HiveMetaStoreClient  client = cache.get(hiveConf);
+        HiveMetaStoreClient client = cache.get(hiveConf);
         assertNotNull(client);
 
         // Set different uri as it is one of the criteria deciding whether to return the same client or not
         hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, " "); // URIs are checked for string equivalence, even spaces make them different
-        HiveMetaStoreClient  client2 = cache.get(hiveConf);
+        HiveMetaStoreClient client2 = cache.get(hiveConf);
         assertNotNull(client2);
         assertNotSame(client, client2);
     }
@@ -106,7 +107,7 @@
     @Test
     public void testCacheExpiry() throws IOException, MetaException, LoginException, InterruptedException {
         HiveClientCache cache = new HiveClientCache(1);
-        HiveClientCache.CacheableHiveMetaStoreClient client = (HiveClientCache.CacheableHiveMetaStoreClient)cache.get(hiveConf);
+        HiveClientCache.CacheableHiveMetaStoreClient client = (HiveClientCache.CacheableHiveMetaStoreClient) cache.get(hiveConf);
         assertNotNull(client);
 
         Thread.sleep(2500);
@@ -165,9 +166,9 @@
      */
     @Test
     public void testHMSCBreakability() throws IOException, MetaException, LoginException, TException, AlreadyExistsException,
-        InvalidObjectException, NoSuchObjectException, InterruptedException {
+            InvalidObjectException, NoSuchObjectException, InterruptedException {
         // Setup
-        LocalMetaServer metaServer =  new LocalMetaServer();
+        LocalMetaServer metaServer = new LocalMetaServer();
         metaServer.start();
 
         final HiveClientCache cache = new HiveClientCache(1000);
@@ -253,6 +254,7 @@
         public HiveConf getHiveConf() {
             return hiveConf;
         }
+
         public void shutDown() {
             System.setSecurityManager(securityManager);
         }
diff --git a/src/test/org/apache/hcatalog/data/HCatDataCheckUtil.java b/src/test/org/apache/hcatalog/data/HCatDataCheckUtil.java
index 1973285..dc09fdb 100644
--- a/src/test/org/apache/hcatalog/data/HCatDataCheckUtil.java
+++ b/src/test/org/apache/hcatalog/data/HCatDataCheckUtil.java
@@ -36,78 +36,78 @@
  */
 public class HCatDataCheckUtil {
 
-  private static final Logger LOG = LoggerFactory.getLogger(HCatDataCheckUtil.class);
+    private static final Logger LOG = LoggerFactory.getLogger(HCatDataCheckUtil.class);
 
-  public static Driver instantiateDriver(MiniCluster cluster) {
-    HiveConf hiveConf = new HiveConf(HCatDataCheckUtil.class);
-    for (Entry e : cluster.getProperties().entrySet()){
-      hiveConf.set(e.getKey().toString(), e.getValue().toString());
-    }
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-
-    LOG.debug("Hive conf : {}", hiveConf.getAllProperties());
-    Driver driver = new Driver(hiveConf);
-    SessionState.start(new CliSessionState(hiveConf));
-    return driver;
-  }
-
-  public static void generateDataFile(MiniCluster cluster, String fileName) throws IOException {
-    MiniCluster.deleteFile(cluster, fileName);
-    String[] input = new String[50];
-    for(int i = 0; i < 50; i++) {
-      input[i] = (i % 5) + "\t" + i  + "\t" + "_S" + i + "S_";
-    }
-    MiniCluster.createInputFile(cluster, fileName, input);
-  }
-
-  public static void createTable(Driver driver, String tableName, String createTableArgs)
-      throws CommandNeedRetryException, IOException {
-    String createTable = "create table " + tableName + createTableArgs;
-    int retCode = driver.run(createTable).getResponseCode();
-    if(retCode != 0) {
-      throw new IOException("Failed to create table. ["+createTable+"], return code from hive driver : ["+retCode+"]");
-    }
-  }
-
-  public static void dropTable(Driver driver, String tablename) throws IOException, CommandNeedRetryException{
-    driver.run("drop table if exists "+tablename);
-  }
-
-  public static ArrayList<String> formattedRun(Driver driver, String name, String selectCmd)
-      throws CommandNeedRetryException, IOException {
-    driver.run(selectCmd);
-    ArrayList<String> src_values = new ArrayList<String>();
-    driver.getResults(src_values);
-    LOG.info("{} : {}", name, src_values);
-    return src_values;
-  }
-
-
-  public static boolean recordsEqual(HCatRecord first, HCatRecord second) {
-    return (compareRecords(first,second) == 0);
-  }
-
-  public static int compareRecords(HCatRecord first, HCatRecord second) {
-    return compareRecordContents(first.getAll(), second.getAll());
-  }
-
-  public static int compareRecordContents(List<Object> first, List<Object> second) {
-    int mySz = first.size();
-    int urSz = second.size();
-    if(mySz != urSz) {
-      return mySz - urSz;
-    } else {
-      for (int i = 0; i < first.size(); i++) {
-        int c = DataType.compare(first.get(i), second.get(i));
-        if (c != 0) {
-          return c;
+    public static Driver instantiateDriver(MiniCluster cluster) {
+        HiveConf hiveConf = new HiveConf(HCatDataCheckUtil.class);
+        for (Entry e : cluster.getProperties().entrySet()) {
+            hiveConf.set(e.getKey().toString(), e.getValue().toString());
         }
-      }
-      return 0;
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+
+        LOG.debug("Hive conf : {}", hiveConf.getAllProperties());
+        Driver driver = new Driver(hiveConf);
+        SessionState.start(new CliSessionState(hiveConf));
+        return driver;
     }
-  }
+
+    public static void generateDataFile(MiniCluster cluster, String fileName) throws IOException {
+        MiniCluster.deleteFile(cluster, fileName);
+        String[] input = new String[50];
+        for (int i = 0; i < 50; i++) {
+            input[i] = (i % 5) + "\t" + i + "\t" + "_S" + i + "S_";
+        }
+        MiniCluster.createInputFile(cluster, fileName, input);
+    }
+
+    public static void createTable(Driver driver, String tableName, String createTableArgs)
+        throws CommandNeedRetryException, IOException {
+        String createTable = "create table " + tableName + createTableArgs;
+        int retCode = driver.run(createTable).getResponseCode();
+        if (retCode != 0) {
+            throw new IOException("Failed to create table. [" + createTable + "], return code from hive driver : [" + retCode + "]");
+        }
+    }
+
+    public static void dropTable(Driver driver, String tablename) throws IOException, CommandNeedRetryException {
+        driver.run("drop table if exists " + tablename);
+    }
+
+    public static ArrayList<String> formattedRun(Driver driver, String name, String selectCmd)
+        throws CommandNeedRetryException, IOException {
+        driver.run(selectCmd);
+        ArrayList<String> src_values = new ArrayList<String>();
+        driver.getResults(src_values);
+        LOG.info("{} : {}", name, src_values);
+        return src_values;
+    }
+
+
+    public static boolean recordsEqual(HCatRecord first, HCatRecord second) {
+        return (compareRecords(first, second) == 0);
+    }
+
+    public static int compareRecords(HCatRecord first, HCatRecord second) {
+        return compareRecordContents(first.getAll(), second.getAll());
+    }
+
+    public static int compareRecordContents(List<Object> first, List<Object> second) {
+        int mySz = first.size();
+        int urSz = second.size();
+        if (mySz != urSz) {
+            return mySz - urSz;
+        } else {
+            for (int i = 0; i < first.size(); i++) {
+                int c = DataType.compare(first.get(i), second.get(i));
+                if (c != 0) {
+                    return c;
+                }
+            }
+            return 0;
+        }
+    }
 
 
 }
diff --git a/src/test/org/apache/hcatalog/data/TestDefaultHCatRecord.java b/src/test/org/apache/hcatalog/data/TestDefaultHCatRecord.java
index 4537219..f86eee0 100644
--- a/src/test/org/apache/hcatalog/data/TestDefaultHCatRecord.java
+++ b/src/test/org/apache/hcatalog/data/TestDefaultHCatRecord.java
@@ -39,221 +39,221 @@
 import junit.framework.Assert;
 import junit.framework.TestCase;
 
-public class TestDefaultHCatRecord extends TestCase{
+public class TestDefaultHCatRecord extends TestCase {
 
-  public void testRYW() throws IOException{
+    public void testRYW() throws IOException {
 
-    File f = new File("binary.dat");
-    f.delete();
-    f.createNewFile();
-    f.deleteOnExit();
+        File f = new File("binary.dat");
+        f.delete();
+        f.createNewFile();
+        f.deleteOnExit();
 
-    OutputStream fileOutStream = new FileOutputStream(f);
-    DataOutput outStream = new DataOutputStream(fileOutStream);
+        OutputStream fileOutStream = new FileOutputStream(f);
+        DataOutput outStream = new DataOutputStream(fileOutStream);
 
-    HCatRecord[]  recs = getHCatRecords();
-    for(int i =0; i < recs.length; i++){
-      recs[i].write(outStream);
-    }
-    fileOutStream.flush();
-    fileOutStream.close();
+        HCatRecord[] recs = getHCatRecords();
+        for (int i = 0; i < recs.length; i++) {
+            recs[i].write(outStream);
+        }
+        fileOutStream.flush();
+        fileOutStream.close();
 
-    InputStream fInStream = new FileInputStream(f);
-    DataInput inpStream = new DataInputStream(fInStream);
+        InputStream fInStream = new FileInputStream(f);
+        DataInput inpStream = new DataInputStream(fInStream);
 
-    for(int i =0; i < recs.length; i++){
-      HCatRecord rec = new DefaultHCatRecord();
-      rec.readFields(inpStream);
-      Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[i],rec));
+        for (int i = 0; i < recs.length; i++) {
+            HCatRecord rec = new DefaultHCatRecord();
+            rec.readFields(inpStream);
+            Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[i], rec));
+        }
+
+        Assert.assertEquals(fInStream.available(), 0);
+        fInStream.close();
+
     }
 
-    Assert.assertEquals(fInStream.available(), 0);
-    fInStream.close();
+    public void testCompareTo() {
+        HCatRecord[] recs = getHCatRecords();
+        Assert.assertTrue(HCatDataCheckUtil.compareRecords(recs[0], recs[1]) == 0);
+        Assert.assertTrue(HCatDataCheckUtil.compareRecords(recs[4], recs[5]) == 0);
+    }
 
-  }
+    public void testEqualsObject() {
 
-  public void testCompareTo() {
-    HCatRecord[] recs = getHCatRecords();
-    Assert.assertTrue(HCatDataCheckUtil.compareRecords(recs[0],recs[1]) == 0);
-    Assert.assertTrue(HCatDataCheckUtil.compareRecords(recs[4],recs[5]) == 0);
-  }
+        HCatRecord[] recs = getHCatRecords();
+        Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[0], recs[1]));
+        Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[4], recs[5]));
+    }
 
-  public void testEqualsObject() {
+    /**
+     * Test get and set calls with type
+     * @throws HCatException
+     */
+    public void testGetSetByType1() throws HCatException {
+        HCatRecord inpRec = getHCatRecords()[0];
+        HCatRecord newRec = new DefaultHCatRecord(inpRec.size());
+        HCatSchema hsch =
+                HCatSchemaUtils.getHCatSchema(
+                        "a:tinyint,b:smallint,c:int,d:bigint,e:float,f:double,g:boolean,h:string,i:binary,j:string");
 
-    HCatRecord[] recs = getHCatRecords();
-    Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[0],recs[1]));
-    Assert.assertTrue(HCatDataCheckUtil.recordsEqual(recs[4],recs[5]));
-  }
 
-  /**
-   * Test get and set calls with type
-   * @throws HCatException
-   */
-  public void testGetSetByType1() throws HCatException{
-    HCatRecord inpRec = getHCatRecords()[0];
-    HCatRecord newRec = new DefaultHCatRecord(inpRec.size());
-    HCatSchema hsch = 
-        HCatSchemaUtils.getHCatSchema(
-            "a:tinyint,b:smallint,c:int,d:bigint,e:float,f:double,g:boolean,h:string,i:binary,j:string");
-    
+        newRec.setByte("a", hsch, inpRec.getByte("a", hsch));
+        newRec.setShort("b", hsch, inpRec.getShort("b", hsch));
+        newRec.setInteger("c", hsch, inpRec.getInteger("c", hsch));
+        newRec.setLong("d", hsch, inpRec.getLong("d", hsch));
+        newRec.setFloat("e", hsch, inpRec.getFloat("e", hsch));
+        newRec.setDouble("f", hsch, inpRec.getDouble("f", hsch));
+        newRec.setBoolean("g", hsch, inpRec.getBoolean("g", hsch));
+        newRec.setString("h", hsch, inpRec.getString("h", hsch));
+        newRec.setByteArray("i", hsch, inpRec.getByteArray("i", hsch));
+        newRec.setString("j", hsch, inpRec.getString("j", hsch));
 
-    newRec.setByte("a", hsch, inpRec.getByte("a", hsch) );
-    newRec.setShort("b", hsch, inpRec.getShort("b", hsch) );
-    newRec.setInteger("c", hsch, inpRec.getInteger("c", hsch) );
-    newRec.setLong("d", hsch, inpRec.getLong("d", hsch) );
-    newRec.setFloat("e", hsch, inpRec.getFloat("e", hsch) );
-    newRec.setDouble("f", hsch, inpRec.getDouble("f", hsch) );
-    newRec.setBoolean("g", hsch, inpRec.getBoolean("g", hsch) );
-    newRec.setString("h", hsch, inpRec.getString("h", hsch) );
-    newRec.setByteArray("i", hsch, inpRec.getByteArray("i", hsch) );
-    newRec.setString("j", hsch, inpRec.getString("j", hsch) );
-    
-    Assert.assertTrue(HCatDataCheckUtil.recordsEqual(newRec,inpRec));
-    
-    
-  }
-  
-  /**
-   * Test get and set calls with type
-   * @throws HCatException
-   */
-  public void testGetSetByType2() throws HCatException{
-    HCatRecord inpRec = getGetSet2InpRec();
-    
-    HCatRecord newRec = new DefaultHCatRecord(inpRec.size());
-    HCatSchema hsch = 
-        HCatSchemaUtils.getHCatSchema("a:binary,b:map<string,string>,c:array<int>,d:struct<i:int>");
-    
+        Assert.assertTrue(HCatDataCheckUtil.recordsEqual(newRec, inpRec));
 
-    newRec.setByteArray("a", hsch, inpRec.getByteArray("a", hsch) );
-    newRec.setMap("b", hsch, inpRec.getMap("b", hsch) );
-    newRec.setList("c", hsch, inpRec.getList("c", hsch) );
-    newRec.setStruct("d", hsch, inpRec.getStruct("d", hsch) );
 
-    Assert.assertTrue(HCatDataCheckUtil.recordsEqual(newRec,inpRec));
-  }
-  
-  
-  private HCatRecord getGetSet2InpRec() {
-    List<Object> rlist = new ArrayList<Object>();
-    
-    rlist.add(new byte[]{1,2,3});
-    
-    Map<Short, String> mapcol = new HashMap<Short, String>(3);
-    mapcol.put(new Short("2"), "hcat is cool");
-    mapcol.put(new Short("3"), "is it?");
-    mapcol.put(new Short("4"), "or is it not?");
-    rlist.add(mapcol);
+    }
 
-    List<Integer> listcol = new ArrayList<Integer>();
-    listcol.add(314);
-    listcol.add(007);
-    rlist.add( listcol);//list
-    rlist.add( listcol);//struct
-    return new DefaultHCatRecord(rlist);
-  }
+    /**
+     * Test get and set calls with type
+     * @throws HCatException
+     */
+    public void testGetSetByType2() throws HCatException {
+        HCatRecord inpRec = getGetSet2InpRec();
 
-  private HCatRecord[] getHCatRecords(){
+        HCatRecord newRec = new DefaultHCatRecord(inpRec.size());
+        HCatSchema hsch =
+                HCatSchemaUtils.getHCatSchema("a:binary,b:map<string,string>,c:array<int>,d:struct<i:int>");
 
-    List<Object> rec_1 = new ArrayList<Object>(8);
-    rec_1.add(new Byte("123"));
-    rec_1.add(new Short("456"));
-    rec_1.add( new Integer(789));
-    rec_1.add( new Long(1000L));
-    rec_1.add( new Float(5.3F));
-    rec_1.add( new Double(5.3D));
-    rec_1.add( new Boolean(true));
-    rec_1.add( new String("hcat and hadoop"));
-    rec_1.add( null);
-    rec_1.add( "null");
 
-    HCatRecord tup_1 = new DefaultHCatRecord(rec_1);
+        newRec.setByteArray("a", hsch, inpRec.getByteArray("a", hsch));
+        newRec.setMap("b", hsch, inpRec.getMap("b", hsch));
+        newRec.setList("c", hsch, inpRec.getList("c", hsch));
+        newRec.setStruct("d", hsch, inpRec.getStruct("d", hsch));
 
-    List<Object> rec_2 = new ArrayList<Object>(8);
-    rec_2.add( new Byte("123"));
-    rec_2.add( new Short("456"));
-    rec_2.add( new Integer(789));
-    rec_2.add( new Long(1000L));
-    rec_2.add( new Float(5.3F));
-    rec_2.add( new Double(5.3D));
-    rec_2.add( new Boolean(true));
-    rec_2.add( new String("hcat and hadoop"));
-    rec_2.add( null);
-    rec_2.add( "null");
-    HCatRecord tup_2 = new DefaultHCatRecord(rec_2);
+        Assert.assertTrue(HCatDataCheckUtil.recordsEqual(newRec, inpRec));
+    }
 
-    List<Object> rec_3 = new ArrayList<Object>(10);
-    rec_3.add(new Byte("123"));
-    rec_3.add(new Short("456"));
-    rec_3.add( new Integer(789));
-    rec_3.add( new Long(1000L));
-    rec_3.add( new Double(5.3D));
-    rec_3.add( new String("hcat and hadoop"));
-    rec_3.add( null);
-    List<Integer> innerList = new ArrayList<Integer>();
-    innerList.add(314);
-    innerList.add(007);
-    rec_3.add( innerList);
-    Map<Short, String> map = new HashMap<Short, String>(3);
-    map.put(new Short("2"), "hcat is cool");
-    map.put(new Short("3"), "is it?");
-    map.put(new Short("4"), "or is it not?");
-    rec_3.add(map);
 
-    HCatRecord tup_3 = new DefaultHCatRecord(rec_3);
+    private HCatRecord getGetSet2InpRec() {
+        List<Object> rlist = new ArrayList<Object>();
 
-    List<Object> rec_4 = new ArrayList<Object>(8);
-    rec_4.add( new Byte("123"));
-    rec_4.add( new Short("456"));
-    rec_4.add( new Integer(789));
-    rec_4.add( new Long(1000L));
-    rec_4.add( new Double(5.3D));
-    rec_4.add( new String("hcat and hadoop"));
-    rec_4.add( null);
-    rec_4.add( "null");
+        rlist.add(new byte[]{1, 2, 3});
 
-    Map<Short, String> map2 = new HashMap<Short, String>(3);
-    map2.put(new Short("2"), "hcat is cool");
-    map2.put(new Short("3"), "is it?");
-    map2.put(new Short("4"), "or is it not?");
-    rec_4.add(map2);
-    List<Integer> innerList2 = new ArrayList<Integer>();
-    innerList2.add(314);
-    innerList2.add(007);
-    rec_4.add( innerList2);
-    HCatRecord tup_4 = new DefaultHCatRecord(rec_4);
+        Map<Short, String> mapcol = new HashMap<Short, String>(3);
+        mapcol.put(new Short("2"), "hcat is cool");
+        mapcol.put(new Short("3"), "is it?");
+        mapcol.put(new Short("4"), "or is it not?");
+        rlist.add(mapcol);
 
-    
-    List<Object> rec_5 = new ArrayList<Object>(3);
-    rec_5.add( getByteArray());
-    rec_5.add( getStruct());
-    rec_5.add( getList());
-    HCatRecord tup_5 = new DefaultHCatRecord(rec_5);
-    
+        List<Integer> listcol = new ArrayList<Integer>();
+        listcol.add(314);
+        listcol.add(007);
+        rlist.add(listcol);//list
+        rlist.add(listcol);//struct
+        return new DefaultHCatRecord(rlist);
+    }
 
-    List<Object> rec_6 = new ArrayList<Object>(3);
-    rec_6.add( getByteArray());
-    rec_6.add( getStruct());
-    rec_6.add( getList());
-    HCatRecord tup_6 = new DefaultHCatRecord(rec_6);
+    private HCatRecord[] getHCatRecords() {
 
-    
-    return  new HCatRecord[]{tup_1,tup_2,tup_3,tup_4,tup_5,tup_6};
+        List<Object> rec_1 = new ArrayList<Object>(8);
+        rec_1.add(new Byte("123"));
+        rec_1.add(new Short("456"));
+        rec_1.add(new Integer(789));
+        rec_1.add(new Long(1000L));
+        rec_1.add(new Float(5.3F));
+        rec_1.add(new Double(5.3D));
+        rec_1.add(new Boolean(true));
+        rec_1.add(new String("hcat and hadoop"));
+        rec_1.add(null);
+        rec_1.add("null");
 
-  }
+        HCatRecord tup_1 = new DefaultHCatRecord(rec_1);
 
-  private Object getList() {
-    return getStruct();
-  }
+        List<Object> rec_2 = new ArrayList<Object>(8);
+        rec_2.add(new Byte("123"));
+        rec_2.add(new Short("456"));
+        rec_2.add(new Integer(789));
+        rec_2.add(new Long(1000L));
+        rec_2.add(new Float(5.3F));
+        rec_2.add(new Double(5.3D));
+        rec_2.add(new Boolean(true));
+        rec_2.add(new String("hcat and hadoop"));
+        rec_2.add(null);
+        rec_2.add("null");
+        HCatRecord tup_2 = new DefaultHCatRecord(rec_2);
 
-  private Object getByteArray() {
-    return new byte[]{1,2,3,4};
-  }
+        List<Object> rec_3 = new ArrayList<Object>(10);
+        rec_3.add(new Byte("123"));
+        rec_3.add(new Short("456"));
+        rec_3.add(new Integer(789));
+        rec_3.add(new Long(1000L));
+        rec_3.add(new Double(5.3D));
+        rec_3.add(new String("hcat and hadoop"));
+        rec_3.add(null);
+        List<Integer> innerList = new ArrayList<Integer>();
+        innerList.add(314);
+        innerList.add(007);
+        rec_3.add(innerList);
+        Map<Short, String> map = new HashMap<Short, String>(3);
+        map.put(new Short("2"), "hcat is cool");
+        map.put(new Short("3"), "is it?");
+        map.put(new Short("4"), "or is it not?");
+        rec_3.add(map);
 
-  private List<?> getStruct() {
-    List<Object> struct = new ArrayList<Object>();
-    struct.add(new Integer(1));
-    struct.add(new String("x"));
-    return struct;
-  }
+        HCatRecord tup_3 = new DefaultHCatRecord(rec_3);
+
+        List<Object> rec_4 = new ArrayList<Object>(8);
+        rec_4.add(new Byte("123"));
+        rec_4.add(new Short("456"));
+        rec_4.add(new Integer(789));
+        rec_4.add(new Long(1000L));
+        rec_4.add(new Double(5.3D));
+        rec_4.add(new String("hcat and hadoop"));
+        rec_4.add(null);
+        rec_4.add("null");
+
+        Map<Short, String> map2 = new HashMap<Short, String>(3);
+        map2.put(new Short("2"), "hcat is cool");
+        map2.put(new Short("3"), "is it?");
+        map2.put(new Short("4"), "or is it not?");
+        rec_4.add(map2);
+        List<Integer> innerList2 = new ArrayList<Integer>();
+        innerList2.add(314);
+        innerList2.add(007);
+        rec_4.add(innerList2);
+        HCatRecord tup_4 = new DefaultHCatRecord(rec_4);
+
+
+        List<Object> rec_5 = new ArrayList<Object>(3);
+        rec_5.add(getByteArray());
+        rec_5.add(getStruct());
+        rec_5.add(getList());
+        HCatRecord tup_5 = new DefaultHCatRecord(rec_5);
+
+
+        List<Object> rec_6 = new ArrayList<Object>(3);
+        rec_6.add(getByteArray());
+        rec_6.add(getStruct());
+        rec_6.add(getList());
+        HCatRecord tup_6 = new DefaultHCatRecord(rec_6);
+
+
+        return new HCatRecord[]{tup_1, tup_2, tup_3, tup_4, tup_5, tup_6};
+
+    }
+
+    private Object getList() {
+        return getStruct();
+    }
+
+    private Object getByteArray() {
+        return new byte[]{1, 2, 3, 4};
+    }
+
+    private List<?> getStruct() {
+        List<Object> struct = new ArrayList<Object>();
+        struct.add(new Integer(1));
+        struct.add(new String("x"));
+        return struct;
+    }
 }
diff --git a/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java b/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
index 21ab32b..5f102e9 100644
--- a/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
+++ b/src/test/org/apache/hcatalog/data/TestHCatRecordSerDe.java
@@ -34,135 +34,135 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TestHCatRecordSerDe extends TestCase{
+public class TestHCatRecordSerDe extends TestCase {
 
     private static final Logger LOG = LoggerFactory.getLogger(TestHCatRecordSerDe.class);
 
-  public Map<Properties,HCatRecord> getData(){
-    Map<Properties,HCatRecord> data = new HashMap<Properties,HCatRecord>();
+    public Map<Properties, HCatRecord> getData() {
+        Map<Properties, HCatRecord> data = new HashMap<Properties, HCatRecord>();
 
-    List<Object> rlist = new ArrayList<Object>(11);
-    rlist.add(new Byte("123"));
-    rlist.add(new Short("456"));
-    rlist.add(new Integer(789));
-    rlist.add(new Long(1000L));
-    rlist.add(new Double(5.3D));
-    rlist.add(new Float(2.39F));
-    rlist.add(new String("hcat and hadoop"));
-    rlist.add(null);
+        List<Object> rlist = new ArrayList<Object>(11);
+        rlist.add(new Byte("123"));
+        rlist.add(new Short("456"));
+        rlist.add(new Integer(789));
+        rlist.add(new Long(1000L));
+        rlist.add(new Double(5.3D));
+        rlist.add(new Float(2.39F));
+        rlist.add(new String("hcat and hadoop"));
+        rlist.add(null);
 
-    List<Object> innerStruct = new ArrayList<Object>(2);
-    innerStruct.add(new String("abc"));
-    innerStruct.add(new String("def"));
-    rlist.add(innerStruct);
+        List<Object> innerStruct = new ArrayList<Object>(2);
+        innerStruct.add(new String("abc"));
+        innerStruct.add(new String("def"));
+        rlist.add(innerStruct);
 
-    List<Integer> innerList = new ArrayList<Integer>();
-    innerList.add(314);
-    innerList.add(007);
-    rlist.add(innerList);
+        List<Integer> innerList = new ArrayList<Integer>();
+        innerList.add(314);
+        innerList.add(007);
+        rlist.add(innerList);
 
-    Map<Short, String> map = new HashMap<Short, String>(3);
-    map.put(new Short("2"), "hcat is cool");
-    map.put(new Short("3"), "is it?");
-    map.put(new Short("4"), "or is it not?");
-    rlist.add(map);
+        Map<Short, String> map = new HashMap<Short, String>(3);
+        map.put(new Short("2"), "hcat is cool");
+        map.put(new Short("3"), "is it?");
+        map.put(new Short("4"), "or is it not?");
+        rlist.add(map);
 
-    rlist.add(new Boolean(true));
+        rlist.add(new Boolean(true));
 
-    List<Object> c1 = new ArrayList<Object>();
-      List<Object> c1_1 = new ArrayList<Object>();
-      c1_1.add(new Integer(12));
+        List<Object> c1 = new ArrayList<Object>();
+        List<Object> c1_1 = new ArrayList<Object>();
+        c1_1.add(new Integer(12));
         List<Object> i2 = new ArrayList<Object>();
-          List<Integer> ii1 = new ArrayList<Integer>();
-            ii1.add(new Integer(13));
-            ii1.add(new Integer(14));
-          i2.add(ii1);
-          Map<String,List<?>> ii2 = new HashMap<String,List<?>>();
-            List<Integer> iii1 = new ArrayList<Integer>();
-              iii1.add(new Integer(15));
-            ii2.put("phew", iii1);
-          i2.add(ii2);
-      c1_1.add(i2);
-      c1.add(c1_1);
-    rlist.add(c1);
-    List<Object> am = new ArrayList<Object>();
-      Map<String,String> am_1 = new HashMap<String,String>();
-        am_1.put("noo","haha");
-      am.add(am_1);
-    rlist.add(am);
-    List<Object> aa = new ArrayList<Object>();
-      List<String> aa_1 = new ArrayList<String>();
+        List<Integer> ii1 = new ArrayList<Integer>();
+        ii1.add(new Integer(13));
+        ii1.add(new Integer(14));
+        i2.add(ii1);
+        Map<String, List<?>> ii2 = new HashMap<String, List<?>>();
+        List<Integer> iii1 = new ArrayList<Integer>();
+        iii1.add(new Integer(15));
+        ii2.put("phew", iii1);
+        i2.add(ii2);
+        c1_1.add(i2);
+        c1.add(c1_1);
+        rlist.add(c1);
+        List<Object> am = new ArrayList<Object>();
+        Map<String, String> am_1 = new HashMap<String, String>();
+        am_1.put("noo", "haha");
+        am.add(am_1);
+        rlist.add(am);
+        List<Object> aa = new ArrayList<Object>();
+        List<String> aa_1 = new ArrayList<String>();
         aa_1.add("bloo");
         aa_1.add("bwahaha");
-      aa.add(aa_1);
-    rlist.add(aa);
+        aa.add(aa_1);
+        rlist.add(aa);
 
-    String typeString =
-        "tinyint,smallint,int,bigint,double,float,string,string,"
-        + "struct<a:string,b:string>,array<int>,map<smallint,string>,boolean,"
-        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>,"
-        + "array<map<string,string>>,array<array<string>>";
-    Properties props = new Properties();
+        String typeString =
+                "tinyint,smallint,int,bigint,double,float,string,string,"
+                        + "struct<a:string,b:string>,array<int>,map<smallint,string>,boolean,"
+                        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>,"
+                        + "array<map<string,string>>,array<array<string>>";
+        Properties props = new Properties();
 
-    props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1,am,aa");
-    props.put(Constants.LIST_COLUMN_TYPES, typeString);
+        props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1,am,aa");
+        props.put(Constants.LIST_COLUMN_TYPES, typeString);
 //    props.put(Constants.SERIALIZATION_NULL_FORMAT, "\\N");
 //    props.put(Constants.SERIALIZATION_FORMAT, "1");
 
-    data.put(props, new DefaultHCatRecord(rlist));
-    return data;
-  }
-
-  public void testRW() throws Exception {
-
-    Configuration conf = new Configuration();
-
-    for (Entry<Properties,HCatRecord> e : getData().entrySet()){
-      Properties tblProps = e.getKey();
-      HCatRecord r = e.getValue();
-
-      HCatRecordSerDe hrsd = new HCatRecordSerDe();
-      hrsd.initialize(conf, tblProps);
-
-      LOG.info("ORIG: {}", r);
-
-      Writable s = hrsd.serialize(r,hrsd.getObjectInspector());
-      LOG.info("ONE: {}", s);
-
-      HCatRecord r2 = (HCatRecord) hrsd.deserialize(s);
-      Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r,r2));
-
-      // If it went through correctly, then s is also a HCatRecord,
-      // and also equal to the above, and a deepcopy, and this holds
-      // through for multiple levels more of serialization as well.
-
-      Writable s2 = hrsd.serialize(s, hrsd.getObjectInspector());
-      LOG.info("TWO: {}", s2);
-      Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r,(HCatRecord)s));
-      Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r,(HCatRecord)s2));
-
-      // serialize using another serde, and read out that object repr.
-      LazySimpleSerDe testSD = new LazySimpleSerDe();
-      testSD.initialize(conf, tblProps);
-
-      Writable s3 = testSD.serialize(s, hrsd.getObjectInspector());
-      LOG.info("THREE: {}",s3);
-      Object o3 = testSD.deserialize(s3);
-      Assert.assertFalse(r.getClass().equals(o3.getClass()));
-
-      // then serialize again using hrsd, and compare results
-      HCatRecord s4 = (HCatRecord) hrsd.serialize(o3, testSD.getObjectInspector());
-      LOG.info("FOUR: {}", s4);
-
-      // Test LazyHCatRecord init and read
-      LazyHCatRecord s5 = new LazyHCatRecord(o3,testSD.getObjectInspector());
-      LOG.info("FIVE: {}",s5);
-
-      LazyHCatRecord s6 = new LazyHCatRecord(s4,hrsd.getObjectInspector());
-      LOG.info("SIX: {}", s6);
-
+        data.put(props, new DefaultHCatRecord(rlist));
+        return data;
     }
 
-  }
+    public void testRW() throws Exception {
+
+        Configuration conf = new Configuration();
+
+        for (Entry<Properties, HCatRecord> e : getData().entrySet()) {
+            Properties tblProps = e.getKey();
+            HCatRecord r = e.getValue();
+
+            HCatRecordSerDe hrsd = new HCatRecordSerDe();
+            hrsd.initialize(conf, tblProps);
+
+            LOG.info("ORIG: {}", r);
+
+            Writable s = hrsd.serialize(r, hrsd.getObjectInspector());
+            LOG.info("ONE: {}", s);
+
+            HCatRecord r2 = (HCatRecord) hrsd.deserialize(s);
+            Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r, r2));
+
+            // If it went through correctly, then s is also a HCatRecord,
+            // and also equal to the above, and a deepcopy, and this holds
+            // through for multiple levels more of serialization as well.
+
+            Writable s2 = hrsd.serialize(s, hrsd.getObjectInspector());
+            LOG.info("TWO: {}", s2);
+            Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) s));
+            Assert.assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) s2));
+
+            // serialize using another serde, and read out that object repr.
+            LazySimpleSerDe testSD = new LazySimpleSerDe();
+            testSD.initialize(conf, tblProps);
+
+            Writable s3 = testSD.serialize(s, hrsd.getObjectInspector());
+            LOG.info("THREE: {}", s3);
+            Object o3 = testSD.deserialize(s3);
+            Assert.assertFalse(r.getClass().equals(o3.getClass()));
+
+            // then serialize again using hrsd, and compare results
+            HCatRecord s4 = (HCatRecord) hrsd.serialize(o3, testSD.getObjectInspector());
+            LOG.info("FOUR: {}", s4);
+
+            // Test LazyHCatRecord init and read
+            LazyHCatRecord s5 = new LazyHCatRecord(o3, testSD.getObjectInspector());
+            LOG.info("FIVE: {}", s5);
+
+            LazyHCatRecord s6 = new LazyHCatRecord(s4, hrsd.getObjectInspector());
+            LOG.info("SIX: {}", s6);
+
+        }
+
+    }
 
 }
diff --git a/src/test/org/apache/hcatalog/data/TestJsonSerDe.java b/src/test/org/apache/hcatalog/data/TestJsonSerDe.java
index 053657c..5e363df 100644
--- a/src/test/org/apache/hcatalog/data/TestJsonSerDe.java
+++ b/src/test/org/apache/hcatalog/data/TestJsonSerDe.java
@@ -32,182 +32,182 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TestJsonSerDe extends TestCase{
+public class TestJsonSerDe extends TestCase {
 
-  private static final Logger LOG = LoggerFactory.getLogger(TestJsonSerDe.class);
+    private static final Logger LOG = LoggerFactory.getLogger(TestJsonSerDe.class);
 
-  public List<Pair<Properties,HCatRecord>> getData(){
-    List<Pair<Properties,HCatRecord>> data = new ArrayList<Pair<Properties,HCatRecord>>();
+    public List<Pair<Properties, HCatRecord>> getData() {
+        List<Pair<Properties, HCatRecord>> data = new ArrayList<Pair<Properties, HCatRecord>>();
 
-    List<Object> rlist = new ArrayList<Object>(13);
-    rlist.add(new Byte("123"));
-    rlist.add(new Short("456"));
-    rlist.add(new Integer(789));
-    rlist.add(new Long(1000L));
-    rlist.add(new Double(5.3D));
-    rlist.add(new Float(2.39F));
-    rlist.add(new String("hcat and hadoop"));
-    rlist.add(null);
+        List<Object> rlist = new ArrayList<Object>(13);
+        rlist.add(new Byte("123"));
+        rlist.add(new Short("456"));
+        rlist.add(new Integer(789));
+        rlist.add(new Long(1000L));
+        rlist.add(new Double(5.3D));
+        rlist.add(new Float(2.39F));
+        rlist.add(new String("hcat and hadoop"));
+        rlist.add(null);
 
-    List<Object> innerStruct = new ArrayList<Object>(2);
-    innerStruct.add(new String("abc"));
-    innerStruct.add(new String("def"));
-    rlist.add(innerStruct);
+        List<Object> innerStruct = new ArrayList<Object>(2);
+        innerStruct.add(new String("abc"));
+        innerStruct.add(new String("def"));
+        rlist.add(innerStruct);
 
-    List<Integer> innerList = new ArrayList<Integer>();
-    innerList.add(314);
-    innerList.add(007);
-    rlist.add(innerList);
+        List<Integer> innerList = new ArrayList<Integer>();
+        innerList.add(314);
+        innerList.add(007);
+        rlist.add(innerList);
 
-    Map<Short, String> map = new HashMap<Short, String>(3);
-    map.put(new Short("2"), "hcat is cool");
-    map.put(new Short("3"), "is it?");
-    map.put(new Short("4"), "or is it not?");
-    rlist.add(map);
+        Map<Short, String> map = new HashMap<Short, String>(3);
+        map.put(new Short("2"), "hcat is cool");
+        map.put(new Short("3"), "is it?");
+        map.put(new Short("4"), "or is it not?");
+        rlist.add(map);
 
-    rlist.add(new Boolean(true));
+        rlist.add(new Boolean(true));
 
-    List<Object> c1 = new ArrayList<Object>();
-      List<Object> c1_1 = new ArrayList<Object>();
-      c1_1.add(new Integer(12));
+        List<Object> c1 = new ArrayList<Object>();
+        List<Object> c1_1 = new ArrayList<Object>();
+        c1_1.add(new Integer(12));
         List<Object> i2 = new ArrayList<Object>();
-          List<Integer> ii1 = new ArrayList<Integer>();
-            ii1.add(new Integer(13));
-            ii1.add(new Integer(14));
-          i2.add(ii1);
-          Map<String,List<?>> ii2 = new HashMap<String,List<?>>();
-            List<Integer> iii1 = new ArrayList<Integer>();
-              iii1.add(new Integer(15));
-            ii2.put("phew", iii1);
-          i2.add(ii2);
-      c1_1.add(i2);
-      c1.add(c1_1);
-    rlist.add(c1);
+        List<Integer> ii1 = new ArrayList<Integer>();
+        ii1.add(new Integer(13));
+        ii1.add(new Integer(14));
+        i2.add(ii1);
+        Map<String, List<?>> ii2 = new HashMap<String, List<?>>();
+        List<Integer> iii1 = new ArrayList<Integer>();
+        iii1.add(new Integer(15));
+        ii2.put("phew", iii1);
+        i2.add(ii2);
+        c1_1.add(i2);
+        c1.add(c1_1);
+        rlist.add(c1);
 
-    List<Object> nlist = new ArrayList<Object>(13);
-    nlist.add(null); // tinyint
-    nlist.add(null); // smallint
-    nlist.add(null); // int
-    nlist.add(null); // bigint
-    nlist.add(null); // double
-    nlist.add(null); // float
-    nlist.add(null); // string
-    nlist.add(null); // string
-    nlist.add(null); // struct
-    nlist.add(null); // array
-    nlist.add(null); // map
-    nlist.add(null); // bool
-    nlist.add(null); // complex
+        List<Object> nlist = new ArrayList<Object>(13);
+        nlist.add(null); // tinyint
+        nlist.add(null); // smallint
+        nlist.add(null); // int
+        nlist.add(null); // bigint
+        nlist.add(null); // double
+        nlist.add(null); // float
+        nlist.add(null); // string
+        nlist.add(null); // string
+        nlist.add(null); // struct
+        nlist.add(null); // array
+        nlist.add(null); // map
+        nlist.add(null); // bool
+        nlist.add(null); // complex
 
-    String typeString =
-        "tinyint,smallint,int,bigint,double,float,string,string,"
-        + "struct<a:string,b:string>,array<int>,map<smallint,string>,boolean,"
-        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>";
-    Properties props = new Properties();
+        String typeString =
+                "tinyint,smallint,int,bigint,double,float,string,string,"
+                        + "struct<a:string,b:string>,array<int>,map<smallint,string>,boolean,"
+                        + "array<struct<i1:int,i2:struct<ii1:array<int>,ii2:map<string,struct<iii1:int>>>>>";
+        Properties props = new Properties();
 
-    props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1");
-    props.put(Constants.LIST_COLUMN_TYPES, typeString);
+        props.put(Constants.LIST_COLUMNS, "ti,si,i,bi,d,f,s,n,r,l,m,b,c1");
+        props.put(Constants.LIST_COLUMN_TYPES, typeString);
 //    props.put(Constants.SERIALIZATION_NULL_FORMAT, "\\N");
 //    props.put(Constants.SERIALIZATION_FORMAT, "1");
 
-    data.add(new Pair(props, new DefaultHCatRecord(rlist)));
-    data.add(new Pair(props, new DefaultHCatRecord(nlist)));
-    return data;
-  }
-
-  public void testRW() throws Exception {
-
-    Configuration conf = new Configuration();
-
-    for (Pair<Properties,HCatRecord> e : getData()){
-      Properties tblProps = e.first;
-      HCatRecord r = e.second;
-
-      HCatRecordSerDe hrsd = new HCatRecordSerDe();
-      hrsd.initialize(conf, tblProps);
-
-      JsonSerDe jsde = new JsonSerDe();
-      jsde.initialize(conf, tblProps);
-
-      LOG.info("ORIG:{}",r);
-
-      Writable s = hrsd.serialize(r,hrsd.getObjectInspector());
-      LOG.info("ONE:{}",s);
-
-      Object o1 = hrsd.deserialize(s);
-      assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o1));
-
-      Writable s2 = jsde.serialize(o1, hrsd.getObjectInspector());
-      LOG.info("TWO:{}",s2);
-      Object o2 = jsde.deserialize(s2);
-      LOG.info("deserialized TWO : {} ", o2);
-
-      assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o2));
+        data.add(new Pair(props, new DefaultHCatRecord(rlist)));
+        data.add(new Pair(props, new DefaultHCatRecord(nlist)));
+        return data;
     }
 
-  }
+    public void testRW() throws Exception {
 
-  public void testRobustRead() throws Exception {
-    /**
-     *  This test has been added to account for HCATALOG-436
-     *  We write out columns with "internal column names" such
-     *  as "_col0", but try to read with retular column names.
-     */
-    
-    Configuration conf = new Configuration();
+        Configuration conf = new Configuration();
 
-    for (Pair<Properties,HCatRecord> e : getData()){
-      Properties tblProps = e.first;
-      HCatRecord r = e.second;
-      
-      Properties internalTblProps = new Properties();
-      for (Map.Entry pe : tblProps.entrySet()){
-        if (!pe.getKey().equals(Constants.LIST_COLUMNS)){
-          internalTblProps.put(pe.getKey(), pe.getValue());
-        } else {
-          internalTblProps.put(pe.getKey(),getInternalNames((String) pe.getValue()));
+        for (Pair<Properties, HCatRecord> e : getData()) {
+            Properties tblProps = e.first;
+            HCatRecord r = e.second;
+
+            HCatRecordSerDe hrsd = new HCatRecordSerDe();
+            hrsd.initialize(conf, tblProps);
+
+            JsonSerDe jsde = new JsonSerDe();
+            jsde.initialize(conf, tblProps);
+
+            LOG.info("ORIG:{}", r);
+
+            Writable s = hrsd.serialize(r, hrsd.getObjectInspector());
+            LOG.info("ONE:{}", s);
+
+            Object o1 = hrsd.deserialize(s);
+            assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o1));
+
+            Writable s2 = jsde.serialize(o1, hrsd.getObjectInspector());
+            LOG.info("TWO:{}", s2);
+            Object o2 = jsde.deserialize(s2);
+            LOG.info("deserialized TWO : {} ", o2);
+
+            assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o2));
         }
-      }
-      
-      LOG.info("orig tbl props:{}",tblProps);
-      LOG.info("modif tbl props:{}",internalTblProps);
 
-      JsonSerDe wjsd = new JsonSerDe();
-      wjsd.initialize(conf, internalTblProps);
-
-      JsonSerDe rjsd = new JsonSerDe();
-      rjsd.initialize(conf, tblProps);
-
-      LOG.info("ORIG:{}",r);
-
-      Writable s = wjsd.serialize(r,wjsd.getObjectInspector());
-      LOG.info("ONE:{}",s);
-
-      Object o1 = wjsd.deserialize(s);
-      LOG.info("deserialized ONE : {} ", o1);
-
-      Object o2 = rjsd.deserialize(s);
-      LOG.info("deserialized TWO : {} ", o2);
-      assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o2));
     }
-    
-  }
-  
-  String getInternalNames(String columnNames){
-    if (columnNames == null) { 
-      return null; 
+
+    public void testRobustRead() throws Exception {
+        /**
+         *  This test has been added to account for HCATALOG-436
+         *  We write out columns with "internal column names" such
+         *  as "_col0", but try to read with retular column names.
+         */
+
+        Configuration conf = new Configuration();
+
+        for (Pair<Properties, HCatRecord> e : getData()) {
+            Properties tblProps = e.first;
+            HCatRecord r = e.second;
+
+            Properties internalTblProps = new Properties();
+            for (Map.Entry pe : tblProps.entrySet()) {
+                if (!pe.getKey().equals(Constants.LIST_COLUMNS)) {
+                    internalTblProps.put(pe.getKey(), pe.getValue());
+                } else {
+                    internalTblProps.put(pe.getKey(), getInternalNames((String) pe.getValue()));
+                }
+            }
+
+            LOG.info("orig tbl props:{}", tblProps);
+            LOG.info("modif tbl props:{}", internalTblProps);
+
+            JsonSerDe wjsd = new JsonSerDe();
+            wjsd.initialize(conf, internalTblProps);
+
+            JsonSerDe rjsd = new JsonSerDe();
+            rjsd.initialize(conf, tblProps);
+
+            LOG.info("ORIG:{}", r);
+
+            Writable s = wjsd.serialize(r, wjsd.getObjectInspector());
+            LOG.info("ONE:{}", s);
+
+            Object o1 = wjsd.deserialize(s);
+            LOG.info("deserialized ONE : {} ", o1);
+
+            Object o2 = rjsd.deserialize(s);
+            LOG.info("deserialized TWO : {} ", o2);
+            assertTrue(HCatDataCheckUtil.recordsEqual(r, (HCatRecord) o2));
+        }
+
     }
-    if (columnNames.isEmpty()) { 
-      return ""; 
+
+    String getInternalNames(String columnNames) {
+        if (columnNames == null) {
+            return null;
+        }
+        if (columnNames.isEmpty()) {
+            return "";
+        }
+
+        StringBuffer sb = new StringBuffer();
+        int numStrings = columnNames.split(",").length;
+        sb.append("_col0");
+        for (int i = 1; i < numStrings; i++) {
+            sb.append(",");
+            sb.append(HiveConf.getColumnInternalName(i));
+        }
+        return sb.toString();
     }
-    
-    StringBuffer sb = new StringBuffer();
-    int numStrings = columnNames.split(",").length;
-    sb.append("_col0");
-    for (int i = 1; i < numStrings ; i++ ){
-      sb.append(",");
-      sb.append(HiveConf.getColumnInternalName(i));
-    }
-    return sb.toString();
-  }
 }
diff --git a/src/test/org/apache/hcatalog/data/TestLazyHCatRecord.java b/src/test/org/apache/hcatalog/data/TestLazyHCatRecord.java
index 9b5f7e5..b532df9 100644
--- a/src/test/org/apache/hcatalog/data/TestLazyHCatRecord.java
+++ b/src/test/org/apache/hcatalog/data/TestLazyHCatRecord.java
@@ -31,165 +31,162 @@
 
 public class TestLazyHCatRecord {
 
-  private final int INT_CONST = 789;
-  private final long LONG_CONST = 5000000000L;
-  private final double DOUBLE_CONST = 3.141592654;
-  private final String STRING_CONST = "hello world";
+    private final int INT_CONST = 789;
+    private final long LONG_CONST = 5000000000L;
+    private final double DOUBLE_CONST = 3.141592654;
+    private final String STRING_CONST = "hello world";
 
-  @Test
-  public void testGet() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    Assert.assertEquals(INT_CONST, ((Integer) r.get(0)).intValue());
-    Assert.assertEquals(LONG_CONST, ((Long) r.get(1)).longValue());
-    Assert.assertEquals(DOUBLE_CONST, ((Double) r.get(2)).doubleValue(), 0);
-    Assert.assertEquals(STRING_CONST, (String) r.get(3));
-  }
-
-  @Test
-  public void testGetWithName() throws Exception {
-    TypeInfo ti = getTypeInfo();
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector(ti));
-    HCatSchema schema = HCatSchemaUtils.getHCatSchema(ti)
-                                          .get(0).getStructSubSchema();
-    Assert.assertEquals(INT_CONST, ((Integer) r.get("an_int", schema)).intValue());
-    Assert.assertEquals(LONG_CONST, ((Long) r.get("a_long", schema)).longValue());
-    Assert.assertEquals(DOUBLE_CONST, ((Double) r.get("a_double", schema)).doubleValue(), 0);
-    Assert.assertEquals(STRING_CONST, (String) r.get("a_string", schema));
-  }
-
-  @Test
-  public void testGetAll() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    List<Object> list = r.getAll();
-    Assert.assertEquals(INT_CONST, ((Integer) list.get(0)).intValue());
-    Assert.assertEquals(LONG_CONST, ((Long) list.get(1)).longValue());
-    Assert.assertEquals(DOUBLE_CONST, ((Double) list.get(2)).doubleValue(), 0);
-    Assert.assertEquals(STRING_CONST, (String) list.get(3));
-  }
-
-  @Test
-  public void testSet() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.set(3, "Mary had a little lamb");
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testGet() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        Assert.assertEquals(INT_CONST, ((Integer) r.get(0)).intValue());
+        Assert.assertEquals(LONG_CONST, ((Long) r.get(1)).longValue());
+        Assert.assertEquals(DOUBLE_CONST, ((Double) r.get(2)).doubleValue(), 0);
+        Assert.assertEquals(STRING_CONST, (String) r.get(3));
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testSize() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    Assert.assertEquals(4, r.size());
-  }
-
-  @Test
-  public void testReadFields() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.readFields(null);
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testGetWithName() throws Exception {
+        TypeInfo ti = getTypeInfo();
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector(ti));
+        HCatSchema schema = HCatSchemaUtils.getHCatSchema(ti)
+                                              .get(0).getStructSubSchema();
+        Assert.assertEquals(INT_CONST, ((Integer) r.get("an_int", schema)).intValue());
+        Assert.assertEquals(LONG_CONST, ((Long) r.get("a_long", schema)).longValue());
+        Assert.assertEquals(DOUBLE_CONST, ((Double) r.get("a_double", schema)).doubleValue(), 0);
+        Assert.assertEquals(STRING_CONST, (String) r.get("a_string", schema));
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testWrite() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.write(null);
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testGetAll() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        List<Object> list = r.getAll();
+        Assert.assertEquals(INT_CONST, ((Integer) list.get(0)).intValue());
+        Assert.assertEquals(LONG_CONST, ((Long) list.get(1)).longValue());
+        Assert.assertEquals(DOUBLE_CONST, ((Double) list.get(2)).doubleValue(), 0);
+        Assert.assertEquals(STRING_CONST, (String) list.get(3));
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testSetWithName() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.set("fred", null, "bob");
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testSet() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.set(3, "Mary had a little lamb");
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testRemove() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.remove(0);
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testSize() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        Assert.assertEquals(4, r.size());
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testCopy() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
-    boolean sawException = false;
-    try {
-      r.copy(null);
-    } catch (UnsupportedOperationException uoe) {
-      sawException = true;
+    @Test
+    public void testReadFields() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.readFields(null);
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
     }
-    Assert.assertTrue(sawException);
-  }
 
-  @Test
-  public void testGetWritable() throws Exception {
-    HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector()).getWritable();
-    Assert.assertEquals(INT_CONST, ((Integer) r.get(0)).intValue());
-    Assert.assertEquals(LONG_CONST, ((Long) r.get(1)).longValue());
-    Assert.assertEquals(DOUBLE_CONST, ((Double) r.get(2)).doubleValue(), 0);
-    Assert.assertEquals(STRING_CONST, (String) r.get(3));
-    Assert.assertEquals("org.apache.hcatalog.data.DefaultHCatRecord", r.getClass().getName());
-  }
+    @Test
+    public void testWrite() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.write(null);
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
+    }
 
-  private HCatRecord getHCatRecord() throws Exception {
+    @Test
+    public void testSetWithName() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.set("fred", null, "bob");
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
+    }
 
-    List<Object> rec_1 = new ArrayList<Object>(4);
-    rec_1.add( new Integer(INT_CONST));
-    rec_1.add( new Long(LONG_CONST));
-    rec_1.add( new Double(DOUBLE_CONST));
-    rec_1.add( new String(STRING_CONST));
+    @Test
+    public void testRemove() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.remove(0);
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
+    }
 
-    return new DefaultHCatRecord(rec_1);
-  }
+    @Test
+    public void testCopy() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector());
+        boolean sawException = false;
+        try {
+            r.copy(null);
+        } catch (UnsupportedOperationException uoe) {
+            sawException = true;
+        }
+        Assert.assertTrue(sawException);
+    }
 
-  private TypeInfo getTypeInfo() throws Exception {
-    List<String> names = new ArrayList<String>(4);
-    names.add("an_int");
-    names.add("a_long");
-    names.add("a_double");
-    names.add("a_string");
+    @Test
+    public void testGetWritable() throws Exception {
+        HCatRecord r = new LazyHCatRecord(getHCatRecord(), getObjectInspector()).getWritable();
+        Assert.assertEquals(INT_CONST, ((Integer) r.get(0)).intValue());
+        Assert.assertEquals(LONG_CONST, ((Long) r.get(1)).longValue());
+        Assert.assertEquals(DOUBLE_CONST, ((Double) r.get(2)).doubleValue(), 0);
+        Assert.assertEquals(STRING_CONST, (String) r.get(3));
+        Assert.assertEquals("org.apache.hcatalog.data.DefaultHCatRecord", r.getClass().getName());
+    }
 
-    List<TypeInfo> tis = new ArrayList<TypeInfo>(4);
-    tis.add(TypeInfoFactory.getPrimitiveTypeInfo("int"));
-    tis.add(TypeInfoFactory.getPrimitiveTypeInfo("bigint"));
-    tis.add(TypeInfoFactory.getPrimitiveTypeInfo("double"));
-    tis.add(TypeInfoFactory.getPrimitiveTypeInfo("string"));
+    private HCatRecord getHCatRecord() throws Exception {
+        List<Object> rec_1 = new ArrayList<Object>(4);
+        rec_1.add( new Integer(INT_CONST));
+        rec_1.add( new Long(LONG_CONST));
+        rec_1.add( new Double(DOUBLE_CONST));
+        rec_1.add( new String(STRING_CONST));
 
-    return TypeInfoFactory.getStructTypeInfo(names, tis);
+        return new DefaultHCatRecord(rec_1);
+    }
 
-  }
+    private TypeInfo getTypeInfo() throws Exception {
+        List<String> names = new ArrayList<String>(4);
+        names.add("an_int");
+        names.add("a_long");
+        names.add("a_double");
+        names.add("a_string");
 
-  private ObjectInspector getObjectInspector(TypeInfo ti) throws Exception {
-    return HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(
-        (StructTypeInfo)ti);
-  }
+        List<TypeInfo> tis = new ArrayList<TypeInfo>(4);
+        tis.add(TypeInfoFactory.getPrimitiveTypeInfo("int"));
+        tis.add(TypeInfoFactory.getPrimitiveTypeInfo("bigint"));
+        tis.add(TypeInfoFactory.getPrimitiveTypeInfo("double"));
+        tis.add(TypeInfoFactory.getPrimitiveTypeInfo("string"));
 
-  private ObjectInspector getObjectInspector() throws Exception {
-    return HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(
-          (StructTypeInfo)getTypeInfo());
-  }
+        return TypeInfoFactory.getStructTypeInfo(names, tis);
+    }
+
+    private ObjectInspector getObjectInspector(TypeInfo ti) throws Exception {
+        return HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector((StructTypeInfo)ti);
+    }
+
+    private ObjectInspector getObjectInspector() throws Exception {
+        return HCatRecordObjectInspectorFactory.getHCatRecordObjectInspector(
+            (StructTypeInfo)getTypeInfo());
+    }
 }
diff --git a/src/test/org/apache/hcatalog/data/TestReaderWriter.java b/src/test/org/apache/hcatalog/data/TestReaderWriter.java
index a682855..18d368f 100644
--- a/src/test/org/apache/hcatalog/data/TestReaderWriter.java
+++ b/src/test/org/apache/hcatalog/data/TestReaderWriter.java
@@ -49,140 +49,136 @@
 
 public class TestReaderWriter extends HCatBaseTest {
 
-  @Test
-  public void test() throws MetaException, CommandNeedRetryException,
-      IOException, ClassNotFoundException {
+    @Test
+    public void test() throws MetaException, CommandNeedRetryException,
+            IOException, ClassNotFoundException {
 
-    driver.run("drop table mytbl");
-    driver.run("create table mytbl (a string, b int)");
-    Iterator<Entry<String, String>> itr = hiveConf.iterator();
-    Map<String, String> map = new HashMap<String, String>();
-    while (itr.hasNext()) {
-      Entry<String, String> kv = itr.next();
-      map.put(kv.getKey(), kv.getValue());
+        driver.run("drop table mytbl");
+        driver.run("create table mytbl (a string, b int)");
+        Iterator<Entry<String, String>> itr = hiveConf.iterator();
+        Map<String, String> map = new HashMap<String, String>();
+        while (itr.hasNext()) {
+            Entry<String, String> kv = itr.next();
+            map.put(kv.getKey(), kv.getValue());
+        }
+
+        WriterContext cntxt = runsInMaster(map);
+
+        File writeCntxtFile = File.createTempFile("hcat-write", "temp");
+        writeCntxtFile.deleteOnExit();
+
+        // Serialize context.
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(writeCntxtFile));
+        oos.writeObject(cntxt);
+        oos.flush();
+        oos.close();
+
+        // Now, deserialize it.
+        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(writeCntxtFile));
+        cntxt = (WriterContext) ois.readObject();
+        ois.close();
+
+        runsInSlave(cntxt);
+        commit(map, true, cntxt);
+
+        ReaderContext readCntxt = runsInMaster(map, false);
+
+        File readCntxtFile = File.createTempFile("hcat-read", "temp");
+        readCntxtFile.deleteOnExit();
+        oos = new ObjectOutputStream(new FileOutputStream(readCntxtFile));
+        oos.writeObject(readCntxt);
+        oos.flush();
+        oos.close();
+
+        ois = new ObjectInputStream(new FileInputStream(readCntxtFile));
+        readCntxt = (ReaderContext) ois.readObject();
+        ois.close();
+
+        for (InputSplit split : readCntxt.getSplits()) {
+            runsInSlave(split, readCntxt.getConf());
+        }
     }
 
-    WriterContext cntxt = runsInMaster(map);
+    private WriterContext runsInMaster(Map<String, String> config) throws HCatException {
 
-    File writeCntxtFile = File.createTempFile("hcat-write", "temp");
-    writeCntxtFile.deleteOnExit();
-
-    // Serialize context.
-    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
-        writeCntxtFile));
-    oos.writeObject(cntxt);
-    oos.flush();
-    oos.close();
-
-    // Now, deserialize it.
-    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
-        writeCntxtFile));
-    cntxt = (WriterContext) ois.readObject();
-    ois.close();
-
-    runsInSlave(cntxt);
-    commit(map, true, cntxt);
-
-    ReaderContext readCntxt = runsInMaster(map, false);
-
-    File readCntxtFile = File.createTempFile("hcat-read", "temp");
-    readCntxtFile.deleteOnExit();
-    oos = new ObjectOutputStream(new FileOutputStream(readCntxtFile));
-    oos.writeObject(readCntxt);
-    oos.flush();
-    oos.close();
-
-    ois = new ObjectInputStream(new FileInputStream(readCntxtFile));
-    readCntxt = (ReaderContext) ois.readObject();
-    ois.close();
-
-    for (InputSplit split : readCntxt.getSplits()) {
-      runsInSlave(split, readCntxt.getConf());
-    }
-  }
-
-  private WriterContext runsInMaster(Map<String, String> config)
-      throws HCatException {
-
-    WriteEntity.Builder builder = new WriteEntity.Builder();
-    WriteEntity entity = builder.withTable("mytbl").build();
-    HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
-    WriterContext info = writer.prepareWrite();
-    return info;
-  }
-
-  private ReaderContext runsInMaster(Map<String, String> config, boolean bogus)
-      throws HCatException {
-
-    ReadEntity.Builder builder = new ReadEntity.Builder();
-    ReadEntity entity = builder.withTable("mytbl").build();
-    HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
-    ReaderContext cntxt = reader.prepareRead();
-    return cntxt;
-  }
-
-  private void runsInSlave(InputSplit split, Configuration config)
-      throws HCatException {
-
-    HCatReader reader = DataTransferFactory.getHCatReader(split, config);
-    Iterator<HCatRecord> itr = reader.read();
-    int i = 1;
-    while (itr.hasNext()) {
-      HCatRecord read = itr.next();
-      HCatRecord written = getRecord(i++);
-      // Argh, HCatRecord doesnt implement equals()
-      Assert.assertTrue("Read: " + read.get(0) + "Written: " + written.get(0),
-          written.get(0).equals(read.get(0)));
-      Assert.assertTrue("Read: " + read.get(1) + "Written: " + written.get(1),
-          written.get(1).equals(read.get(1)));
-      Assert.assertEquals(2, read.size());
-    }
-    //Assert.assertFalse(itr.hasNext());
-  }
-
-  private void runsInSlave(WriterContext context) throws HCatException {
-
-    HCatWriter writer = DataTransferFactory.getHCatWriter(context);
-    writer.write(new HCatRecordItr());
-  }
-
-  private void commit(Map<String, String> config, boolean status,
-      WriterContext context) throws IOException {
-
-    WriteEntity.Builder builder = new WriteEntity.Builder();
-    WriteEntity entity = builder.withTable("mytbl").build();
-    HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
-    if (status) {
-      writer.commit(context);
-    } else {
-      writer.abort(context);
-    }
-  }
-
-  private static HCatRecord getRecord(int i) {
-    List<Object> list = new ArrayList<Object>(2);
-    list.add("Row #: " + i);
-    list.add(i);
-    return new DefaultHCatRecord(list);
-  }
-
-  private static class HCatRecordItr implements Iterator<HCatRecord> {
-
-    int i = 0;
-
-    @Override
-    public boolean hasNext() {
-      return i++ < 100 ? true : false;
+        WriteEntity.Builder builder = new WriteEntity.Builder();
+        WriteEntity entity = builder.withTable("mytbl").build();
+        HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
+        WriterContext info = writer.prepareWrite();
+        return info;
     }
 
-    @Override
-    public HCatRecord next() {
-      return getRecord(i);
+    private ReaderContext runsInMaster(Map<String, String> config, boolean bogus)
+        throws HCatException {
+
+        ReadEntity.Builder builder = new ReadEntity.Builder();
+        ReadEntity entity = builder.withTable("mytbl").build();
+        HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
+        ReaderContext cntxt = reader.prepareRead();
+        return cntxt;
     }
 
-    @Override
-    public void remove() {
-      throw new RuntimeException();
+    private void runsInSlave(InputSplit split, Configuration config) throws HCatException {
+
+        HCatReader reader = DataTransferFactory.getHCatReader(split, config);
+        Iterator<HCatRecord> itr = reader.read();
+        int i = 1;
+        while (itr.hasNext()) {
+            HCatRecord read = itr.next();
+            HCatRecord written = getRecord(i++);
+            // Argh, HCatRecord doesnt implement equals()
+            Assert.assertTrue("Read: " + read.get(0) + "Written: " + written.get(0),
+                written.get(0).equals(read.get(0)));
+            Assert.assertTrue("Read: " + read.get(1) + "Written: " + written.get(1),
+                written.get(1).equals(read.get(1)));
+            Assert.assertEquals(2, read.size());
+        }
+        //Assert.assertFalse(itr.hasNext());
     }
-  }
+
+    private void runsInSlave(WriterContext context) throws HCatException {
+
+        HCatWriter writer = DataTransferFactory.getHCatWriter(context);
+        writer.write(new HCatRecordItr());
+    }
+
+    private void commit(Map<String, String> config, boolean status,
+            WriterContext context) throws IOException {
+
+        WriteEntity.Builder builder = new WriteEntity.Builder();
+        WriteEntity entity = builder.withTable("mytbl").build();
+        HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
+        if (status) {
+            writer.commit(context);
+        } else {
+            writer.abort(context);
+        }
+    }
+
+    private static HCatRecord getRecord(int i) {
+        List<Object> list = new ArrayList<Object>(2);
+        list.add("Row #: " + i);
+        list.add(i);
+        return new DefaultHCatRecord(list);
+    }
+
+    private static class HCatRecordItr implements Iterator<HCatRecord> {
+
+        int i = 0;
+
+        @Override
+        public boolean hasNext() {
+            return i++ < 100 ? true : false;
+        }
+
+        @Override
+        public HCatRecord next() {
+            return getRecord(i);
+        }
+
+        @Override
+        public void remove() {
+            throw new RuntimeException();
+        }
+    }
 }
diff --git a/src/test/org/apache/hcatalog/data/schema/TestHCatSchema.java b/src/test/org/apache/hcatalog/data/schema/TestHCatSchema.java
index 8ed2dab..9402b4d 100644
--- a/src/test/org/apache/hcatalog/data/schema/TestHCatSchema.java
+++ b/src/test/org/apache/hcatalog/data/schema/TestHCatSchema.java
@@ -24,55 +24,55 @@
 import java.util.List;
 
 public class TestHCatSchema extends TestCase {
-  public void testCannotAddFieldMoreThanOnce() throws HCatException {
-    List<HCatFieldSchema> fieldSchemaList = new ArrayList<HCatFieldSchema>();
-    fieldSchemaList.add(new HCatFieldSchema("name", HCatFieldSchema.Type.STRING, "What's your handle?"));
-    fieldSchemaList.add(new HCatFieldSchema("age", HCatFieldSchema.Type.INT, "So very old"));
+    public void testCannotAddFieldMoreThanOnce() throws HCatException {
+        List<HCatFieldSchema> fieldSchemaList = new ArrayList<HCatFieldSchema>();
+        fieldSchemaList.add(new HCatFieldSchema("name", HCatFieldSchema.Type.STRING, "What's your handle?"));
+        fieldSchemaList.add(new HCatFieldSchema("age", HCatFieldSchema.Type.INT, "So very old"));
 
-    HCatSchema schema = new HCatSchema(fieldSchemaList);
+        HCatSchema schema = new HCatSchema(fieldSchemaList);
 
-    assertTrue(schema.getFieldNames().contains("age"));
-    assertEquals(2, schema.getFields().size());
+        assertTrue(schema.getFieldNames().contains("age"));
+        assertEquals(2, schema.getFields().size());
 
-    try {
-      schema.append(new HCatFieldSchema("age", HCatFieldSchema.Type.INT, "So very old"));
-      fail("Was able to append field schema with same name");
-    } catch(HCatException he) {
-      assertTrue(he.getMessage().contains("Attempt to append HCatFieldSchema with already existing name: age."));
+        try {
+            schema.append(new HCatFieldSchema("age", HCatFieldSchema.Type.INT, "So very old"));
+            fail("Was able to append field schema with same name");
+        } catch (HCatException he) {
+            assertTrue(he.getMessage().contains("Attempt to append HCatFieldSchema with already existing name: age."));
+        }
+
+        assertTrue(schema.getFieldNames().contains("age"));
+        assertEquals(2, schema.getFields().size());
+
+        // Should also not be able to add fields of different types with same name
+        try {
+            schema.append(new HCatFieldSchema("age", HCatFieldSchema.Type.STRING, "Maybe spelled out?"));
+            fail("Was able to append field schema with same name");
+        } catch (HCatException he) {
+            assertTrue(he.getMessage().contains("Attempt to append HCatFieldSchema with already existing name: age."));
+        }
+
+        assertTrue(schema.getFieldNames().contains("age"));
+        assertEquals(2, schema.getFields().size());
     }
 
-    assertTrue(schema.getFieldNames().contains("age"));
-    assertEquals(2, schema.getFields().size());
+    public void testCannotInstantiateSchemaWithRepeatedFieldNames() throws HCatException {
+        List<HCatFieldSchema> fieldSchemaList = new ArrayList<HCatFieldSchema>();
 
-    // Should also not be able to add fields of different types with same name
-    try {
-      schema.append(new HCatFieldSchema("age", HCatFieldSchema.Type.STRING, "Maybe spelled out?"));
-      fail("Was able to append field schema with same name");
-    } catch(HCatException he) {
-      assertTrue(he.getMessage().contains("Attempt to append HCatFieldSchema with already existing name: age."));
+        fieldSchemaList.add(new HCatFieldSchema("memberID", HCatFieldSchema.Type.INT, "as a number"));
+        fieldSchemaList.add(new HCatFieldSchema("location", HCatFieldSchema.Type.STRING, "there's Waldo"));
+
+        // No duplicate names.  This should be ok
+        HCatSchema schema = new HCatSchema(fieldSchemaList);
+
+        fieldSchemaList.add(new HCatFieldSchema("memberID", HCatFieldSchema.Type.STRING, "as a String"));
+
+        // Now a duplicated field name.  Should fail
+        try {
+            HCatSchema schema2 = new HCatSchema(fieldSchemaList);
+            fail("Able to add duplicate field name");
+        } catch (IllegalArgumentException iae) {
+            assertTrue(iae.getMessage().contains("Field named memberID already exists"));
+        }
     }
-
-    assertTrue(schema.getFieldNames().contains("age"));
-    assertEquals(2, schema.getFields().size());
-  }
-
-  public void testCannotInstantiateSchemaWithRepeatedFieldNames() throws HCatException {
-      List<HCatFieldSchema> fieldSchemaList = new ArrayList<HCatFieldSchema>();
-
-      fieldSchemaList.add(new HCatFieldSchema("memberID", HCatFieldSchema.Type.INT, "as a number"));
-      fieldSchemaList.add(new HCatFieldSchema("location", HCatFieldSchema.Type.STRING, "there's Waldo"));
-
-      // No duplicate names.  This should be ok
-      HCatSchema schema = new HCatSchema(fieldSchemaList);
-
-      fieldSchemaList.add(new HCatFieldSchema("memberID", HCatFieldSchema.Type.STRING, "as a String"));
-
-      // Now a duplicated field name.  Should fail
-      try {
-        HCatSchema schema2 = new HCatSchema(fieldSchemaList);
-        fail("Able to add duplicate field name");
-      } catch (IllegalArgumentException iae) {
-        assertTrue(iae.getMessage().contains("Field named memberID already exists"));
-      }
-  }
 }
diff --git a/src/test/org/apache/hcatalog/data/schema/TestHCatSchemaUtils.java b/src/test/org/apache/hcatalog/data/schema/TestHCatSchemaUtils.java
index 19272ec..1d07621 100644
--- a/src/test/org/apache/hcatalog/data/schema/TestHCatSchemaUtils.java
+++ b/src/test/org/apache/hcatalog/data/schema/TestHCatSchemaUtils.java
@@ -31,47 +31,49 @@
 public class TestHCatSchemaUtils extends TestCase {
 
     private static final Logger LOG = LoggerFactory.getLogger(TestHCatSchemaUtils.class);
-    public void testSimpleOperation() throws Exception{
+
+    public void testSimpleOperation() throws Exception {
         String typeString = "struct<name:string,studentid:int,"
-            + "contact:struct<phno:string,email:string>,"
-            + "currently_registered_courses:array<string>,"
-            + "current_grades:map<string,string>,"
-            + "phnos:array<struct<phno:string,type:string>>,blah:array<int>>";
+                + "contact:struct<phno:string,email:string>,"
+                + "currently_registered_courses:array<string>,"
+                + "current_grades:map<string,string>,"
+                + "phnos:array<struct<phno:string,type:string>>,blah:array<int>>";
 
         TypeInfo ti = TypeInfoUtils.getTypeInfoFromTypeString(typeString);
 
         HCatSchema hsch = HCatSchemaUtils.getHCatSchemaFromTypeString(typeString);
-        LOG.info("Type name : {}",ti.getTypeName());
-        LOG.info("HCatSchema : {}",hsch);
+        LOG.info("Type name : {}", ti.getTypeName());
+        LOG.info("HCatSchema : {}", hsch);
         assertEquals(hsch.size(), 1);
-        assertEquals(ti.getTypeName(),hsch.get(0).getTypeString());
-        assertEquals(hsch.get(0).getTypeString(),typeString);
+        assertEquals(ti.getTypeName(), hsch.get(0).getTypeString());
+        assertEquals(hsch.get(0).getTypeString(), typeString);
     }
 
     @SuppressWarnings("unused")
     private void pretty_print(PrintStream pout, HCatSchema hsch) throws HCatException {
-        pretty_print(pout,hsch,"");
+        pretty_print(pout, hsch, "");
     }
 
 
     private void pretty_print(PrintStream pout, HCatSchema hsch, String prefix) throws HCatException {
         int i = 0;
-        for (HCatFieldSchema field : hsch.getFields()){
-            pretty_print(pout,field,prefix+"."+(field.getName()==null?i:field.getName()));
+        for (HCatFieldSchema field : hsch.getFields()) {
+            pretty_print(pout, field, prefix + "." + (field.getName() == null ? i : field.getName()));
             i++;
         }
     }
+
     private void pretty_print(PrintStream pout, HCatFieldSchema hfsch, String prefix) throws HCatException {
 
         Category tcat = hfsch.getCategory();
-        if (Category.STRUCT == tcat){
-            pretty_print(pout,hfsch.getStructSubSchema(),prefix);
-        }else if (Category.ARRAY == tcat){
-            pretty_print(pout,hfsch.getArrayElementSchema(),prefix);
-        }else if (Category.MAP == tcat){
+        if (Category.STRUCT == tcat) {
+            pretty_print(pout, hfsch.getStructSubSchema(), prefix);
+        } else if (Category.ARRAY == tcat) {
+            pretty_print(pout, hfsch.getArrayElementSchema(), prefix);
+        } else if (Category.MAP == tcat) {
             pout.println(prefix + ".mapkey:\t" + hfsch.getMapKeyType().toString());
-            pretty_print(pout,hfsch.getMapValueSchema(),prefix+".mapvalue:");
-        }else{
+            pretty_print(pout, hfsch.getMapValueSchema(), prefix + ".mapvalue:");
+        } else {
             pout.println(prefix + "\t" + hfsch.getType().toString());
         }
     }
diff --git a/src/test/org/apache/hcatalog/listener/TestMsgBusConnection.java b/src/test/org/apache/hcatalog/listener/TestMsgBusConnection.java
index 4da3cef..0db2b16 100644
--- a/src/test/org/apache/hcatalog/listener/TestMsgBusConnection.java
+++ b/src/test/org/apache/hcatalog/listener/TestMsgBusConnection.java
@@ -43,80 +43,80 @@
 
 public class TestMsgBusConnection extends TestCase {
 
-  private Driver driver;
-  private BrokerService broker;
-  private MessageConsumer consumer;
+    private Driver driver;
+    private BrokerService broker;
+    private MessageConsumer consumer;
 
-  @Override
-  protected void setUp() throws Exception {
+    @Override
+    protected void setUp() throws Exception {
 
-    super.setUp();
-    broker = new BrokerService();
-    // configure the broker
-    broker.addConnector("tcp://localhost:61616?broker.persistent=false");
+        super.setUp();
+        broker = new BrokerService();
+        // configure the broker
+        broker.addConnector("tcp://localhost:61616?broker.persistent=false");
 
-    broker.start();
+        broker.start();
 
-    System.setProperty("java.naming.factory.initial",
-        "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
-    System.setProperty("java.naming.provider.url", "tcp://localhost:61616");
-    connectClient();
-    HiveConf hiveConf = new HiveConf(this.getClass());
-    hiveConf.set(ConfVars.METASTORE_EVENT_LISTENERS.varname,
-        NotificationListener.class.getName());
-    hiveConf.set("hive.metastore.local", "true");
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    hiveConf.set(HCatConstants.HCAT_MSGBUS_TOPIC_PREFIX, "planetlab.hcat");
-    SessionState.start(new CliSessionState(hiveConf));
-    driver = new Driver(hiveConf);
-  }
-
-  private void connectClient() throws JMSException {
-    ConnectionFactory connFac = new ActiveMQConnectionFactory(
-        "tcp://localhost:61616");
-    Connection conn = connFac.createConnection();
-    conn.start();
-    Session session = conn.createSession(true, Session.SESSION_TRANSACTED);
-    Destination hcatTopic = session.createTopic("planetlab.hcat");
-    consumer = session.createConsumer(hcatTopic);
-  }
-
-  public void testConnection() throws Exception {
-
-    try {
-      driver.run("create database testconndb");
-      Message msg = consumer.receive();
-      assertEquals(HCatConstants.HCAT_ADD_DATABASE_EVENT,
-          msg.getStringProperty(HCatConstants.HCAT_EVENT));
-      assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
-      assertEquals("testconndb",
-          ((Database) ((ObjectMessage) msg).getObject()).getName());
-      broker.stop();
-      driver.run("drop database testconndb cascade");
-      broker.start(true);
-      connectClient();
-      driver.run("create database testconndb");
-      msg = consumer.receive();
-      assertEquals(HCatConstants.HCAT_ADD_DATABASE_EVENT,
-          msg.getStringProperty(HCatConstants.HCAT_EVENT));
-      assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
-      assertEquals("testconndb",
-          ((Database) ((ObjectMessage) msg).getObject()).getName());
-      driver.run("drop database testconndb cascade");
-      msg = consumer.receive();
-      assertEquals(HCatConstants.HCAT_DROP_DATABASE_EVENT,
-          msg.getStringProperty(HCatConstants.HCAT_EVENT));
-      assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
-      assertEquals("testconndb",
-          ((Database) ((ObjectMessage) msg).getObject()).getName());
-    } catch (NoSuchObjectException nsoe) {
-      nsoe.printStackTrace(System.err);
-      assert false;
-    } catch (AlreadyExistsException aee) {
-      aee.printStackTrace(System.err);
-      assert false;
+        System.setProperty("java.naming.factory.initial",
+                "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
+        System.setProperty("java.naming.provider.url", "tcp://localhost:61616");
+        connectClient();
+        HiveConf hiveConf = new HiveConf(this.getClass());
+        hiveConf.set(ConfVars.METASTORE_EVENT_LISTENERS.varname,
+                NotificationListener.class.getName());
+        hiveConf.set("hive.metastore.local", "true");
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        hiveConf.set(HCatConstants.HCAT_MSGBUS_TOPIC_PREFIX, "planetlab.hcat");
+        SessionState.start(new CliSessionState(hiveConf));
+        driver = new Driver(hiveConf);
     }
-  }
+
+    private void connectClient() throws JMSException {
+        ConnectionFactory connFac = new ActiveMQConnectionFactory(
+                "tcp://localhost:61616");
+        Connection conn = connFac.createConnection();
+        conn.start();
+        Session session = conn.createSession(true, Session.SESSION_TRANSACTED);
+        Destination hcatTopic = session.createTopic("planetlab.hcat");
+        consumer = session.createConsumer(hcatTopic);
+    }
+
+    public void testConnection() throws Exception {
+
+        try {
+            driver.run("create database testconndb");
+            Message msg = consumer.receive();
+            assertEquals(HCatConstants.HCAT_ADD_DATABASE_EVENT,
+                    msg.getStringProperty(HCatConstants.HCAT_EVENT));
+            assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
+            assertEquals("testconndb",
+                    ((Database) ((ObjectMessage) msg).getObject()).getName());
+            broker.stop();
+            driver.run("drop database testconndb cascade");
+            broker.start(true);
+            connectClient();
+            driver.run("create database testconndb");
+            msg = consumer.receive();
+            assertEquals(HCatConstants.HCAT_ADD_DATABASE_EVENT,
+                    msg.getStringProperty(HCatConstants.HCAT_EVENT));
+            assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
+            assertEquals("testconndb",
+                    ((Database) ((ObjectMessage) msg).getObject()).getName());
+            driver.run("drop database testconndb cascade");
+            msg = consumer.receive();
+            assertEquals(HCatConstants.HCAT_DROP_DATABASE_EVENT,
+                    msg.getStringProperty(HCatConstants.HCAT_EVENT));
+            assertEquals("topic://planetlab.hcat", msg.getJMSDestination().toString());
+            assertEquals("testconndb",
+                    ((Database) ((ObjectMessage) msg).getObject()).getName());
+        } catch (NoSuchObjectException nsoe) {
+            nsoe.printStackTrace(System.err);
+            assert false;
+        } catch (AlreadyExistsException aee) {
+            aee.printStackTrace(System.err);
+            assert false;
+        }
+    }
 }
diff --git a/src/test/org/apache/hcatalog/listener/TestNotificationListener.java b/src/test/org/apache/hcatalog/listener/TestNotificationListener.java
index 7d09d79..58ef72c 100644
--- a/src/test/org/apache/hcatalog/listener/TestNotificationListener.java
+++ b/src/test/org/apache/hcatalog/listener/TestNotificationListener.java
@@ -59,136 +59,136 @@
 import junit.framework.TestCase;
 
 public class TestNotificationListener extends TestCase implements
-    MessageListener {
+        MessageListener {
 
-  private HiveConf hiveConf;
-  private Driver driver;
-  private AtomicInteger cntInvocation = new AtomicInteger(0);
+    private HiveConf hiveConf;
+    private Driver driver;
+    private AtomicInteger cntInvocation = new AtomicInteger(0);
 
-  @Override
-  protected void setUp() throws Exception {
+    @Override
+    protected void setUp() throws Exception {
 
-    super.setUp();
-    System.setProperty("java.naming.factory.initial",
-        "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
-    System.setProperty("java.naming.provider.url",
-        "vm://localhost?broker.persistent=false");
-    ConnectionFactory connFac = new ActiveMQConnectionFactory(
-        "vm://localhost?broker.persistent=false");
-    Connection conn = connFac.createConnection();
-    conn.start();
-    // We want message to be sent when session commits, thus we run in
-    // transacted mode.
-    Session session = conn.createSession(true, Session.SESSION_TRANSACTED);
-    Destination hcatTopic = session
-        .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX);
-    MessageConsumer consumer1 = session.createConsumer(hcatTopic);
-    consumer1.setMessageListener(this);
-    Destination tblTopic = session
-        .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".mydb.mytbl");
-    MessageConsumer consumer2 = session.createConsumer(tblTopic);
-    consumer2.setMessageListener(this);
-    Destination dbTopic = session
-        .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".mydb");
-    MessageConsumer consumer3 = session.createConsumer(dbTopic);
-    consumer3.setMessageListener(this);
-    hiveConf = new HiveConf(this.getClass());
-    hiveConf.set(ConfVars.METASTORE_EVENT_LISTENERS.varname,
-        NotificationListener.class.getName());
-    hiveConf.set("hive.metastore.local", "true");
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    SessionState.start(new CliSessionState(hiveConf));
-    driver = new Driver(hiveConf);
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    assertEquals(7, cntInvocation.get());
-    super.tearDown();
-  }
-
-  public void testAMQListener() throws MetaException, TException,
-      UnknownTableException, NoSuchObjectException, CommandNeedRetryException,
-      UnknownDBException, InvalidPartitionException, UnknownPartitionException {
-    driver.run("create database mydb");
-    driver.run("use mydb");
-    driver.run("create table mytbl (a string) partitioned by (b string)");
-    driver.run("alter table mytbl add partition(b='2011')");
-    HiveMetaStoreClient msc = new HiveMetaStoreClient(hiveConf);
-    Map<String, String> kvs = new HashMap<String, String>(1);
-    kvs.put("b", "2011");
-    msc.markPartitionForEvent("mydb", "mytbl", kvs,
-        PartitionEventType.LOAD_DONE);
-    driver.run("alter table mytbl drop partition(b='2011')");
-    driver.run("drop table mytbl");
-    driver.run("drop database mydb");
-  }
-
-  @Override
-  public void onMessage(Message msg) {
-    cntInvocation.incrementAndGet();
-
-    String event;
-    try {
-      event = msg.getStringProperty(HCatConstants.HCAT_EVENT);
-      if (event.equals(HCatConstants.HCAT_ADD_DATABASE_EVENT)) {
-
-        assertEquals("topic://" + HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX, msg
-            .getJMSDestination().toString());
-        assertEquals("mydb",
-            ((Database) ((ObjectMessage) msg).getObject()).getName());
-      } else if (event.equals(HCatConstants.HCAT_ADD_TABLE_EVENT)) {
-
-        assertEquals("topic://hcat.mydb", msg.getJMSDestination().toString());
-        Table tbl = (Table) (((ObjectMessage) msg).getObject());
-        assertEquals("mytbl", tbl.getTableName());
-        assertEquals("mydb", tbl.getDbName());
-        assertEquals(1, tbl.getPartitionKeysSize());
-      } else if (event.equals(HCatConstants.HCAT_ADD_PARTITION_EVENT)) {
-
-        assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
-            .toString());
-        Partition part = (Partition) (((ObjectMessage) msg).getObject());
-        assertEquals("mytbl", part.getTableName());
-        assertEquals("mydb", part.getDbName());
-        List<String> vals = new ArrayList<String>(1);
-        vals.add("2011");
-        assertEquals(vals, part.getValues());
-      } else if (event.equals(HCatConstants.HCAT_DROP_PARTITION_EVENT)) {
-
-        assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
-            .toString());
-        Partition part = (Partition) (((ObjectMessage) msg).getObject());
-        assertEquals("mytbl", part.getTableName());
-        assertEquals("mydb", part.getDbName());
-        List<String> vals = new ArrayList<String>(1);
-        vals.add("2011");
-        assertEquals(vals, part.getValues());
-      } else if (event.equals(HCatConstants.HCAT_DROP_TABLE_EVENT)) {
-
-        assertEquals("topic://hcat.mydb", msg.getJMSDestination().toString());
-        Table tbl = (Table) (((ObjectMessage) msg).getObject());
-        assertEquals("mytbl", tbl.getTableName());
-        assertEquals("mydb", tbl.getDbName());
-        assertEquals(1, tbl.getPartitionKeysSize());
-      } else if (event.equals(HCatConstants.HCAT_DROP_DATABASE_EVENT)) {
-
-        assertEquals("topic://" + HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX, msg
-            .getJMSDestination().toString());
-        assertEquals("mydb",
-            ((Database) ((ObjectMessage) msg).getObject()).getName());
-      } else if (event.equals(HCatConstants.HCAT_PARTITION_DONE_EVENT)) {
-        assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
-            .toString());
-        MapMessage mapMsg = (MapMessage) msg;
-        assert mapMsg.getString("b").equals("2011");
-      } else
-        assert false;
-    } catch (JMSException e) {
-      e.printStackTrace(System.err);
-      assert false;
+        super.setUp();
+        System.setProperty("java.naming.factory.initial",
+                "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
+        System.setProperty("java.naming.provider.url",
+                "vm://localhost?broker.persistent=false");
+        ConnectionFactory connFac = new ActiveMQConnectionFactory(
+                "vm://localhost?broker.persistent=false");
+        Connection conn = connFac.createConnection();
+        conn.start();
+        // We want message to be sent when session commits, thus we run in
+        // transacted mode.
+        Session session = conn.createSession(true, Session.SESSION_TRANSACTED);
+        Destination hcatTopic = session
+                .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX);
+        MessageConsumer consumer1 = session.createConsumer(hcatTopic);
+        consumer1.setMessageListener(this);
+        Destination tblTopic = session
+                .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".mydb.mytbl");
+        MessageConsumer consumer2 = session.createConsumer(tblTopic);
+        consumer2.setMessageListener(this);
+        Destination dbTopic = session
+                .createTopic(HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".mydb");
+        MessageConsumer consumer3 = session.createConsumer(dbTopic);
+        consumer3.setMessageListener(this);
+        hiveConf = new HiveConf(this.getClass());
+        hiveConf.set(ConfVars.METASTORE_EVENT_LISTENERS.varname,
+                NotificationListener.class.getName());
+        hiveConf.set("hive.metastore.local", "true");
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        SessionState.start(new CliSessionState(hiveConf));
+        driver = new Driver(hiveConf);
     }
-  }
+
+    @Override
+    protected void tearDown() throws Exception {
+        assertEquals(7, cntInvocation.get());
+        super.tearDown();
+    }
+
+    public void testAMQListener() throws MetaException, TException,
+            UnknownTableException, NoSuchObjectException, CommandNeedRetryException,
+            UnknownDBException, InvalidPartitionException, UnknownPartitionException {
+        driver.run("create database mydb");
+        driver.run("use mydb");
+        driver.run("create table mytbl (a string) partitioned by (b string)");
+        driver.run("alter table mytbl add partition(b='2011')");
+        HiveMetaStoreClient msc = new HiveMetaStoreClient(hiveConf);
+        Map<String, String> kvs = new HashMap<String, String>(1);
+        kvs.put("b", "2011");
+        msc.markPartitionForEvent("mydb", "mytbl", kvs,
+                PartitionEventType.LOAD_DONE);
+        driver.run("alter table mytbl drop partition(b='2011')");
+        driver.run("drop table mytbl");
+        driver.run("drop database mydb");
+    }
+
+    @Override
+    public void onMessage(Message msg) {
+        cntInvocation.incrementAndGet();
+
+        String event;
+        try {
+            event = msg.getStringProperty(HCatConstants.HCAT_EVENT);
+            if (event.equals(HCatConstants.HCAT_ADD_DATABASE_EVENT)) {
+
+                assertEquals("topic://" + HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX, msg
+                        .getJMSDestination().toString());
+                assertEquals("mydb",
+                        ((Database) ((ObjectMessage) msg).getObject()).getName());
+            } else if (event.equals(HCatConstants.HCAT_ADD_TABLE_EVENT)) {
+
+                assertEquals("topic://hcat.mydb", msg.getJMSDestination().toString());
+                Table tbl = (Table) (((ObjectMessage) msg).getObject());
+                assertEquals("mytbl", tbl.getTableName());
+                assertEquals("mydb", tbl.getDbName());
+                assertEquals(1, tbl.getPartitionKeysSize());
+            } else if (event.equals(HCatConstants.HCAT_ADD_PARTITION_EVENT)) {
+
+                assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
+                        .toString());
+                Partition part = (Partition) (((ObjectMessage) msg).getObject());
+                assertEquals("mytbl", part.getTableName());
+                assertEquals("mydb", part.getDbName());
+                List<String> vals = new ArrayList<String>(1);
+                vals.add("2011");
+                assertEquals(vals, part.getValues());
+            } else if (event.equals(HCatConstants.HCAT_DROP_PARTITION_EVENT)) {
+
+                assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
+                        .toString());
+                Partition part = (Partition) (((ObjectMessage) msg).getObject());
+                assertEquals("mytbl", part.getTableName());
+                assertEquals("mydb", part.getDbName());
+                List<String> vals = new ArrayList<String>(1);
+                vals.add("2011");
+                assertEquals(vals, part.getValues());
+            } else if (event.equals(HCatConstants.HCAT_DROP_TABLE_EVENT)) {
+
+                assertEquals("topic://hcat.mydb", msg.getJMSDestination().toString());
+                Table tbl = (Table) (((ObjectMessage) msg).getObject());
+                assertEquals("mytbl", tbl.getTableName());
+                assertEquals("mydb", tbl.getDbName());
+                assertEquals(1, tbl.getPartitionKeysSize());
+            } else if (event.equals(HCatConstants.HCAT_DROP_DATABASE_EVENT)) {
+
+                assertEquals("topic://" + HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX, msg
+                        .getJMSDestination().toString());
+                assertEquals("mydb",
+                        ((Database) ((ObjectMessage) msg).getObject()).getName());
+            } else if (event.equals(HCatConstants.HCAT_PARTITION_DONE_EVENT)) {
+                assertEquals("topic://hcat.mydb.mytbl", msg.getJMSDestination()
+                        .toString());
+                MapMessage mapMsg = (MapMessage) msg;
+                assert mapMsg.getString("b").equals("2011");
+            } else
+                assert false;
+        } catch (JMSException e) {
+            e.printStackTrace(System.err);
+            assert false;
+        }
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/HCatBaseTest.java b/src/test/org/apache/hcatalog/mapreduce/HCatBaseTest.java
index 7c36a82..4302e67 100644
--- a/src/test/org/apache/hcatalog/mapreduce/HCatBaseTest.java
+++ b/src/test/org/apache/hcatalog/mapreduce/HCatBaseTest.java
@@ -38,41 +38,41 @@
  * Simplify writing HCatalog tests that require a HiveMetaStore.
  */
 public class HCatBaseTest {
-  protected static final Logger LOG = LoggerFactory.getLogger(HCatBaseTest.class);
-  protected static final String TEST_DATA_DIR = System.getProperty("user.dir") +
-      "/build/test/data/" + HCatBaseTest.class.getCanonicalName();
-  protected static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
+    protected static final Logger LOG = LoggerFactory.getLogger(HCatBaseTest.class);
+    protected static final String TEST_DATA_DIR = System.getProperty("user.dir") +
+            "/build/test/data/" + HCatBaseTest.class.getCanonicalName();
+    protected static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
 
-  protected HiveConf hiveConf = null;
-  protected Driver driver = null;
-  protected HiveMetaStoreClient client = null;
+    protected HiveConf hiveConf = null;
+    protected Driver driver = null;
+    protected HiveMetaStoreClient client = null;
 
-  @BeforeClass
-  public static void setUpTestDataDir() throws Exception {
-    LOG.info("Using warehouse directory " + TEST_WAREHOUSE_DIR);
-    File f = new File(TEST_WAREHOUSE_DIR);
-    if (f.exists()) {
-      FileUtil.fullyDelete(f);
+    @BeforeClass
+    public static void setUpTestDataDir() throws Exception {
+        LOG.info("Using warehouse directory " + TEST_WAREHOUSE_DIR);
+        File f = new File(TEST_WAREHOUSE_DIR);
+        if (f.exists()) {
+            FileUtil.fullyDelete(f);
+        }
+        Assert.assertTrue(new File(TEST_WAREHOUSE_DIR).mkdirs());
     }
-    Assert.assertTrue(new File(TEST_WAREHOUSE_DIR).mkdirs());
-  }
 
-  @Before
-  public void setUp() throws Exception {
-    if (driver == null) {
-      hiveConf = new HiveConf(this.getClass());
-      hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-      hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-      hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-      hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
-      driver = new Driver(hiveConf);
-      client = new HiveMetaStoreClient(hiveConf);
-      SessionState.start(new CliSessionState(hiveConf));
+    @Before
+    public void setUp() throws Exception {
+        if (driver == null) {
+            hiveConf = new HiveConf(this.getClass());
+            hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+            hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+            hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+            hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, TEST_WAREHOUSE_DIR);
+            driver = new Driver(hiveConf);
+            client = new HiveMetaStoreClient(hiveConf);
+            SessionState.start(new CliSessionState(hiveConf));
+        }
     }
-  }
 
-  protected void logAndRegister(PigServer server, String query) throws IOException {
-    LOG.info("Registering pig query: " + query);
-    server.registerQuery(query);
-  }
+    protected void logAndRegister(PigServer server, String query) throws IOException {
+        LOG.info("Registering pig query: " + query);
+        server.registerQuery(query);
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/HCatMapReduceTest.java b/src/test/org/apache/hcatalog/mapreduce/HCatMapReduceTest.java
index ce59fa7..3bb3fd3 100644
--- a/src/test/org/apache/hcatalog/mapreduce/HCatMapReduceTest.java
+++ b/src/test/org/apache/hcatalog/mapreduce/HCatMapReduceTest.java
@@ -68,284 +68,283 @@
  */
 public abstract class HCatMapReduceTest extends TestCase {
 
-  private static final Logger LOG = LoggerFactory.getLogger(HCatMapReduceTest.class);
-  protected String dbName = "default";
-  protected String tableName = "testHCatMapReduceTable";
+    private static final Logger LOG = LoggerFactory.getLogger(HCatMapReduceTest.class);
+    protected String dbName = "default";
+    protected String tableName = "testHCatMapReduceTable";
 
-  protected String inputFormat = RCFileInputFormat.class.getName();
-  protected String outputFormat = RCFileOutputFormat.class.getName();
-  protected String serdeClass = ColumnarSerDe.class.getName();
+    protected String inputFormat = RCFileInputFormat.class.getName();
+    protected String outputFormat = RCFileOutputFormat.class.getName();
+    protected String serdeClass = ColumnarSerDe.class.getName();
 
-  private static List<HCatRecord> writeRecords = new ArrayList<HCatRecord>();
-  private static List<HCatRecord> readRecords = new ArrayList<HCatRecord>();
+    private static List<HCatRecord> writeRecords = new ArrayList<HCatRecord>();
+    private static List<HCatRecord> readRecords = new ArrayList<HCatRecord>();
 
-  protected abstract void initialize() throws Exception;
+    protected abstract void initialize() throws Exception;
 
-  protected abstract List<FieldSchema> getPartitionKeys();
+    protected abstract List<FieldSchema> getPartitionKeys();
 
-  protected abstract List<FieldSchema> getTableColumns();
+    protected abstract List<FieldSchema> getTableColumns();
 
-  private HiveMetaStoreClient client;
-  protected HiveConf hiveConf;
+    private HiveMetaStoreClient client;
+    protected HiveConf hiveConf;
 
-  private FileSystem fs;
-  private String thriftUri = null;
+    private FileSystem fs;
+    private String thriftUri = null;
 
-  protected Driver driver;
-
-  @Override
-  protected void setUp() throws Exception {
-    hiveConf = new HiveConf(this.getClass());
-
-    //The default org.apache.hadoop.hive.ql.hooks.PreExecutePrinter hook
-    //is present only in the ql/test directory
-    hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
-    hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-    driver = new Driver(hiveConf);
-    SessionState.start(new CliSessionState(hiveConf));
-
-    thriftUri = System.getenv("HCAT_METASTORE_URI");
-
-    if( thriftUri != null ) {
-      LOG.info("Using URI {}", thriftUri);
-
-      hiveConf.set("hive.metastore.local", "false");
-      hiveConf.set(HiveConf.ConfVars.METASTOREURIS.varname, thriftUri);
-    }
-
-    fs = new LocalFileSystem();
-    fs.initialize(fs.getWorkingDirectory().toUri(), new Configuration());
-
-    initialize();
-
-    client = new HiveMetaStoreClient(hiveConf, null);
-    initTable();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    try {
-      String databaseName = (dbName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : dbName;
-
-      client.dropTable(databaseName, tableName);
-    } catch(Exception e) {
-      e.printStackTrace();
-      throw e;
-    }
-
-    client.close();
-  }
-
-
-
-  private void initTable() throws Exception {
-
-    String databaseName = (dbName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : dbName;
-
-    try {
-      client.dropTable(databaseName, tableName);
-    } catch(Exception e) {
-    } //can fail with NoSuchObjectException
-
-
-    Table tbl = new Table();
-    tbl.setDbName(databaseName);
-    tbl.setTableName(tableName);
-    tbl.setTableType("MANAGED_TABLE");
-    StorageDescriptor sd = new StorageDescriptor();
-
-    sd.setCols(getTableColumns());
-    tbl.setPartitionKeys(getPartitionKeys());
-
-    tbl.setSd(sd);
-
-    sd.setBucketCols(new ArrayList<String>(2));
-    sd.setSerdeInfo(new SerDeInfo());
-    sd.getSerdeInfo().setName(tbl.getTableName());
-    sd.getSerdeInfo().setParameters(new HashMap<String, String>());
-    sd.getSerdeInfo().getParameters().put(
-        org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
-    sd.getSerdeInfo().setSerializationLib(serdeClass);
-    sd.setInputFormat(inputFormat);
-    sd.setOutputFormat(outputFormat);
-
-    Map<String, String> tableParams = new HashMap<String, String>();
-    tbl.setParameters(tableParams);
-
-    client.createTable(tbl);
-  }
-
-  //Create test input file with specified number of rows
-  private void createInputFile(Path path, int rowCount) throws IOException {
-
-    if( fs.exists(path) ) {
-      fs.delete(path, true);
-    }
-
-    FSDataOutputStream os = fs.create(path);
-
-    for(int i = 0;i < rowCount;i++) {
-      os.writeChars(i + "\n");
-    }
-
-    os.close();
-  }
-
-  public static class MapCreate extends
-  Mapper<LongWritable, Text, BytesWritable, HCatRecord> {
-
-    static int writeCount = 0; //test will be in local mode
+    protected Driver driver;
 
     @Override
-    public void map(LongWritable key, Text value, Context context
-    ) throws IOException, InterruptedException {
-      {
-        try {
-          HCatRecord rec = writeRecords.get(writeCount);
-          context.write(null, rec);
-          writeCount++;
+    protected void setUp() throws Exception {
+        hiveConf = new HiveConf(this.getClass());
 
-        }catch(Exception e) {
+        //The default org.apache.hadoop.hive.ql.hooks.PreExecutePrinter hook
+        //is present only in the ql/test directory
+        hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
+        hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
+        driver = new Driver(hiveConf);
+        SessionState.start(new CliSessionState(hiveConf));
 
-          e.printStackTrace(System.err); //print since otherwise exception is lost
-          throw new IOException(e);
+        thriftUri = System.getenv("HCAT_METASTORE_URI");
+
+        if (thriftUri != null) {
+            LOG.info("Using URI {}", thriftUri);
+
+            hiveConf.set("hive.metastore.local", "false");
+            hiveConf.set(HiveConf.ConfVars.METASTOREURIS.varname, thriftUri);
         }
-      }
+
+        fs = new LocalFileSystem();
+        fs.initialize(fs.getWorkingDirectory().toUri(), new Configuration());
+
+        initialize();
+
+        client = new HiveMetaStoreClient(hiveConf, null);
+        initTable();
     }
-  }
-
-  public static class MapRead extends
-  Mapper<WritableComparable, HCatRecord, BytesWritable, Text> {
-
-    static int readCount = 0; //test will be in local mode
 
     @Override
-    public void map(WritableComparable key, HCatRecord value, Context context
-    ) throws IOException, InterruptedException {
-      {
+    protected void tearDown() throws Exception {
         try {
-          readRecords.add(value);
-          readCount++;
-        } catch(Exception e) {
-          e.printStackTrace(); //print since otherwise exception is lost
-          throw new IOException(e);
+            String databaseName = (dbName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : dbName;
+
+            client.dropTable(databaseName, tableName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
         }
-      }
-    }
-  }
 
-  Job runMRCreate(Map<String, String> partitionValues,
-        List<HCatFieldSchema> partitionColumns, List<HCatRecord> records,
-        int writeCount, boolean assertWrite) throws Exception {
-
-    writeRecords = records;
-    MapCreate.writeCount = 0;
-
-    Configuration conf = new Configuration();
-    Job job = new Job(conf, "hcat mapreduce write test");
-    job.setJarByClass(this.getClass());
-    job.setMapperClass(HCatMapReduceTest.MapCreate.class);
-
-    // input/output settings
-    job.setInputFormatClass(TextInputFormat.class);
-
-    Path path = new Path(fs.getWorkingDirectory(), "mapred/testHCatMapReduceInput");
-    createInputFile(path, writeCount);
-
-    TextInputFormat.setInputPaths(job, path);
-
-    job.setOutputFormatClass(HCatOutputFormat.class);
-
-    OutputJobInfo outputJobInfo = OutputJobInfo.create(dbName, tableName, partitionValues);
-    HCatOutputFormat.setOutput(job, outputJobInfo);
-
-    job.setMapOutputKeyClass(BytesWritable.class);
-    job.setMapOutputValueClass(DefaultHCatRecord.class);
-
-    job.setNumReduceTasks(0);
-
-    HCatOutputFormat.setSchema(job, new HCatSchema(partitionColumns));
-
-    boolean success = job.waitForCompletion(true);
-
-    // Ensure counters are set when data has actually been read.
-    if (partitionValues != null) {
-      assertTrue(job.getCounters().getGroup("FileSystemCounters")
-          .findCounter("FILE_BYTES_READ").getValue() > 0);
+        client.close();
     }
 
-    if (!HcatTestUtils.isHadoop23()) {
-        // Local mode outputcommitter hook is not invoked in Hadoop 1.x
-        if (success) {
-            new FileOutputCommitterContainer(job,null).commitJob(job);
-        } else {
-            new FileOutputCommitterContainer(job,null).abortJob(job, JobStatus.State.FAILED);
+
+    private void initTable() throws Exception {
+
+        String databaseName = (dbName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : dbName;
+
+        try {
+            client.dropTable(databaseName, tableName);
+        } catch (Exception e) {
+        } //can fail with NoSuchObjectException
+
+
+        Table tbl = new Table();
+        tbl.setDbName(databaseName);
+        tbl.setTableName(tableName);
+        tbl.setTableType("MANAGED_TABLE");
+        StorageDescriptor sd = new StorageDescriptor();
+
+        sd.setCols(getTableColumns());
+        tbl.setPartitionKeys(getPartitionKeys());
+
+        tbl.setSd(sd);
+
+        sd.setBucketCols(new ArrayList<String>(2));
+        sd.setSerdeInfo(new SerDeInfo());
+        sd.getSerdeInfo().setName(tbl.getTableName());
+        sd.getSerdeInfo().setParameters(new HashMap<String, String>());
+        sd.getSerdeInfo().getParameters().put(
+                org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
+        sd.getSerdeInfo().setSerializationLib(serdeClass);
+        sd.setInputFormat(inputFormat);
+        sd.setOutputFormat(outputFormat);
+
+        Map<String, String> tableParams = new HashMap<String, String>();
+        tbl.setParameters(tableParams);
+
+        client.createTable(tbl);
+    }
+
+    //Create test input file with specified number of rows
+    private void createInputFile(Path path, int rowCount) throws IOException {
+
+        if (fs.exists(path)) {
+            fs.delete(path, true);
+        }
+
+        FSDataOutputStream os = fs.create(path);
+
+        for (int i = 0; i < rowCount; i++) {
+            os.writeChars(i + "\n");
+        }
+
+        os.close();
+    }
+
+    public static class MapCreate extends
+            Mapper<LongWritable, Text, BytesWritable, HCatRecord> {
+
+        static int writeCount = 0; //test will be in local mode
+
+        @Override
+        public void map(LongWritable key, Text value, Context context
+        ) throws IOException, InterruptedException {
+            {
+                try {
+                    HCatRecord rec = writeRecords.get(writeCount);
+                    context.write(null, rec);
+                    writeCount++;
+
+                } catch (Exception e) {
+
+                    e.printStackTrace(System.err); //print since otherwise exception is lost
+                    throw new IOException(e);
+                }
+            }
         }
     }
-    if (assertWrite){
-      // we assert only if we expected to assert with this call.
-      Assert.assertEquals(writeCount, MapCreate.writeCount);
+
+    public static class MapRead extends
+            Mapper<WritableComparable, HCatRecord, BytesWritable, Text> {
+
+        static int readCount = 0; //test will be in local mode
+
+        @Override
+        public void map(WritableComparable key, HCatRecord value, Context context
+        ) throws IOException, InterruptedException {
+            {
+                try {
+                    readRecords.add(value);
+                    readCount++;
+                } catch (Exception e) {
+                    e.printStackTrace(); //print since otherwise exception is lost
+                    throw new IOException(e);
+                }
+            }
+        }
     }
 
-    return job;
-  }
+    Job runMRCreate(Map<String, String> partitionValues,
+                    List<HCatFieldSchema> partitionColumns, List<HCatRecord> records,
+                    int writeCount, boolean assertWrite) throws Exception {
 
-  List<HCatRecord> runMRRead(int readCount) throws Exception {
-    return runMRRead(readCount, null);
-  }
+        writeRecords = records;
+        MapCreate.writeCount = 0;
 
-  List<HCatRecord> runMRRead(int readCount, String filter) throws Exception {
+        Configuration conf = new Configuration();
+        Job job = new Job(conf, "hcat mapreduce write test");
+        job.setJarByClass(this.getClass());
+        job.setMapperClass(HCatMapReduceTest.MapCreate.class);
 
-    MapRead.readCount = 0;
-    readRecords.clear();
+        // input/output settings
+        job.setInputFormatClass(TextInputFormat.class);
 
-    Configuration conf = new Configuration();
-    Job job = new Job(conf, "hcat mapreduce read test");
-    job.setJarByClass(this.getClass());
-    job.setMapperClass(HCatMapReduceTest.MapRead.class);
+        Path path = new Path(fs.getWorkingDirectory(), "mapred/testHCatMapReduceInput");
+        createInputFile(path, writeCount);
 
-    // input/output settings
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
+        TextInputFormat.setInputPaths(job, path);
 
-    InputJobInfo inputJobInfo = InputJobInfo.create(dbName,tableName,filter);
-    HCatInputFormat.setInput(job, inputJobInfo);
+        job.setOutputFormatClass(HCatOutputFormat.class);
 
-    job.setMapOutputKeyClass(BytesWritable.class);
-    job.setMapOutputValueClass(Text.class);
+        OutputJobInfo outputJobInfo = OutputJobInfo.create(dbName, tableName, partitionValues);
+        HCatOutputFormat.setOutput(job, outputJobInfo);
 
-    job.setNumReduceTasks(0);
+        job.setMapOutputKeyClass(BytesWritable.class);
+        job.setMapOutputValueClass(DefaultHCatRecord.class);
 
-    Path path = new Path(fs.getWorkingDirectory(), "mapred/testHCatMapReduceOutput");
-    if( fs.exists(path) ) {
-      fs.delete(path, true);
+        job.setNumReduceTasks(0);
+
+        HCatOutputFormat.setSchema(job, new HCatSchema(partitionColumns));
+
+        boolean success = job.waitForCompletion(true);
+
+        // Ensure counters are set when data has actually been read.
+        if (partitionValues != null) {
+            assertTrue(job.getCounters().getGroup("FileSystemCounters")
+                    .findCounter("FILE_BYTES_READ").getValue() > 0);
+        }
+
+        if (!HcatTestUtils.isHadoop23()) {
+            // Local mode outputcommitter hook is not invoked in Hadoop 1.x
+            if (success) {
+                new FileOutputCommitterContainer(job, null).commitJob(job);
+            } else {
+                new FileOutputCommitterContainer(job, null).abortJob(job, JobStatus.State.FAILED);
+            }
+        }
+        if (assertWrite) {
+            // we assert only if we expected to assert with this call.
+            Assert.assertEquals(writeCount, MapCreate.writeCount);
+        }
+
+        return job;
     }
 
-    TextOutputFormat.setOutputPath(job, path);
+    List<HCatRecord> runMRRead(int readCount) throws Exception {
+        return runMRRead(readCount, null);
+    }
 
-    job.waitForCompletion(true);
-    Assert.assertEquals(readCount, MapRead.readCount);
+    List<HCatRecord> runMRRead(int readCount, String filter) throws Exception {
 
-    return readRecords;
-  }
+        MapRead.readCount = 0;
+        readRecords.clear();
+
+        Configuration conf = new Configuration();
+        Job job = new Job(conf, "hcat mapreduce read test");
+        job.setJarByClass(this.getClass());
+        job.setMapperClass(HCatMapReduceTest.MapRead.class);
+
+        // input/output settings
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+
+        InputJobInfo inputJobInfo = InputJobInfo.create(dbName, tableName, filter);
+        HCatInputFormat.setInput(job, inputJobInfo);
+
+        job.setMapOutputKeyClass(BytesWritable.class);
+        job.setMapOutputValueClass(Text.class);
+
+        job.setNumReduceTasks(0);
+
+        Path path = new Path(fs.getWorkingDirectory(), "mapred/testHCatMapReduceOutput");
+        if (fs.exists(path)) {
+            fs.delete(path, true);
+        }
+
+        TextOutputFormat.setOutputPath(job, path);
+
+        job.waitForCompletion(true);
+        Assert.assertEquals(readCount, MapRead.readCount);
+
+        return readRecords;
+    }
 
 
-  protected HCatSchema getTableSchema() throws Exception {
+    protected HCatSchema getTableSchema() throws Exception {
 
-    Configuration conf = new Configuration();
-    Job job = new Job(conf, "hcat mapreduce read schema test");
-    job.setJarByClass(this.getClass());
+        Configuration conf = new Configuration();
+        Job job = new Job(conf, "hcat mapreduce read schema test");
+        job.setJarByClass(this.getClass());
 
-    // input/output settings
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
+        // input/output settings
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
 
-    InputJobInfo inputJobInfo = InputJobInfo.create(dbName,tableName,null);
-    HCatInputFormat.setInput(job, inputJobInfo);
+        InputJobInfo inputJobInfo = InputJobInfo.create(dbName, tableName, null);
+        HCatInputFormat.setInput(job, inputJobInfo);
 
-    return HCatInputFormat.getTableSchema(job);
-  }
+        return HCatInputFormat.getTableSchema(job);
+    }
 
 }
 
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatDynamicPartitioned.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatDynamicPartitioned.java
index 77d59eb..c9b8ac5 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatDynamicPartitioned.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatDynamicPartitioned.java
@@ -39,124 +39,124 @@
 
 public class TestHCatDynamicPartitioned extends HCatMapReduceTest {
 
-  private List<HCatRecord> writeRecords;
-  private List<HCatFieldSchema> dataColumns;
-  private static final Logger LOG = LoggerFactory.getLogger(TestHCatDynamicPartitioned.class);
+    private List<HCatRecord> writeRecords;
+    private List<HCatFieldSchema> dataColumns;
+    private static final Logger LOG = LoggerFactory.getLogger(TestHCatDynamicPartitioned.class);
 
-  @Override
-  protected void initialize() throws Exception {
+    @Override
+    protected void initialize() throws Exception {
 
-    tableName = "testHCatDynamicPartitionedTable";
-    generateWriteRecords(20,5,0);
-    generateDataColumns();
-  }
-
-  private void generateDataColumns() throws HCatException {
-    dataColumns = new ArrayList<HCatFieldSchema>();
-    dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-    dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("p1", Constants.STRING_TYPE_NAME, "")));
-  }
-
-  private void generateWriteRecords(int max, int mod,int offset) {
-    writeRecords = new ArrayList<HCatRecord>();
-
-    for(int i = 0;i < max;i++) {
-      List<Object> objList = new ArrayList<Object>();
-
-      objList.add(i);
-      objList.add("strvalue" + i);
-      objList.add(String.valueOf((i % mod)+offset));
-      writeRecords.add(new DefaultHCatRecord(objList));
-    }
-  }
-
-  @Override
-  protected List<FieldSchema> getPartitionKeys() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    fields.add(new FieldSchema("p1", Constants.STRING_TYPE_NAME, ""));
-    return fields;
-  }
-
-  @Override
-  protected List<FieldSchema> getTableColumns() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
-    fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
-    return fields;
-  }
-
-
-  public void testHCatDynamicPartitionedTable() throws Exception {
-
-    generateWriteRecords(20,5,0);
-    runMRCreate(null, dataColumns, writeRecords, 20,true);
-
-    runMRRead(20);
-
-    //Read with partition filter
-    runMRRead(4, "p1 = \"0\"");
-    runMRRead(8, "p1 = \"1\" or p1 = \"3\"");
-    runMRRead(4, "p1 = \"4\"");
-
-    // read from hive to test
-
-    String query = "select * from " + tableName;
-    int retCode = driver.run(query).getResponseCode();
-
-    if( retCode != 0 ) {
-      throw new Exception("Error " + retCode + " running query " + query);
+        tableName = "testHCatDynamicPartitionedTable";
+        generateWriteRecords(20, 5, 0);
+        generateDataColumns();
     }
 
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    assertEquals(20, res.size());
-
-
-    //Test for duplicate publish
-    IOException exc = null;
-    try {
-      generateWriteRecords(20,5,0);
-      Job job = runMRCreate(null, dataColumns, writeRecords, 20,false);
-      if (HcatTestUtils.isHadoop23()) {
-          new FileOutputCommitterContainer(job,null).cleanupJob(job);
-      }
-    } catch(IOException e) {
-      exc = e;
+    private void generateDataColumns() throws HCatException {
+        dataColumns = new ArrayList<HCatFieldSchema>();
+        dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
+        dataColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("p1", Constants.STRING_TYPE_NAME, "")));
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertTrue( "Got exception of type ["+((HCatException) exc).getErrorType().toString()
-        + "] Expected ERROR_PUBLISHING_PARTITION or ERROR_MOVE_FAILED",
-        (ErrorType.ERROR_PUBLISHING_PARTITION == ((HCatException) exc).getErrorType())
-        || (ErrorType.ERROR_MOVE_FAILED == ((HCatException) exc).getErrorType())
+    private void generateWriteRecords(int max, int mod, int offset) {
+        writeRecords = new ArrayList<HCatRecord>();
+
+        for (int i = 0; i < max; i++) {
+            List<Object> objList = new ArrayList<Object>();
+
+            objList.add(i);
+            objList.add("strvalue" + i);
+            objList.add(String.valueOf((i % mod) + offset));
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+    }
+
+    @Override
+    protected List<FieldSchema> getPartitionKeys() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        fields.add(new FieldSchema("p1", Constants.STRING_TYPE_NAME, ""));
+        return fields;
+    }
+
+    @Override
+    protected List<FieldSchema> getTableColumns() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
+        fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
+        return fields;
+    }
+
+
+    public void testHCatDynamicPartitionedTable() throws Exception {
+
+        generateWriteRecords(20, 5, 0);
+        runMRCreate(null, dataColumns, writeRecords, 20, true);
+
+        runMRRead(20);
+
+        //Read with partition filter
+        runMRRead(4, "p1 = \"0\"");
+        runMRRead(8, "p1 = \"1\" or p1 = \"3\"");
+        runMRRead(4, "p1 = \"4\"");
+
+        // read from hive to test
+
+        String query = "select * from " + tableName;
+        int retCode = driver.run(query).getResponseCode();
+
+        if (retCode != 0) {
+            throw new Exception("Error " + retCode + " running query " + query);
+        }
+
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        assertEquals(20, res.size());
+
+
+        //Test for duplicate publish
+        IOException exc = null;
+        try {
+            generateWriteRecords(20, 5, 0);
+            Job job = runMRCreate(null, dataColumns, writeRecords, 20, false);
+            if (HcatTestUtils.isHadoop23()) {
+                new FileOutputCommitterContainer(job, null).cleanupJob(job);
+            }
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertTrue("Got exception of type [" + ((HCatException) exc).getErrorType().toString()
+                + "] Expected ERROR_PUBLISHING_PARTITION or ERROR_MOVE_FAILED",
+                (ErrorType.ERROR_PUBLISHING_PARTITION == ((HCatException) exc).getErrorType())
+                        || (ErrorType.ERROR_MOVE_FAILED == ((HCatException) exc).getErrorType())
         );
-  }
+    }
 
-//TODO 1.0 miniCluster is slow this test times out, make it work
+    //TODO 1.0 miniCluster is slow this test times out, make it work
 // renaming test to make test framework skip it
-  public void _testHCatDynamicPartitionMaxPartitions() throws Exception {
-    HiveConf hc = new HiveConf(this.getClass());
+    public void _testHCatDynamicPartitionMaxPartitions() throws Exception {
+        HiveConf hc = new HiveConf(this.getClass());
 
-    int maxParts = hiveConf.getIntVar(HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS);
-    LOG.info("Max partitions allowed = {}", maxParts);
+        int maxParts = hiveConf.getIntVar(HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTS);
+        LOG.info("Max partitions allowed = {}", maxParts);
 
-    IOException exc = null;
-    try {
-      generateWriteRecords(maxParts+5,maxParts+2,10);
-      runMRCreate(null,dataColumns,writeRecords,maxParts+5,false);
-    } catch(IOException e) {
-      exc = e;
+        IOException exc = null;
+        try {
+            generateWriteRecords(maxParts + 5, maxParts + 2, 10);
+            runMRCreate(null, dataColumns, writeRecords, maxParts + 5, false);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        if (HCatConstants.HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED) {
+            assertTrue(exc != null);
+            assertTrue(exc instanceof HCatException);
+            assertEquals(ErrorType.ERROR_TOO_MANY_DYNAMIC_PTNS, ((HCatException) exc).getErrorType());
+        } else {
+            assertTrue(exc == null);
+            runMRRead(maxParts + 5);
+        }
     }
-
-    if (HCatConstants.HCAT_IS_DYNAMIC_MAX_PTN_CHECK_ENABLED){
-      assertTrue(exc != null);
-      assertTrue(exc instanceof HCatException);
-      assertEquals(ErrorType.ERROR_TOO_MANY_DYNAMIC_PTNS, ((HCatException) exc).getErrorType());
-    }else{
-      assertTrue(exc == null);
-      runMRRead(maxParts+5);
-    }
-  }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveCompatibility.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveCompatibility.java
index b756024..aa450fc 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveCompatibility.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveCompatibility.java
@@ -35,95 +35,95 @@
 import org.junit.Test;
 
 public class TestHCatHiveCompatibility extends HCatBaseTest {
-  private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
+    private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
 
-  @BeforeClass
-  public static void createInputData() throws Exception {
-    int LOOP_SIZE = 11;
-    File file = new File(INPUT_FILE_NAME);
-    file.deleteOnExit();
-    FileWriter writer = new FileWriter(file);
-    for (int i = 0; i < LOOP_SIZE; i++) {
-      writer.write(i + "\t1\n");
-    }
-    writer.close();
-  }
-
-  @Test
-  public void testUnpartedReadWrite() throws Exception{
-
-    driver.run("drop table if exists junit_unparted_noisd");
-    String createTable = "create table junit_unparted_noisd(a int) stored as RCFILE";
-    Assert.assertEquals(0, driver.run(createTable).getResponseCode());
-
-    // assert that the table created has no hcat instrumentation, and that we're still able to read it.
-    Table table = client.getTable("default", "junit_unparted_noisd");
-    Assert.assertTrue(table.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
-
-    PigServer server = new PigServer(ExecType.LOCAL);
-    logAndRegister(server, "A = load '" + INPUT_FILE_NAME + "' as (a:int);");
-    logAndRegister(server, "store A into 'default.junit_unparted_noisd' using org.apache.hcatalog.pig.HCatStorer();");
-    logAndRegister(server, "B = load 'default.junit_unparted_noisd' using " + HCatLoader.class.getName() + "();");
-    Iterator<Tuple> itr= server.openIterator("B");
-
-    int i = 0;
-
-    while(itr.hasNext()){
-      Tuple t = itr.next();
-      Assert.assertEquals(1, t.size());
-      Assert.assertEquals(t.get(0), i);
-      i++;
+    @BeforeClass
+    public static void createInputData() throws Exception {
+        int LOOP_SIZE = 11;
+        File file = new File(INPUT_FILE_NAME);
+        file.deleteOnExit();
+        FileWriter writer = new FileWriter(file);
+        for (int i = 0; i < LOOP_SIZE; i++) {
+            writer.write(i + "\t1\n");
+        }
+        writer.close();
     }
 
-    Assert.assertFalse(itr.hasNext());
-    Assert.assertEquals(11, i);
+    @Test
+    public void testUnpartedReadWrite() throws Exception {
 
-    // assert that the table created still has no hcat instrumentation
-    Table table2 = client.getTable("default", "junit_unparted_noisd");
-    Assert.assertTrue(table2.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
+        driver.run("drop table if exists junit_unparted_noisd");
+        String createTable = "create table junit_unparted_noisd(a int) stored as RCFILE";
+        Assert.assertEquals(0, driver.run(createTable).getResponseCode());
 
-    driver.run("drop table junit_unparted_noisd");
-  }
+        // assert that the table created has no hcat instrumentation, and that we're still able to read it.
+        Table table = client.getTable("default", "junit_unparted_noisd");
+        Assert.assertTrue(table.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
 
-  @Test
-  public void testPartedRead() throws Exception{
+        PigServer server = new PigServer(ExecType.LOCAL);
+        logAndRegister(server, "A = load '" + INPUT_FILE_NAME + "' as (a:int);");
+        logAndRegister(server, "store A into 'default.junit_unparted_noisd' using org.apache.hcatalog.pig.HCatStorer();");
+        logAndRegister(server, "B = load 'default.junit_unparted_noisd' using " + HCatLoader.class.getName() + "();");
+        Iterator<Tuple> itr = server.openIterator("B");
 
-    driver.run("drop table if exists junit_parted_noisd");
-    String createTable = "create table junit_parted_noisd(a int) partitioned by (b string) stored as RCFILE";
-    Assert.assertEquals(0, driver.run(createTable).getResponseCode());
+        int i = 0;
 
-    // assert that the table created has no hcat instrumentation, and that we're still able to read it.
-    Table table = client.getTable("default", "junit_parted_noisd");
-    Assert.assertTrue(table.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
+        while (itr.hasNext()) {
+            Tuple t = itr.next();
+            Assert.assertEquals(1, t.size());
+            Assert.assertEquals(t.get(0), i);
+            i++;
+        }
 
-    PigServer server = new PigServer(ExecType.LOCAL);
-    logAndRegister(server, "A = load '" + INPUT_FILE_NAME + "' as (a:int);");
-    logAndRegister(server, "store A into 'default.junit_parted_noisd' using org.apache.hcatalog.pig.HCatStorer('b=42');");
-    logAndRegister(server, "B = load 'default.junit_parted_noisd' using " + HCatLoader.class.getName() + "();");
-    Iterator<Tuple> itr= server.openIterator("B");
+        Assert.assertFalse(itr.hasNext());
+        Assert.assertEquals(11, i);
 
-    int i = 0;
+        // assert that the table created still has no hcat instrumentation
+        Table table2 = client.getTable("default", "junit_unparted_noisd");
+        Assert.assertTrue(table2.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
 
-    while(itr.hasNext()){
-      Tuple t = itr.next();
-      Assert.assertEquals(2, t.size()); // Contains explicit field "a" and partition "b".
-      Assert.assertEquals(t.get(0), i);
-      Assert.assertEquals(t.get(1), "42");
-      i++;
+        driver.run("drop table junit_unparted_noisd");
     }
 
-    Assert.assertFalse(itr.hasNext());
-    Assert.assertEquals(11, i);
+    @Test
+    public void testPartedRead() throws Exception {
 
-    // assert that the table created still has no hcat instrumentation
-    Table table2 = client.getTable("default", "junit_parted_noisd");
-    Assert.assertTrue(table2.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
+        driver.run("drop table if exists junit_parted_noisd");
+        String createTable = "create table junit_parted_noisd(a int) partitioned by (b string) stored as RCFILE";
+        Assert.assertEquals(0, driver.run(createTable).getResponseCode());
 
-    // assert that there is one partition present, and it had hcat instrumentation inserted when it was created.
-    Partition ptn = client.getPartition("default", "junit_parted_noisd", Arrays.asList("42"));
+        // assert that the table created has no hcat instrumentation, and that we're still able to read it.
+        Table table = client.getTable("default", "junit_parted_noisd");
+        Assert.assertTrue(table.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
 
-    Assert.assertNotNull(ptn);
-    Assert.assertTrue(ptn.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
-    driver.run("drop table junit_unparted_noisd");
-  }
+        PigServer server = new PigServer(ExecType.LOCAL);
+        logAndRegister(server, "A = load '" + INPUT_FILE_NAME + "' as (a:int);");
+        logAndRegister(server, "store A into 'default.junit_parted_noisd' using org.apache.hcatalog.pig.HCatStorer('b=42');");
+        logAndRegister(server, "B = load 'default.junit_parted_noisd' using " + HCatLoader.class.getName() + "();");
+        Iterator<Tuple> itr = server.openIterator("B");
+
+        int i = 0;
+
+        while (itr.hasNext()) {
+            Tuple t = itr.next();
+            Assert.assertEquals(2, t.size()); // Contains explicit field "a" and partition "b".
+            Assert.assertEquals(t.get(0), i);
+            Assert.assertEquals(t.get(1), "42");
+            i++;
+        }
+
+        Assert.assertFalse(itr.hasNext());
+        Assert.assertEquals(11, i);
+
+        // assert that the table created still has no hcat instrumentation
+        Table table2 = client.getTable("default", "junit_parted_noisd");
+        Assert.assertTrue(table2.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
+
+        // assert that there is one partition present, and it had hcat instrumentation inserted when it was created.
+        Partition ptn = client.getPartition("default", "junit_parted_noisd", Arrays.asList("42"));
+
+        Assert.assertNotNull(ptn);
+        Assert.assertTrue(ptn.getSd().getInputFormat().equals(HCatConstants.HIVE_RCFILE_IF_CLASS));
+        driver.run("drop table junit_unparted_noisd");
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveThriftCompatibility.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveThriftCompatibility.java
index fd70188..62dcb7c 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveThriftCompatibility.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatHiveThriftCompatibility.java
@@ -39,77 +39,77 @@
 
 public class TestHCatHiveThriftCompatibility extends HCatBaseTest {
 
-  private boolean setUpComplete = false;
-  private Path intStringSeq;
+    private boolean setUpComplete = false;
+    private Path intStringSeq;
 
-  @Before
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-    if (setUpComplete) {
-      return;
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        if (setUpComplete) {
+            return;
+        }
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        TIOStreamTransport transport = new TIOStreamTransport(out);
+        TBinaryProtocol protocol = new TBinaryProtocol(transport);
+
+        IntString intString = new IntString(1, "one", 1);
+        intString.write(protocol);
+        BytesWritable bytesWritable = new BytesWritable(out.toByteArray());
+
+        intStringSeq = new Path(TEST_DATA_DIR + "/data/intString.seq");
+        LOG.info("Creating data file: " + intStringSeq);
+
+        SequenceFile.Writer seqFileWriter = SequenceFile.createWriter(
+                intStringSeq.getFileSystem(hiveConf), hiveConf, intStringSeq,
+                NullWritable.class, BytesWritable.class);
+        seqFileWriter.append(NullWritable.get(), bytesWritable);
+        seqFileWriter.close();
+
+        setUpComplete = true;
     }
 
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    TIOStreamTransport transport = new TIOStreamTransport(out);
-    TBinaryProtocol protocol = new TBinaryProtocol(transport);
+    /**
+     *  Create a table with no explicit schema and ensure its correctly
+     *  discovered from the thrift struct.
+     */
+    @Test
+    public void testDynamicCols() throws Exception {
+        Assert.assertEquals(0, driver.run("drop table if exists test_thrift").getResponseCode());
+        Assert.assertEquals(0, driver.run(
+                "create external table test_thrift " +
+                        "partitioned by (year string) " +
+                        "row format serde 'org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer' " +
+                        "with serdeproperties ( " +
+                        "  'serialization.class'='org.apache.hadoop.hive.serde2.thrift.test.IntString', " +
+                        "  'serialization.format'='org.apache.thrift.protocol.TBinaryProtocol') " +
+                        "stored as" +
+                        "  inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'" +
+                        "  outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'")
+                .getResponseCode());
+        Assert.assertEquals(0,
+                driver.run("alter table test_thrift add partition (year = '2012') location '" +
+                        intStringSeq.getParent() + "'").getResponseCode());
 
-    IntString intString = new IntString(1, "one", 1);
-    intString.write(protocol);
-    BytesWritable bytesWritable = new BytesWritable(out.toByteArray());
+        PigServer pigServer = new PigServer(ExecType.LOCAL);
+        pigServer.registerQuery("A = load 'test_thrift' using org.apache.hcatalog.pig.HCatLoader();");
 
-    intStringSeq = new Path(TEST_DATA_DIR + "/data/intString.seq");
-    LOG.info("Creating data file: " + intStringSeq);
+        Schema expectedSchema = new Schema();
+        expectedSchema.add(new Schema.FieldSchema("myint", DataType.INTEGER));
+        expectedSchema.add(new Schema.FieldSchema("mystring", DataType.CHARARRAY));
+        expectedSchema.add(new Schema.FieldSchema("underscore_int", DataType.INTEGER));
+        expectedSchema.add(new Schema.FieldSchema("year", DataType.CHARARRAY));
 
-    SequenceFile.Writer seqFileWriter = SequenceFile.createWriter(
-        intStringSeq.getFileSystem(hiveConf), hiveConf, intStringSeq,
-        NullWritable.class, BytesWritable.class);
-    seqFileWriter.append(NullWritable.get(), bytesWritable);
-    seqFileWriter.close();
+        Assert.assertEquals(expectedSchema, pigServer.dumpSchema("A"));
 
-    setUpComplete = true;
-  }
+        Iterator<Tuple> iterator = pigServer.openIterator("A");
+        Tuple t = iterator.next();
+        Assert.assertEquals(1, t.get(0));
+        Assert.assertEquals("one", t.get(1));
+        Assert.assertEquals(1, t.get(2));
+        Assert.assertEquals("2012", t.get(3));
 
-  /**
-   *  Create a table with no explicit schema and ensure its correctly
-   *  discovered from the thrift struct.
-   */
-  @Test
-  public void testDynamicCols() throws Exception {
-    Assert.assertEquals(0, driver.run("drop table if exists test_thrift").getResponseCode());
-    Assert.assertEquals(0, driver.run(
-        "create external table test_thrift " +
-            "partitioned by (year string) " +
-            "row format serde 'org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer' " +
-            "with serdeproperties ( " +
-            "  'serialization.class'='org.apache.hadoop.hive.serde2.thrift.test.IntString', " +
-            "  'serialization.format'='org.apache.thrift.protocol.TBinaryProtocol') " +
-            "stored as" +
-            "  inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'" +
-            "  outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'")
-        .getResponseCode());
-    Assert.assertEquals(0,
-        driver.run("alter table test_thrift add partition (year = '2012') location '" +
-            intStringSeq.getParent() + "'").getResponseCode());
-
-    PigServer pigServer = new PigServer(ExecType.LOCAL);
-    pigServer.registerQuery("A = load 'test_thrift' using org.apache.hcatalog.pig.HCatLoader();");
-
-    Schema expectedSchema = new Schema();
-    expectedSchema.add(new Schema.FieldSchema("myint", DataType.INTEGER));
-    expectedSchema.add(new Schema.FieldSchema("mystring", DataType.CHARARRAY));
-    expectedSchema.add(new Schema.FieldSchema("underscore_int", DataType.INTEGER));
-    expectedSchema.add(new Schema.FieldSchema("year", DataType.CHARARRAY));
-
-    Assert.assertEquals(expectedSchema, pigServer.dumpSchema("A"));
-
-    Iterator<Tuple> iterator = pigServer.openIterator("A");
-    Tuple t = iterator.next();
-    Assert.assertEquals(1, t.get(0));
-    Assert.assertEquals("one", t.get(1));
-    Assert.assertEquals(1, t.get(2));
-    Assert.assertEquals("2012", t.get(3));
-
-    Assert.assertFalse(iterator.hasNext());
-  }
+        Assert.assertFalse(iterator.hasNext());
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatInputFormat.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatInputFormat.java
index 33c61ac..a6b381e 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatInputFormat.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatInputFormat.java
@@ -41,107 +41,107 @@
 
 public class TestHCatInputFormat extends HCatBaseTest {
 
-  private boolean setUpComplete = false;
+    private boolean setUpComplete = false;
 
-  /**
-   * Create an input sequence file with 100 records; every 10th record is bad.
-   * Load this table into Hive.
-   */
-  @Before
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-    if (setUpComplete) {
-      return;
-    }
-
-    Path intStringSeq = new Path(TEST_DATA_DIR + "/data/intString.seq");
-    LOG.info("Creating data file: " + intStringSeq);
-    SequenceFile.Writer seqFileWriter = SequenceFile.createWriter(
-        intStringSeq.getFileSystem(hiveConf), hiveConf, intStringSeq,
-        NullWritable.class, BytesWritable.class);
-
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    TIOStreamTransport transport = new TIOStreamTransport(out);
-    TBinaryProtocol protocol = new TBinaryProtocol(transport);
-
-    for (int i = 1; i <= 100; i++) {
-      if (i % 10 == 0) {
-        seqFileWriter.append(NullWritable.get(), new BytesWritable("bad record".getBytes()));
-      } else {
-        out.reset();
-        IntString intString = new IntString(i, Integer.toString(i), i);
-        intString.write(protocol);
-        BytesWritable bytesWritable = new BytesWritable(out.toByteArray());
-        seqFileWriter.append(NullWritable.get(), bytesWritable);
-      }
-    }
-
-    seqFileWriter.close();
-
-    // Now let's load this file into a new Hive table.
-    Assert.assertEquals(0, driver.run("drop table if exists test_bad_records").getResponseCode());
-    Assert.assertEquals(0, driver.run(
-        "create table test_bad_records " +
-            "row format serde 'org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer' " +
-            "with serdeproperties ( " +
-            "  'serialization.class'='org.apache.hadoop.hive.serde2.thrift.test.IntString', " +
-            "  'serialization.format'='org.apache.thrift.protocol.TBinaryProtocol') " +
-            "stored as" +
-            "  inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'" +
-            "  outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'")
-        .getResponseCode());
-    Assert.assertEquals(0, driver.run("load data local inpath '" + intStringSeq.getParent() +
-        "' into table test_bad_records").getResponseCode());
-
-    setUpComplete = true;
-  }
-
-  @Test
-  public void testBadRecordHandlingPasses() throws Exception {
-    Assert.assertTrue(runJob(0.1f));
-  }
-
-  @Test
-  public void testBadRecordHandlingFails() throws Exception {
-    Assert.assertFalse(runJob(0.01f));
-  }
-
-  private boolean runJob(float badRecordThreshold) throws Exception {
-    Configuration conf = new Configuration();
-
-    conf.setFloat(HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY, badRecordThreshold);
-
-    Job job = new Job(conf);
-    job.setJarByClass(this.getClass());
-    job.setMapperClass(MyMapper.class);
-
-    job.setInputFormatClass(HCatInputFormat.class);
-    job.setOutputFormatClass(TextOutputFormat.class);
-
-    HCatInputFormat.setInput(job, InputJobInfo.create("default", "test_bad_records", null));
-
-    job.setMapOutputKeyClass(HCatRecord.class);
-    job.setMapOutputValueClass(HCatRecord.class);
-
-    job.setNumReduceTasks(0);
-
-    Path path = new Path(TEST_DATA_DIR, "test_bad_record_handling_output");
-    if (path.getFileSystem(conf).exists(path)) {
-      path.getFileSystem(conf).delete(path, true);
-    }
-
-    TextOutputFormat.setOutputPath(job, path);
-
-    return job.waitForCompletion(true);
-  }
-
-  public static class MyMapper extends Mapper<NullWritable, HCatRecord, NullWritable, Text> {
+    /**
+     * Create an input sequence file with 100 records; every 10th record is bad.
+     * Load this table into Hive.
+     */
+    @Before
     @Override
-    public void map(NullWritable key, HCatRecord value, Context context)
-        throws IOException, InterruptedException {
-      LOG.info("HCatRecord: " + value);
-      context.write(NullWritable.get(), new Text(value.toString()));
+    public void setUp() throws Exception {
+        super.setUp();
+        if (setUpComplete) {
+            return;
+        }
+
+        Path intStringSeq = new Path(TEST_DATA_DIR + "/data/intString.seq");
+        LOG.info("Creating data file: " + intStringSeq);
+        SequenceFile.Writer seqFileWriter = SequenceFile.createWriter(
+            intStringSeq.getFileSystem(hiveConf), hiveConf, intStringSeq,
+            NullWritable.class, BytesWritable.class);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        TIOStreamTransport transport = new TIOStreamTransport(out);
+        TBinaryProtocol protocol = new TBinaryProtocol(transport);
+
+        for (int i = 1; i <= 100; i++) {
+            if (i % 10 == 0) {
+                seqFileWriter.append(NullWritable.get(), new BytesWritable("bad record".getBytes()));
+            } else {
+                out.reset();
+                IntString intString = new IntString(i, Integer.toString(i), i);
+                intString.write(protocol);
+                BytesWritable bytesWritable = new BytesWritable(out.toByteArray());
+                seqFileWriter.append(NullWritable.get(), bytesWritable);
+            }
+        }
+
+        seqFileWriter.close();
+
+        // Now let's load this file into a new Hive table.
+        Assert.assertEquals(0, driver.run("drop table if exists test_bad_records").getResponseCode());
+        Assert.assertEquals(0, driver.run(
+            "create table test_bad_records " +
+                "row format serde 'org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer' " +
+                "with serdeproperties ( " +
+                "  'serialization.class'='org.apache.hadoop.hive.serde2.thrift.test.IntString', " +
+                "  'serialization.format'='org.apache.thrift.protocol.TBinaryProtocol') " +
+                "stored as" +
+                "  inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'" +
+                "  outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'")
+            .getResponseCode());
+        Assert.assertEquals(0, driver.run("load data local inpath '" + intStringSeq.getParent() +
+            "' into table test_bad_records").getResponseCode());
+
+        setUpComplete = true;
     }
-  }
+
+    @Test
+    public void testBadRecordHandlingPasses() throws Exception {
+        Assert.assertTrue(runJob(0.1f));
+    }
+
+    @Test
+    public void testBadRecordHandlingFails() throws Exception {
+        Assert.assertFalse(runJob(0.01f));
+    }
+
+    private boolean runJob(float badRecordThreshold) throws Exception {
+        Configuration conf = new Configuration();
+
+        conf.setFloat(HCatConstants.HCAT_INPUT_BAD_RECORD_THRESHOLD_KEY, badRecordThreshold);
+
+        Job job = new Job(conf);
+        job.setJarByClass(this.getClass());
+        job.setMapperClass(MyMapper.class);
+
+        job.setInputFormatClass(HCatInputFormat.class);
+        job.setOutputFormatClass(TextOutputFormat.class);
+
+        HCatInputFormat.setInput(job, InputJobInfo.create("default", "test_bad_records", null));
+
+        job.setMapOutputKeyClass(HCatRecord.class);
+        job.setMapOutputValueClass(HCatRecord.class);
+
+        job.setNumReduceTasks(0);
+
+        Path path = new Path(TEST_DATA_DIR, "test_bad_record_handling_output");
+        if (path.getFileSystem(conf).exists(path)) {
+            path.getFileSystem(conf).delete(path, true);
+        }
+
+        TextOutputFormat.setOutputPath(job, path);
+
+        return job.waitForCompletion(true);
+    }
+
+    public static class MyMapper extends Mapper<NullWritable, HCatRecord, NullWritable, Text> {
+        @Override
+        public void map(NullWritable key, HCatRecord value, Context context)
+            throws IOException, InterruptedException {
+            LOG.info("HCatRecord: " + value);
+            context.write(NullWritable.get(), new Text(value.toString()));
+        }
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatMultiOutputFormat.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatMultiOutputFormat.java
index 1d005ab..597ab94 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatMultiOutputFormat.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatMultiOutputFormat.java
@@ -100,8 +100,8 @@
         public void run() {
             try {
                 String warehouseConf = HiveConf.ConfVars.METASTOREWAREHOUSE.varname + "="
-                        + warehousedir.toString();
-                HiveMetaStore.main(new String[] {"-v", "-p", msPort, "--hiveconf", warehouseConf});
+                    + warehousedir.toString();
+                HiveMetaStore.main(new String[]{"-v", "-p", msPort, "--hiveconf", warehouseConf});
             } catch (Throwable t) {
                 System.err.println("Exiting. Got exception from metastore: " + t.getMessage());
             }
@@ -177,7 +177,7 @@
         FileSystem fs = FileSystem.get(conf);
         System.setProperty("hadoop.log.dir", new File(workDir, "/logs").getAbsolutePath());
         mrCluster = new MiniMRCluster(1, fs.getUri().toString(), 1, null, null,
-                new JobConf(conf));
+            new JobConf(conf));
         mrConf = mrCluster.createJobConf();
         fs.mkdirs(warehousedir);
 
@@ -192,7 +192,7 @@
         hiveConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTRETRIES, 3);
 
         hiveConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         hiveConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
         hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
         hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
@@ -239,9 +239,9 @@
         sd.setInputFormat(org.apache.hadoop.hive.ql.io.RCFileInputFormat.class.getName());
         sd.setOutputFormat(org.apache.hadoop.hive.ql.io.RCFileOutputFormat.class.getName());
         sd.getSerdeInfo().getParameters().put(
-                org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
+            org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
         sd.getSerdeInfo().setSerializationLib(
-                org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe.class.getName());
+            org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe.class.getName());
         tbl.setPartitionKeys(ColumnHolder.partitionCols);
 
         hmsc.createTable(tbl);
@@ -291,10 +291,10 @@
 
         for (int i = 0; i < tableNames.length; i++) {
             configurer.addOutputFormat(tableNames[i], HCatOutputFormat.class, BytesWritable.class,
-                    HCatRecord.class);
+                HCatRecord.class);
             HCatOutputFormat.setOutput(configurer.getJob(tableNames[i]), infoList.get(i));
             HCatOutputFormat.setSchema(configurer.getJob(tableNames[i]),
-                    schemaMap.get(tableNames[i]));
+                schemaMap.get(tableNames[i]));
         }
         configurer.configure();
 
@@ -307,26 +307,26 @@
             outputs.add(getTableData(tbl, "default").get(0));
         }
         Assert.assertEquals("Comparing output of table " +
-                tableNames[0] + " is not correct", outputs.get(0), "a,a,1,ag");
+            tableNames[0] + " is not correct", outputs.get(0), "a,a,1,ag");
         Assert.assertEquals("Comparing output of table " +
-                tableNames[1] + " is not correct", outputs.get(1), "a,1,ag");
+            tableNames[1] + " is not correct", outputs.get(1), "a,1,ag");
         Assert.assertEquals("Comparing output of table " +
-                tableNames[2] + " is not correct", outputs.get(2), "a,a,extra,1,ag");
+            tableNames[2] + " is not correct", outputs.get(2), "a,a,extra,1,ag");
 
         // Check permisssion on partition dirs and files created
         for (int i = 0; i < tableNames.length; i++) {
             Path partitionFile = new Path(warehousedir + "/" + tableNames[i]
-                    + "/ds=1/cluster=ag/part-m-00000");
+                + "/ds=1/cluster=ag/part-m-00000");
             FileSystem fs = partitionFile.getFileSystem(mrConf);
             Assert.assertEquals("File permissions of table " + tableNames[i] + " is not correct",
-                    fs.getFileStatus(partitionFile).getPermission(),
-                    new FsPermission(tablePerms[i]));
+                fs.getFileStatus(partitionFile).getPermission(),
+                new FsPermission(tablePerms[i]));
             Assert.assertEquals("File permissions of table " + tableNames[i] + " is not correct",
-                    fs.getFileStatus(partitionFile.getParent()).getPermission(),
-                    new FsPermission(tablePerms[i]));
+                fs.getFileStatus(partitionFile.getParent()).getPermission(),
+                new FsPermission(tablePerms[i]));
             Assert.assertEquals("File permissions of table " + tableNames[i] + " is not correct",
-                    fs.getFileStatus(partitionFile.getParent().getParent()).getPermission(),
-                    new FsPermission(tablePerms[i]));
+                fs.getFileStatus(partitionFile.getParent().getParent()).getPermission(),
+                new FsPermission(tablePerms[i]));
 
         }
         LOG.info("File permissions verified");
@@ -392,13 +392,13 @@
     }
 
     private static class MyMapper extends
-            Mapper<LongWritable, Text, BytesWritable, HCatRecord> {
+        Mapper<LongWritable, Text, BytesWritable, HCatRecord> {
 
         private int i = 0;
 
         @Override
         protected void map(LongWritable key, Text value, Context context)
-                throws IOException, InterruptedException {
+            throws IOException, InterruptedException {
             HCatRecord record = null;
             String[] splits = value.toString().split(",");
             switch (i) {
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatNonPartitioned.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatNonPartitioned.java
index 3ba64a5..bc2c08d 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatNonPartitioned.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatNonPartitioned.java
@@ -35,96 +35,96 @@
 
 public class TestHCatNonPartitioned extends HCatMapReduceTest {
 
-  private List<HCatRecord> writeRecords;
-  List<HCatFieldSchema> partitionColumns;
+    private List<HCatRecord> writeRecords;
+    List<HCatFieldSchema> partitionColumns;
 
-  @Override
-  protected void initialize() throws HCatException {
+    @Override
+    protected void initialize() throws HCatException {
 
-    dbName = null; //test if null dbName works ("default" is used)
-    tableName = "testHCatNonPartitionedTable";
+        dbName = null; //test if null dbName works ("default" is used)
+        tableName = "testHCatNonPartitionedTable";
 
-    writeRecords = new ArrayList<HCatRecord>();
+        writeRecords = new ArrayList<HCatRecord>();
 
-    for(int i = 0;i < 20;i++) {
-      List<Object> objList = new ArrayList<Object>();
+        for (int i = 0; i < 20; i++) {
+            List<Object> objList = new ArrayList<Object>();
 
-      objList.add(i);
-      objList.add("strvalue" + i);
-      writeRecords.add(new DefaultHCatRecord(objList));
+            objList.add(i);
+            objList.add("strvalue" + i);
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
     }
 
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-  }
-
-  @Override
-  protected List<FieldSchema> getPartitionKeys() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    //empty list, non partitioned
-    return fields;
-  }
-
-  @Override
-  protected List<FieldSchema> getTableColumns() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
-    fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
-    return fields;
-  }
-
-
-  public void testHCatNonPartitionedTable() throws Exception {
-
-    Map<String, String> partitionMap = new HashMap<String, String>();
-    runMRCreate(null, partitionColumns, writeRecords, 10,true);
-
-    //Test for duplicate publish
-    IOException exc = null;
-    try {
-      runMRCreate(null,  partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
+    @Override
+    protected List<FieldSchema> getPartitionKeys() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        //empty list, non partitioned
+        return fields;
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_NON_EMPTY_TABLE, ((HCatException) exc).getErrorType());
-
-    //Test for publish with invalid partition key name
-    exc = null;
-    partitionMap.clear();
-    partitionMap.put("px", "p1value2");
-
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
+    @Override
+    protected List<FieldSchema> getTableColumns() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
+        fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
+        return fields;
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_INVALID_PARTITION_VALUES, ((HCatException) exc).getErrorType());
 
-    //Read should get 10 rows
-    runMRRead(10);
+    public void testHCatNonPartitionedTable() throws Exception {
 
-    hiveReadTest();
-  }
+        Map<String, String> partitionMap = new HashMap<String, String>();
+        runMRCreate(null, partitionColumns, writeRecords, 10, true);
 
-  //Test that data inserted through hcatoutputformat is readable from hive
-  private void hiveReadTest() throws Exception {
+        //Test for duplicate publish
+        IOException exc = null;
+        try {
+            runMRCreate(null, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
 
-    String query = "select * from " + tableName;
-    int retCode = driver.run(query).getResponseCode();
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_NON_EMPTY_TABLE, ((HCatException) exc).getErrorType());
 
-    if( retCode != 0 ) {
-      throw new Exception("Error " + retCode + " running query " + query);
+        //Test for publish with invalid partition key name
+        exc = null;
+        partitionMap.clear();
+        partitionMap.put("px", "p1value2");
+
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_INVALID_PARTITION_VALUES, ((HCatException) exc).getErrorType());
+
+        //Read should get 10 rows
+        runMRRead(10);
+
+        hiveReadTest();
     }
 
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    assertEquals(10, res.size());
-  }
+    //Test that data inserted through hcatoutputformat is readable from hive
+    private void hiveReadTest() throws Exception {
+
+        String query = "select * from " + tableName;
+        int retCode = driver.run(query).getResponseCode();
+
+        if (retCode != 0) {
+            throw new Exception("Error " + retCode + " running query " + query);
+        }
+
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        assertEquals(10, res.size());
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatOutputFormat.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatOutputFormat.java
index 91192f0..1895cc4 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatOutputFormat.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatOutputFormat.java
@@ -46,120 +46,122 @@
 
 public class TestHCatOutputFormat extends TestCase {
 
-  private static final Logger LOG = LoggerFactory.getLogger(TestHCatOutputFormat.class);
-  private HiveMetaStoreClient client;
-  private HiveConf hiveConf;
+    private static final Logger LOG = LoggerFactory.getLogger(TestHCatOutputFormat.class);
+    private HiveMetaStoreClient client;
+    private HiveConf hiveConf;
 
-  private static final String dbName = "hcatOutputFormatTestDB";
-  private static final String tblName = "hcatOutputFormatTestTable";
+    private static final String dbName = "hcatOutputFormatTestDB";
+    private static final String tblName = "hcatOutputFormatTestTable";
 
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    hiveConf = new HiveConf(this.getClass());
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        hiveConf = new HiveConf(this.getClass());
 
-    try {
-      client = new HiveMetaStoreClient(hiveConf, null);
+        try {
+            client = new HiveMetaStoreClient(hiveConf, null);
 
-      initTable();
-    } catch (Throwable e) {
-      LOG.error("Unable to open the metastore", e);
-      throw new Exception(e);
+            initTable();
+        } catch (Throwable e) {
+            LOG.error("Unable to open the metastore", e);
+            throw new Exception(e);
+        }
     }
-  }
 
-  @Override
-  protected void tearDown() throws Exception {
-    try {
-      super.tearDown();
-      client.dropTable(dbName, tblName);
-      client.dropDatabase(dbName);
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            super.tearDown();
+            client.dropTable(dbName, tblName);
+            client.dropDatabase(dbName);
 
-      client.close();
-    } catch (Throwable e) {
-        LOG.error("Unable to close metastore", e);
-      throw new Exception(e);
+            client.close();
+        } catch (Throwable e) {
+            LOG.error("Unable to close metastore", e);
+            throw new Exception(e);
+        }
     }
-  }
 
-  private void initTable() throws Exception {
+    private void initTable() throws Exception {
 
-    try {
-      client.dropTable(dbName, tblName);
-    } catch(Exception e) {}
-    try {
-      client.dropDatabase(dbName);
-    } catch(Exception e) {}
-    client.createDatabase(new Database(dbName, "", null,null));
-    assertNotNull((client.getDatabase(dbName).getLocationUri()));
+        try {
+            client.dropTable(dbName, tblName);
+        } catch (Exception e) {
+        }
+        try {
+            client.dropDatabase(dbName);
+        } catch (Exception e) {
+        }
+        client.createDatabase(new Database(dbName, "", null, null));
+        assertNotNull((client.getDatabase(dbName).getLocationUri()));
 
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    fields.add(new FieldSchema("colname", Constants.STRING_TYPE_NAME, ""));
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        fields.add(new FieldSchema("colname", Constants.STRING_TYPE_NAME, ""));
 
-    Table tbl = new Table();
-    tbl.setDbName(dbName);
-    tbl.setTableName(tblName);
-    StorageDescriptor sd = new StorageDescriptor();
-    sd.setCols(fields);
-    tbl.setSd(sd);
+        Table tbl = new Table();
+        tbl.setDbName(dbName);
+        tbl.setTableName(tblName);
+        StorageDescriptor sd = new StorageDescriptor();
+        sd.setCols(fields);
+        tbl.setSd(sd);
 
-    //sd.setLocation("hdfs://tmp");
-    sd.setInputFormat(RCFileInputFormat.class.getName());
-    sd.setOutputFormat(RCFileOutputFormat.class.getName());
-    sd.setParameters(new HashMap<String, String>());
-    sd.getParameters().put("test_param_1", "Use this for comments etc");
-    //sd.setBucketCols(new ArrayList<String>(2));
-    //sd.getBucketCols().add("name");
-    sd.setSerdeInfo(new SerDeInfo());
-    sd.getSerdeInfo().setName(tbl.getTableName());
-    sd.getSerdeInfo().setParameters(new HashMap<String, String>());
-    sd.getSerdeInfo().getParameters().put(
-        org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
-    sd.getSerdeInfo().setSerializationLib(
-        org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class.getName());
-    tbl.setPartitionKeys(fields);
+        //sd.setLocation("hdfs://tmp");
+        sd.setInputFormat(RCFileInputFormat.class.getName());
+        sd.setOutputFormat(RCFileOutputFormat.class.getName());
+        sd.setParameters(new HashMap<String, String>());
+        sd.getParameters().put("test_param_1", "Use this for comments etc");
+        //sd.setBucketCols(new ArrayList<String>(2));
+        //sd.getBucketCols().add("name");
+        sd.setSerdeInfo(new SerDeInfo());
+        sd.getSerdeInfo().setName(tbl.getTableName());
+        sd.getSerdeInfo().setParameters(new HashMap<String, String>());
+        sd.getSerdeInfo().getParameters().put(
+                org.apache.hadoop.hive.serde.Constants.SERIALIZATION_FORMAT, "1");
+        sd.getSerdeInfo().setSerializationLib(
+                org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class.getName());
+        tbl.setPartitionKeys(fields);
 
-    Map<String, String> tableParams = new HashMap<String, String>();
-    tableParams.put("hcat.testarg", "testArgValue");
+        Map<String, String> tableParams = new HashMap<String, String>();
+        tableParams.put("hcat.testarg", "testArgValue");
 
-    tbl.setParameters(tableParams);
+        tbl.setParameters(tableParams);
 
-    client.createTable(tbl);
-    Path tblPath = new Path(client.getTable(dbName, tblName).getSd().getLocation());
-    assertTrue(tblPath.getFileSystem(hiveConf).mkdirs(new Path(tblPath,"colname=p1")));
+        client.createTable(tbl);
+        Path tblPath = new Path(client.getTable(dbName, tblName).getSd().getLocation());
+        assertTrue(tblPath.getFileSystem(hiveConf).mkdirs(new Path(tblPath, "colname=p1")));
 
-  }
+    }
 
-  public void testSetOutput() throws Exception {
-    Configuration conf = new Configuration();
-    Job job = new Job(conf, "test outputformat");
+    public void testSetOutput() throws Exception {
+        Configuration conf = new Configuration();
+        Job job = new Job(conf, "test outputformat");
 
-    Map<String, String> partitionValues = new HashMap<String, String>();
-    partitionValues.put("colname", "p1");
-    //null server url means local mode
-    OutputJobInfo info = OutputJobInfo.create(dbName, tblName, partitionValues);
+        Map<String, String> partitionValues = new HashMap<String, String>();
+        partitionValues.put("colname", "p1");
+        //null server url means local mode
+        OutputJobInfo info = OutputJobInfo.create(dbName, tblName, partitionValues);
 
-    HCatOutputFormat.setOutput(job, info);
-    OutputJobInfo jobInfo = HCatOutputFormat.getJobInfo(job);
+        HCatOutputFormat.setOutput(job, info);
+        OutputJobInfo jobInfo = HCatOutputFormat.getJobInfo(job);
 
-    assertNotNull(jobInfo.getTableInfo());
-    assertEquals(1, jobInfo.getPartitionValues().size());
-    assertEquals("p1", jobInfo.getPartitionValues().get("colname"));
-    assertEquals(1, jobInfo.getTableInfo().getDataColumns().getFields().size());
-    assertEquals("colname", jobInfo.getTableInfo().getDataColumns().getFields().get(0).getName());
+        assertNotNull(jobInfo.getTableInfo());
+        assertEquals(1, jobInfo.getPartitionValues().size());
+        assertEquals("p1", jobInfo.getPartitionValues().get("colname"));
+        assertEquals(1, jobInfo.getTableInfo().getDataColumns().getFields().size());
+        assertEquals("colname", jobInfo.getTableInfo().getDataColumns().getFields().get(0).getName());
 
-    publishTest(job);
-  }
+        publishTest(job);
+    }
 
-  public void publishTest(Job job) throws Exception {
-    OutputCommitter committer = new FileOutputCommitterContainer(job,null);
-    committer.cleanupJob(job);
+    public void publishTest(Job job) throws Exception {
+        OutputCommitter committer = new FileOutputCommitterContainer(job, null);
+        committer.cleanupJob(job);
 
-    Partition part = client.getPartition(dbName, tblName, Arrays.asList("p1"));
-    assertNotNull(part);
+        Partition part = client.getPartition(dbName, tblName, Arrays.asList("p1"));
+        assertNotNull(part);
 
-    StorerInfo storer = InternalUtil.extractStorerInfo(part.getSd(),part.getParameters());
-    assertEquals(storer.getProperties().get("hcat.testarg"), "testArgValue");
-    assertTrue(part.getSd().getLocation().indexOf("p1") != -1);
-  }
+        StorerInfo storer = InternalUtil.extractStorerInfo(part.getSd(), part.getParameters());
+        assertEquals(storer.getProperties().get("hcat.testarg"), "testArgValue");
+        assertTrue(part.getSd().getLocation().indexOf("p1") != -1);
+    }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestHCatPartitioned.java b/src/test/org/apache/hcatalog/mapreduce/TestHCatPartitioned.java
index 42ad9fd..c9561a9 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestHCatPartitioned.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestHCatPartitioned.java
@@ -36,309 +36,309 @@
 
 public class TestHCatPartitioned extends HCatMapReduceTest {
 
-  private List<HCatRecord> writeRecords;
-  private List<HCatFieldSchema> partitionColumns;
+    private List<HCatRecord> writeRecords;
+    private List<HCatFieldSchema> partitionColumns;
 
-  @Override
-  protected void initialize() throws Exception {
+    @Override
+    protected void initialize() throws Exception {
 
-    tableName = "testHCatPartitionedTable";
-    writeRecords = new ArrayList<HCatRecord>();
+        tableName = "testHCatPartitionedTable";
+        writeRecords = new ArrayList<HCatRecord>();
 
-    for(int i = 0;i < 20;i++) {
-      List<Object> objList = new ArrayList<Object>();
+        for (int i = 0; i < 20; i++) {
+            List<Object> objList = new ArrayList<Object>();
 
-      objList.add(i);
-      objList.add("strvalue" + i);
-      writeRecords.add(new DefaultHCatRecord(objList));
+            objList.add(i);
+            objList.add("strvalue" + i);
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
     }
 
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-  }
 
-
-  @Override
-  protected List<FieldSchema> getPartitionKeys() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    //Defining partition names in unsorted order
-    fields.add(new FieldSchema("PaRT1", Constants.STRING_TYPE_NAME, ""));
-    fields.add(new FieldSchema("part0", Constants.STRING_TYPE_NAME, ""));
-    return fields;
-  }
-
-  @Override
-  protected List<FieldSchema> getTableColumns() {
-    List<FieldSchema> fields = new ArrayList<FieldSchema>();
-    fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
-    fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
-    return fields;
-  }
-
-
-  public void testHCatPartitionedTable() throws Exception {
-
-    Map<String, String> partitionMap = new HashMap<String, String>();
-    partitionMap.put("part1", "p1value1");
-    partitionMap.put("part0", "p0value1");
-
-    runMRCreate(partitionMap, partitionColumns, writeRecords, 10,true);
-
-    partitionMap.clear();
-    partitionMap.put("PART1", "p1value2");
-    partitionMap.put("PART0", "p0value2");
-
-    runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-
-    //Test for duplicate publish
-    IOException exc = null;
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
+    @Override
+    protected List<FieldSchema> getPartitionKeys() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        //Defining partition names in unsorted order
+        fields.add(new FieldSchema("PaRT1", Constants.STRING_TYPE_NAME, ""));
+        fields.add(new FieldSchema("part0", Constants.STRING_TYPE_NAME, ""));
+        return fields;
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_DUPLICATE_PARTITION, ((HCatException) exc).getErrorType());
-
-    //Test for publish with invalid partition key name
-    exc = null;
-    partitionMap.clear();
-    partitionMap.put("px1", "p1value2");
-    partitionMap.put("px0", "p0value2");
-
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
+    @Override
+    protected List<FieldSchema> getTableColumns() {
+        List<FieldSchema> fields = new ArrayList<FieldSchema>();
+        fields.add(new FieldSchema("c1", Constants.INT_TYPE_NAME, ""));
+        fields.add(new FieldSchema("c2", Constants.STRING_TYPE_NAME, ""));
+        return fields;
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_MISSING_PARTITION_KEY, ((HCatException) exc).getErrorType());
 
-    //Test for publish with missing partition key values
-    exc = null;
-    partitionMap.clear();
-    partitionMap.put("px", "p1value2");
+    public void testHCatPartitionedTable() throws Exception {
 
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
-    }
+        Map<String, String> partitionMap = new HashMap<String, String>();
+        partitionMap.put("part1", "p1value1");
+        partitionMap.put("part0", "p0value1");
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_INVALID_PARTITION_VALUES, ((HCatException) exc).getErrorType());
+        runMRCreate(partitionMap, partitionColumns, writeRecords, 10, true);
+
+        partitionMap.clear();
+        partitionMap.put("PART1", "p1value2");
+        partitionMap.put("PART0", "p0value2");
+
+        runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+
+        //Test for duplicate publish
+        IOException exc = null;
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_DUPLICATE_PARTITION, ((HCatException) exc).getErrorType());
+
+        //Test for publish with invalid partition key name
+        exc = null;
+        partitionMap.clear();
+        partitionMap.put("px1", "p1value2");
+        partitionMap.put("px0", "p0value2");
+
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_MISSING_PARTITION_KEY, ((HCatException) exc).getErrorType());
+
+        //Test for publish with missing partition key values
+        exc = null;
+        partitionMap.clear();
+        partitionMap.put("px", "p1value2");
+
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_INVALID_PARTITION_VALUES, ((HCatException) exc).getErrorType());
 
 
-    //Test for null partition value map
-    exc = null;
-    try {
-      runMRCreate(null, partitionColumns, writeRecords, 20,false);
-    } catch(IOException e) {
-      exc = e;
-    }
+        //Test for null partition value map
+        exc = null;
+        try {
+            runMRCreate(null, partitionColumns, writeRecords, 20, false);
+        } catch (IOException e) {
+            exc = e;
+        }
 
-    assertTrue(exc == null);
+        assertTrue(exc == null);
 //    assertTrue(exc instanceof HCatException);
 //    assertEquals(ErrorType.ERROR_PUBLISHING_PARTITION, ((HCatException) exc).getErrorType());
-    // With Dynamic partitioning, this isn't an error that the keyValues specified didn't values
+        // With Dynamic partitioning, this isn't an error that the keyValues specified didn't values
 
-    //Read should get 10 + 20 rows
-    runMRRead(30);
+        //Read should get 10 + 20 rows
+        runMRRead(30);
 
-    //Read with partition filter
-    runMRRead(10, "part1 = \"p1value1\"");
-    runMRRead(20, "part1 = \"p1value2\"");
-    runMRRead(30, "part1 = \"p1value1\" or part1 = \"p1value2\"");
-    runMRRead(10, "part0 = \"p0value1\"");
-    runMRRead(20, "part0 = \"p0value2\"");
-    runMRRead(30, "part0 = \"p0value1\" or part0 = \"p0value2\"");
+        //Read with partition filter
+        runMRRead(10, "part1 = \"p1value1\"");
+        runMRRead(20, "part1 = \"p1value2\"");
+        runMRRead(30, "part1 = \"p1value1\" or part1 = \"p1value2\"");
+        runMRRead(10, "part0 = \"p0value1\"");
+        runMRRead(20, "part0 = \"p0value2\"");
+        runMRRead(30, "part0 = \"p0value1\" or part0 = \"p0value2\"");
 
-    tableSchemaTest();
-    columnOrderChangeTest();
-    hiveReadTest();
-  }
-
-
-  //test that new columns gets added to table schema
-  private void tableSchemaTest() throws Exception {
-
-    HCatSchema tableSchema = getTableSchema();
-
-    assertEquals(4, tableSchema.getFields().size());
-
-    //Update partition schema to have 3 fields
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
-
-    writeRecords = new ArrayList<HCatRecord>();
-
-    for(int i = 0;i < 20;i++) {
-      List<Object> objList = new ArrayList<Object>();
-
-      objList.add(i);
-      objList.add("strvalue" + i);
-      objList.add("str2value" + i);
-
-      writeRecords.add(new DefaultHCatRecord(objList));
+        tableSchemaTest();
+        columnOrderChangeTest();
+        hiveReadTest();
     }
 
-    Map<String, String> partitionMap = new HashMap<String, String>();
-    partitionMap.put("part1", "p1value5");
-    partitionMap.put("part0", "p0value5");
 
-    runMRCreate(partitionMap, partitionColumns, writeRecords, 10,true);
+    //test that new columns gets added to table schema
+    private void tableSchemaTest() throws Exception {
 
-    tableSchema = getTableSchema();
+        HCatSchema tableSchema = getTableSchema();
 
-    //assert that c3 has got added to table schema
-    assertEquals(5, tableSchema.getFields().size());
-    assertEquals("c1", tableSchema.getFields().get(0).getName());
-    assertEquals("c2", tableSchema.getFields().get(1).getName());
-    assertEquals("c3", tableSchema.getFields().get(2).getName());
-    assertEquals("part1", tableSchema.getFields().get(3).getName());
-    assertEquals("part0", tableSchema.getFields().get(4).getName());
+        assertEquals(4, tableSchema.getFields().size());
 
-    //Test that changing column data type fails
-    partitionMap.clear();
-    partitionMap.put("part1", "p1value6");
-    partitionMap.put("part0", "p0value6");
+        //Update partition schema to have 3 fields
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
 
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.INT_TYPE_NAME, "")));
+        writeRecords = new ArrayList<HCatRecord>();
 
-    IOException exc = null;
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 20,true);
-    } catch(IOException e) {
-      exc = e;
+        for (int i = 0; i < 20; i++) {
+            List<Object> objList = new ArrayList<Object>();
+
+            objList.add(i);
+            objList.add("strvalue" + i);
+            objList.add("str2value" + i);
+
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+
+        Map<String, String> partitionMap = new HashMap<String, String>();
+        partitionMap.put("part1", "p1value5");
+        partitionMap.put("part0", "p0value5");
+
+        runMRCreate(partitionMap, partitionColumns, writeRecords, 10, true);
+
+        tableSchema = getTableSchema();
+
+        //assert that c3 has got added to table schema
+        assertEquals(5, tableSchema.getFields().size());
+        assertEquals("c1", tableSchema.getFields().get(0).getName());
+        assertEquals("c2", tableSchema.getFields().get(1).getName());
+        assertEquals("c3", tableSchema.getFields().get(2).getName());
+        assertEquals("part1", tableSchema.getFields().get(3).getName());
+        assertEquals("part0", tableSchema.getFields().get(4).getName());
+
+        //Test that changing column data type fails
+        partitionMap.clear();
+        partitionMap.put("part1", "p1value6");
+        partitionMap.put("part0", "p0value6");
+
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.INT_TYPE_NAME, "")));
+
+        IOException exc = null;
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_SCHEMA_TYPE_MISMATCH, ((HCatException) exc).getErrorType());
+
+        //Test that partition key is not allowed in data
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("part1", Constants.STRING_TYPE_NAME, "")));
+
+        List<HCatRecord> recordsContainingPartitionCols = new ArrayList<HCatRecord>(20);
+        for (int i = 0; i < 20; i++) {
+            List<Object> objList = new ArrayList<Object>();
+
+            objList.add(i);
+            objList.add("c2value" + i);
+            objList.add("c3value" + i);
+            objList.add("p1value6");
+
+            recordsContainingPartitionCols.add(new DefaultHCatRecord(objList));
+        }
+
+        exc = null;
+        try {
+            runMRCreate(partitionMap, partitionColumns, recordsContainingPartitionCols, 20, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        List<HCatRecord> records = runMRRead(20, "part1 = \"p1value6\"");
+        assertEquals(20, records.size());
+        records = runMRRead(20, "part0 = \"p0value6\"");
+        assertEquals(20, records.size());
+        Integer i = 0;
+        for (HCatRecord rec : records) {
+            assertEquals(5, rec.size());
+            assertTrue(rec.get(0).equals(i));
+            assertTrue(rec.get(1).equals("c2value" + i));
+            assertTrue(rec.get(2).equals("c3value" + i));
+            assertTrue(rec.get(3).equals("p1value6"));
+            assertTrue(rec.get(4).equals("p0value6"));
+            i++;
+        }
     }
 
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_SCHEMA_TYPE_MISMATCH, ((HCatException) exc).getErrorType());
+    //check behavior while change the order of columns
+    private void columnOrderChangeTest() throws Exception {
 
-    //Test that partition key is not allowed in data
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("part1", Constants.STRING_TYPE_NAME, "")));
+        HCatSchema tableSchema = getTableSchema();
 
-    List<HCatRecord> recordsContainingPartitionCols = new ArrayList<HCatRecord>(20);
-    for(int i = 0;i < 20;i++) {
-      List<Object> objList = new ArrayList<Object>();
+        assertEquals(5, tableSchema.getFields().size());
 
-      objList.add(i);
-      objList.add("c2value" + i);
-      objList.add("c3value" + i);
-      objList.add("p1value6");
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
 
-      recordsContainingPartitionCols.add(new DefaultHCatRecord(objList));
+
+        writeRecords = new ArrayList<HCatRecord>();
+
+        for (int i = 0; i < 10; i++) {
+            List<Object> objList = new ArrayList<Object>();
+
+            objList.add(i);
+            objList.add("co strvalue" + i);
+            objList.add("co str2value" + i);
+
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+
+        Map<String, String> partitionMap = new HashMap<String, String>();
+        partitionMap.put("part1", "p1value8");
+        partitionMap.put("part0", "p0value8");
+
+        Exception exc = null;
+        try {
+            runMRCreate(partitionMap, partitionColumns, writeRecords, 10, true);
+        } catch (IOException e) {
+            exc = e;
+        }
+
+        assertTrue(exc != null);
+        assertTrue(exc instanceof HCatException);
+        assertEquals(ErrorType.ERROR_SCHEMA_COLUMN_MISMATCH, ((HCatException) exc).getErrorType());
+
+
+        partitionColumns = new ArrayList<HCatFieldSchema>();
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
+        partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
+
+        writeRecords = new ArrayList<HCatRecord>();
+
+        for (int i = 0; i < 10; i++) {
+            List<Object> objList = new ArrayList<Object>();
+
+            objList.add(i);
+            objList.add("co strvalue" + i);
+
+            writeRecords.add(new DefaultHCatRecord(objList));
+        }
+
+        runMRCreate(partitionMap, partitionColumns, writeRecords, 10, true);
+
+        //Read should get 10 + 20 + 10 + 10 + 20 rows
+        runMRRead(70);
     }
 
-    exc = null;
-    try {
-      runMRCreate(partitionMap, partitionColumns, recordsContainingPartitionCols, 20,true);
-    } catch(IOException e) {
-      exc = e;
+    //Test that data inserted through hcatoutputformat is readable from hive
+    private void hiveReadTest() throws Exception {
+
+        String query = "select * from " + tableName;
+        int retCode = driver.run(query).getResponseCode();
+
+        if (retCode != 0) {
+            throw new Exception("Error " + retCode + " running query " + query);
+        }
+
+        ArrayList<String> res = new ArrayList<String>();
+        driver.getResults(res);
+        assertEquals(70, res.size());
     }
-
-    List<HCatRecord> records= runMRRead(20,"part1 = \"p1value6\"");
-    assertEquals(20, records.size());
-    records= runMRRead(20,"part0 = \"p0value6\"");
-    assertEquals(20, records.size());
-    Integer i =0;
-    for(HCatRecord rec : records){
-      assertEquals(5, rec.size());
-      assertTrue(rec.get(0).equals(i));
-      assertTrue(rec.get(1).equals("c2value"+i));
-      assertTrue(rec.get(2).equals("c3value"+i));
-      assertTrue(rec.get(3).equals("p1value6"));
-      assertTrue(rec.get(4).equals("p0value6"));
-      i++;
-    }
-  }
-
-  //check behavior while change the order of columns
-  private void columnOrderChangeTest() throws Exception {
-
-    HCatSchema tableSchema = getTableSchema();
-
-    assertEquals(5, tableSchema.getFields().size());
-
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c3", Constants.STRING_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-
-
-    writeRecords = new ArrayList<HCatRecord>();
-
-    for(int i = 0;i < 10;i++) {
-      List<Object> objList = new ArrayList<Object>();
-
-      objList.add(i);
-      objList.add("co strvalue" + i);
-      objList.add("co str2value" + i);
-
-      writeRecords.add(new DefaultHCatRecord(objList));
-    }
-
-    Map<String, String> partitionMap = new HashMap<String, String>();
-    partitionMap.put("part1", "p1value8");
-    partitionMap.put("part0", "p0value8");
-
-    Exception exc = null;
-    try {
-      runMRCreate(partitionMap, partitionColumns, writeRecords, 10,true);
-    } catch(IOException e) {
-      exc = e;
-    }
-
-    assertTrue(exc != null);
-    assertTrue(exc instanceof HCatException);
-    assertEquals(ErrorType.ERROR_SCHEMA_COLUMN_MISMATCH, ((HCatException) exc).getErrorType());
-
-
-    partitionColumns = new ArrayList<HCatFieldSchema>();
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c1", Constants.INT_TYPE_NAME, "")));
-    partitionColumns.add(HCatSchemaUtils.getHCatFieldSchema(new FieldSchema("c2", Constants.STRING_TYPE_NAME, "")));
-
-    writeRecords = new ArrayList<HCatRecord>();
-
-    for(int i = 0;i < 10;i++) {
-      List<Object> objList = new ArrayList<Object>();
-
-      objList.add(i);
-      objList.add("co strvalue" + i);
-
-      writeRecords.add(new DefaultHCatRecord(objList));
-    }
-
-    runMRCreate(partitionMap, partitionColumns, writeRecords, 10,true);
-
-    //Read should get 10 + 20 + 10 + 10 + 20 rows
-    runMRRead(70);
-  }
-
-  //Test that data inserted through hcatoutputformat is readable from hive
-  private void hiveReadTest() throws Exception {
-
-    String query = "select * from " + tableName;
-    int retCode = driver.run(query).getResponseCode();
-
-    if( retCode != 0 ) {
-      throw new Exception("Error " + retCode + " running query " + query);
-    }
-
-    ArrayList<String> res = new ArrayList<String>();
-    driver.getResults(res);
-    assertEquals(70, res.size());
-  }
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestMultiOutputFormat.java b/src/test/org/apache/hcatalog/mapreduce/TestMultiOutputFormat.java
index 155f7ad..35ee01c 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestMultiOutputFormat.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestMultiOutputFormat.java
@@ -74,7 +74,7 @@
         // LocalJobRunner does not work with mapreduce OutputCommitter. So need
         // to use MiniMRCluster. MAPREDUCE-2350
         mrCluster = new MiniMRCluster(1, fs.getUri().toString(), 1, null, null,
-                new JobConf(conf));
+            new JobConf(conf));
         mrConf = mrCluster.createJobConf();
     }
 
@@ -111,7 +111,7 @@
         JobConfigurer configurer = MultiOutputFormat.createConfigurer(job);
         configurer.addOutputFormat("out1", TextOutputFormat.class, IntWritable.class, Text.class);
         configurer.addOutputFormat("out2", SequenceFileOutputFormat.class, Text.class,
-                IntWritable.class);
+            IntWritable.class);
         Path outDir = new Path(workDir.getPath(), job.getJobName());
         FileOutputFormat.setOutputPath(configurer.getJob("out1"), new Path(outDir, "out1"));
         FileOutputFormat.setOutputPath(configurer.getJob("out2"), new Path(outDir, "out2"));
@@ -124,19 +124,19 @@
         DistributedCache.addFileToClassPath(new Path(inputFile), job.getConfiguration(), fs);
         String dummyFile = createInputFile("dummy file");
         DistributedCache.addFileToClassPath(new Path(dummyFile), configurer.getJob("out1")
-                .getConfiguration(), fs);
+            .getConfiguration(), fs);
         // duplicate of the value. Merging should remove duplicates
         DistributedCache.addFileToClassPath(new Path(inputFile), configurer.getJob("out2")
-                .getConfiguration(), fs);
+            .getConfiguration(), fs);
 
         configurer.configure();
 
         // Verify if the configs are merged
         Path[] fileClassPaths = DistributedCache.getFileClassPaths(job.getConfiguration());
-        Assert.assertArrayEquals(new Path[] {new Path(inputFile), new Path(dummyFile)},
-                fileClassPaths);
-        URI[] expectedCacheFiles = new URI[] {new Path(inputFile).makeQualified(fs).toUri(),
-                new Path(dummyFile).makeQualified(fs).toUri()};
+        Assert.assertArrayEquals(new Path[]{new Path(inputFile), new Path(dummyFile)},
+            fileClassPaths);
+        URI[] expectedCacheFiles = new URI[]{new Path(inputFile).makeQualified(fs).toUri(),
+            new Path(dummyFile).makeQualified(fs).toUri()};
         URI[] cacheFiles = DistributedCache.getCacheFiles(job.getConfiguration());
         Assert.assertArrayEquals(expectedCacheFiles, cacheFiles);
 
@@ -180,9 +180,9 @@
 
         configurer.addOutputFormat("out1", TextOutputFormat.class, IntWritable.class, Text.class);
         configurer.addOutputFormat("out2", SequenceFileOutputFormat.class, Text.class,
-                IntWritable.class);
+            IntWritable.class);
         configurer.addOutputFormat("out3", NullOutputFormat.class, Text.class,
-                IntWritable.class);
+            IntWritable.class);
         Path outDir = new Path(workDir.getPath(), job.getJobName());
         FileOutputFormat.setOutputPath(configurer.getJob("out1"), new Path(outDir, "out1"));
         FileOutputFormat.setOutputPath(configurer.getJob("out2"), new Path(outDir, "out2"));
@@ -237,14 +237,14 @@
     }
 
     private static class MultiOutWordIndexMapper extends
-            Mapper<LongWritable, Text, Writable, Writable> {
+        Mapper<LongWritable, Text, Writable, Writable> {
 
         private IntWritable index = new IntWritable(1);
         private Text word = new Text();
 
         @Override
         protected void map(LongWritable key, Text value, Context context)
-                throws IOException, InterruptedException {
+            throws IOException, InterruptedException {
             StringTokenizer itr = new StringTokenizer(value.toString());
             while (itr.hasMoreTokens()) {
                 word.set(itr.nextToken());
@@ -256,14 +256,14 @@
     }
 
     private static class WordCountMapper extends
-            Mapper<LongWritable, Text, Text, IntWritable> {
+        Mapper<LongWritable, Text, Text, IntWritable> {
 
         private final static IntWritable one = new IntWritable(1);
         private Text word = new Text();
 
         @Override
         protected void map(LongWritable key, Text value, Context context)
-                throws IOException, InterruptedException {
+            throws IOException, InterruptedException {
             StringTokenizer itr = new StringTokenizer(value.toString());
             while (itr.hasMoreTokens()) {
                 word.set(itr.nextToken());
@@ -273,13 +273,13 @@
     }
 
     private static class MultiOutWordCountReducer extends
-            Reducer<Text, IntWritable, Writable, Writable> {
+        Reducer<Text, IntWritable, Writable, Writable> {
 
         private IntWritable count = new IntWritable();
 
         @Override
         protected void reduce(Text word, Iterable<IntWritable> values, Context context)
-                throws IOException, InterruptedException {
+            throws IOException, InterruptedException {
             int sum = 0;
             for (IntWritable val : values) {
                 sum += val.get();
@@ -292,23 +292,34 @@
     }
 
     private static class NullOutputFormat<K, V> extends
-            org.apache.hadoop.mapreduce.lib.output.NullOutputFormat<K, V> {
+        org.apache.hadoop.mapreduce.lib.output.NullOutputFormat<K, V> {
 
         @Override
         public OutputCommitter getOutputCommitter(TaskAttemptContext context) {
             return new OutputCommitter() {
-                public void abortTask(TaskAttemptContext taskContext) { }
-                public void cleanupJob(JobContext jobContext) { }
-                public void commitJob(JobContext jobContext) { }
+                public void abortTask(TaskAttemptContext taskContext) {
+                }
+
+                public void cleanupJob(JobContext jobContext) {
+                }
+
+                public void commitJob(JobContext jobContext) {
+                }
+
                 public void commitTask(TaskAttemptContext taskContext) {
                     Assert.fail("needsTaskCommit is false but commitTask was called");
                 }
+
                 public boolean needsTaskCommit(TaskAttemptContext taskContext) {
-                  return false;
+                    return false;
                 }
-                public void setupJob(JobContext jobContext) { }
-                public void setupTask(TaskAttemptContext taskContext) { }
-              };
+
+                public void setupJob(JobContext jobContext) {
+                }
+
+                public void setupTask(TaskAttemptContext taskContext) {
+                }
+            };
         }
     }
 
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestPassProperties.java b/src/test/org/apache/hcatalog/mapreduce/TestPassProperties.java
index c062105..c890574 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestPassProperties.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestPassProperties.java
@@ -46,10 +46,10 @@
 import org.junit.Test;
 
 public class TestPassProperties {
-  private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
-      "/build/test/data/" + TestSequenceFileReadWrite.class.getCanonicalName();
-  private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
-  private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
+    private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
+            "/build/test/data/" + TestSequenceFileReadWrite.class.getCanonicalName();
+    private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
+    private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
 
     private static Driver driver;
     private static PigServer server;
@@ -79,7 +79,7 @@
     }
 
     @Test
-    public void testSequenceTableWriteReadMR() throws Exception{
+    public void testSequenceTableWriteReadMR() throws Exception {
         Initialize();
         String createTable = "CREATE TABLE bad_props_table(a0 int, a1 String, a2 String) STORED AS SEQUENCEFILE";
         driver.run("drop table bad_props_table");
@@ -88,56 +88,55 @@
 
         boolean caughtException = false;
         try {
-          Configuration conf = new Configuration();
-          conf.set("hive.metastore.uris", "thrift://no.such.machine:10888");
-          conf.set("hive.metastore.local", "false");
-          Job job = new Job(conf, "Write-hcat-seq-table");
-          job.setJarByClass(TestSequenceFileReadWrite.class);
-  
-          job.setMapperClass(Map.class);
-          job.setOutputKeyClass(NullWritable.class);
-          job.setOutputValueClass(DefaultHCatRecord.class);
-          job.setInputFormatClass(TextInputFormat.class);
-          TextInputFormat.setInputPaths(job, INPUT_FILE_NAME);
-  
-          HCatOutputFormat.setOutput(job, OutputJobInfo.create(
-                  MetaStoreUtils.DEFAULT_DATABASE_NAME, "bad_props_table", null));
-          job.setOutputFormatClass(HCatOutputFormat.class);
-          HCatOutputFormat.setSchema(job, getSchema());
-          job.setNumReduceTasks(0);
-          assertTrue(job.waitForCompletion(true));
-          new FileOutputCommitterContainer(job, null).cleanupJob(job);
+            Configuration conf = new Configuration();
+            conf.set("hive.metastore.uris", "thrift://no.such.machine:10888");
+            conf.set("hive.metastore.local", "false");
+            Job job = new Job(conf, "Write-hcat-seq-table");
+            job.setJarByClass(TestSequenceFileReadWrite.class);
+
+            job.setMapperClass(Map.class);
+            job.setOutputKeyClass(NullWritable.class);
+            job.setOutputValueClass(DefaultHCatRecord.class);
+            job.setInputFormatClass(TextInputFormat.class);
+            TextInputFormat.setInputPaths(job, INPUT_FILE_NAME);
+
+            HCatOutputFormat.setOutput(job, OutputJobInfo.create(
+                    MetaStoreUtils.DEFAULT_DATABASE_NAME, "bad_props_table", null));
+            job.setOutputFormatClass(HCatOutputFormat.class);
+            HCatOutputFormat.setSchema(job, getSchema());
+            job.setNumReduceTasks(0);
+            assertTrue(job.waitForCompletion(true));
+            new FileOutputCommitterContainer(job, null).cleanupJob(job);
         } catch (Exception e) {
             caughtException = true;
             assertTrue(e.getMessage().contains(
-              "Could not connect to meta store using any of the URIs provided"));
+                    "Could not connect to meta store using any of the URIs provided"));
         }
         assertTrue(caughtException);
     }
-    
-    public static class Map extends Mapper<LongWritable, Text, NullWritable, DefaultHCatRecord>{
 
-      public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
-          String[] cols = value.toString().split(",");
-          DefaultHCatRecord record = new DefaultHCatRecord(3);
-          record.set(0,Integer.parseInt(cols[0]));
-          record.set(1,cols[1]);
-          record.set(2,cols[2]);
-          context.write(NullWritable.get(), record);
-      }
+    public static class Map extends Mapper<LongWritable, Text, NullWritable, DefaultHCatRecord> {
+
+        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
+            String[] cols = value.toString().split(",");
+            DefaultHCatRecord record = new DefaultHCatRecord(3);
+            record.set(0, Integer.parseInt(cols[0]));
+            record.set(1, cols[1]);
+            record.set(2, cols[2]);
+            context.write(NullWritable.get(), record);
+        }
     }
 
-  private HCatSchema getSchema() throws HCatException {
-      HCatSchema schema = new HCatSchema(new ArrayList<HCatFieldSchema>());
-      schema.append(new HCatFieldSchema("a0", HCatFieldSchema.Type.INT,
-              ""));
-      schema.append(new HCatFieldSchema("a1",
-              HCatFieldSchema.Type.STRING, ""));
-      schema.append(new HCatFieldSchema("a2",
-              HCatFieldSchema.Type.STRING, ""));
-      return schema;
-  }
-
+    private HCatSchema getSchema() throws HCatException {
+        HCatSchema schema = new HCatSchema(new ArrayList<HCatFieldSchema>());
+        schema.append(new HCatFieldSchema("a0", HCatFieldSchema.Type.INT,
+                ""));
+        schema.append(new HCatFieldSchema("a1",
+                HCatFieldSchema.Type.STRING, ""));
+        schema.append(new HCatFieldSchema("a2",
+                HCatFieldSchema.Type.STRING, ""));
+        return schema;
+    }
 
 
 }
diff --git a/src/test/org/apache/hcatalog/mapreduce/TestSequenceFileReadWrite.java b/src/test/org/apache/hcatalog/mapreduce/TestSequenceFileReadWrite.java
index 38f4c66..d89e885 100644
--- a/src/test/org/apache/hcatalog/mapreduce/TestSequenceFileReadWrite.java
+++ b/src/test/org/apache/hcatalog/mapreduce/TestSequenceFileReadWrite.java
@@ -53,10 +53,10 @@
 import org.junit.Test;
 
 public class TestSequenceFileReadWrite extends TestCase {
-  private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
-      "/build/test/data/" + TestSequenceFileReadWrite.class.getCanonicalName();
-  private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
-  private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
+    private static final String TEST_DATA_DIR = System.getProperty("user.dir") +
+            "/build/test/data/" + TestSequenceFileReadWrite.class.getCanonicalName();
+    private static final String TEST_WAREHOUSE_DIR = TEST_DATA_DIR + "/warehouse";
+    private static final String INPUT_FILE_NAME = TEST_DATA_DIR + "/input.data";
 
     private static Driver driver;
     private static PigServer server;
@@ -86,7 +86,7 @@
     }
 
     @Test
-   public void testSequenceTableWriteRead() throws Exception{
+    public void testSequenceTableWriteRead() throws Exception {
         Initialize();
         String createTable = "CREATE TABLE demo_table(a0 int, a1 String, a2 String) STORED AS SEQUENCEFILE";
         driver.run("drop table demo_table");
@@ -112,10 +112,10 @@
             numTuplesRead++;
         }
         assertEquals(input.length, numTuplesRead);
-   }
+    }
 
     @Test
-    public void testTextTableWriteRead() throws Exception{
+    public void testTextTableWriteRead() throws Exception {
         Initialize();
         String createTable = "CREATE TABLE demo_table_1(a0 int, a1 String, a2 String) STORED AS TEXTFILE";
         driver.run("drop table demo_table_1");
@@ -144,7 +144,7 @@
     }
 
     @Test
-    public void testSequenceTableWriteReadMR() throws Exception{
+    public void testSequenceTableWriteReadMR() throws Exception {
         Initialize();
         String createTable = "CREATE TABLE demo_table_2(a0 int, a1 String, a2 String) STORED AS SEQUENCEFILE";
         driver.run("drop table demo_table_2");
@@ -238,27 +238,27 @@
     }
 
 
-  public static class Map extends Mapper<LongWritable, Text, NullWritable, DefaultHCatRecord>{
+    public static class Map extends Mapper<LongWritable, Text, NullWritable, DefaultHCatRecord> {
 
-      public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
-          String[] cols = value.toString().split(",");
-          DefaultHCatRecord record = new DefaultHCatRecord(3);
-          record.set(0,Integer.parseInt(cols[0]));
-          record.set(1,cols[1]);
-          record.set(2,cols[2]);
-          context.write(NullWritable.get(), record);
-      }
+        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
+            String[] cols = value.toString().split(",");
+            DefaultHCatRecord record = new DefaultHCatRecord(3);
+            record.set(0, Integer.parseInt(cols[0]));
+            record.set(1, cols[1]);
+            record.set(2, cols[2]);
+            context.write(NullWritable.get(), record);
+        }
     }
 
-  private HCatSchema getSchema() throws HCatException {
-      HCatSchema schema = new HCatSchema(new ArrayList<HCatFieldSchema>());
-      schema.append(new HCatFieldSchema("a0", HCatFieldSchema.Type.INT,
-              ""));
-      schema.append(new HCatFieldSchema("a1",
-              HCatFieldSchema.Type.STRING, ""));
-      schema.append(new HCatFieldSchema("a2",
-              HCatFieldSchema.Type.STRING, ""));
-      return schema;
-  }
+    private HCatSchema getSchema() throws HCatException {
+        HCatSchema schema = new HCatSchema(new ArrayList<HCatFieldSchema>());
+        schema.append(new HCatFieldSchema("a0", HCatFieldSchema.Type.INT,
+                ""));
+        schema.append(new HCatFieldSchema("a1",
+                HCatFieldSchema.Type.STRING, ""));
+        schema.append(new HCatFieldSchema("a2",
+                HCatFieldSchema.Type.STRING, ""));
+        return schema;
+    }
 
 }
diff --git a/src/test/org/apache/hcatalog/rcfile/TestRCFileMapReduceInputFormat.java b/src/test/org/apache/hcatalog/rcfile/TestRCFileMapReduceInputFormat.java
index 11ea1aa..80deeb7 100644
--- a/src/test/org/apache/hcatalog/rcfile/TestRCFileMapReduceInputFormat.java
+++ b/src/test/org/apache/hcatalog/rcfile/TestRCFileMapReduceInputFormat.java
@@ -46,11 +46,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-  /**
-   * TestRCFile.
-   *
-   */
-  public class TestRCFileMapReduceInputFormat extends TestCase {
+/**
+ * TestRCFile.
+ *
+ */
+public class TestRCFileMapReduceInputFormat extends TestCase {
 
     private static final Logger LOG = LoggerFactory.getLogger(TestRCFileMapReduceInputFormat.class);
 
@@ -65,18 +65,18 @@
     private static Properties tbl;
 
     static {
-      try {
-        fs = FileSystem.getLocal(conf);
-        Path dir = new Path(System.getProperty("test.data.dir", ".") + "/mapred");
-        file = new Path(dir, "test_rcfile");
-        fs.delete(dir, true);
-        // the SerDe part is from TestLazySimpleSerDe
-        serDe = new ColumnarSerDe();
-        // Create the SerDe
-        tbl = createProperties();
-        serDe.initialize(conf, tbl);
-      } catch (Exception e) {
-      }
+        try {
+            fs = FileSystem.getLocal(conf);
+            Path dir = new Path(System.getProperty("test.data.dir", ".") + "/mapred");
+            file = new Path(dir, "test_rcfile");
+            fs.delete(dir, true);
+            // the SerDe part is from TestLazySimpleSerDe
+            serDe = new ColumnarSerDe();
+            // Create the SerDe
+            tbl = createProperties();
+            serDe.initialize(conf, tbl);
+        } catch (Exception e) {
+        }
     }
 
     private static BytesRefArrayWritable patialS = new BytesRefArrayWritable();
@@ -84,164 +84,164 @@
     private static byte[][] bytesArray = null;
 
     private static BytesRefArrayWritable s = null;
+
     static {
-      try {
-        bytesArray = new byte[][] {"123".getBytes("UTF-8"),
-            "456".getBytes("UTF-8"), "789".getBytes("UTF-8"),
-            "1000".getBytes("UTF-8"), "5.3".getBytes("UTF-8"),
-            "hive and hadoop".getBytes("UTF-8"), new byte[0],
-            "NULL".getBytes("UTF-8")};
-        s = new BytesRefArrayWritable(bytesArray.length);
-        s.set(0, new BytesRefWritable("123".getBytes("UTF-8")));
-        s.set(1, new BytesRefWritable("456".getBytes("UTF-8")));
-        s.set(2, new BytesRefWritable("789".getBytes("UTF-8")));
-        s.set(3, new BytesRefWritable("1000".getBytes("UTF-8")));
-        s.set(4, new BytesRefWritable("5.3".getBytes("UTF-8")));
-        s.set(5, new BytesRefWritable("hive and hadoop".getBytes("UTF-8")));
-        s.set(6, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        s.set(7, new BytesRefWritable("NULL".getBytes("UTF-8")));
+        try {
+            bytesArray = new byte[][]{"123".getBytes("UTF-8"),
+                "456".getBytes("UTF-8"), "789".getBytes("UTF-8"),
+                "1000".getBytes("UTF-8"), "5.3".getBytes("UTF-8"),
+                "hive and hadoop".getBytes("UTF-8"), new byte[0],
+                "NULL".getBytes("UTF-8")};
+            s = new BytesRefArrayWritable(bytesArray.length);
+            s.set(0, new BytesRefWritable("123".getBytes("UTF-8")));
+            s.set(1, new BytesRefWritable("456".getBytes("UTF-8")));
+            s.set(2, new BytesRefWritable("789".getBytes("UTF-8")));
+            s.set(3, new BytesRefWritable("1000".getBytes("UTF-8")));
+            s.set(4, new BytesRefWritable("5.3".getBytes("UTF-8")));
+            s.set(5, new BytesRefWritable("hive and hadoop".getBytes("UTF-8")));
+            s.set(6, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            s.set(7, new BytesRefWritable("NULL".getBytes("UTF-8")));
 
-        // partial test init
-        patialS.set(0, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        patialS.set(1, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        patialS.set(2, new BytesRefWritable("789".getBytes("UTF-8")));
-        patialS.set(3, new BytesRefWritable("1000".getBytes("UTF-8")));
-        patialS.set(4, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        patialS.set(5, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        patialS.set(6, new BytesRefWritable("NULL".getBytes("UTF-8")));
-        patialS.set(7, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            // partial test init
+            patialS.set(0, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            patialS.set(1, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            patialS.set(2, new BytesRefWritable("789".getBytes("UTF-8")));
+            patialS.set(3, new BytesRefWritable("1000".getBytes("UTF-8")));
+            patialS.set(4, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            patialS.set(5, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            patialS.set(6, new BytesRefWritable("NULL".getBytes("UTF-8")));
+            patialS.set(7, new BytesRefWritable("NULL".getBytes("UTF-8")));
 
-      } catch (UnsupportedEncodingException e) {
-      }
+        } catch (UnsupportedEncodingException e) {
+        }
     }
 
 
     /** For debugging and testing. */
     public static void main(String[] args) throws Exception {
-      int count = 10000;
-      boolean create = true;
+        int count = 10000;
+        boolean create = true;
 
-      String usage = "Usage: RCFile " + "[-count N]" + " file";
-      if (args.length == 0) {
-        LOG.error(usage);
-        System.exit(-1);
-      }
-
-      try {
-        for (int i = 0; i < args.length; ++i) { // parse command line
-          if (args[i] == null) {
-            continue;
-          } else if (args[i].equals("-count")) {
-            count = Integer.parseInt(args[++i]);
-          } else {
-            // file is required parameter
-            file = new Path(args[i]);
-          }
+        String usage = "Usage: RCFile " + "[-count N]" + " file";
+        if (args.length == 0) {
+            LOG.error(usage);
+            System.exit(-1);
         }
 
-        if (file == null) {
-          LOG.error(usage);
-          System.exit(-1);
+        try {
+            for (int i = 0; i < args.length; ++i) { // parse command line
+                if (args[i] == null) {
+                    continue;
+                } else if (args[i].equals("-count")) {
+                    count = Integer.parseInt(args[++i]);
+                } else {
+                    // file is required parameter
+                    file = new Path(args[i]);
+                }
+            }
+
+            if (file == null) {
+                LOG.error(usage);
+                System.exit(-1);
+            }
+
+            LOG.info("count = {}", count);
+            LOG.info("create = {}", create);
+            LOG.info("file = {}", file);
+
+            // test.performanceTest();
+            LOG.info("Finished.");
+        } finally {
+            fs.close();
         }
-
-        LOG.info("count = {}", count);
-        LOG.info("create = {}", create);
-        LOG.info("file = {}" ,file);
-
-           // test.performanceTest();
-        LOG.info("Finished.");
-      } finally {
-        fs.close();
-      }
     }
 
     private static Properties createProperties() {
-      Properties tbl = new Properties();
+        Properties tbl = new Properties();
 
-      // Set the configuration parameters
-      tbl.setProperty(Constants.SERIALIZATION_FORMAT, "9");
-      tbl.setProperty("columns",
-          "abyte,ashort,aint,along,adouble,astring,anullint,anullstring");
-      tbl.setProperty("columns.types",
-          "tinyint:smallint:int:bigint:double:string:int:string");
-      tbl.setProperty(Constants.SERIALIZATION_NULL_FORMAT, "NULL");
-      return tbl;
+        // Set the configuration parameters
+        tbl.setProperty(Constants.SERIALIZATION_FORMAT, "9");
+        tbl.setProperty("columns",
+            "abyte,ashort,aint,along,adouble,astring,anullint,anullstring");
+        tbl.setProperty("columns.types",
+            "tinyint:smallint:int:bigint:double:string:int:string");
+        tbl.setProperty(Constants.SERIALIZATION_NULL_FORMAT, "NULL");
+        return tbl;
     }
 
 
-
     public void testSynAndSplit() throws IOException, InterruptedException {
-      splitBeforeSync();
-      splitRightBeforeSync();
-      splitInMiddleOfSync();
-      splitRightAfterSync();
-      splitAfterSync();
+        splitBeforeSync();
+        splitRightBeforeSync();
+        splitInMiddleOfSync();
+        splitRightAfterSync();
+        splitAfterSync();
     }
 
-    private void splitBeforeSync() throws IOException,InterruptedException {
-      writeThenReadByRecordReader(600, 1000, 2, 17684, null);
+    private void splitBeforeSync() throws IOException, InterruptedException {
+        writeThenReadByRecordReader(600, 1000, 2, 17684, null);
     }
 
-    private void splitRightBeforeSync() throws IOException ,InterruptedException{
-      writeThenReadByRecordReader(500, 1000, 2, 17750, null);
+    private void splitRightBeforeSync() throws IOException, InterruptedException {
+        writeThenReadByRecordReader(500, 1000, 2, 17750, null);
     }
 
-    private void splitInMiddleOfSync() throws IOException,InterruptedException {
-      writeThenReadByRecordReader(500, 1000, 2, 17760, null);
+    private void splitInMiddleOfSync() throws IOException, InterruptedException {
+        writeThenReadByRecordReader(500, 1000, 2, 17760, null);
 
     }
 
     private void splitRightAfterSync() throws IOException, InterruptedException {
-      writeThenReadByRecordReader(500, 1000, 2, 17770, null);
+        writeThenReadByRecordReader(500, 1000, 2, 17770, null);
     }
 
-    private void splitAfterSync() throws IOException ,InterruptedException{
-      writeThenReadByRecordReader(500, 1000, 2, 19950, null);
+    private void splitAfterSync() throws IOException, InterruptedException {
+        writeThenReadByRecordReader(500, 1000, 2, 19950, null);
     }
 
     private void writeThenReadByRecordReader(int intervalRecordCount,
-        int writeCount, int splitNumber, long maxSplitSize, CompressionCodec codec)
+                                             int writeCount, int splitNumber, long maxSplitSize, CompressionCodec codec)
         throws IOException, InterruptedException {
-      Path testDir = new Path(System.getProperty("test.data.dir", ".")
-          + "/mapred/testsmallfirstsplit");
-      Path testFile = new Path(testDir, "test_rcfile");
-      fs.delete(testFile, true);
-      Configuration cloneConf = new Configuration(conf);
-      RCFileOutputFormat.setColumnNumber(cloneConf, bytesArray.length);
-      cloneConf.setInt(RCFile.RECORD_INTERVAL_CONF_STR, intervalRecordCount);
+        Path testDir = new Path(System.getProperty("test.data.dir", ".")
+            + "/mapred/testsmallfirstsplit");
+        Path testFile = new Path(testDir, "test_rcfile");
+        fs.delete(testFile, true);
+        Configuration cloneConf = new Configuration(conf);
+        RCFileOutputFormat.setColumnNumber(cloneConf, bytesArray.length);
+        cloneConf.setInt(RCFile.RECORD_INTERVAL_CONF_STR, intervalRecordCount);
 
-      RCFile.Writer writer = new RCFile.Writer(fs, cloneConf, testFile, null, codec);
+        RCFile.Writer writer = new RCFile.Writer(fs, cloneConf, testFile, null, codec);
 
-      BytesRefArrayWritable bytes = new BytesRefArrayWritable(bytesArray.length);
-      for (int i = 0; i < bytesArray.length; i++) {
-        BytesRefWritable cu = null;
-        cu = new BytesRefWritable(bytesArray[i], 0, bytesArray[i].length);
-        bytes.set(i, cu);
-      }
-      for (int i = 0; i < writeCount; i++) {
-        writer.append(bytes);
-      }
-      writer.close();
-
-      RCFileMapReduceInputFormat<LongWritable, BytesRefArrayWritable> inputFormat = new RCFileMapReduceInputFormat<LongWritable, BytesRefArrayWritable>();
-      Configuration jonconf = new Configuration(cloneConf);
-      jonconf.set("mapred.input.dir", testDir.toString());
-      JobContext context = new Job(jonconf);
-      context.getConfiguration().setLong("mapred.max.split.size",maxSplitSize);
-      List<InputSplit> splits = inputFormat.getSplits(context);
-      assertEquals("splits length should be " + splitNumber, splits.size(), splitNumber);
-      int readCount = 0;
-      for (int i = 0; i < splits.size(); i++) {
-        TaskAttemptContext tac = HCatHadoopShims.Instance.get().createTaskAttemptContext(jonconf, new TaskAttemptID());
-        RecordReader<LongWritable, BytesRefArrayWritable> rr = inputFormat.createRecordReader(splits.get(i), tac);
-        rr.initialize(splits.get(i), tac);
-        while (rr.nextKeyValue()) {
-          readCount++;
+        BytesRefArrayWritable bytes = new BytesRefArrayWritable(bytesArray.length);
+        for (int i = 0; i < bytesArray.length; i++) {
+            BytesRefWritable cu = null;
+            cu = new BytesRefWritable(bytesArray[i], 0, bytesArray[i].length);
+            bytes.set(i, cu);
         }
-      }
-      assertEquals("readCount should be equal to writeCount", readCount, writeCount);
+        for (int i = 0; i < writeCount; i++) {
+            writer.append(bytes);
+        }
+        writer.close();
+
+        RCFileMapReduceInputFormat<LongWritable, BytesRefArrayWritable> inputFormat = new RCFileMapReduceInputFormat<LongWritable, BytesRefArrayWritable>();
+        Configuration jonconf = new Configuration(cloneConf);
+        jonconf.set("mapred.input.dir", testDir.toString());
+        JobContext context = new Job(jonconf);
+        context.getConfiguration().setLong("mapred.max.split.size", maxSplitSize);
+        List<InputSplit> splits = inputFormat.getSplits(context);
+        assertEquals("splits length should be " + splitNumber, splits.size(), splitNumber);
+        int readCount = 0;
+        for (int i = 0; i < splits.size(); i++) {
+            TaskAttemptContext tac = HCatHadoopShims.Instance.get().createTaskAttemptContext(jonconf, new TaskAttemptID());
+            RecordReader<LongWritable, BytesRefArrayWritable> rr = inputFormat.createRecordReader(splits.get(i), tac);
+            rr.initialize(splits.get(i), tac);
+            while (rr.nextKeyValue()) {
+                readCount++;
+            }
+        }
+        assertEquals("readCount should be equal to writeCount", readCount, writeCount);
     }
 
-  }
+}
 
 
diff --git a/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java b/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java
index da808d4..68920fd 100644
--- a/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java
+++ b/src/test/org/apache/hcatalog/security/TestHdfsAuthorizationProvider.java
@@ -52,531 +52,531 @@
 import org.junit.Test;
 
 public class TestHdfsAuthorizationProvider {
-  
-  protected HCatDriver hcatDriver;
-  protected HiveMetaStoreClient msc;
-  protected HiveConf conf;
-  protected String whDir;
-  protected Path whPath;
-  protected FileSystem whFs;
-  protected Warehouse wh;
-  protected Hive hive;
 
-  @Before
-  public void setUp() throws Exception {
-    
-    conf = new HiveConf(this.getClass());
-    conf.set(ConfVars.PREEXECHOOKS.varname, "");
-    conf.set(ConfVars.POSTEXECHOOKS.varname, "");
-    conf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
-  
-    conf.set("hive.metastore.local", "true");
-    conf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
-    conf.setBoolVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED, true);
-    conf.setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, 
-        StorageDelegationAuthorizationProvider.class.getCanonicalName());
-    conf.set("fs.pfile.impl", "org.apache.hadoop.fs.ProxyLocalFileSystem");
-    
-    whDir = System.getProperty("test.warehouse.dir", "/tmp/testhdfsauthorization_wh");
-    conf.setVar(HiveConf.ConfVars.METASTOREWAREHOUSE, whDir);
-    
-    UserGroupInformation ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);
-    String username = ShimLoader.getHadoopShims().getShortUserName(ugi); 
-    
-    whPath = new Path(whDir);
-    whFs = whPath.getFileSystem(conf);
-    
-    wh = new Warehouse(conf);
-    hive = Hive.get(conf);
-    
-    //clean up mess in HMS 
-    HcatTestUtils.cleanupHMS(hive, wh, perm700);
-    
-    whFs.delete(whPath, true);
-    whFs.mkdirs(whPath, perm755);
-    
-    SessionState.start(new CliSessionState(conf));
-    hcatDriver = new HCatDriver();
-  }
+    protected HCatDriver hcatDriver;
+    protected HiveMetaStoreClient msc;
+    protected HiveConf conf;
+    protected String whDir;
+    protected Path whPath;
+    protected FileSystem whFs;
+    protected Warehouse wh;
+    protected Hive hive;
 
-  @After
-  public void tearDown() throws IOException {
-    whFs.close();
-    hcatDriver.close();
-    Hive.closeCurrent();
-  }
+    @Before
+    public void setUp() throws Exception {
 
-  public Path getDbPath(String dbName) throws MetaException, HiveException {
-    return HcatTestUtils.getDbPath(hive, wh, dbName); 
-  }
-  
-  public Path getTablePath(String dbName, String tableName) throws HiveException {
-    Table table = hive.getTable(dbName, tableName);
-    return table.getPath();
-  }
+        conf = new HiveConf(this.getClass());
+        conf.set(ConfVars.PREEXECHOOKS.varname, "");
+        conf.set(ConfVars.POSTEXECHOOKS.varname, "");
+        conf.set(ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
 
-  public Path getPartPath(String partName, String dbName, String tableName) throws HiveException {
-    return new Path(getTablePath(dbName, tableName), partName);
-  }
+        conf.set("hive.metastore.local", "true");
+        conf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname, HCatSemanticAnalyzer.class.getName());
+        conf.setBoolVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED, true);
+        conf.setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER,
+                StorageDelegationAuthorizationProvider.class.getCanonicalName());
+        conf.set("fs.pfile.impl", "org.apache.hadoop.fs.ProxyLocalFileSystem");
 
-  /** Execute the query expecting success*/
-  public void exec(String format, Object ... args) throws Exception {
-    String command = String.format(format, args);
-    CommandProcessorResponse resp = hcatDriver.run(command);
-    Assert.assertEquals(resp.getErrorMessage(), 0, resp.getResponseCode());
-    Assert.assertEquals(resp.getErrorMessage(), null, resp.getErrorMessage());
-  }
+        whDir = System.getProperty("test.warehouse.dir", "/tmp/testhdfsauthorization_wh");
+        conf.setVar(HiveConf.ConfVars.METASTOREWAREHOUSE, whDir);
 
-  /** Execute the query expecting it to fail with AuthorizationException */
-  public void execFail(String format, Object ... args) throws Exception {
-    String command = String.format(format, args);
-    CommandProcessorResponse resp = hcatDriver.run(command);
-    Assert.assertNotSame(resp.getErrorMessage(), 0, resp.getResponseCode());
-    Assert.assertTrue((resp.getResponseCode() == 40000) || (resp.getResponseCode() == 403));
-    if(resp.getErrorMessage() != null){
-     Assert.assertTrue(resp.getErrorMessage().contains("org.apache.hadoop.security.AccessControlException"));
+        UserGroupInformation ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);
+        String username = ShimLoader.getHadoopShims().getShortUserName(ugi);
+
+        whPath = new Path(whDir);
+        whFs = whPath.getFileSystem(conf);
+
+        wh = new Warehouse(conf);
+        hive = Hive.get(conf);
+
+        //clean up mess in HMS
+        HcatTestUtils.cleanupHMS(hive, wh, perm700);
+
+        whFs.delete(whPath, true);
+        whFs.mkdirs(whPath, perm755);
+
+        SessionState.start(new CliSessionState(conf));
+        hcatDriver = new HCatDriver();
     }
-  }
 
-  
-  /** 
-   * Tests whether the warehouse directory is writable by the current user (as defined by Hadoop)
-   */
-  @Test
-  public void testWarehouseIsWritable() throws Exception {
-    Path top = new Path(whPath, "_foobarbaz12_");
-    try {
-      whFs.mkdirs(top);
-    } finally {
-      whFs.delete(top, true);
+    @After
+    public void tearDown() throws IOException {
+        whFs.close();
+        hcatDriver.close();
+        Hive.closeCurrent();
     }
-  }
-  
-  @Test
-  public void testShowDatabases() throws Exception {
-    exec("CREATE DATABASE doo");
-    exec("SHOW DATABASES");
-    
-    whFs.setPermission(whPath, perm300); //revoke r
-    execFail("SHOW DATABASES");
-  }
-  
-  @Test
-  public void testDatabaseOps() throws Exception {
-    exec("SHOW TABLES");
-    exec("SHOW TABLE EXTENDED LIKE foo1");
-    
-    whFs.setPermission(whPath, perm700);
-    exec("CREATE DATABASE doo");
-    exec("DESCRIBE DATABASE doo");
-    exec("USE doo");
-    exec("SHOW TABLES");
-    exec("SHOW TABLE EXTENDED LIKE foo1");
-    exec("DROP DATABASE doo");
-    
-    //custom location
-    Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-    whFs.mkdirs(dbPath, perm700);
-    exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
-    exec("DESCRIBE DATABASE doo2", dbPath.toUri());
-    exec("USE doo2");
-    exec("SHOW TABLES");
-    exec("SHOW TABLE EXTENDED LIKE foo1");
-    exec("DROP DATABASE doo2", dbPath.toUri());
-    
-    //custom non-existing location
-    exec("CREATE DATABASE doo3 LOCATION '%s/subpath'", dbPath.toUri());
-  }
-  
-  @Test
-  public void testCreateDatabaseFail1() throws Exception {
-    whFs.setPermission(whPath, perm500);
-    execFail("CREATE DATABASE doo"); //in the default location
-    
-    whFs.setPermission(whPath, perm555);
-    execFail("CREATE DATABASE doo2");
-  }
 
-  @Test
-  public void testCreateDatabaseFail2() throws Exception {
-    //custom location
-    Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-    
-    whFs.mkdirs(dbPath, perm700);
-    whFs.setPermission(dbPath, perm500);
-    execFail("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
-  }
-  
-  @Test
-  public void testDropDatabaseFail1() throws Exception {
-    whFs.setPermission(whPath, perm700);
-    exec("CREATE DATABASE doo"); //in the default location
-    
-    whFs.setPermission(getDbPath("doo"), perm500); //revoke write
-    execFail("DROP DATABASE doo");
-  }
-  
-  @Test
-  public void testDropDatabaseFail2() throws Exception {
-    //custom location
-    Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-    
-    whFs.mkdirs(dbPath, perm700);
-    exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
-    
-    whFs.setPermission(dbPath, perm500);
-    execFail("DROP DATABASE doo2");
-  }
-  
-  @Test
-  public void testDescSwitchDatabaseFail() throws Exception {
-    whFs.setPermission(whPath, perm700);
-    exec("CREATE DATABASE doo");
-    whFs.setPermission(getDbPath("doo"), perm300); //revoke read
-    execFail("DESCRIBE DATABASE doo");
-    execFail("USE doo");
-    
-    //custom location
-    Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
-    whFs.mkdirs(dbPath, perm700);
-    exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
-    whFs.mkdirs(dbPath, perm300); //revoke read
-    execFail("DESCRIBE DATABASE doo2", dbPath.toUri());
-    execFail("USE doo2");
-  }
-  
-  @Test 
-  public void testShowTablesFail() throws Exception {
-    whFs.setPermission(whPath, perm700);
-    exec("CREATE DATABASE doo");
-    exec("USE doo");
-    whFs.setPermission(getDbPath("doo"), perm300); //revoke read
-    execFail("SHOW TABLES");
-    execFail("SHOW TABLE EXTENDED LIKE foo1");
-  }
-  
-  @Test
-  public void testTableOps() throws Exception {
-    //default db
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    exec("DESCRIBE foo1");
-    exec("DROP TABLE foo1");
-    
-    //default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm700);
-    exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    exec("DESCRIBE foo2");
-    exec("DROP TABLE foo2");
-    
-    //default db custom non existing location
-    exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
-    exec("DESCRIBE foo3");
-    exec("DROP TABLE foo3");
-    
-    //non default db
-    exec("CREATE DATABASE doo");
-    exec("USE doo");
-    
-    exec("CREATE TABLE foo4 (foo INT) STORED AS RCFILE");
-    exec("DESCRIBE foo4");
-    exec("DROP TABLE foo4");
-    
-    //non-default db custom location
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm700);
-    exec("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    exec("DESCRIBE foo5");
-    exec("DROP TABLE foo5");
-    
-    //non-default db custom non existing location
-    exec("CREATE EXTERNAL TABLE foo6 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
-    exec("DESCRIBE foo6");
-    exec("DROP TABLE foo6");
-    
-    exec("DROP TABLE IF EXISTS foo_non_exists");
-    
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    exec("DESCRIBE EXTENDED foo1");
-    exec("DESCRIBE FORMATTED foo1");
-    exec("DESCRIBE foo1.foo");
-    
-    //deep non-existing path for the table
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm700);
-    exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
-  }
-  
-  @Test
-  public void testCreateTableFail1() throws Exception {
-    //default db
-    whFs.mkdirs(whPath, perm500); //revoke w
-    execFail("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-  }
-  
-  @Test
-  public void testCreateTableFail2() throws Exception {
-    //default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm500);
-    execFail("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    
-    //default db custom non existing location
-    execFail("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
-  }
-  
-  @Test
-  public void testCreateTableFail3() throws Exception {
-    //non default db
-    exec("CREATE DATABASE doo");
-    whFs.setPermission(getDbPath("doo"), perm500);
+    public Path getDbPath(String dbName) throws MetaException, HiveException {
+        return HcatTestUtils.getDbPath(hive, wh, dbName);
+    }
 
-    execFail("CREATE TABLE doo.foo4 (foo INT) STORED AS RCFILE");
-    
-    //non-default db custom location, permission to write to tablePath, but not on db path
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm700);
-    exec("USE doo");
-    execFail("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-  }
+    public Path getTablePath(String dbName, String tableName) throws HiveException {
+        Table table = hive.getTable(dbName, tableName);
+        return table.getPath();
+    }
 
-  @Test
-  public void testCreateTableFail4() throws Exception {
-    //non default db
-    exec("CREATE DATABASE doo");
+    public Path getPartPath(String partName, String dbName, String tableName) throws HiveException {
+        return new Path(getTablePath(dbName, tableName), partName);
+    }
 
-    //non-default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm500);
-    execFail("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    
-    //non-default db custom non existing location
-    execFail("CREATE EXTERNAL TABLE doo.foo6 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
-  }
-  
-  @Test
-  public void testDropTableFail1() throws Exception {
-    //default db
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke w
-    execFail("DROP TABLE foo1");
-  }
-  
-  @Test
-  public void testDropTableFail2() throws Exception {
-    //default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    whFs.mkdirs(tablePath, perm500);
-    execFail("DROP TABLE foo2");
-  }
+    /** Execute the query expecting success*/
+    public void exec(String format, Object... args) throws Exception {
+        String command = String.format(format, args);
+        CommandProcessorResponse resp = hcatDriver.run(command);
+        Assert.assertEquals(resp.getErrorMessage(), 0, resp.getResponseCode());
+        Assert.assertEquals(resp.getErrorMessage(), null, resp.getErrorMessage());
+    }
 
-  @Test
-  public void testDropTableFail4() throws Exception {
-    //non default db
-    exec("CREATE DATABASE doo");
+    /** Execute the query expecting it to fail with AuthorizationException */
+    public void execFail(String format, Object... args) throws Exception {
+        String command = String.format(format, args);
+        CommandProcessorResponse resp = hcatDriver.run(command);
+        Assert.assertNotSame(resp.getErrorMessage(), 0, resp.getResponseCode());
+        Assert.assertTrue((resp.getResponseCode() == 40000) || (resp.getResponseCode() == 403));
+        if (resp.getErrorMessage() != null) {
+            Assert.assertTrue(resp.getErrorMessage().contains("org.apache.hadoop.security.AccessControlException"));
+        }
+    }
 
-    //non-default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    
-    exec("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    whFs.mkdirs(tablePath, perm500);
-    exec("USE doo"); //There is no DROP TABLE doo.foo5 support in Hive
-    execFail("DROP TABLE foo5");
-  }
-  
-  @Test
-  public void testDescTableFail() throws Exception {
-    //default db
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
-    execFail("DESCRIBE foo1");
-    
-    //default db custom location
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm700);
-    exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    whFs.mkdirs(tablePath, perm300); //revoke read
-    execFail("DESCRIBE foo2");
-  }
-  
-  @Test
-  public void testAlterTableRename() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    exec("ALTER TABLE foo1 RENAME TO foo2");
-    
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    exec("ALTER TABLE foo3 RENAME TO foo4");
-  }
-  
-  @Test
-  public void testAlterTableRenameFail() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
-    execFail("ALTER TABLE foo1 RENAME TO foo2");
-    
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
-    whFs.mkdirs(tablePath, perm500); //revoke write 
-    execFail("ALTER TABLE foo3 RENAME TO foo4");
-  }
-  
-  @Test
-  public void testAlterTableRelocate() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    exec("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-    
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
-    exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", 
-        tablePath.makeQualified(whFs));
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
-    exec("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-  }
-  
-  @Test
-  public void testAlterTableRelocateFail() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
-    Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
-    whFs.mkdirs(tablePath, perm500); //revoke write
-    execFail("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-    
-    //dont have access to new table loc
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
-    exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", 
-        tablePath.makeQualified(whFs));
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
-    whFs.mkdirs(tablePath, perm500); //revoke write
-    execFail("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-    
-    //have access to new table loc, but not old table loc 
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
-    exec("CREATE EXTERNAL TABLE foo4 (foo INT) STORED AS RCFILE LOCATION '%s'", 
-        tablePath.makeQualified(whFs));
-    whFs.mkdirs(tablePath, perm500); //revoke write
-    tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
-    execFail("ALTER TABLE foo4 SET LOCATION '%s'", tablePath.makeQualified(whFs));
-  }
-  
-  @Test
-  public void testAlterTable() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    exec("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
-    exec("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
-    exec("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
-  }
-  
-  @Test
-  public void testAddDropPartition() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
-    exec("ALTER TABLE foo1 ADD IF NOT EXISTS PARTITION (b='2010-10-10')");
-    String relPath = new Random().nextInt() + "/mypart";
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-11') LOCATION '%s'", relPath);
-    
-    exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT RCFILE");
-    
-    exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT INPUTFORMAT "
-        + "'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT "
-        + "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver "
-        + "'mydriver' outputdriver 'yourdriver'");    
-    
-    exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
-    exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-11')");
-  }
-  
-  @Test
-  public void testAddPartitionFail1() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    whFs.mkdirs(getTablePath("default", "foo1"), perm500);
-    execFail("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
-  }
-  
-  @Test
-  public void testAddPartitionFail2() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    String relPath = new Random().nextInt() + "/mypart";
-    Path partPath = new Path(getTablePath("default", "foo1"), relPath);
-    whFs.mkdirs(partPath, perm500);
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
-  }
-  
-  @Test
-  public void testDropPartitionFail1() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
-    whFs.mkdirs(getPartPath("b=2010-10-10", "default", "foo1"), perm500);
-    execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
-  }
 
-  @Test
-  public void testDropPartitionFail2() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
-    String relPath = new Random().nextInt() + "/mypart";
-    Path partPath = new Path(getTablePath("default", "foo1"), relPath);
-    whFs.mkdirs(partPath, perm700);
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
-    whFs.mkdirs(partPath, perm500); //revoke write
-    execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
-  }
-  
-  @Test
-  public void testAlterTableFail() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
-    whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
-    execFail("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
-    execFail("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
-    execFail("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
-  }
-  
-  @Test
-  public void testShowTables() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
-    exec("SHOW PARTITIONS foo1");
-    
-    whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
-    execFail("SHOW PARTITIONS foo1");
-  }
-  
-  @Test
-  public void testAlterTablePartRename() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
-    Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
-    exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
-  }
-  
-  @Test
-  public void testAlterTablePartRenameFail() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
-    Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
-    whFs.setPermission(loc, perm500); //revoke w
-    execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
-  }
-  
-  @Test
-  public void testAlterTablePartRelocate() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16')");
-    Path partPath = new Path(whPath, new Random().nextInt() + "/mypart");
-    exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", partPath.makeQualified(whFs));
-  }
+    /**
+     * Tests whether the warehouse directory is writable by the current user (as defined by Hadoop)
+     */
+    @Test
+    public void testWarehouseIsWritable() throws Exception {
+        Path top = new Path(whPath, "_foobarbaz12_");
+        try {
+            whFs.mkdirs(top);
+        } finally {
+            whFs.delete(top, true);
+        }
+    }
 
-  @Test
-  public void testAlterTablePartRelocateFail() throws Exception {
-    exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
-    
-    Path oldLoc = new Path(whPath, new Random().nextInt() + "/mypart");
-    Path newLoc = new Path(whPath, new Random().nextInt() + "/mypart2");
-    
-    exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", oldLoc);
-    whFs.mkdirs(oldLoc, perm500);
-    execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
-    whFs.mkdirs(oldLoc, perm700);
-    whFs.mkdirs(newLoc, perm500);
-    execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
-  }
-  
+    @Test
+    public void testShowDatabases() throws Exception {
+        exec("CREATE DATABASE doo");
+        exec("SHOW DATABASES");
+
+        whFs.setPermission(whPath, perm300); //revoke r
+        execFail("SHOW DATABASES");
+    }
+
+    @Test
+    public void testDatabaseOps() throws Exception {
+        exec("SHOW TABLES");
+        exec("SHOW TABLE EXTENDED LIKE foo1");
+
+        whFs.setPermission(whPath, perm700);
+        exec("CREATE DATABASE doo");
+        exec("DESCRIBE DATABASE doo");
+        exec("USE doo");
+        exec("SHOW TABLES");
+        exec("SHOW TABLE EXTENDED LIKE foo1");
+        exec("DROP DATABASE doo");
+
+        //custom location
+        Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+        whFs.mkdirs(dbPath, perm700);
+        exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+        exec("DESCRIBE DATABASE doo2", dbPath.toUri());
+        exec("USE doo2");
+        exec("SHOW TABLES");
+        exec("SHOW TABLE EXTENDED LIKE foo1");
+        exec("DROP DATABASE doo2", dbPath.toUri());
+
+        //custom non-existing location
+        exec("CREATE DATABASE doo3 LOCATION '%s/subpath'", dbPath.toUri());
+    }
+
+    @Test
+    public void testCreateDatabaseFail1() throws Exception {
+        whFs.setPermission(whPath, perm500);
+        execFail("CREATE DATABASE doo"); //in the default location
+
+        whFs.setPermission(whPath, perm555);
+        execFail("CREATE DATABASE doo2");
+    }
+
+    @Test
+    public void testCreateDatabaseFail2() throws Exception {
+        //custom location
+        Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+
+        whFs.mkdirs(dbPath, perm700);
+        whFs.setPermission(dbPath, perm500);
+        execFail("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+    }
+
+    @Test
+    public void testDropDatabaseFail1() throws Exception {
+        whFs.setPermission(whPath, perm700);
+        exec("CREATE DATABASE doo"); //in the default location
+
+        whFs.setPermission(getDbPath("doo"), perm500); //revoke write
+        execFail("DROP DATABASE doo");
+    }
+
+    @Test
+    public void testDropDatabaseFail2() throws Exception {
+        //custom location
+        Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+
+        whFs.mkdirs(dbPath, perm700);
+        exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+
+        whFs.setPermission(dbPath, perm500);
+        execFail("DROP DATABASE doo2");
+    }
+
+    @Test
+    public void testDescSwitchDatabaseFail() throws Exception {
+        whFs.setPermission(whPath, perm700);
+        exec("CREATE DATABASE doo");
+        whFs.setPermission(getDbPath("doo"), perm300); //revoke read
+        execFail("DESCRIBE DATABASE doo");
+        execFail("USE doo");
+
+        //custom location
+        Path dbPath = new Path(whPath, new Random().nextInt() + "/mydb");
+        whFs.mkdirs(dbPath, perm700);
+        exec("CREATE DATABASE doo2 LOCATION '%s'", dbPath.toUri());
+        whFs.mkdirs(dbPath, perm300); //revoke read
+        execFail("DESCRIBE DATABASE doo2", dbPath.toUri());
+        execFail("USE doo2");
+    }
+
+    @Test
+    public void testShowTablesFail() throws Exception {
+        whFs.setPermission(whPath, perm700);
+        exec("CREATE DATABASE doo");
+        exec("USE doo");
+        whFs.setPermission(getDbPath("doo"), perm300); //revoke read
+        execFail("SHOW TABLES");
+        execFail("SHOW TABLE EXTENDED LIKE foo1");
+    }
+
+    @Test
+    public void testTableOps() throws Exception {
+        //default db
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        exec("DESCRIBE foo1");
+        exec("DROP TABLE foo1");
+
+        //default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm700);
+        exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        exec("DESCRIBE foo2");
+        exec("DROP TABLE foo2");
+
+        //default db custom non existing location
+        exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+        exec("DESCRIBE foo3");
+        exec("DROP TABLE foo3");
+
+        //non default db
+        exec("CREATE DATABASE doo");
+        exec("USE doo");
+
+        exec("CREATE TABLE foo4 (foo INT) STORED AS RCFILE");
+        exec("DESCRIBE foo4");
+        exec("DROP TABLE foo4");
+
+        //non-default db custom location
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm700);
+        exec("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        exec("DESCRIBE foo5");
+        exec("DROP TABLE foo5");
+
+        //non-default db custom non existing location
+        exec("CREATE EXTERNAL TABLE foo6 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+        exec("DESCRIBE foo6");
+        exec("DROP TABLE foo6");
+
+        exec("DROP TABLE IF EXISTS foo_non_exists");
+
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        exec("DESCRIBE EXTENDED foo1");
+        exec("DESCRIBE FORMATTED foo1");
+        exec("DESCRIBE foo1.foo");
+
+        //deep non-existing path for the table
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm700);
+        exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
+    }
+
+    @Test
+    public void testCreateTableFail1() throws Exception {
+        //default db
+        whFs.mkdirs(whPath, perm500); //revoke w
+        execFail("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+    }
+
+    @Test
+    public void testCreateTableFail2() throws Exception {
+        //default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm500);
+        execFail("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+
+        //default db custom non existing location
+        execFail("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s/subpath'", tablePath);
+    }
+
+    @Test
+    public void testCreateTableFail3() throws Exception {
+        //non default db
+        exec("CREATE DATABASE doo");
+        whFs.setPermission(getDbPath("doo"), perm500);
+
+        execFail("CREATE TABLE doo.foo4 (foo INT) STORED AS RCFILE");
+
+        //non-default db custom location, permission to write to tablePath, but not on db path
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm700);
+        exec("USE doo");
+        execFail("CREATE EXTERNAL TABLE foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+    }
+
+    @Test
+    public void testCreateTableFail4() throws Exception {
+        //non default db
+        exec("CREATE DATABASE doo");
+
+        //non-default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm500);
+        execFail("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+
+        //non-default db custom non existing location
+        execFail("CREATE EXTERNAL TABLE doo.foo6 (foo INT) STORED AS RCFILE LOCATION '%s/a/a/a/'", tablePath);
+    }
+
+    @Test
+    public void testDropTableFail1() throws Exception {
+        //default db
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke w
+        execFail("DROP TABLE foo1");
+    }
+
+    @Test
+    public void testDropTableFail2() throws Exception {
+        //default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        whFs.mkdirs(tablePath, perm500);
+        execFail("DROP TABLE foo2");
+    }
+
+    @Test
+    public void testDropTableFail4() throws Exception {
+        //non default db
+        exec("CREATE DATABASE doo");
+
+        //non-default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+
+        exec("CREATE EXTERNAL TABLE doo.foo5 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        whFs.mkdirs(tablePath, perm500);
+        exec("USE doo"); //There is no DROP TABLE doo.foo5 support in Hive
+        execFail("DROP TABLE foo5");
+    }
+
+    @Test
+    public void testDescTableFail() throws Exception {
+        //default db
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
+        execFail("DESCRIBE foo1");
+
+        //default db custom location
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm700);
+        exec("CREATE EXTERNAL TABLE foo2 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        whFs.mkdirs(tablePath, perm300); //revoke read
+        execFail("DESCRIBE foo2");
+    }
+
+    @Test
+    public void testAlterTableRename() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        exec("ALTER TABLE foo1 RENAME TO foo2");
+
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        exec("ALTER TABLE foo3 RENAME TO foo4");
+    }
+
+    @Test
+    public void testAlterTableRenameFail() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
+        execFail("ALTER TABLE foo1 RENAME TO foo2");
+
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'", tablePath);
+        whFs.mkdirs(tablePath, perm500); //revoke write
+        execFail("ALTER TABLE foo3 RENAME TO foo4");
+    }
+
+    @Test
+    public void testAlterTableRelocate() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        exec("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+        exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
+                tablePath.makeQualified(whFs));
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+        exec("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+    }
+
+    @Test
+    public void testAlterTableRelocateFail() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) STORED AS RCFILE");
+        Path tablePath = new Path(whPath, new Random().nextInt() + "/mytable");
+        whFs.mkdirs(tablePath, perm500); //revoke write
+        execFail("ALTER TABLE foo1 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+        //dont have access to new table loc
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+        exec("CREATE EXTERNAL TABLE foo3 (foo INT) STORED AS RCFILE LOCATION '%s'",
+                tablePath.makeQualified(whFs));
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable2");
+        whFs.mkdirs(tablePath, perm500); //revoke write
+        execFail("ALTER TABLE foo3 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+
+        //have access to new table loc, but not old table loc
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
+        exec("CREATE EXTERNAL TABLE foo4 (foo INT) STORED AS RCFILE LOCATION '%s'",
+                tablePath.makeQualified(whFs));
+        whFs.mkdirs(tablePath, perm500); //revoke write
+        tablePath = new Path(whPath, new Random().nextInt() + "/mytable3");
+        execFail("ALTER TABLE foo4 SET LOCATION '%s'", tablePath.makeQualified(whFs));
+    }
+
+    @Test
+    public void testAlterTable() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        exec("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
+        exec("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
+        exec("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
+    }
+
+    @Test
+    public void testAddDropPartition() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+        exec("ALTER TABLE foo1 ADD IF NOT EXISTS PARTITION (b='2010-10-10')");
+        String relPath = new Random().nextInt() + "/mypart";
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-11') LOCATION '%s'", relPath);
+
+        exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT RCFILE");
+
+        exec("ALTER TABLE foo1 PARTITION (b='2010-10-10') SET FILEFORMAT INPUTFORMAT "
+                + "'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT "
+                + "'org.apache.hadoop.hive.ql.io.RCFileOutputFormat' inputdriver "
+                + "'mydriver' outputdriver 'yourdriver'");
+
+        exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+        exec("ALTER TABLE foo1 DROP PARTITION (b='2010-10-11')");
+    }
+
+    @Test
+    public void testAddPartitionFail1() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        whFs.mkdirs(getTablePath("default", "foo1"), perm500);
+        execFail("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+    }
+
+    @Test
+    public void testAddPartitionFail2() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        String relPath = new Random().nextInt() + "/mypart";
+        Path partPath = new Path(getTablePath("default", "foo1"), relPath);
+        whFs.mkdirs(partPath, perm500);
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
+    }
+
+    @Test
+    public void testDropPartitionFail1() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10')");
+        whFs.mkdirs(getPartPath("b=2010-10-10", "default", "foo1"), perm500);
+        execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+    }
+
+    @Test
+    public void testDropPartitionFail2() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS TEXTFILE");
+        String relPath = new Random().nextInt() + "/mypart";
+        Path partPath = new Path(getTablePath("default", "foo1"), relPath);
+        whFs.mkdirs(partPath, perm700);
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-10') LOCATION '%s'", partPath);
+        whFs.mkdirs(partPath, perm500); //revoke write
+        execFail("ALTER TABLE foo1 DROP PARTITION (b='2010-10-10')");
+    }
+
+    @Test
+    public void testAlterTableFail() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
+        whFs.mkdirs(getTablePath("default", "foo1"), perm500); //revoke write
+        execFail("ALTER TABLE foo1 SET TBLPROPERTIES ('foo'='bar')");
+        execFail("ALTER TABLE foo1 SET SERDEPROPERTIES ('foo'='bar')");
+        execFail("ALTER TABLE foo1 ADD COLUMNS (foo2 INT)");
+    }
+
+    @Test
+    public void testShowTables() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (boo STRING) STORED AS TEXTFILE");
+        exec("SHOW PARTITIONS foo1");
+
+        whFs.mkdirs(getTablePath("default", "foo1"), perm300); //revoke read
+        execFail("SHOW PARTITIONS foo1");
+    }
+
+    @Test
+    public void testAlterTablePartRename() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+        Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
+        exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
+    }
+
+    @Test
+    public void testAlterTablePartRenameFail() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+        Path loc = new Path(whPath, new Random().nextInt() + "/mypart");
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", loc);
+        whFs.setPermission(loc, perm500); //revoke w
+        execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') RENAME TO PARTITION (b='2010-10-17')");
+    }
+
+    @Test
+    public void testAlterTablePartRelocate() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16')");
+        Path partPath = new Path(whPath, new Random().nextInt() + "/mypart");
+        exec("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", partPath.makeQualified(whFs));
+    }
+
+    @Test
+    public void testAlterTablePartRelocateFail() throws Exception {
+        exec("CREATE TABLE foo1 (foo INT) PARTITIONED BY (b STRING) STORED AS RCFILE");
+
+        Path oldLoc = new Path(whPath, new Random().nextInt() + "/mypart");
+        Path newLoc = new Path(whPath, new Random().nextInt() + "/mypart2");
+
+        exec("ALTER TABLE foo1 ADD PARTITION (b='2010-10-16') LOCATION '%s'", oldLoc);
+        whFs.mkdirs(oldLoc, perm500);
+        execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
+        whFs.mkdirs(oldLoc, perm700);
+        whFs.mkdirs(newLoc, perm500);
+        execFail("ALTER TABLE foo1 PARTITION (b='2010-10-16') SET LOCATION '%s'", newLoc.makeQualified(whFs));
+    }
+
 }
diff --git a/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java b/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java
index 34096ac..a5d8213 100644
--- a/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java
+++ b/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevision.java
@@ -35,383 +35,382 @@
 import java.util.BitSet;
 
 public class StoreFamilyRevision implements org.apache.thrift.TBase<StoreFamilyRevision, StoreFamilyRevision._Fields>, java.io.Serializable, Cloneable {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevision");
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevision");
 
-  private static final org.apache.thrift.protocol.TField REVISION_FIELD_DESC = new org.apache.thrift.protocol.TField("revision", org.apache.thrift.protocol.TType.I64, (short)1);
-  private static final org.apache.thrift.protocol.TField TIMESTAMP_FIELD_DESC = new org.apache.thrift.protocol.TField("timestamp", org.apache.thrift.protocol.TType.I64, (short)2);
+    private static final org.apache.thrift.protocol.TField REVISION_FIELD_DESC = new org.apache.thrift.protocol.TField("revision", org.apache.thrift.protocol.TType.I64, (short) 1);
+    private static final org.apache.thrift.protocol.TField TIMESTAMP_FIELD_DESC = new org.apache.thrift.protocol.TField("timestamp", org.apache.thrift.protocol.TType.I64, (short) 2);
 
-  public long revision; // required
-  public long timestamp; // required
+    public long revision; // required
+    public long timestamp; // required
 
-  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
-  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    REVISION((short)1, "revision"),
-    TIMESTAMP((short)2, "timestamp");
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+        REVISION((short) 1, "revision"),
+        TIMESTAMP((short) 2, "timestamp");
 
-    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+        private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+        static {
+            for (_Fields field : EnumSet.allOf(_Fields.class)) {
+                byName.put(field.getFieldName(), field);
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, or null if its not found.
+         */
+        public static _Fields findByThriftId(int fieldId) {
+            switch (fieldId) {
+            case 1: // REVISION
+                return REVISION;
+            case 2: // TIMESTAMP
+                return TIMESTAMP;
+            default:
+                return null;
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, throwing an exception
+         * if it is not found.
+         */
+        public static _Fields findByThriftIdOrThrow(int fieldId) {
+            _Fields fields = findByThriftId(fieldId);
+            if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+            return fields;
+        }
+
+        /**
+         * Find the _Fields constant that matches name, or null if its not found.
+         */
+        public static _Fields findByName(String name) {
+            return byName.get(name);
+        }
+
+        private final short _thriftId;
+        private final String _fieldName;
+
+        _Fields(short thriftId, String fieldName) {
+            _thriftId = thriftId;
+            _fieldName = fieldName;
+        }
+
+        public short getThriftFieldId() {
+            return _thriftId;
+        }
+
+        public String getFieldName() {
+            return _fieldName;
+        }
+    }
+
+    // isset id assignments
+    private static final int __REVISION_ISSET_ID = 0;
+    private static final int __TIMESTAMP_ISSET_ID = 1;
+    private BitSet __isset_bit_vector = new BitSet(2);
+
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
 
     static {
-      for (_Fields field : EnumSet.allOf(_Fields.class)) {
-        byName.put(field.getFieldName(), field);
-      }
+        Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+        tmpMap.put(_Fields.REVISION, new org.apache.thrift.meta_data.FieldMetaData("revision", org.apache.thrift.TFieldRequirementType.DEFAULT,
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+        tmpMap.put(_Fields.TIMESTAMP, new org.apache.thrift.meta_data.FieldMetaData("timestamp", org.apache.thrift.TFieldRequirementType.DEFAULT,
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+        metaDataMap = Collections.unmodifiableMap(tmpMap);
+        org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevision.class, metaDataMap);
+    }
+
+    public StoreFamilyRevision() {
+    }
+
+    public StoreFamilyRevision(
+        long revision,
+        long timestamp) {
+        this();
+        this.revision = revision;
+        setRevisionIsSet(true);
+        this.timestamp = timestamp;
+        setTimestampIsSet(true);
     }
 
     /**
-     * Find the _Fields constant that matches fieldId, or null if its not found.
+     * Performs a deep copy on <i>other</i>.
      */
-    public static _Fields findByThriftId(int fieldId) {
-      switch(fieldId) {
-        case 1: // REVISION
-          return REVISION;
-        case 2: // TIMESTAMP
-          return TIMESTAMP;
-        default:
-          return null;
-      }
+    public StoreFamilyRevision(StoreFamilyRevision other) {
+        __isset_bit_vector.clear();
+        __isset_bit_vector.or(other.__isset_bit_vector);
+        this.revision = other.revision;
+        this.timestamp = other.timestamp;
     }
 
-    /**
-     * Find the _Fields constant that matches fieldId, throwing an exception
-     * if it is not found.
-     */
-    public static _Fields findByThriftIdOrThrow(int fieldId) {
-      _Fields fields = findByThriftId(fieldId);
-      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
-      return fields;
+    public StoreFamilyRevision deepCopy() {
+        return new StoreFamilyRevision(this);
     }
 
-    /**
-     * Find the _Fields constant that matches name, or null if its not found.
-     */
-    public static _Fields findByName(String name) {
-      return byName.get(name);
+    @Override
+    public void clear() {
+        setRevisionIsSet(false);
+        this.revision = 0;
+        setTimestampIsSet(false);
+        this.timestamp = 0;
     }
 
-    private final short _thriftId;
-    private final String _fieldName;
-
-    _Fields(short thriftId, String fieldName) {
-      _thriftId = thriftId;
-      _fieldName = fieldName;
+    public long getRevision() {
+        return this.revision;
     }
 
-    public short getThriftFieldId() {
-      return _thriftId;
+    public StoreFamilyRevision setRevision(long revision) {
+        this.revision = revision;
+        setRevisionIsSet(true);
+        return this;
     }
 
-    public String getFieldName() {
-      return _fieldName;
-    }
-  }
-
-  // isset id assignments
-  private static final int __REVISION_ISSET_ID = 0;
-  private static final int __TIMESTAMP_ISSET_ID = 1;
-  private BitSet __isset_bit_vector = new BitSet(2);
-
-  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
-  static {
-    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
-    tmpMap.put(_Fields.REVISION, new org.apache.thrift.meta_data.FieldMetaData("revision", org.apache.thrift.TFieldRequirementType.DEFAULT,
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
-    tmpMap.put(_Fields.TIMESTAMP, new org.apache.thrift.meta_data.FieldMetaData("timestamp", org.apache.thrift.TFieldRequirementType.DEFAULT,
-        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
-    metaDataMap = Collections.unmodifiableMap(tmpMap);
-    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevision.class, metaDataMap);
-  }
-
-  public StoreFamilyRevision() {
-  }
-
-  public StoreFamilyRevision(
-    long revision,
-    long timestamp)
-  {
-    this();
-    this.revision = revision;
-    setRevisionIsSet(true);
-    this.timestamp = timestamp;
-    setTimestampIsSet(true);
-  }
-
-  /**
-   * Performs a deep copy on <i>other</i>.
-   */
-  public StoreFamilyRevision(StoreFamilyRevision other) {
-    __isset_bit_vector.clear();
-    __isset_bit_vector.or(other.__isset_bit_vector);
-    this.revision = other.revision;
-    this.timestamp = other.timestamp;
-  }
-
-  public StoreFamilyRevision deepCopy() {
-    return new StoreFamilyRevision(this);
-  }
-
-  @Override
-  public void clear() {
-    setRevisionIsSet(false);
-    this.revision = 0;
-    setTimestampIsSet(false);
-    this.timestamp = 0;
-  }
-
-  public long getRevision() {
-    return this.revision;
-  }
-
-  public StoreFamilyRevision setRevision(long revision) {
-    this.revision = revision;
-    setRevisionIsSet(true);
-    return this;
-  }
-
-  public void unsetRevision() {
-    __isset_bit_vector.clear(__REVISION_ISSET_ID);
-  }
-
-  /** Returns true if field revision is set (has been assigned a value) and false otherwise */
-  public boolean isSetRevision() {
-    return __isset_bit_vector.get(__REVISION_ISSET_ID);
-  }
-
-  public void setRevisionIsSet(boolean value) {
-    __isset_bit_vector.set(__REVISION_ISSET_ID, value);
-  }
-
-  public long getTimestamp() {
-    return this.timestamp;
-  }
-
-  public StoreFamilyRevision setTimestamp(long timestamp) {
-    this.timestamp = timestamp;
-    setTimestampIsSet(true);
-    return this;
-  }
-
-  public void unsetTimestamp() {
-    __isset_bit_vector.clear(__TIMESTAMP_ISSET_ID);
-  }
-
-  /** Returns true if field timestamp is set (has been assigned a value) and false otherwise */
-  public boolean isSetTimestamp() {
-    return __isset_bit_vector.get(__TIMESTAMP_ISSET_ID);
-  }
-
-  public void setTimestampIsSet(boolean value) {
-    __isset_bit_vector.set(__TIMESTAMP_ISSET_ID, value);
-  }
-
-  public void setFieldValue(_Fields field, Object value) {
-    switch (field) {
-    case REVISION:
-      if (value == null) {
-        unsetRevision();
-      } else {
-        setRevision((Long)value);
-      }
-      break;
-
-    case TIMESTAMP:
-      if (value == null) {
-        unsetTimestamp();
-      } else {
-        setTimestamp((Long)value);
-      }
-      break;
-
-    }
-  }
-
-  public Object getFieldValue(_Fields field) {
-    switch (field) {
-    case REVISION:
-      return Long.valueOf(getRevision());
-
-    case TIMESTAMP:
-      return Long.valueOf(getTimestamp());
-
-    }
-    throw new IllegalStateException();
-  }
-
-  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
-  public boolean isSet(_Fields field) {
-    if (field == null) {
-      throw new IllegalArgumentException();
+    public void unsetRevision() {
+        __isset_bit_vector.clear(__REVISION_ISSET_ID);
     }
 
-    switch (field) {
-    case REVISION:
-      return isSetRevision();
-    case TIMESTAMP:
-      return isSetTimestamp();
+    /** Returns true if field revision is set (has been assigned a value) and false otherwise */
+    public boolean isSetRevision() {
+        return __isset_bit_vector.get(__REVISION_ISSET_ID);
     }
-    throw new IllegalStateException();
-  }
 
-  @Override
-  public boolean equals(Object that) {
-    if (that == null)
-      return false;
-    if (that instanceof StoreFamilyRevision)
-      return this.equals((StoreFamilyRevision)that);
-    return false;
-  }
+    public void setRevisionIsSet(boolean value) {
+        __isset_bit_vector.set(__REVISION_ISSET_ID, value);
+    }
 
-  public boolean equals(StoreFamilyRevision that) {
-    if (that == null)
-      return false;
+    public long getTimestamp() {
+        return this.timestamp;
+    }
 
-    boolean this_present_revision = true;
-    boolean that_present_revision = true;
-    if (this_present_revision || that_present_revision) {
-      if (!(this_present_revision && that_present_revision))
-        return false;
-      if (this.revision != that.revision)
+    public StoreFamilyRevision setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+        setTimestampIsSet(true);
+        return this;
+    }
+
+    public void unsetTimestamp() {
+        __isset_bit_vector.clear(__TIMESTAMP_ISSET_ID);
+    }
+
+    /** Returns true if field timestamp is set (has been assigned a value) and false otherwise */
+    public boolean isSetTimestamp() {
+        return __isset_bit_vector.get(__TIMESTAMP_ISSET_ID);
+    }
+
+    public void setTimestampIsSet(boolean value) {
+        __isset_bit_vector.set(__TIMESTAMP_ISSET_ID, value);
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+        switch (field) {
+        case REVISION:
+            if (value == null) {
+                unsetRevision();
+            } else {
+                setRevision((Long) value);
+            }
+            break;
+
+        case TIMESTAMP:
+            if (value == null) {
+                unsetTimestamp();
+            } else {
+                setTimestamp((Long) value);
+            }
+            break;
+
+        }
+    }
+
+    public Object getFieldValue(_Fields field) {
+        switch (field) {
+        case REVISION:
+            return Long.valueOf(getRevision());
+
+        case TIMESTAMP:
+            return Long.valueOf(getTimestamp());
+
+        }
+        throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+        if (field == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (field) {
+        case REVISION:
+            return isSetRevision();
+        case TIMESTAMP:
+            return isSetTimestamp();
+        }
+        throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (that == null)
+            return false;
+        if (that instanceof StoreFamilyRevision)
+            return this.equals((StoreFamilyRevision) that);
         return false;
     }
 
-    boolean this_present_timestamp = true;
-    boolean that_present_timestamp = true;
-    if (this_present_timestamp || that_present_timestamp) {
-      if (!(this_present_timestamp && that_present_timestamp))
-        return false;
-      if (this.timestamp != that.timestamp)
-        return false;
+    public boolean equals(StoreFamilyRevision that) {
+        if (that == null)
+            return false;
+
+        boolean this_present_revision = true;
+        boolean that_present_revision = true;
+        if (this_present_revision || that_present_revision) {
+            if (!(this_present_revision && that_present_revision))
+                return false;
+            if (this.revision != that.revision)
+                return false;
+        }
+
+        boolean this_present_timestamp = true;
+        boolean that_present_timestamp = true;
+        if (this_present_timestamp || that_present_timestamp) {
+            if (!(this_present_timestamp && that_present_timestamp))
+                return false;
+            if (this.timestamp != that.timestamp)
+                return false;
+        }
+
+        return true;
     }
 
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return 0;
-  }
-
-  public int compareTo(StoreFamilyRevision other) {
-    if (!getClass().equals(other.getClass())) {
-      return getClass().getName().compareTo(other.getClass().getName());
+    @Override
+    public int hashCode() {
+        return 0;
     }
 
-    int lastComparison = 0;
-    StoreFamilyRevision typedOther = (StoreFamilyRevision)other;
+    public int compareTo(StoreFamilyRevision other) {
+        if (!getClass().equals(other.getClass())) {
+            return getClass().getName().compareTo(other.getClass().getName());
+        }
 
-    lastComparison = Boolean.valueOf(isSetRevision()).compareTo(typedOther.isSetRevision());
-    if (lastComparison != 0) {
-      return lastComparison;
+        int lastComparison = 0;
+        StoreFamilyRevision typedOther = (StoreFamilyRevision) other;
+
+        lastComparison = Boolean.valueOf(isSetRevision()).compareTo(typedOther.isSetRevision());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetRevision()) {
+            lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revision, typedOther.revision);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        lastComparison = Boolean.valueOf(isSetTimestamp()).compareTo(typedOther.isSetTimestamp());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetTimestamp()) {
+            lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.timestamp, typedOther.timestamp);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        return 0;
     }
-    if (isSetRevision()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revision, typedOther.revision);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
+
+    public _Fields fieldForId(int fieldId) {
+        return _Fields.findByThriftId(fieldId);
     }
-    lastComparison = Boolean.valueOf(isSetTimestamp()).compareTo(typedOther.isSetTimestamp());
-    if (lastComparison != 0) {
-      return lastComparison;
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField field;
+        iprot.readStructBegin();
+        while (true) {
+            field = iprot.readFieldBegin();
+            if (field.type == org.apache.thrift.protocol.TType.STOP) {
+                break;
+            }
+            switch (field.id) {
+            case 1: // REVISION
+                if (field.type == org.apache.thrift.protocol.TType.I64) {
+                    this.revision = iprot.readI64();
+                    setRevisionIsSet(true);
+                } else {
+                    org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+                }
+                break;
+            case 2: // TIMESTAMP
+                if (field.type == org.apache.thrift.protocol.TType.I64) {
+                    this.timestamp = iprot.readI64();
+                    setTimestampIsSet(true);
+                } else {
+                    org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+                }
+                break;
+            default:
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+            }
+            iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        validate();
     }
-    if (isSetTimestamp()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.timestamp, typedOther.timestamp);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+        validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        oprot.writeFieldBegin(REVISION_FIELD_DESC);
+        oprot.writeI64(this.revision);
+        oprot.writeFieldEnd();
+        oprot.writeFieldBegin(TIMESTAMP_FIELD_DESC);
+        oprot.writeI64(this.timestamp);
+        oprot.writeFieldEnd();
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
     }
-    return 0;
-  }
 
-  public _Fields fieldForId(int fieldId) {
-    return _Fields.findByThriftId(fieldId);
-  }
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("StoreFamilyRevision(");
+        boolean first = true;
 
-  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
-    org.apache.thrift.protocol.TField field;
-    iprot.readStructBegin();
-    while (true)
-    {
-      field = iprot.readFieldBegin();
-      if (field.type == org.apache.thrift.protocol.TType.STOP) {
-        break;
-      }
-      switch (field.id) {
-        case 1: // REVISION
-          if (field.type == org.apache.thrift.protocol.TType.I64) {
-            this.revision = iprot.readI64();
-            setRevisionIsSet(true);
-          } else {
-            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
-          }
-          break;
-        case 2: // TIMESTAMP
-          if (field.type == org.apache.thrift.protocol.TType.I64) {
-            this.timestamp = iprot.readI64();
-            setTimestampIsSet(true);
-          } else {
-            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
-          }
-          break;
-        default:
-          org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
-      }
-      iprot.readFieldEnd();
+        sb.append("revision:");
+        sb.append(this.revision);
+        first = false;
+        if (!first) sb.append(", ");
+        sb.append("timestamp:");
+        sb.append(this.timestamp);
+        first = false;
+        sb.append(")");
+        return sb.toString();
     }
-    iprot.readStructEnd();
 
-    // check for required fields of primitive type, which can't be checked in the validate method
-    validate();
-  }
-
-  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
-    validate();
-
-    oprot.writeStructBegin(STRUCT_DESC);
-    oprot.writeFieldBegin(REVISION_FIELD_DESC);
-    oprot.writeI64(this.revision);
-    oprot.writeFieldEnd();
-    oprot.writeFieldBegin(TIMESTAMP_FIELD_DESC);
-    oprot.writeI64(this.timestamp);
-    oprot.writeFieldEnd();
-    oprot.writeFieldStop();
-    oprot.writeStructEnd();
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder("StoreFamilyRevision(");
-    boolean first = true;
-
-    sb.append("revision:");
-    sb.append(this.revision);
-    first = false;
-    if (!first) sb.append(", ");
-    sb.append("timestamp:");
-    sb.append(this.timestamp);
-    first = false;
-    sb.append(")");
-    return sb.toString();
-  }
-
-  public void validate() throws org.apache.thrift.TException {
-    // check for required fields
-  }
-
-  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
-    try {
-      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
+    public void validate() throws org.apache.thrift.TException {
+        // check for required fields
     }
-  }
 
-  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
-    try {
-      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
-      __isset_bit_vector = new BitSet(1);
-      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+        try {
+            write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
     }
-  }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+        try {
+            // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+            __isset_bit_vector = new BitSet(1);
+            read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
+    }
 
 }
 
diff --git a/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevisionList.java b/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevisionList.java
index e3c1c89..0f661cb 100644
--- a/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevisionList.java
+++ b/storage-handlers/hbase/src/gen-java/org/apache/hcatalog/hbase/snapshot/transaction/thrift/StoreFamilyRevisionList.java
@@ -36,337 +36,334 @@
 import java.util.Map;
 
 public class StoreFamilyRevisionList implements org.apache.thrift.TBase<StoreFamilyRevisionList, StoreFamilyRevisionList._Fields>, java.io.Serializable, Cloneable {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevisionList");
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("StoreFamilyRevisionList");
 
-  private static final org.apache.thrift.protocol.TField REVISION_LIST_FIELD_DESC = new org.apache.thrift.protocol.TField("revisionList", org.apache.thrift.protocol.TType.LIST, (short)1);
+    private static final org.apache.thrift.protocol.TField REVISION_LIST_FIELD_DESC = new org.apache.thrift.protocol.TField("revisionList", org.apache.thrift.protocol.TType.LIST, (short) 1);
 
-  public List<StoreFamilyRevision> revisionList; // required
+    public List<StoreFamilyRevision> revisionList; // required
 
-  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
-  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    REVISION_LIST((short)1, "revisionList");
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+        REVISION_LIST((short) 1, "revisionList");
 
-    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+        private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+        static {
+            for (_Fields field : EnumSet.allOf(_Fields.class)) {
+                byName.put(field.getFieldName(), field);
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, or null if its not found.
+         */
+        public static _Fields findByThriftId(int fieldId) {
+            switch (fieldId) {
+            case 1: // REVISION_LIST
+                return REVISION_LIST;
+            default:
+                return null;
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, throwing an exception
+         * if it is not found.
+         */
+        public static _Fields findByThriftIdOrThrow(int fieldId) {
+            _Fields fields = findByThriftId(fieldId);
+            if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+            return fields;
+        }
+
+        /**
+         * Find the _Fields constant that matches name, or null if its not found.
+         */
+        public static _Fields findByName(String name) {
+            return byName.get(name);
+        }
+
+        private final short _thriftId;
+        private final String _fieldName;
+
+        _Fields(short thriftId, String fieldName) {
+            _thriftId = thriftId;
+            _fieldName = fieldName;
+        }
+
+        public short getThriftFieldId() {
+            return _thriftId;
+        }
+
+        public String getFieldName() {
+            return _fieldName;
+        }
+    }
+
+    // isset id assignments
+
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
 
     static {
-      for (_Fields field : EnumSet.allOf(_Fields.class)) {
-        byName.put(field.getFieldName(), field);
-      }
+        Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+        tmpMap.put(_Fields.REVISION_LIST, new org.apache.thrift.meta_data.FieldMetaData("revisionList", org.apache.thrift.TFieldRequirementType.DEFAULT,
+            new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST,
+                new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, StoreFamilyRevision.class))));
+        metaDataMap = Collections.unmodifiableMap(tmpMap);
+        org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevisionList.class, metaDataMap);
+    }
+
+    public StoreFamilyRevisionList() {
+    }
+
+    public StoreFamilyRevisionList(
+        List<StoreFamilyRevision> revisionList) {
+        this();
+        this.revisionList = revisionList;
     }
 
     /**
-     * Find the _Fields constant that matches fieldId, or null if its not found.
+     * Performs a deep copy on <i>other</i>.
      */
-    public static _Fields findByThriftId(int fieldId) {
-      switch(fieldId) {
-        case 1: // REVISION_LIST
-          return REVISION_LIST;
-        default:
-          return null;
-      }
-    }
-
-    /**
-     * Find the _Fields constant that matches fieldId, throwing an exception
-     * if it is not found.
-     */
-    public static _Fields findByThriftIdOrThrow(int fieldId) {
-      _Fields fields = findByThriftId(fieldId);
-      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
-      return fields;
-    }
-
-    /**
-     * Find the _Fields constant that matches name, or null if its not found.
-     */
-    public static _Fields findByName(String name) {
-      return byName.get(name);
-    }
-
-    private final short _thriftId;
-    private final String _fieldName;
-
-    _Fields(short thriftId, String fieldName) {
-      _thriftId = thriftId;
-      _fieldName = fieldName;
-    }
-
-    public short getThriftFieldId() {
-      return _thriftId;
-    }
-
-    public String getFieldName() {
-      return _fieldName;
-    }
-  }
-
-  // isset id assignments
-
-  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
-  static {
-    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
-    tmpMap.put(_Fields.REVISION_LIST, new org.apache.thrift.meta_data.FieldMetaData("revisionList", org.apache.thrift.TFieldRequirementType.DEFAULT,
-        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST,
-            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, StoreFamilyRevision.class))));
-    metaDataMap = Collections.unmodifiableMap(tmpMap);
-    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(StoreFamilyRevisionList.class, metaDataMap);
-  }
-
-  public StoreFamilyRevisionList() {
-  }
-
-  public StoreFamilyRevisionList(
-    List<StoreFamilyRevision> revisionList)
-  {
-    this();
-    this.revisionList = revisionList;
-  }
-
-  /**
-   * Performs a deep copy on <i>other</i>.
-   */
-  public StoreFamilyRevisionList(StoreFamilyRevisionList other) {
-    if (other.isSetRevisionList()) {
-      List<StoreFamilyRevision> __this__revisionList = new ArrayList<StoreFamilyRevision>();
-      for (StoreFamilyRevision other_element : other.revisionList) {
-        __this__revisionList.add(new StoreFamilyRevision(other_element));
-      }
-      this.revisionList = __this__revisionList;
-    }
-  }
-
-  public StoreFamilyRevisionList deepCopy() {
-    return new StoreFamilyRevisionList(this);
-  }
-
-  @Override
-  public void clear() {
-    this.revisionList = null;
-  }
-
-  public int getRevisionListSize() {
-    return (this.revisionList == null) ? 0 : this.revisionList.size();
-  }
-
-  public java.util.Iterator<StoreFamilyRevision> getRevisionListIterator() {
-    return (this.revisionList == null) ? null : this.revisionList.iterator();
-  }
-
-  public void addToRevisionList(StoreFamilyRevision elem) {
-    if (this.revisionList == null) {
-      this.revisionList = new ArrayList<StoreFamilyRevision>();
-    }
-    this.revisionList.add(elem);
-  }
-
-  public List<StoreFamilyRevision> getRevisionList() {
-    return this.revisionList;
-  }
-
-  public StoreFamilyRevisionList setRevisionList(List<StoreFamilyRevision> revisionList) {
-    this.revisionList = revisionList;
-    return this;
-  }
-
-  public void unsetRevisionList() {
-    this.revisionList = null;
-  }
-
-  /** Returns true if field revisionList is set (has been assigned a value) and false otherwise */
-  public boolean isSetRevisionList() {
-    return this.revisionList != null;
-  }
-
-  public void setRevisionListIsSet(boolean value) {
-    if (!value) {
-      this.revisionList = null;
-    }
-  }
-
-  public void setFieldValue(_Fields field, Object value) {
-    switch (field) {
-    case REVISION_LIST:
-      if (value == null) {
-        unsetRevisionList();
-      } else {
-        setRevisionList((List<StoreFamilyRevision>)value);
-      }
-      break;
-
-    }
-  }
-
-  public Object getFieldValue(_Fields field) {
-    switch (field) {
-    case REVISION_LIST:
-      return getRevisionList();
-
-    }
-    throw new IllegalStateException();
-  }
-
-  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
-  public boolean isSet(_Fields field) {
-    if (field == null) {
-      throw new IllegalArgumentException();
-    }
-
-    switch (field) {
-    case REVISION_LIST:
-      return isSetRevisionList();
-    }
-    throw new IllegalStateException();
-  }
-
-  @Override
-  public boolean equals(Object that) {
-    if (that == null)
-      return false;
-    if (that instanceof StoreFamilyRevisionList)
-      return this.equals((StoreFamilyRevisionList)that);
-    return false;
-  }
-
-  public boolean equals(StoreFamilyRevisionList that) {
-    if (that == null)
-      return false;
-
-    boolean this_present_revisionList = true && this.isSetRevisionList();
-    boolean that_present_revisionList = true && that.isSetRevisionList();
-    if (this_present_revisionList || that_present_revisionList) {
-      if (!(this_present_revisionList && that_present_revisionList))
-        return false;
-      if (!this.revisionList.equals(that.revisionList))
-        return false;
-    }
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    return 0;
-  }
-
-  public int compareTo(StoreFamilyRevisionList other) {
-    if (!getClass().equals(other.getClass())) {
-      return getClass().getName().compareTo(other.getClass().getName());
-    }
-
-    int lastComparison = 0;
-    StoreFamilyRevisionList typedOther = (StoreFamilyRevisionList)other;
-
-    lastComparison = Boolean.valueOf(isSetRevisionList()).compareTo(typedOther.isSetRevisionList());
-    if (lastComparison != 0) {
-      return lastComparison;
-    }
-    if (isSetRevisionList()) {
-      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revisionList, typedOther.revisionList);
-      if (lastComparison != 0) {
-        return lastComparison;
-      }
-    }
-    return 0;
-  }
-
-  public _Fields fieldForId(int fieldId) {
-    return _Fields.findByThriftId(fieldId);
-  }
-
-  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
-    org.apache.thrift.protocol.TField field;
-    iprot.readStructBegin();
-    while (true)
-    {
-      field = iprot.readFieldBegin();
-      if (field.type == org.apache.thrift.protocol.TType.STOP) {
-        break;
-      }
-      switch (field.id) {
-        case 1: // REVISION_LIST
-          if (field.type == org.apache.thrift.protocol.TType.LIST) {
-            {
-              org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
-              this.revisionList = new ArrayList<StoreFamilyRevision>(_list0.size);
-              for (int _i1 = 0; _i1 < _list0.size; ++_i1)
-              {
-                StoreFamilyRevision _elem2; // required
-                _elem2 = new StoreFamilyRevision();
-                _elem2.read(iprot);
-                this.revisionList.add(_elem2);
-              }
-              iprot.readListEnd();
+    public StoreFamilyRevisionList(StoreFamilyRevisionList other) {
+        if (other.isSetRevisionList()) {
+            List<StoreFamilyRevision> __this__revisionList = new ArrayList<StoreFamilyRevision>();
+            for (StoreFamilyRevision other_element : other.revisionList) {
+                __this__revisionList.add(new StoreFamilyRevision(other_element));
             }
-          } else {
-            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
-          }
-          break;
-        default:
-          org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
-      }
-      iprot.readFieldEnd();
-    }
-    iprot.readStructEnd();
-
-    // check for required fields of primitive type, which can't be checked in the validate method
-    validate();
-  }
-
-  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
-    validate();
-
-    oprot.writeStructBegin(STRUCT_DESC);
-    if (this.revisionList != null) {
-      oprot.writeFieldBegin(REVISION_LIST_FIELD_DESC);
-      {
-        oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, this.revisionList.size()));
-        for (StoreFamilyRevision _iter3 : this.revisionList)
-        {
-          _iter3.write(oprot);
+            this.revisionList = __this__revisionList;
         }
-        oprot.writeListEnd();
-      }
-      oprot.writeFieldEnd();
     }
-    oprot.writeFieldStop();
-    oprot.writeStructEnd();
-  }
 
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder("StoreFamilyRevisionList(");
-    boolean first = true;
-
-    sb.append("revisionList:");
-    if (this.revisionList == null) {
-      sb.append("null");
-    } else {
-      sb.append(this.revisionList);
+    public StoreFamilyRevisionList deepCopy() {
+        return new StoreFamilyRevisionList(this);
     }
-    first = false;
-    sb.append(")");
-    return sb.toString();
-  }
 
-  public void validate() throws org.apache.thrift.TException {
-    // check for required fields
-  }
-
-  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
-    try {
-      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
+    @Override
+    public void clear() {
+        this.revisionList = null;
     }
-  }
 
-  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
-    try {
-      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
-    } catch (org.apache.thrift.TException te) {
-      throw new java.io.IOException(te);
+    public int getRevisionListSize() {
+        return (this.revisionList == null) ? 0 : this.revisionList.size();
     }
-  }
+
+    public java.util.Iterator<StoreFamilyRevision> getRevisionListIterator() {
+        return (this.revisionList == null) ? null : this.revisionList.iterator();
+    }
+
+    public void addToRevisionList(StoreFamilyRevision elem) {
+        if (this.revisionList == null) {
+            this.revisionList = new ArrayList<StoreFamilyRevision>();
+        }
+        this.revisionList.add(elem);
+    }
+
+    public List<StoreFamilyRevision> getRevisionList() {
+        return this.revisionList;
+    }
+
+    public StoreFamilyRevisionList setRevisionList(List<StoreFamilyRevision> revisionList) {
+        this.revisionList = revisionList;
+        return this;
+    }
+
+    public void unsetRevisionList() {
+        this.revisionList = null;
+    }
+
+    /** Returns true if field revisionList is set (has been assigned a value) and false otherwise */
+    public boolean isSetRevisionList() {
+        return this.revisionList != null;
+    }
+
+    public void setRevisionListIsSet(boolean value) {
+        if (!value) {
+            this.revisionList = null;
+        }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+        switch (field) {
+        case REVISION_LIST:
+            if (value == null) {
+                unsetRevisionList();
+            } else {
+                setRevisionList((List<StoreFamilyRevision>) value);
+            }
+            break;
+
+        }
+    }
+
+    public Object getFieldValue(_Fields field) {
+        switch (field) {
+        case REVISION_LIST:
+            return getRevisionList();
+
+        }
+        throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+        if (field == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (field) {
+        case REVISION_LIST:
+            return isSetRevisionList();
+        }
+        throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (that == null)
+            return false;
+        if (that instanceof StoreFamilyRevisionList)
+            return this.equals((StoreFamilyRevisionList) that);
+        return false;
+    }
+
+    public boolean equals(StoreFamilyRevisionList that) {
+        if (that == null)
+            return false;
+
+        boolean this_present_revisionList = true && this.isSetRevisionList();
+        boolean that_present_revisionList = true && that.isSetRevisionList();
+        if (this_present_revisionList || that_present_revisionList) {
+            if (!(this_present_revisionList && that_present_revisionList))
+                return false;
+            if (!this.revisionList.equals(that.revisionList))
+                return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    public int compareTo(StoreFamilyRevisionList other) {
+        if (!getClass().equals(other.getClass())) {
+            return getClass().getName().compareTo(other.getClass().getName());
+        }
+
+        int lastComparison = 0;
+        StoreFamilyRevisionList typedOther = (StoreFamilyRevisionList) other;
+
+        lastComparison = Boolean.valueOf(isSetRevisionList()).compareTo(typedOther.isSetRevisionList());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetRevisionList()) {
+            lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.revisionList, typedOther.revisionList);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+        return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField field;
+        iprot.readStructBegin();
+        while (true) {
+            field = iprot.readFieldBegin();
+            if (field.type == org.apache.thrift.protocol.TType.STOP) {
+                break;
+            }
+            switch (field.id) {
+            case 1: // REVISION_LIST
+                if (field.type == org.apache.thrift.protocol.TType.LIST) {
+                    {
+                        org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
+                        this.revisionList = new ArrayList<StoreFamilyRevision>(_list0.size);
+                        for (int _i1 = 0; _i1 < _list0.size; ++_i1) {
+                            StoreFamilyRevision _elem2; // required
+                            _elem2 = new StoreFamilyRevision();
+                            _elem2.read(iprot);
+                            this.revisionList.add(_elem2);
+                        }
+                        iprot.readListEnd();
+                    }
+                } else {
+                    org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+                }
+                break;
+            default:
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
+            }
+            iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+        validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (this.revisionList != null) {
+            oprot.writeFieldBegin(REVISION_LIST_FIELD_DESC);
+            {
+                oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, this.revisionList.size()));
+                for (StoreFamilyRevision _iter3 : this.revisionList) {
+                    _iter3.write(oprot);
+                }
+                oprot.writeListEnd();
+            }
+            oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("StoreFamilyRevisionList(");
+        boolean first = true;
+
+        sb.append("revisionList:");
+        if (this.revisionList == null) {
+            sb.append("null");
+        } else {
+            sb.append(this.revisionList);
+        }
+        first = false;
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+        // check for required fields
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+        try {
+            write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+        try {
+            read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
+    }
 
 }
 
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseAuthorizationProvider.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseAuthorizationProvider.java
index 39e0025..77abc0d 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseAuthorizationProvider.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseAuthorizationProvider.java
@@ -35,109 +35,109 @@
  * authorization functionality for HBase tables.
  */
 class HBaseAuthorizationProvider implements HiveAuthorizationProvider {
-    
+
     @Override
     public Configuration getConf() {
         return null;
     }
-    
+
     @Override
     public void setConf(Configuration conf) {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #init(org.apache.hadoop.conf.Configuration)
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #init(org.apache.hadoop.conf.Configuration)
+    */
     @Override
     public void init(Configuration conf) throws HiveException {
     }
-    
+
     @Override
     public HiveAuthenticationProvider getAuthenticator() {
         return null;
     }
-    
+
     @Override
     public void setAuthenticator(HiveAuthenticationProvider authenticator) {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.metastore.api.Database,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.metastore.api.Database,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Database db, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Table table, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Partition,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Partition,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Partition part, Privilege[] readRequiredPriv,
-            Privilege[] writeRequiredPriv) throws HiveException,
-            AuthorizationException {
+                          Privilege[] writeRequiredPriv) throws HiveException,
+        AuthorizationException {
     }
-    
+
     /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
-     * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
-     * org.apache.hadoop.hive.ql.metadata.Partition, java.util.List,
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
-     * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
-     */
+    * (non-Javadoc)
+    *
+    * @see
+    * org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider
+    * #authorize(org.apache.hadoop.hive.ql.metadata.Table,
+    * org.apache.hadoop.hive.ql.metadata.Partition, java.util.List,
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[],
+    * org.apache.hadoop.hive.ql.security.authorization.Privilege[])
+    */
     @Override
     public void authorize(Table table, Partition part, List<String> columns,
-            Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
-            throws HiveException, AuthorizationException {
+                          Privilege[] readRequiredPriv, Privilege[] writeRequiredPriv)
+        throws HiveException, AuthorizationException {
     }
-    
+
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBaseOutputFormat.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBaseOutputFormat.java
index 95a30ec..5805b84 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBaseOutputFormat.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBaseOutputFormat.java
@@ -36,14 +36,14 @@
 import org.apache.hcatalog.mapreduce.OutputJobInfo;
 
 public class HBaseBaseOutputFormat implements OutputFormat<WritableComparable<?>, Put>,
-        HiveOutputFormat<WritableComparable<?>, Put> {
+    HiveOutputFormat<WritableComparable<?>, Put> {
 
     @Override
     public org.apache.hadoop.hive.ql.exec.FileSinkOperator.RecordWriter getHiveRecordWriter(
-            JobConf jc, Path finalOutPath,
-            Class<? extends Writable> valueClass, boolean isCompressed,
-            Properties tableProperties, Progressable progress)
-            throws IOException {
+        JobConf jc, Path finalOutPath,
+        Class<? extends Writable> valueClass, boolean isCompressed,
+        Properties tableProperties, Progressable progress)
+        throws IOException {
         throw new UnsupportedOperationException("Not implemented");
     }
 
@@ -55,13 +55,13 @@
 
     @Override
     public RecordWriter<WritableComparable<?>, Put> getRecordWriter(FileSystem ignored,
-            JobConf job, String name, Progressable progress) throws IOException {
+                                                                    JobConf job, String name, Progressable progress) throws IOException {
         OutputFormat<WritableComparable<?>, Put> outputFormat = getOutputFormat(job);
         return outputFormat.getRecordWriter(ignored, job, name, progress);
     }
 
     private OutputFormat<WritableComparable<?>, Put> getOutputFormat(JobConf job)
-            throws IOException {
+        throws IOException {
         String outputInfo = job.get(HCatConstants.HCAT_KEY_OUTPUT_INFO);
         OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(outputInfo);
         OutputFormat<WritableComparable<?>, Put> outputFormat = null;
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBulkOutputFormat.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBulkOutputFormat.java
index b9aba35..93d09bc 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBulkOutputFormat.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseBulkOutputFormat.java
@@ -51,7 +51,7 @@
 class HBaseBulkOutputFormat extends HBaseBaseOutputFormat {
 
     private final static ImmutableBytesWritable EMPTY_LIST = new ImmutableBytesWritable(
-            new byte[0]);
+        new byte[0]);
     private SequenceFileOutputFormat<WritableComparable<?>, Put> baseOutputFormat;
 
     public HBaseBulkOutputFormat() {
@@ -60,7 +60,7 @@
 
     @Override
     public void checkOutputSpecs(FileSystem ignored, JobConf job)
-            throws IOException {
+        throws IOException {
         baseOutputFormat.checkOutputSpecs(ignored, job);
         HBaseUtil.addHBaseDelegationToken(job);
         addJTDelegationToken(job);
@@ -68,13 +68,13 @@
 
     @Override
     public RecordWriter<WritableComparable<?>, Put> getRecordWriter(
-            FileSystem ignored, JobConf job, String name, Progressable progress)
-            throws IOException {
+        FileSystem ignored, JobConf job, String name, Progressable progress)
+        throws IOException {
         job.setOutputKeyClass(ImmutableBytesWritable.class);
         job.setOutputValueClass(Put.class);
         long version = HBaseRevisionManagerUtil.getOutputRevision(job);
         return new HBaseBulkRecordWriter(baseOutputFormat.getRecordWriter(
-                ignored, job, name, progress), version);
+            ignored, job, name, progress), version);
     }
 
     private void addJTDelegationToken(JobConf job) throws IOException {
@@ -84,7 +84,7 @@
             JobClient jobClient = new JobClient(new JobConf(job));
             try {
                 job.getCredentials().addToken(new Text("my mr token"),
-                        jobClient.getDelegationToken(null));
+                    jobClient.getDelegationToken(null));
             } catch (InterruptedException e) {
                 throw new IOException("Error while getting JT delegation token", e);
             }
@@ -92,21 +92,21 @@
     }
 
     private static class HBaseBulkRecordWriter implements
-            RecordWriter<WritableComparable<?>, Put> {
+        RecordWriter<WritableComparable<?>, Put> {
 
         private RecordWriter<WritableComparable<?>, Put> baseWriter;
         private final Long outputVersion;
 
         public HBaseBulkRecordWriter(
-                RecordWriter<WritableComparable<?>, Put> baseWriter,
-                Long outputVersion) {
+            RecordWriter<WritableComparable<?>, Put> baseWriter,
+            Long outputVersion) {
             this.baseWriter = baseWriter;
             this.outputVersion = outputVersion;
         }
 
         @Override
         public void write(WritableComparable<?> key, Put value)
-                throws IOException {
+            throws IOException {
             Put put = value;
             if (outputVersion != null) {
                 put = new Put(value.getRow(), outputVersion.longValue());
@@ -136,19 +136,19 @@
 
         @Override
         public void abortTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
             baseOutputCommitter.abortTask(taskContext);
         }
 
         @Override
         public void commitTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
             baseOutputCommitter.commitTask(taskContext);
         }
 
         @Override
         public boolean needsTaskCommit(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
             return baseOutputCommitter.needsTaskCommit(taskContext);
         }
 
@@ -159,20 +159,20 @@
 
         @Override
         public void setupTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
             baseOutputCommitter.setupTask(taskContext);
         }
 
         @Override
         public void abortJob(JobContext jobContext, int status)
-                throws IOException {
+            throws IOException {
             baseOutputCommitter.abortJob(jobContext, status);
             RevisionManager rm = null;
             try {
                 rm = HBaseRevisionManagerUtil
-                        .getOpenedRevisionManager(jobContext.getConfiguration());
+                    .getOpenedRevisionManager(jobContext.getConfiguration());
                 rm.abortWriteTransaction(HBaseRevisionManagerUtil
-                        .getWriteTransaction(jobContext.getConfiguration()));
+                    .getWriteTransaction(jobContext.getConfiguration()));
             } finally {
                 cleanIntermediate(jobContext);
                 if (rm != null)
@@ -189,18 +189,18 @@
                 Path srcPath = FileOutputFormat.getOutputPath(jobContext.getJobConf());
                 if (!FileSystem.get(conf).exists(srcPath)) {
                     throw new IOException("Failed to bulk import hfiles. " +
-                    		"Intermediate data directory is cleaned up or missing. " +
-                    		"Please look at the bulk import job if it exists for failure reason");
+                        "Intermediate data directory is cleaned up or missing. " +
+                        "Please look at the bulk import job if it exists for failure reason");
                 }
                 Path destPath = new Path(srcPath.getParent(), srcPath.getName() + "_hfiles");
                 boolean success = ImportSequenceFile.runJob(jobContext,
-                                conf.get(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY),
-                                srcPath,
-                                destPath);
-                if(!success) {
+                    conf.get(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY),
+                    srcPath,
+                    destPath);
+                if (!success) {
                     cleanIntermediate(jobContext);
                     throw new IOException("Failed to bulk import hfiles." +
-                    		" Please look at the bulk import job for failure reason");
+                        " Please look at the bulk import job for failure reason");
                 }
                 rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(conf);
                 rm.commitWriteTransaction(HBaseRevisionManagerUtil.getWriteTransaction(conf));
@@ -212,7 +212,7 @@
         }
 
         private void cleanIntermediate(JobContext jobContext)
-                throws IOException {
+            throws IOException {
             FileSystem fs = FileSystem.get(jobContext.getConfiguration());
             fs.delete(FileOutputFormat.getOutputPath(jobContext.getJobConf()), true);
         }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseConstants.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseConstants.java
index de784a6..80e53ac 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseConstants.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseConstants.java
@@ -26,13 +26,13 @@
 class HBaseConstants {
 
     /** key used to store write transaction object */
-    public static final String PROPERTY_WRITE_TXN_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX+".hbase.mapreduce.writeTxn";
+    public static final String PROPERTY_WRITE_TXN_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".hbase.mapreduce.writeTxn";
 
     /** key used to define the name of the table to write to */
-    public static final String PROPERTY_OUTPUT_TABLE_NAME_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX+".hbase.mapreduce.outputTableName";
+    public static final String PROPERTY_OUTPUT_TABLE_NAME_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".hbase.mapreduce.outputTableName";
 
     /** key used to define whether bulk storage output format will be used or not  */
-    public static final String PROPERTY_BULK_OUTPUT_MODE_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX+".hbase.output.bulkMode";
+    public static final String PROPERTY_BULK_OUTPUT_MODE_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + ".hbase.output.bulkMode";
 
     /** key used to define the hbase table snapshot. */
     public static final String PROPERTY_TABLE_SNAPSHOT_KEY = HCatConstants.HCAT_DEFAULT_TOPIC_PREFIX + "hbase.table.snapshot";
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseDirectOutputFormat.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseDirectOutputFormat.java
index 0001dd2..c4d819a 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseDirectOutputFormat.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseDirectOutputFormat.java
@@ -53,36 +53,36 @@
 
     @Override
     public RecordWriter<WritableComparable<?>, Put> getRecordWriter(FileSystem ignored,
-            JobConf job, String name, Progressable progress)
-            throws IOException {
+                                                                    JobConf job, String name, Progressable progress)
+        throws IOException {
         long version = HBaseRevisionManagerUtil.getOutputRevision(job);
         return new HBaseDirectRecordWriter(outputFormat.getRecordWriter(ignored, job, name,
-                progress), version);
+            progress), version);
     }
 
     @Override
     public void checkOutputSpecs(FileSystem ignored, JobConf job)
-            throws IOException {
+        throws IOException {
         outputFormat.checkOutputSpecs(ignored, job);
         HBaseUtil.addHBaseDelegationToken(job);
     }
 
     private static class HBaseDirectRecordWriter implements
-            RecordWriter<WritableComparable<?>, Put> {
+        RecordWriter<WritableComparable<?>, Put> {
 
         private RecordWriter<WritableComparable<?>, Put> baseWriter;
         private final Long outputVersion;
 
         public HBaseDirectRecordWriter(
-                RecordWriter<WritableComparable<?>, Put> baseWriter,
-                Long outputVersion) {
+            RecordWriter<WritableComparable<?>, Put> baseWriter,
+            Long outputVersion) {
             this.baseWriter = baseWriter;
             this.outputVersion = outputVersion;
         }
 
         @Override
         public void write(WritableComparable<?> key, Put value)
-                throws IOException {
+            throws IOException {
             Put put = value;
             if (outputVersion != null) {
                 put = new Put(value.getRow(), outputVersion.longValue());
@@ -109,17 +109,17 @@
 
         @Override
         public void abortTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
         }
 
         @Override
         public void commitTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
         }
 
         @Override
         public boolean needsTaskCommit(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
             return false;
         }
 
@@ -129,19 +129,19 @@
 
         @Override
         public void setupTask(TaskAttemptContext taskContext)
-                throws IOException {
+            throws IOException {
         }
 
         @Override
         public void abortJob(JobContext jobContext, int status)
-                throws IOException {
+            throws IOException {
             super.abortJob(jobContext, status);
             RevisionManager rm = null;
             try {
                 rm = HBaseRevisionManagerUtil
-                        .getOpenedRevisionManager(jobContext.getConfiguration());
+                    .getOpenedRevisionManager(jobContext.getConfiguration());
                 Transaction writeTransaction = HBaseRevisionManagerUtil
-                        .getWriteTransaction(jobContext.getConfiguration());
+                    .getWriteTransaction(jobContext.getConfiguration());
                 rm.abortWriteTransaction(writeTransaction);
             } finally {
                 if (rm != null)
@@ -154,9 +154,9 @@
             RevisionManager rm = null;
             try {
                 rm = HBaseRevisionManagerUtil
-                        .getOpenedRevisionManager(jobContext.getConfiguration());
+                    .getOpenedRevisionManager(jobContext.getConfiguration());
                 rm.commitWriteTransaction(HBaseRevisionManagerUtil.getWriteTransaction(jobContext
-                        .getConfiguration()));
+                    .getConfiguration()));
             } finally {
                 if (rm != null)
                     rm.close();
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java
index b0441db..42cd23c 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseHCatStorageHandler.java
@@ -106,21 +106,21 @@
             //do it here
             if (jobConf instanceof JobConf) { //Should be the case
                 HBaseUtil.addHBaseDelegationToken(copyOfConf);
-                ((JobConf)jobConf).getCredentials().addAll(copyOfConf.getCredentials());
+                ((JobConf) jobConf).getCredentials().addAll(copyOfConf.getCredentials());
             }
 
             String outputSchema = jobConf.get(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA);
             jobProperties.put(TableInputFormat.SCAN_COLUMNS, getScanColumns(tableInfo, outputSchema));
 
             String serSnapshot = (String) inputJobInfo.getProperties().get(
-                    HBaseConstants.PROPERTY_TABLE_SNAPSHOT_KEY);
+                HBaseConstants.PROPERTY_TABLE_SNAPSHOT_KEY);
             if (serSnapshot == null) {
                 HCatTableSnapshot snapshot =
-                        HBaseRevisionManagerUtil.createSnapshot(
-                            RevisionManagerConfiguration.create(copyOfConf),
-                            qualifiedTableName, tableInfo);
+                    HBaseRevisionManagerUtil.createSnapshot(
+                        RevisionManagerConfiguration.create(copyOfConf),
+                        qualifiedTableName, tableInfo);
                 jobProperties.put(HBaseConstants.PROPERTY_TABLE_SNAPSHOT_KEY,
-                        HCatUtil.serialize(snapshot));
+                    HCatUtil.serialize(snapshot));
             }
 
             //This adds it directly to the jobConf. Setting in jobProperties does not get propagated
@@ -155,21 +155,21 @@
             HBaseConfiguration.addHbaseResources(copyOfConf);
 
             String txnString = outputJobInfo.getProperties().getProperty(
-                    HBaseConstants.PROPERTY_WRITE_TXN_KEY);
+                HBaseConstants.PROPERTY_WRITE_TXN_KEY);
             Transaction txn = null;
             if (txnString == null) {
                 txn = HBaseRevisionManagerUtil.beginWriteTransaction(qualifiedTableName, tableInfo,
-                        RevisionManagerConfiguration.create(copyOfConf));
+                    RevisionManagerConfiguration.create(copyOfConf));
                 String serializedTxn = HCatUtil.serialize(txn);
                 outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,
-                        serializedTxn);
+                    serializedTxn);
             } else {
                 txn = (Transaction) HCatUtil.deserialize(txnString);
             }
             if (isBulkMode(outputJobInfo)) {
                 String tableLocation = tableInfo.getTableLocation();
                 String location = new Path(tableLocation, "REVISION_" + txn.getRevisionNumber())
-                        .toString();
+                    .toString();
                 outputJobInfo.getProperties().setProperty(PROPERTY_INT_OUTPUT_LOCATION, location);
                 // We are writing out an intermediate sequenceFile hence
                 // location is not passed in OutputJobInfo.getLocation()
@@ -199,7 +199,7 @@
     */
     @Override
     public HiveAuthorizationProvider getAuthorizationProvider()
-            throws HiveException {
+        throws HiveException {
 
         HBaseAuthorizationProvider hbaseAuth = new HBaseAuthorizationProvider();
         hbaseAuth.init(getConf());
@@ -230,7 +230,7 @@
      */
     @Override
     public void commitDropTable(Table tbl, boolean deleteData)
-            throws MetaException {
+        throws MetaException {
         checkDeleteTable(tbl);
 
     }
@@ -256,20 +256,20 @@
         try {
             String tableName = getFullyQualifiedHBaseTableName(tbl);
             String hbaseColumnsMapping = tbl.getParameters().get(
-                    HBaseSerDe.HBASE_COLUMNS_MAPPING);
+                HBaseSerDe.HBASE_COLUMNS_MAPPING);
 
             if (hbaseColumnsMapping == null) {
                 throw new MetaException(
-                        "No hbase.columns.mapping defined in table"
-                                + " properties.");
+                    "No hbase.columns.mapping defined in table"
+                        + " properties.");
             }
 
             List<String> hbaseColumnFamilies = new ArrayList<String>();
             List<String> hbaseColumnQualifiers = new ArrayList<String>();
             List<byte[]> hbaseColumnFamiliesBytes = new ArrayList<byte[]>();
             int iKey = HBaseUtil.parseColumnMapping(hbaseColumnsMapping,
-                    hbaseColumnFamilies, hbaseColumnFamiliesBytes,
-                    hbaseColumnQualifiers, null);
+                hbaseColumnFamilies, hbaseColumnFamiliesBytes,
+                hbaseColumnQualifiers, null);
 
             HTableDescriptor tableDesc;
             Set<String> uniqueColumnFamilies = new HashSet<String>();
@@ -283,7 +283,7 @@
 
                     for (String columnFamily : uniqueColumnFamilies) {
                         HColumnDescriptor familyDesc = new HColumnDescriptor(Bytes
-                                .toBytes(columnFamily));
+                            .toBytes(columnFamily));
                         familyDesc.setMaxVersions(Integer.MAX_VALUE);
                         tableDesc.addFamily(familyDesc);
                     }
@@ -292,20 +292,20 @@
                 } else {
                     // an external table
                     throw new MetaException("HBase table " + tableName
-                            + " doesn't exist while the table is "
-                            + "declared as an external table.");
+                        + " doesn't exist while the table is "
+                        + "declared as an external table.");
                 }
 
             } else {
                 if (!isExternal) {
                     throw new MetaException("Table " + tableName
-                            + " already exists within HBase."
-                            + " Use CREATE EXTERNAL TABLE instead to"
-                            + " register it in HCatalog.");
+                        + " already exists within HBase."
+                        + " Use CREATE EXTERNAL TABLE instead to"
+                        + " register it in HCatalog.");
                 }
                 // make sure the schema mapping is right
                 tableDesc = getHBaseAdmin().getTableDescriptor(
-                        Bytes.toBytes(tableName));
+                    Bytes.toBytes(tableName));
 
                 for (int i = 0; i < hbaseColumnFamilies.size(); i++) {
                     if (i == iKey) {
@@ -314,8 +314,8 @@
 
                     if (!tableDesc.hasFamily(hbaseColumnFamiliesBytes.get(i))) {
                         throw new MetaException("Column Family "
-                                + hbaseColumnFamilies.get(i)
-                                + " is not defined in hbase table " + tableName);
+                            + hbaseColumnFamilies.get(i)
+                            + " is not defined in hbase table " + tableName);
                     }
                 }
             }
@@ -401,7 +401,7 @@
         String tableName = tbl.getParameters().get(HBaseSerDe.HBASE_TABLE_NAME);
         if (tableName == null) {
             tableName = tbl.getSd().getSerdeInfo().getParameters()
-                    .get(HBaseSerDe.HBASE_TABLE_NAME);
+                .get(HBaseSerDe.HBASE_TABLE_NAME);
         }
         if (tableName == null) {
             if (tbl.getDbName().equals(MetaStoreUtils.DEFAULT_DATABASE_NAME)) {
@@ -414,14 +414,14 @@
         return tableName;
     }
 
-    static String getFullyQualifiedHBaseTableName(HCatTableInfo tableInfo){
+    static String getFullyQualifiedHBaseTableName(HCatTableInfo tableInfo) {
         String qualifiedName = tableInfo.getStorerInfo().getProperties()
-                .getProperty(HBaseSerDe.HBASE_TABLE_NAME);
+            .getProperty(HBaseSerDe.HBASE_TABLE_NAME);
         if (qualifiedName == null) {
             String databaseName = tableInfo.getDatabaseName();
             String tableName = tableInfo.getTableName();
             if ((databaseName == null)
-                    || (databaseName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME))) {
+                || (databaseName.equals(MetaStoreUtils.DEFAULT_DATABASE_NAME))) {
                 qualifiedName = tableName;
             } else {
                 qualifiedName = databaseName + "." + tableName;
@@ -451,7 +451,7 @@
     */
     @Override
     public Class<? extends SerDe> getSerDeClass()
-            throws UnsupportedOperationException {
+        throws UnsupportedOperationException {
         return HBaseSerDe.class;
     }
 
@@ -514,28 +514,28 @@
      */
     private void addOutputDependencyJars(Configuration conf) throws IOException {
         TableMapReduceUtil.addDependencyJars(conf,
-                //ZK
-                ZooKeeper.class,
-                //HBase
-                HTable.class,
-                //Hive
-                HiveException.class,
-                //HCatalog jar
-                HCatOutputFormat.class,
-                //hcat hbase storage handler jar
-                HBaseHCatStorageHandler.class,
-                //hive hbase storage handler jar
-                HBaseSerDe.class,
-                //hive jar
-                Table.class,
-                //libthrift jar
-                TBase.class,
-                //hbase jar
-                Bytes.class,
-                //thrift-fb303 .jar
-                FacebookBase.class,
-                //guava jar
-                ThreadFactoryBuilder.class);
+            //ZK
+            ZooKeeper.class,
+            //HBase
+            HTable.class,
+            //Hive
+            HiveException.class,
+            //HCatalog jar
+            HCatOutputFormat.class,
+            //hcat hbase storage handler jar
+            HBaseHCatStorageHandler.class,
+            //hive hbase storage handler jar
+            HBaseSerDe.class,
+            //hive jar
+            Table.class,
+            //libthrift jar
+            TBase.class,
+            //hbase jar
+            Bytes.class,
+            //thrift-fb303 .jar
+            FacebookBase.class,
+            //guava jar
+            ThreadFactoryBuilder.class);
     }
 
     /**
@@ -558,15 +558,15 @@
     public static boolean isBulkMode(OutputJobInfo outputJobInfo) {
         //Default is false
         String bulkMode = outputJobInfo.getTableInfo().getStorerInfo().getProperties()
-                .getProperty(HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY,
-                        "false");
+            .getProperty(HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY,
+                "false");
         return "true".equals(bulkMode);
     }
 
     private String getScanColumns(HCatTableInfo tableInfo, String outputColSchema) throws IOException {
         StringBuilder builder = new StringBuilder();
         String hbaseColumnMapping = tableInfo.getStorerInfo().getProperties()
-                .getProperty(HBaseSerDe.HBASE_COLUMNS_MAPPING);
+            .getProperty(HBaseSerDe.HBASE_COLUMNS_MAPPING);
         if (outputColSchema == null) {
             String[] splits = hbaseColumnMapping.split("[,]");
             for (int i = 0; i < splits.length; i++) {
@@ -578,14 +578,14 @@
             HCatSchema tableSchema = tableInfo.getDataColumns();
             List<String> outputFieldNames = outputSchema.getFieldNames();
             List<Integer> outputColumnMapping = new ArrayList<Integer>();
-            for(String fieldName: outputFieldNames){
+            for (String fieldName : outputFieldNames) {
                 int position = tableSchema.getPosition(fieldName);
                 outputColumnMapping.add(position);
             }
             List<String> columnFamilies = new ArrayList<String>();
             List<String> columnQualifiers = new ArrayList<String>();
             HBaseUtil.parseColumnMapping(hbaseColumnMapping, columnFamilies, null,
-                    columnQualifiers, null);
+                columnQualifiers, null);
             for (int i = 0; i < outputColumnMapping.size(); i++) {
                 int cfIndex = outputColumnMapping.get(i);
                 String cf = columnFamilies.get(cfIndex);
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseInputFormat.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseInputFormat.java
index 49d2cd3..df1bb45 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseInputFormat.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseInputFormat.java
@@ -66,8 +66,8 @@
      */
     @Override
     public RecordReader<ImmutableBytesWritable, Result> getRecordReader(
-            InputSplit split, JobConf job, Reporter reporter)
-            throws IOException {
+        InputSplit split, JobConf job, Reporter reporter)
+        throws IOException {
         String jobString = job.get(HCatConstants.HCAT_KEY_JOB_INFO);
         InputJobInfo inputJobInfo = (InputJobInfo) HCatUtil.deserialize(jobString);
 
@@ -103,20 +103,20 @@
      */
     @Override
     public org.apache.hadoop.mapred.InputSplit[] getSplits(JobConf job, int numSplits)
-            throws IOException {
+        throws IOException {
         inputFormat.setConf(job);
         return convertSplits(inputFormat.getSplits(HCatMapRedUtil.createJobContext(job, null,
-                Reporter.NULL)));
+            Reporter.NULL)));
     }
 
     private InputSplit[] convertSplits(List<org.apache.hadoop.mapreduce.InputSplit> splits) {
         InputSplit[] converted = new InputSplit[splits.size()];
         for (int i = 0; i < splits.size(); i++) {
             org.apache.hadoop.hbase.mapreduce.TableSplit tableSplit =
-                    (org.apache.hadoop.hbase.mapreduce.TableSplit) splits.get(i);
+                (org.apache.hadoop.hbase.mapreduce.TableSplit) splits.get(i);
             TableSplit newTableSplit = new TableSplit(tableSplit.getTableName(),
-                    tableSplit.getStartRow(),
-                    tableSplit.getEndRow(), tableSplit.getRegionLocation());
+                tableSplit.getStartRow(),
+                tableSplit.getEndRow(), tableSplit.getRegionLocation());
             converted[i] = newTableSplit;
         }
         return converted;
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseRevisionManagerUtil.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseRevisionManagerUtil.java
index b619d52..8d57d1b 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseRevisionManagerUtil.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseRevisionManagerUtil.java
@@ -65,7 +65,7 @@
      * @throws IOException Signals that an I/O exception has occurred.
      */
     static HCatTableSnapshot createSnapshot(Configuration jobConf,
-            String hbaseTableName, HCatTableInfo tableInfo ) throws IOException {
+                                            String hbaseTableName, HCatTableInfo tableInfo) throws IOException {
 
         RevisionManager rm = null;
         TableSnapshot snpt;
@@ -90,8 +90,8 @@
      * @throws IOException Signals that an I/O exception has occurred.
      */
     static HCatTableSnapshot createSnapshot(Configuration jobConf,
-            String tableName, long revision)
-            throws IOException {
+                                            String tableName, long revision)
+        throws IOException {
 
         TableSnapshot snpt;
         RevisionManager rm = null;
@@ -103,14 +103,14 @@
         }
 
         String inputJobString = jobConf.get(HCatConstants.HCAT_KEY_JOB_INFO);
-        if(inputJobString == null){
+        if (inputJobString == null) {
             throw new IOException(
-                    "InputJobInfo information not found in JobContext. "
-                            + "HCatInputFormat.setInput() not called?");
+                "InputJobInfo information not found in JobContext. "
+                    + "HCatInputFormat.setInput() not called?");
         }
         InputJobInfo inputInfo = (InputJobInfo) HCatUtil.deserialize(inputJobString);
         HCatTableSnapshot hcatSnapshot = HBaseRevisionManagerUtil
-                .convertSnapshot(snpt, inputInfo.getTableInfo());
+            .convertSnapshot(snpt, inputInfo.getTableInfo());
 
         return hcatSnapshot;
     }
@@ -123,7 +123,7 @@
      * @throws IOException
      */
     static RevisionManager getOpenedRevisionManager(Configuration jobConf) throws IOException {
-      return RevisionManagerFactory.getOpenedRevisionManager(jobConf);
+        return RevisionManagerFactory.getOpenedRevisionManager(jobConf);
     }
 
     static void closeRevisionManagerQuietly(RevisionManager rm) {
@@ -138,14 +138,14 @@
 
 
     static HCatTableSnapshot convertSnapshot(TableSnapshot hbaseSnapshot,
-            HCatTableInfo hcatTableInfo) throws IOException {
+                                             HCatTableInfo hcatTableInfo) throws IOException {
 
         HCatSchema hcatTableSchema = hcatTableInfo.getDataColumns();
         Map<String, String> hcatHbaseColMap = getHCatHBaseColumnMapping(hcatTableInfo);
         HashMap<String, Long> revisionMap = new HashMap<String, Long>();
 
         for (HCatFieldSchema fSchema : hcatTableSchema.getFields()) {
-            if(hcatHbaseColMap.containsKey(fSchema.getName())){
+            if (hcatHbaseColMap.containsKey(fSchema.getName())) {
                 String colFamily = hcatHbaseColMap.get(fSchema.getName());
                 long revisionID = hbaseSnapshot.getRevision(colFamily);
                 revisionMap.put(fSchema.getName(), revisionID);
@@ -153,12 +153,12 @@
         }
 
         HCatTableSnapshot hcatSnapshot = new HCatTableSnapshot(
-                 hcatTableInfo.getDatabaseName(), hcatTableInfo.getTableName(),revisionMap,hbaseSnapshot.getLatestRevision());
+            hcatTableInfo.getDatabaseName(), hcatTableInfo.getTableName(), revisionMap, hbaseSnapshot.getLatestRevision());
         return hcatSnapshot;
     }
 
     static TableSnapshot convertSnapshot(HCatTableSnapshot hcatSnapshot,
-            HCatTableInfo hcatTableInfo) throws IOException {
+                                         HCatTableInfo hcatTableInfo) throws IOException {
 
         HCatSchema hcatTableSchema = hcatTableInfo.getDataColumns();
         Map<String, Long> revisionMap = new HashMap<String, Long>();
@@ -172,8 +172,8 @@
         }
 
         String fullyQualifiedName = hcatSnapshot.getDatabaseName() + "."
-                + hcatSnapshot.getTableName();
-        return new TableSnapshot(fullyQualifiedName, revisionMap,hcatSnapshot.getLatestRevision());
+            + hcatSnapshot.getTableName();
+        return new TableSnapshot(fullyQualifiedName, revisionMap, hcatSnapshot.getLatestRevision());
 
     }
 
@@ -186,13 +186,13 @@
      * @throws IOException
      */
     static Transaction beginWriteTransaction(String qualifiedTableName,
-            HCatTableInfo tableInfo, Configuration jobConf) throws IOException {
+                                             HCatTableInfo tableInfo, Configuration jobConf) throws IOException {
         Transaction txn;
         RevisionManager rm = null;
         try {
             rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(jobConf);
             String hBaseColumns = tableInfo.getStorerInfo().getProperties()
-                    .getProperty(HBaseSerDe.HBASE_COLUMNS_MAPPING);
+                .getProperty(HBaseSerDe.HBASE_COLUMNS_MAPPING);
             String[] splits = hBaseColumns.split("[,:]");
             Set<String> families = new HashSet<String>();
             for (int i = 0; i < splits.length; i += 2) {
@@ -207,13 +207,13 @@
     }
 
     static Transaction getWriteTransaction(Configuration conf) throws IOException {
-        OutputJobInfo outputJobInfo = (OutputJobInfo)HCatUtil.deserialize(conf.get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+        OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(conf.get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
         return (Transaction) HCatUtil.deserialize(outputJobInfo.getProperties()
-                                                               .getProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY));
+            .getProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY));
     }
 
     static void setWriteTransaction(Configuration conf, Transaction txn) throws IOException {
-        OutputJobInfo outputJobInfo = (OutputJobInfo)HCatUtil.deserialize(conf.get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+        OutputJobInfo outputJobInfo = (OutputJobInfo) HCatUtil.deserialize(conf.get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
         outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY, HCatUtil.serialize(txn));
         conf.set(HCatConstants.HCAT_KEY_OUTPUT_INFO, HCatUtil.serialize(outputJobInfo));
     }
@@ -228,19 +228,19 @@
         return getWriteTransaction(conf).getRevisionNumber();
     }
 
-    private static Map<String, String> getHCatHBaseColumnMapping( HCatTableInfo hcatTableInfo)
-            throws IOException {
+    private static Map<String, String> getHCatHBaseColumnMapping(HCatTableInfo hcatTableInfo)
+        throws IOException {
 
         HCatSchema hcatTableSchema = hcatTableInfo.getDataColumns();
         StorerInfo storeInfo = hcatTableInfo.getStorerInfo();
         String hbaseColumnMapping = storeInfo.getProperties().getProperty(
-                HBaseSerDe.HBASE_COLUMNS_MAPPING);
+            HBaseSerDe.HBASE_COLUMNS_MAPPING);
 
         Map<String, String> hcatHbaseColMap = new HashMap<String, String>();
         List<String> columnFamilies = new ArrayList<String>();
         List<String> columnQualifiers = new ArrayList<String>();
         HBaseUtil.parseColumnMapping(hbaseColumnMapping, columnFamilies,
-                null, columnQualifiers, null);
+            null, columnQualifiers, null);
 
         for (HCatFieldSchema column : hcatTableSchema.getFields()) {
             int fieldPos = hcatTableSchema.getPosition(column.getName());
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseUtil.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseUtil.java
index 36395b7..07285aa 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseUtil.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HBaseUtil.java
@@ -28,7 +28,7 @@
 
 class HBaseUtil {
 
-    private HBaseUtil(){
+    private HBaseUtil() {
     }
 
     /**
@@ -47,97 +47,97 @@
     static int parseColumnMapping(
         String columnMapping,
         List<String> colFamilies,
-        List<byte []> colFamiliesBytes,
+        List<byte[]> colFamiliesBytes,
         List<String> colQualifiers,
-        List<byte []> colQualifiersBytes) throws IOException {
+        List<byte[]> colQualifiersBytes) throws IOException {
 
-      int rowKeyIndex = -1;
+        int rowKeyIndex = -1;
 
-      if (colFamilies == null || colQualifiers == null) {
-        throw new IllegalArgumentException("Error: caller must pass in lists for the column families " +
-            "and qualifiers.");
-      }
-
-      colFamilies.clear();
-      colQualifiers.clear();
-
-      if (columnMapping == null) {
-        throw new IllegalArgumentException("Error: hbase.columns.mapping missing for this HBase table.");
-      }
-
-      if (columnMapping.equals("") || columnMapping.equals(HBaseSerDe.HBASE_KEY_COL)) {
-        throw new IllegalArgumentException("Error: hbase.columns.mapping specifies only the HBase table"
-            + " row key. A valid Hive-HBase table must specify at least one additional column.");
-      }
-
-      String [] mapping = columnMapping.split(",");
-
-      for (int i = 0; i < mapping.length; i++) {
-        String elem = mapping[i];
-        int idxFirst = elem.indexOf(":");
-        int idxLast = elem.lastIndexOf(":");
-
-        if (idxFirst < 0 || !(idxFirst == idxLast)) {
-          throw new IllegalArgumentException("Error: the HBase columns mapping contains a badly formed " +
-              "column family, column qualifier specification.");
+        if (colFamilies == null || colQualifiers == null) {
+            throw new IllegalArgumentException("Error: caller must pass in lists for the column families " +
+                "and qualifiers.");
         }
 
-        if (elem.equals(HBaseSerDe.HBASE_KEY_COL)) {
-          rowKeyIndex = i;
-          colFamilies.add(elem);
-          colQualifiers.add(null);
-        } else {
-          String [] parts = elem.split(":");
-          assert(parts.length > 0 && parts.length <= 2);
-          colFamilies.add(parts[0]);
+        colFamilies.clear();
+        colQualifiers.clear();
 
-          if (parts.length == 2) {
-            colQualifiers.add(parts[1]);
-          } else {
-            colQualifiers.add(null);
-          }
+        if (columnMapping == null) {
+            throw new IllegalArgumentException("Error: hbase.columns.mapping missing for this HBase table.");
         }
-      }
 
-      if (rowKeyIndex == -1) {
-        colFamilies.add(0, HBaseSerDe.HBASE_KEY_COL);
-        colQualifiers.add(0, null);
-        rowKeyIndex = 0;
-      }
-
-      if (colFamilies.size() != colQualifiers.size()) {
-        throw new IOException("Error in parsing the hbase columns mapping.");
-      }
-
-      // populate the corresponding byte [] if the client has passed in a non-null list
-      if (colFamiliesBytes != null) {
-        colFamiliesBytes.clear();
-
-        for (String fam : colFamilies) {
-          colFamiliesBytes.add(Bytes.toBytes(fam));
+        if (columnMapping.equals("") || columnMapping.equals(HBaseSerDe.HBASE_KEY_COL)) {
+            throw new IllegalArgumentException("Error: hbase.columns.mapping specifies only the HBase table"
+                + " row key. A valid Hive-HBase table must specify at least one additional column.");
         }
-      }
 
-      if (colQualifiersBytes != null) {
-        colQualifiersBytes.clear();
+        String[] mapping = columnMapping.split(",");
 
-        for (String qual : colQualifiers) {
-          if (qual == null) {
-            colQualifiersBytes.add(null);
-          } else {
-            colQualifiersBytes.add(Bytes.toBytes(qual));
-          }
+        for (int i = 0; i < mapping.length; i++) {
+            String elem = mapping[i];
+            int idxFirst = elem.indexOf(":");
+            int idxLast = elem.lastIndexOf(":");
+
+            if (idxFirst < 0 || !(idxFirst == idxLast)) {
+                throw new IllegalArgumentException("Error: the HBase columns mapping contains a badly formed " +
+                    "column family, column qualifier specification.");
+            }
+
+            if (elem.equals(HBaseSerDe.HBASE_KEY_COL)) {
+                rowKeyIndex = i;
+                colFamilies.add(elem);
+                colQualifiers.add(null);
+            } else {
+                String[] parts = elem.split(":");
+                assert (parts.length > 0 && parts.length <= 2);
+                colFamilies.add(parts[0]);
+
+                if (parts.length == 2) {
+                    colQualifiers.add(parts[1]);
+                } else {
+                    colQualifiers.add(null);
+                }
+            }
         }
-      }
 
-      if (colFamiliesBytes != null && colQualifiersBytes != null) {
-        if (colFamiliesBytes.size() != colQualifiersBytes.size()) {
-          throw new IOException("Error in caching the bytes for the hbase column families " +
-              "and qualifiers.");
+        if (rowKeyIndex == -1) {
+            colFamilies.add(0, HBaseSerDe.HBASE_KEY_COL);
+            colQualifiers.add(0, null);
+            rowKeyIndex = 0;
         }
-      }
 
-      return rowKeyIndex;
+        if (colFamilies.size() != colQualifiers.size()) {
+            throw new IOException("Error in parsing the hbase columns mapping.");
+        }
+
+        // populate the corresponding byte [] if the client has passed in a non-null list
+        if (colFamiliesBytes != null) {
+            colFamiliesBytes.clear();
+
+            for (String fam : colFamilies) {
+                colFamiliesBytes.add(Bytes.toBytes(fam));
+            }
+        }
+
+        if (colQualifiersBytes != null) {
+            colQualifiersBytes.clear();
+
+            for (String qual : colQualifiers) {
+                if (qual == null) {
+                    colQualifiersBytes.add(null);
+                } else {
+                    colQualifiersBytes.add(Bytes.toBytes(qual));
+                }
+            }
+        }
+
+        if (colFamiliesBytes != null && colQualifiersBytes != null) {
+            if (colFamiliesBytes.size() != colQualifiersBytes.size()) {
+                throw new IOException("Error in caching the bytes for the hbase column families " +
+                    "and qualifiers.");
+            }
+        }
+
+        return rowKeyIndex;
     }
 
     /**
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HCatTableSnapshot.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HCatTableSnapshot.java
index 23daf18..42770e1 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HCatTableSnapshot.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HCatTableSnapshot.java
@@ -27,7 +27,7 @@
  * record readers to obtain knowledge about the revisions of a
  * column to be filtered.
  */
-public class HCatTableSnapshot implements Serializable{
+public class HCatTableSnapshot implements Serializable {
 
     private static final long serialVersionUID = 1L;
     private String tableName;
@@ -52,15 +52,15 @@
     /**
      * @return The name of the database to which the table snapshot belongs.
      */
-    public String getDatabaseName(){
+    public String getDatabaseName() {
         return this.databaseName;
     }
 
     /**
      * @return The revision number of a column in a snapshot.
      */
-    long getRevision(String column){
-        if(columnMap.containsKey(column))
+    long getRevision(String column) {
+        if (columnMap.containsKey(column))
             return this.columnMap.get(column);
         return latestRevision;
     }
@@ -71,7 +71,7 @@
      * @param column The data column of the table
      * @return true, if successful
      */
-    boolean containsColumn(String column){
+    boolean containsColumn(String column) {
         return this.columnMap.containsKey(column);
     }
 
@@ -84,8 +84,8 @@
 
     @Override
     public String toString() {
-        String snapshot = " Database Name: " + this.databaseName +" Table Name : " + tableName +
-                 "Latest Revision: "+latestRevision+" Column revision : " + columnMap.toString();
+        String snapshot = " Database Name: " + this.databaseName + " Table Name : " + tableName +
+            "Latest Revision: " + latestRevision + " Column revision : " + columnMap.toString();
         return snapshot;
     }
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HbaseSnapshotRecordReader.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HbaseSnapshotRecordReader.java
index 2288795..cb813d1 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HbaseSnapshotRecordReader.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/HbaseSnapshotRecordReader.java
@@ -56,8 +56,8 @@
     private final Configuration conf;
     private final int maxRevisions = 1;
     private ResultScanner scanner;
-    private Scan  scan;
-    private HTable  htable;
+    private Scan scan;
+    private HTable htable;
     private TableSnapshot snapshot;
     private Iterator<Result> resultItr;
     private Set<Long> allAbortedTransactions;
@@ -69,9 +69,9 @@
         this.conf = conf;
         String snapshotString = conf.get(HBaseConstants.PROPERTY_TABLE_SNAPSHOT_KEY);
         HCatTableSnapshot hcatSnapshot = (HCatTableSnapshot) HCatUtil
-                .deserialize(snapshotString);
+            .deserialize(snapshotString);
         this.snapshot = HBaseRevisionManagerUtil.convertSnapshot(hcatSnapshot,
-                inpJobInfo.getTableInfo());
+            inpJobInfo.getTableInfo());
     }
 
     public void init() throws IOException {
@@ -104,7 +104,7 @@
             for (byte[] familyKey : families) {
                 String family = Bytes.toString(familyKey);
                 List<FamilyRevision> abortedWriteTransactions = rm.getAbortedWriteTransactions(
-                        tableName, family);
+                    tableName, family);
                 if (abortedWriteTransactions != null) {
                     for (FamilyRevision revision : abortedWriteTransactions) {
                         abortedTransactions.add(revision.getRevision());
@@ -172,7 +172,7 @@
     public boolean next(ImmutableBytesWritable key, Result value) throws IOException {
         if (this.resultItr == null) {
             LOG.warn("The HBase result iterator is found null. It is possible"
-                    + " that the record reader has already been closed.");
+                + " that the record reader has already been closed.");
         } else {
             while (resultItr.hasNext()) {
                 Result temp = resultItr.next();
@@ -233,7 +233,7 @@
             }
         }
 
-        if(finalKeyVals.size() == 0){
+        if (finalKeyVals.size() == 0) {
             return null;
         } else {
             KeyValue[] kvArray = new KeyValue[finalKeyVals.size()];
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/ImportSequenceFile.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/ImportSequenceFile.java
index 9c415b2..205cae4 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/ImportSequenceFile.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/ImportSequenceFile.java
@@ -64,12 +64,12 @@
     private final static String IMPORTER_WORK_DIR = "_IMPORTER_MR_WORK_DIR";
 
 
-    private static class SequenceFileImporter  extends Mapper<ImmutableBytesWritable, Put, ImmutableBytesWritable, Put> {
+    private static class SequenceFileImporter extends Mapper<ImmutableBytesWritable, Put, ImmutableBytesWritable, Put> {
 
         @Override
         public void map(ImmutableBytesWritable rowKey, Put value,
                         Context context)
-                throws IOException {
+            throws IOException {
             try {
                 context.write(new ImmutableBytesWritable(value.getRow()), value);
             } catch (InterruptedException e) {
@@ -112,7 +112,7 @@
                 @Override
                 public void abortJob(JobContext jobContext, JobStatus.State state) throws IOException {
                     try {
-                        baseOutputCommitter.abortJob(jobContext,state);
+                        baseOutputCommitter.abortJob(jobContext, state);
                     } finally {
                         cleanupScratch(jobContext);
                     }
@@ -124,13 +124,13 @@
                         baseOutputCommitter.commitJob(jobContext);
                         Configuration conf = jobContext.getConfiguration();
                         try {
-                        //import hfiles
-                        new LoadIncrementalHFiles(conf)
+                            //import hfiles
+                            new LoadIncrementalHFiles(conf)
                                 .doBulkLoad(HFileOutputFormat.getOutputPath(jobContext),
-                                                   new HTable(conf,
-                                                                      conf.get(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY)));
+                                    new HTable(conf,
+                                        conf.get(HBaseConstants.PROPERTY_OUTPUT_TABLE_NAME_KEY)));
                         } catch (Exception e) {
-                        	throw new IOException("BulkLoad failed.", e);
+                            throw new IOException("BulkLoad failed.", e);
                         }
                     } finally {
                         cleanupScratch(jobContext);
@@ -146,16 +146,16 @@
                     }
                 }
 
-                private void cleanupScratch(JobContext context) throws IOException{
+                private void cleanupScratch(JobContext context) throws IOException {
                     FileSystem fs = FileSystem.get(context.getConfiguration());
-                    fs.delete(HFileOutputFormat.getOutputPath(context),true);
+                    fs.delete(HFileOutputFormat.getOutputPath(context), true);
                 }
             };
         }
     }
 
     private static Job createSubmittableJob(Configuration conf, String tableName, Path inputDir, Path scratchDir, boolean localMode)
-            throws IOException {
+        throws IOException {
         Job job = new Job(conf, NAME + "_" + tableName);
         job.setJarByClass(SequenceFileImporter.class);
         FileInputFormat.setInputPaths(job, inputDir);
@@ -172,16 +172,16 @@
         job.setOutputFormatClass(ImporterOutputFormat.class);
 
         //local mode doesn't support symbolic links so we have to manually set the actual path
-        if(localMode) {
+        if (localMode) {
             String partitionFile = null;
-            for(URI uri: DistributedCache.getCacheFiles(job.getConfiguration())) {
-                if(DEFAULT_PATH.equals(uri.getFragment())) {
+            for (URI uri : DistributedCache.getCacheFiles(job.getConfiguration())) {
+                if (DEFAULT_PATH.equals(uri.getFragment())) {
                     partitionFile = uri.toString();
                     break;
                 }
             }
-            partitionFile = partitionFile.substring(0,partitionFile.lastIndexOf("#"));
-            job.getConfiguration().set(TotalOrderPartitioner.PARTITIONER_PATH,partitionFile.toString());
+            partitionFile = partitionFile.substring(0, partitionFile.lastIndexOf("#"));
+            job.getConfiguration().set(TotalOrderPartitioner.PARTITIONER_PATH, partitionFile.toString());
         }
 
         return job;
@@ -190,7 +190,7 @@
     /**
      * Method to run the Importer MapReduce Job. Normally will be called by another MR job
      * during OutputCommitter.commitJob().
-      * @param parentContext JobContext of the parent job
+     * @param parentContext JobContext of the parent job
      * @param tableName name of table to bulk load data into
      * @param InputDir path of SequenceFile formatted data to read
      * @param scratchDir temporary path for the Importer MR job to build the HFiles which will be imported
@@ -199,21 +199,21 @@
     static boolean runJob(JobContext parentContext, String tableName, Path InputDir, Path scratchDir) {
         Configuration parentConf = parentContext.getConfiguration();
         Configuration conf = new Configuration();
-        for(Map.Entry<String,String> el: parentConf) {
-            if(el.getKey().startsWith("hbase."))
-                conf.set(el.getKey(),el.getValue());
-            if(el.getKey().startsWith("mapred.cache.archives"))
-                conf.set(el.getKey(),el.getValue());
+        for (Map.Entry<String, String> el : parentConf) {
+            if (el.getKey().startsWith("hbase."))
+                conf.set(el.getKey(), el.getValue());
+            if (el.getKey().startsWith("mapred.cache.archives"))
+                conf.set(el.getKey(), el.getValue());
         }
 
         //Inherit jar dependencies added to distributed cache loaded by parent job
-        conf.set("mapred.job.classpath.archives",parentConf.get("mapred.job.classpath.archives", ""));
-        conf.set("mapreduce.job.cache.archives.visibilities",parentConf.get("mapreduce.job.cache.archives.visibilities",""));
+        conf.set("mapred.job.classpath.archives", parentConf.get("mapred.job.classpath.archives", ""));
+        conf.set("mapreduce.job.cache.archives.visibilities", parentConf.get("mapreduce.job.cache.archives.visibilities", ""));
 
         //Temporary fix until hbase security is ready
         //We need the written HFile to be world readable so
         //hbase regionserver user has the privileges to perform a hdfs move
-        if(parentConf.getBoolean("hadoop.security.authorization", false)) {
+        if (parentConf.getBoolean("hadoop.security.authorization", false)) {
             FsPermission.setUMask(conf, FsPermission.valueOf("----------"));
         }
 
@@ -225,25 +225,24 @@
         boolean success = false;
         try {
             FileSystem fs = FileSystem.get(parentConf);
-            Path workDir = new Path(new Job(parentConf).getWorkingDirectory(),IMPORTER_WORK_DIR);
-            if(!fs.mkdirs(workDir))
-                throw new IOException("Importer work directory already exists: "+workDir);
+            Path workDir = new Path(new Job(parentConf).getWorkingDirectory(), IMPORTER_WORK_DIR);
+            if (!fs.mkdirs(workDir))
+                throw new IOException("Importer work directory already exists: " + workDir);
             Job job = createSubmittableJob(conf, tableName, InputDir, scratchDir, localMode);
             job.setWorkingDirectory(workDir);
             job.getCredentials().addAll(parentContext.getCredentials());
             success = job.waitForCompletion(true);
             fs.delete(workDir, true);
             //We only cleanup on success because failure might've been caused by existence of target directory
-            if(localMode && success)
-            {
-                new ImporterOutputFormat().getOutputCommitter(org.apache.hadoop.mapred.HCatMapRedUtil.createTaskAttemptContext(conf,new TaskAttemptID())).commitJob(job);
+            if (localMode && success) {
+                new ImporterOutputFormat().getOutputCommitter(org.apache.hadoop.mapred.HCatMapRedUtil.createTaskAttemptContext(conf, new TaskAttemptID())).commitJob(job);
             }
         } catch (InterruptedException e) {
             LOG.error("ImportSequenceFile Failed", e);
         } catch (ClassNotFoundException e) {
-            LOG.error("ImportSequenceFile Failed",e);
+            LOG.error("ImportSequenceFile Failed", e);
         } catch (IOException e) {
-            LOG.error("ImportSequenceFile Failed",e);
+            LOG.error("ImportSequenceFile Failed", e);
         }
         return success;
     }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/IDGenerator.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/IDGenerator.java
index ba6dd6b..29de3e7 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/IDGenerator.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/IDGenerator.java
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 package org.apache.hcatalog.hbase.snapshot;
+
 import java.io.IOException;
 import java.nio.charset.Charset;
 
@@ -32,7 +33,7 @@
 /**
  * This class generates revision id's for transactions.
  */
-class IDGenerator implements LockListener{
+class IDGenerator implements LockListener {
 
     private ZooKeeper zookeeper;
     private String zNodeDataLoc;
@@ -41,7 +42,7 @@
     private static final Logger LOG = LoggerFactory.getLogger(IDGenerator.class);
 
     IDGenerator(ZooKeeper zookeeper, String tableName, String idGenNode)
-            throws IOException {
+        throws IOException {
         this.zookeeper = zookeeper;
         this.zNodeDataLoc = idGenNode;
         this.zNodeLockBasePath = PathUtil.getLockManagementNode(idGenNode);
@@ -53,7 +54,7 @@
      * @return revision ID
      * @throws IOException
      */
-    public long obtainID() throws IOException{
+    public long obtainID() throws IOException {
         WriteLock wLock = new WriteLock(zookeeper, zNodeLockBasePath, Ids.OPEN_ACL_UNSAFE);
         wLock.setLockListener(this);
         try {
@@ -62,7 +63,7 @@
                 //TO DO : Let this request queue up and try obtaining lock.
                 throw new IOException("Unable to obtain lock to obtain id.");
             } else {
-                    id = incrementAndReadCounter();
+                id = incrementAndReadCounter();
             }
         } catch (KeeperException e) {
             LOG.warn("Exception while obtaining lock for ID.", e);
@@ -82,34 +83,34 @@
      * @return revision ID
      * @throws IOException
      */
-    public long readID() throws IOException{
+    public long readID() throws IOException {
         long curId;
         try {
             Stat stat = new Stat();
             byte[] data = zookeeper.getData(this.zNodeDataLoc, false, stat);
-            curId = Long.parseLong(new String(data,Charset.forName("UTF-8")));
+            curId = Long.parseLong(new String(data, Charset.forName("UTF-8")));
         } catch (KeeperException e) {
             LOG.warn("Exception while reading current revision id.", e);
             throw new IOException("Exception while reading current revision id.", e);
         } catch (InterruptedException e) {
             LOG.warn("Exception while reading current revision id.", e);
-            throw new IOException("Exception while reading current revision id.",e);
+            throw new IOException("Exception while reading current revision id.", e);
         }
 
         return curId;
     }
 
 
-    private long incrementAndReadCounter() throws IOException{
+    private long incrementAndReadCounter() throws IOException {
 
         long curId, usedId;
         try {
             Stat stat = new Stat();
             byte[] data = zookeeper.getData(this.zNodeDataLoc, false, stat);
-            usedId = Long.parseLong((new String(data,Charset.forName("UTF-8"))));
-            curId = usedId +1;
+            usedId = Long.parseLong((new String(data, Charset.forName("UTF-8"))));
+            curId = usedId + 1;
             String lastUsedID = String.valueOf(curId);
-            zookeeper.setData(this.zNodeDataLoc, lastUsedID.getBytes(Charset.forName("UTF-8")), -1 );
+            zookeeper.setData(this.zNodeDataLoc, lastUsedID.getBytes(Charset.forName("UTF-8")), -1);
 
         } catch (KeeperException e) {
             LOG.warn("Exception while incrementing revision id.", e);
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/PathUtil.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/PathUtil.java
index 66f79a7..c2a9a4b 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/PathUtil.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/PathUtil.java
@@ -33,10 +33,10 @@
  * baseDir/TrasactionBasePath/TableB/columnFamily-1/abortedTxns
 
  */
-public class PathUtil{
+public class PathUtil {
 
-    static final String      DATA_DIR = "/data";
-    static final String      CLOCK_NODE   = "/clock";
+    static final String DATA_DIR = "/data";
+    static final String CLOCK_NODE = "/clock";
 
     /**
      * This method returns the data path associated with the currently
@@ -47,10 +47,10 @@
      * @return The path of the running transactions data.
      */
     static String getRunningTxnInfoPath(String baseDir, String tableName,
-            String columnFamily) {
+                                        String columnFamily) {
         String txnBasePath = getTransactionBasePath(baseDir);
         String path = txnBasePath + "/" + tableName + "/" + columnFamily
-                + "/runningTxns";
+            + "/runningTxns";
         return path;
     }
 
@@ -63,10 +63,10 @@
      * @return The path of the aborted transactions data.
      */
     static String getAbortInformationPath(String baseDir, String tableName,
-            String columnFamily) {
+                                          String columnFamily) {
         String txnBasePath = getTransactionBasePath(baseDir);
         String path = txnBasePath + "/" + tableName + "/" + columnFamily
-                + "/abortData";
+            + "/abortData";
         return path;
     }
 
@@ -83,13 +83,13 @@
         return revisionIDNode;
     }
 
-   /**
-    * Gets the lock management node for any znode that needs to be locked.
-    *
-    * @param path the path of the znode.
-    * @return the lock management node path.
-    */
-   static String getLockManagementNode(String path) {
+    /**
+     * Gets the lock management node for any znode that needs to be locked.
+     *
+     * @param path the path of the znode.
+     * @return the lock management node path.
+     */
+    static String getLockManagementNode(String path) {
         String lockNode = path + "_locknode_";
         return lockNode;
     }
@@ -112,7 +112,7 @@
      * @param tableName the table name
      * @return the txn data path for the table.
      */
-    static String getTxnDataPath(String baseDir, String tableName){
+    static String getTxnDataPath(String baseDir, String tableName) {
         String txnBasePath = getTransactionBasePath(baseDir);
         String path = txnBasePath + "/" + tableName;
         return path;
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RMConstants.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RMConstants.java
index 303ded4..5981761 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RMConstants.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RMConstants.java
@@ -19,11 +19,11 @@
 package org.apache.hcatalog.hbase.snapshot;
 
 public class RMConstants {
-  public static final String REVISION_MGR_ENDPOINT_IMPL_CLASS = "revision.manager.endpoint.impl.class";
+    public static final String REVISION_MGR_ENDPOINT_IMPL_CLASS = "revision.manager.endpoint.impl.class";
 
-  public static final String WRITE_TRANSACTION_TIMEOUT = "revision.manager.writeTxn.timeout";
+    public static final String WRITE_TRANSACTION_TIMEOUT = "revision.manager.writeTxn.timeout";
 
-  public static final String ZOOKEEPER_HOSTLIST = "revision.manager.zk.hostList";
+    public static final String ZOOKEEPER_HOSTLIST = "revision.manager.zk.hostList";
 
-  public static final String ZOOKEEPER_DATADIR = "revision.manager.zk.dataDir";
+    public static final String ZOOKEEPER_DATADIR = "revision.manager.zk.dataDir";
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java
index c57c62a..511926c 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManager.java
@@ -73,7 +73,7 @@
      * @throws IOException
      */
     public Transaction beginWriteTransaction(String table, List<String> families)
-            throws IOException;
+        throws IOException;
 
     /**
      * Start the write transaction.
@@ -85,7 +85,7 @@
      * @throws IOException
      */
     public Transaction beginWriteTransaction(String table,
-            List<String> families, long keepAlive) throws IOException;
+                                             List<String> families, long keepAlive) throws IOException;
 
     /**
      * Commit the write transaction.
@@ -94,7 +94,7 @@
      * @throws IOException
      */
     public void commitWriteTransaction(Transaction transaction)
-            throws IOException;
+        throws IOException;
 
     /**
      * Abort the write transaction.
@@ -103,7 +103,7 @@
      * @throws IOException
      */
     public void abortWriteTransaction(Transaction transaction)
-            throws IOException;
+        throws IOException;
 
     /**
      * Get the list of aborted Transactions for a column family
@@ -114,7 +114,7 @@
      * @throws java.io.IOException
      */
     public List<FamilyRevision> getAbortedWriteTransactions(String table,
-        String columnFamily) throws IOException;
+                                                            String columnFamily) throws IOException;
 
     /**
      * Create the latest snapshot of the table.
@@ -134,7 +134,7 @@
      * @throws IOException
      */
     public TableSnapshot createSnapshot(String tableName, long revision)
-            throws IOException;
+        throws IOException;
 
     /**
      * Extends the expiration of a transaction by the time indicated by keep alive.
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerConfiguration.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerConfiguration.java
index f181666..1d442fc 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerConfiguration.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerConfiguration.java
@@ -24,36 +24,35 @@
 public class RevisionManagerConfiguration {
 
 
+    public static Configuration addResources(Configuration conf) {
+        conf.addDefaultResource("revision-manager-default.xml");
+        conf.addResource("revision-manager-site.xml");
+        return conf;
+    }
 
-  public static Configuration addResources(Configuration conf) {
-    conf.addDefaultResource("revision-manager-default.xml");
-    conf.addResource("revision-manager-site.xml");
-    return conf;
-  }
+    /**
+     * Creates a Configuration with Revision Manager resources
+     * @return a Configuration with Revision Manager resources
+     */
+    public static Configuration create() {
+        Configuration conf = new Configuration();
+        return addResources(conf);
+    }
 
-  /**
-   * Creates a Configuration with Revision Manager resources
-   * @return a Configuration with Revision Manager resources
-   */
-  public static Configuration create() {
-    Configuration conf = new Configuration();
-    return addResources(conf);
-  }
-
-  /**
-   * Creates a clone of passed configuration.
-   * @param that Configuration to clone.
-   * @return a Configuration created with the revision-manager-*.xml files plus
-   * the given configuration.
-   */
-  public static Configuration create(final Configuration that) {
-    Configuration conf = create();
-    //we need to merge things instead of doing new Configuration(that)
-    //because of a bug in Configuration wherein the config
-    //set on the MR fronted will get loaded on the backend as resouce called job.xml
-    //hence adding resources on the backed could potentially overwrite properties
-    //set on the frontend which we shouldn't be doing here
-    HBaseConfiguration.merge(conf, that);
-    return conf;
-  }
+    /**
+     * Creates a clone of passed configuration.
+     * @param that Configuration to clone.
+     * @return a Configuration created with the revision-manager-*.xml files plus
+     * the given configuration.
+     */
+    public static Configuration create(final Configuration that) {
+        Configuration conf = create();
+        //we need to merge things instead of doing new Configuration(that)
+        //because of a bug in Configuration wherein the config
+        //set on the MR fronted will get loaded on the backend as resouce called job.xml
+        //hence adding resources on the backed could potentially overwrite properties
+        //set on the frontend which we shouldn't be doing here
+        HBaseConfiguration.merge(conf, that);
+        return conf;
+    }
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpoint.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpoint.java
index 8f56b21..5187288 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpoint.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpoint.java
@@ -35,106 +35,106 @@
  */
 public class RevisionManagerEndpoint extends BaseEndpointCoprocessor implements RevisionManagerProtocol {
 
-  private static final Logger LOGGER =
-		      LoggerFactory.getLogger(RevisionManagerEndpoint.class.getName());
-  
-  private RevisionManager rmImpl = null;
+    private static final Logger LOGGER =
+        LoggerFactory.getLogger(RevisionManagerEndpoint.class.getName());
 
-  @Override
-  public void start(CoprocessorEnvironment env) {
-    super.start(env);
-    try {
-      Configuration conf = RevisionManagerConfiguration.create(env.getConfiguration());
-      String className = conf.get(RMConstants.REVISION_MGR_ENDPOINT_IMPL_CLASS,
-          ZKBasedRevisionManager.class.getName());
-      LOGGER.debug("Using Revision Manager implementation: {}",className);
-      rmImpl = RevisionManagerFactory.getOpenedRevisionManager(className, conf);
-    } catch (IOException e) {
-      LOGGER.error("Failed to initialize revision manager", e);
+    private RevisionManager rmImpl = null;
+
+    @Override
+    public void start(CoprocessorEnvironment env) {
+        super.start(env);
+        try {
+            Configuration conf = RevisionManagerConfiguration.create(env.getConfiguration());
+            String className = conf.get(RMConstants.REVISION_MGR_ENDPOINT_IMPL_CLASS,
+                ZKBasedRevisionManager.class.getName());
+            LOGGER.debug("Using Revision Manager implementation: {}", className);
+            rmImpl = RevisionManagerFactory.getOpenedRevisionManager(className, conf);
+        } catch (IOException e) {
+            LOGGER.error("Failed to initialize revision manager", e);
+        }
     }
-  }
 
-  @Override
-  public void stop(CoprocessorEnvironment env) {
-    if (rmImpl != null) {
-      try {
-        rmImpl.close();
-      } catch (IOException e) {
-        LOGGER.warn("Error closing revision manager.", e);
-      }
+    @Override
+    public void stop(CoprocessorEnvironment env) {
+        if (rmImpl != null) {
+            try {
+                rmImpl.close();
+            } catch (IOException e) {
+                LOGGER.warn("Error closing revision manager.", e);
+            }
+        }
+        super.stop(env);
     }
-    super.stop(env);
-  }
 
-  @Override
-  public void initialize(Configuration conf) {
-    // do nothing, HBase controls life cycle
-  }
+    @Override
+    public void initialize(Configuration conf) {
+        // do nothing, HBase controls life cycle
+    }
 
-  @Override
-  public void open() throws IOException {
-    // do nothing, HBase controls life cycle
-  }
+    @Override
+    public void open() throws IOException {
+        // do nothing, HBase controls life cycle
+    }
 
-  @Override
-  public void close() throws IOException {
-    // do nothing, HBase controls life cycle
-  }
+    @Override
+    public void close() throws IOException {
+        // do nothing, HBase controls life cycle
+    }
 
-  @Override
-  public void createTable(String table, List<String> columnFamilies) throws IOException {
-    rmImpl.createTable(table, columnFamilies);
-  }
+    @Override
+    public void createTable(String table, List<String> columnFamilies) throws IOException {
+        rmImpl.createTable(table, columnFamilies);
+    }
 
-  @Override
-  public void dropTable(String table) throws IOException {
-    rmImpl.dropTable(table);
-  }
+    @Override
+    public void dropTable(String table) throws IOException {
+        rmImpl.dropTable(table);
+    }
 
-  @Override
-  public Transaction beginWriteTransaction(String table, List<String> families)
-      throws IOException {
-    return rmImpl.beginWriteTransaction(table, families);
-  }
+    @Override
+    public Transaction beginWriteTransaction(String table, List<String> families)
+        throws IOException {
+        return rmImpl.beginWriteTransaction(table, families);
+    }
 
-  @Override
-  public Transaction beginWriteTransaction(String table,
-      List<String> families, long keepAlive) throws IOException {
-    return rmImpl.beginWriteTransaction(table, families, keepAlive);
-  }
+    @Override
+    public Transaction beginWriteTransaction(String table,
+                                             List<String> families, long keepAlive) throws IOException {
+        return rmImpl.beginWriteTransaction(table, families, keepAlive);
+    }
 
-  @Override
-  public void commitWriteTransaction(Transaction transaction)
-      throws IOException {
-    rmImpl.commitWriteTransaction(transaction);
-  }
+    @Override
+    public void commitWriteTransaction(Transaction transaction)
+        throws IOException {
+        rmImpl.commitWriteTransaction(transaction);
+    }
 
-  @Override
-  public void abortWriteTransaction(Transaction transaction)
-      throws IOException {
-    rmImpl.abortWriteTransaction(transaction);
-  }
+    @Override
+    public void abortWriteTransaction(Transaction transaction)
+        throws IOException {
+        rmImpl.abortWriteTransaction(transaction);
+    }
 
-  @Override
-  public TableSnapshot createSnapshot(String tableName) throws IOException {
-    return rmImpl.createSnapshot(tableName);
-  }
+    @Override
+    public TableSnapshot createSnapshot(String tableName) throws IOException {
+        return rmImpl.createSnapshot(tableName);
+    }
 
-  @Override
-  public TableSnapshot createSnapshot(String tableName, long revision)
-      throws IOException {
-    return rmImpl.createSnapshot(tableName, revision);
-  }
+    @Override
+    public TableSnapshot createSnapshot(String tableName, long revision)
+        throws IOException {
+        return rmImpl.createSnapshot(tableName, revision);
+    }
 
-  @Override
-  public void keepAlive(Transaction transaction) throws IOException {
-    rmImpl.keepAlive(transaction);
-  }
+    @Override
+    public void keepAlive(Transaction transaction) throws IOException {
+        rmImpl.keepAlive(transaction);
+    }
 
-  @Override
-  public List<FamilyRevision> getAbortedWriteTransactions(String table,
-      String columnFamily) throws IOException {
-    return rmImpl.getAbortedWriteTransactions(table, columnFamily);
-  }
+    @Override
+    public List<FamilyRevision> getAbortedWriteTransactions(String table,
+                                                            String columnFamily) throws IOException {
+        return rmImpl.getAbortedWriteTransactions(table, columnFamily);
+    }
 
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpointClient.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpointClient.java
index b2c026e..ee26242 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpointClient.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerEndpointClient.java
@@ -33,92 +33,92 @@
  */
 public class RevisionManagerEndpointClient implements RevisionManager, Configurable {
 
-  private Configuration conf = null;
-  private RevisionManager rmProxy;
+    private Configuration conf = null;
+    private RevisionManager rmProxy;
 
-  @Override
-  public Configuration getConf() {
-    return this.conf;
-  }
+    @Override
+    public Configuration getConf() {
+        return this.conf;
+    }
 
-  @Override
-  public void setConf(Configuration arg0) {
-    this.conf = arg0;
-  }
+    @Override
+    public void setConf(Configuration arg0) {
+        this.conf = arg0;
+    }
 
-  @Override
-  public void initialize(Configuration conf) {
-    // do nothing
-  }
+    @Override
+    public void initialize(Configuration conf) {
+        // do nothing
+    }
 
-  @Override
-  public void open() throws IOException {
-    // clone to adjust RPC settings unique to proxy
-    Configuration clonedConf = new Configuration(conf);
-    // conf.set("hbase.ipc.client.connect.max.retries", "0");
-    // conf.setInt(HConstants.HBASE_CLIENT_RPC_MAXATTEMPTS, 1);
-    clonedConf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1); // do not retry RPC
-    HTable table = new HTable(clonedConf, HConstants.ROOT_TABLE_NAME);
-    rmProxy = table.coprocessorProxy(RevisionManagerProtocol.class,
-        Bytes.toBytes("anyRow"));
-    rmProxy.open();
-  }
+    @Override
+    public void open() throws IOException {
+        // clone to adjust RPC settings unique to proxy
+        Configuration clonedConf = new Configuration(conf);
+        // conf.set("hbase.ipc.client.connect.max.retries", "0");
+        // conf.setInt(HConstants.HBASE_CLIENT_RPC_MAXATTEMPTS, 1);
+        clonedConf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1); // do not retry RPC
+        HTable table = new HTable(clonedConf, HConstants.ROOT_TABLE_NAME);
+        rmProxy = table.coprocessorProxy(RevisionManagerProtocol.class,
+            Bytes.toBytes("anyRow"));
+        rmProxy.open();
+    }
 
-  @Override
-  public void close() throws IOException {
-    rmProxy.close();
-  }
+    @Override
+    public void close() throws IOException {
+        rmProxy.close();
+    }
 
-  @Override
-  public void createTable(String table, List<String> columnFamilies) throws IOException {
-    rmProxy.createTable(table, columnFamilies);
-  }
+    @Override
+    public void createTable(String table, List<String> columnFamilies) throws IOException {
+        rmProxy.createTable(table, columnFamilies);
+    }
 
-  @Override
-  public void dropTable(String table) throws IOException {
-    rmProxy.dropTable(table);
-  }
+    @Override
+    public void dropTable(String table) throws IOException {
+        rmProxy.dropTable(table);
+    }
 
-  @Override
-  public Transaction beginWriteTransaction(String table, List<String> families) throws IOException {
-    return rmProxy.beginWriteTransaction(table, families);
-  }
+    @Override
+    public Transaction beginWriteTransaction(String table, List<String> families) throws IOException {
+        return rmProxy.beginWriteTransaction(table, families);
+    }
 
-  @Override
-  public Transaction beginWriteTransaction(String table, List<String> families, long keepAlive)
-      throws IOException {
-    return rmProxy.beginWriteTransaction(table, families, keepAlive);
-  }
+    @Override
+    public Transaction beginWriteTransaction(String table, List<String> families, long keepAlive)
+        throws IOException {
+        return rmProxy.beginWriteTransaction(table, families, keepAlive);
+    }
 
-  @Override
-  public void commitWriteTransaction(Transaction transaction) throws IOException {
-    rmProxy.commitWriteTransaction(transaction);
-  }
+    @Override
+    public void commitWriteTransaction(Transaction transaction) throws IOException {
+        rmProxy.commitWriteTransaction(transaction);
+    }
 
-  @Override
-  public void abortWriteTransaction(Transaction transaction) throws IOException {
-    rmProxy.abortWriteTransaction(transaction);
-  }
+    @Override
+    public void abortWriteTransaction(Transaction transaction) throws IOException {
+        rmProxy.abortWriteTransaction(transaction);
+    }
 
-  @Override
-  public List<FamilyRevision> getAbortedWriteTransactions(String table, String columnFamily)
-      throws IOException {
-    return rmProxy.getAbortedWriteTransactions(table, columnFamily);
-  }
+    @Override
+    public List<FamilyRevision> getAbortedWriteTransactions(String table, String columnFamily)
+        throws IOException {
+        return rmProxy.getAbortedWriteTransactions(table, columnFamily);
+    }
 
-  @Override
-  public TableSnapshot createSnapshot(String tableName) throws IOException {
-    return rmProxy.createSnapshot(tableName);
-  }
+    @Override
+    public TableSnapshot createSnapshot(String tableName) throws IOException {
+        return rmProxy.createSnapshot(tableName);
+    }
 
-  @Override
-  public TableSnapshot createSnapshot(String tableName, long revision) throws IOException {
-    return rmProxy.createSnapshot(tableName, revision);
-  }
+    @Override
+    public TableSnapshot createSnapshot(String tableName, long revision) throws IOException {
+        return rmProxy.createSnapshot(tableName, revision);
+    }
 
-  @Override
-  public void keepAlive(Transaction transaction) throws IOException {
-    rmProxy.keepAlive(transaction);
-  }
+    @Override
+    public void keepAlive(Transaction transaction) throws IOException {
+        rmProxy.keepAlive(transaction);
+    }
 
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerFactory.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerFactory.java
index b7cf1bf..bd50e2e 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerFactory.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/RevisionManagerFactory.java
@@ -28,77 +28,77 @@
  */
 public class RevisionManagerFactory {
 
-  public static final String REVISION_MGR_IMPL_CLASS = "revision.manager.impl.class";
+    public static final String REVISION_MGR_IMPL_CLASS = "revision.manager.impl.class";
 
-  /**
-   * Gets an instance of revision manager.
-   *
-   * @param conf The configuration required to created the revision manager.
-   * @return the revision manager An instance of revision manager.
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-   private static RevisionManager getRevisionManager(String className, Configuration conf) throws IOException{
+    /**
+     * Gets an instance of revision manager.
+     *
+     * @param conf The configuration required to created the revision manager.
+     * @return the revision manager An instance of revision manager.
+     * @throws IOException Signals that an I/O exception has occurred.
+     */
+    private static RevisionManager getRevisionManager(String className, Configuration conf) throws IOException {
 
         RevisionManager revisionMgr;
         ClassLoader classLoader = Thread.currentThread()
-                .getContextClassLoader();
+            .getContextClassLoader();
         if (classLoader == null) {
             classLoader = RevisionManagerFactory.class.getClassLoader();
         }
         try {
             Class<? extends RevisionManager> revisionMgrClass = Class
-                    .forName(className, true , classLoader).asSubclass(RevisionManager.class);
+                .forName(className, true, classLoader).asSubclass(RevisionManager.class);
             revisionMgr = (RevisionManager) revisionMgrClass.newInstance();
             revisionMgr.initialize(conf);
         } catch (ClassNotFoundException e) {
             throw new IOException(
-                    "The implementation class of revision manager not found.",
-                    e);
+                "The implementation class of revision manager not found.",
+                e);
         } catch (InstantiationException e) {
             throw new IOException(
-                    "Exception encountered during instantiating revision manager implementation.",
-                    e);
+                "Exception encountered during instantiating revision manager implementation.",
+                e);
         } catch (IllegalAccessException e) {
             throw new IOException(
-                    "IllegalAccessException encountered during instantiating revision manager implementation.",
-                    e);
+                "IllegalAccessException encountered during instantiating revision manager implementation.",
+                e);
         } catch (IllegalArgumentException e) {
             throw new IOException(
-                    "IllegalArgumentException encountered during instantiating revision manager implementation.",
-                    e);
+                "IllegalArgumentException encountered during instantiating revision manager implementation.",
+                e);
         }
         return revisionMgr;
     }
 
-   /**
-    * Internally used by endpoint implementation to instantiate from different configuration setting.
-    * @param className
-    * @param conf
-    * @return
-    * @throws IOException
-    */
-   static RevisionManager getOpenedRevisionManager(String className, Configuration conf) throws IOException {
+    /**
+     * Internally used by endpoint implementation to instantiate from different configuration setting.
+     * @param className
+     * @param conf
+     * @return
+     * @throws IOException
+     */
+    static RevisionManager getOpenedRevisionManager(String className, Configuration conf) throws IOException {
 
-       RevisionManager revisionMgr = RevisionManagerFactory.getRevisionManager(className, conf);
-       if (revisionMgr instanceof Configurable) {
-         ((Configurable)revisionMgr).setConf(conf);
-       }
-       revisionMgr.open();
-       return revisionMgr;
-   }
+        RevisionManager revisionMgr = RevisionManagerFactory.getRevisionManager(className, conf);
+        if (revisionMgr instanceof Configurable) {
+            ((Configurable) revisionMgr).setConf(conf);
+        }
+        revisionMgr.open();
+        return revisionMgr;
+    }
 
-   /**
-    * Gets an instance of revision manager which is opened.
-    * The revision manager implementation can be specified as {@link #REVISION_MGR_IMPL_CLASS},
-    * default is {@link ZKBasedRevisionManager}.
-    * @param conf revision manager configuration
-    * @return RevisionManager An instance of revision manager.
-    * @throws IOException
-    */
-   public static RevisionManager getOpenedRevisionManager(Configuration conf) throws IOException {
-     String className = conf.get(RevisionManagerFactory.REVISION_MGR_IMPL_CLASS,
-         ZKBasedRevisionManager.class.getName());
-     return getOpenedRevisionManager(className, conf);
-   }
+    /**
+     * Gets an instance of revision manager which is opened.
+     * The revision manager implementation can be specified as {@link #REVISION_MGR_IMPL_CLASS},
+     * default is {@link ZKBasedRevisionManager}.
+     * @param conf revision manager configuration
+     * @return RevisionManager An instance of revision manager.
+     * @throws IOException
+     */
+    public static RevisionManager getOpenedRevisionManager(Configuration conf) throws IOException {
+        String className = conf.get(RevisionManagerFactory.REVISION_MGR_IMPL_CLASS,
+            ZKBasedRevisionManager.class.getName());
+        return getOpenedRevisionManager(className, conf);
+    }
 
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/TableSnapshot.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/TableSnapshot.java
index b6eeafc..e79390a 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/TableSnapshot.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/TableSnapshot.java
@@ -37,7 +37,7 @@
     public TableSnapshot(String name, Map<String, Long> cfRevMap, long latestRevision) {
         this.name = name;
         if (cfRevMap == null) {
-          throw new IllegalArgumentException("revision map cannot be null");
+            throw new IllegalArgumentException("revision map cannot be null");
         }
         this.cfRevisionMap = cfRevMap;
         this.latestRevision = latestRevision;
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/Transaction.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/Transaction.java
index 70f6a2e..e2a3682 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/Transaction.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/Transaction.java
@@ -41,35 +41,35 @@
         this.revision = revision;
     }
 
-   /**
+    /**
      * @return The revision number associated with a transaction.
      */
-   public long getRevisionNumber(){
-       return this.revision;
-   }
+    public long getRevisionNumber() {
+        return this.revision;
+    }
 
     /**
      * @return The table name associated with a transaction.
      */
-   public String getTableName() {
+    public String getTableName() {
         return tableName;
     }
 
     /**
      * @return The column families associated with a transaction.
      */
-   public List<String> getColumnFamilies() {
+    public List<String> getColumnFamilies() {
         return columnFamilies;
     }
 
     /**
      * @return The expire timestamp associated with a transaction.
      */
-   long getTransactionExpireTimeStamp(){
+    long getTransactionExpireTimeStamp() {
         return this.timeStamp + this.keepAlive;
     }
 
-    void setKeepAlive(long seconds){
+    void setKeepAlive(long seconds) {
         this.keepAlive = seconds;
     }
 
@@ -78,7 +78,7 @@
      *
      * @return long  The keep alive value for the transaction.
      */
-    public long getKeepAliveValue(){
+    public long getKeepAliveValue() {
         return this.keepAlive;
     }
 
@@ -87,15 +87,15 @@
      *
      * @return FamilyRevision An instance of FamilyRevision associated with the transaction.
      */
-    FamilyRevision getFamilyRevisionInfo(){
+    FamilyRevision getFamilyRevisionInfo() {
         return new FamilyRevision(revision, getTransactionExpireTimeStamp());
     }
 
-   /**
-    * Keep alive transaction. This methods extends the expire timestamp of a
-    * transaction by the "keep alive" amount.
-    */
-   void keepAliveTransaction(){
+    /**
+     * Keep alive transaction. This methods extends the expire timestamp of a
+     * transaction by the "keep alive" amount.
+     */
+    void keepAliveTransaction() {
         this.timeStamp = this.timeStamp + this.keepAlive;
     }
 
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java
index 5885517..50adc9f 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKBasedRevisionManager.java
@@ -35,7 +35,7 @@
 /**
  * The service for providing revision management to Hbase tables.
  */
-public class ZKBasedRevisionManager implements RevisionManager{
+public class ZKBasedRevisionManager implements RevisionManager {
 
     private static final Logger LOG = LoggerFactory.getLogger(ZKBasedRevisionManager.class);
     private String zkHostList;
@@ -51,19 +51,19 @@
     public void initialize(Configuration conf) {
         conf = new Configuration(conf);
         if (conf.get(RMConstants.ZOOKEEPER_HOSTLIST) == null) {
-           String zkHostList = conf.get(HConstants.ZOOKEEPER_QUORUM);
-           int port = conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT,
-                   HConstants.DEFAULT_ZOOKEPER_CLIENT_PORT);
-           String[] splits = zkHostList.split(",");
-           StringBuffer sb = new StringBuffer();
-           for (String split : splits) {
-               sb.append(split);
-               sb.append(':');
-               sb.append(port);
-               sb.append(',');
-           }
-           sb.deleteCharAt(sb.length() - 1);
-           conf.set(RMConstants.ZOOKEEPER_HOSTLIST, sb.toString());
+            String zkHostList = conf.get(HConstants.ZOOKEEPER_QUORUM);
+            int port = conf.getInt(HConstants.ZOOKEEPER_CLIENT_PORT,
+                HConstants.DEFAULT_ZOOKEPER_CLIENT_PORT);
+            String[] splits = zkHostList.split(",");
+            StringBuffer sb = new StringBuffer();
+            for (String split : splits) {
+                sb.append(split);
+                sb.append(':');
+                sb.append(port);
+                sb.append(',');
+            }
+            sb.deleteCharAt(sb.length() - 1);
+            conf.set(RMConstants.ZOOKEEPER_HOSTLIST, sb.toString());
         }
         this.zkHostList = conf.get(RMConstants.ZOOKEEPER_HOSTLIST);
         this.baseDir = conf.get(RMConstants.ZOOKEEPER_DATADIR);
@@ -91,11 +91,11 @@
     private void checkInputParams(String table, List<String> families) {
         if (table == null) {
             throw new IllegalArgumentException(
-                    "The table name must be specified for reading.");
+                "The table name must be specified for reading.");
         }
         if (families == null || families.isEmpty()) {
             throw new IllegalArgumentException(
-                    "At least one column family should be specified for reading.");
+                "At least one column family should be specified for reading.");
         }
     }
 
@@ -118,14 +118,14 @@
      * @see org.apache.hcatalog.hbase.snapshot.RevisionManager#beginWriteTransaction(java.lang.String, java.util.List, long)
      */
     public Transaction beginWriteTransaction(String table,
-            List<String> families, long keepAlive) throws IOException {
+                                             List<String> families, long keepAlive) throws IOException {
 
         checkInputParams(table, families);
         zkUtil.setUpZnodesForTable(table, families);
         long nextId = zkUtil.nextId(table);
         long expireTimestamp = zkUtil.getTimeStamp();
         Transaction transaction = new Transaction(table, families, nextId,
-                expireTimestamp);
+            expireTimestamp);
         if (keepAlive != -1) {
             transaction.setKeepAlive(keepAlive);
         } else {
@@ -135,32 +135,31 @@
         refreshTransactionList(transaction.getTableName());
         String lockPath = prepareLockNode(table);
         WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
-                Ids.OPEN_ACL_UNSAFE);
+            Ids.OPEN_ACL_UNSAFE);
         RMLockListener myLockListener = new RMLockListener();
         wLock.setLockListener(myLockListener);
         try {
             boolean lockGrabbed = wLock.lock();
             if (lockGrabbed == false) {
-              //TO DO : Let this request queue up and try obtaining lock.
+                //TO DO : Let this request queue up and try obtaining lock.
                 throw new IOException(
-                        "Unable to obtain lock while beginning transaction. "
-                                + transaction.toString());
+                    "Unable to obtain lock while beginning transaction. "
+                        + transaction.toString());
             } else {
                 List<String> colFamilies = transaction.getColumnFamilies();
                 FamilyRevision revisionData = transaction.getFamilyRevisionInfo();
                 for (String cfamily : colFamilies) {
                     String path = PathUtil.getRunningTxnInfoPath(
-                            baseDir, table, cfamily);
+                        baseDir, table, cfamily);
                     zkUtil.updateData(path, revisionData,
-                            ZKUtil.UpdateMode.APPEND);
+                        ZKUtil.UpdateMode.APPEND);
                 }
             }
         } catch (KeeperException e) {
             throw new IOException("Exception while obtaining lock.", e);
         } catch (InterruptedException e) {
             throw new IOException("Exception while obtaining lock.", e);
-        }
-        finally {
+        } finally {
             wLock.unlock();
         }
 
@@ -174,7 +173,7 @@
      * @see org.apache.hcatalog.hbase.snapshot.RevisionManager#beginWriteTransaction(java.lang.String, java.util.List)
      */
     public Transaction beginWriteTransaction(String table, List<String> families)
-            throws IOException {
+        throws IOException {
         return beginWriteTransaction(table, families, -1);
     }
 
@@ -188,25 +187,25 @@
 
         String lockPath = prepareLockNode(transaction.getTableName());
         WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
-                Ids.OPEN_ACL_UNSAFE);
+            Ids.OPEN_ACL_UNSAFE);
         RMLockListener myLockListener = new RMLockListener();
         wLock.setLockListener(myLockListener);
         try {
             boolean lockGrabbed = wLock.lock();
             if (lockGrabbed == false) {
-              //TO DO : Let this request queue up and try obtaining lock.
+                //TO DO : Let this request queue up and try obtaining lock.
                 throw new IOException(
-                        "Unable to obtain lock while commiting transaction. "
-                                + transaction.toString());
+                    "Unable to obtain lock while commiting transaction. "
+                        + transaction.toString());
             } else {
                 String tableName = transaction.getTableName();
                 List<String> colFamilies = transaction.getColumnFamilies();
                 FamilyRevision revisionData = transaction.getFamilyRevisionInfo();
                 for (String cfamily : colFamilies) {
                     String path = PathUtil.getRunningTxnInfoPath(
-                            baseDir, tableName, cfamily);
+                        baseDir, tableName, cfamily);
                     zkUtil.updateData(path, revisionData,
-                            ZKUtil.UpdateMode.REMOVE);
+                        ZKUtil.UpdateMode.REMOVE);
                 }
 
             }
@@ -214,8 +213,7 @@
             throw new IOException("Exception while obtaining lock.", e);
         } catch (InterruptedException e) {
             throw new IOException("Exception while obtaining lock.", e);
-        }
-        finally {
+        } finally {
             wLock.unlock();
         }
         LOG.info("Write Transaction committed: " + transaction.toString());
@@ -231,30 +229,30 @@
         refreshTransactionList(transaction.getTableName());
         String lockPath = prepareLockNode(transaction.getTableName());
         WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
-                Ids.OPEN_ACL_UNSAFE);
+            Ids.OPEN_ACL_UNSAFE);
         RMLockListener myLockListener = new RMLockListener();
         wLock.setLockListener(myLockListener);
         try {
             boolean lockGrabbed = wLock.lock();
             if (lockGrabbed == false) {
-              //TO DO : Let this request queue up and try obtaining lock.
+                //TO DO : Let this request queue up and try obtaining lock.
                 throw new IOException(
-                        "Unable to obtain lock while aborting transaction. "
-                                + transaction.toString());
+                    "Unable to obtain lock while aborting transaction. "
+                        + transaction.toString());
             } else {
                 String tableName = transaction.getTableName();
                 List<String> colFamilies = transaction.getColumnFamilies();
                 FamilyRevision revisionData = transaction
-                        .getFamilyRevisionInfo();
+                    .getFamilyRevisionInfo();
                 for (String cfamily : colFamilies) {
                     String path = PathUtil.getRunningTxnInfoPath(
-                            baseDir, tableName, cfamily);
+                        baseDir, tableName, cfamily);
                     zkUtil.updateData(path, revisionData,
-                            ZKUtil.UpdateMode.REMOVE);
+                        ZKUtil.UpdateMode.REMOVE);
                     path = PathUtil.getAbortInformationPath(baseDir,
-                            tableName, cfamily);
+                        tableName, cfamily);
                     zkUtil.updateData(path, revisionData,
-                            ZKUtil.UpdateMode.APPEND);
+                        ZKUtil.UpdateMode.APPEND);
                 }
 
             }
@@ -262,54 +260,53 @@
             throw new IOException("Exception while obtaining lock.", e);
         } catch (InterruptedException e) {
             throw new IOException("Exception while obtaining lock.", e);
-        }
-        finally {
+        } finally {
             wLock.unlock();
         }
         LOG.info("Write Transaction aborted: " + transaction.toString());
     }
 
 
-     /* @param transaction
-     /* @throws IOException
-      * @see org.apache.hcatalog.hbase.snapshot.RevsionManager#keepAlive(org.apache.hcatalog.hbase.snapshot.Transaction)
-      */
-     public void keepAlive(Transaction transaction)
-            throws IOException {
+    /* @param transaction
+   /* @throws IOException
+    * @see org.apache.hcatalog.hbase.snapshot.RevsionManager#keepAlive(org.apache.hcatalog.hbase.snapshot.Transaction)
+    */
+    public void keepAlive(Transaction transaction)
+        throws IOException {
 
-         refreshTransactionList(transaction.getTableName());
-         transaction.keepAliveTransaction();
-         String lockPath = prepareLockNode(transaction.getTableName());
-         WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
-                 Ids.OPEN_ACL_UNSAFE);
-         RMLockListener myLockListener = new RMLockListener();
-         wLock.setLockListener(myLockListener);
-         try {
-             boolean lockGrabbed = wLock.lock();
-             if (lockGrabbed == false) {
-               //TO DO : Let this request queue up and try obtaining lock.
-                 throw new IOException(
-                         "Unable to obtain lock for keep alive of transaction. "
-                                 + transaction.toString());
-             }else {
-                 String tableName = transaction.getTableName();
-                 List<String> colFamilies = transaction.getColumnFamilies();
-                 FamilyRevision revisionData = transaction.getFamilyRevisionInfo();
-                 for (String cfamily : colFamilies) {
-                     String path = PathUtil.getRunningTxnInfoPath(
-                             baseDir, tableName, cfamily);
-                     zkUtil.updateData(path, revisionData,
-                             ZKUtil.UpdateMode.KEEP_ALIVE);
-                 }
+        refreshTransactionList(transaction.getTableName());
+        transaction.keepAliveTransaction();
+        String lockPath = prepareLockNode(transaction.getTableName());
+        WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
+            Ids.OPEN_ACL_UNSAFE);
+        RMLockListener myLockListener = new RMLockListener();
+        wLock.setLockListener(myLockListener);
+        try {
+            boolean lockGrabbed = wLock.lock();
+            if (lockGrabbed == false) {
+                //TO DO : Let this request queue up and try obtaining lock.
+                throw new IOException(
+                    "Unable to obtain lock for keep alive of transaction. "
+                        + transaction.toString());
+            } else {
+                String tableName = transaction.getTableName();
+                List<String> colFamilies = transaction.getColumnFamilies();
+                FamilyRevision revisionData = transaction.getFamilyRevisionInfo();
+                for (String cfamily : colFamilies) {
+                    String path = PathUtil.getRunningTxnInfoPath(
+                        baseDir, tableName, cfamily);
+                    zkUtil.updateData(path, revisionData,
+                        ZKUtil.UpdateMode.KEEP_ALIVE);
+                }
 
-             }
-         } catch (KeeperException e) {
-             throw new IOException("Exception while obtaining lock.", e);
-         } catch (InterruptedException e) {
-             throw new IOException("Exception while obtaining lock.", e);
-         }finally {
-             wLock.unlock();
-         }
+            }
+        } catch (KeeperException e) {
+            throw new IOException("Exception while obtaining lock.", e);
+        } catch (InterruptedException e) {
+            throw new IOException("Exception while obtaining lock.", e);
+        } finally {
+            wLock.unlock();
+        }
 
     }
 
@@ -320,13 +317,13 @@
     /* @throws IOException
      * @see org.apache.hcatalog.hbase.snapshot.RevsionManager#createSnapshot(java.lang.String)
      */
-    public TableSnapshot createSnapshot(String tableName) throws IOException{
+    public TableSnapshot createSnapshot(String tableName) throws IOException {
         refreshTransactionList(tableName);
         long latestID = zkUtil.currentID(tableName);
         HashMap<String, Long> cfMap = new HashMap<String, Long>();
         List<String> columnFamilyNames = zkUtil.getColumnFamiliesOfTable(tableName);
 
-        for(String cfName: columnFamilyNames){
+        for (String cfName : columnFamilyNames) {
             String cfPath = PathUtil.getRunningTxnInfoPath(baseDir, tableName, cfName);
             List<FamilyRevision> tranxList = zkUtil.getTransactionList(cfPath);
             long version;
@@ -334,15 +331,15 @@
                 Collections.sort(tranxList);
                 // get the smallest running Transaction ID
                 long runningVersion = tranxList.get(0).getRevision();
-                version = runningVersion -1;
+                version = runningVersion - 1;
             } else {
                 version = latestID;
             }
             cfMap.put(cfName, version);
         }
 
-        TableSnapshot snapshot = new TableSnapshot(tableName, cfMap,latestID);
-        LOG.debug("Created snapshot For table: "+tableName+" snapshot: "+snapshot);
+        TableSnapshot snapshot = new TableSnapshot(tableName, cfMap, latestID);
+        LOG.debug("Created snapshot For table: " + tableName + " snapshot: " + snapshot);
         return snapshot;
     }
 
@@ -354,18 +351,18 @@
     /* @throws IOException
      * @see org.apache.hcatalog.hbase.snapshot.RevsionManager#createSnapshot(java.lang.String, long)
      */
-    public TableSnapshot createSnapshot(String tableName, long revision) throws IOException{
+    public TableSnapshot createSnapshot(String tableName, long revision) throws IOException {
 
         long currentID = zkUtil.currentID(tableName);
         if (revision > currentID) {
             throw new IOException(
-                    "The revision specified in the snapshot is higher than the current revision of the table.");
+                "The revision specified in the snapshot is higher than the current revision of the table.");
         }
         refreshTransactionList(tableName);
         HashMap<String, Long> cfMap = new HashMap<String, Long>();
         List<String> columnFamilies = zkUtil.getColumnFamiliesOfTable(tableName);
 
-        for(String cf: columnFamilies){
+        for (String cf : columnFamilies) {
             cfMap.put(cf, revision);
         }
 
@@ -380,40 +377,40 @@
      * @throws java.io.IOException
      */
     List<FamilyRevision> getRunningTransactions(String table,
-            String columnFamily) throws IOException {
+                                                String columnFamily) throws IOException {
         String path = PathUtil.getRunningTxnInfoPath(baseDir, table,
-                columnFamily);
+            columnFamily);
         return zkUtil.getTransactionList(path);
     }
 
     @Override
-     public List<FamilyRevision> getAbortedWriteTransactions(String table,
-            String columnFamily) throws IOException {
-         String path = PathUtil.getAbortInformationPath(baseDir, table, columnFamily);
-         return zkUtil.getTransactionList(path);
+    public List<FamilyRevision> getAbortedWriteTransactions(String table,
+                                                            String columnFamily) throws IOException {
+        String path = PathUtil.getAbortInformationPath(baseDir, table, columnFamily);
+        return zkUtil.getTransactionList(path);
     }
 
-     private void refreshTransactionList(String tableName) throws IOException{
+    private void refreshTransactionList(String tableName) throws IOException {
         String lockPath = prepareLockNode(tableName);
         WriteLock wLock = new WriteLock(zkUtil.getSession(), lockPath,
-                Ids.OPEN_ACL_UNSAFE);
+            Ids.OPEN_ACL_UNSAFE);
         RMLockListener myLockListener = new RMLockListener();
         wLock.setLockListener(myLockListener);
         try {
             boolean lockGrabbed = wLock.lock();
             if (lockGrabbed == false) {
-              //TO DO : Let this request queue up and try obtaining lock.
+                //TO DO : Let this request queue up and try obtaining lock.
                 throw new IOException(
-                        "Unable to obtain lock while refreshing transactions of table "
-                                + tableName + ".");
-            }else {
+                    "Unable to obtain lock while refreshing transactions of table "
+                        + tableName + ".");
+            } else {
                 List<String> cfPaths = zkUtil
-                        .getColumnFamiliesOfTable(tableName);
+                    .getColumnFamiliesOfTable(tableName);
                 for (String cf : cfPaths) {
                     String runningDataPath = PathUtil.getRunningTxnInfoPath(
-                            baseDir, tableName, cf);
+                        baseDir, tableName, cf);
                     zkUtil.refreshTransactions(runningDataPath);
-        }
+                }
 
             }
         } catch (KeeperException e) {
@@ -424,22 +421,22 @@
             wLock.unlock();
         }
 
-     }
+    }
 
-     private String prepareLockNode(String tableName) throws IOException{
-         String txnDataPath = PathUtil.getTxnDataPath(this.baseDir, tableName);
-         String lockPath = PathUtil.getLockManagementNode(txnDataPath);
-         zkUtil.ensurePathExists(lockPath, null, Ids.OPEN_ACL_UNSAFE,
-                 CreateMode.PERSISTENT);
-         return lockPath;
-     }
+    private String prepareLockNode(String tableName) throws IOException {
+        String txnDataPath = PathUtil.getTxnDataPath(this.baseDir, tableName);
+        String lockPath = PathUtil.getLockManagementNode(txnDataPath);
+        zkUtil.ensurePathExists(lockPath, null, Ids.OPEN_ACL_UNSAFE,
+            CreateMode.PERSISTENT);
+        return lockPath;
+    }
 
     /*
      * This class is a listener class for the locks used in revision management.
      * TBD: Use the following class to signal that that the lock is actually
      * been granted.
      */
-     class RMLockListener implements LockListener {
+    class RMLockListener implements LockListener {
 
         /*
          * @see org.apache.hcatalog.hbase.snapshot.lock.LockListener#lockAcquired()
@@ -457,7 +454,7 @@
 
         }
 
-     }
+    }
 
 
 }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKUtil.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKUtil.java
index 8837bb5..de18241 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKUtil.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/ZKUtil.java
@@ -43,15 +43,17 @@
 
 class ZKUtil {
 
-    private int              DEFAULT_SESSION_TIMEOUT = 1000000;
-    private ZooKeeper        zkSession;
-    private String           baseDir;
-    private String           connectString;
+    private int DEFAULT_SESSION_TIMEOUT = 1000000;
+    private ZooKeeper zkSession;
+    private String baseDir;
+    private String connectString;
     private static final Logger LOG = LoggerFactory.getLogger(ZKUtil.class);
 
     static enum UpdateMode {
         APPEND, REMOVE, KEEP_ALIVE
-    };
+    }
+
+    ;
 
     ZKUtil(String connection, String baseDir) {
         this.connectString = connection;
@@ -66,20 +68,20 @@
      * @throws IOException
      */
     void setUpZnodesForTable(String table, List<String> families)
-            throws IOException {
+        throws IOException {
 
         String transactionDataTablePath = PathUtil.getTxnDataPath(baseDir, table);
         ensurePathExists(transactionDataTablePath, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         for (String cf : families) {
             String runningDataPath = PathUtil.getRunningTxnInfoPath(
-                    this.baseDir, table, cf);
+                this.baseDir, table, cf);
             ensurePathExists(runningDataPath, null, Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.PERSISTENT);
+                CreateMode.PERSISTENT);
             String abortDataPath = PathUtil.getAbortInformationPath(
-                    this.baseDir, table, cf);
+                this.baseDir, table, cf);
             ensurePathExists(abortDataPath, null, Ids.OPEN_ACL_UNSAFE,
-                    CreateMode.PERSISTENT);
+                CreateMode.PERSISTENT);
         }
 
     }
@@ -95,7 +97,7 @@
      * @throws IOException
      */
     void ensurePathExists(String path, byte[] data, List<ACL> acl,
-            CreateMode flags) throws IOException {
+                          CreateMode flags) throws IOException {
         String[] dirs = path.split("/");
         String parentPath = "";
         for (String subDir : dirs) {
@@ -108,7 +110,7 @@
                     }
                 } catch (Exception e) {
                     throw new IOException("Exception while creating path "
-                            + parentPath, e);
+                        + parentPath, e);
                 }
             }
         }
@@ -131,15 +133,15 @@
             children = getSession().getChildren(path, false);
         } catch (KeeperException e) {
             LOG.warn("Caught: ", e);
-            throw new IOException("Exception while obtaining columns of table.",e);
+            throw new IOException("Exception while obtaining columns of table.", e);
         } catch (InterruptedException e) {
             LOG.warn("Caught: ", e);
-            throw new IOException("Exception while obtaining columns of table.",e);
+            throw new IOException("Exception while obtaining columns of table.", e);
         }
 
         for (String child : children) {
             if ((child.contains("idgen") == false)
-                    && (child.contains("_locknode_") == false)) {
+                && (child.contains("_locknode_") == false)) {
                 columnFamlies.add(child);
             }
         }
@@ -157,7 +159,7 @@
         Stat stat;
         String clockPath = PathUtil.getClockPath(this.baseDir);
         ensurePathExists(clockPath, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         try {
             getSession().exists(clockPath, false);
             stat = getSession().setData(clockPath, null, -1);
@@ -184,10 +186,10 @@
     long nextId(String tableName) throws IOException {
         String idNode = PathUtil.getRevisionIDNode(this.baseDir, tableName);
         ensurePathExists(idNode, Bytes.toBytes("0"), Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         String lockNode = PathUtil.getLockManagementNode(idNode);
         ensurePathExists(lockNode, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         IDGenerator idf = new IDGenerator(getSession(), tableName, idNode);
         long id = idf.obtainID();
         return id;
@@ -200,13 +202,13 @@
      * @return the long The revision number to use by any transaction.
      * @throws IOException Signals that an I/O exception has occurred.
      */
-    long currentID(String tableName) throws IOException{
+    long currentID(String tableName) throws IOException {
         String idNode = PathUtil.getRevisionIDNode(this.baseDir, tableName);
         ensurePathExists(idNode, Bytes.toBytes("0"), Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         String lockNode = PathUtil.getLockManagementNode(idNode);
         ensurePathExists(lockNode, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         IDGenerator idf = new IDGenerator(getSession(), tableName, idNode);
         long id = idf.readID();
         return id;
@@ -221,7 +223,7 @@
      * @throws IOException
      */
     List<FamilyRevision> getTransactionList(String path)
-            throws IOException {
+        throws IOException {
 
         byte[] data = getRawData(path, new Stat());
         ArrayList<FamilyRevision> wtxnList = new ArrayList<FamilyRevision>();
@@ -235,7 +237,7 @@
         while (itr.hasNext()) {
             StoreFamilyRevision wtxn = itr.next();
             wtxnList.add(new FamilyRevision(wtxn.getRevision(), wtxn
-                    .getTimestamp()));
+                .getTimestamp()));
         }
 
         return wtxnList;
@@ -255,8 +257,8 @@
             data = getSession().getData(path, false, stat);
         } catch (Exception e) {
             throw new IOException(
-                    "Exception while obtaining raw data from zookeeper path "
-                            + path, e);
+                "Exception while obtaining raw data from zookeeper path "
+                    + path, e);
         }
         return data;
     }
@@ -271,9 +273,9 @@
         String txnBaseNode = PathUtil.getTransactionBasePath(this.baseDir);
         String clockNode = PathUtil.getClockPath(this.baseDir);
         ensurePathExists(txnBaseNode, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
         ensurePathExists(clockNode, null, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
+            CreateMode.PERSISTENT);
     }
 
     /**
@@ -298,12 +300,12 @@
      * @return ZooKeeper An instance of zookeeper client.
      * @throws IOException
      */
-     ZooKeeper getSession() throws IOException {
+    ZooKeeper getSession() throws IOException {
         if (zkSession == null || zkSession.getState() == States.CLOSED) {
             synchronized (this) {
                 if (zkSession == null || zkSession.getState() == States.CLOSED) {
                     zkSession = new ZooKeeper(this.connectString,
-                            this.DEFAULT_SESSION_TIMEOUT, new ZKWatcher());
+                        this.DEFAULT_SESSION_TIMEOUT, new ZKWatcher());
                 }
             }
         }
@@ -319,11 +321,11 @@
      * @throws IOException
      */
     void updateData(String path, FamilyRevision updateTx, UpdateMode mode)
-            throws IOException {
+        throws IOException {
 
         if (updateTx == null) {
             throw new IOException(
-                    "The transaction to be updated found to be null.");
+                "The transaction to be updated found to be null.");
         }
         List<FamilyRevision> currentData = getTransactionList(path);
         List<FamilyRevision> newData = new ArrayList<FamilyRevision>();
@@ -337,36 +339,36 @@
             }
         }
         switch (mode) {
-            case REMOVE:
-                if (dataFound == false) {
-                    throw new IOException(
-                            "The transaction to be removed not found in the data.");
-                }
-                LOG.info("Removed trasaction : " + updateTx.toString());
-                break;
-            case KEEP_ALIVE:
-                if (dataFound == false) {
-                    throw new IOException(
-                            "The transaction to be kept alove not found in the data. It might have been expired.");
-                }
-                newData.add(updateTx);
-                LOG.info("keep alive of transaction : " + updateTx.toString());
-                break;
-            case APPEND:
-                if (dataFound == true) {
-                    throw new IOException(
-                            "The data to be appended already exists.");
-                }
-                newData.add(updateTx);
-                LOG.info("Added transaction : " + updateTx.toString());
-                break;
+        case REMOVE:
+            if (dataFound == false) {
+                throw new IOException(
+                    "The transaction to be removed not found in the data.");
+            }
+            LOG.info("Removed trasaction : " + updateTx.toString());
+            break;
+        case KEEP_ALIVE:
+            if (dataFound == false) {
+                throw new IOException(
+                    "The transaction to be kept alove not found in the data. It might have been expired.");
+            }
+            newData.add(updateTx);
+            LOG.info("keep alive of transaction : " + updateTx.toString());
+            break;
+        case APPEND:
+            if (dataFound == true) {
+                throw new IOException(
+                    "The data to be appended already exists.");
+            }
+            newData.add(updateTx);
+            LOG.info("Added transaction : " + updateTx.toString());
+            break;
         }
 
         // For serialization purposes.
         List<StoreFamilyRevision> newTxnList = new ArrayList<StoreFamilyRevision>();
         for (FamilyRevision wtxn : newData) {
             StoreFamilyRevision newTxn = new StoreFamilyRevision(wtxn.getRevision(),
-                    wtxn.getExpireTimestamp());
+                wtxn.getExpireTimestamp());
             newTxnList.add(newTxn);
         }
         StoreFamilyRevisionList wtxnList = new StoreFamilyRevisionList(newTxnList);
@@ -377,10 +379,10 @@
             stat = zkSession.setData(path, newByteData, -1);
         } catch (KeeperException e) {
             throw new IOException(
-                    "Exception while updating trasactional data. ", e);
+                "Exception while updating trasactional data. ", e);
         } catch (InterruptedException e) {
             throw new IOException(
-                    "Exception while updating trasactional data. ", e);
+                "Exception while updating trasactional data. ", e);
         }
 
         if (stat != null) {
@@ -395,7 +397,7 @@
      * @param path The path to the transaction data.
      * @throws IOException Signals that an I/O exception has occurred.
      */
-    void refreshTransactions(String path) throws IOException{
+    void refreshTransactions(String path) throws IOException {
         List<FamilyRevision> currentData = getTransactionList(path);
         List<FamilyRevision> newData = new ArrayList<FamilyRevision>();
 
@@ -405,11 +407,11 @@
             }
         }
 
-        if(newData.equals(currentData) == false){
+        if (newData.equals(currentData) == false) {
             List<StoreFamilyRevision> newTxnList = new ArrayList<StoreFamilyRevision>();
             for (FamilyRevision wtxn : newData) {
                 StoreFamilyRevision newTxn = new StoreFamilyRevision(wtxn.getRevision(),
-                        wtxn.getExpireTimestamp());
+                    wtxn.getExpireTimestamp());
                 newTxnList.add(newTxn);
             }
             StoreFamilyRevisionList wtxnList = new StoreFamilyRevisionList(newTxnList);
@@ -419,10 +421,10 @@
                 zkSession.setData(path, newByteData, -1);
             } catch (KeeperException e) {
                 throw new IOException(
-                        "Exception while updating trasactional data. ", e);
+                    "Exception while updating trasactional data. ", e);
             } catch (InterruptedException e) {
                 throw new IOException(
-                        "Exception while updating trasactional data. ", e);
+                    "Exception while updating trasactional data. ", e);
             }
 
         }
@@ -437,7 +439,7 @@
      */
     void deleteZNodes(String tableName) throws IOException {
         String transactionDataTablePath = PathUtil.getTxnDataPath(baseDir,
-                tableName);
+            tableName);
         deleteRecursively(transactionDataTablePath);
     }
 
@@ -452,10 +454,10 @@
             getSession().delete(path, -1);
         } catch (KeeperException e) {
             throw new IOException(
-                    "Exception while deleting path " + path + ".", e);
+                "Exception while deleting path " + path + ".", e);
         } catch (InterruptedException e) {
             throw new IOException(
-                    "Exception while deleting path " + path + ".", e);
+                "Exception while deleting path " + path + ".", e);
         }
     }
 
@@ -471,7 +473,7 @@
             return new byte[0];
         try {
             TSerializer serializer = new TSerializer(
-                    new TBinaryProtocol.Factory());
+                new TBinaryProtocol.Factory());
             byte[] bytes = serializer.serialize(obj);
             return bytes;
         } catch (Exception e) {
@@ -492,7 +494,7 @@
             return;
         try {
             TDeserializer deserializer = new TDeserializer(
-                    new TBinaryProtocol.Factory());
+                new TBinaryProtocol.Factory());
             deserializer.deserialize(obj, data);
         } catch (Exception e) {
             throw new IOException("Deserialization error: " + e.getMessage(), e);
@@ -502,12 +504,12 @@
     private class ZKWatcher implements Watcher {
         public void process(WatchedEvent event) {
             switch (event.getState()) {
-                case Expired:
-                    LOG.info("The client session has expired. Try opening a new "
-                            + "session and connecting again.");
-                    zkSession = null;
-                    break;
-                default:
+            case Expired:
+                LOG.info("The client session has expired. Try opening a new "
+                    + "session and connecting again.");
+                zkSession = null;
+                break;
+            default:
 
             }
         }
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/WriteLock.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/WriteLock.java
index d356327..ebcce3b 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/WriteLock.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/WriteLock.java
@@ -21,7 +21,9 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
+
 import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL;
+
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
@@ -78,7 +80,7 @@
      * @param callback the call back instance
      */
     public WriteLock(ZooKeeper zookeeper, String dir, List<ACL> acl,
-            LockListener callback) {
+                     LockListener callback) {
         this(zookeeper, dir, acl);
         this.callback = callback;
     }
@@ -126,15 +128,14 @@
             } catch (InterruptedException e) {
                 LOG.warn("Caught: " + e, e);
                 //set that we have been interrupted.
-               Thread.currentThread().interrupt();
+                Thread.currentThread().interrupt();
             } catch (KeeperException.NoNodeException e) {
                 // do nothing
             } catch (KeeperException e) {
                 LOG.warn("Caught: " + e, e);
                 throw (RuntimeException) new RuntimeException(e.getMessage()).
                     initCause(e);
-            }
-            finally {
+            } finally {
                 if (callback != null) {
                     callback.lockReleased();
                 }
@@ -152,7 +153,7 @@
         public void process(WatchedEvent event) {
             // lets either become the leader or watch the new/updated node
             LOG.debug("Watcher fired on path: " + event.getPath() + " state: " +
-                    event.getState() + " type " + event.getType());
+                event.getState() + " type " + event.getType());
             try {
                 lock();
             } catch (Exception e) {
@@ -165,7 +166,7 @@
      * a zoookeeper operation that is mainly responsible
      * for all the magic required for locking.
      */
-    private  class LockZooKeeperOperation implements ZooKeeperOperation {
+    private class LockZooKeeperOperation implements ZooKeeperOperation {
 
         /** find if we have been created earler if not create our node
          *
@@ -189,7 +190,7 @@
             }
             if (id == null) {
                 id = zookeeper.create(dir + "/" + prefix, data,
-                        getAcl(), EPHEMERAL_SEQUENTIAL);
+                    getAcl(), EPHEMERAL_SEQUENTIAL);
 
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Created id: " + id);
@@ -217,7 +218,7 @@
                     List<String> names = zookeeper.getChildren(dir, false);
                     if (names.isEmpty()) {
                         LOG.warn("No children in: " + dir + " when we've just " +
-                        "created one! Lets recreate it...");
+                            "created one! Lets recreate it...");
                         // lets force the recreation of the id
                         id = null;
                     } else {
@@ -240,7 +241,7 @@
                                 return Boolean.FALSE;
                             } else {
                                 LOG.warn("Could not find the" +
-                                		" stats for less than me: " + lastChildName.getName());
+                                    " stats for less than me: " + lastChildName.getName());
                             }
                         } else {
                             if (isOwner()) {
@@ -256,7 +257,9 @@
             while (id == null);
             return Boolean.FALSE;
         }
-    };
+    }
+
+    ;
 
     /**
      * Attempts to acquire the exclusive write lock returning whether or not it was
@@ -293,7 +296,7 @@
      * @return the id for this lock
      */
     public String getId() {
-       return this.id;
+        return this.id;
     }
 }
 
diff --git a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/ZNodeName.java b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/ZNodeName.java
index c6a49de..522e272 100644
--- a/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/ZNodeName.java
+++ b/storage-handlers/hbase/src/java/org/apache/hcatalog/hbase/snapshot/lock/ZNodeName.java
@@ -49,7 +49,7 @@
             } catch (NumberFormatException e) {
                 LOG.info("Number format exception for " + idx, e);
             } catch (ArrayIndexOutOfBoundsException e) {
-               LOG.info("Array out of bounds for " + idx, e);
+                LOG.info("Array out of bounds for " + idx, e);
             }
         }
     }
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/ManyMiniCluster.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/ManyMiniCluster.java
index 30bc6de..28d6ec7 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/ManyMiniCluster.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/ManyMiniCluster.java
@@ -95,30 +95,30 @@
         miniZookeeperClusterEnabled = b.miniZookeeperClusterEnabled;
     }
 
-    protected synchronized  void start() {
+    protected synchronized void start() {
         try {
             if (!started) {
                 FileUtil.fullyDelete(workDir);
-                if(miniMRClusterEnabled) {
+                if (miniMRClusterEnabled) {
                     setupMRCluster();
                 }
-                if(miniZookeeperClusterEnabled || miniHBaseClusterEnabled) {
+                if (miniZookeeperClusterEnabled || miniHBaseClusterEnabled) {
                     miniZookeeperClusterEnabled = true;
                     setupZookeeper();
                 }
-                if(miniHBaseClusterEnabled) {
+                if (miniHBaseClusterEnabled) {
                     setupHBaseCluster();
                 }
-                if(miniHiveMetastoreEnabled) {
+                if (miniHiveMetastoreEnabled) {
                     setUpMetastore();
                 }
             }
-        } catch(Exception e) {
-            throw new IllegalStateException("Failed to setup cluster",e);
+        } catch (Exception e) {
+            throw new IllegalStateException("Failed to setup cluster", e);
         }
     }
 
-    protected synchronized  void stop() {
+    protected synchronized void stop() {
         if (hbaseCluster != null) {
             HConnectionManager.deleteAllConnections(true);
             try {
@@ -136,19 +136,19 @@
             }
             zookeeperCluster = null;
         }
-        if(mrCluster != null) {
+        if (mrCluster != null) {
             try {
                 mrCluster.shutdown();
-            } catch(Exception e) {
+            } catch (Exception e) {
                 e.printStackTrace();
             }
             mrCluster = null;
         }
-        if(dfsCluster != null) {
+        if (dfsCluster != null) {
             try {
                 dfsCluster.getFileSystem().close();
                 dfsCluster.shutdown();
-            } catch(Exception e) {
+            } catch (Exception e) {
                 e.printStackTrace();
             }
             dfsCluster = null;
@@ -189,7 +189,7 @@
         try {
             return FileSystem.get(jobConf);
         } catch (IOException e) {
-            throw new IllegalStateException("Failed to get FileSystem",e);
+            throw new IllegalStateException("Failed to get FileSystem", e);
         }
     }
 
@@ -205,38 +205,38 @@
             final int jobTrackerPort = findFreePort();
             final int taskTrackerPort = findFreePort();
 
-            if(jobConf == null)
+            if (jobConf == null)
                 jobConf = new JobConf();
 
             jobConf.setInt("mapred.submit.replication", 1);
             //conf.set("hadoop.job.history.location",new File(workDir).getAbsolutePath()+"/history");
-            System.setProperty("hadoop.log.dir",new File(workDir,"/logs").getAbsolutePath());
+            System.setProperty("hadoop.log.dir", new File(workDir, "/logs").getAbsolutePath());
 
             mrCluster = new MiniMRCluster(jobTrackerPort,
-                                          taskTrackerPort,
-                                          numTaskTrackers,
-                                          getFileSystem().getUri().toString(),
-                                          numTaskTrackers,
-                                          null,
-                                          null,
-                                          null,
-                                          jobConf);
+                taskTrackerPort,
+                numTaskTrackers,
+                getFileSystem().getUri().toString(),
+                numTaskTrackers,
+                null,
+                null,
+                null,
+                jobConf);
 
             jobConf = mrCluster.createJobConf();
         } catch (IOException e) {
-            throw new IllegalStateException("Failed to Setup MR Cluster",e);
+            throw new IllegalStateException("Failed to Setup MR Cluster", e);
         }
     }
 
     private void setupZookeeper() {
         try {
-            zookeeperDir = new File(workDir,"zk").getAbsolutePath();
+            zookeeperDir = new File(workDir, "zk").getAbsolutePath();
             zookeeperPort = findFreePort();
             zookeeperCluster = new MiniZooKeeperCluster();
             zookeeperCluster.setDefaultClientPort(zookeeperPort);
             zookeeperCluster.startup(new File(zookeeperDir));
-        } catch(Exception e) {
-            throw new IllegalStateException("Failed to Setup Zookeeper Cluster",e);
+        } catch (Exception e) {
+            throw new IllegalStateException("Failed to Setup Zookeeper Cluster", e);
         }
     }
 
@@ -244,10 +244,10 @@
         final int numRegionServers = 1;
 
         try {
-            hbaseDir = new File(workDir,"hbase").getAbsolutePath();
+            hbaseDir = new File(workDir, "hbase").getAbsolutePath();
             hbaseRoot = "file://" + hbaseDir;
 
-            if(hbaseConf == null)
+            if (hbaseConf == null)
                 hbaseConf = HBaseConfiguration.create();
 
             hbaseConf.set("hbase.rootdir", hbaseRoot);
@@ -264,12 +264,12 @@
             //opening the META table ensures that cluster is running
             new HTable(hbaseConf, HConstants.META_TABLE_NAME);
         } catch (Exception e) {
-            throw new IllegalStateException("Failed to setup HBase Cluster",e);
+            throw new IllegalStateException("Failed to setup HBase Cluster", e);
         }
     }
 
     private void setUpMetastore() throws Exception {
-        if(hiveConf == null)
+        if (hiveConf == null)
             hiveConf = new HiveConf(this.getClass());
 
         //The default org.apache.hadoop.hive.ql.hooks.PreExecutePrinter hook
@@ -278,13 +278,13 @@
         hiveConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
         hiveConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname, "false");
         hiveConf.set(HiveConf.ConfVars.METASTORECONNECTURLKEY.varname,
-                     "jdbc:derby:"+new File(workDir+"/metastore_db")+";create=true");
+            "jdbc:derby:" + new File(workDir + "/metastore_db") + ";create=true");
         hiveConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.toString(),
-                     new File(workDir,"warehouse").toString());
+            new File(workDir, "warehouse").toString());
         //set where derby logs
-        File derbyLogFile = new File(workDir+"/derby.log");
+        File derbyLogFile = new File(workDir + "/derby.log");
         derbyLogFile.createNewFile();
-        System.setProperty("derby.stream.error.file",derbyLogFile.getPath());
+        System.setProperty("derby.stream.error.file", derbyLogFile.getPath());
 
 
 //    Driver driver = new Driver(hiveConf);
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/SkeletonHBaseTest.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/SkeletonHBaseTest.java
index fbadba3..ea082c2 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/SkeletonHBaseTest.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/SkeletonHBaseTest.java
@@ -46,7 +46,7 @@
 
     protected final static String DEFAULT_CONTEXT_HANDLE = "default";
 
-    protected static Map<String,Context> contextMap = new HashMap<String,Context>();
+    protected static Map<String, Context> contextMap = new HashMap<String, Context>();
     protected static Set<String> tableNames = new HashSet<String>();
 
     /**
@@ -59,7 +59,7 @@
         try {
             HBaseAdmin admin = new HBaseAdmin(getHbaseConf());
             HTableDescriptor tableDesc = new HTableDescriptor(tableName);
-            for(String family: families) {
+            for (String family : families) {
                 HColumnDescriptor columnDescriptor = new HColumnDescriptor(family);
                 tableDesc.addFamily(columnDescriptor);
             }
@@ -72,13 +72,13 @@
     }
 
     protected String newTableName(String prefix) {
-        String name =null;
+        String name = null;
         int tries = 100;
         do {
-            name = prefix+"_"+Math.abs(new Random().nextLong());
-        } while(tableNames.contains(name) && --tries > 0);
-        if(tableNames.contains(name))
-            throw new IllegalStateException("Couldn't find a unique table name, tableNames size: "+tableNames.size());
+            name = prefix + "_" + Math.abs(new Random().nextLong());
+        } while (tableNames.contains(name) && --tries > 0);
+        if (tableNames.contains(name))
+            throw new IllegalStateException("Couldn't find a unique table name, tableNames size: " + tableNames.size());
         tableNames.add(name);
         return name;
     }
@@ -89,8 +89,8 @@
      */
     @BeforeClass
     public static void setup() {
-        if(!contextMap.containsKey(getContextHandle()))
-            contextMap.put(getContextHandle(),new Context(getContextHandle()));
+        if (!contextMap.containsKey(getContextHandle()))
+            contextMap.put(getContextHandle(), new Context(getContextHandle()));
 
         contextMap.get(getContextHandle()).start();
     }
@@ -172,18 +172,18 @@
 
         public Context(String handle) {
             try {
-                testDir = new File(TEST_DIR+"/test_"+handle+"_"+Math.abs(new Random().nextLong())+"/").getCanonicalPath();
+                testDir = new File(TEST_DIR + "/test_" + handle + "_" + Math.abs(new Random().nextLong()) + "/").getCanonicalPath();
             } catch (IOException e) {
-                throw new IllegalStateException("Failed to generate testDir",e);
+                throw new IllegalStateException("Failed to generate testDir", e);
             }
-            System.out.println("Cluster work directory: "+testDir);
+            System.out.println("Cluster work directory: " + testDir);
         }
 
         public void start() {
-            if(usageCount++ == 0) {
-            	ManyMiniCluster.Builder b = ManyMiniCluster.create(new File(testDir));
+            if (usageCount++ == 0) {
+                ManyMiniCluster.Builder b = ManyMiniCluster.create(new File(testDir));
                 if (testConf != null) {
-                   b.hbaseConf(HBaseConfiguration.create(testConf));
+                    b.hbaseConf(HBaseConfiguration.create(testConf));
                 }
                 cluster = b.build();
                 cluster.start();
@@ -195,16 +195,16 @@
         }
 
         public void stop() {
-            if( --usageCount == 0)  {
+            if (--usageCount == 0) {
                 try {
                     cluster.stop();
                     cluster = null;
                 } finally {
-                    System.out.println("Trying to cleanup: "+testDir);
+                    System.out.println("Trying to cleanup: " + testDir);
                     try {
                         FileUtil.fullyDelete(new File(testDir));
                     } catch (IOException e) {
-                        throw new IllegalStateException("Failed to cleanup test dir",e);
+                        throw new IllegalStateException("Failed to cleanup test dir", e);
                     }
                 }
             }
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java
index a1faa0e..3875185 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseBulkOutputFormat.java
@@ -92,9 +92,9 @@
     public TestHBaseBulkOutputFormat() {
         allConf = getHiveConf();
         allConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         allConf.set(HiveConf.ConfVars.HADOOPFS.varname, getFileSystem().getUri().toString());
-        allConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, new Path(getTestDir(),"warehouse").toString());
+        allConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, new Path(getTestDir(), "warehouse").toString());
 
         //Add hbase properties
         for (Map.Entry<String, String> el : getHbaseConf())
@@ -103,8 +103,8 @@
             allConf.set(el.getKey(), el.getValue());
 
         HBaseConfiguration.merge(
-                allConf,
-                RevisionManagerConfiguration.create());
+            allConf,
+            RevisionManagerConfiguration.create());
         SessionState.start(new CliSessionState(allConf));
         hcatDriver = new HCatDriver();
     }
@@ -121,17 +121,17 @@
 
         @Override
         public void map(LongWritable key, Text value,
-                OutputCollector<ImmutableBytesWritable, Put> output,
-                Reporter reporter) throws IOException {
+                        OutputCollector<ImmutableBytesWritable, Put> output,
+                        Reporter reporter) throws IOException {
             String vals[] = value.toString().split(",");
             Put put = new Put(Bytes.toBytes(vals[0]));
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
                 put.add(Bytes.toBytes("my_family"),
-                        Bytes.toBytes(pair[0]),
-                        Bytes.toBytes(pair[1]));
+                    Bytes.toBytes(pair[0]),
+                    Bytes.toBytes(pair[1]));
             }
-            output.collect(new ImmutableBytesWritable(Bytes.toBytes(vals[0])),put);
+            output.collect(new ImmutableBytesWritable(Bytes.toBytes(vals[0])), put);
         }
 
     }
@@ -142,37 +142,37 @@
         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
             String vals[] = value.toString().split(",");
             Put put = new Put(Bytes.toBytes(vals[0]));
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
                 put.add(Bytes.toBytes("my_family"),
-                        Bytes.toBytes(pair[0]),
-                        Bytes.toBytes(pair[1]));
+                    Bytes.toBytes(pair[0]),
+                    Bytes.toBytes(pair[1]));
             }
-            context.write(new ImmutableBytesWritable(Bytes.toBytes(vals[0])),put);
+            context.write(new ImmutableBytesWritable(Bytes.toBytes(vals[0])), put);
         }
     }
 
     public static class MapHCatWrite extends Mapper<LongWritable, Text, BytesWritable, HCatRecord> {
         @Override
         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
-            OutputJobInfo jobInfo = (OutputJobInfo)HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+            OutputJobInfo jobInfo = (OutputJobInfo) HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
             HCatRecord record = new DefaultHCatRecord(3);
             HCatSchema schema = jobInfo.getOutputSchema();
             String vals[] = value.toString().split(",");
-            record.setInteger("key",schema,Integer.parseInt(vals[0]));
-            for(int i=1;i<vals.length;i++) {
+            record.setInteger("key", schema, Integer.parseInt(vals[0]));
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                record.set(pair[0],schema,pair[1]);
+                record.set(pair[0], schema, pair[1]);
             }
-            context.write(null,record);
+            context.write(null, record);
         }
     }
 
     @Test
     public void hbaseBulkOutputFormatTest() throws IOException, ClassNotFoundException, InterruptedException {
         String testName = "hbaseBulkOutputFormatTest";
-        Path methodTestDir = new Path(getTestDir(),testName);
-        LOG.info("starting: "+testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
+        LOG.info("starting: " + testName);
 
         String tableName = newTableName(testName).toLowerCase();
         String familyName = "my_family";
@@ -186,21 +186,20 @@
         createTable(tableName, new String[]{familyName});
 
         String data[] = {"1,english:one,spanish:uno",
-                               "2,english:two,spanish:dos",
-                               "3,english:three,spanish:tres"};
-
+            "2,english:two,spanish:dos",
+            "3,english:three,spanish:tres"};
 
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
-        FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile.txt"));
-        for(String line: data)
+        Path inputPath = new Path(methodTestDir, "mr_input");
+        FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile.txt"));
+        for (String line : data)
             os.write(Bytes.toBytes(line + "\n"));
         os.close();
-        Path interPath = new Path(methodTestDir,"inter");
+        Path interPath = new Path(methodTestDir, "inter");
         //create job
         JobConf job = new JobConf(conf);
-        job.setWorkingDirectory(new Path(methodTestDir,"mr_work"));
+        job.setWorkingDirectory(new Path(methodTestDir, "mr_work"));
         job.setJarByClass(this.getClass());
         job.setMapperClass(MapWriteOldMapper.class);
 
@@ -217,9 +216,9 @@
             OutputJobInfo outputJobInfo = OutputJobInfo.create("default", tableName, null);
             Transaction txn = rm.beginWriteTransaction(tableName, Arrays.asList(familyName));
             outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,
-                                                      HCatUtil.serialize(txn));
+                HCatUtil.serialize(txn));
             job.set(HCatConstants.HCAT_KEY_OUTPUT_INFO,
-                                       HCatUtil.serialize(outputJobInfo));
+                HCatUtil.serialize(outputJobInfo));
         } finally {
             rm.close();
         }
@@ -241,18 +240,18 @@
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
             }
             index++;
         }
         //test if load count is the same
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
         //test if scratch directory was erased
         assertFalse(FileSystem.get(job).exists(interPath));
     }
@@ -260,8 +259,8 @@
     @Test
     public void importSequenceFileTest() throws IOException, ClassNotFoundException, InterruptedException {
         String testName = "importSequenceFileTest";
-        Path methodTestDir = new Path(getTestDir(),testName);
-        LOG.info("starting: "+testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
+        LOG.info("starting: " + testName);
 
         String tableName = newTableName(testName).toLowerCase();
         String familyName = "my_family";
@@ -271,28 +270,27 @@
         Configuration conf = new Configuration(allConf);
 
         //create table
-        createTable(tableName,new String[]{familyName});
+        createTable(tableName, new String[]{familyName});
 
         String data[] = {"1,english:one,spanish:uno",
-                               "2,english:two,spanish:dos",
-                               "3,english:three,spanish:tres"};
-
+            "2,english:two,spanish:dos",
+            "3,english:three,spanish:tres"};
 
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
+        Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
-        FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile.txt"));
-        for(String line: data)
+        FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile.txt"));
+        for (String line : data)
             os.write(Bytes.toBytes(line + "\n"));
         os.close();
-        Path interPath = new Path(methodTestDir,"inter");
-        Path scratchPath = new Path(methodTestDir,"scratch");
+        Path interPath = new Path(methodTestDir, "inter");
+        Path scratchPath = new Path(methodTestDir, "scratch");
 
 
         //create job
         Job job = new Job(conf, testName);
-        job.setWorkingDirectory(new Path(methodTestDir,"mr_work"));
+        job.setWorkingDirectory(new Path(methodTestDir, "mr_work"));
         job.setJarByClass(this.getClass());
         job.setMapperClass(MapWrite.class);
 
@@ -300,7 +298,7 @@
         TextInputFormat.setInputPaths(job, inputPath);
 
         job.setOutputFormatClass(SequenceFileOutputFormat.class);
-        SequenceFileOutputFormat.setOutputPath(job,interPath);
+        SequenceFileOutputFormat.setOutputPath(job, interPath);
 
         job.setMapOutputKeyClass(ImmutableBytesWritable.class);
         job.setMapOutputValueClass(Put.class);
@@ -311,7 +309,7 @@
         job.setNumReduceTasks(0);
         assertTrue(job.waitForCompletion(true));
 
-        job = new Job(new Configuration(allConf),testName+"_importer");
+        job = new Job(new Configuration(allConf), testName + "_importer");
         assertTrue(ImportSequenceFile.runJob(job, tableName, interPath, scratchPath));
 
         //verify
@@ -319,18 +317,18 @@
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
             }
             index++;
         }
         //test if load count is the same
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
         //test if scratch directory was erased
         assertFalse(FileSystem.get(job.getConfiguration()).exists(scratchPath));
     }
@@ -338,11 +336,11 @@
     @Test
     public void bulkModeHCatOutputFormatTest() throws Exception {
         String testName = "bulkModeHCatOutputFormatTest";
-        Path methodTestDir = new Path(getTestDir(),testName);
-        LOG.info("starting: "+testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
+        LOG.info("starting: " + testName);
 
         String databaseName = testName.toLowerCase();
-        String dbDir = new Path(methodTestDir,"DB_"+testName).toString();
+        String dbDir = new Path(methodTestDir, "DB_" + testName).toString();
         String tableName = newTableName(testName).toLowerCase();
         String familyName = "my_family";
         byte[] familyNameBytes = Bytes.toBytes(familyName);
@@ -355,31 +353,31 @@
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '" + dbDir + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName +
-                              "(key int, english string, spanish string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
-                              "TBLPROPERTIES ('"+HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY+"'='true',"+
-                              "'hbase.columns.mapping'=':key,"+familyName+":english,"+familyName+":spanish')" ;
+            "(key int, english string, spanish string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
+            "TBLPROPERTIES ('" + HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY + "'='true'," +
+            "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName + ":spanish')";
 
         assertEquals(0, hcatDriver.run(dbquery).getResponseCode());
         assertEquals(0, hcatDriver.run(tableQuery).getResponseCode());
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                               "2,english:TWO,spanish:DOS",
-                               "3,english:THREE,spanish:TRES"};
+            "2,english:TWO,spanish:DOS",
+            "3,english:THREE,spanish:TRES"};
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
+        Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
         //create multiple files so we can test with multiple mappers
-        for(int i=0;i<data.length;i++) {
-            FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile"+i+".txt"));
+        for (int i = 0; i < data.length; i++) {
+            FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile" + i + ".txt"));
             os.write(Bytes.toBytes(data[i] + "\n"));
             os.close();
         }
 
         //create job
-        Job job = new Job(conf,testName);
-        job.setWorkingDirectory(new Path(methodTestDir,"mr_work"));
+        Job job = new Job(conf, testName);
+        job.setWorkingDirectory(new Path(methodTestDir, "mr_work"));
         job.setJarByClass(this.getClass());
         job.setMapperClass(MapHCatWrite.class);
 
@@ -388,8 +386,8 @@
 
 
         job.setOutputFormatClass(HCatOutputFormat.class);
-        OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName,tableName,null);
-        HCatOutputFormat.setOutput(job,outputJobInfo);
+        OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName, tableName, null);
+        HCatOutputFormat.setOutput(job, outputJobInfo);
 
         job.setMapOutputKeyClass(BytesWritable.class);
         job.setMapOutputValueClass(HCatRecord.class);
@@ -402,41 +400,41 @@
         assertTrue(job.waitForCompletion(true));
         RevisionManager rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(conf);
         try {
-            TableSnapshot snapshot = rm.createSnapshot(databaseName+"."+tableName);
-            for(String el: snapshot.getColumnFamilies()) {
-                assertEquals(1,snapshot.getRevision(el));
+            TableSnapshot snapshot = rm.createSnapshot(databaseName + "." + tableName);
+            for (String el : snapshot.getColumnFamilies()) {
+                assertEquals(1, snapshot.getRevision(el));
             }
         } finally {
             rm.close();
         }
 
         //verify
-        HTable table = new HTable(conf, databaseName+"."+tableName);
+        HTable table = new HTable(conf, databaseName + "." + tableName);
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
-                assertEquals(1l,result.getColumn(familyNameBytes,Bytes.toBytes(pair[0])).get(0).getTimestamp());
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
+                assertEquals(1l, result.getColumn(familyNameBytes, Bytes.toBytes(pair[0])).get(0).getTimestamp());
             }
             index++;
         }
         //test if load count is the same
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
     }
 
     @Test
     public void bulkModeHCatOutputFormatTestWithDefaultDB() throws Exception {
         String testName = "bulkModeHCatOutputFormatTestWithDefaultDB";
-        Path methodTestDir = new Path(getTestDir(),testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
 
         String databaseName = "default";
-        String dbDir = new Path(methodTestDir,"DB_"+testName).toString();
+        String dbDir = new Path(methodTestDir, "DB_" + testName).toString();
         String tableName = newTableName(testName).toLowerCase();
         String familyName = "my_family";
         byte[] familyNameBytes = Bytes.toBytes(familyName);
@@ -449,29 +447,29 @@
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '" + dbDir + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName +
-                              "(key int, english string, spanish string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
-                              "TBLPROPERTIES ('"+HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY+"'='true',"+
-                              "'hbase.columns.mapping'=':key,"+familyName+":english,"+familyName+":spanish')" ;
+            "(key int, english string, spanish string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
+            "TBLPROPERTIES ('" + HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY + "'='true'," +
+            "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName + ":spanish')";
 
         assertEquals(0, hcatDriver.run(dbquery).getResponseCode());
         assertEquals(0, hcatDriver.run(tableQuery).getResponseCode());
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                               "2,english:TWO,spanish:DOS",
-                               "3,english:THREE,spanish:TRES"};
+            "2,english:TWO,spanish:DOS",
+            "3,english:THREE,spanish:TRES"};
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
+        Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
-        FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile.txt"));
-        for(String line: data)
+        FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile.txt"));
+        for (String line : data)
             os.write(Bytes.toBytes(line + "\n"));
         os.close();
 
         //create job
-        Job job = new Job(conf,testName);
-        job.setWorkingDirectory(new Path(methodTestDir,"mr_work"));
+        Job job = new Job(conf, testName);
+        job.setWorkingDirectory(new Path(methodTestDir, "mr_work"));
         job.setJarByClass(this.getClass());
         job.setMapperClass(MapHCatWrite.class);
 
@@ -480,8 +478,8 @@
 
 
         job.setOutputFormatClass(HCatOutputFormat.class);
-        OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName,tableName,null);
-        HCatOutputFormat.setOutput(job,outputJobInfo);
+        OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName, tableName, null);
+        HCatOutputFormat.setOutput(job, outputJobInfo);
 
         job.setMapOutputKeyClass(BytesWritable.class);
         job.setMapOutputValueClass(HCatRecord.class);
@@ -498,18 +496,18 @@
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
             }
             index++;
         }
         //test if load count is the same
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
     }
 
     @Test
@@ -526,37 +524,37 @@
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF, HCatUtil.serialize(allConf.getAllProperties()));
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '" + dbDir
-                + "'";
+            + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName +
-                "(key int, english string, spanish string) STORED BY " +
-                "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
-                "TBLPROPERTIES ('" + HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY + "'='true'," +
-                "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName
-                + ":spanish')";
+            "(key int, english string, spanish string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
+            "TBLPROPERTIES ('" + HBaseConstants.PROPERTY_BULK_OUTPUT_MODE_KEY + "'='true'," +
+            "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName
+            + ":spanish')";
 
         assertEquals(0, hcatDriver.run(dbquery).getResponseCode());
         assertEquals(0, hcatDriver.run(tableQuery).getResponseCode());
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                "2,english:TWO,spanish:DOS",
-                "3,english:THREE,spanish:TRES"};
+            "2,english:TWO,spanish:DOS",
+            "3,english:THREE,spanish:TRES"};
 
         Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
         // create multiple files so we can test with multiple mappers
         for (int i = 0; i < data.length; i++) {
             FSDataOutputStream os = getFileSystem().create(
-                    new Path(inputPath, "inputFile" + i + ".txt"));
+                new Path(inputPath, "inputFile" + i + ".txt"));
             os.write(Bytes.toBytes(data[i] + "\n"));
             os.close();
         }
 
         Path workingDir = new Path(methodTestDir, "mr_abort");
         OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName,
-                tableName, null);
+            tableName, null);
         Job job = configureJob(testName,
-                conf, workingDir, MapWriteAbortTransaction.class,
-                outputJobInfo, inputPath);
+            conf, workingDir, MapWriteAbortTransaction.class,
+            outputJobInfo, inputPath);
         assertFalse(job.waitForCompletion(true));
 
         // verify that revision manager has it as aborted transaction
@@ -566,7 +564,7 @@
             for (String family : snapshot.getColumnFamilies()) {
                 assertEquals(1, snapshot.getRevision(family));
                 List<FamilyRevision> abortedWriteTransactions = rm.getAbortedWriteTransactions(
-                        databaseName + "." + tableName, family);
+                    databaseName + "." + tableName, family);
                 assertEquals(1, abortedWriteTransactions.size());
                 assertEquals(1, abortedWriteTransactions.get(0).getRevision());
             }
@@ -585,7 +583,7 @@
 
         // verify that the storage handler input format returns empty results.
         Path outputDir = new Path(getTestDir(),
-                "mapred/testHBaseTableBulkIgnoreAbortedTransactions");
+            "mapred/testHBaseTableBulkIgnoreAbortedTransactions");
         FileSystem fs = getFileSystem();
         if (fs.exists(outputDir)) {
             fs.delete(outputDir, true);
@@ -595,7 +593,7 @@
         job.setMapperClass(MapReadAbortedTransaction.class);
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(databaseName,
-                tableName, null);
+            tableName, null);
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, outputDir);
@@ -608,8 +606,8 @@
     }
 
     private Job configureJob(String jobName, Configuration conf,
-            Path workingDir, Class<? extends Mapper> mapperClass,
-            OutputJobInfo outputJobInfo, Path inputPath) throws IOException {
+                             Path workingDir, Class<? extends Mapper> mapperClass,
+                             OutputJobInfo outputJobInfo, Path inputPath) throws IOException {
         Job job = new Job(conf, jobName);
         job.setWorkingDirectory(workingDir);
         job.setJarByClass(this.getClass());
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java
index 349e1db..81a3099 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseDirectOutputFormat.java
@@ -86,9 +86,9 @@
     public TestHBaseDirectOutputFormat() {
         allConf = getHiveConf();
         allConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         allConf.set(HiveConf.ConfVars.HADOOPFS.varname, getFileSystem().getUri().toString());
-        allConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, new Path(getTestDir(),"warehouse").toString());
+        allConf.set(HiveConf.ConfVars.METASTOREWAREHOUSE.varname, new Path(getTestDir(), "warehouse").toString());
 
         //Add hbase properties
         for (Map.Entry<String, String> el : getHbaseConf())
@@ -96,8 +96,8 @@
         for (Map.Entry<String, String> el : getJobConf())
             allConf.set(el.getKey(), el.getValue());
         HBaseConfiguration.merge(
-                allConf,
-                RevisionManagerConfiguration.create());
+            allConf,
+            RevisionManagerConfiguration.create());
         SessionState.start(new CliSessionState(allConf));
         hcatDriver = new HCatDriver();
     }
@@ -105,7 +105,7 @@
     @Test
     public void directOutputFormatTest() throws IOException, ClassNotFoundException, InterruptedException {
         String testName = "directOutputFormatTest";
-        Path methodTestDir = new Path(getTestDir(),testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
 
         String tableName = newTableName(testName).toLowerCase();
         String familyName = "my_family";
@@ -116,26 +116,25 @@
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF, HCatUtil.serialize(allConf.getAllProperties()));
 
         //create table
-        createTable(tableName,new String[]{familyName});
+        createTable(tableName, new String[]{familyName});
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                "2,english:ONE,spanish:DOS",
-                "3,english:ONE,spanish:TRES"};
-
+            "2,english:ONE,spanish:DOS",
+            "3,english:ONE,spanish:TRES"};
 
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
+        Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
-        FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile.txt"));
-        for(String line: data)
+        FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile.txt"));
+        for (String line : data)
             os.write(Bytes.toBytes(line + "\n"));
         os.close();
 
         //create job
         JobConf job = new JobConf(conf);
         job.setJobName(testName);
-        job.setWorkingDirectory(new Path(methodTestDir,"mr_work"));
+        job.setWorkingDirectory(new Path(methodTestDir, "mr_work"));
         job.setJarByClass(this.getClass());
         job.setMapperClass(MapWrite.class);
 
@@ -152,9 +151,9 @@
             OutputJobInfo outputJobInfo = OutputJobInfo.create("default", tableName, null);
             Transaction txn = rm.beginWriteTransaction(tableName, Arrays.asList(familyName));
             outputJobInfo.getProperties().setProperty(HBaseConstants.PROPERTY_WRITE_TXN_KEY,
-                                                      HCatUtil.serialize(txn));
+                HCatUtil.serialize(txn));
             job.set(HCatConstants.HCAT_KEY_OUTPUT_INFO,
-                                       HCatUtil.serialize(outputJobInfo));
+                HCatUtil.serialize(outputJobInfo));
         } finally {
             rm.close();
         }
@@ -174,26 +173,26 @@
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
             }
             index++;
         }
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
     }
 
     @Test
     public void directHCatOutputFormatTest() throws Exception {
         String testName = "directHCatOutputFormatTest";
-        Path methodTestDir = new Path(getTestDir(),testName);
+        Path methodTestDir = new Path(getTestDir(), testName);
 
         String databaseName = testName;
-        String dbDir = new Path(methodTestDir,"DB_"+testName).toString();
+        String dbDir = new Path(methodTestDir, "DB_" + testName).toString();
         String tableName = newTableName(testName);
         String familyName = "my_family";
         byte[] familyNameBytes = Bytes.toBytes(familyName);
@@ -207,24 +206,24 @@
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '" + dbDir + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName +
-                              "(key int, english string, spanish string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
-                              "TBLPROPERTIES (" +
-                              "'hbase.columns.mapping'=':key,"+familyName+":english,"+familyName+":spanish')" ;
+            "(key int, english string, spanish string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
+            "TBLPROPERTIES (" +
+            "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName + ":spanish')";
 
         assertEquals(0, hcatDriver.run(dbquery).getResponseCode());
         assertEquals(0, hcatDriver.run(tableQuery).getResponseCode());
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                               "2,english:ONE,spanish:DOS",
-                               "3,english:ONE,spanish:TRES"};
+            "2,english:ONE,spanish:DOS",
+            "3,english:ONE,spanish:TRES"};
 
         // input/output settings
-        Path inputPath = new Path(methodTestDir,"mr_input");
+        Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
         //create multiple files so we can test with multiple mappers
-        for(int i=0;i<data.length;i++) {
-            FSDataOutputStream os = getFileSystem().create(new Path(inputPath,"inputFile"+i+".txt"));
+        for (int i = 0; i < data.length; i++) {
+            FSDataOutputStream os = getFileSystem().create(new Path(inputPath, "inputFile" + i + ".txt"));
             os.write(Bytes.toBytes(data[i] + "\n"));
             os.close();
         }
@@ -232,16 +231,16 @@
         //create job
         Path workingDir = new Path(methodTestDir, "mr_work");
         OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName,
-                tableName, null);
+            tableName, null);
         Job job = configureJob(testName, conf, workingDir, MapHCatWrite.class,
-                outputJobInfo, inputPath);
+            outputJobInfo, inputPath);
         assertTrue(job.waitForCompletion(true));
 
         RevisionManager rm = HBaseRevisionManagerUtil.getOpenedRevisionManager(conf);
         try {
             TableSnapshot snapshot = rm.createSnapshot(hbaseTableName);
-            for(String el: snapshot.getColumnFamilies()) {
-                assertEquals(1,snapshot.getRevision(el));
+            for (String el : snapshot.getColumnFamilies()) {
+                assertEquals(1, snapshot.getRevision(el));
             }
         } finally {
             rm.close();
@@ -252,18 +251,18 @@
         Scan scan = new Scan();
         scan.addFamily(familyNameBytes);
         ResultScanner scanner = table.getScanner(scan);
-        int index=0;
-        for(Result result: scanner) {
+        int index = 0;
+        for (Result result : scanner) {
             String vals[] = data[index].toString().split(",");
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                assertTrue(result.containsColumn(familyNameBytes,Bytes.toBytes(pair[0])));
-                assertEquals(pair[1],Bytes.toString(result.getValue(familyNameBytes,Bytes.toBytes(pair[0]))));
-                assertEquals(1l,result.getColumn(familyNameBytes,Bytes.toBytes(pair[0])).get(0).getTimestamp());
+                assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
+                assertEquals(pair[1], Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
+                assertEquals(1l, result.getColumn(familyNameBytes, Bytes.toBytes(pair[0])).get(0).getTimestamp());
             }
             index++;
         }
-        assertEquals(data.length,index);
+        assertEquals(data.length, index);
     }
 
     @Test
@@ -283,36 +282,36 @@
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF, HCatUtil.serialize(allConf.getAllProperties()));
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '" + dbDir
-                + "'";
+            + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName +
-                "(key int, english string, spanish string) STORED BY " +
-                "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
-                "TBLPROPERTIES (" +
-                "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName +
-                ":spanish','hbase.table.name'='"+ hbaseTableName +"')";
+            "(key int, english string, spanish string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'" +
+            "TBLPROPERTIES (" +
+            "'hbase.columns.mapping'=':key," + familyName + ":english," + familyName +
+            ":spanish','hbase.table.name'='" + hbaseTableName + "')";
 
         assertEquals(0, hcatDriver.run(dbquery).getResponseCode());
         assertEquals(0, hcatDriver.run(tableQuery).getResponseCode());
 
         String data[] = {"1,english:ONE,spanish:UNO",
-                "2,english:TWO,spanish:DOS",
-                "3,english:THREE,spanish:TRES"};
+            "2,english:TWO,spanish:DOS",
+            "3,english:THREE,spanish:TRES"};
 
         Path inputPath = new Path(methodTestDir, "mr_input");
         getFileSystem().mkdirs(inputPath);
         // create multiple files so we can test with multiple mappers
         for (int i = 0; i < data.length; i++) {
             FSDataOutputStream os = getFileSystem().create(
-                    new Path(inputPath, "inputFile" + i + ".txt"));
+                new Path(inputPath, "inputFile" + i + ".txt"));
             os.write(Bytes.toBytes(data[i] + "\n"));
             os.close();
         }
 
         Path workingDir = new Path(methodTestDir, "mr_abort");
         OutputJobInfo outputJobInfo = OutputJobInfo.create(databaseName,
-                tableName, null);
+            tableName, null);
         Job job = configureJob(testName, conf, workingDir, MapWriteAbortTransaction.class,
-                outputJobInfo, inputPath);
+            outputJobInfo, inputPath);
         assertFalse(job.waitForCompletion(true));
 
         // verify that revision manager has it as aborted transaction
@@ -322,7 +321,7 @@
             for (String family : snapshot.getColumnFamilies()) {
                 assertEquals(1, snapshot.getRevision(family));
                 List<FamilyRevision> abortedWriteTransactions = rm.getAbortedWriteTransactions(
-                        hbaseTableName, family);
+                    hbaseTableName, family);
                 assertEquals(1, abortedWriteTransactions.size());
                 assertEquals(1, abortedWriteTransactions.get(0).getRevision());
             }
@@ -339,15 +338,15 @@
         for (Result result : scanner) {
             String key = Bytes.toString(result.getRow());
             assertNotSame(MapWriteAbortTransaction.failedKey, key);
-            int index = Integer.parseInt(key)-1;
+            int index = Integer.parseInt(key) - 1;
             String vals[] = data[index].toString().split(",");
             for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
                 assertTrue(result.containsColumn(familyNameBytes, Bytes.toBytes(pair[0])));
                 assertEquals(pair[1],
-                        Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
+                    Bytes.toString(result.getValue(familyNameBytes, Bytes.toBytes(pair[0]))));
                 assertEquals(1l, result.getColumn(familyNameBytes, Bytes.toBytes(pair[0])).get(0)
-                        .getTimestamp());
+                    .getTimestamp());
             }
             count++;
         }
@@ -355,7 +354,7 @@
 
         // verify that the inputformat returns empty results.
         Path outputDir = new Path(getTestDir(),
-                "mapred/testHBaseTableIgnoreAbortedTransactions");
+            "mapred/testHBaseTableIgnoreAbortedTransactions");
         FileSystem fs = getFileSystem();
         if (fs.exists(outputDir)) {
             fs.delete(outputDir, true);
@@ -365,7 +364,7 @@
         job.setMapperClass(MapReadAbortedTransaction.class);
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(databaseName,
-                tableName, null);
+            tableName, null);
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, outputDir);
@@ -378,8 +377,8 @@
     }
 
     private Job configureJob(String jobName, Configuration conf,
-            Path workingDir, Class<? extends Mapper> mapperClass,
-            OutputJobInfo outputJobInfo, Path inputPath) throws IOException {
+                             Path workingDir, Class<? extends Mapper> mapperClass,
+                             OutputJobInfo outputJobInfo, Path inputPath) throws IOException {
         Job job = new Job(conf, jobName);
         job.setWorkingDirectory(workingDir);
         job.setJarByClass(this.getClass());
@@ -409,16 +408,16 @@
 
         @Override
         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
-            OutputJobInfo jobInfo = (OutputJobInfo)HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+            OutputJobInfo jobInfo = (OutputJobInfo) HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
             HCatRecord record = new DefaultHCatRecord(3);
             HCatSchema schema = jobInfo.getOutputSchema();
             String vals[] = value.toString().split(",");
-            record.setInteger("key",schema,Integer.parseInt(vals[0]));
-            for(int i=1;i<vals.length;i++) {
+            record.setInteger("key", schema, Integer.parseInt(vals[0]));
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
-                record.set(pair[0],schema,pair[1]);
+                record.set(pair[0], schema, pair[1]);
             }
-            context.write(null,record);
+            context.write(null, record);
         }
     }
 
@@ -434,15 +433,15 @@
 
         @Override
         public void map(LongWritable key, Text value,
-                OutputCollector<BytesWritable, Put> output, Reporter reporter)
-                throws IOException {
+                        OutputCollector<BytesWritable, Put> output, Reporter reporter)
+            throws IOException {
             String vals[] = value.toString().split(",");
             Put put = new Put(Bytes.toBytes(vals[0]));
-            for(int i=1;i<vals.length;i++) {
+            for (int i = 1; i < vals.length; i++) {
                 String pair[] = vals[i].split(":");
                 put.add(Bytes.toBytes("my_family"),
-                        Bytes.toBytes(pair[0]),
-                        Bytes.toBytes(pair[1]));
+                    Bytes.toBytes(pair[0]),
+                    Bytes.toBytes(pair[1]));
             }
             output.collect(null, put);
         }
@@ -454,7 +453,7 @@
 
         @Override
         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
-            OutputJobInfo jobInfo = (OutputJobInfo)HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
+            OutputJobInfo jobInfo = (OutputJobInfo) HCatUtil.deserialize(context.getConfiguration().get(HCatConstants.HCAT_KEY_OUTPUT_INFO));
             HCatRecord record = new DefaultHCatRecord(3);
             HCatSchema schema = jobInfo.getOutputSchema();
             String vals[] = value.toString().split(",");
@@ -477,18 +476,18 @@
     }
 
     static class MapReadAbortedTransaction
-            extends
-            Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
+        extends
+        Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
 
         @Override
         public void run(Context context) throws IOException,
-                InterruptedException {
+            InterruptedException {
             setup(context);
             if (context.nextKeyValue()) {
                 map(context.getCurrentKey(), context.getCurrentValue(), context);
                 while (context.nextKeyValue()) {
                     map(context.getCurrentKey(), context.getCurrentValue(),
-                            context);
+                        context);
                 }
                 throw new IOException("There should have been no records");
             }
@@ -497,7 +496,7 @@
 
         @Override
         public void map(ImmutableBytesWritable key, HCatRecord value,
-                Context context) throws IOException, InterruptedException {
+                        Context context) throws IOException, InterruptedException {
             System.out.println("HCat record value" + value.toString());
         }
     }
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java
index 9dfbc84..78724a1 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestHBaseInputFormat.java
@@ -76,19 +76,19 @@
 
 public class TestHBaseInputFormat extends SkeletonHBaseTest {
 
-    private static HiveConf   hcatConf;
+    private static HiveConf hcatConf;
     private static HCatDriver hcatDriver;
-    private final byte[] FAMILY     = Bytes.toBytes("testFamily");
+    private final byte[] FAMILY = Bytes.toBytes("testFamily");
     private final byte[] QUALIFIER1 = Bytes.toBytes("testQualifier1");
     private final byte[] QUALIFIER2 = Bytes.toBytes("testQualifier2");
 
-   public TestHBaseInputFormat() throws Exception {
+    public TestHBaseInputFormat() throws Exception {
         hcatConf = getHiveConf();
         hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         URI fsuri = getFileSystem().getUri();
         Path whPath = new Path(fsuri.getScheme(), fsuri.getAuthority(),
-                getTestDir());
+            getTestDir());
         hcatConf.set(HiveConf.ConfVars.HADOOPFS.varname, fsuri.toString());
         hcatConf.set(ConfVars.METASTOREWAREHOUSE.varname, whPath.toString());
 
@@ -100,7 +100,7 @@
             }
         }
         HBaseConfiguration.merge(hcatConf,
-               RevisionManagerConfiguration.create());
+            RevisionManagerConfiguration.create());
 
 
         SessionState.start(new CliSessionState(hcatConf));
@@ -123,7 +123,7 @@
                 put.add(FAMILY, QUALIFIER2, i, Bytes.toBytes("textValue-" + i));
                 myPuts.add(put);
                 Transaction tsx = rm.beginWriteTransaction(tableName,
-                        columnFamilies);
+                    columnFamilies);
                 rm.commitWriteTransaction(tsx);
             }
         } finally {
@@ -134,14 +134,14 @@
         return myPuts;
     }
 
-   private void populateHBaseTable(String tName, int revisions) throws IOException {
+    private void populateHBaseTable(String tName, int revisions) throws IOException {
         List<Put> myPuts = generatePuts(revisions, tName);
         HTable table = new HTable(getHbaseConf(), Bytes.toBytes(tName));
         table.put(myPuts);
     }
 
     private long populateHBaseTableQualifier1(String tName, int value, Boolean commit)
-            throws IOException {
+        throws IOException {
         List<String> columnFamilies = Arrays.asList("testFamily");
         RevisionManager rm = null;
         List<Put> myPuts = new ArrayList<Put>();
@@ -154,7 +154,7 @@
             Put put = new Put(Bytes.toBytes("testRow"));
             revision = tsx.getRevisionNumber();
             put.add(FAMILY, QUALIFIER1, revision,
-                    Bytes.toBytes("textValue-" + value));
+                Bytes.toBytes("textValue-" + value));
             myPuts.add(put);
 
             // If commit is null it is left as a running transaction
@@ -183,11 +183,11 @@
         String db_dir = getTestDir() + "/hbasedb";
 
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '"
-                            + db_dir + "'";
+            + db_dir + "'";
         String tableQuery = "CREATE TABLE " + databaseName + "." + tableName
-                              + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'=':key,testFamily:testQualifier1,testFamily:testQualifier2')" ;
+            + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key,testFamily:testQualifier1,testFamily:testQualifier2')";
 
         CommandProcessorResponse responseOne = hcatDriver.run(dbquery);
         assertEquals(0, responseOne.getResponseCode());
@@ -201,7 +201,7 @@
         populateHBaseTable(hbaseTableName, 5);
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
 
         // output settings
         Path outputDir = new Path(getTestDir(), "mapred/testHbaseTableMRRead");
@@ -217,7 +217,7 @@
 
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(databaseName, tableName,
-                null);
+            null);
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, outputDir);
@@ -232,7 +232,7 @@
         assertFalse(MapReadHTable.error);
         assertEquals(MapReadHTable.count, 1);
 
-        String dropTableQuery = "DROP TABLE " + hbaseTableName ;
+        String dropTableQuery = "DROP TABLE " + hbaseTableName;
         CommandProcessorResponse responseThree = hcatDriver.run(dropTableQuery);
         assertEquals(0, responseThree.getResponseCode());
 
@@ -251,11 +251,11 @@
         //Table name as specified by hbase.table.name property
         String hbaseTableName = "MyDB_" + tableName;
         String tableQuery = "CREATE TABLE " + tableName
-                              + "(key string, testqualifier1 string, testqualifier2 string) STORED BY "
-                              + "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'="
-                              + "':key,testFamily:testQualifier1,testFamily:testQualifier2',"
-                              + "'hbase.table.name'='" + hbaseTableName+ "')" ;
+            + "(key string, testqualifier1 string, testqualifier2 string) STORED BY "
+            + "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'="
+            + "':key,testFamily:testQualifier1,testFamily:testQualifier2',"
+            + "'hbase.table.name'='" + hbaseTableName + "')";
 
         CommandProcessorResponse responseTwo = hcatDriver.run(tableQuery);
         assertEquals(0, responseTwo.getResponseCode());
@@ -268,7 +268,7 @@
 
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
 
         // output settings
         Path outputDir = new Path(getTestDir(), "mapred/testHBaseTableProjectionReadMR");
@@ -282,7 +282,7 @@
         job.setMapperClass(MapReadProjHTable.class);
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(
-                MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
+            MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
         HCatInputFormat.setOutputSchema(job, getProjectionSchema());
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
@@ -296,7 +296,7 @@
         assertFalse(MapReadProjHTable.error);
         assertEquals(MapReadProjHTable.count, 1);
 
-        String dropTableQuery = "DROP TABLE " + tableName ;
+        String dropTableQuery = "DROP TABLE " + tableName;
         CommandProcessorResponse responseThree = hcatDriver.run(dropTableQuery);
         assertEquals(0, responseThree.getResponseCode());
 
@@ -309,10 +309,10 @@
 
         String tableName = newTableName("mytable");
         String tableQuery = "CREATE TABLE " + tableName
-                              + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
-                                    "testFamily:testQualifier1,testFamily:testQualifier2')" ;
+            + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
+            "testFamily:testQualifier1,testFamily:testQualifier2')";
 
         CommandProcessorResponse responseTwo = hcatDriver.run(tableQuery);
         assertEquals(0, responseTwo.getResponseCode());
@@ -325,7 +325,7 @@
 
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
 
         // output settings
         Path outputDir = new Path(getTestDir(), "mapred/testHBaseTableProjectionReadMR");
@@ -341,7 +341,7 @@
         job.setInputFormat(HBaseInputFormat.class);
 
         InputJobInfo inputJobInfo = InputJobInfo.create(
-                MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
+            MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
         //Configure projection schema
         job.set(HCatConstants.HCAT_KEY_OUTPUT_SCHEMA, HCatUtil.serialize(getProjectionSchema()));
         Job newJob = new Job(job);
@@ -369,7 +369,7 @@
         assertFalse(MapReadProjHTable.error);
         assertEquals(MapReadProjHTable.count, 1);
 
-        String dropTableQuery = "DROP TABLE " + tableName ;
+        String dropTableQuery = "DROP TABLE " + tableName;
         CommandProcessorResponse responseThree = hcatDriver.run(dropTableQuery);
         assertEquals(0, responseThree.getResponseCode());
 
@@ -381,10 +381,10 @@
     public void TestHBaseTableIgnoreAbortedTransactions() throws Exception {
         String tableName = newTableName("mytable");
         String tableQuery = "CREATE TABLE " + tableName
-                              + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
-                                    "testFamily:testQualifier1,testFamily:testQualifier2')" ;
+            + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
+            "testFamily:testQualifier1,testFamily:testQualifier2')";
 
         CommandProcessorResponse responseTwo = hcatDriver.run(tableQuery);
         assertEquals(0, responseTwo.getResponseCode());
@@ -399,7 +399,7 @@
 
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
 
         Path outputDir = new Path(getTestDir(), "mapred/testHBaseTableIgnoreAbortedTransactions");
         FileSystem fs = getFileSystem();
@@ -412,7 +412,7 @@
         MapReadHTable.resetCounters();
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(
-                MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
+            MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, outputDir);
@@ -428,7 +428,7 @@
         assertFalse(MapReadHTable.error);
         assertEquals(1, MapReadHTable.count);
 
-        String dropTableQuery = "DROP TABLE " + tableName ;
+        String dropTableQuery = "DROP TABLE " + tableName;
         CommandProcessorResponse responseThree = hcatDriver.run(dropTableQuery);
         assertEquals(0, responseThree.getResponseCode());
 
@@ -440,10 +440,10 @@
     public void TestHBaseTableIgnoreAbortedAndRunningTransactions() throws Exception {
         String tableName = newTableName("mytable");
         String tableQuery = "CREATE TABLE " + tableName
-                              + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
-                                    "testFamily:testQualifier1,testFamily:testQualifier2')" ;
+            + "(key string, testqualifier1 string, testqualifier2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key," +
+            "testFamily:testQualifier1,testFamily:testQualifier2')";
 
         CommandProcessorResponse responseTwo = hcatDriver.run(tableQuery);
         assertEquals(0, responseTwo.getResponseCode());
@@ -462,7 +462,7 @@
 
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
 
         Path outputDir = new Path(getTestDir(), "mapred/testHBaseTableIgnoreAbortedTransactions");
         FileSystem fs = getFileSystem();
@@ -474,7 +474,7 @@
         job.setMapperClass(MapReadHTableRunningAbort.class);
         job.setInputFormatClass(HCatInputFormat.class);
         InputJobInfo inputJobInfo = InputJobInfo.create(
-                MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
+            MetaStoreUtils.DEFAULT_DATABASE_NAME, tableName, null);
         HCatInputFormat.setInput(job, inputJobInfo);
         job.setOutputFormatClass(TextOutputFormat.class);
         TextOutputFormat.setOutputPath(job, outputDir);
@@ -489,7 +489,7 @@
         assertFalse(MapReadHTableRunningAbort.error);
         assertEquals(1, MapReadHTableRunningAbort.count);
 
-        String dropTableQuery = "DROP TABLE " + tableName ;
+        String dropTableQuery = "DROP TABLE " + tableName;
         CommandProcessorResponse responseThree = hcatDriver.run(dropTableQuery);
         assertEquals(0, responseThree.getResponseCode());
 
@@ -499,20 +499,20 @@
 
 
     static class MapReadHTable
-            extends
-            Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
+        extends
+        Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
 
         static boolean error = false;
         static int count = 0;
 
         @Override
         public void map(ImmutableBytesWritable key, HCatRecord value,
-                Context context) throws IOException, InterruptedException {
+                        Context context) throws IOException, InterruptedException {
             System.out.println("HCat record value" + value.toString());
             boolean correctValues = (value.size() == 3)
-                    && (value.get(0).toString()).equalsIgnoreCase("testRow")
-                    && (value.get(1).toString()).equalsIgnoreCase("textValue-5")
-                    && (value.get(2).toString()).equalsIgnoreCase("textValue-5");
+                && (value.get(0).toString()).equalsIgnoreCase("testRow")
+                && (value.get(1).toString()).equalsIgnoreCase("textValue-5")
+                && (value.get(2).toString()).equalsIgnoreCase("textValue-5");
 
             if (correctValues == false) {
                 error = true;
@@ -527,18 +527,19 @@
     }
 
     static class MapReadProjHTable
-            extends
-            Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
+        extends
+        Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
 
         static boolean error = false;
         static int count = 0;
+
         @Override
         public void map(ImmutableBytesWritable key, HCatRecord value,
-                Context context) throws IOException, InterruptedException {
+                        Context context) throws IOException, InterruptedException {
             System.out.println("HCat record value" + value.toString());
             boolean correctValues = (value.size() == 2)
-                    && (value.get(0).toString()).equalsIgnoreCase("testRow")
-                    && (value.get(1).toString()).equalsIgnoreCase("textValue-5");
+                && (value.get(0).toString()).equalsIgnoreCase("testRow")
+                && (value.get(1).toString()).equalsIgnoreCase("textValue-5");
 
             if (correctValues == false) {
                 error = true;
@@ -548,7 +549,7 @@
     }
 
     static class MapReadProjectionHTable
-            implements org.apache.hadoop.mapred.Mapper<ImmutableBytesWritable, Result, WritableComparable<?>, Text> {
+        implements org.apache.hadoop.mapred.Mapper<ImmutableBytesWritable, Result, WritableComparable<?>, Text> {
 
         static boolean error = false;
         static int count = 0;
@@ -563,15 +564,15 @@
 
         @Override
         public void map(ImmutableBytesWritable key, Result result,
-                OutputCollector<WritableComparable<?>, Text> output, Reporter reporter)
-                throws IOException {
+                        OutputCollector<WritableComparable<?>, Text> output, Reporter reporter)
+            throws IOException {
             System.out.println("Result " + result.toString());
             List<KeyValue> list = result.list();
             boolean correctValues = (list.size() == 1)
-                    && (Bytes.toString(list.get(0).getRow())).equalsIgnoreCase("testRow")
-                    && (Bytes.toString(list.get(0).getValue())).equalsIgnoreCase("textValue-5")
-                    && (Bytes.toString(list.get(0).getFamily())).equalsIgnoreCase("testFamily")
-                    && (Bytes.toString(list.get(0).getQualifier())).equalsIgnoreCase("testQualifier1");
+                && (Bytes.toString(list.get(0).getRow())).equalsIgnoreCase("testRow")
+                && (Bytes.toString(list.get(0).getValue())).equalsIgnoreCase("textValue-5")
+                && (Bytes.toString(list.get(0).getFamily())).equalsIgnoreCase("testFamily")
+                && (Bytes.toString(list.get(0).getQualifier())).equalsIgnoreCase("testQualifier1");
 
             if (correctValues == false) {
                 error = true;
@@ -581,20 +582,20 @@
     }
 
     static class MapReadHTableRunningAbort
-            extends
-            Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
+        extends
+        Mapper<ImmutableBytesWritable, HCatRecord, WritableComparable<?>, Text> {
 
         static boolean error = false;
         static int count = 0;
 
         @Override
         public void map(ImmutableBytesWritable key, HCatRecord value,
-                Context context) throws IOException, InterruptedException {
+                        Context context) throws IOException, InterruptedException {
             System.out.println("HCat record value" + value.toString());
             boolean correctValues = (value.size() == 3)
-                    && (value.get(0).toString()).equalsIgnoreCase("testRow")
-                    && (value.get(1).toString()).equalsIgnoreCase("textValue-3")
-                    && (value.get(2).toString()).equalsIgnoreCase("textValue-2");
+                && (value.get(0).toString()).equalsIgnoreCase("testRow")
+                && (value.get(1).toString()).equalsIgnoreCase("textValue-3")
+                && (value.get(2).toString()).equalsIgnoreCase("textValue-2");
 
             if (correctValues == false) {
                 error = true;
@@ -607,9 +608,9 @@
 
         HCatSchema schema = new HCatSchema(new ArrayList<HCatFieldSchema>());
         schema.append(new HCatFieldSchema("key", HCatFieldSchema.Type.STRING,
-                ""));
+            ""));
         schema.append(new HCatFieldSchema("testqualifier1",
-                HCatFieldSchema.Type.STRING, ""));
+            HCatFieldSchema.Type.STRING, ""));
         return schema;
     }
 
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestSnapshots.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestSnapshots.java
index cb6e40a..e07bf46 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestSnapshots.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/TestSnapshots.java
@@ -42,16 +42,16 @@
 import org.junit.Test;
 
 public class TestSnapshots extends SkeletonHBaseTest {
-    private static HiveConf   hcatConf;
+    private static HiveConf hcatConf;
     private static HCatDriver hcatDriver;
 
     public void Initialize() throws Exception {
         hcatConf = getHiveConf();
         hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         URI fsuri = getFileSystem().getUri();
         Path whPath = new Path(fsuri.getScheme(), fsuri.getAuthority(),
-                getTestDir());
+            getTestDir());
         hcatConf.set(HiveConf.ConfVars.HADOOPFS.varname, fsuri.toString());
         hcatConf.set(ConfVars.METASTOREWAREHOUSE.varname, whPath.toString());
 
@@ -69,18 +69,18 @@
     }
 
     @Test
-    public void TestSnapshotConversion() throws Exception{
+    public void TestSnapshotConversion() throws Exception {
         Initialize();
         String tableName = newTableName("mytableOne");
         String databaseName = newTableName("mydatabase");
         String fullyQualTableName = databaseName + "." + tableName;
         String db_dir = getTestDir() + "/hbasedb";
         String dbquery = "CREATE DATABASE IF NOT EXISTS " + databaseName + " LOCATION '"
-                            + db_dir + "'";
+            + db_dir + "'";
         String tableQuery = "CREATE TABLE " + fullyQualTableName
-                              + "(key string, value1 string, value2 string) STORED BY " +
-                              "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                              + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:q1,cf2:q2')" ;
+            + "(key string, value1 string, value2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:q1,cf2:q2')";
 
         CommandProcessorResponse cmdResponse = hcatDriver.run(dbquery);
         assertEquals(0, cmdResponse.getResponseCode());
@@ -90,7 +90,7 @@
         InputJobInfo inputInfo = InputJobInfo.create(databaseName, tableName, null);
         Configuration conf = new Configuration(hcatConf);
         conf.set(HCatConstants.HCAT_KEY_HIVE_CONF,
-                HCatUtil.serialize(getHiveConf().getAllProperties()));
+            HCatUtil.serialize(getHiveConf().getAllProperties()));
         Job job = new Job(conf);
         inputInfo.getProperties().setProperty(HBaseConstants.PROPERTY_TABLE_SNAPSHOT_KEY, "dummysnapshot");
         InitializeInput.setInput(job, inputInfo);
@@ -100,7 +100,7 @@
         Map<String, Long> revMap = new HashMap<String, Long>();
         revMap.put("cf1", 3L);
         revMap.put("cf2", 5L);
-        TableSnapshot hbaseSnapshot = new TableSnapshot(fullyQualTableName, revMap,-1);
+        TableSnapshot hbaseSnapshot = new TableSnapshot(fullyQualTableName, revMap, -1);
         HCatTableSnapshot hcatSnapshot = HBaseRevisionManagerUtil.convertSnapshot(hbaseSnapshot, inputInfo.getTableInfo());
 
         assertEquals(hcatSnapshot.getRevision("value1"), 3);
@@ -113,9 +113,9 @@
         tableName = newTableName("mytableTwo");
         fullyQualTableName = databaseName + "." + tableName;
         tableQuery = "CREATE TABLE " + fullyQualTableName
-        + "(key string, value1 string, value2 string) STORED BY " +
-        "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-        + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:q1,cf1:q2')" ;
+            + "(key string, value1 string, value2 string) STORED BY " +
+            "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+            + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:q1,cf1:q2')";
         cmdResponse = hcatDriver.run(tableQuery);
         assertEquals(0, cmdResponse.getResponseCode());
         revMap.clear();
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestIDGenerator.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestIDGenerator.java
index 3f9498c..2a8fa8f 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestIDGenerator.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestIDGenerator.java
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 package org.apache.hcatalog.hbase.snapshot;
+
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -26,7 +27,7 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-public class TestIDGenerator extends SkeletonHBaseTest{
+public class TestIDGenerator extends SkeletonHBaseTest {
 
     @Test
     public void testIDGeneration() throws Exception {
@@ -35,7 +36,7 @@
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -44,20 +45,20 @@
 
         String tableName = "myTable";
         long initId = zkutil.nextId(tableName);
-        for (int i=0; i<10; i++) {
+        for (int i = 0; i < 10; i++) {
             long id = zkutil.nextId(tableName);
             Assert.assertEquals(initId + (i + 1), id);
         }
     }
 
     @Test
-    public void testMultipleClients() throws InterruptedException{
+    public void testMultipleClients() throws InterruptedException {
 
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -65,30 +66,30 @@
 
         ArrayList<IDGenClient> clients = new ArrayList<IDGenClient>();
 
-        for(int i =0; i < 5; i++){
+        for (int i = 0; i < 5; i++) {
             IDGenClient idClient = new IDGenClient(sb.toString(), "/rm_base", 10, "testTable");
             clients.add(idClient);
         }
 
-        for(IDGenClient idClient : clients){
+        for (IDGenClient idClient : clients) {
             idClient.run();
         }
 
-        for(IDGenClient idClient : clients){
+        for (IDGenClient idClient : clients) {
             idClient.join();
         }
 
         HashMap<Long, Long> idMap = new HashMap<Long, Long>();
-        for(IDGenClient idClient : clients){
+        for (IDGenClient idClient : clients) {
             idMap.putAll(idClient.getIdMap());
         }
 
         ArrayList<Long> keys = new ArrayList<Long>(idMap.keySet());
         Collections.sort(keys);
         int startId = 1;
-        for(Long key: keys){
+        for (Long key : keys) {
             Long id = idMap.get(key);
-            System.out.println("Key: " + key + " Value "+ id);
+            System.out.println("Key: " + key + " Value " + id);
             assertTrue(id == startId);
             startId++;
 
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManager.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManager.java
index 884ab30..bd0ee03 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManager.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManager.java
@@ -33,16 +33,16 @@
 import org.apache.zookeeper.data.Stat;
 import org.junit.Test;
 
-public class TestRevisionManager extends SkeletonHBaseTest{
+public class TestRevisionManager extends SkeletonHBaseTest {
 
     @Test
-    public void testBasicZNodeCreation() throws IOException, KeeperException, InterruptedException{
+    public void testBasicZNodeCreation() throws IOException, KeeperException, InterruptedException {
 
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -64,7 +64,7 @@
         Stat result = zk.exists(transactionDataTablePath, false);
         assertTrue(result != null);
 
-        for(String colFamiliy : columnFamilies){
+        for (String colFamiliy : columnFamilies) {
             String cfPath = transactionDataTablePath + "/" + colFamiliy;
             Stat resultTwo = zk.exists(cfPath, false);
             assertTrue(resultTwo != null);
@@ -73,13 +73,13 @@
     }
 
     @Test
-    public void testCommitTransaction() throws IOException{
+    public void testCommitTransaction() throws IOException {
 
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -87,7 +87,7 @@
 
         Configuration conf = RevisionManagerConfiguration.create(getHbaseConf());
         conf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
-        ZKBasedRevisionManager  manager = new ZKBasedRevisionManager();
+        ZKBasedRevisionManager manager = new ZKBasedRevisionManager();
         manager.initialize(conf);
         manager.open();
         ZKUtil zkutil = new ZKUtil(sb.toString(), "/rm_base");
@@ -95,15 +95,15 @@
         String tableName = newTableName("testTable");
         List<String> columnFamilies = Arrays.asList("cf1", "cf2", "cf3");
         Transaction txn = manager.beginWriteTransaction(tableName,
-                columnFamilies);
+            columnFamilies);
 
         List<String> cfs = zkutil.getColumnFamiliesOfTable(tableName);
         assertTrue(cfs.size() == columnFamilies.size());
-        for (String cf : cfs){
+        for (String cf : cfs) {
             assertTrue(columnFamilies.contains(cf));
         }
 
-        for(String colFamily : columnFamilies){
+        for (String colFamily : columnFamilies) {
             String path = PathUtil.getRunningTxnInfoPath("/rm_base", tableName, colFamily);
             byte[] data = zkutil.getRawData(path, null);
             StoreFamilyRevisionList list = new StoreFamilyRevisionList();
@@ -115,7 +115,7 @@
 
         }
         manager.commitWriteTransaction(txn);
-        for(String colFamiliy : columnFamilies){
+        for (String colFamiliy : columnFamilies) {
             String path = PathUtil.getRunningTxnInfoPath("/rm_base", tableName, colFamiliy);
             byte[] data = zkutil.getRawData(path, null);
             StoreFamilyRevisionList list = new StoreFamilyRevisionList();
@@ -128,13 +128,13 @@
     }
 
     @Test
-    public void testAbortTransaction() throws IOException{
+    public void testAbortTransaction() throws IOException {
 
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String host = getHbaseConf().get("hbase.zookeeper.quorum");
         Configuration conf = RevisionManagerConfiguration.create(getHbaseConf());
         conf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
-        ZKBasedRevisionManager  manager = new ZKBasedRevisionManager();
+        ZKBasedRevisionManager manager = new ZKBasedRevisionManager();
         manager.initialize(conf);
         manager.open();
         ZKUtil zkutil = new ZKUtil(host + ':' + port, "/rm_base");
@@ -145,12 +145,12 @@
         List<String> cfs = zkutil.getColumnFamiliesOfTable(tableName);
 
         assertTrue(cfs.size() == columnFamilies.size());
-        for (String cf : cfs){
+        for (String cf : cfs) {
             assertTrue(columnFamilies.contains(cf));
         }
 
-        for(String colFamiliy : columnFamilies){
-            String path = PathUtil.getRunningTxnInfoPath("/rm_base",tableName, colFamiliy);
+        for (String colFamiliy : columnFamilies) {
+            String path = PathUtil.getRunningTxnInfoPath("/rm_base", tableName, colFamiliy);
             byte[] data = zkutil.getRawData(path, null);
             StoreFamilyRevisionList list = new StoreFamilyRevisionList();
             ZKUtil.deserialize(list, data);
@@ -161,8 +161,8 @@
 
         }
         manager.abortWriteTransaction(txn);
-        for(String colFamiliy : columnFamilies){
-            String path = PathUtil.getRunningTxnInfoPath("/rm_base",tableName, colFamiliy);
+        for (String colFamiliy : columnFamilies) {
+            String path = PathUtil.getRunningTxnInfoPath("/rm_base", tableName, colFamiliy);
             byte[] data = zkutil.getRawData(path, null);
             StoreFamilyRevisionList list = new StoreFamilyRevisionList();
             ZKUtil.deserialize(list, data);
@@ -170,8 +170,8 @@
 
         }
 
-        for(String colFamiliy : columnFamilies){
-            String path = PathUtil.getAbortInformationPath("/rm_base",tableName, colFamiliy);
+        for (String colFamiliy : columnFamilies) {
+            String path = PathUtil.getAbortInformationPath("/rm_base", tableName, colFamiliy);
             byte[] data = zkutil.getRawData(path, null);
             StoreFamilyRevisionList list = new StoreFamilyRevisionList();
             ZKUtil.deserialize(list, data);
@@ -189,7 +189,7 @@
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -197,31 +197,31 @@
 
         Configuration conf = RevisionManagerConfiguration.create(getHbaseConf());
         conf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
-        ZKBasedRevisionManager  manager = new ZKBasedRevisionManager();
+        ZKBasedRevisionManager manager = new ZKBasedRevisionManager();
         manager.initialize(conf);
         manager.open();
         String tableName = newTableName("testTable");
         List<String> columnFamilies = Arrays.asList("cf1", "cf2");
         Transaction txn = manager.beginWriteTransaction(tableName,
-                columnFamilies, 40);
+            columnFamilies, 40);
         Thread.sleep(100);
         try {
             manager.commitWriteTransaction(txn);
         } catch (Exception e) {
             assertTrue(e instanceof IOException);
             assertEquals(e.getMessage(),
-                    "The transaction to be removed not found in the data.");
+                "The transaction to be removed not found in the data.");
         }
 
     }
 
     @Test
-    public void testCreateSnapshot() throws IOException{
+    public void testCreateSnapshot() throws IOException {
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String host = getHbaseConf().get("hbase.zookeeper.quorum");
         Configuration conf = RevisionManagerConfiguration.create(getHbaseConf());
         conf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
-        ZKBasedRevisionManager  manager = new ZKBasedRevisionManager();
+        ZKBasedRevisionManager manager = new ZKBasedRevisionManager();
         manager.initialize(conf);
         manager.open();
         String tableName = newTableName("testTable");
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManagerEndpoint.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManagerEndpoint.java
index 13c2f45..b910195 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManagerEndpoint.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestRevisionManagerEndpoint.java
@@ -34,172 +34,172 @@
 
 public class TestRevisionManagerEndpoint extends SkeletonHBaseTest {
 
-  static {
-    // test case specific mini cluster settings
-    testConf = new Configuration(false);
-    testConf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
-        "org.apache.hcatalog.hbase.snapshot.RevisionManagerEndpoint",
-        "org.apache.hadoop.hbase.coprocessor.GenericEndpoint");
-    testConf.set(RMConstants.REVISION_MGR_ENDPOINT_IMPL_CLASS, MockRM.class.getName());
-  }
+    static {
+        // test case specific mini cluster settings
+        testConf = new Configuration(false);
+        testConf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
+            "org.apache.hcatalog.hbase.snapshot.RevisionManagerEndpoint",
+            "org.apache.hadoop.hbase.coprocessor.GenericEndpoint");
+        testConf.set(RMConstants.REVISION_MGR_ENDPOINT_IMPL_CLASS, MockRM.class.getName());
+    }
 
-  /**
-   * Mock implementation to test the protocol/serialization
-   */
-  public static class MockRM implements RevisionManager {
+    /**
+     * Mock implementation to test the protocol/serialization
+     */
+    public static class MockRM implements RevisionManager {
 
-    private static class Invocation {
-      Invocation(String methodName, Object ret, Object... args) {
-          this.methodName = methodName;
-          this.args = args;
-          this.ret = ret;
-      }
+        private static class Invocation {
+            Invocation(String methodName, Object ret, Object... args) {
+                this.methodName = methodName;
+                this.args = args;
+                this.ret = ret;
+            }
 
-      String methodName;
-      Object[] args;
-      Object ret;
+            String methodName;
+            Object[] args;
+            Object ret;
 
-      private static boolean equals(Object obj1, Object obj2) {
-        if (obj1 == obj2) return true;
-        if (obj1 == null || obj2 == null) return false;
-        if (obj1 instanceof Transaction || obj1 instanceof TableSnapshot) {
-          return obj1.toString().equals(obj2.toString());
+            private static boolean equals(Object obj1, Object obj2) {
+                if (obj1 == obj2) return true;
+                if (obj1 == null || obj2 == null) return false;
+                if (obj1 instanceof Transaction || obj1 instanceof TableSnapshot) {
+                    return obj1.toString().equals(obj2.toString());
+                }
+                return obj1.equals(obj2);
+            }
+
+            @Override
+            public boolean equals(Object obj) {
+                Invocation other = (Invocation) obj;
+                if (this == other) return true;
+                if (other == null) return false;
+                if (this.args != other.args) {
+                    if (this.args == null || other.args == null) return false;
+                    if (this.args.length != other.args.length) return false;
+                    for (int i = 0; i < args.length; i++) {
+                        if (!equals(this.args[i], other.args[i])) return false;
+                    }
+                }
+                return equals(this.ret, other.ret);
+            }
+
+            @Override
+            public String toString() {
+                return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).
+                    append("method", this.methodName).
+                    append("args", this.args).
+                    append("returns", this.ret).
+                    toString();
+            }
         }
-        return obj1.equals(obj2);
-      }
 
-      @Override
-      public boolean equals(Object obj) {
-        Invocation other = (Invocation)obj;
-        if (this == other) return true;
-        if (other == null) return false;
-        if (this.args != other.args) {
-          if (this.args == null || other.args == null) return false;
-          if (this.args.length != other.args.length) return false;
-          for (int i=0; i<args.length; i++) {
-            if (!equals(this.args[i], other.args[i])) return false;
-          }
+        final static String DEFAULT_INSTANCE = "default";
+        final static Map<String, MockRM> INSTANCES = new ConcurrentHashMap<String, MockRM>();
+        Invocation lastCall;
+        boolean isOpen = false;
+
+        private <T extends Object> T recordCall(T result, Object... args) {
+            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+            lastCall = new Invocation(stackTrace[2].getMethodName(), result, args);
+            return result;
         }
-        return equals(this.ret, other.ret);
-      }
 
-      @Override
-      public String toString() {
-        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).
-            append("method", this.methodName).
-            append("args", this.args).
-            append("returns", this.ret).
-            toString();
-      }
+        @Override
+        public void initialize(Configuration conf) {
+            if (!INSTANCES.containsKey(DEFAULT_INSTANCE))
+                INSTANCES.put(DEFAULT_INSTANCE, this);
+        }
+
+        @Override
+        public void open() throws IOException {
+            isOpen = true;
+        }
+
+        @Override
+        public void close() throws IOException {
+            isOpen = false;
+        }
+
+        @Override
+        public void createTable(String table, List<String> columnFamilies) throws IOException {
+        }
+
+        @Override
+        public void dropTable(String table) throws IOException {
+        }
+
+        @Override
+        public Transaction beginWriteTransaction(String table,
+                                                 List<String> families) throws IOException {
+            return recordCall(null, table, families);
+        }
+
+        @Override
+        public Transaction beginWriteTransaction(String table,
+                                                 List<String> families, long keepAlive) throws IOException {
+            return recordCall(null, table, families, keepAlive);
+        }
+
+        @Override
+        public void commitWriteTransaction(Transaction transaction)
+            throws IOException {
+        }
+
+        @Override
+        public void abortWriteTransaction(Transaction transaction)
+            throws IOException {
+        }
+
+        @Override
+        public List<FamilyRevision> getAbortedWriteTransactions(String table,
+                                                                String columnFamily) throws IOException {
+            return null;
+        }
+
+        @Override
+        public TableSnapshot createSnapshot(String tableName)
+            throws IOException {
+            return null;
+        }
+
+        @Override
+        public TableSnapshot createSnapshot(String tableName, long revision)
+            throws IOException {
+            TableSnapshot ret = new TableSnapshot(tableName, new HashMap<String, Long>(), revision);
+            return recordCall(ret, tableName, revision);
+        }
+
+        @Override
+        public void keepAlive(Transaction transaction) throws IOException {
+            recordCall(null, transaction);
+        }
     }
 
-    final static String DEFAULT_INSTANCE = "default";
-    final static Map<String, MockRM> INSTANCES = new ConcurrentHashMap<String, MockRM>();
-    Invocation lastCall;
-    boolean isOpen = false;
+    @Test
+    public void testRevisionManagerProtocol() throws Throwable {
 
-    private <T extends Object> T recordCall(T result, Object...args) {
-      StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-      lastCall = new Invocation(stackTrace[2].getMethodName(), result, args);
-      return result;
+        Configuration conf = getHbaseConf();
+        RevisionManager rm = RevisionManagerFactory.getOpenedRevisionManager(
+            RevisionManagerEndpointClient.class.getName(), conf);
+
+        MockRM mockImpl = MockRM.INSTANCES.get(MockRM.DEFAULT_INSTANCE);
+        Assert.assertNotNull(mockImpl);
+        Assert.assertTrue(mockImpl.isOpen);
+
+        Transaction t = new Transaction("t1", Arrays.asList("f1", "f2"), 0, 0);
+        MockRM.Invocation call = new MockRM.Invocation("keepAlive", null, t);
+        rm.keepAlive(t);
+        Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
+
+        t = new Transaction("t2", Arrays.asList("f21", "f22"), 0, 0);
+        call = new MockRM.Invocation("beginWriteTransaction", null, t.getTableName(), t.getColumnFamilies());
+        call.ret = rm.beginWriteTransaction(t.getTableName(), t.getColumnFamilies());
+        Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
+
+        call = new MockRM.Invocation("createSnapshot", null, "t3", 1L);
+        call.ret = rm.createSnapshot("t3", 1);
+        Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
+
     }
 
-    @Override
-    public void initialize(Configuration conf) {
-      if(!INSTANCES.containsKey(DEFAULT_INSTANCE))
-        INSTANCES.put(DEFAULT_INSTANCE, this);
-    }
-
-    @Override
-    public void open() throws IOException {
-      isOpen = true;
-    }
-
-    @Override
-    public void close() throws IOException {
-      isOpen = false;
-    }
-
-    @Override
-    public void createTable(String table, List<String> columnFamilies) throws IOException {
-    }
-
-    @Override
-    public void dropTable(String table) throws IOException {
-    }
-
-    @Override
-    public Transaction beginWriteTransaction(String table,
-        List<String> families) throws IOException {
-      return recordCall(null, table, families);
-    }
-
-    @Override
-    public Transaction beginWriteTransaction(String table,
-      List<String> families, long keepAlive) throws IOException {
-      return recordCall(null, table, families, keepAlive);
-    }
-
-    @Override
-    public void commitWriteTransaction(Transaction transaction)
-        throws IOException {
-    }
-
-    @Override
-    public void abortWriteTransaction(Transaction transaction)
-        throws IOException {
-    }
-
-    @Override
-    public List<FamilyRevision> getAbortedWriteTransactions(String table,
-        String columnFamily) throws IOException {
-      return null;
-    }
-
-    @Override
-    public TableSnapshot createSnapshot(String tableName)
-        throws IOException {
-      return null;
-    }
-
-    @Override
-    public TableSnapshot createSnapshot(String tableName, long revision)
-        throws IOException {
-      TableSnapshot ret = new TableSnapshot(tableName, new HashMap<String, Long>(), revision);
-      return recordCall(ret, tableName, revision);
-    }
-
-    @Override
-    public void keepAlive(Transaction transaction) throws IOException {
-      recordCall(null, transaction);
-    }
-  }
-
-  @Test
-  public void testRevisionManagerProtocol() throws Throwable {
-
-    Configuration conf = getHbaseConf();
-    RevisionManager rm = RevisionManagerFactory.getOpenedRevisionManager(
-        RevisionManagerEndpointClient.class.getName(), conf);
-
-    MockRM mockImpl = MockRM.INSTANCES.get(MockRM.DEFAULT_INSTANCE);
-    Assert.assertNotNull(mockImpl);
-    Assert.assertTrue(mockImpl.isOpen);
-
-    Transaction t = new Transaction("t1", Arrays.asList("f1", "f2"), 0, 0);
-    MockRM.Invocation call = new MockRM.Invocation("keepAlive", null, t);
-    rm.keepAlive(t);
-    Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
-
-    t = new Transaction("t2", Arrays.asList("f21", "f22"), 0, 0);
-    call = new MockRM.Invocation("beginWriteTransaction", null, t.getTableName(),  t.getColumnFamilies());
-    call.ret = rm.beginWriteTransaction(t.getTableName(), t.getColumnFamilies());
-    Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
-
-    call = new MockRM.Invocation("createSnapshot", null, "t3", 1L);
-    call.ret = rm.createSnapshot("t3", 1);
-    Assert.assertEquals(call.methodName, call, mockImpl.lastCall);
-
-  }
-
 }
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestThriftSerialization.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestThriftSerialization.java
index c3fa1d8..b1368e6 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestThriftSerialization.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestThriftSerialization.java
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+
 import org.apache.hcatalog.hbase.snapshot.transaction.thrift.StoreFamilyRevision;
 import org.apache.hcatalog.hbase.snapshot.transaction.thrift.StoreFamilyRevisionList;
 import org.junit.Test;
@@ -30,8 +31,8 @@
 public class TestThriftSerialization {
 
     @Test
-    public void testLightWeightTransaction(){
-       StoreFamilyRevision trxn = new StoreFamilyRevision(0, 1000);
+    public void testLightWeightTransaction() {
+        StoreFamilyRevision trxn = new StoreFamilyRevision(0, 1000);
         try {
 
             byte[] data = ZKUtil.serialize(trxn);
@@ -47,11 +48,11 @@
     }
 
     @Test
-    public void testWriteTransactionList(){
+    public void testWriteTransactionList() {
         List<StoreFamilyRevision> txnList = new ArrayList<StoreFamilyRevision>();
         long version;
         long timestamp;
-        for( int i = 0; i < 10; i++){
+        for (int i = 0; i < 10; i++) {
             version = i;
             timestamp = 1000 + i;
             StoreFamilyRevision wtx = new StoreFamilyRevision(version, timestamp);
@@ -68,9 +69,9 @@
 
             Iterator<StoreFamilyRevision> itr = newList.getRevisionListIterator();
             int i = 0;
-            while(itr.hasNext()){
+            while (itr.hasNext()) {
                 StoreFamilyRevision txn = itr.next();
-                assertTrue(txn.getRevision() ==  i);
+                assertTrue(txn.getRevision() == i);
                 assertTrue(txn.getTimestamp() == (i + 1000));
                 i++;
             }
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestZNodeSetUp.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestZNodeSetUp.java
index ea3b1db..4f3a47f 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestZNodeSetUp.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/TestZNodeSetUp.java
@@ -40,19 +40,19 @@
 import org.junit.Test;
 
 
-public class TestZNodeSetUp extends SkeletonHBaseTest{
+public class TestZNodeSetUp extends SkeletonHBaseTest {
 
-    private static HiveConf   hcatConf;
+    private static HiveConf hcatConf;
     private static HCatDriver hcatDriver;
 
     public void Initialize() throws Exception {
 
         hcatConf = getHiveConf();
         hcatConf.set(ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         URI fsuri = getFileSystem().getUri();
         Path whPath = new Path(fsuri.getScheme(), fsuri.getAuthority(),
-                getTestDir());
+            getTestDir());
         hcatConf.set(HiveConf.ConfVars.HADOOPFS.varname, fsuri.toString());
         hcatConf.set(ConfVars.METASTOREWAREHOUSE.varname, whPath.toString());
 
@@ -64,7 +64,7 @@
             }
         }
         HBaseConfiguration.merge(hcatConf,
-                RevisionManagerConfiguration.create());
+            RevisionManagerConfiguration.create());
         hcatConf.set(RMConstants.ZOOKEEPER_DATADIR, "/rm_base");
         SessionState.start(new CliSessionState(hcatConf));
         hcatDriver = new HCatDriver();
@@ -72,14 +72,14 @@
     }
 
     @Test
-    public void testBasicZNodeCreation() throws Exception{
+    public void testBasicZNodeCreation() throws Exception {
 
         Initialize();
         int port = getHbaseConf().getInt("hbase.zookeeper.property.clientPort", 2181);
         String servers = getHbaseConf().get("hbase.zookeeper.quorum");
         String[] splits = servers.split(",");
         StringBuffer sb = new StringBuffer();
-        for(String split : splits){
+        for (String split : splits) {
             sb.append(split);
             sb.append(':');
             sb.append(port);
@@ -87,9 +87,9 @@
 
         hcatDriver.run("drop table test_table");
         CommandProcessorResponse response = hcatDriver
-                .run("create table test_table(key int, value string) STORED BY " +
-                     "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
-                    + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:val')");
+            .run("create table test_table(key int, value string) STORED BY " +
+                "'org.apache.hcatalog.hbase.HBaseHCatStorageHandler'"
+                + "TBLPROPERTIES ('hbase.columns.mapping'=':key,cf1:val')");
 
         assertEquals(0, response.getResponseCode());
 
diff --git a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/lock/WriteLockTest.java b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/lock/WriteLockTest.java
index 4f1717b..7720225 100644
--- a/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/lock/WriteLockTest.java
+++ b/storage-handlers/hbase/src/test/org/apache/hcatalog/hbase/snapshot/lock/WriteLockTest.java
@@ -57,6 +57,7 @@
         }
 
     }
+
     protected void runTest(int count) throws Exception {
         nodes = new WriteLock[count];
         for (int i = 0; i < count; i++) {
@@ -85,21 +86,21 @@
 
         if (count > 1) {
             if (killLeader) {
-            System.out.println("Now killing the leader");
-            // now lets kill the leader
-            latch = new CountDownLatch(1);
-            first.unlock();
-            latch.await(30, TimeUnit.SECONDS);
-            //Thread.sleep(10000);
-            WriteLock second = nodes[1];
-            dumpNodes(count);
-            // lets assert that the first election is the leader
-            Assert.assertTrue("The second znode should be the leader " + second.getId(), second.isOwner());
+                System.out.println("Now killing the leader");
+                // now lets kill the leader
+                latch = new CountDownLatch(1);
+                first.unlock();
+                latch.await(30, TimeUnit.SECONDS);
+                //Thread.sleep(10000);
+                WriteLock second = nodes[1];
+                dumpNodes(count);
+                // lets assert that the first election is the leader
+                Assert.assertTrue("The second znode should be the leader " + second.getId(), second.isOwner());
 
-            for (int i = 2; i < count; i++) {
-                WriteLock node = nodes[i];
-                Assert.assertFalse("Node should not be the leader " + node.getId(), node.isOwner());
-            }
+                for (int i = 2; i < count; i++) {
+                    WriteLock node = nodes[i];
+                    Assert.assertFalse("Node should not be the leader " + node.getId(), node.isOwner());
+                }
             }
 
 
@@ -130,7 +131,7 @@
         for (int i = 0; i < count; i++) {
             WriteLock node = nodes[i];
             System.out.println("node: " + i + " id: " +
-                    node.getId() + " is leader: " + node.isOwner());
+                node.getId() + " is leader: " + node.isOwner());
         }
     }
 
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatAddPartitionDesc.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatAddPartitionDesc.java
index f705098..0de20b8 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatAddPartitionDesc.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatAddPartitionDesc.java
@@ -42,14 +42,14 @@
     private String tableName;
     private String dbName;
     private String location;
-    private Map<String,String> partSpec;
+    private Map<String, String> partSpec;
 
-     private HCatAddPartitionDesc(String dbName, String tbl, String loc, Map<String,String> spec){
-         this.dbName = dbName;
-         this.tableName = tbl;
-         this.location = loc;
-         this.partSpec = spec;
-     }
+    private HCatAddPartitionDesc(String dbName, String tbl, String loc, Map<String, String> spec) {
+        this.dbName = dbName;
+        this.tableName = tbl;
+        this.location = loc;
+        this.partSpec = spec;
+    }
 
     /**
      * Gets the location.
@@ -88,97 +88,97 @@
         return this.dbName;
     }
 
-     @Override
+    @Override
     public String toString() {
         return "HCatAddPartitionDesc ["
-                + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + (location != null ? "location=" + location + ", " : "location=null")
-                + (partSpec != null ? "partSpec=" + partSpec : "partSpec=null") + "]";
+            + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + (location != null ? "location=" + location + ", " : "location=null")
+            + (partSpec != null ? "partSpec=" + partSpec : "partSpec=null") + "]";
     }
 
     /**
-      * Creates the builder for specifying attributes.
-      *
-      * @param dbName the db name
-      * @param tableName the table name
-      * @param location the location
-      * @param partSpec the part spec
-      * @return the builder
-      * @throws HCatException
-      */
-     public static Builder create(String dbName, String tableName, String location,
-             Map<String,String> partSpec) throws HCatException {
-         return new Builder(dbName, tableName, location, partSpec);
-     }
+     * Creates the builder for specifying attributes.
+     *
+     * @param dbName the db name
+     * @param tableName the table name
+     * @param location the location
+     * @param partSpec the part spec
+     * @return the builder
+     * @throws HCatException
+     */
+    public static Builder create(String dbName, String tableName, String location,
+                                 Map<String, String> partSpec) throws HCatException {
+        return new Builder(dbName, tableName, location, partSpec);
+    }
 
-     Partition toHivePartition(Table hiveTable) throws HCatException{
-         Partition hivePtn = new Partition();
-         hivePtn.setDbName(this.dbName);
-         hivePtn.setTableName(this.tableName);
+    Partition toHivePartition(Table hiveTable) throws HCatException {
+        Partition hivePtn = new Partition();
+        hivePtn.setDbName(this.dbName);
+        hivePtn.setTableName(this.tableName);
 
-         List<String> pvals = new ArrayList<String>();
-         for (FieldSchema field : hiveTable.getPartitionKeys()) {
-           String val = partSpec.get(field.getName());
-           if (val == null || val.length() == 0) {
-               throw new HCatException("create partition: Value for key "
-                   + field.getName() + " is null or empty");
-             }
-           pvals.add(val);
-         }
+        List<String> pvals = new ArrayList<String>();
+        for (FieldSchema field : hiveTable.getPartitionKeys()) {
+            String val = partSpec.get(field.getName());
+            if (val == null || val.length() == 0) {
+                throw new HCatException("create partition: Value for key "
+                    + field.getName() + " is null or empty");
+            }
+            pvals.add(val);
+        }
 
-         hivePtn.setValues(pvals);
-         StorageDescriptor sd = new StorageDescriptor(hiveTable.getSd());
-         hivePtn.setSd(sd);
-         hivePtn.setParameters(hiveTable.getParameters());
-         if (this.location != null) {
-             hivePtn.getSd().setLocation(this.location);
-         } else {
-             String partName;
+        hivePtn.setValues(pvals);
+        StorageDescriptor sd = new StorageDescriptor(hiveTable.getSd());
+        hivePtn.setSd(sd);
+        hivePtn.setParameters(hiveTable.getParameters());
+        if (this.location != null) {
+            hivePtn.getSd().setLocation(this.location);
+        } else {
+            String partName;
             try {
                 partName = Warehouse.makePartName(
-                         hiveTable.getPartitionKeys(), pvals);
+                    hiveTable.getPartitionKeys(), pvals);
                 LOG.info("Setting partition location to :" + partName);
             } catch (MetaException e) {
                 throw new HCatException("Exception while creating partition name.", e);
             }
-             Path partPath = new Path(hiveTable.getSd().getLocation(), partName);
-             hivePtn.getSd().setLocation(partPath.toString());
-         }
-         hivePtn.setCreateTime((int) (System.currentTimeMillis() / 1000));
-         hivePtn.setLastAccessTimeIsSet(false);
-         return hivePtn;
-     }
+            Path partPath = new Path(hiveTable.getSd().getLocation(), partName);
+            hivePtn.getSd().setLocation(partPath.toString());
+        }
+        hivePtn.setCreateTime((int) (System.currentTimeMillis() / 1000));
+        hivePtn.setLastAccessTimeIsSet(false);
+        return hivePtn;
+    }
 
-     public static class Builder {
+    public static class Builder {
 
-         private String tableName;
-         private String location;
-         private Map<String,String> values;
-         private String dbName;
+        private String tableName;
+        private String location;
+        private Map<String, String> values;
+        private String dbName;
 
-         private Builder(String dbName, String tableName, String location, Map<String,String> values){
-             this.dbName = dbName;
-             this.tableName = tableName;
-             this.location = location;
-             this.values = values;
-         }
+        private Builder(String dbName, String tableName, String location, Map<String, String> values) {
+            this.dbName = dbName;
+            this.tableName = tableName;
+            this.location = location;
+            this.values = values;
+        }
 
-         /**
-          * Builds the HCatAddPartitionDesc.
-          *
-          * @return the h cat add partition desc
-          * @throws HCatException
-          */
-         public HCatAddPartitionDesc build() throws HCatException {
-             if(this.dbName == null){
-                 this.dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
-             }
-             HCatAddPartitionDesc desc = new HCatAddPartitionDesc(
-                     this.dbName, this.tableName, this.location,
-                     this.values);
-             return desc;
-         }
-     }
+        /**
+         * Builds the HCatAddPartitionDesc.
+         *
+         * @return the h cat add partition desc
+         * @throws HCatException
+         */
+        public HCatAddPartitionDesc build() throws HCatException {
+            if (this.dbName == null) {
+                this.dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
+            }
+            HCatAddPartitionDesc desc = new HCatAddPartitionDesc(
+                this.dbName, this.tableName, this.location,
+                this.values);
+            return desc;
+        }
+    }
 
 }
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClient.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClient.java
index 4d20e30..d966b8b 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClient.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClient.java
@@ -30,8 +30,10 @@
  */
 public abstract class HCatClient {
 
-    public enum DROP_DB_MODE { RESTRICT, CASCADE };
+    public enum DROP_DB_MODE {RESTRICT, CASCADE}
+
     public static final String HCAT_CLIENT_IMPL_CLASS = "hcat.client.impl.class";
+
     /**
      * Creates an instance of HCatClient.
      *
@@ -40,32 +42,32 @@
      * @throws HCatException,ConnectionFailureException
      */
     public static HCatClient create(Configuration conf) throws HCatException,
-            ConnectionFailureException {
+        ConnectionFailureException {
         HCatClient client = null;
         String className = conf.get(HCAT_CLIENT_IMPL_CLASS,
-                HCatClientHMSImpl.class.getName());
+            HCatClientHMSImpl.class.getName());
         try {
             Class<? extends HCatClient> clientClass = Class.forName(className,
-                    true, JavaUtils.getClassLoader()).asSubclass(
+                true, JavaUtils.getClassLoader()).asSubclass(
                     HCatClient.class);
             client = (HCatClient) clientClass.newInstance();
         } catch (ClassNotFoundException e) {
             throw new HCatException(
-                    "ClassNotFoundException while creating client class.", e);
+                "ClassNotFoundException while creating client class.", e);
         } catch (InstantiationException e) {
             throw new HCatException(
-                    "InstantiationException while creating client class.", e);
+                "InstantiationException while creating client class.", e);
         } catch (IllegalAccessException e) {
             throw new HCatException(
-                    "IllegalAccessException while creating client class.", e);
+                "IllegalAccessException while creating client class.", e);
         }
-        if(client != null){
+        if (client != null) {
             client.initialize(conf);
         }
         return client;
     }
 
-    abstract void initialize(Configuration conf) throws HCatException,ConnectionFailureException;
+    abstract void initialize(Configuration conf) throws HCatException, ConnectionFailureException;
 
     /**
      * Get all existing databases that match the given
@@ -76,7 +78,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract List<String> listDatabaseNamesByPattern(String pattern)
-            throws HCatException, ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Gets the database.
@@ -85,7 +87,7 @@
      * @return An instance of HCatDatabaseInfo.
      * @throws HCatException,ConnectionFailureException
      */
-    public abstract HCatDatabase getDatabase(String dbName) throws HCatException,ConnectionFailureException;
+    public abstract HCatDatabase getDatabase(String dbName) throws HCatException, ConnectionFailureException;
 
     /**
      * Creates the database.
@@ -94,7 +96,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void createDatabase(HCatCreateDBDesc dbInfo)
-            throws HCatException,ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Drops a database.
@@ -108,7 +110,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void dropDatabase(String dbName, boolean ifExists,
-            DROP_DB_MODE mode) throws HCatException, ConnectionFailureException;
+                                      DROP_DB_MODE mode) throws HCatException, ConnectionFailureException;
 
     /**
      * Returns all existing tables from the specified database which match the given
@@ -119,7 +121,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract List<String> listTableNamesByPattern(String dbName, String tablePattern)
-            throws HCatException,ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Gets the table.
@@ -130,7 +132,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract HCatTable getTable(String dbName, String tableName)
-            throws HCatException,ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Creates the table.
@@ -139,7 +141,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void createTable(HCatCreateTableDesc createTableDesc)
-            throws HCatException,ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Creates the table like an existing table.
@@ -154,8 +156,8 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void createTableLike(String dbName, String existingTblName,
-            String newTableName, boolean ifNotExists, boolean isExternal,
-            String location) throws HCatException,ConnectionFailureException;
+                                         String newTableName, boolean ifNotExists, boolean isExternal,
+                                         String location) throws HCatException, ConnectionFailureException;
 
     /**
      * Drop table.
@@ -167,7 +169,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void dropTable(String dbName, String tableName,
-            boolean ifExists) throws HCatException,ConnectionFailureException;
+                                   boolean ifExists) throws HCatException, ConnectionFailureException;
 
     /**
      * Renames a table.
@@ -178,7 +180,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void renameTable(String dbName, String oldName,
-            String newName) throws HCatException, ConnectionFailureException;
+                                     String newName) throws HCatException, ConnectionFailureException;
 
     /**
      * Gets all the partitions.
@@ -189,7 +191,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract List<HCatPartition> getPartitions(String dbName, String tblName)
-            throws HCatException,ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Gets the partition.
@@ -201,7 +203,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract HCatPartition getPartition(String dbName, String tableName,
-            Map<String,String> partitionSpec) throws HCatException,ConnectionFailureException;
+                                               Map<String, String> partitionSpec) throws HCatException, ConnectionFailureException;
 
     /**
      * Adds the partition.
@@ -210,7 +212,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void addPartition(HCatAddPartitionDesc partInfo)
-            throws HCatException, ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Adds a list of partitions.
@@ -220,7 +222,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract int addPartitions(List<HCatAddPartitionDesc> partInfoList)
-            throws HCatException, ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Drops partition.
@@ -232,8 +234,8 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void dropPartition(String dbName, String tableName,
-            Map<String, String> partitionSpec, boolean ifExists)
-            throws HCatException, ConnectionFailureException;
+                                       Map<String, String> partitionSpec, boolean ifExists)
+        throws HCatException, ConnectionFailureException;
 
     /**
      * List partitions by filter.
@@ -247,7 +249,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract List<HCatPartition> listPartitionsByFilter(String dbName, String tblName,
-            String filter) throws HCatException,ConnectionFailureException;
+                                                               String filter) throws HCatException, ConnectionFailureException;
 
     /**
      * Mark partition for event.
@@ -259,8 +261,8 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void markPartitionForEvent(String dbName, String tblName,
-            Map<String, String> partKVs, PartitionEventType eventType)
-            throws HCatException,ConnectionFailureException;
+                                               Map<String, String> partKVs, PartitionEventType eventType)
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Checks if a partition is marked for event.
@@ -273,8 +275,8 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract boolean isPartitionMarkedForEvent(String dbName, String tblName,
-            Map<String, String> partKVs, PartitionEventType eventType)
-            throws HCatException,ConnectionFailureException;
+                                                      Map<String, String> partKVs, PartitionEventType eventType)
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Gets the delegation token.
@@ -285,8 +287,8 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract String getDelegationToken(String owner,
-            String renewerKerberosPrincipalName) throws HCatException,
-            ConnectionFailureException;
+                                              String renewerKerberosPrincipalName) throws HCatException,
+        ConnectionFailureException;
 
     /**
      * Renew delegation token.
@@ -296,7 +298,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract long renewDelegationToken(String tokenStrForm)
-            throws HCatException, ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Cancel delegation token.
@@ -305,7 +307,7 @@
      * @throws HCatException,ConnectionFailureException
      */
     public abstract void cancelDelegationToken(String tokenStrForm)
-            throws HCatException, ConnectionFailureException;
+        throws HCatException, ConnectionFailureException;
 
     /**
      * Close the hcatalog client.
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClientHMSImpl.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClientHMSImpl.java
index 5e97900..71ac426 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClientHMSImpl.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatClientHMSImpl.java
@@ -53,12 +53,12 @@
 public class HCatClientHMSImpl extends HCatClient {
 
     private HiveMetaStoreClient hmsClient;
-    private Configuration  config;
+    private Configuration config;
     private HiveConf hiveConfig;
 
     @Override
     public List<String> listDatabaseNamesByPattern(String pattern)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         List<String> dbNames = null;
         try {
             dbNames = hmsClient.getDatabases(pattern);
@@ -70,7 +70,7 @@
 
     @Override
     public HCatDatabase getDatabase(String dbName) throws HCatException,
-            ConnectionFailureException {
+        ConnectionFailureException {
         HCatDatabase db = null;
         try {
             Database hiveDB = hmsClient.getDatabase(checkDB(dbName));
@@ -79,42 +79,42 @@
             }
         } catch (NoSuchObjectException exp) {
             throw new HCatException(
-                    "NoSuchObjectException while fetching database", exp);
+                "NoSuchObjectException while fetching database", exp);
         } catch (MetaException exp) {
             throw new HCatException("MetaException while fetching database",
-                    exp);
+                exp);
         } catch (TException exp) {
             throw new ConnectionFailureException(
-                    "TException while fetching database", exp);
+                "TException while fetching database", exp);
         }
         return db;
     }
 
     @Override
     public void createDatabase(HCatCreateDBDesc dbInfo) throws HCatException,
-            ConnectionFailureException {
+        ConnectionFailureException {
         try {
             hmsClient.createDatabase(dbInfo.toHiveDb());
         } catch (AlreadyExistsException exp) {
             if (!dbInfo.getIfNotExists()) {
                 throw new HCatException(
-                        "AlreadyExistsException while creating database", exp);
+                    "AlreadyExistsException while creating database", exp);
             }
         } catch (InvalidObjectException exp) {
             throw new HCatException(
-                    "InvalidObjectException while creating database", exp);
+                "InvalidObjectException while creating database", exp);
         } catch (MetaException exp) {
             throw new HCatException("MetaException while creating database",
-                    exp);
+                exp);
         } catch (TException exp) {
             throw new ConnectionFailureException(
-                    "TException while creating database", exp);
+                "TException while creating database", exp);
         }
     }
 
     @Override
     public void dropDatabase(String dbName, boolean ifExists, DROP_DB_MODE mode)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         boolean isCascade;
         if (mode.toString().equalsIgnoreCase("cascade")) {
             isCascade = true;
@@ -126,35 +126,35 @@
         } catch (NoSuchObjectException e) {
             if (!ifExists) {
                 throw new HCatException(
-                        "NoSuchObjectException while dropping db.", e);
+                    "NoSuchObjectException while dropping db.", e);
             }
         } catch (InvalidOperationException e) {
             throw new HCatException(
-                    "InvalidOperationException while dropping db.", e);
+                "InvalidOperationException while dropping db.", e);
         } catch (MetaException e) {
             throw new HCatException("MetaException while dropping db.", e);
         } catch (TException e) {
             throw new ConnectionFailureException("TException while dropping db.",
-                    e);
+                e);
         }
     }
 
     @Override
     public List<String> listTableNamesByPattern(String dbName,
-            String tablePattern) throws HCatException, ConnectionFailureException {
+                                                String tablePattern) throws HCatException, ConnectionFailureException {
         List<String> tableNames = null;
         try {
             tableNames = hmsClient.getTables(checkDB(dbName), tablePattern);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while fetching table names.", e);
+                "MetaException while fetching table names.", e);
         }
         return tableNames;
     }
 
     @Override
     public HCatTable getTable(String dbName, String tableName)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         HCatTable table = null;
         try {
             Table hiveTable = hmsClient.getTable(checkDB(dbName), tableName);
@@ -165,35 +165,35 @@
             throw new HCatException("MetaException while fetching table.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while fetching table.", e);
+                "TException while fetching table.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while fetching table.", e);
+                "NoSuchObjectException while fetching table.", e);
         }
         return table;
     }
 
     @Override
     public void createTable(HCatCreateTableDesc createTableDesc)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         try {
             hmsClient.createTable(createTableDesc.toHiveTable(hiveConfig));
         } catch (AlreadyExistsException e) {
             if (createTableDesc.getIfNotExists() == false) {
                 throw new HCatException(
-                        "AlreadyExistsException while creating table.", e);
+                    "AlreadyExistsException while creating table.", e);
             }
         } catch (InvalidObjectException e) {
             throw new HCatException(
-                    "InvalidObjectException while creating table.", e);
+                "InvalidObjectException while creating table.", e);
         } catch (MetaException e) {
             throw new HCatException("MetaException while creating table.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while creating table.", e);
+                "NoSuchObjectException while creating table.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while creating table.", e);
+                "TException while creating table.", e);
         } catch (IOException e) {
             throw new HCatException("IOException while creating hive conf.", e);
         }
@@ -202,69 +202,69 @@
 
     @Override
     public void createTableLike(String dbName, String existingTblName,
-            String newTableName, boolean ifNotExists, boolean isExternal,
-            String location) throws HCatException, ConnectionFailureException {
+                                String newTableName, boolean ifNotExists, boolean isExternal,
+                                String location) throws HCatException, ConnectionFailureException {
 
         Table hiveTable = getHiveTableLike(checkDB(dbName), existingTblName,
-                newTableName, ifNotExists, location);
+            newTableName, ifNotExists, location);
         if (hiveTable != null) {
             try {
                 hmsClient.createTable(hiveTable);
             } catch (AlreadyExistsException e) {
                 if (!ifNotExists) {
                     throw new HCatException(
-                            "A table already exists with the name "
-                                    + newTableName, e);
+                        "A table already exists with the name "
+                            + newTableName, e);
                 }
             } catch (InvalidObjectException e) {
                 throw new HCatException(
-                        "InvalidObjectException in create table like command.",
-                        e);
+                    "InvalidObjectException in create table like command.",
+                    e);
             } catch (MetaException e) {
                 throw new HCatException(
-                        "MetaException in create table like command.", e);
+                    "MetaException in create table like command.", e);
             } catch (NoSuchObjectException e) {
                 throw new HCatException(
-                        "NoSuchObjectException in create table like command.",
-                        e);
+                    "NoSuchObjectException in create table like command.",
+                    e);
             } catch (TException e) {
                 throw new ConnectionFailureException(
-                        "TException in create table like command.", e);
+                    "TException in create table like command.", e);
             }
         }
     }
 
     @Override
     public void dropTable(String dbName, String tableName, boolean ifExists)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         try {
-            hmsClient.dropTable(checkDB(dbName), tableName,true, ifExists);
+            hmsClient.dropTable(checkDB(dbName), tableName, true, ifExists);
         } catch (NoSuchObjectException e) {
             if (!ifExists) {
                 throw new HCatException(
-                        "NoSuchObjectException while dropping table.", e);
+                    "NoSuchObjectException while dropping table.", e);
             }
         } catch (MetaException e) {
             throw new HCatException("MetaException while dropping table.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while dropping table.", e);
+                "TException while dropping table.", e);
         }
     }
 
     @Override
     public void renameTable(String dbName, String oldName, String newName)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         Table tbl;
         try {
             Table oldtbl = hmsClient.getTable(checkDB(dbName), oldName);
             if (oldtbl != null) {
                 // TODO : Should be moved out.
                 if (oldtbl
-                        .getParameters()
-                        .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE) != null) {
+                    .getParameters()
+                    .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE) != null) {
                     throw new HCatException(
-                            "Cannot use rename command on a non-native table");
+                        "Cannot use rename command on a non-native table");
                 }
                 tbl = new Table(oldtbl);
                 tbl.setTableName(newName);
@@ -274,229 +274,229 @@
             throw new HCatException("MetaException while renaming table", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while renaming table", e);
+                "TException while renaming table", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while renaming table", e);
+                "NoSuchObjectException while renaming table", e);
         } catch (InvalidOperationException e) {
             throw new HCatException(
-                    "InvalidOperationException while renaming table", e);
+                "InvalidOperationException while renaming table", e);
         }
     }
 
     @Override
     public List<HCatPartition> getPartitions(String dbName, String tblName)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         List<HCatPartition> hcatPtns = new ArrayList<HCatPartition>();
         try {
             List<Partition> hivePtns = hmsClient.listPartitions(
-                    checkDB(dbName), tblName, (short) -1);
+                checkDB(dbName), tblName, (short) -1);
             for (Partition ptn : hivePtns) {
                 hcatPtns.add(new HCatPartition(ptn));
             }
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while retrieving partition.", e);
+                "NoSuchObjectException while retrieving partition.", e);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while retrieving partition.", e);
+                "MetaException while retrieving partition.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while retrieving partition.", e);
+                "TException while retrieving partition.", e);
         }
         return hcatPtns;
     }
 
     @Override
     public HCatPartition getPartition(String dbName, String tableName,
-            Map<String, String> partitionSpec) throws HCatException,
-            ConnectionFailureException {
+                                      Map<String, String> partitionSpec) throws HCatException,
+        ConnectionFailureException {
         HCatPartition partition = null;
         try {
             ArrayList<String> ptnValues = new ArrayList<String>();
             ptnValues.addAll(partitionSpec.values());
             Partition hivePartition = hmsClient.getPartition(checkDB(dbName),
-                    tableName, ptnValues);
+                tableName, ptnValues);
             if (hivePartition != null) {
                 partition = new HCatPartition(hivePartition);
             }
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while retrieving partition.", e);
+                "MetaException while retrieving partition.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while retrieving partition.", e);
+                "TException while retrieving partition.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while retrieving partition.", e);
+                "NoSuchObjectException while retrieving partition.", e);
         }
         return partition;
     }
 
     @Override
     public void addPartition(HCatAddPartitionDesc partInfo)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         Table tbl = null;
         try {
             tbl = hmsClient.getTable(partInfo.getDatabaseName(),
-                    partInfo.getTableName());
+                partInfo.getTableName());
             // TODO: Should be moved out.
             if (tbl.getPartitionKeysSize() == 0) {
                 throw new HCatException("The table " + partInfo.getTableName()
-                        + " is not partitioned.");
+                    + " is not partitioned.");
             }
 
             hmsClient.add_partition(partInfo.toHivePartition(tbl));
         } catch (InvalidObjectException e) {
             throw new HCatException(
-                    "InvalidObjectException while adding partition.", e);
+                "InvalidObjectException while adding partition.", e);
         } catch (AlreadyExistsException e) {
             throw new HCatException(
-                    "AlreadyExistsException while adding partition.", e);
+                "AlreadyExistsException while adding partition.", e);
         } catch (MetaException e) {
             throw new HCatException("MetaException while adding partition.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while adding partition.", e);
+                "TException while adding partition.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException("The table " + partInfo.getTableName()
-                    + " is could not be found.", e);
+                + " is could not be found.", e);
         }
     }
 
     @Override
     public void dropPartition(String dbName, String tableName,
-            Map<String, String> partitionSpec, boolean ifExists)
-            throws HCatException, ConnectionFailureException {
+                              Map<String, String> partitionSpec, boolean ifExists)
+        throws HCatException, ConnectionFailureException {
         try {
             List<String> ptnValues = new ArrayList<String>();
             ptnValues.addAll(partitionSpec.values());
             hmsClient.dropPartition(checkDB(dbName), tableName, ptnValues,
-                    ifExists);
+                ifExists);
         } catch (NoSuchObjectException e) {
             if (!ifExists) {
                 throw new HCatException(
-                        "NoSuchObjectException while dropping partition.", e);
+                    "NoSuchObjectException while dropping partition.", e);
             }
         } catch (MetaException e) {
             throw new HCatException("MetaException while dropping partition.",
-                    e);
+                e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while dropping partition.", e);
+                "TException while dropping partition.", e);
         }
     }
 
     @Override
     public List<HCatPartition> listPartitionsByFilter(String dbName,
-            String tblName, String filter) throws HCatException,
-            ConnectionFailureException {
+                                                      String tblName, String filter) throws HCatException,
+        ConnectionFailureException {
         List<HCatPartition> hcatPtns = new ArrayList<HCatPartition>();
         try {
             List<Partition> hivePtns = hmsClient.listPartitionsByFilter(
-                    checkDB(dbName), tblName, filter, (short) -1);
+                checkDB(dbName), tblName, filter, (short) -1);
             for (Partition ptn : hivePtns) {
                 hcatPtns.add(new HCatPartition(ptn));
             }
         } catch (MetaException e) {
             throw new HCatException("MetaException while fetching partitions.",
-                    e);
+                e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while fetching partitions.", e);
+                "NoSuchObjectException while fetching partitions.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while fetching partitions.", e);
+                "TException while fetching partitions.", e);
         }
         return hcatPtns;
     }
 
     @Override
     public void markPartitionForEvent(String dbName, String tblName,
-            Map<String, String> partKVs, PartitionEventType eventType)
-            throws HCatException, ConnectionFailureException {
+                                      Map<String, String> partKVs, PartitionEventType eventType)
+        throws HCatException, ConnectionFailureException {
         try {
             hmsClient.markPartitionForEvent(checkDB(dbName), tblName, partKVs,
-                    eventType);
+                eventType);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while marking partition for event.", e);
+                "MetaException while marking partition for event.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while marking partition for event.",
-                    e);
+                "NoSuchObjectException while marking partition for event.",
+                e);
         } catch (UnknownTableException e) {
             throw new HCatException(
-                    "UnknownTableException while marking partition for event.",
-                    e);
+                "UnknownTableException while marking partition for event.",
+                e);
         } catch (UnknownDBException e) {
             throw new HCatException(
-                    "UnknownDBException while marking partition for event.", e);
+                "UnknownDBException while marking partition for event.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while marking partition for event.", e);
+                "TException while marking partition for event.", e);
         } catch (InvalidPartitionException e) {
             throw new HCatException(
-                    "InvalidPartitionException while marking partition for event.",
-                    e);
+                "InvalidPartitionException while marking partition for event.",
+                e);
         } catch (UnknownPartitionException e) {
             throw new HCatException(
-                    "UnknownPartitionException while marking partition for event.",
-                    e);
+                "UnknownPartitionException while marking partition for event.",
+                e);
         }
     }
 
     @Override
     public boolean isPartitionMarkedForEvent(String dbName, String tblName,
-            Map<String, String> partKVs, PartitionEventType eventType)
-            throws HCatException, ConnectionFailureException {
+                                             Map<String, String> partKVs, PartitionEventType eventType)
+        throws HCatException, ConnectionFailureException {
         boolean isMarked = false;
         try {
             isMarked = hmsClient.isPartitionMarkedForEvent(checkDB(dbName),
-                    tblName, partKVs, eventType);
+                tblName, partKVs, eventType);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while checking partition for event.", e);
+                "MetaException while checking partition for event.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException(
-                    "NoSuchObjectException while checking partition for event.",
-                    e);
+                "NoSuchObjectException while checking partition for event.",
+                e);
         } catch (UnknownTableException e) {
             throw new HCatException(
-                    "UnknownTableException while checking partition for event.",
-                    e);
+                "UnknownTableException while checking partition for event.",
+                e);
         } catch (UnknownDBException e) {
             throw new HCatException(
-                    "UnknownDBException while checking partition for event.", e);
+                "UnknownDBException while checking partition for event.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while checking partition for event.", e);
+                "TException while checking partition for event.", e);
         } catch (InvalidPartitionException e) {
             throw new HCatException(
-                    "InvalidPartitionException while checking partition for event.",
-                    e);
+                "InvalidPartitionException while checking partition for event.",
+                e);
         } catch (UnknownPartitionException e) {
             throw new HCatException(
-                    "UnknownPartitionException while checking partition for event.",
-                    e);
+                "UnknownPartitionException while checking partition for event.",
+                e);
         }
         return isMarked;
     }
 
     @Override
     public String getDelegationToken(String owner,
-            String renewerKerberosPrincipalName) throws HCatException,
-            ConnectionFailureException {
+                                     String renewerKerberosPrincipalName) throws HCatException,
+        ConnectionFailureException {
         String token = null;
         try {
             token = hmsClient.getDelegationToken(owner,
-                    renewerKerberosPrincipalName);
+                renewerKerberosPrincipalName);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while getting delegation token.", e);
+                "MetaException while getting delegation token.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while getting delegation token.", e);
+                "TException while getting delegation token.", e);
         }
 
         return token;
@@ -504,16 +504,16 @@
 
     @Override
     public long renewDelegationToken(String tokenStrForm) throws HCatException,
-            ConnectionFailureException {
+        ConnectionFailureException {
         long time = 0;
         try {
             time = hmsClient.renewDelegationToken(tokenStrForm);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while renewing delegation token.", e);
+                "MetaException while renewing delegation token.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while renewing delegation token.", e);
+                "TException while renewing delegation token.", e);
         }
 
         return time;
@@ -521,15 +521,15 @@
 
     @Override
     public void cancelDelegationToken(String tokenStrForm)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         try {
             hmsClient.cancelDelegationToken(tokenStrForm);
         } catch (MetaException e) {
             throw new HCatException(
-                    "MetaException while canceling delegation token.", e);
+                "MetaException while canceling delegation token.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while canceling delegation token.", e);
+                "TException while canceling delegation token.", e);
         }
     }
 
@@ -542,38 +542,38 @@
      */
     @Override
     void initialize(Configuration conf) throws HCatException,
-            ConnectionFailureException {
+        ConnectionFailureException {
         this.config = conf;
         try {
             hiveConfig = HCatUtil.getHiveConf(config);
             hmsClient = HCatUtil.getHiveClient(hiveConfig);
         } catch (MetaException exp) {
             throw new HCatException("MetaException while creating HMS client",
-                    exp);
+                exp);
         } catch (IOException exp) {
             throw new HCatException("IOException while creating HMS client",
-                    exp);
+                exp);
         }
 
     }
 
     private Table getHiveTableLike(String dbName, String existingTblName,
-            String newTableName, boolean isExternal, String location)
-            throws HCatException, ConnectionFailureException {
+                                   String newTableName, boolean isExternal, String location)
+        throws HCatException, ConnectionFailureException {
         Table oldtbl = null;
         Table newTable = null;
         try {
             oldtbl = hmsClient.getTable(checkDB(dbName), existingTblName);
         } catch (MetaException e1) {
             throw new HCatException(
-                    "MetaException while retrieving existing table.", e1);
+                "MetaException while retrieving existing table.", e1);
         } catch (TException e1) {
             throw new ConnectionFailureException(
-                    "TException while retrieving existing table.", e1);
+                "TException while retrieving existing table.", e1);
         } catch (NoSuchObjectException e1) {
             throw new HCatException(
-                    "NoSuchObjectException while retrieving existing table.",
-                    e1);
+                "NoSuchObjectException while retrieving existing table.",
+                e1);
         }
         if (oldtbl != null) {
             newTable = new Table();
@@ -626,7 +626,7 @@
      */
     @Override
     public int addPartitions(List<HCatAddPartitionDesc> partInfoList)
-            throws HCatException, ConnectionFailureException {
+        throws HCatException, ConnectionFailureException {
         int numPartitions = -1;
         if ((partInfoList == null) || (partInfoList.size() == 0)) {
             throw new HCatException("The partition list is null or empty.");
@@ -635,7 +635,7 @@
         Table tbl = null;
         try {
             tbl = hmsClient.getTable(partInfoList.get(0).getDatabaseName(),
-                    partInfoList.get(0).getTableName());
+                partInfoList.get(0).getTableName());
             ArrayList<Partition> ptnList = new ArrayList<Partition>();
             for (HCatAddPartitionDesc desc : partInfoList) {
                 ptnList.add(desc.toHivePartition(tbl));
@@ -643,19 +643,19 @@
             numPartitions = hmsClient.add_partitions(ptnList);
         } catch (InvalidObjectException e) {
             throw new HCatException(
-                    "InvalidObjectException while adding partition.", e);
+                "InvalidObjectException while adding partition.", e);
         } catch (AlreadyExistsException e) {
             throw new HCatException(
-                    "AlreadyExistsException while adding partition.", e);
+                "AlreadyExistsException while adding partition.", e);
         } catch (MetaException e) {
             throw new HCatException("MetaException while adding partition.", e);
         } catch (TException e) {
             throw new ConnectionFailureException(
-                    "TException while adding partition.", e);
+                "TException while adding partition.", e);
         } catch (NoSuchObjectException e) {
             throw new HCatException("The table "
-                    + partInfoList.get(0).getTableName()
-                    + " is could not be found.", e);
+                + partInfoList.get(0).getTableName()
+                + " is could not be found.", e);
         }
         return numPartitions;
     }
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateDBDesc.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateDBDesc.java
index 22f093c..3f8928c 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateDBDesc.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateDBDesc.java
@@ -47,7 +47,7 @@
      *
      * @return the if not exists
      */
-    public boolean getIfNotExists(){
+    public boolean getIfNotExists() {
         return this.ifNotExits;
     }
 
@@ -78,19 +78,19 @@
         return this.dbName;
     }
 
-    private HCatCreateDBDesc(String dbName){
-       this.dbName = dbName;
+    private HCatCreateDBDesc(String dbName) {
+        this.dbName = dbName;
     }
 
     @Override
     public String toString() {
         return "HCatCreateDBDesc ["
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + (locationUri != null ? "location=" + locationUri + ", "
-                        : "location=null")
-                + (comment != null ? "comment=" + comment + ", " : "comment=null")
-                + (dbProperties != null ? "dbProperties=" + dbProperties + ", "
-                        : "dbProperties=null") + "ifNotExits=" + ifNotExits + "]";
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + (locationUri != null ? "location=" + locationUri + ", "
+            : "location=null")
+            + (comment != null ? "comment=" + comment + ", " : "comment=null")
+            + (dbProperties != null ? "dbProperties=" + dbProperties + ", "
+            : "dbProperties=null") + "ifNotExits=" + ifNotExits + "]";
     }
 
     /**
@@ -99,11 +99,11 @@
      * @param dbName the db name
      * @return the builder
      */
-    public static Builder create(String dbName){
+    public static Builder create(String dbName) {
         return new Builder(dbName);
     }
 
-    Database toHiveDb(){
+    Database toHiveDb() {
         Database hiveDB = new Database();
         hiveDB.setDescription(this.comment);
         hiveDB.setLocationUri(this.locationUri);
@@ -120,7 +120,7 @@
         private String dbName;
         private boolean ifNotExists = false;
 
-        private Builder(String dbName){
+        private Builder(String dbName) {
             this.dbName = dbName;
         }
 
@@ -130,7 +130,7 @@
          * @param value the location of the database.
          * @return the builder
          */
-        public Builder location(String value){
+        public Builder location(String value) {
             this.innerLoc = value;
             return this;
         }
@@ -141,7 +141,7 @@
          * @param value comments.
          * @return the builder
          */
-        public Builder comment(String value){
+        public Builder comment(String value) {
             this.innerComment = value;
             return this;
         }
@@ -152,7 +152,7 @@
          * database with the same name already exists.
          * @return the builder
          */
-        public Builder ifNotExists(boolean ifNotExists){
+        public Builder ifNotExists(boolean ifNotExists) {
             this.ifNotExists = ifNotExists;
             return this;
         }
@@ -176,7 +176,7 @@
          * @throws HCatException
          */
         public HCatCreateDBDesc build() throws HCatException {
-            if(this.dbName == null){
+            if (this.dbName == null) {
                 throw new HCatException("Database name cannot be null.");
             }
             HCatCreateDBDesc desc = new HCatCreateDBDesc(this.dbName);
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateTableDesc.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateTableDesc.java
index b2bfcb4..5a895a7 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateTableDesc.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatCreateTableDesc.java
@@ -50,7 +50,7 @@
  * The Class HCatCreateTableDesc for defining attributes for a new table.
  */
 @SuppressWarnings("deprecation")
-public class HCatCreateTableDesc{
+public class HCatCreateTableDesc {
 
     private static final Logger LOG = LoggerFactory.getLogger(HCatCreateTableDesc.class);
 
@@ -72,7 +72,7 @@
     private String serde;
     private String storageHandler;
 
-    private HCatCreateTableDesc(String dbName, String tableName, List<HCatFieldSchema> columns){
+    private HCatCreateTableDesc(String dbName, String tableName, List<HCatFieldSchema> columns) {
         this.dbName = dbName;
         this.tableName = tableName;
         this.cols = columns;
@@ -86,11 +86,11 @@
      * @param columns the columns
      * @return the builder
      */
-    public static Builder create(String dbName, String tableName, List<HCatFieldSchema> columns){
+    public static Builder create(String dbName, String tableName, List<HCatFieldSchema> columns) {
         return new Builder(dbName, tableName, columns);
     }
 
-    Table toHiveTable(HiveConf conf) throws HCatException{
+    Table toHiveTable(HiveConf conf) throws HCatException {
 
         Table newTable = new Table();
         newTable.setDbName(dbName);
@@ -122,26 +122,26 @@
             } else {
                 LOG.info("Using LazySimpleSerDe for table " + tableName);
                 sd.getSerdeInfo()
-                        .setSerializationLib(
-                                org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class
-                                        .getName());
+                    .setSerializationLib(
+                        org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.class
+                            .getName());
             }
         } else {
             try {
                 LOG.info("Creating instance of storage handler to get input/output, serder info.");
                 HiveStorageHandler sh = HiveUtils.getStorageHandler(conf,
-                        storageHandler);
+                    storageHandler);
                 sd.setInputFormat(sh.getInputFormatClass().getName());
                 sd.setOutputFormat(sh.getOutputFormatClass().getName());
                 sd.getSerdeInfo().setSerializationLib(
-                        sh.getSerDeClass().getName());
+                    sh.getSerDeClass().getName());
                 newTable.putToParameters(
-                        org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE,
-                        storageHandler);
+                    org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE,
+                    storageHandler);
             } catch (HiveException e) {
                 throw new HCatException(
-                        "Exception while creating instance of storage handler",
-                        e);
+                    "Exception while creating instance of storage handler",
+                    e);
             }
         }
         newTable.setSd(sd);
@@ -175,345 +175,345 @@
         return newTable;
     }
 
-      /**
-       * Gets the if not exists.
-       *
-       * @return the if not exists
-       */
-      public boolean getIfNotExists() {
-          return this.ifNotExists;
-      }
-
-     /**
-      * Gets the table name.
-      *
-      * @return the table name
-      */
-     public String getTableName() {
-          return this.tableName;
-      }
-
-      /**
-       * Gets the cols.
-       *
-       * @return the cols
-       */
-      public List<HCatFieldSchema> getCols() {
-         return this.cols;
-      }
-
-      /**
-       * Gets the partition cols.
-       *
-       * @return the partition cols
-       */
-      public List<HCatFieldSchema> getPartitionCols() {
-          return this.partCols;
-      }
-
-      /**
-       * Gets the bucket cols.
-       *
-       * @return the bucket cols
-       */
-      public List<String> getBucketCols() {
-          return this.bucketCols;
-      }
-
-      public int getNumBuckets() {
-          return this.numBuckets;
-      }
-
-      /**
-       * Gets the comments.
-       *
-       * @return the comments
-       */
-      public String getComments() {
-          return this.comment;
-      }
-
-      /**
-       * Gets the storage handler.
-       *
-       * @return the storage handler
-       */
-      public String getStorageHandler() {
-          return this.storageHandler;
-      }
-
-      /**
-       * Gets the location.
-       *
-       * @return the location
-       */
-      public String getLocation() {
-          return this.location;
-      }
-
-      /**
-       * Gets the external.
-       *
-       * @return the external
-       */
-      public boolean getExternal() {
-          return this.isExternal;
-      }
-
-      /**
-       * Gets the sort cols.
-       *
-       * @return the sort cols
-       */
-      public List<Order> getSortCols() {
-          return this.sortCols;
-      }
-
-      /**
-       * Gets the tbl props.
-       *
-       * @return the tbl props
-       */
-      public Map<String, String> getTblProps() {
-          return this.tblProps;
-      }
-
-      /**
-       * Gets the file format.
-       *
-       * @return the file format
-       */
-      public String getFileFormat(){
-          return this.fileFormat;
-      }
-
-      /**
-       * Gets the database name.
-       *
-       * @return the database name
-       */
-      public String getDatabaseName() {
-          return this.dbName;
-      }
-
-      @Override
-    public String toString() {
-        return "HCatCreateTableDesc ["
-                + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + "isExternal="
-                + isExternal
-                + ", "
-                + (comment != null ? "comment=" + comment + ", " : "comment=null")
-                + (location != null ? "location=" + location + ", " : "location=null")
-                + (cols != null ? "cols=" + cols + ", " : "cols=null")
-                + (partCols != null ? "partCols=" + partCols + ", " : "partCols=null")
-                + (bucketCols != null ? "bucketCols=" + bucketCols + ", " : "bucketCols=null")
-                + "numBuckets="
-                + numBuckets
-                + ", "
-                + (sortCols != null ? "sortCols=" + sortCols + ", " : "sortCols=null")
-                + (tblProps != null ? "tblProps=" + tblProps + ", " : "tblProps=null")
-                + "ifNotExists="
-                + ifNotExists
-                + ", "
-                + (fileFormat != null ? "fileFormat=" + fileFormat + ", " : "fileFormat=null")
-                + (inputformat != null ? "inputformat=" + inputformat + ", "
-                        : "inputformat=null")
-                + (outputformat != null ? "outputformat=" + outputformat + ", "
-                        : "outputformat=null")
-                + (serde != null ? "serde=" + serde + ", " : "serde=null")
-                + (storageHandler != null ? "storageHandler=" + storageHandler
-                        : "storageHandler=null") + "]";
+    /**
+     * Gets the if not exists.
+     *
+     * @return the if not exists
+     */
+    public boolean getIfNotExists() {
+        return this.ifNotExists;
     }
 
-    public static class Builder{
+    /**
+     * Gets the table name.
+     *
+     * @return the table name
+     */
+    public String getTableName() {
+        return this.tableName;
+    }
 
-          private String tableName;
-          private boolean isExternal;
-          private List<HCatFieldSchema> cols;
-          private List<HCatFieldSchema> partCols;
-          private List<String> bucketCols;
-          private List<Order> sortCols;
-          private int numBuckets;
-          private String comment;
-          private String fileFormat;
-          private String location;
-          private String storageHandler;
-          private Map<String, String> tblProps;
-          private boolean ifNotExists;
-          private String dbName;
+    /**
+     * Gets the cols.
+     *
+     * @return the cols
+     */
+    public List<HCatFieldSchema> getCols() {
+        return this.cols;
+    }
+
+    /**
+     * Gets the partition cols.
+     *
+     * @return the partition cols
+     */
+    public List<HCatFieldSchema> getPartitionCols() {
+        return this.partCols;
+    }
+
+    /**
+     * Gets the bucket cols.
+     *
+     * @return the bucket cols
+     */
+    public List<String> getBucketCols() {
+        return this.bucketCols;
+    }
+
+    public int getNumBuckets() {
+        return this.numBuckets;
+    }
+
+    /**
+     * Gets the comments.
+     *
+     * @return the comments
+     */
+    public String getComments() {
+        return this.comment;
+    }
+
+    /**
+     * Gets the storage handler.
+     *
+     * @return the storage handler
+     */
+    public String getStorageHandler() {
+        return this.storageHandler;
+    }
+
+    /**
+     * Gets the location.
+     *
+     * @return the location
+     */
+    public String getLocation() {
+        return this.location;
+    }
+
+    /**
+     * Gets the external.
+     *
+     * @return the external
+     */
+    public boolean getExternal() {
+        return this.isExternal;
+    }
+
+    /**
+     * Gets the sort cols.
+     *
+     * @return the sort cols
+     */
+    public List<Order> getSortCols() {
+        return this.sortCols;
+    }
+
+    /**
+     * Gets the tbl props.
+     *
+     * @return the tbl props
+     */
+    public Map<String, String> getTblProps() {
+        return this.tblProps;
+    }
+
+    /**
+     * Gets the file format.
+     *
+     * @return the file format
+     */
+    public String getFileFormat() {
+        return this.fileFormat;
+    }
+
+    /**
+     * Gets the database name.
+     *
+     * @return the database name
+     */
+    public String getDatabaseName() {
+        return this.dbName;
+    }
+
+    @Override
+    public String toString() {
+        return "HCatCreateTableDesc ["
+            + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + "isExternal="
+            + isExternal
+            + ", "
+            + (comment != null ? "comment=" + comment + ", " : "comment=null")
+            + (location != null ? "location=" + location + ", " : "location=null")
+            + (cols != null ? "cols=" + cols + ", " : "cols=null")
+            + (partCols != null ? "partCols=" + partCols + ", " : "partCols=null")
+            + (bucketCols != null ? "bucketCols=" + bucketCols + ", " : "bucketCols=null")
+            + "numBuckets="
+            + numBuckets
+            + ", "
+            + (sortCols != null ? "sortCols=" + sortCols + ", " : "sortCols=null")
+            + (tblProps != null ? "tblProps=" + tblProps + ", " : "tblProps=null")
+            + "ifNotExists="
+            + ifNotExists
+            + ", "
+            + (fileFormat != null ? "fileFormat=" + fileFormat + ", " : "fileFormat=null")
+            + (inputformat != null ? "inputformat=" + inputformat + ", "
+            : "inputformat=null")
+            + (outputformat != null ? "outputformat=" + outputformat + ", "
+            : "outputformat=null")
+            + (serde != null ? "serde=" + serde + ", " : "serde=null")
+            + (storageHandler != null ? "storageHandler=" + storageHandler
+            : "storageHandler=null") + "]";
+    }
+
+    public static class Builder {
+
+        private String tableName;
+        private boolean isExternal;
+        private List<HCatFieldSchema> cols;
+        private List<HCatFieldSchema> partCols;
+        private List<String> bucketCols;
+        private List<Order> sortCols;
+        private int numBuckets;
+        private String comment;
+        private String fileFormat;
+        private String location;
+        private String storageHandler;
+        private Map<String, String> tblProps;
+        private boolean ifNotExists;
+        private String dbName;
 
 
-          private Builder(String dbName, String tableName, List<HCatFieldSchema> columns) {
-              this.dbName = dbName;
-              this.tableName = tableName;
-              this.cols = columns;
-          }
+        private Builder(String dbName, String tableName, List<HCatFieldSchema> columns) {
+            this.dbName = dbName;
+            this.tableName = tableName;
+            this.cols = columns;
+        }
 
 
-          /**
-           * If not exists.
-           *
-           * @param ifNotExists If set to true, hive will not throw exception, if a
-           * table with the same name already exists.
-           * @return the builder
-           */
-          public Builder ifNotExists(boolean ifNotExists) {
+        /**
+         * If not exists.
+         *
+         * @param ifNotExists If set to true, hive will not throw exception, if a
+         * table with the same name already exists.
+         * @return the builder
+         */
+        public Builder ifNotExists(boolean ifNotExists) {
             this.ifNotExists = ifNotExists;
             return this;
-          }
+        }
 
 
-          /**
-           * Partition cols.
-           *
-           * @param partCols the partition cols
-           * @return the builder
-           */
-          public Builder partCols(ArrayList<HCatFieldSchema> partCols) {
-              this.partCols = partCols;
-              return this;
-          }
+        /**
+         * Partition cols.
+         *
+         * @param partCols the partition cols
+         * @return the builder
+         */
+        public Builder partCols(ArrayList<HCatFieldSchema> partCols) {
+            this.partCols = partCols;
+            return this;
+        }
 
 
-          /**
-           * Bucket cols.
-           *
-           * @param bucketCols the bucket cols
-           * @return the builder
-           */
-          public Builder bucketCols(ArrayList<String> bucketCols, int buckets) {
+        /**
+         * Bucket cols.
+         *
+         * @param bucketCols the bucket cols
+         * @return the builder
+         */
+        public Builder bucketCols(ArrayList<String> bucketCols, int buckets) {
             this.bucketCols = bucketCols;
             this.numBuckets = buckets;
             return this;
-          }
+        }
 
-          /**
-           * Storage handler.
-           *
-           * @param storageHandler the storage handler
-           * @return the builder
-           */
-          public Builder storageHandler(String storageHandler) {
+        /**
+         * Storage handler.
+         *
+         * @param storageHandler the storage handler
+         * @return the builder
+         */
+        public Builder storageHandler(String storageHandler) {
             this.storageHandler = storageHandler;
             return this;
-          }
+        }
 
-          /**
-           * Location.
-           *
-           * @param location the location
-           * @return the builder
-           */
-          public Builder location(String location) {
+        /**
+         * Location.
+         *
+         * @param location the location
+         * @return the builder
+         */
+        public Builder location(String location) {
             this.location = location;
             return this;
-          }
+        }
 
-          /**
-           * Comments.
-           *
-           * @param comment the comment
-           * @return the builder
-           */
-          public Builder comments(String comment) {
+        /**
+         * Comments.
+         *
+         * @param comment the comment
+         * @return the builder
+         */
+        public Builder comments(String comment) {
             this.comment = comment;
             return this;
-          }
+        }
 
-          /**
-           * Checks if is table external.
-           *
-           * @param isExternal the is external
-           * @return the builder
-           */
-          public Builder isTableExternal(boolean isExternal) {
+        /**
+         * Checks if is table external.
+         *
+         * @param isExternal the is external
+         * @return the builder
+         */
+        public Builder isTableExternal(boolean isExternal) {
             this.isExternal = isExternal;
             return this;
-          }
+        }
 
-          /**
-           * Sort cols.
-           *
-           * @param sortCols the sort cols
-           * @return the builder
-           */
-          public Builder sortCols(ArrayList<Order> sortCols) {
+        /**
+         * Sort cols.
+         *
+         * @param sortCols the sort cols
+         * @return the builder
+         */
+        public Builder sortCols(ArrayList<Order> sortCols) {
             this.sortCols = sortCols;
             return this;
-          }
+        }
 
-          /**
-           * Tbl props.
-           *
-           * @param tblProps the tbl props
-           * @return the builder
-           */
-          public Builder tblProps(Map<String, String> tblProps) {
+        /**
+         * Tbl props.
+         *
+         * @param tblProps the tbl props
+         * @return the builder
+         */
+        public Builder tblProps(Map<String, String> tblProps) {
             this.tblProps = tblProps;
             return this;
-          }
+        }
 
-          /**
-           * File format.
-           *
-           * @param format the format
-           * @return the builder
-           */
-          public Builder fileFormat(String format){
-              this.fileFormat = format;
-              return this;
-          }
+        /**
+         * File format.
+         *
+         * @param format the format
+         * @return the builder
+         */
+        public Builder fileFormat(String format) {
+            this.fileFormat = format;
+            return this;
+        }
 
-          /**
-           * Builds the HCatCreateTableDesc.
-           *
-           * @return HCatCreateTableDesc
-           * @throws HCatException
-           */
-          public HCatCreateTableDesc build() throws HCatException {
-              if(this.dbName == null){
+        /**
+         * Builds the HCatCreateTableDesc.
+         *
+         * @return HCatCreateTableDesc
+         * @throws HCatException
+         */
+        public HCatCreateTableDesc build() throws HCatException {
+            if (this.dbName == null) {
                 LOG.info("Database name found null. Setting db to :"
-                        + MetaStoreUtils.DEFAULT_DATABASE_NAME);
+                    + MetaStoreUtils.DEFAULT_DATABASE_NAME);
                 this.dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
-              }
-              HCatCreateTableDesc desc = new HCatCreateTableDesc(this.dbName,
-                      this.tableName, this.cols);
-              desc.ifNotExists = this.ifNotExists;
-              desc.isExternal = this.isExternal;
-              desc.comment = this.comment;
-              desc.partCols = this.partCols;
-              desc.bucketCols = this.bucketCols;
-              desc.numBuckets = this.numBuckets;
-              desc.location = this.location;
-              desc.tblProps = this.tblProps;
-              desc.sortCols = this.sortCols;
-              desc.serde = null;
-              if (!StringUtils.isEmpty(fileFormat)) {
-                  desc.fileFormat = fileFormat;
-                  if ("SequenceFile".equalsIgnoreCase(fileFormat)) {
-                      desc.inputformat = SequenceFileInputFormat.class.getName();
-                      desc.outputformat = SequenceFileOutputFormat.class
-                              .getName();
-                  } else if ("RCFile".equalsIgnoreCase(fileFormat)) {
-                      desc.inputformat = RCFileInputFormat.class.getName();
-                      desc.outputformat = RCFileOutputFormat.class.getName();
-                      desc.serde = ColumnarSerDe.class.getName();
-                  }
-                  desc.storageHandler = StringUtils.EMPTY;
-              } else if (!StringUtils.isEmpty(storageHandler)) {
-                  desc.storageHandler = storageHandler;
-              } else {
-                  desc.fileFormat = "TextFile";
-                  LOG.info("Using text file format for the table.");
-                  desc.inputformat = TextInputFormat.class.getName();
-                  LOG.info("Table input format:" + desc.inputformat);
-                  desc.outputformat = IgnoreKeyTextOutputFormat.class
-                          .getName();
-                  LOG.info("Table output format:" + desc.outputformat);
-              }
-              return desc;
-          }
-      }
+            }
+            HCatCreateTableDesc desc = new HCatCreateTableDesc(this.dbName,
+                this.tableName, this.cols);
+            desc.ifNotExists = this.ifNotExists;
+            desc.isExternal = this.isExternal;
+            desc.comment = this.comment;
+            desc.partCols = this.partCols;
+            desc.bucketCols = this.bucketCols;
+            desc.numBuckets = this.numBuckets;
+            desc.location = this.location;
+            desc.tblProps = this.tblProps;
+            desc.sortCols = this.sortCols;
+            desc.serde = null;
+            if (!StringUtils.isEmpty(fileFormat)) {
+                desc.fileFormat = fileFormat;
+                if ("SequenceFile".equalsIgnoreCase(fileFormat)) {
+                    desc.inputformat = SequenceFileInputFormat.class.getName();
+                    desc.outputformat = SequenceFileOutputFormat.class
+                        .getName();
+                } else if ("RCFile".equalsIgnoreCase(fileFormat)) {
+                    desc.inputformat = RCFileInputFormat.class.getName();
+                    desc.outputformat = RCFileOutputFormat.class.getName();
+                    desc.serde = ColumnarSerDe.class.getName();
+                }
+                desc.storageHandler = StringUtils.EMPTY;
+            } else if (!StringUtils.isEmpty(storageHandler)) {
+                desc.storageHandler = storageHandler;
+            } else {
+                desc.fileFormat = "TextFile";
+                LOG.info("Using text file format for the table.");
+                desc.inputformat = TextInputFormat.class.getName();
+                LOG.info("Table input format:" + desc.inputformat);
+                desc.outputformat = IgnoreKeyTextOutputFormat.class
+                    .getName();
+                LOG.info("Table output format:" + desc.outputformat);
+            }
+            return desc;
+        }
+    }
 }
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatDatabase.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatDatabase.java
index 146ce72..9cb9ca9 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatDatabase.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatDatabase.java
@@ -44,7 +44,7 @@
      *
      * @return the database name
      */
-    public String getName(){
+    public String getName() {
         return dbName;
     }
 
@@ -53,7 +53,7 @@
      *
      * @return the dB location
      */
-    public String getLocation(){
+    public String getLocation() {
         return dbLocation;
     }
 
@@ -62,7 +62,7 @@
      *
      * @return the comment
      */
-    public String getComment(){
+    public String getComment() {
         return comment;
     }
 
@@ -71,17 +71,17 @@
      *
      * @return the dB properties
      */
-    public Map<String, String> getProperties(){
+    public Map<String, String> getProperties() {
         return props;
     }
 
     @Override
     public String toString() {
         return "HCatDatabase ["
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + (dbLocation != null ? "dbLocation=" + dbLocation + ", " : "dbLocation=null")
-                + (comment != null ? "comment=" + comment + ", " : "comment=null")
-                + (props != null ? "props=" + props : "props=null") + "]";
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + (dbLocation != null ? "dbLocation=" + dbLocation + ", " : "dbLocation=null")
+            + (comment != null ? "comment=" + comment + ", " : "comment=null")
+            + (props != null ? "props=" + props : "props=null") + "]";
     }
 
 }
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatPartition.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatPartition.java
index 38971e1..7ee4da0 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatPartition.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatPartition.java
@@ -41,7 +41,7 @@
     private int createTime;
     private int lastAccessTime;
     private StorageDescriptor sd;
-    private Map<String,String> parameters;
+    private Map<String, String> parameters;
 
     HCatPartition(Partition partition) throws HCatException {
         this.tableName = partition.getTableName();
@@ -62,7 +62,7 @@
      *
      * @return the table name
      */
-    public String getTableName(){
+    public String getTableName() {
         return this.tableName;
     }
 
@@ -71,7 +71,7 @@
      *
      * @return the database name
      */
-    public String getDatabaseName(){
+    public String getDatabaseName() {
         return this.dbName;
     }
 
@@ -80,8 +80,8 @@
      *
      * @return the columns
      */
-    public List<HCatFieldSchema> getColumns(){
-       return this.tableCols;
+    public List<HCatFieldSchema> getColumns() {
+        return this.tableCols;
     }
 
     /**
@@ -89,7 +89,7 @@
      *
      * @return the input format
      */
-    public String getInputFormat(){
+    public String getInputFormat() {
         return this.sd.getInputFormat();
     }
 
@@ -98,7 +98,7 @@
      *
      * @return the output format
      */
-    public String getOutputFormat(){
+    public String getOutputFormat() {
         return this.sd.getOutputFormat();
     }
 
@@ -109,8 +109,8 @@
      */
     public String getStorageHandler() {
         return this.sd
-                .getParameters()
-                .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE);
+            .getParameters()
+            .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE);
     }
 
     /**
@@ -118,7 +118,7 @@
      *
      * @return the location
      */
-    public String getLocation(){
+    public String getLocation() {
         return this.sd.getLocation();
     }
 
@@ -127,7 +127,7 @@
      *
      * @return the serde
      */
-    public String getSerDe(){
+    public String getSerDe() {
         return this.sd.getSerdeInfo().getSerializationLib();
     }
 
@@ -140,7 +140,7 @@
      *
      * @return the last access time
      */
-    public int getLastAccessTime(){
+    public int getLastAccessTime() {
         return this.lastAccessTime;
     }
 
@@ -158,7 +158,7 @@
      *
      * @return the values
      */
-    public List<String> getValues(){
+    public List<String> getValues() {
         return this.values;
     }
 
@@ -167,7 +167,7 @@
      *
      * @return the bucket columns
      */
-    public List<String> getBucketCols(){
+    public List<String> getBucketCols() {
         return this.sd.getBucketCols();
     }
 
@@ -176,7 +176,7 @@
      *
      * @return the number of buckets
      */
-    public int getNumBuckets(){
+    public int getNumBuckets() {
         return this.sd.getNumBuckets();
     }
 
@@ -185,19 +185,19 @@
      *
      * @return the sort columns
      */
-    public List<Order> getSortCols(){
+    public List<Order> getSortCols() {
         return this.sd.getSortCols();
     }
 
     @Override
     public String toString() {
         return "HCatPartition ["
-                + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + (values != null ? "values=" + values + ", " : "values=null")
-                + "createTime=" + createTime + ", lastAccessTime="
-                + lastAccessTime + ", " + (sd != null ? "sd=" + sd + ", " : "sd=null")
-                + (parameters != null ? "parameters=" + parameters : "parameters=null") + "]";
+            + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + (values != null ? "values=" + values + ", " : "values=null")
+            + "createTime=" + createTime + ", lastAccessTime="
+            + lastAccessTime + ", " + (sd != null ? "sd=" + sd + ", " : "sd=null")
+            + (parameters != null ? "parameters=" + parameters : "parameters=null") + "]";
     }
 
 }
diff --git a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatTable.java b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatTable.java
index 36e93a6..fb8b4ae 100644
--- a/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatTable.java
+++ b/webhcat/java-client/src/main/java/org/apache/hcatalog/api/HCatTable.java
@@ -66,9 +66,9 @@
         inputFileFormat = hiveTable.getSd().getInputFormat();
         outputFileFormat = hiveTable.getSd().getOutputFormat();
         storageHandler = hiveTable
-                .getSd()
-                .getParameters()
-                .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE);
+            .getSd()
+            .getParameters()
+            .get(org.apache.hadoop.hive.metastore.api.Constants.META_TABLE_STORAGE);
         tblProps = hiveTable.getParameters();
         serde = hiveTable.getSd().getSerdeInfo().getSerializationLib();
         location = hiveTable.getSd().getLocation();
@@ -187,7 +187,7 @@
      *
      * @return the serde lib
      */
-    public String getSerdeLib(){
+    public String getSerdeLib() {
         return serde;
     }
 
@@ -196,31 +196,31 @@
      *
      * @return the location
      */
-    public String getLocation(){
+    public String getLocation() {
         return location;
     }
 
     @Override
     public String toString() {
         return "HCatTable ["
-                + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
-                + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
-                + (tabletype != null ? "tabletype=" + tabletype + ", " : "tabletype=null")
-                + (cols != null ? "cols=" + cols + ", " : "cols=null")
-                + (partCols != null ? "partCols=" + partCols + ", " : "partCols==null")
-                + (bucketCols != null ? "bucketCols=" + bucketCols + ", " : "bucketCols=null")
-                + (sortCols != null ? "sortCols=" + sortCols + ", " : "sortCols=null")
-                + "numBuckets="
-                + numBuckets
-                + ", "
-                + (inputFileFormat != null ? "inputFileFormat="
-                        + inputFileFormat + ", " : "inputFileFormat=null")
-                + (outputFileFormat != null ? "outputFileFormat="
-                        + outputFileFormat + ", " : "outputFileFormat=null")
-                + (storageHandler != null ? "storageHandler=" + storageHandler
-                        + ", " : "storageHandler=null")
-                + (tblProps != null ? "tblProps=" + tblProps + ", " : "tblProps=null")
-                + (serde != null ? "serde=" + serde + ", " : "serde=")
-                + (location != null ? "location=" + location : "location=") + "]";
+            + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
+            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
+            + (tabletype != null ? "tabletype=" + tabletype + ", " : "tabletype=null")
+            + (cols != null ? "cols=" + cols + ", " : "cols=null")
+            + (partCols != null ? "partCols=" + partCols + ", " : "partCols==null")
+            + (bucketCols != null ? "bucketCols=" + bucketCols + ", " : "bucketCols=null")
+            + (sortCols != null ? "sortCols=" + sortCols + ", " : "sortCols=null")
+            + "numBuckets="
+            + numBuckets
+            + ", "
+            + (inputFileFormat != null ? "inputFileFormat="
+            + inputFileFormat + ", " : "inputFileFormat=null")
+            + (outputFileFormat != null ? "outputFileFormat="
+            + outputFileFormat + ", " : "outputFileFormat=null")
+            + (storageHandler != null ? "storageHandler=" + storageHandler
+            + ", " : "storageHandler=null")
+            + (tblProps != null ? "tblProps=" + tblProps + ", " : "tblProps=null")
+            + (serde != null ? "serde=" + serde + ", " : "serde=")
+            + (location != null ? "location=" + location : "location=") + "]";
     }
 }
diff --git a/webhcat/java-client/src/test/java/org/apache/hcatalog/api/TestHCatClient.java b/webhcat/java-client/src/test/java/org/apache/hcatalog/api/TestHCatClient.java
index 1d846dd..2edb116 100644
--- a/webhcat/java-client/src/test/java/org/apache/hcatalog/api/TestHCatClient.java
+++ b/webhcat/java-client/src/test/java/org/apache/hcatalog/api/TestHCatClient.java
@@ -49,8 +49,8 @@
 
 public class TestHCatClient {
     private static final Logger LOG = LoggerFactory.getLogger(TestHCatClient.class);
-    private static final String msPort  = "20101";
-    private static HiveConf  hcatConf;
+    private static final String msPort = "20101";
+    private static HiveConf hcatConf;
     private static SecurityManager securityManager;
 
     private static class RunMS implements Runnable {
@@ -58,7 +58,7 @@
         @Override
         public void run() {
             try {
-                HiveMetaStore.main(new String[] { "-v", "-p", msPort });
+                HiveMetaStore.main(new String[]{"-v", "-p", msPort});
             } catch (Throwable t) {
                 LOG.error("Exiting. Got exception from metastore: ", t);
             }
@@ -83,14 +83,14 @@
         hcatConf = new HiveConf(TestHCatClient.class);
         hcatConf.set("hive.metastore.local", "false");
         hcatConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://localhost:"
-                + msPort);
+            + msPort);
         hcatConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTRETRIES, 3);
         hcatConf.set(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK.varname,
-                HCatSemanticAnalyzer.class.getName());
+            HCatSemanticAnalyzer.class.getName());
         hcatConf.set(HiveConf.ConfVars.PREEXECHOOKS.varname, "");
         hcatConf.set(HiveConf.ConfVars.POSTEXECHOOKS.varname, "");
         hcatConf.set(HiveConf.ConfVars.HIVE_SUPPORT_CONCURRENCY.varname,
-                "false");
+            "false");
         System.setProperty(HiveConf.ConfVars.PREEXECHOOKS.varname, " ");
         System.setProperty(HiveConf.ConfVars.POSTEXECHOOKS.varname, " ");
     }
@@ -104,7 +104,7 @@
         client.dropDatabase(db, true, HCatClient.DROP_DB_MODE.CASCADE);
 
         HCatCreateDBDesc dbDesc = HCatCreateDBDesc.create(db).ifNotExists(false)
-                .build();
+            .build();
         client.createDatabase(dbDesc);
         List<String> dbNames = client.listDatabaseNamesByPattern("*");
         assertTrue(dbNames.contains("default"));
@@ -114,22 +114,22 @@
         assertTrue(testDb.getComment() == null);
         assertTrue(testDb.getProperties().size() == 0);
         String warehouseDir = System
-                .getProperty(ConfVars.METASTOREWAREHOUSE.varname, "/user/hive/warehouse");
+            .getProperty(ConfVars.METASTOREWAREHOUSE.varname, "/user/hive/warehouse");
         assertTrue(testDb.getLocation().equals(
-                "file:" + warehouseDir + "/" + db + ".db"));
+            "file:" + warehouseDir + "/" + db + ".db"));
         ArrayList<HCatFieldSchema> cols = new ArrayList<HCatFieldSchema>();
         cols.add(new HCatFieldSchema("id", Type.INT, "id comment"));
         cols.add(new HCatFieldSchema("value", Type.STRING, "value comment"));
         HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                .create(db, tableOne, cols).fileFormat("rcfile").build();
+            .create(db, tableOne, cols).fileFormat("rcfile").build();
         client.createTable(tableDesc);
         HCatTable table1 = client.getTable(db, tableOne);
         assertTrue(table1.getInputFileFormat().equalsIgnoreCase(
-                RCFileInputFormat.class.getName()));
+            RCFileInputFormat.class.getName()));
         assertTrue(table1.getOutputFileFormat().equalsIgnoreCase(
-                RCFileOutputFormat.class.getName()));
+            RCFileOutputFormat.class.getName()));
         assertTrue(table1.getSerdeLib().equalsIgnoreCase(
-                ColumnarSerDe.class.getName()));
+            ColumnarSerDe.class.getName()));
         assertTrue(table1.getCols().equals(cols));
         // Since "ifexists" was not set to true, trying to create the same table
         // again
@@ -138,20 +138,20 @@
             client.createTable(tableDesc);
         } catch (HCatException e) {
             assertTrue(e.getMessage().contains(
-                    "AlreadyExistsException while creating table."));
+                "AlreadyExistsException while creating table."));
         }
 
         client.dropTable(db, tableOne, true);
         HCatCreateTableDesc tableDesc2 = HCatCreateTableDesc.create(db,
-                tableTwo, cols).build();
+            tableTwo, cols).build();
         client.createTable(tableDesc2);
         HCatTable table2 = client.getTable(db, tableTwo);
         assertTrue(table2.getInputFileFormat().equalsIgnoreCase(
-                TextInputFormat.class.getName()));
+            TextInputFormat.class.getName()));
         assertTrue(table2.getOutputFileFormat().equalsIgnoreCase(
-                IgnoreKeyTextOutputFormat.class.getName()));
+            IgnoreKeyTextOutputFormat.class.getName()));
         assertTrue(table2.getLocation().equalsIgnoreCase(
-                "file:" + warehouseDir + "/" + db + ".db/" + tableTwo));
+            "file:" + warehouseDir + "/" + db + ".db/" + tableTwo));
         client.close();
     }
 
@@ -163,48 +163,48 @@
         client.dropDatabase(dbName, true, HCatClient.DROP_DB_MODE.CASCADE);
 
         HCatCreateDBDesc dbDesc = HCatCreateDBDesc.create(dbName)
-                .ifNotExists(true).build();
+            .ifNotExists(true).build();
         client.createDatabase(dbDesc);
         ArrayList<HCatFieldSchema> cols = new ArrayList<HCatFieldSchema>();
         cols.add(new HCatFieldSchema("userid", Type.INT, "id columns"));
         cols.add(new HCatFieldSchema("viewtime", Type.BIGINT,
-                "view time columns"));
+            "view time columns"));
         cols.add(new HCatFieldSchema("pageurl", Type.STRING, ""));
         cols.add(new HCatFieldSchema("ip", Type.STRING,
-                "IP Address of the User"));
+            "IP Address of the User"));
 
         ArrayList<HCatFieldSchema> ptnCols = new ArrayList<HCatFieldSchema>();
         ptnCols.add(new HCatFieldSchema("dt", Type.STRING, "date column"));
         ptnCols.add(new HCatFieldSchema("country", Type.STRING,
-                "country column"));
+            "country column"));
         HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                .create(dbName, tableName, cols).fileFormat("sequencefile")
-                .partCols(ptnCols).build();
+            .create(dbName, tableName, cols).fileFormat("sequencefile")
+            .partCols(ptnCols).build();
         client.createTable(tableDesc);
 
         Map<String, String> firstPtn = new HashMap<String, String>();
         firstPtn.put("dt", "04/30/2012");
         firstPtn.put("country", "usa");
         HCatAddPartitionDesc addPtn = HCatAddPartitionDesc.create(dbName,
-                tableName, null, firstPtn).build();
+            tableName, null, firstPtn).build();
         client.addPartition(addPtn);
 
         Map<String, String> secondPtn = new HashMap<String, String>();
         secondPtn.put("dt", "04/12/2012");
         secondPtn.put("country", "brazil");
         HCatAddPartitionDesc addPtn2 = HCatAddPartitionDesc.create(dbName,
-                tableName, null, secondPtn).build();
+            tableName, null, secondPtn).build();
         client.addPartition(addPtn2);
 
         Map<String, String> thirdPtn = new HashMap<String, String>();
         thirdPtn.put("dt", "04/13/2012");
         thirdPtn.put("country", "argetina");
         HCatAddPartitionDesc addPtn3 = HCatAddPartitionDesc.create(dbName,
-                tableName, null, thirdPtn).build();
+            tableName, null, thirdPtn).build();
         client.addPartition(addPtn3);
 
         List<HCatPartition> ptnList = client.listPartitionsByFilter(dbName,
-                tableName, null);
+            tableName, null);
         assertTrue(ptnList.size() == 3);
 
         HCatPartition ptn = client.getPartition(dbName, tableName, firstPtn);
@@ -212,29 +212,29 @@
 
         client.dropPartition(dbName, tableName, firstPtn, true);
         ptnList = client.listPartitionsByFilter(dbName,
-                tableName, null);
+            tableName, null);
         assertTrue(ptnList.size() == 2);
 
         List<HCatPartition> ptnListTwo = client.listPartitionsByFilter(dbName,
-                tableName, "country = \"argetina\"");
+            tableName, "country = \"argetina\"");
         assertTrue(ptnListTwo.size() == 1);
 
         client.markPartitionForEvent(dbName, tableName, thirdPtn,
-                PartitionEventType.LOAD_DONE);
+            PartitionEventType.LOAD_DONE);
         boolean isMarked = client.isPartitionMarkedForEvent(dbName, tableName,
-                thirdPtn, PartitionEventType.LOAD_DONE);
+            thirdPtn, PartitionEventType.LOAD_DONE);
         assertTrue(isMarked);
         client.close();
     }
 
     @Test
-    public void testDatabaseLocation() throws Exception{
+    public void testDatabaseLocation() throws Exception {
         HCatClient client = HCatClient.create(new Configuration(hcatConf));
         String dbName = "locationDB";
         client.dropDatabase(dbName, true, HCatClient.DROP_DB_MODE.CASCADE);
 
         HCatCreateDBDesc dbDesc = HCatCreateDBDesc.create(dbName)
-                .ifNotExists(true).location("/tmp/"+dbName).build();
+            .ifNotExists(true).location("/tmp/" + dbName).build();
         client.createDatabase(dbDesc);
         HCatDatabase newDB = client.getDatabase(dbName);
         assertTrue(newDB.getLocation().equalsIgnoreCase("file:/tmp/" + dbName));
@@ -253,12 +253,12 @@
         cols.add(new HCatFieldSchema("id", Type.INT, "id columns"));
         cols.add(new HCatFieldSchema("value", Type.STRING, "id columns"));
         HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                .create(null, tableName, cols).fileFormat("rcfile").build();
+            .create(null, tableName, cols).fileFormat("rcfile").build();
         client.createTable(tableDesc);
         // create a new table similar to previous one.
         client.createTableLike(null, tableName, cloneTable, true, false, null);
         List<String> tables = client.listTableNamesByPattern(null, "table*");
-        assertTrue(tables.size() ==2);
+        assertTrue(tables.size() == 2);
         client.close();
     }
 
@@ -273,12 +273,12 @@
         cols.add(new HCatFieldSchema("id", Type.INT, "id columns"));
         cols.add(new HCatFieldSchema("value", Type.STRING, "id columns"));
         HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                .create(null, tableName, cols).fileFormat("rcfile").build();
+            .create(null, tableName, cols).fileFormat("rcfile").build();
         client.createTable(tableDesc);
-        client.renameTable(null, tableName,newName);
+        client.renameTable(null, tableName, newName);
         try {
             client.getTable(null, tableName);
-        } catch(HCatException exp){
+        } catch (HCatException exp) {
             assertTrue(exp.getMessage().contains("NoSuchObjectException while fetching table"));
         }
         HCatTable newTable = client.getTable(null, newName);
@@ -299,7 +299,7 @@
         cols.add(new HCatFieldSchema("value", Type.STRING, "id columns"));
         try {
             HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                    .create(null, tableName, cols).fileFormat("rcfile").build();
+                .create(null, tableName, cols).fileFormat("rcfile").build();
             client.createTable(tableDesc);
         } catch (Exception exp) {
             isExceptionCaught = true;
@@ -309,7 +309,7 @@
             String newName = "goodTable";
             client.dropTable(null, newName, true);
             HCatCreateTableDesc tableDesc2 = HCatCreateTableDesc
-                    .create(null, newName, cols).fileFormat("rcfile").build();
+                .create(null, newName, cols).fileFormat("rcfile").build();
             client.createTable(tableDesc2);
             HCatTable newTable = client.getTable(null, newName);
             assertTrue(newTable != null);
@@ -332,7 +332,7 @@
         cols.add(new HCatFieldSchema("value", Type.STRING, "id columns"));
         try {
             HCatCreateTableDesc tableDesc = HCatCreateTableDesc
-                    .create(null, tableName, cols).fileFormat("rcfile").build();
+                .create(null, tableName, cols).fileFormat("rcfile").build();
             client.createTable(tableDesc);
             // The DB foo is non-existent.
             client.getTable("foo", tableName);
@@ -342,7 +342,7 @@
             String newName = "goodTable";
             client.dropTable(null, newName, true);
             HCatCreateTableDesc tableDesc2 = HCatCreateTableDesc
-                    .create(null, newName, cols).fileFormat("rcfile").build();
+                .create(null, newName, cols).fileFormat("rcfile").build();
             client.createTable(tableDesc2);
             HCatTable newTable = client.getTable(null, newName);
             assertTrue(newTable != null);
diff --git a/webhcat/svr/src/main/java/org/apache/hadoop/mapred/TempletonJobTracker.java b/webhcat/svr/src/main/java/org/apache/hadoop/mapred/TempletonJobTracker.java
index b9a4649..84f7945 100644
--- a/webhcat/svr/src/main/java/org/apache/hadoop/mapred/TempletonJobTracker.java
+++ b/webhcat/svr/src/main/java/org/apache/hadoop/mapred/TempletonJobTracker.java
@@ -19,6 +19,7 @@
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.ipc.RPC;
 import org.apache.hadoop.net.NetUtils;
@@ -36,16 +37,15 @@
     public TempletonJobTracker(UserGroupInformation ugi,
                                InetSocketAddress addr,
                                Configuration conf)
-        throws IOException
-    {
+        throws IOException {
         cnx = (JobSubmissionProtocol)
             RPC.getProxy(JobSubmissionProtocol.class,
-                         JobSubmissionProtocol.versionID,
-                         addr,
-                         ugi,
-                         conf,
-                         NetUtils.getSocketFactory(conf,
-                                                   JobSubmissionProtocol.class));
+                JobSubmissionProtocol.versionID,
+                addr,
+                ugi,
+                conf,
+                NetUtils.getSocketFactory(conf,
+                    JobSubmissionProtocol.class));
     }
 
     /**
@@ -54,8 +54,7 @@
      * @return Profile of the job, or null if not found.
      */
     public JobProfile getJobProfile(JobID jobid)
-        throws IOException
-    {
+        throws IOException {
         return cnx.getJobProfile(jobid);
     }
 
@@ -65,8 +64,7 @@
      * @return Status of the job, or null if not found.
      */
     public JobStatus getJobStatus(JobID jobid)
-        throws IOException
-    {
+        throws IOException {
         return cnx.getJobStatus(jobid);
     }
 
@@ -75,8 +73,7 @@
      * Kill a job.
      */
     public void killJob(JobID jobid)
-        throws IOException
-    {
+        throws IOException {
         cnx.killJob(jobid);
     }
 
@@ -84,8 +81,7 @@
      * Get all the jobs submitted.
      */
     public JobStatus[] getAllJobs()
-        throws IOException
-    {
+        throws IOException {
         return cnx.getAllJobs();
     }
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/AppConfig.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/AppConfig.java
index 71b791b..28e96e3 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/AppConfig.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/AppConfig.java
@@ -192,11 +192,14 @@
 
     public long zkCleanupInterval()  {
         return getLong(ZooKeeperCleanup.ZK_CLEANUP_INTERVAL,
-                       (1000L * 60L * 60L * 12L)); }
-    public long zkMaxAge()           {
+            (1000L * 60L * 60L * 12L));
+    }
+
+    public long zkMaxAge() {
         return getLong(ZooKeeperCleanup.ZK_CLEANUP_MAX_AGE,
-                       (1000L * 60L * 60L * 24L * 7L)); }
+            (1000L * 60L * 60L * 24L * 7L));
+    }
+
     public String zkHosts()          { return get(ZooKeeperStorage.ZK_HOSTS); }
-    public int zkSessionTimeout()    { return getInt(ZooKeeperStorage.ZK_SESSION_TIMEOUT,
-                                                     30000); }
+    public int zkSessionTimeout()    { return getInt(ZooKeeperStorage.ZK_SESSION_TIMEOUT, 30000); }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CatchallExceptionMapper.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CatchallExceptionMapper.java
index 411ff55..807ecbb 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CatchallExceptionMapper.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CatchallExceptionMapper.java
@@ -20,6 +20,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -29,8 +30,7 @@
  */
 @Provider
 public class CatchallExceptionMapper
-    implements ExceptionMapper<Exception>
-{
+    implements ExceptionMapper<Exception> {
     private static final Log LOG = LogFactory.getLog(CatchallExceptionMapper.class);
 
     public Response toResponse(Exception e) {
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CompleteDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CompleteDelegator.java
index 0aa73da..ddb8677 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CompleteDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/CompleteDelegator.java
@@ -21,6 +21,7 @@
 import java.net.URL;
 import java.net.MalformedURLException;
 import java.util.Date;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hcatalog.templeton.tool.JobState;
@@ -50,8 +51,7 @@
     }
 
     public CompleteBean run(String id)
-        throws CallbackFailedException, IOException
-    {
+        throws CallbackFailedException, IOException {
         if (id == null)
             acceptWithError("No jobid given");
 
@@ -64,7 +64,7 @@
             Long notified = state.getNotifiedTime();
             if (notified != null)
                 return acceptWithError("Callback already run on "
-                                       + new Date(notified.longValue()));
+                    + new Date(notified.longValue()));
 
             String callback = state.getCallback();
             if (callback == null)
@@ -90,16 +90,14 @@
      * replaced with the completed jobid.
      */
     public static void doCallback(String jobid, String url)
-        throws MalformedURLException, IOException
-    {
+        throws MalformedURLException, IOException {
         if (url.contains("$jobId"))
             url = url.replace("$jobId", jobid);
         TempletonUtils.fetchUrl(new URL(url));
     }
 
     private void failed(String msg, Exception e)
-        throws CallbackFailedException
-    {
+        throws CallbackFailedException {
         if (e != null)
             LOG.error(msg, e);
         else
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ExecServiceImpl.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ExecServiceImpl.java
index 6cf48db..41920b5 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ExecServiceImpl.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ExecServiceImpl.java
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Semaphore;
+
 import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.DefaultExecutor;
 import org.apache.commons.exec.ExecuteException;
@@ -67,12 +68,11 @@
      * @param program   The program to run
      * @param args      Arguments to pass to the program
      * @param env       Any extra environment variables to set
-     * @return          The result of the run.
+     * @return The result of the run.
      */
     public ExecBean run(String program, List<String> args,
                         Map<String, String> env)
-        throws NotAuthorizedException, BusyException, ExecuteException, IOException
-    {
+        throws NotAuthorizedException, BusyException, ExecuteException, IOException {
         boolean aquired = false;
         try {
             aquired = avail.tryAcquire();
@@ -95,12 +95,11 @@
      * @param program   The program to run.
      * @param args      Arguments to pass to the program
      * @param env       Any extra environment variables to set
-     * @return          The result of the run.
+     * @return The result of the run.
      */
     public ExecBean runUnlimited(String program, List<String> args,
                                  Map<String, String> env)
-        throws NotAuthorizedException, ExecuteException, IOException
-    {
+        throws NotAuthorizedException, ExecuteException, IOException {
         try {
             return auxRun(program, args, env);
         } catch (IOException e) {
@@ -109,13 +108,12 @@
                 throw e;
             else
                 throw new IOException("Invalid permissions on Templeton directory: "
-                                      + cwd.getCanonicalPath());
+                    + cwd.getCanonicalPath());
         }
     }
 
     private ExecBean auxRun(String program, List<String> args, Map<String, String> env)
-        throws NotAuthorizedException, ExecuteException, IOException
-    {
+        throws NotAuthorizedException, ExecuteException, IOException {
         DefaultExecutor executor = new DefaultExecutor();
         executor.setExitValues(null);
 
@@ -144,8 +142,7 @@
 
     private CommandLine makeCommandLine(String program,
                                         List<String> args)
-        throws NotAuthorizedException, IOException
-    {
+        throws NotAuthorizedException, IOException {
         String path = validateProgram(program);
         CommandLine cmd = new CommandLine(path);
         if (args != null)
@@ -171,8 +168,8 @@
         }
         if (env != null)
             res.putAll(env);
-        for(Map.Entry<String, String> envs : res.entrySet()){
-	    LOG.info("Env " + envs.getKey() + "=" + envs.getValue());
+        for (Map.Entry<String, String> envs : res.entrySet()) {
+            LOG.info("Env " + envs.getKey() + "=" + envs.getValue());
         }
         return res;
     }
@@ -182,11 +179,10 @@
      * an exception if the program is missing or not authorized.
      *
      * @param path      The path of the program.
-     * @return          The path of the validated program.
+     * @return The path of the validated program.
      */
     public String validateProgram(String path)
-        throws NotAuthorizedException, IOException
-    {
+        throws NotAuthorizedException, IOException {
         File f = new File(path);
         if (f.canExecute()) {
             return f.getCanonicalPath();
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatDelegator.java
index 5fa6da1..94855dd 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatDelegator.java
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import javax.ws.rs.core.Response;
+
 import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -52,8 +53,7 @@
      */
     public ExecBean run(String user, String exec, boolean format,
                         String group, String permissions)
-        throws NotAuthorizedException, BusyException, ExecuteException, IOException
-    {
+        throws NotAuthorizedException, BusyException, ExecuteException, IOException {
         SecureProxySupport proxy = new SecureProxySupport();
         try {
             List<String> args = makeArgs(exec, format, group, permissions);
@@ -103,8 +103,7 @@
      */
     public Response descDatabase(String user, String db, boolean extended)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "desc database " + db + "; ";
         if (extended)
             exec = "desc database extended " + db + "; ";
@@ -115,12 +114,12 @@
         } catch (HcatException e) {
             if (e.execBean.stderr.indexOf("Error in semantic analysis") > -1) {
                 return JsonBuilder.create().
-                        put("error", "Database " + db + " does not exist")
-                        .put("errorCode", "404")
-                        .put("database", db).build();
+                    put("error", "Database " + db + " does not exist")
+                    .put("errorCode", "404")
+                    .put("database", db).build();
             }
             throw new HcatException("unable to describe database: " + db,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -130,8 +129,7 @@
      */
     public Response listDatabases(String user, String dbPattern)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("show databases like '%s';", dbPattern);
         try {
             String res = jsonRun(user, exec);
@@ -139,7 +137,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to show databases for: " + dbPattern,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -148,8 +146,7 @@
      */
     public Response createDatabase(String user, DatabaseDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "create database";
         if (desc.ifNotExists)
             exec += " if not exists";
@@ -160,7 +157,7 @@
             exec += String.format(" location '%s'", desc.location);
         if (TempletonUtils.isset(desc.properties))
             exec += String.format(" with dbproperties (%s)",
-                                  makePropertiesStatement(desc.properties));
+                makePropertiesStatement(desc.properties));
         exec += ";";
 
         String res = jsonRun(user, exec, desc.group, desc.permissions);
@@ -176,8 +173,7 @@
                                  boolean ifExists, String option,
                                  String group, String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "drop database";
         if (ifExists)
             exec += " if exists";
@@ -197,8 +193,7 @@
      */
     public Response createTable(String user, String db, TableDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = makeCreateTable(db, desc);
 
         try {
@@ -210,7 +205,7 @@
                 .build();
         } catch (final HcatException e) {
             throw new HcatException("unable to create table: " + desc.table,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -219,8 +214,7 @@
      */
     public Response createTableLike(String user, String db, TableLikeDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; create", db);
 
         if (desc.external)
@@ -239,7 +233,7 @@
                 .build();
         } catch (final HcatException e) {
             throw new HcatException("unable to create table: " + desc.newTable,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -248,8 +242,7 @@
      */
     public Response descTable(String user, String db, String table, boolean extended)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "use " + db + "; ";
         if (extended)
             exec += "desc extended " + table + "; ";
@@ -263,7 +256,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to describe table: " + table,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -273,10 +266,9 @@
      */
     public Response listTables(String user, String db, String tablePattern)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; show tables like '%s';",
-                                    db, tablePattern);
+            db, tablePattern);
         try {
             String res = jsonRun(user, exec);
             return JsonBuilder.create(res)
@@ -284,7 +276,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to show tables for: " + tablePattern,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -294,10 +286,9 @@
      */
     public Response descExtendedTable(String user, String db, String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; show table extended like %s;",
-                                    db, table);
+            db, table);
         try {
             String res = jsonRun(user, exec);
             JsonBuilder jb = JsonBuilder.create(singleTable(res, table))
@@ -364,7 +355,7 @@
             exec += String.format(" location '%s'", desc.location);
         if (TempletonUtils.isset(desc.tableProperties))
             exec += String.format(" tblproperties (%s)",
-                                  makePropertiesStatement(desc.tableProperties));
+                makePropertiesStatement(desc.tableProperties));
         exec += ";";
 
         return exec;
@@ -411,9 +402,9 @@
     private String makeRowFormat(TableDesc.RowFormatDesc desc) {
         String res =
             makeTermBy(desc.fieldsTerminatedBy, "fields")
-            + makeTermBy(desc.collectionItemsTerminatedBy, "collection items")
-            + makeTermBy(desc.mapKeysTerminatedBy, "map keys")
-            + makeTermBy(desc.linesTerminatedBy, "lines");
+                + makeTermBy(desc.collectionItemsTerminatedBy, "collection items")
+                + makeTermBy(desc.mapKeysTerminatedBy, "map keys")
+                + makeTermBy(desc.linesTerminatedBy, "lines");
 
         if (TempletonUtils.isset(res))
             return "row format delimited" + res;
@@ -427,7 +418,7 @@
     private String makeTermBy(String sep, String fieldName) {
 
         if (TempletonUtils.isset(sep))
-          return String.format(" %s terminated by '%s'", fieldName, sep);
+            return String.format(" %s terminated by '%s'", fieldName, sep);
         else
             return "";
     }
@@ -437,7 +428,7 @@
         String res = "row format serde " + desc.name;
         if (TempletonUtils.isset(desc.properties))
             res += String.format(" with serdeproperties (%s)",
-                                 makePropertiesStatement(desc.properties));
+                makePropertiesStatement(desc.properties));
         return res;
     }
 
@@ -454,14 +445,13 @@
         String res = String.format("stored by '%s'", desc.className);
         if (TempletonUtils.isset(desc.properties))
             res += String.format(" with serdeproperties (%s)",
-                                 makePropertiesStatement(desc.properties));
+                makePropertiesStatement(desc.properties));
         return res;
     }
 
     // Pull out the first table from the "show extended" json.
     private String singleTable(String json, String table)
-        throws IOException
-    {
+        throws IOException {
         Map obj = JsonBuilder.jsonToMap(json);
         if (JsonBuilder.isError(obj))
             return json;
@@ -472,8 +462,8 @@
         else {
             return JsonBuilder
                 .createError(String.format("Table %s does not exist", table),
-                             JsonBuilder.MISSING).
-                buildJson();
+                    JsonBuilder.MISSING).
+                    buildJson();
         }
     }
 
@@ -484,8 +474,7 @@
                               String table, boolean ifExists,
                               String group, String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; drop table", db);
         if (ifExists)
             exec += " if exists";
@@ -509,10 +498,9 @@
                                 String oldTable, String newTable,
                                 String group, String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; alter table %s rename to %s;",
-                                    db, oldTable, newTable);
+            db, oldTable, newTable);
         try {
             String res = jsonRun(user, exec, group, permissions, true);
             return JsonBuilder.create(res)
@@ -521,7 +509,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to rename table: " + oldTable,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -531,8 +519,7 @@
     public Response descTableProperty(String user, String db,
                                       String table, String property)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         Response res = descTable(user, db, table, true);
         if (res.getStatus() != JsonBuilder.OK)
             return res;
@@ -558,8 +545,7 @@
      */
     public Response listTableProperties(String user, String db, String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         Response res = descTable(user, db, table, true);
         if (res.getStatus() != JsonBuilder.OK)
             return res;
@@ -577,11 +563,10 @@
     public Response addOneTableProperty(String user, String db, String table,
                                         TablePropertyDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec
             = String.format("use %s; alter table %s set tblproperties ('%s'='%s');",
-                            db, table, desc.name, desc.value);
+                db, table, desc.name, desc.value);
         try {
             String res = jsonRun(user, exec, desc.group, desc.permissions, true);
             return JsonBuilder.create(res)
@@ -591,12 +576,12 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to add table property: " + table,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
     private Map tableProperties(Object extendedTable) {
-        if (! (extendedTable instanceof Map))
+        if (!(extendedTable instanceof Map))
             return null;
         Map m = (Map) extendedTable;
         Map tableInfo = (Map) m.get("tableInfo");
@@ -611,8 +596,7 @@
      */
     public Response listPartitions(String user, String db, String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "use " + db + "; ";
         exec += "show partitions " + table + "; ";
         try {
@@ -623,7 +607,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to show partitions for table: " + table,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -633,8 +617,7 @@
     public Response descOnePartition(String user, String db, String table,
                                      String partition)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = "use " + db + "; ";
         exec += "show table extended like " + table
             + " partition (" + partition + "); ";
@@ -648,9 +631,9 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to show partition: "
-                                    + table + " " + partition,
-                                    e.execBean,
-                                    exec);
+                + table + " " + partition,
+                e.execBean,
+                exec);
         }
     }
 
@@ -660,8 +643,7 @@
     public Response addOnePartition(String user, String db, String table,
                                     PartitionDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; alter table %s add", db, table);
         if (desc.ifNotExists)
             exec += " if not exists";
@@ -673,11 +655,11 @@
             String res = jsonRun(user, exec, desc.group, desc.permissions, true);
             if (res.indexOf("AlreadyExistsException") > -1) {
                 return JsonBuilder.create().
-                        put("error", "Partition already exists")
-                        .put("errorCode", "409")
-                        .put("database", db)
-                        .put("table", table)
-                        .put("partition", desc.partition).build();
+                    put("error", "Partition already exists")
+                    .put("errorCode", "409")
+                    .put("database", db)
+                    .put("table", table)
+                    .put("partition", desc.partition).build();
             }
             return JsonBuilder.create(res)
                 .put("database", db)
@@ -686,7 +668,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to add partition: " + desc,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -697,8 +679,7 @@
                                   String table, String partition, boolean ifExists,
                                   String group, String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; alter table %s drop", db, table);
         if (ifExists)
             exec += " if exists";
@@ -713,7 +694,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to drop partition: " + partition,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -723,13 +704,12 @@
      */
     public Response listColumns(String user, String db, String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         try {
             return descTable(user, db, table, false);
         } catch (HcatException e) {
             throw new HcatException("unable to show columns for table: " + table,
-                                    e.execBean, e.statement);
+                e.execBean, e.statement);
         }
     }
 
@@ -738,8 +718,7 @@
      */
     public Response descOneColumn(String user, String db, String table, String column)
         throws SimpleWebException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         Response res = listColumns(user, db, table);
         if (res.getStatus() != JsonBuilder.OK)
             return res;
@@ -748,7 +727,7 @@
         final Map fields = (o != null && (o instanceof Map)) ? (Map) o : null;
         if (fields == null)
             throw new SimpleWebException(500, "Internal error, unable to find column "
-                                         + column);
+                + column);
 
 
         List<Map> cols = (List) fields.get("columns");
@@ -763,9 +742,11 @@
         }
         if (found == null)
             throw new SimpleWebException(500, "unable to find column " + column,
-                                         new HashMap<String, Object>() {{
-                                                 put("description", fields);
-                                             }});
+                new HashMap<String, Object>() {
+                    {
+                        put("description", fields);
+                    }
+                });
         fields.remove("columns");
         fields.put("column", found);
         return Response.fromResponse(res).entity(fields).build();
@@ -777,10 +758,9 @@
     public Response addOneColumn(String user, String db, String table,
                                  ColumnDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         String exec = String.format("use %s; alter table %s add columns (%s %s",
-                                    db, table, desc.name, desc.type);
+            db, table, desc.name, desc.type);
         if (TempletonUtils.isset(desc.comment))
             exec += String.format(" comment '%s'", desc.comment);
         exec += ");";
@@ -793,7 +773,7 @@
                 .build();
         } catch (HcatException e) {
             throw new HcatException("unable to add column: " + desc,
-                                    e.execBean, exec);
+                e.execBean, exec);
         }
     }
 
@@ -826,11 +806,10 @@
                            String group, String permissions,
                            boolean requireEmptyOutput)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         ExecBean res = run(user, exec, true, group, permissions);
 
-        if (! isValid(res, requireEmptyOutput))
+        if (!isValid(res, requireEmptyOutput))
             throw new HcatException("Failure calling hcat: " + exec, res, exec);
 
         return res.stdout;
@@ -840,8 +819,7 @@
     // permissions set.
     private String jsonRun(String user, String exec)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         return jsonRun(user, exec, null, null);
     }
 
@@ -849,8 +827,7 @@
     private String jsonRun(String user, String exec,
                            String group, String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         return jsonRun(user, exec, group, permissions, false);
     }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatException.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatException.java
index ab73adb..c4bf46f 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatException.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/HcatException.java
@@ -27,10 +27,12 @@
     public String statement;
 
     public HcatException(String msg, final ExecBean bean, final String statement) {
-        super(500, msg, new HashMap<String, Object>() {{
-                    put("exec", bean);
-                    put("statement", statement);
-                }});
+        super(500, msg, new HashMap<String, Object>() {
+            {
+                put("exec", bean);
+                put("statement", statement);
+            }
+        });
         execBean = bean;
         this.statement = statement;
     }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JarDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JarDelegator.java
index 889e990..53a8ca6 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JarDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JarDelegator.java
@@ -22,6 +22,7 @@
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.List;
+
 import org.apache.commons.exec.ExecuteException;
 import org.apache.hcatalog.templeton.tool.TempletonUtils;
 
@@ -40,12 +41,11 @@
                            List<String> jarArgs, List<String> defines,
                            String statusdir, String callback, String completedUrl)
         throws NotAuthorizedException, BadParam, BusyException, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         runAs = user;
         List<String> args = makeArgs(jar, mainClass,
-                                     libjars, files, jarArgs, defines,
-                                     statusdir, completedUrl);
+            libjars, files, jarArgs, defines,
+            statusdir, completedUrl);
 
         return enqueueController(user, callback, args);
     }
@@ -54,15 +54,14 @@
                                   String libjars, String files,
                                   List<String> jarArgs, List<String> defines,
                                   String statusdir, String completedUrl)
-        throws BadParam, IOException, InterruptedException
-    {
+        throws BadParam, IOException, InterruptedException {
         ArrayList<String> args = new ArrayList<String>();
         try {
             ArrayList<String> allFiles = new ArrayList();
             allFiles.add(TempletonUtils.hadoopFsFilename(jar, appConf, runAs));
 
             args.addAll(makeLauncherArgs(appConf, statusdir,
-                                         completedUrl, allFiles));
+                completedUrl, allFiles));
             args.add("--");
             args.add(appConf.clusterHadoop());
             args.add("jar");
@@ -72,12 +71,12 @@
             if (TempletonUtils.isset(libjars)) {
                 args.add("-libjars");
                 args.add(TempletonUtils.hadoopFsListAsString(libjars, appConf,
-                        runAs));
+                    runAs));
             }
             if (TempletonUtils.isset(files)) {
                 args.add("-files");
                 args.add(TempletonUtils.hadoopFsListAsString(files, appConf,
-                        runAs));
+                    runAs));
             }
 
             for (String d : defines)
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JsonBuilder.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JsonBuilder.java
index 5c1fe3f..997356d 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JsonBuilder.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/JsonBuilder.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+
 import org.apache.hcatalog.templeton.tool.TempletonUtils;
 import org.codehaus.jackson.map.ObjectMapper;
 
@@ -40,8 +41,7 @@
 
     // Parse the json map.
     private JsonBuilder(String json)
-        throws IOException
-    {
+        throws IOException {
         map = jsonToMap(json);
     }
 
@@ -49,8 +49,7 @@
      * Create a new map object from the existing json.
      */
     public static JsonBuilder create(String json)
-        throws IOException
-    {
+        throws IOException {
         return new JsonBuilder(json);
     }
 
@@ -58,8 +57,7 @@
      * Create a new map object.
      */
     public static JsonBuilder create()
-        throws IOException
-    {
+        throws IOException {
         return new JsonBuilder(null);
     }
 
@@ -67,8 +65,7 @@
      * Create a new map error object.
      */
     public static JsonBuilder createError(String msg, int code)
-        throws IOException
-    {
+        throws IOException {
         return new JsonBuilder(null)
             .put("error", msg)
             .put("errorCode", code);
@@ -109,8 +106,7 @@
      * Turn the map back to json.
      */
     public String buildJson()
-        throws IOException
-    {
+        throws IOException {
         return mapToJson(map);
     }
 
@@ -153,8 +149,7 @@
     /**
      * Check if this is an error doc.
      */
-    public static boolean isError(Map obj)
-    {
+    public static boolean isError(Map obj) {
         return (obj != null) && obj.containsKey("error");
     }
 
@@ -162,9 +157,8 @@
      * Convert a json string to a Map.
      */
     public static Map jsonToMap(String json)
-        throws IOException
-    {
-        if (! TempletonUtils.isset(json))
+        throws IOException {
+        if (!TempletonUtils.isset(json))
             return new HashMap<String, Object>();
         else {
             ObjectMapper mapper = new ObjectMapper();
@@ -176,8 +170,7 @@
      * Convert a map to a json string.
      */
     public static String mapToJson(Object obj)
-        throws IOException
-    {
+        throws IOException {
         ObjectMapper mapper = new ObjectMapper();
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         mapper.writeValue(out, obj);
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/LauncherDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/LauncherDelegator.java
index 857856c..93ab238 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/LauncherDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/LauncherDelegator.java
@@ -21,6 +21,7 @@
 import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.List;
+
 import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -48,8 +49,7 @@
     }
 
     public void registerJob(String id, String user, String callback)
-        throws IOException
-    {
+        throws IOException {
         JobState state = null;
         try {
             state = new JobState(id, Main.getAppConfigInstance());
@@ -65,12 +65,11 @@
      * Enqueue the TempletonControllerJob directly calling doAs.
      */
     public EnqueueBean enqueueController(String user, String callback,
-                                                 List<String> args)
+                                         List<String> args)
         throws NotAuthorizedException, BusyException, ExecuteException,
-        IOException, QueueException
-    {
+        IOException, QueueException {
         try {
-            UserGroupInformation ugi = UgiFactory.getUgi(user); 
+            UserGroupInformation ugi = UgiFactory.getUgi(user);
 
             final long startTime = System.nanoTime();
 
@@ -91,24 +90,22 @@
     }
 
     private String queueAsUser(UserGroupInformation ugi, final List<String> args)
-        throws IOException, InterruptedException
-    {
+        throws IOException, InterruptedException {
         String id = ugi.doAs(new PrivilegedExceptionAction<String>() {
-                public String run() throws Exception {
-                    String[] array = new String[args.size()];
-                    TempletonControllerJob ctrl = new TempletonControllerJob();
-                    ToolRunner.run(ctrl, args.toArray(array));
-                    return ctrl.getSubmittedId();
-                }
-            });
+            public String run() throws Exception {
+                String[] array = new String[args.size()];
+                TempletonControllerJob ctrl = new TempletonControllerJob();
+                ToolRunner.run(ctrl, args.toArray(array));
+                return ctrl.getSubmittedId();
+            }
+        });
 
         return id;
     }
 
     public List<String> makeLauncherArgs(AppConfig appConf, String statusdir,
                                          String completedUrl,
-                                         List<String> copyFiles)
-    {
+                                         List<String> copyFiles) {
         ArrayList<String> args = new ArrayList<String>();
 
         args.add("-libjars");
@@ -122,9 +119,9 @@
         // Internal vars
         addDef(args, TempletonControllerJob.STATUSDIR_NAME, statusdir);
         addDef(args, TempletonControllerJob.COPY_NAME,
-               TempletonUtils.encodeArray(copyFiles));
+            TempletonUtils.encodeArray(copyFiles));
         addDef(args, TempletonControllerJob.OVERRIDE_CLASSPATH,
-               makeOverrideClasspath(appConf));
+            makeOverrideClasspath(appConf));
 
         // Job vars
         addStorageVars(args);
@@ -136,21 +133,21 @@
     // Storage vars
     private void addStorageVars(List<String> args) {
         addDef(args, TempletonStorage.STORAGE_CLASS,
-               appConf.get(TempletonStorage.STORAGE_CLASS));
+            appConf.get(TempletonStorage.STORAGE_CLASS));
         addDef(args, TempletonStorage.STORAGE_ROOT,
-                appConf.get(TempletonStorage.STORAGE_ROOT));
+            appConf.get(TempletonStorage.STORAGE_ROOT));
         addDef(args, ZooKeeperStorage.ZK_HOSTS,
-                appConf.get(ZooKeeperStorage.ZK_HOSTS));
+            appConf.get(ZooKeeperStorage.ZK_HOSTS));
         addDef(args, ZooKeeperStorage.ZK_SESSION_TIMEOUT,
-                appConf.get(ZooKeeperStorage.ZK_SESSION_TIMEOUT));
+            appConf.get(ZooKeeperStorage.ZK_SESSION_TIMEOUT));
     }
 
     // Completion notifier vars
     private void addCompletionVars(List<String> args, String completedUrl) {
         addDef(args, AppConfig.HADOOP_END_RETRY_NAME,
-               appConf.get(AppConfig.CALLBACK_RETRY_NAME));
+            appConf.get(AppConfig.CALLBACK_RETRY_NAME));
         addDef(args, AppConfig.HADOOP_END_INTERVAL_NAME,
-               appConf.get(AppConfig.CALLBACK_INTERVAL_NAME));
+            appConf.get(AppConfig.CALLBACK_INTERVAL_NAME));
         addDef(args, AppConfig.HADOOP_END_URL_NAME, completedUrl);
     }
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ListDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ListDelegator.java
index 1d6546d..40266cb 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ListDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/ListDelegator.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.ArrayList;
+
 import org.apache.hadoop.mapred.JobStatus;
 import org.apache.hadoop.mapred.JobTracker;
 import org.apache.hadoop.mapred.TempletonJobTracker;
@@ -35,14 +36,13 @@
     }
 
     public List<String> run(String user)
-        throws NotAuthorizedException, BadParam, IOException
-    {
+        throws NotAuthorizedException, BadParam, IOException {
         UserGroupInformation ugi = UserGroupInformation.createRemoteUser(user);
         TempletonJobTracker tracker = null;
         try {
             tracker = new TempletonJobTracker(ugi,
-                                              JobTracker.getAddress(appConf),
-                                              appConf);
+                JobTracker.getAddress(appConf),
+                appConf);
 
             ArrayList<String> ids = new ArrayList<String>();
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Main.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Main.java
index 46eee66..4c85a46 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Main.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Main.java
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hdfs.web.AuthFilter;
@@ -116,31 +117,30 @@
 
     private void checkEnv() {
         checkCurrentDirPermissions();
-        
+
     }
 
     private void checkCurrentDirPermissions() {
         //org.apache.commons.exec.DefaultExecutor requires
         // that current directory exists
         File pwd = new File(".");
-        if(!pwd.exists()){
+        if (!pwd.exists()) {
             String msg = "Server failed to start: templeton: Current working directory '.' does not exist!";
             System.err.println(msg);
-            LOG.fatal( msg);
+            LOG.fatal(msg);
             System.exit(1);
         }
     }
 
     public Server runServer(int port)
-        throws Exception
-    {
+        throws Exception {
 
         //Authenticate using keytab
-        if(UserGroupInformation.isSecurityEnabled()){
+        if (UserGroupInformation.isSecurityEnabled()) {
             UserGroupInformation.loginUserFromKeytab(conf.kerberosPrincipal(),
-                    conf.kerberosKeytab());
+                conf.kerberosKeytab());
         }
-        
+
         // Create the Jetty server
         Server server = new Server(port);
         ServletContextHandler root = new ServletContextHandler(server, "/");
@@ -166,11 +166,11 @@
         FilterHolder authFilter = new FilterHolder(AuthFilter.class);
         if (UserGroupInformation.isSecurityEnabled()) {
             authFilter.setInitParameter("dfs.web.authentication.signature.secret",
-                                        conf.kerberosSecret());
+                conf.kerberosSecret());
             authFilter.setInitParameter("dfs.web.authentication.kerberos.principal",
-                                        conf.kerberosPrincipal());
+                conf.kerberosPrincipal());
             authFilter.setInitParameter("dfs.web.authentication.kerberos.keytab",
-                                        conf.kerberosKeytab());
+                conf.kerberosKeytab());
         }
         return authFilter;
     }
@@ -181,7 +181,7 @@
         HashMap<String, Object> props = new HashMap<String, Object>();
         props.put("com.sun.jersey.api.json.POJOMappingFeature", "true");
         props.put("com.sun.jersey.config.property.WadlGeneratorConfig",
-                  "org.apache.hcatalog.templeton.WadlConfig");
+            "org.apache.hcatalog.templeton.WadlConfig");
         rc.setPropertiesAndFeatures(props);
 
         return rc;
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/PigDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/PigDelegator.java
index 17d4481..0e6bae4 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/PigDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/PigDelegator.java
@@ -23,6 +23,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+
 import org.apache.commons.exec.ExecuteException;
 import org.apache.hcatalog.templeton.tool.TempletonUtils;
 
@@ -41,12 +42,11 @@
                            List<String> pigArgs, String otherFiles,
                            String statusdir, String callback, String completedUrl)
         throws NotAuthorizedException, BadParam, BusyException, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         runAs = user;
         List<String> args = makeArgs(execute,
-                                     srcFile, pigArgs,
-                                     otherFiles, statusdir, completedUrl);
+            srcFile, pigArgs,
+            otherFiles, statusdir, completedUrl);
 
         return enqueueController(user, callback, args);
     }
@@ -54,17 +54,15 @@
     private List<String> makeArgs(String execute, String srcFile,
                                   List<String> pigArgs, String otherFiles,
                                   String statusdir, String completedUrl)
-        throws BadParam, IOException, InterruptedException
-    {
+        throws BadParam, IOException, InterruptedException {
         ArrayList<String> args = new ArrayList<String>();
         try {
             ArrayList<String> allFiles = new ArrayList<String>();
             if (TempletonUtils.isset(srcFile))
                 allFiles.add(TempletonUtils.hadoopFsFilename
-                        (srcFile, appConf, runAs));
+                    (srcFile, appConf, runAs));
             if (TempletonUtils.isset(otherFiles)) {
-                String[] ofs = TempletonUtils.hadoopFsListAsArray
-                        (otherFiles, appConf, runAs);
+                String[] ofs = TempletonUtils.hadoopFsListAsArray(otherFiles, appConf, runAs);
                 allFiles.addAll(Arrays.asList(ofs));
             }
 
@@ -81,7 +79,7 @@
             } else if (TempletonUtils.isset(srcFile)) {
                 args.add("-file");
                 args.add(TempletonUtils.hadoopFsPath(srcFile, appConf, runAs)
-                        .getName());
+                    .getName());
             }
         } catch (FileNotFoundException e) {
             throw new BadParam(e.getMessage());
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/QueueStatusBean.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/QueueStatusBean.java
index e1e3f96..abe579a 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/QueueStatusBean.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/QueueStatusBean.java
@@ -18,6 +18,7 @@
 package org.apache.hcatalog.templeton;
 
 import java.io.IOException;
+
 import org.apache.hadoop.mapred.JobStatus;
 import org.apache.hadoop.mapred.JobProfile;
 import org.apache.hcatalog.templeton.tool.JobState;
@@ -29,15 +30,16 @@
     public JobStatus status;
     public JobProfile profile;
 
-    public String  id;
-    public String  parentId;
-    public String  percentComplete;
-    public Long    exitValue;
-    public String  user;
-    public String  callback;
-    public String  completed;
+    public String id;
+    public String parentId;
+    public String percentComplete;
+    public Long exitValue;
+    public String user;
+    public String callback;
+    public String completed;
 
-    public QueueStatusBean() {}
+    public QueueStatusBean() {
+    }
 
     /**
      * Create a new QueueStatusBean
@@ -47,19 +49,18 @@
      * @param profile    job profile
      */
     public QueueStatusBean(JobState state, JobStatus status, JobProfile profile)
-        throws IOException
-    {
+        throws IOException {
         this.status = status;
         this.profile = profile;
 
-        id              = profile.getJobID().toString();
-        parentId        = state.getId();
+        id = profile.getJobID().toString();
+        parentId = state.getId();
         if (id.equals(parentId))
             parentId = null;
         percentComplete = state.getPercentComplete();
-        exitValue       = state.getExitValue();
-        user            = state.getUser();
-        callback        = state.getCallback();
-        completed       = state.getCompleteStatus();
+        exitValue = state.getExitValue();
+        user = state.getUser();
+        callback = state.getCallback();
+        completed = state.getCompleteStatus();
     }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SecureProxySupport.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SecureProxySupport.java
index 98c85b3..77ce4d4 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SecureProxySupport.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SecureProxySupport.java
@@ -52,23 +52,26 @@
     }
 
     private static final Log LOG = LogFactory.getLog(SecureProxySupport.class);
-    
+
     /**
      * The file where we store the auth token
      */
-    public Path getTokenPath() { return( tokenPath ); }
+    public Path getTokenPath() {
+        return (tokenPath);
+    }
 
     /**
      * The token to pass to hcat.
      */
-    public String getHcatServiceStr() { return( HCAT_SERVICE ); }
+    public String getHcatServiceStr() {
+        return (HCAT_SERVICE);
+    }
 
     /**
      * Create the delegation token.
      */
     public Path open(String user, Configuration conf)
-        throws IOException, InterruptedException
-    {
+        throws IOException, InterruptedException {
         close();
         if (isEnabled) {
             this.user = user;
@@ -85,7 +88,7 @@
             msToken.decodeFromUrlString(hcatTokenStr);
             msToken.setService(new Text(HCAT_SERVICE));
             writeProxyDelegationTokens(fsToken, msToken, conf, user, tokenPath);
-            
+
         }
         return tokenPath;
     }
@@ -106,7 +109,7 @@
     public void addEnv(Map<String, String> env) {
         if (isEnabled) {
             env.put(UserGroupInformation.HADOOP_TOKEN_FILE_LOCATION,
-                    getTokenPath().toUri().getPath());
+                getTokenPath().toUri().getPath());
         }
     }
 
@@ -118,73 +121,70 @@
             args.add("-D");
             args.add("hive.metastore.token.signature=" + getHcatServiceStr());
             args.add("-D");
-            args.add("proxy.user.name=" + user);            
+            args.add("proxy.user.name=" + user);
         }
     }
-    
-    class TokenWrapper { 
+
+    class TokenWrapper {
         Token<?> token;
     }
 
     private Token<?> getFSDelegationToken(String user,
-                                           final Configuration conf)
-        throws IOException, InterruptedException
-    {
+                                          final Configuration conf)
+        throws IOException, InterruptedException {
         LOG.info("user: " + user + " loginUser: " + UserGroupInformation.getLoginUser().getUserName());
         final UserGroupInformation ugi = UgiFactory.getUgi(user);
 
-       final TokenWrapper twrapper = new TokenWrapper();
-       ugi.doAs(new PrivilegedExceptionAction<Object>() {
-           public Object run() throws IOException {
-               FileSystem fs = FileSystem.get(conf);
-               twrapper.token =  fs.getDelegationToken(ugi.getShortUserName());
-               return null;
-           }
-       });
-       return twrapper.token;
-       
+        final TokenWrapper twrapper = new TokenWrapper();
+        ugi.doAs(new PrivilegedExceptionAction<Object>() {
+            public Object run() throws IOException {
+                FileSystem fs = FileSystem.get(conf);
+                twrapper.token = fs.getDelegationToken(ugi.getShortUserName());
+                return null;
+            }
+        });
+        return twrapper.token;
+
     }
 
     private void writeProxyDelegationTokens(final Token<?> fsToken,
-            final Token<?> msToken,
-            final Configuration conf,
-            String user,
-            final Path tokenPath)
-                    throws IOException, InterruptedException{
-        
-        
-        LOG.info("user: " + user + " loginUser: " + UserGroupInformation.getLoginUser().getUserName());
-        final UserGroupInformation ugi  =  UgiFactory.getUgi(user);
+                                            final Token<?> msToken,
+                                            final Configuration conf,
+                                            String user,
+                                            final Path tokenPath)
+        throws IOException, InterruptedException {
 
-        
+
+        LOG.info("user: " + user + " loginUser: " + UserGroupInformation.getLoginUser().getUserName());
+        final UserGroupInformation ugi = UgiFactory.getUgi(user);
+
+
         ugi.doAs(new PrivilegedExceptionAction<Object>() {
-                     public Object run() throws IOException {
-                         Credentials cred = new Credentials();
-                         cred.addToken(fsToken.getService(), fsToken);
-                         cred.addToken(msToken.getService(), msToken);
-                         cred.writeTokenStorageFile(tokenPath, conf);
-                         return null;
-                     }
-                 });
-        
+            public Object run() throws IOException {
+                Credentials cred = new Credentials();
+                cred.addToken(fsToken.getService(), fsToken);
+                cred.addToken(msToken.getService(), msToken);
+                cred.writeTokenStorageFile(tokenPath, conf);
+                return null;
+            }
+        });
+
     }
-    
+
     private String buildHcatDelegationToken(String user)
-        throws IOException, InterruptedException, MetaException, TException
-    {
+        throws IOException, InterruptedException, MetaException, TException {
         HiveConf c = new HiveConf();
         final HiveMetaStoreClient client = new HiveMetaStoreClient(c);
         LOG.info("user: " + user + " loginUser: " + UserGroupInformation.getLoginUser().getUserName());
         final TokenWrapper twrapper = new TokenWrapper();
         final UserGroupInformation ugi = UgiFactory.getUgi(user);
         String s = ugi.doAs(new PrivilegedExceptionAction<String>() {
-                                public String run()
-                                    throws IOException, MetaException, TException
-                                {
-                                    String u = ugi.getUserName();
-                                    return client.getDelegationToken(u);
-                                }
-                            });
+            public String run()
+                throws IOException, MetaException, TException {
+                String u = ugi.getUserName();
+                return client.getDelegationToken(u);
+            }
+        });
         return s;
     }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Server.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Server.java
index f1c68aa..ce0eee1 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Server.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/Server.java
@@ -39,6 +39,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.SecurityContext;
 import javax.ws.rs.core.UriInfo;
+
 import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -103,10 +104,14 @@
     private static AppConfig appConf = Main.getAppConfigInstance();
 
     // The SecurityContext set by AuthFilter
-    private @Context SecurityContext theSecurityContext;
+    private
+    @Context
+    SecurityContext theSecurityContext;
 
     // The uri requested
-    private @Context UriInfo theUriInfo;
+    private
+    @Context
+    UriInfo theUriInfo;
 
     private static final Log LOG = LogFactory.getLog(Server.class);
 
@@ -150,8 +155,7 @@
                         @FormParam("group") String group,
                         @FormParam("permissions") String permissions)
         throws NotAuthorizedException, BusyException, BadParam,
-        ExecuteException, IOException
-    {
+        ExecuteException, IOException {
         verifyUser();
         verifyParam(exec, "exec");
 
@@ -168,13 +172,12 @@
     public Response listTables(@PathParam("db") String db,
                                @QueryParam("like") String tablePattern)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
 
         HcatDelegator d = new HcatDelegator(appConf, execService);
-        if (! TempletonUtils.isset(tablePattern))
+        if (!TempletonUtils.isset(tablePattern))
             tablePattern = "*";
         return d.listTables(getUser(), db, tablePattern);
     }
@@ -189,8 +192,7 @@
                                 @PathParam("table") String table,
                                 TableDesc desc)
         throws SimpleWebException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -211,8 +213,7 @@
                                     @PathParam("newTable") String newTable,
                                     TableLikeDesc desc)
         throws SimpleWebException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(existingTable, ":existingTable");
@@ -236,8 +237,7 @@
                               @PathParam("table") String table,
                               @QueryParam("format") String format)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -261,8 +261,7 @@
                               @QueryParam("group") String group,
                               @QueryParam("permissions") String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -283,8 +282,7 @@
                                 @FormParam("group") String group,
                                 @FormParam("permissions") String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(oldTable, ":table");
@@ -304,8 +302,7 @@
                                          @PathParam("table") String table,
                                          @PathParam("property") String property)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -324,8 +321,7 @@
     public Response listTableProperties(@PathParam("db") String db,
                                         @PathParam("table") String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -345,8 +341,7 @@
                                         @PathParam("property") String property,
                                         TablePropertyDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -366,8 +361,7 @@
     public Response listPartitions(@PathParam("db") String db,
                                    @PathParam("table") String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -386,8 +380,7 @@
                                   @PathParam("table") String table,
                                   @PathParam("partition") String partition)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -408,8 +401,7 @@
                                     @PathParam("partition") String partition,
                                     PartitionDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -432,15 +424,14 @@
                                   @QueryParam("group") String group,
                                   @QueryParam("permissions") String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
         verifyParam(partition, ":partition");
         HcatDelegator d = new HcatDelegator(appConf, execService);
         return d.dropPartition(getUser(), db, table, partition, ifExists,
-                               group, permissions);
+            group, permissions);
     }
 
     /**
@@ -451,12 +442,11 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response listDatabases(@QueryParam("like") String dbPattern)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
 
         HcatDelegator d = new HcatDelegator(appConf, execService);
-        if (! TempletonUtils.isset(dbPattern))
+        if (!TempletonUtils.isset(dbPattern))
             dbPattern = "*";
         return d.listDatabases(getUser(), dbPattern);
     }
@@ -470,8 +460,7 @@
     public Response descDatabase(@PathParam("db") String db,
                                  @QueryParam("format") String format)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         HcatDelegator d = new HcatDelegator(appConf, execService);
@@ -487,8 +476,7 @@
     public Response createDatabase(@PathParam("db") String db,
                                    DatabaseDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         desc.database = db;
@@ -508,15 +496,14 @@
                                  @QueryParam("group") String group,
                                  @QueryParam("permissions") String permissions)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         if (TempletonUtils.isset(option))
             verifyDdlParam(option, "option");
         HcatDelegator d = new HcatDelegator(appConf, execService);
         return d.dropDatabase(getUser(), db, ifExists, option,
-                              group, permissions);
+            group, permissions);
     }
 
     /**
@@ -529,8 +516,7 @@
     public Response listColumns(@PathParam("db") String db,
                                 @PathParam("table") String table)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -549,8 +535,7 @@
                                @PathParam("table") String table,
                                @PathParam("column") String column)
         throws SimpleWebException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -571,8 +556,7 @@
                                  @PathParam("column") String column,
                                  ColumnDesc desc)
         throws HcatException, NotAuthorizedException, BusyException,
-        BadParam, ExecuteException, IOException
-    {
+        BadParam, ExecuteException, IOException {
         verifyUser();
         verifyDdlParam(db, ":db");
         verifyDdlParam(table, ":table");
@@ -601,8 +585,7 @@
                                           @FormParam("statusdir") String statusdir,
                                           @FormParam("callback") String callback)
         throws NotAuthorizedException, BusyException, BadParam, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         verifyUser();
         verifyParam(inputs, "input");
         verifyParam(mapper, "mapper");
@@ -610,8 +593,8 @@
 
         StreamingDelegator d = new StreamingDelegator(appConf);
         return d.run(getUser(), inputs, output, mapper, reducer,
-                     files, defines, cmdenvs, args,
-                     statusdir, callback, getCompletedUrl());
+            files, defines, cmdenvs, args,
+            statusdir, callback, getCompletedUrl());
     }
 
     /**
@@ -629,17 +612,16 @@
                                     @FormParam("statusdir") String statusdir,
                                     @FormParam("callback") String callback)
         throws NotAuthorizedException, BusyException, BadParam, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         verifyUser();
         verifyParam(jar, "jar");
         verifyParam(mainClass, "class");
 
         JarDelegator d = new JarDelegator(appConf);
         return d.run(getUser(),
-                     jar, mainClass,
-                     libjars, files, args, defines,
-                     statusdir, callback, getCompletedUrl());
+            jar, mainClass,
+            libjars, files, args, defines,
+            statusdir, callback, getCompletedUrl());
     }
 
     /**
@@ -655,17 +637,16 @@
                            @FormParam("statusdir") String statusdir,
                            @FormParam("callback") String callback)
         throws NotAuthorizedException, BusyException, BadParam, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         verifyUser();
         if (execute == null && srcFile == null)
             throw new BadParam("Either execute or file parameter required");
 
         PigDelegator d = new PigDelegator(appConf);
         return d.run(getUser(),
-                     execute, srcFile,
-                     pigArgs, otherFiles,
-                     statusdir, callback, getCompletedUrl());
+            execute, srcFile,
+            pigArgs, otherFiles,
+            statusdir, callback, getCompletedUrl());
     }
 
     /**
@@ -680,15 +661,14 @@
                             @FormParam("statusdir") String statusdir,
                             @FormParam("callback") String callback)
         throws NotAuthorizedException, BusyException, BadParam, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         verifyUser();
         if (execute == null && srcFile == null)
             throw new BadParam("Either execute or file parameter required");
 
         HiveDelegator d = new HiveDelegator(appConf);
         return d.run(getUser(), execute, srcFile, defines,
-                     statusdir, callback, getCompletedUrl());
+            statusdir, callback, getCompletedUrl());
     }
 
     /**
@@ -698,8 +678,7 @@
     @Path("queue/{jobid}")
     @Produces({MediaType.APPLICATION_JSON})
     public QueueStatusBean showQueueId(@PathParam("jobid") String jobid)
-        throws NotAuthorizedException, BadParam, IOException
-    {
+        throws NotAuthorizedException, BadParam, IOException {
         verifyUser();
         verifyParam(jobid, ":jobid");
 
@@ -714,8 +693,7 @@
     @Path("queue/{jobid}")
     @Produces({MediaType.APPLICATION_JSON})
     public QueueStatusBean deleteQueueId(@PathParam("jobid") String jobid)
-        throws NotAuthorizedException, BadParam, IOException
-    {
+        throws NotAuthorizedException, BadParam, IOException {
         verifyUser();
         verifyParam(jobid, ":jobid");
 
@@ -730,8 +708,7 @@
     @Path("queue")
     @Produces({MediaType.APPLICATION_JSON})
     public List<String> showQueueList()
-        throws NotAuthorizedException, BadParam, IOException
-    {
+        throws NotAuthorizedException, BadParam, IOException {
         verifyUser();
 
         ListDelegator d = new ListDelegator(appConf);
@@ -745,8 +722,7 @@
     @Path("internal/complete/{jobid}")
     @Produces({MediaType.APPLICATION_JSON})
     public CompleteBean completeJob(@PathParam("jobid") String jobid)
-        throws CallbackFailedException, IOException
-    {
+        throws CallbackFailedException, IOException {
         CompleteDelegator d = new CompleteDelegator(appConf);
         return d.run(jobid);
     }
@@ -755,11 +731,10 @@
      * Verify that we have a valid user.  Throw an exception if invalid.
      */
     public void verifyUser()
-        throws NotAuthorizedException
-    {
+        throws NotAuthorizedException {
         if (getUser() == null) {
             String msg = "No user found.";
-            if (! UserGroupInformation.isSecurityEnabled())
+            if (!UserGroupInformation.isSecurityEnabled())
                 msg += "  Missing " + PseudoAuthenticator.USER_NAME + " parameter.";
             throw new NotAuthorizedException(msg);
         }
@@ -769,8 +744,7 @@
      * Verify that the parameter exists.  Throw an exception if invalid.
      */
     public void verifyParam(String param, String name)
-        throws BadParam
-    {
+        throws BadParam {
         if (param == null)
             throw new BadParam("Missing " + name + " parameter");
     }
@@ -779,8 +753,7 @@
      * Verify that the parameter exists.  Throw an exception if invalid.
      */
     public void verifyParam(List<String> param, String name)
-        throws BadParam
-    {
+        throws BadParam {
         if (param == null || param.isEmpty())
             throw new BadParam("Missing " + name + " parameter");
     }
@@ -794,12 +767,11 @@
      * Bug: This needs to allow for quoted ddl identifiers.
      */
     public void verifyDdlParam(String param, String name)
-        throws BadParam
-    {
+        throws BadParam {
         verifyParam(param, name);
         Matcher m = DDL_ID.matcher(param);
-        if (! m.matches())
-            throw new BadParam("Invalid DDL identifier " + name );
+        if (!m.matches())
+            throw new BadParam("Invalid DDL identifier " + name);
     }
 
     /**
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleExceptionMapper.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleExceptionMapper.java
index ee40fd0..fb83d5a 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleExceptionMapper.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleExceptionMapper.java
@@ -27,8 +27,7 @@
  */
 @Provider
 public class SimpleExceptionMapper
-    implements ExceptionMapper<SimpleWebException>
-{
+    implements ExceptionMapper<SimpleWebException> {
     public Response toResponse(SimpleWebException e) {
         return e.getResponse();
     }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleWebException.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleWebException.java
index 6961d16..3218aa9 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleWebException.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/SimpleWebException.java
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+
 import org.codehaus.jackson.map.ObjectMapper;
 
 /**
@@ -50,9 +51,8 @@
     }
 
     public static Response buildMessage(int httpCode, Map<String, Object> params,
-                                        String msg)
-    {
-        HashMap<String,Object> err = new HashMap<String,Object>();
+                                        String msg) {
+        HashMap<String, Object> err = new HashMap<String, Object>();
         err.put("error", msg);
         if (params != null)
             err.putAll(params);
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StatusDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StatusDelegator.java
index a7e22f2..5e9c761 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StatusDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StatusDelegator.java
@@ -18,6 +18,7 @@
 package org.apache.hcatalog.templeton;
 
 import java.io.IOException;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.mapred.JobID;
@@ -39,15 +40,14 @@
     }
 
     public QueueStatusBean run(String user, String id)
-        throws NotAuthorizedException, BadParam, IOException
-    {
+        throws NotAuthorizedException, BadParam, IOException {
         UserGroupInformation ugi = UserGroupInformation.createRemoteUser(user);
         TempletonJobTracker tracker = null;
         JobState state = null;
         try {
             tracker = new TempletonJobTracker(ugi,
-                                              JobTracker.getAddress(appConf),
-                                              appConf);
+                JobTracker.getAddress(appConf),
+                appConf);
             JobID jobid = StatusDelegator.StringToJobID(id);
             if (jobid == null)
                 throw new BadParam("Invalid jobid: " + id);
@@ -67,8 +67,7 @@
                                              JobID jobid,
                                              String childid,
                                              JobState state)
-        throws BadParam, IOException
-    {
+        throws BadParam, IOException {
         JobID bestid = jobid;
         if (childid != null)
             bestid = StatusDelegator.StringToJobID(childid);
@@ -94,8 +93,7 @@
     public static QueueStatusBean makeStatus(TempletonJobTracker tracker,
                                              JobID jobid,
                                              JobState state)
-        throws BadParam, IOException
-    {
+        throws BadParam, IOException {
         return makeStatus(tracker, jobid, state.getChildId(), state);
     }
 
@@ -103,8 +101,7 @@
      * A version of JobID.forName with our app specific error handling.
      */
     public static JobID StringToJobID(String id)
-        throws BadParam
-    {
+        throws BadParam {
         try {
             return JobID.forName(id);
         } catch (IllegalArgumentException e) {
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StreamingDelegator.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StreamingDelegator.java
index 28e549c..6c44ab4 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StreamingDelegator.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/StreamingDelegator.java
@@ -20,11 +20,12 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+
 import org.apache.commons.exec.ExecuteException;
 
 /**
  * Submit a streaming job to the MapReduce queue.  Really just a front
-   end to the JarDelegator.
+ end to the JarDelegator.
  *
  * This is the backend of the mapreduce/streaming web service.
  */
@@ -43,16 +44,15 @@
                            String callback,
                            String completedUrl)
         throws NotAuthorizedException, BadParam, BusyException, QueueException,
-        ExecuteException, IOException, InterruptedException
-    {
+        ExecuteException, IOException, InterruptedException {
         List<String> args = makeArgs(inputs, output, mapper, reducer,
-                                     files, defines, cmdenvs, jarArgs);
+            files, defines, cmdenvs, jarArgs);
 
         JarDelegator d = new JarDelegator(appConf);
         return d.run(user,
-                     appConf.streamingJar(), null,
-                     null, null, args, defines,
-                     statusdir, callback, completedUrl);
+            appConf.streamingJar(), null,
+            null, null, args, defines,
+            statusdir, callback, completedUrl);
     }
 
     private List<String> makeArgs(List<String> inputs,
@@ -62,8 +62,7 @@
                                   List<String> files,
                                   List<String> defines,
                                   List<String> cmdenvs,
-                                  List<String> jarArgs)
-    {
+                                  List<String> jarArgs) {
         ArrayList<String> args = new ArrayList<String>();
         for (String input : inputs) {
             args.add("-input");
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableDesc.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableDesc.java
index 28cf046..9636f6d 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableDesc.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableDesc.java
@@ -40,7 +40,8 @@
     /**
      * Create a new TableDesc
      */
-    public TableDesc() {}
+    public TableDesc() {
+    }
 
     public String toString() {
         return String.format("TableDesc(table=%s, columns=%s)", table, columns);
@@ -49,18 +50,18 @@
     public boolean equals(Object o) {
         if (this == o)
             return true;
-        if (! (o instanceof TableDesc))
+        if (!(o instanceof TableDesc))
             return false;
         TableDesc that = (TableDesc) o;
-        return xequals(this.external,        that.external)
-            && xequals(this.ifNotExists,     that.ifNotExists)
-            && xequals(this.table,           that.table)
-            && xequals(this.comment,         that.comment)
-            && xequals(this.columns,         that.columns)
-            && xequals(this.partitionedBy,   that.partitionedBy)
-            && xequals(this.clusteredBy,     that.clusteredBy)
-            && xequals(this.format,          that.format)
-            && xequals(this.location,        that.location)
+        return xequals(this.external, that.external)
+            && xequals(this.ifNotExists, that.ifNotExists)
+            && xequals(this.table, that.table)
+            && xequals(this.comment, that.comment)
+            && xequals(this.columns, that.columns)
+            && xequals(this.partitionedBy, that.partitionedBy)
+            && xequals(this.clusteredBy, that.clusteredBy)
+            && xequals(this.format, that.format)
+            && xequals(this.location, that.location)
             && xequals(this.tableProperties, that.tableProperties)
             && super.equals(that)
             ;
@@ -75,7 +76,8 @@
         public List<ClusterSortOrderDesc> sortedBy;
         public int numberOfBuckets;
 
-        public ClusteredByDesc() {}
+        public ClusteredByDesc() {
+        }
 
         public String toString() {
             String fmt
@@ -86,11 +88,11 @@
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof ClusteredByDesc))
+            if (!(o instanceof ClusteredByDesc))
                 return false;
             ClusteredByDesc that = (ClusteredByDesc) o;
-            return xequals(this.columnNames,     that.columnNames)
-                && xequals(this.sortedBy,        that.sortedBy)
+            return xequals(this.columnNames, that.columnNames)
+                && xequals(this.sortedBy, that.sortedBy)
                 && xequals(this.numberOfBuckets, that.numberOfBuckets)
                 ;
         }
@@ -104,7 +106,8 @@
         public String columnName;
         public SortDirectionDesc order;
 
-        public ClusterSortOrderDesc() {}
+        public ClusterSortOrderDesc() {
+        }
 
         public ClusterSortOrderDesc(String columnName, SortDirectionDesc order) {
             this.columnName = columnName;
@@ -114,17 +117,17 @@
         public String toString() {
             return String
                 .format("ClusterSortOrderDesc(columnName=%s, order=%s)",
-                        columnName, order);
+                    columnName, order);
         }
 
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof ClusterSortOrderDesc))
+            if (!(o instanceof ClusterSortOrderDesc))
                 return false;
             ClusterSortOrderDesc that = (ClusterSortOrderDesc) o;
-            return xequals(this.columnName,     that.columnName)
-                && xequals(this.order,          that.order)
+            return xequals(this.columnName, that.columnName)
+                && xequals(this.order, that.order)
                 ;
         }
     }
@@ -146,17 +149,18 @@
         public String storedAs;
         public StoredByDesc storedBy;
 
-        public StorageFormatDesc() {}
+        public StorageFormatDesc() {
+        }
 
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof StorageFormatDesc))
+            if (!(o instanceof StorageFormatDesc))
                 return false;
             StorageFormatDesc that = (StorageFormatDesc) o;
-            return xequals(this.rowFormat,      that.rowFormat)
-                && xequals(this.storedAs,       that.storedAs)
-                && xequals(this.storedBy,       that.storedBy)
+            return xequals(this.rowFormat, that.rowFormat)
+                && xequals(this.storedAs, that.storedAs)
+                && xequals(this.storedBy, that.storedBy)
                 ;
         }
     }
@@ -172,20 +176,21 @@
         public String linesTerminatedBy;
         public SerdeDesc serde;
 
-        public RowFormatDesc() {}
+        public RowFormatDesc() {
+        }
 
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof RowFormatDesc))
+            if (!(o instanceof RowFormatDesc))
                 return false;
             RowFormatDesc that = (RowFormatDesc) o;
-            return xequals(this.fieldsTerminatedBy,     that.fieldsTerminatedBy)
+            return xequals(this.fieldsTerminatedBy, that.fieldsTerminatedBy)
                 && xequals(this.collectionItemsTerminatedBy,
-                           that.collectionItemsTerminatedBy)
-                && xequals(this.mapKeysTerminatedBy,    that.mapKeysTerminatedBy)
-                && xequals(this.linesTerminatedBy,      that.linesTerminatedBy)
-                && xequals(this.serde,                  that.serde)
+                    that.collectionItemsTerminatedBy)
+                && xequals(this.mapKeysTerminatedBy, that.mapKeysTerminatedBy)
+                && xequals(this.linesTerminatedBy, that.linesTerminatedBy)
+                && xequals(this.serde, that.serde)
                 ;
         }
     }
@@ -198,16 +203,17 @@
         public String name;
         public Map<String, String> properties;
 
-        public SerdeDesc() {}
+        public SerdeDesc() {
+        }
 
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof SerdeDesc))
+            if (!(o instanceof SerdeDesc))
                 return false;
             SerdeDesc that = (SerdeDesc) o;
-            return xequals(this.name,           that.name)
-                && xequals(this.properties,     that.properties)
+            return xequals(this.name, that.name)
+                && xequals(this.properties, that.properties)
                 ;
         }
     }
@@ -220,16 +226,17 @@
         public String className;
         public Map<String, String> properties;
 
-        public StoredByDesc() {}
+        public StoredByDesc() {
+        }
 
         public boolean equals(Object o) {
             if (this == o)
                 return true;
-            if (! (o instanceof StoredByDesc))
+            if (!(o instanceof StoredByDesc))
                 return false;
             StoredByDesc that = (StoredByDesc) o;
-            return xequals(this.className,      that.className)
-                && xequals(this.properties,     that.properties)
+            return xequals(this.className, that.className)
+                && xequals(this.properties, that.properties)
                 ;
         }
     }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableLikeDesc.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableLikeDesc.java
index 689107b..cb09e54 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableLikeDesc.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/TableLikeDesc.java
@@ -30,10 +30,11 @@
     public String existingTable;
     public String newTable;
 
-    public TableLikeDesc() {}
+    public TableLikeDesc() {
+    }
 
     public String toString() {
         return String.format("TableLikeDesc(existingTable=%s, newTable=%s, location=%s",
-                             existingTable, newTable, location);
+            existingTable, newTable, location);
     }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/UgiFactory.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/UgiFactory.java
index 886163c..5763ba3 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/UgiFactory.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/UgiFactory.java
@@ -24,15 +24,15 @@
 
 public class UgiFactory {
     private static ConcurrentHashMap<String, UserGroupInformation> userUgiMap =
-            new ConcurrentHashMap<String, UserGroupInformation>();
-    
-    static UserGroupInformation getUgi(String user) throws IOException{
+        new ConcurrentHashMap<String, UserGroupInformation>();
+
+    static UserGroupInformation getUgi(String user) throws IOException {
         UserGroupInformation ugi = userUgiMap.get(user);
-        if(ugi == null){
+        if (ugi == null) {
             //create new ugi and add to map
-            final UserGroupInformation newUgi = 
-                    UserGroupInformation.createProxyUser(user,
-                            UserGroupInformation.getLoginUser());
+            final UserGroupInformation newUgi =
+                UserGroupInformation.createProxyUser(user,
+                    UserGroupInformation.getLoginUser());
 
             //if another thread adds an entry before the check in this one
             // the one created here will not be added.
@@ -40,10 +40,10 @@
 
             //use the UGI object that got added
             return userUgiMap.get(user);
-            
+
         }
         return ugi;
     }
-    
-    
+
+
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/WadlConfig.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/WadlConfig.java
index 3dc2ab1..1e60efa 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/WadlConfig.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/WadlConfig.java
@@ -26,15 +26,15 @@
 /**
  * Simple class that incorporates javadoc information into the
  * wadl produced by jersey.
- * 
+ *
  */
 public class WadlConfig extends WadlGeneratorConfig {
-    
+
     @Override
     public List<WadlGeneratorDescription> configure() {
-        return generator( WadlGeneratorResourceDocSupport.class ) 
-            .prop( "resourceDocStream", "resourcedoc.xml" ) 
-        .descriptions();
+        return generator(WadlGeneratorResourceDocSupport.class)
+            .prop("resourceDocStream", "resourcedoc.xml")
+            .descriptions();
     }
- 
+
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/HDFSStorage.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/HDFSStorage.java
index 4c21b58..6827fca 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/HDFSStorage.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/HDFSStorage.java
@@ -75,7 +75,7 @@
             out.write(val);
         } catch (IOException e) {
             LOG.info("Couldn't write to " + getPath(type) + "/" + id + ": "
-                     + e.getMessage());
+                + e.getMessage());
         } finally {
             try {
                 out.flush();
@@ -90,13 +90,12 @@
     public String getField(Type type, String id, String key) {
         BufferedReader in = null;
         try {
-            in = new BufferedReader(new InputStreamReader
-                                    (fs.open(new Path(getPath(type) + "/" +
-                                                      id + "/" + key))));
+            in = new BufferedReader(new InputStreamReader(fs.open(new Path(getPath(type) + "/" +
+                id + "/" + key))));
             String line = null;
             String val = "";
             while ((line = in.readLine()) != null) {
-                if (! val.equals("")) {
+                if (!val.equals("")) {
                     val += "\n";
                 }
                 val += line;
@@ -104,7 +103,7 @@
             return val;
         } catch (IOException e) {
             LOG.trace("Couldn't find " + getPath(type) + "/" + id + "/" + key
-                      + ": " + e.getMessage());
+                + ": " + e.getMessage());
         } finally {
             try {
                 in.close();
@@ -120,10 +119,8 @@
         HashMap<String, String> map = new HashMap<String, String>();
         BufferedReader in = null;
         try {
-            for (FileStatus status : fs.listStatus
-                     (new Path(getPath(type) + "/" + id))) {
-                in = new BufferedReader(new InputStreamReader
-                                        (fs.open(status.getPath())));
+            for (FileStatus status : fs.listStatus(new Path(getPath(type) + "/" + id))) {
+                in = new BufferedReader(new InputStreamReader(fs.open(status.getPath())));
                 String line = null;
                 String val = "";
                 while ((line = in.readLine()) != null) {
@@ -152,7 +149,7 @@
             fs.delete(new Path(getPath(type) + "/" + id), true);
         } catch (IOException e) {
             throw new NotFoundException("Node " + id + " was not found: " +
-                                        e.getMessage());
+                e.getMessage());
         }
         return false;
     }
@@ -160,7 +157,7 @@
     @Override
     public List<String> getAll() {
         ArrayList<String> allNodes = new ArrayList<String>();
-        for (Type type: Type.values()) {
+        for (Type type : Type.values()) {
             allNodes.addAll(getAllForType(type));
         }
         return allNodes;
@@ -189,7 +186,7 @@
             }
         } catch (Exception e) {
             LOG.trace("Couldn't find children for key " + key + ": " +
-                      e.getMessage());
+                e.getMessage());
         }
         return allNodes;
     }
@@ -200,7 +197,7 @@
         HashMap<String, String> map = new HashMap<String, String>();
         try {
             for (FileStatus status :
-                     fs.listStatus(new Path(getPath(type)))) {
+                fs.listStatus(new Path(getPath(type)))) {
                 map = (HashMap<String, String>)
                     getFields(type, status.getPath().getName());
                 if (map.get(key).equals(value)) {
@@ -209,7 +206,7 @@
             }
         } catch (Exception e) {
             LOG.trace("Couldn't find children for key " + key + ": " +
-                      e.getMessage());
+                e.getMessage());
         }
         return allNodes;
     }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobState.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobState.java
index 4296e36..0b884f7 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobState.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobState.java
@@ -43,16 +43,14 @@
     private Configuration config = null;
 
     public JobState(String id, Configuration conf)
-        throws IOException
-    {
+        throws IOException {
         this.id = id;
         config = conf;
         storage = getStorage(conf);
     }
 
     public void delete()
-        throws IOException
-    {
+        throws IOException {
         try {
             storage.delete(type, id);
         } catch (Exception e) {
@@ -114,28 +112,26 @@
     /**
      * The percent complete of a job
      */
-    public String  getPercentComplete()
-        throws IOException
-    {
+    public String getPercentComplete()
+        throws IOException {
         return getField("percentComplete");
     }
+
     public void setPercentComplete(String percent)
-        throws IOException
-    {
+        throws IOException {
         setField("percentComplete", percent);
     }
 
     /**
      * The child id of TempletonControllerJob
      */
-    public String  getChildId()
-        throws IOException
-    {
+    public String getChildId()
+        throws IOException {
         return getField("childid");
     }
+
     public void setChildId(String childid)
-        throws IOException
-    {
+        throws IOException {
         setField("childid", childid);
     }
 
@@ -200,13 +196,12 @@
      * The system exit value of the job.
      */
     public Long getExitValue()
-        throws IOException
-    {
+        throws IOException {
         return getLongField("exitValue");
     }
+
     public void setExitValue(long exitValue)
-        throws IOException
-    {
+        throws IOException {
         setLongField("exitValue", exitValue);
     }
 
@@ -214,13 +209,12 @@
      * When this job was created.
      */
     public Long getCreated()
-        throws IOException
-    {
+        throws IOException {
         return getLongField("created");
     }
+
     public void setCreated(long created)
-        throws IOException
-    {
+        throws IOException {
         setLongField("created", created);
     }
 
@@ -228,13 +222,12 @@
      * The user who started this job.
      */
     public String getUser()
-        throws IOException
-    {
+        throws IOException {
         return getField("user");
     }
+
     public void setUser(String user)
-        throws IOException
-    {
+        throws IOException {
         setField("user", user);
     }
 
@@ -242,13 +235,12 @@
      * The url callback
      */
     public String getCallback()
-        throws IOException
-    {
+        throws IOException {
         return getField("callback");
     }
+
     public void setCallback(String callback)
-        throws IOException
-    {
+        throws IOException {
         setField("callback", callback);
     }
 
@@ -256,13 +248,12 @@
      * The status of a job once it is completed.
      */
     public String getCompleteStatus()
-        throws IOException
-    {
+        throws IOException {
         return getField("completed");
     }
+
     public void setCompleteStatus(String complete)
-        throws IOException
-    {
+        throws IOException {
         setField("completed", complete);
     }
 
@@ -270,13 +261,12 @@
      * The time when the callback was sent.
      */
     public Long getNotifiedTime()
-        throws IOException
-    {
+        throws IOException {
         return getLongField("notified");
     }
+
     public void setNotifiedTime(long notified)
-        throws IOException
-    {
+        throws IOException {
         setLongField("notified", notified);
     }
 
@@ -288,8 +278,7 @@
      * Fetch an integer field from the store.
      */
     public Long getLongField(String name)
-        throws IOException
-    {
+        throws IOException {
         String s = storage.getField(type, id, name);
         if (s == null)
             return null;
@@ -297,7 +286,7 @@
             try {
                 return new Long(s);
             } catch (NumberFormatException e) {
-                LOG.error("templeton: bug " + name + " " + s + " : "+ e);
+                LOG.error("templeton: bug " + name + " " + s + " : " + e);
                 return null;
             }
         }
@@ -307,8 +296,7 @@
      * Store a String field from the store.
      */
     public void setField(String name, String val)
-        throws IOException
-    {
+        throws IOException {
         try {
             storage.saveField(type, id, name, val);
         } catch (NotFoundException ne) {
@@ -317,8 +305,7 @@
     }
 
     public String getField(String name)
-        throws IOException
-    {
+        throws IOException {
         return storage.getField(type, id, name);
     }
 
@@ -330,13 +317,12 @@
      * @throws IOException
      */
     public void setLongField(String name, long val)
-        throws IOException
-    {
+        throws IOException {
         try {
             storage.saveField(type, id, name, String.valueOf(val));
         } catch (NotFoundException ne) {
             throw new IOException("Job " + id + " was not found: " +
-                                  ne.getMessage());
+                ne.getMessage());
         }
     }
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobStateTracker.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobStateTracker.java
index 2055e10..78474cd 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobStateTracker.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/JobStateTracker.java
@@ -51,7 +51,7 @@
      *
      */
     public JobStateTracker(String node, ZooKeeper zk, boolean nodeIsTracker,
-            String job_trackingpath) {
+                           String job_trackingpath) {
         this.zk = zk;
         if (nodeIsTracker) {
             trackingnode = node;
@@ -65,13 +65,12 @@
      * Create the parent znode for this job state.
      */
     public void create()
-        throws IOException
-    {
+        throws IOException {
         String[] paths = ZooKeeperStorage.getPaths(job_trackingroot);
         for (String znode : paths) {
             try {
                 zk.create(znode, new byte[0],
-                          Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+                    Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
             } catch (KeeperException.NodeExistsException e) {
             } catch (Exception e) {
                 throw new IOException("Unable to create parent nodes");
@@ -79,15 +78,14 @@
         }
         try {
             trackingnode = zk.create(makeTrackingZnode(), jobid.getBytes(),
-                    Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
+                Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
         } catch (Exception e) {
             throw new IOException("Unable to create " + makeTrackingZnode());
         }
     }
 
     public void delete()
-        throws IOException
-    {
+        throws IOException {
         try {
             zk.delete(makeTrackingJobZnode(trackingnode), -1);
         } catch (Exception e) {
@@ -103,7 +101,7 @@
     public String getJobID() throws IOException {
         try {
             return new String(zk.getData(makeTrackingJobZnode(trackingnode),
-                    false, new Stat()));
+                false, new Stat()));
         } catch (KeeperException e) {
             // It was deleted during the transaction
             throw new IOException("Node already deleted " + trackingnode);
@@ -131,11 +129,11 @@
      * expired.
      */
     public static List<String> getTrackingJobs(Configuration conf, ZooKeeper zk)
-            throws IOException {
+        throws IOException {
         ArrayList<String> jobs = new ArrayList<String>();
         try {
             for (String myid : zk.getChildren(
-                    conf.get(TempletonStorage.STORAGE_ROOT)
+                conf.get(TempletonStorage.STORAGE_ROOT)
                     + ZooKeeperStorage.TRACKINGDIR, false)) {
                 jobs.add(myid);
             }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/NullRecordReader.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/NullRecordReader.java
index 135c4fe..723d577 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/NullRecordReader.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/NullRecordReader.java
@@ -18,6 +18,7 @@
 package org.apache.hcatalog.templeton.tool;
 
 import java.io.IOException;
+
 import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.InputSplit;
 import org.apache.hadoop.mapreduce.RecordReader;
@@ -27,15 +28,15 @@
  * An empty record reader.
  */
 public class NullRecordReader
-    extends RecordReader<NullWritable, NullWritable>
-{
+    extends RecordReader<NullWritable, NullWritable> {
     @Override
     public void initialize(InputSplit genericSplit, TaskAttemptContext context)
-        throws IOException
-    {}
+        throws IOException {
+    }
 
     @Override
-    public void close() throws IOException {}
+    public void close() throws IOException {
+    }
 
     @Override
     public NullWritable getCurrentKey() {
@@ -48,7 +49,9 @@
     }
 
     @Override
-    public float getProgress() { return 1.0f; }
+    public float getProgress() {
+        return 1.0f;
+    }
 
     @Override
     public boolean nextKeyValue() throws IOException {
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/SingleInputFormat.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/SingleInputFormat.java
index a190a70..b461500 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/SingleInputFormat.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/SingleInputFormat.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+
 import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.InputFormat;
 import org.apache.hadoop.mapreduce.InputSplit;
@@ -31,21 +32,18 @@
  * An empty InputFormat.
  */
 public class SingleInputFormat
-    extends InputFormat<NullWritable, NullWritable>
-{
+    extends InputFormat<NullWritable, NullWritable> {
     public List<InputSplit> getSplits(JobContext job)
-        throws IOException
-    {
+        throws IOException {
         List<InputSplit> res = new ArrayList<InputSplit>();
         res.add(new NullSplit());
         return res;
     }
 
     public RecordReader<NullWritable, NullWritable>
-        createRecordReader(InputSplit split,
-                           TaskAttemptContext context)
-        throws IOException
-    {
+    createRecordReader(InputSplit split,
+                       TaskAttemptContext context)
+        throws IOException {
         return new NullRecordReader();
     }
 }
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonControllerJob.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonControllerJob.java
index d7c4c8b..341ec5c 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonControllerJob.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonControllerJob.java
@@ -66,32 +66,32 @@
  *   in hdfs files.
  */
 public class TempletonControllerJob extends Configured implements Tool {
-    static enum ControllerCounters { SIMPLE_COUNTER };
+    static enum ControllerCounters {SIMPLE_COUNTER}
 
-    public static final String COPY_NAME      = "templeton.copy";
+    ;
+
+    public static final String COPY_NAME = "templeton.copy";
     public static final String STATUSDIR_NAME = "templeton.statusdir";
-    public static final String JAR_ARGS_NAME  = "templeton.args";
+    public static final String JAR_ARGS_NAME = "templeton.args";
     public static final String OVERRIDE_CLASSPATH = "templeton.override-classpath";
 
-    public static final String STDOUT_FNAME  = "stdout";
-    public static final String STDERR_FNAME  = "stderr";
-    public static final String EXIT_FNAME    = "exit";
+    public static final String STDOUT_FNAME = "stdout";
+    public static final String STDERR_FNAME = "stderr";
+    public static final String EXIT_FNAME = "exit";
 
     public static final int WATCHER_TIMEOUT_SECS = 10;
-    public static final int KEEP_ALIVE_MSEC      = 60 * 1000;
+    public static final int KEEP_ALIVE_MSEC = 60 * 1000;
 
     private static TrivialExecService execService = TrivialExecService.getInstance();
 
     private static final Log LOG = LogFactory.getLog(TempletonControllerJob.class);
-    
-    
+
+
     public static class LaunchMapper
-        extends Mapper<NullWritable, NullWritable, Text, Text>
-    {
+        extends Mapper<NullWritable, NullWritable, Text, Text> {
         protected Process startJob(Context context, String user,
                                    String overrideClasspath)
-            throws IOException, InterruptedException
-        {
+            throws IOException, InterruptedException {
             Configuration conf = context.getConfiguration();
             copyLocal(COPY_NAME, conf);
             String[] jarArgs
@@ -100,18 +100,17 @@
             ArrayList<String> removeEnv = new ArrayList<String>();
             removeEnv.add("HADOOP_ROOT_LOGGER");
             Map<String, String> env = TempletonUtils.hadoopUserEnv(user,
-                                                                   overrideClasspath);
+                overrideClasspath);
             List<String> jarArgsList = new LinkedList<String>(Arrays.asList(jarArgs));
             String tokenFile = System.getenv("HADOOP_TOKEN_FILE_LOCATION");
-            if(tokenFile != null){
-                jarArgsList.add(1, "-Dmapreduce.job.credentials.binary=" + tokenFile );
+            if (tokenFile != null) {
+                jarArgsList.add(1, "-Dmapreduce.job.credentials.binary=" + tokenFile);
             }
             return execService.run(jarArgsList, removeEnv, env);
         }
 
         private void copyLocal(String var, Configuration conf)
-            throws IOException
-        {
+            throws IOException {
             String[] filenames = TempletonUtils.decodeArray(conf.get(var));
             if (filenames != null) {
                 for (String filename : filenames) {
@@ -126,29 +125,28 @@
 
         @Override
         public void run(Context context)
-            throws IOException, InterruptedException
-        {
+            throws IOException, InterruptedException {
 
             Configuration conf = context.getConfiguration();
 
             Process proc = startJob(context,
-                                    conf.get("user.name"),
-                                    conf.get(OVERRIDE_CLASSPATH));
+                conf.get("user.name"),
+                conf.get(OVERRIDE_CLASSPATH));
 
             String statusdir = conf.get(STATUSDIR_NAME);
             Counter cnt = context.getCounter(ControllerCounters.SIMPLE_COUNTER);
 
             ExecutorService pool = Executors.newCachedThreadPool();
             executeWatcher(pool, conf, context.getJobID(),
-                           proc.getInputStream(), statusdir, STDOUT_FNAME);
+                proc.getInputStream(), statusdir, STDOUT_FNAME);
             executeWatcher(pool, conf, context.getJobID(),
-                           proc.getErrorStream(), statusdir, STDERR_FNAME);
+                proc.getErrorStream(), statusdir, STDERR_FNAME);
             KeepAlive keepAlive = startCounterKeepAlive(pool, cnt);
 
             proc.waitFor();
             keepAlive.sendReport = false;
             pool.shutdown();
-            if (! pool.awaitTermination(WATCHER_TIMEOUT_SECS, TimeUnit.SECONDS))
+            if (!pool.awaitTermination(WATCHER_TIMEOUT_SECS, TimeUnit.SECONDS))
                 pool.shutdownNow();
 
             writeExitValue(conf, proc.exitValue(), statusdir);
@@ -159,7 +157,7 @@
 
             if (proc.exitValue() != 0)
                 System.err.println("templeton: job failed with exit code "
-                                   + proc.exitValue());
+                    + proc.exitValue());
             else
                 System.err.println("templeton: job completed with exit code 0");
         }
@@ -167,29 +165,26 @@
         private void executeWatcher(ExecutorService pool, Configuration conf,
                                     JobID jobid, InputStream in, String statusdir,
                                     String name)
-            throws IOException
-        {
+            throws IOException {
             Watcher w = new Watcher(conf, jobid, in, statusdir, name);
             pool.execute(w);
         }
 
         private KeepAlive startCounterKeepAlive(ExecutorService pool, Counter cnt)
-            throws IOException
-        {
+            throws IOException {
             KeepAlive k = new KeepAlive(cnt);
             pool.execute(k);
             return k;
         }
 
         private void writeExitValue(Configuration conf, int exitValue, String statusdir)
-            throws IOException
-        {
+            throws IOException {
             if (TempletonUtils.isset(statusdir)) {
                 Path p = new Path(statusdir, EXIT_FNAME);
                 FileSystem fs = p.getFileSystem(conf);
                 OutputStream out = fs.create(p);
                 System.err.println("templeton: Writing exit value "
-                                   + exitValue + " to " + p);
+                    + exitValue + " to " + p);
                 PrintWriter writer = new PrintWriter(out);
                 writer.println(exitValue);
                 writer.close();
@@ -205,8 +200,7 @@
 
         public Watcher(Configuration conf, JobID jobid, InputStream in,
                        String statusdir, String name)
-            throws IOException
-        {
+            throws IOException {
             this.conf = conf;
             this.jobid = jobid;
             this.in = in;
@@ -266,8 +260,7 @@
         private Counter cnt;
         public boolean sendReport;
 
-        public KeepAlive(Counter cnt)
-        {
+        public KeepAlive(Counter cnt) {
             this.cnt = cnt;
             this.sendReport = true;
         }
@@ -286,6 +279,7 @@
     }
 
     private JobID submittedJobId;
+
     public String getSubmittedId() {
         if (submittedJobId == null)
             return null;
@@ -298,8 +292,7 @@
      */
     @Override
     public int run(String[] args)
-        throws IOException, InterruptedException, ClassNotFoundException
-    {
+        throws IOException, InterruptedException, ClassNotFoundException {
         Configuration conf = getConf();
         conf.set(JAR_ARGS_NAME, TempletonUtils.encodeArray(args));
         conf.set("user.name", UserGroupInformation.getCurrentUser().getShortUserName());
@@ -314,9 +307,9 @@
             = new NullOutputFormat<NullWritable, NullWritable>();
         job.setOutputFormatClass(of.getClass());
         job.setNumReduceTasks(0);
-        
+
         JobClient jc = new JobClient(new JobConf(job.getConfiguration()));
-        
+
         Token<DelegationTokenIdentifier> mrdt = jc.getDelegationToken(new Text("mr token"));
         job.getCredentials().addToken(new Text("mr token"), mrdt);
         job.submit();
@@ -326,7 +319,7 @@
         return 0;
     }
 
-    
+
     public static void main(String[] args) throws Exception {
         int ret = ToolRunner.run(new TempletonControllerJob(), args);
         if (ret != 0)
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonUtils.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonUtils.java
index 8213af7..67bd8fd 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonUtils.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TempletonUtils.java
@@ -30,6 +30,7 @@
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -65,14 +66,14 @@
      * Is the object non-empty?
      */
     public static <T> boolean isset(Collection<T> col) {
-        return (col != null) && (! col.isEmpty());
+        return (col != null) && (!col.isEmpty());
     }
 
     /**
      * Is the object non-empty?
      */
     public static <K, V> boolean isset(Map<K, V> col) {
-        return (col != null) && (! col.isEmpty());
+        return (col != null) && (!col.isEmpty());
     }
 
 
@@ -160,8 +161,7 @@
     public static String[] hadoopFsListAsArray(String files, Configuration conf,
                                                String user)
         throws URISyntaxException, FileNotFoundException, IOException,
-        InterruptedException
-    {
+        InterruptedException {
         if (files == null || conf == null) {
             return null;
         }
@@ -177,8 +177,7 @@
     public static String hadoopFsListAsString(String files, Configuration conf,
                                               String user)
         throws URISyntaxException, FileNotFoundException, IOException,
-        InterruptedException
-    {
+        InterruptedException {
         if (files == null || conf == null) {
             return null;
         }
@@ -187,8 +186,7 @@
 
     public static String hadoopFsFilename(String fname, Configuration conf, String user)
         throws URISyntaxException, FileNotFoundException, IOException,
-        InterruptedException
-    {
+        InterruptedException {
         Path p = hadoopFsPath(fname, conf, user);
         if (p == null)
             return null;
@@ -201,8 +199,8 @@
      */
     public static boolean hadoopFsIsMissing(FileSystem fs, Path p) {
         try {
-            return ! fs.exists(p);
-        } catch(Throwable t) {
+            return !fs.exists(p);
+        } catch (Throwable t) {
             // Got an error, might be there anyway due to a
             // permissions problem.
             return false;
@@ -211,8 +209,7 @@
 
     public static Path hadoopFsPath(String fname, Configuration conf, String user)
         throws URISyntaxException, FileNotFoundException, IOException,
-        InterruptedException
-    {
+        InterruptedException {
         if (fname == null || conf == null) {
             return null;
         }
@@ -231,8 +228,7 @@
      * GET the given url.  Returns the number of bytes received.
      */
     public static int fetchUrl(URL url)
-        throws IOException
-    {
+        throws IOException {
         URLConnection cnx = url.openConnection();
         InputStream in = cnx.getInputStream();
 
@@ -249,8 +245,7 @@
      * Set the environment variables to specify the hadoop user.
      */
     public static Map<String, String> hadoopUserEnv(String user,
-                                                    String overrideClasspath)
-    {
+                                                    String overrideClasspath) {
         HashMap<String, String> env = new HashMap<String, String>();
         env.put("HADOOP_USER_NAME", user);
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TrivialExecService.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TrivialExecService.java
index 20a8f2b..36759b3 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TrivialExecService.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/TrivialExecService.java
@@ -39,11 +39,10 @@
 
     public Process run(List<String> cmd, List<String> removeEnv,
                        Map<String, String> environmentVariables)
-        throws IOException
-    {
+        throws IOException {
         System.err.println("templeton: starting " + cmd);
-        System.err.print("With environment variables: " );
-        for(Map.Entry<String, String> keyVal : environmentVariables.entrySet()){
+        System.err.print("With environment variables: ");
+        for (Map.Entry<String, String> keyVal : environmentVariables.entrySet()) {
             System.err.println(keyVal.getKey() + "=" + keyVal.getValue());
         }
         ProcessBuilder pb = new ProcessBuilder(cmd);
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperCleanup.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperCleanup.java
index 03407c4..5e4f452 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperCleanup.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperCleanup.java
@@ -77,7 +77,7 @@
     }
 
     public static void startInstance(Configuration appConf) throws IOException {
-        if (! isRunning) {
+        if (!isRunning) {
             getInstance(appConf).start();
         }
     }
@@ -122,7 +122,7 @@
 
                 long sleepMillis = (long) (Math.random() * interval);
                 LOG.info("Next execution: " + new Date(new Date().getTime()
-                                                       + sleepMillis));
+                    + sleepMillis));
                 Thread.sleep(sleepMillis);
 
             } catch (Exception e) {
@@ -157,8 +157,8 @@
         JobState state = null;
         try {
             JobStateTracker tracker = new JobStateTracker(node, zk, true,
-                    appConf.get(TempletonStorage.STORAGE_ROOT +
-                            ZooKeeperStorage.TRACKINGDIR));
+                appConf.get(TempletonStorage.STORAGE_ROOT +
+                    ZooKeeperStorage.TRACKINGDIR));
             long now = new Date().getTime();
             state = new JobState(tracker.getJobID(), appConf);
 
diff --git a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperStorage.java b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperStorage.java
index 2183808..6bfe460 100644
--- a/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperStorage.java
+++ b/webhcat/svr/src/main/java/org/apache/hcatalog/templeton/tool/ZooKeeperStorage.java
@@ -65,25 +65,23 @@
      * Open a ZooKeeper connection for the JobState.
      */
     public static ZooKeeper zkOpen(String zkHosts, int zkSessionTimeout)
-        throws IOException
-    {
+        throws IOException {
         return new ZooKeeper(zkHosts,
-                             zkSessionTimeout,
-                             new Watcher() {
-                                 @Override
-                                 synchronized public void process(WatchedEvent event) {
-                                 }
-                             });
+            zkSessionTimeout,
+            new Watcher() {
+                @Override
+                synchronized public void process(WatchedEvent event) {
+                }
+            });
     }
 
     /**
      * Open a ZooKeeper connection for the JobState.
      */
     public static ZooKeeper zkOpen(Configuration conf)
-        throws IOException
-    {
+        throws IOException {
         return zkOpen(conf.get(ZK_HOSTS),
-                      conf.getInt(ZK_SESSION_TIMEOUT, 30000));
+            conf.getInt(ZK_SESSION_TIMEOUT, 30000));
     }
 
     public ZooKeeperStorage() {
@@ -95,8 +93,7 @@
      * Close this ZK connection.
      */
     public void close()
-        throws IOException
-    {
+        throws IOException {
         if (zk != null) {
             try {
                 zk.close();
@@ -119,15 +116,14 @@
      * Create a node in ZooKeeper
      */
     public void create(Type type, String id)
-        throws IOException
-    {
+        throws IOException {
         try {
             String[] paths = getPaths(makeZnode(type, id));
             boolean wasCreated = false;
             for (String znode : paths) {
                 try {
                     zk.create(znode, new byte[0],
-                              Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+                        Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
                     wasCreated = true;
                 } catch (KeeperException.NodeExistsException e) {
                 }
@@ -138,7 +134,7 @@
                     // to see how the storage mechanism evolves.
                     if (type.equals(Type.JOB)) {
                         JobStateTracker jt = new JobStateTracker(id, zk, false,
-                                job_trackingpath);
+                            job_trackingpath);
                         jt.create();
                     }
                 } catch (Exception e) {
@@ -153,7 +149,7 @@
             if (wasCreated) {
                 try {
                     saveField(type, id, "created",
-                              Long.toString(System.currentTimeMillis()));
+                        Long.toString(System.currentTimeMillis()));
                 } catch (NotFoundException nfe) {
                     // Wow, something's really wrong.
                     throw new IOException("Couldn't write to node " + id, nfe);
@@ -210,17 +206,16 @@
      * @throws InterruptedException
      */
     private void setFieldData(Type type, String id, String name, String val)
-        throws KeeperException, UnsupportedEncodingException, InterruptedException
-    {
+        throws KeeperException, UnsupportedEncodingException, InterruptedException {
         try {
             zk.create(makeFieldZnode(type, id, name),
-                      val.getBytes(ENCODING),
-                      Ids.OPEN_ACL_UNSAFE,
-                      CreateMode.PERSISTENT);
-        } catch(KeeperException.NodeExistsException e) {
+                val.getBytes(ENCODING),
+                Ids.OPEN_ACL_UNSAFE,
+                CreateMode.PERSISTENT);
+        } catch (KeeperException.NodeExistsException e) {
             zk.setData(makeFieldZnode(type, id, name),
-                       val.getBytes(ENCODING),
-                       -1);
+                val.getBytes(ENCODING),
+                -1);
         }
     }
 
@@ -246,9 +241,9 @@
                 create(type, id);
                 setFieldData(type, id, key, val);
             }
-        } catch(Exception e) {
+        } catch (Exception e) {
             throw new NotFoundException("Writing " + key + ": " + val + ", "
-                                        + e.getMessage());
+                + e.getMessage());
         }
     }
 
@@ -257,7 +252,7 @@
         try {
             byte[] b = zk.getData(makeFieldZnode(type, id, key), false, null);
             return new String(b, ENCODING);
-        } catch(Exception e) {
+        } catch (Exception e) {
             return null;
         }
     }
@@ -266,12 +261,12 @@
     public Map<String, String> getFields(Type type, String id) {
         HashMap<String, String> map = new HashMap<String, String>();
         try {
-            for (String node: zk.getChildren(makeZnode(type, id), false)) {
+            for (String node : zk.getChildren(makeZnode(type, id), false)) {
                 byte[] b = zk.getData(makeFieldZnode(type, id, node),
-                                      false, null);
+                    false, null);
                 map.put(node, new String(b, ENCODING));
             }
-        } catch(Exception e) {
+        } catch (Exception e) {
             return map;
         }
         return map;
@@ -287,7 +282,7 @@
                     // Other nodes may be trying to delete this at the same time,
                     // so just log errors and skip them.
                     throw new NotFoundException("Couldn't delete " +
-                                                makeFieldZnode(type, id, child));
+                        makeFieldZnode(type, id, child));
                 }
             }
             try {
@@ -295,12 +290,12 @@
             } catch (Exception e) {
                 // Same thing -- might be deleted by other nodes, so just go on.
                 throw new NotFoundException("Couldn't delete " +
-                                            makeZnode(type, id));
+                    makeZnode(type, id));
             }
         } catch (Exception e) {
             // Error getting children of node -- probably node has been deleted
             throw new NotFoundException("Couldn't get children of " +
-                                        makeZnode(type, id));
+                makeZnode(type, id));
         }
         return true;
     }
@@ -308,7 +303,7 @@
     @Override
     public List<String> getAll() {
         ArrayList<String> allNodes = new ArrayList<String>();
-        for (Type type: Type.values()) {
+        for (Type type : Type.values()) {
             allNodes.addAll(getAllForType(type));
         }
         return allNodes;
@@ -327,7 +322,7 @@
     public List<String> getAllForKey(String key, String value) {
         ArrayList<String> allNodes = new ArrayList<String>();
         try {
-            for (Type type: Type.values()) {
+            for (Type type : Type.values()) {
                 allNodes.addAll(getAllForTypeAndKey(type, key, value));
             }
         } catch (Exception e) {
diff --git a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/mock/MockServer.java b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/mock/MockServer.java
index c5a8633..7f0d908 100644
--- a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/mock/MockServer.java
+++ b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/mock/MockServer.java
@@ -24,6 +24,7 @@
  */
 public class MockServer extends Server {
     public String user;
+
     public MockServer() {
         execService = new MockExecService();
         resetUser();
diff --git a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTempletonUtils.java b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTempletonUtils.java
index 984a445..36b81c2 100644
--- a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTempletonUtils.java
+++ b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTempletonUtils.java
@@ -183,7 +183,7 @@
             Assert.assertTrue(TempletonUtils.hadoopFsListAsString("/tmp,/usr",
                                                            null, null) == null);
             Assert.assertEquals("file:/tmp,file:/usr", TempletonUtils.hadoopFsListAsString
-                         ("/tmp,/usr", new Configuration(), null));
+                ("/tmp,/usr", new Configuration(), null));
         } catch (FileNotFoundException e) {
             Assert.fail("Couldn't find name for /tmp");
         } catch (Exception e) {
diff --git a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTrivialExecService.java b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTrivialExecService.java
index 84cb784..72fb331 100644
--- a/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTrivialExecService.java
+++ b/webhcat/svr/src/test/java/org/apache/hcatalog/templeton/tool/TestTrivialExecService.java
@@ -36,17 +36,17 @@
         try {
             Process process = TrivialExecService.getInstance()
                 .run(list,
-                     new ArrayList<String>(),
-                     new HashMap<String, String>());
+                    new ArrayList<String>(),
+                    new HashMap<String, String>());
             out = new BufferedReader(new InputStreamReader(
-                                         process.getInputStream()));
+                process.getInputStream()));
             err = new BufferedReader(new InputStreamReader(
-                                         process.getErrorStream()));
+                process.getErrorStream()));
             Assert.assertEquals("success", out.readLine());
             out.close();
             String line;
             while ((line = err.readLine()) != null) {
-              Assert.fail(line);
+                Assert.fail(line);
             }
             process.waitFor();
         } catch (Exception e) {
