HTRACE-227. Remove dependency to non-public API of hadoop-common from htrace-hbase (iwasakims)
diff --git a/htrace-hbase/pom.xml b/htrace-hbase/pom.xml
index 2230b32..20075e9 100644
--- a/htrace-hbase/pom.xml
+++ b/htrace-hbase/pom.xml
@@ -32,10 +32,7 @@
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <hbase.version>0.99.2</hbase.version>
-    <!-- <hbase.version>0.99.0-SNAPSHOT</hbase.version> -->
-    <hadoop.version>2.4.0</hadoop.version>
-    <!-- <hadoop.version>3.0.0-SNAPSHOT</hadoop.version> -->
-    <protobuf.version>2.5.0</protobuf.version>
+    <jetty.version>9.2.13.v20150730</jetty.version>
   </properties>
 
   <build>
@@ -49,7 +46,6 @@
     </resources>
     <plugins>
       <plugin>
-        <!--Make it so assembly:single does nothing in here-->
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
           <descriptorRefs>
@@ -84,6 +80,14 @@
                   <pattern>com.google.protobuf</pattern>
                   <shadedPattern>org.apache.htrace.com.google.protobuf</shadedPattern>
                 </relocation>
+                <relocation>
+                  <pattern>org.eclipse.jetty</pattern>
+                  <shadedPattern>org.apache.htrace.org.eclipse.jetty</shadedPattern>
+                </relocation>
+                <relocation>
+                  <pattern>javax.servlet</pattern>
+                  <shadedPattern>org.apache.htrace.javax.servlet</shadedPattern>
+                </relocation>
               </relocations>
             </configuration>
             <goals>
@@ -124,7 +128,17 @@
     <dependency>
       <groupId>com.google.protobuf</groupId>
       <artifactId>protobuf-java</artifactId>
-      <version>${protobuf.version}</version>
+      <version>2.5.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
     </dependency>
     <!-- Global deps. -->
     <dependency>
@@ -141,6 +155,7 @@
       <groupId>org.apache.hbase</groupId>
       <artifactId>hbase-client</artifactId>
       <version>${hbase.version}</version>
+      <scope>provided</scope>
       <exclusions>
         <exclusion>
           <groupId>org.apache.htrace</groupId>
@@ -169,7 +184,7 @@
           <plugin>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-maven-plugins</artifactId>
-            <version>${hadoop.version}</version>
+            <version>2.7.1</version>
             <configuration>
               <protocVersion>${protobuf.version}</protocVersion>
               <protocCommand>${protoc.path}</protocCommand>
diff --git a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
index b0720f3..1f54f18 100644
--- a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
+++ b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
@@ -364,6 +364,7 @@
     long traceid = parent.getSpan().getSpanId().getHigh();
     TraceScope child1 = Trace.startSpan("HBaseSpanReceiver.main.child.1");
     Thread.sleep(10);
+    child1.close();
     TraceScope child2 = Trace.startSpan("HBaseSpanReceiver.main.child.2", parent.getSpan());
     Thread.sleep(10);
     TraceScope gchild = Trace.startSpan("HBaseSpanReceiver.main.grandchild");
@@ -374,7 +375,6 @@
     Thread.sleep(10);
     child2.close();
     Thread.sleep(10);
-    child1.close();
     parent.close();
     receiver.close();
     System.out.println("trace id: " + traceid);
diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java
index da90008..1ae7165 100644
--- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java
+++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java
@@ -22,87 +22,66 @@
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.http.HttpServer2;
-import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
 public class HBaseSpanViewerServer implements Tool {
   private static final Log LOG = LogFactory.getLog(HBaseSpanViewerServer.class);
   public static final String HTRACE_VIEWER_HTTP_ADDRESS_KEY = "htrace.viewer.http.address";
   public static final String HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT = "0.0.0.0:16900";
-  public static final String HTRACE_CONF_ATTR = "htrace.conf";
-  public static final String HTRACE_APPDIR = "webapps";
-  public static final String NAME = "htrace";
-
   private Configuration conf;
-  private HttpServer2 httpServer;
-  private InetSocketAddress httpAddress;
+  private Server server;
 
+  @Override
   public void setConf(Configuration conf) {
     this.conf = conf;
   }
 
+  @Override
   public Configuration getConf() {
     return this.conf;
   }
 
-  void start() throws IOException {
-    httpAddress = NetUtils.createSocketAddr(
-        conf.get(HTRACE_VIEWER_HTTP_ADDRESS_KEY, HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT));
-    conf.set(HTRACE_VIEWER_HTTP_ADDRESS_KEY, NetUtils.getHostPortString(httpAddress));
-    HttpServer2.Builder builder = new HttpServer2.Builder();
-    builder.setName(NAME).setConf(conf);
-    if (httpAddress.getPort() == 0) {
-      builder.setFindPort(true);
+  public void stop() throws Exception {
+    if (server != null) {
+      server.stop();
     }
-    URI uri = URI.create("http://" + NetUtils.getHostPortString(httpAddress));
-    builder.addEndpoint(uri);
-    LOG.info("Starting Web-server for " + NAME + " at: " + uri);
-    httpServer = builder.build();
-    httpServer.setAttribute(HTRACE_CONF_ATTR, conf);
-    httpServer.addServlet("gettraces",
-                          HBaseSpanViewerTracesServlet.PREFIX,
-                          HBaseSpanViewerTracesServlet.class);
-    httpServer.addServlet("getspans",
-                          HBaseSpanViewerSpansServlet.PREFIX + "/*",
-                          HBaseSpanViewerSpansServlet.class);
-
-    // for webapps/htrace bundled in jar.
-    String rb = httpServer.getClass()
-                          .getClassLoader()
-                          .getResource("webapps/" + NAME)
-                          .toString();
-    httpServer.getWebAppContext().setResourceBase(rb);
-
-    httpServer.start();
-    httpAddress = httpServer.getConnectorAddress(0);
-  }
-
-  void join() throws Exception {
-    if (httpServer != null) {
-      httpServer.join();
-    }
-  }
-
-  void stop() throws Exception {
-    if (httpServer != null) {
-      httpServer.stop();
-    }
-  }
-
-  InetSocketAddress getHttpAddress() {
-    return httpAddress;
   }
 
   public int run(String[] args) throws Exception {
-    start();
-    join();
-    stop();
+    URI uri = new URI("http://" + conf.get(HTRACE_VIEWER_HTTP_ADDRESS_KEY,
+                                           HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT));
+    InetSocketAddress addr = new InetSocketAddress(uri.getHost(), uri.getPort());
+    server = new Server(addr);
+    ServletContextHandler root =
+      new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
+    server.setHandler(root);
+
+    String resourceBase = server.getClass()
+                                .getClassLoader()
+                                .getResource("webapps/htrace")
+                                .toExternalForm();
+    root.setResourceBase(resourceBase);
+    root.setWelcomeFiles(new String[]{"index.html"});
+    root.addServlet(new ServletHolder(new DefaultServlet()),
+                    "/");
+    root.addServlet(new ServletHolder(new HBaseSpanViewerTracesServlet(conf)),
+                    "/gettraces");
+    root.addServlet(new ServletHolder(new HBaseSpanViewerSpansServlet(conf)),
+                    "/getspans/*");
+
+    server.start();
+    server.join();
     return 0;
   }
 
diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java
index 8f3f50f..3983fde 100644
--- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java
+++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java
@@ -29,8 +29,6 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.util.ServletUtil;
 import org.apache.htrace.protobuf.generated.SpanProtos;
 
 public class HBaseSpanViewerSpansServlet extends HttpServlet {
@@ -43,22 +41,24 @@
           return null;
         }
       };
+  private Configuration conf;
+
+  public HBaseSpanViewerSpansServlet(Configuration conf) {
+    this.conf = conf;
+  }
 
   @Override
   @SuppressWarnings("unchecked")
   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
-    final String path =
-        validatePath(ServletUtil.getDecodedPath(request, PREFIX));
-    if (path == null) {
+    final String path = request.getRequestURI().substring(PREFIX.length());
+    if (path == null || path.length() == 0) {
       response.setContentType("text/plain");
       response.getWriter().print("Invalid input");
       return;
     }
     HBaseSpanViewer viewer = tlviewer.get();
     if (viewer == null) {
-      final Configuration conf = (Configuration) getServletContext()
-        .getAttribute(HBaseSpanViewerServer.HTRACE_CONF_ATTR);
       viewer = new HBaseSpanViewer(conf);
       tlviewer.set(viewer);
     }
@@ -89,9 +89,4 @@
       viewer.close();
     }
   }
-
-  public static String validatePath(String p) {
-    return p == null || p.length() == 0?
-      null: new Path(p).toUri().getPath();
-  }
 }
diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java
index b0370c4..37ed43c 100644
--- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java
+++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java
@@ -29,8 +29,6 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.util.ServletUtil;
 import org.apache.htrace.protobuf.generated.SpanProtos;
 
 public class HBaseSpanViewerTracesServlet extends HttpServlet {
@@ -43,6 +41,11 @@
           return null;
         }
       };
+  private Configuration conf;
+
+  public HBaseSpanViewerTracesServlet(Configuration conf) {
+    this.conf = conf;
+  }
 
   @Override
   @SuppressWarnings("unchecked")
@@ -50,8 +53,6 @@
       throws ServletException, IOException {
     HBaseSpanViewer viewer = tlviewer.get();
     if (viewer == null) {
-      final Configuration conf = (Configuration) getServletContext()
-        .getAttribute(HBaseSpanViewerServer.HTRACE_CONF_ATTR);
       viewer = new HBaseSpanViewer(conf);
       tlviewer.set(viewer);
     }
diff --git a/htrace-hbase/src/main/webapps/static/bootstrap-theme.min.css b/htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css
similarity index 100%
rename from htrace-hbase/src/main/webapps/static/bootstrap-theme.min.css
rename to htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css
diff --git a/htrace-hbase/src/main/webapps/static/bootstrap.min.css b/htrace-hbase/src/main/webapps/htrace/bootstrap.min.css
similarity index 100%
rename from htrace-hbase/src/main/webapps/static/bootstrap.min.css
rename to htrace-hbase/src/main/webapps/htrace/bootstrap.min.css
diff --git a/htrace-hbase/src/main/webapps/static/d3.min.js b/htrace-hbase/src/main/webapps/htrace/d3.min.js
similarity index 100%
rename from htrace-hbase/src/main/webapps/static/d3.min.js
rename to htrace-hbase/src/main/webapps/htrace/d3.min.js
diff --git a/htrace-hbase/src/main/webapps/htrace/spans.html b/htrace-hbase/src/main/webapps/htrace/spans.html
index 28b48b7..6e3fa45 100644
--- a/htrace-hbase/src/main/webapps/htrace/spans.html
+++ b/htrace-hbase/src/main/webapps/htrace/spans.html
@@ -17,11 +17,11 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
-<script src="/static/d3.min.js" type="text/javascript"></script>
+<script src="d3.min.js" type="text/javascript"></script>
 <script src="spans.js" type="text/javascript"></script>
 <head>
-  <link href="/static/bootstrap.min.css" rel="stylesheet">
-  <link href="/static/bootstrap-theme.min.css" rel="stylesheet">
+  <link href="bootstrap.min.css" rel="stylesheet">
+  <link href="bootstrap-theme.min.css" rel="stylesheet">
 </head>
 <body>
 </body>
diff --git a/htrace-hbase/src/main/webapps/htrace/spans.js b/htrace-hbase/src/main/webapps/htrace/spans.js
index 03ff6fb..8e58860 100644
--- a/htrace-hbase/src/main/webapps/htrace/spans.js
+++ b/htrace-hbase/src/main/webapps/htrace/spans.js
@@ -21,7 +21,7 @@
 const size_tl = 6;
 const margin = {top: 50, bottom: 50, left: 50, right: 1000, process: 250};
 
-const ROOT_SPAN_ID = "477902"; // constants defined in org.apache.htrace.Span
+const ROOT_SPAN_ID = "0";
 const traceid = window.location.search.substring(1).split("=")[1];
 
 d3.json("/getspans/" + traceid, function(spans) {
diff --git a/htrace-hbase/src/main/webapps/htrace/traces.html b/htrace-hbase/src/main/webapps/htrace/traces.html
index a8e1e2a..c0f0a37 100644
--- a/htrace-hbase/src/main/webapps/htrace/traces.html
+++ b/htrace-hbase/src/main/webapps/htrace/traces.html
@@ -17,11 +17,11 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
-<script src="/static/d3.min.js" type="text/javascript"></script>
+<script src="d3.min.js" type="text/javascript"></script>
 <script src="traces.js" type="text/javascript"></script>
 <head>
-  <link href="/static/bootstrap.min.css" rel="stylesheet">
-  <link href="/static/bootstrap-theme.min.css" rel="stylesheet">
+  <link href="bootstrap.min.css" rel="stylesheet">
+  <link href="bootstrap-theme.min.css" rel="stylesheet">
 </head>
 <body>
 </body>