HTRACE-230. Make TracerBuilder like all other Builders; an internal rather than adjacent class (cmccabe)
diff --git a/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java b/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
index 6054a27..28ecdc3 100644
--- a/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
+++ b/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
@@ -22,6 +22,8 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ThreadLocalRandom;
@@ -36,6 +38,121 @@
 public class Tracer implements Closeable {
   private static final Log LOG = LogFactory.getLog(Tracer.class);
 
+  public final static String SPAN_RECEIVER_CLASSES_KEY =
+      "span.receiver.classes";
+  public final static String SAMPLER_CLASSES_KEY =
+      "sampler.classes";
+
+  public static class Builder {
+    private String name;
+    private HTraceConfiguration conf = HTraceConfiguration.EMPTY;
+    private ClassLoader classLoader =
+        Builder.class.getClassLoader();
+    private TracerPool tracerPool = TracerPool.GLOBAL;
+
+    public Builder() {
+    }
+
+    public Builder name(String name) {
+      this.name = name;
+      return this;
+    }
+
+    public Builder conf(HTraceConfiguration conf) {
+      this.conf = conf;
+      return this;
+    }
+
+    public Builder tracerPool(TracerPool tracerPool) {
+      this.tracerPool = tracerPool;
+      return this;
+    }
+
+    private void loadSamplers(List<Sampler> samplers) {
+      String classNamesStr = conf.get(SAMPLER_CLASSES_KEY, "");
+      List<String> classNames = getClassNamesFromConf(classNamesStr);
+      StringBuilder bld = new StringBuilder();
+      String prefix = "";
+      for (String className : classNames) {
+        try {
+          Sampler sampler = new Sampler.Builder(conf).
+            className(className).
+            classLoader(classLoader).
+            build();
+          samplers.add(sampler);
+          bld.append(prefix).append(className);
+          prefix = ", ";
+        } catch (Throwable e) {
+          LOG.error("Failed to create SpanReceiver of type " + className, e);
+        }
+      }
+      String resultString = bld.toString();
+      if (resultString.isEmpty()) {
+        resultString = "no samplers";
+      }
+      LOG.info(SAMPLER_CLASSES_KEY + " = " + classNamesStr +
+          "; loaded " + resultString);
+    }
+
+    private void loadSpanReceivers() {
+      String classNamesStr = conf.get(SPAN_RECEIVER_CLASSES_KEY, "");
+      List<String> classNames = getClassNamesFromConf(classNamesStr);
+      StringBuilder bld = new StringBuilder();
+      String prefix = "";
+      for (String className : classNames) {
+        try {
+          tracerPool.loadReceiverType(className, conf, classLoader);
+          bld.append(prefix).append(className);
+          prefix = ", ";
+        } catch (Throwable e) {
+          LOG.error("Failed to create SpanReceiver of type " + className, e);
+        }
+      }
+      String resultString = bld.toString();
+      if (resultString.isEmpty()) {
+        resultString = "no span receivers";
+      }
+      LOG.info(SPAN_RECEIVER_CLASSES_KEY + " = " + classNamesStr +
+          "; loaded " + resultString);
+    }
+
+    /**
+     * Get a list of class names from the HTrace configuration.
+     * Entries which are empty will be removed.  Entries which lack a package will
+     * be given the default package.
+     *
+     * @param classNamesStr     A semicolon-separated string containing a list
+     *                            of class names.
+     * @return                  A list of class names.
+     */
+    private List<String> getClassNamesFromConf(String classNamesStr) {
+      String classNames[] = classNamesStr.split(";");
+      LinkedList<String> cleanedClassNames = new LinkedList<String>();
+      for (String className : classNames) {
+        String cleanedClassName = className.trim();
+        if (!cleanedClassName.isEmpty()) {
+          cleanedClassNames.add(cleanedClassName);
+        }
+      }
+      return cleanedClassNames;
+    }
+
+    public Tracer build() {
+      if (name == null) {
+        throw new RuntimeException("You must specify a name for this Tracer.");
+      }
+      LinkedList<SpanReceiver> spanReceivers = new LinkedList<SpanReceiver>();
+      LinkedList<Sampler> samplers = new LinkedList<Sampler>();
+      loadSamplers(samplers);
+      String tracerId = new TracerId(conf, name).get();
+      Tracer tracer = new Tracer(tracerId, tracerPool,
+          samplers.toArray(new Sampler[samplers.size()]));
+      tracerPool.addTracer(tracer);
+      loadSpanReceivers();
+      return tracer;
+    }
+  }
+
   /**
    * The thread-specific context for this Tracer.
    *
diff --git a/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java b/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java
deleted file mode 100644
index 0f12253..0000000
--- a/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.htrace.core;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.lang.reflect.Constructor;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Builds a new Tracer object.
- */
-public class TracerBuilder {
-  public final static String SPAN_RECEIVER_CLASSES_KEY =
-      "span.receiver.classes";
-  public final static String SAMPLER_CLASSES_KEY =
-      "sampler.classes";
-
-  private static final Log LOG = LogFactory.getLog(TracerBuilder.class);
-
-  private String name;
-  private HTraceConfiguration conf = HTraceConfiguration.EMPTY;
-  private ClassLoader classLoader =
-      TracerBuilder.class.getClassLoader();
-  private TracerPool tracerPool = TracerPool.GLOBAL;
-
-  public TracerBuilder() {
-  }
-
-  public TracerBuilder name(String name) {
-    this.name = name;
-    return this;
-  }
-
-  public TracerBuilder conf(HTraceConfiguration conf) {
-    this.conf = conf;
-    return this;
-  }
-
-  public TracerBuilder tracerPool(TracerPool tracerPool) {
-    this.tracerPool = tracerPool;
-    return this;
-  }
-
-  private void loadSamplers(List<Sampler> samplers) {
-    String classNamesStr = conf.get(SAMPLER_CLASSES_KEY, "");
-    List<String> classNames = getClassNamesFromConf(classNamesStr);
-    StringBuilder bld = new StringBuilder();
-    String prefix = "";
-    for (String className : classNames) {
-      try {
-        Sampler sampler = new Sampler.Builder(conf).
-          className(className).
-          classLoader(classLoader).
-          build();
-        samplers.add(sampler);
-        bld.append(prefix).append(className);
-        prefix = ", ";
-      } catch (Throwable e) {
-        LOG.error("Failed to create SpanReceiver of type " + className, e);
-      }
-    }
-    String resultString = bld.toString();
-    if (resultString.isEmpty()) {
-      resultString = "no samplers";
-    }
-    LOG.info(SAMPLER_CLASSES_KEY + " = " + classNamesStr +
-        "; loaded " + resultString);
-  }
-
-  private void loadSpanReceivers() {
-    String classNamesStr = conf.get(SPAN_RECEIVER_CLASSES_KEY, "");
-    List<String> classNames = getClassNamesFromConf(classNamesStr);
-    StringBuilder bld = new StringBuilder();
-    String prefix = "";
-    for (String className : classNames) {
-      try {
-        tracerPool.loadReceiverType(className, conf, classLoader);
-        bld.append(prefix).append(className);
-        prefix = ", ";
-      } catch (Throwable e) {
-        LOG.error("Failed to create SpanReceiver of type " + className, e);
-      }
-    }
-    String resultString = bld.toString();
-    if (resultString.isEmpty()) {
-      resultString = "no span receivers";
-    }
-    LOG.info(SPAN_RECEIVER_CLASSES_KEY + " = " + classNamesStr +
-        "; loaded " + resultString);
-  }
-
-  /**
-   * Get a list of class names from the HTrace configuration.
-   * Entries which are empty will be removed.  Entries which lack a package will
-   * be given the default package.
-   *
-   * @param classNamesStr     A semicolon-separated string containing a list
-   *                            of class names.
-   * @return                  A list of class names.
-   */
-  private List<String> getClassNamesFromConf(String classNamesStr) {
-    String classNames[] = classNamesStr.split(";");
-    LinkedList<String> cleanedClassNames = new LinkedList<String>();
-    for (String className : classNames) {
-      String cleanedClassName = className.trim();
-      if (!cleanedClassName.isEmpty()) {
-        cleanedClassNames.add(cleanedClassName);
-      }
-    }
-    return cleanedClassNames;
-  }
-
-  public Tracer build() {
-    if (name == null) {
-      throw new RuntimeException("You must specify a name for this Tracer.");
-    }
-    LinkedList<SpanReceiver> spanReceivers = new LinkedList<SpanReceiver>();
-    LinkedList<Sampler> samplers = new LinkedList<Sampler>();
-    loadSamplers(samplers);
-    String tracerId = new TracerId(conf, name).get();
-    Tracer tracer = new Tracer(tracerId, tracerPool,
-        samplers.toArray(new Sampler[samplers.size()]));
-    tracerPool.addTracer(tracer);
-    loadSpanReceivers();
-    return tracer;
-  }
-}
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java b/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
index e30ea3e..87ae8e9 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
@@ -43,7 +43,7 @@
    */
   @Test
   public void TestClosingOuterScope() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestClosingOuterScopeTracer").
         tracerPool(new TracerPool("TestClosingOuterScope")).
         conf(HTraceConfiguration.
@@ -69,7 +69,7 @@
    */
   @Test
   public void TestDoubleDetachIsCaught() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestDoubleDetach").
         tracerPool(new TracerPool("TestDoubleDetachIsCaught")).
         conf(HTraceConfiguration.
@@ -94,7 +94,7 @@
    */
   @Test
   public void TestDoubleDetachOnNullScope() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestDoubleDetachOnNullScope").
         tracerPool(new TracerPool("TestDoubleDetachOnNullScope")).
         conf(HTraceConfiguration.
@@ -119,7 +119,7 @@
    */
   @Test
   public void TestDoubleReattachIsCaught() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestDoubleReattach").
         tracerPool(new TracerPool("TestDoubleReattachIsCaught")).
         conf(HTraceConfiguration.
@@ -153,7 +153,7 @@
    */
   @Test
   public void TestPassingSpanBetweenThreads() throws Exception {
-    final Tracer tracer = new TracerBuilder().
+    final Tracer tracer = new Tracer.Builder().
         name("TestPassingSpanBetweenThreads").
         tracerPool(new TracerPool("TestPassingSpanBetweenThreads")).
         conf(HTraceConfiguration.
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java b/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
index 1771407..06ca189 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
@@ -28,7 +28,7 @@
 public class TestHTrace {
   @Test
   public void TestTracerCreateAndClose() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestSimpleScope").
         tracerPool(new TracerPool("TestTracerCreateAndClose")).
         conf(HTraceConfiguration.fromKeyValuePairs(
@@ -43,7 +43,7 @@
 
   @Test
   public void TestSimpleScope() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestSimpleScope").
         tracerPool(new TracerPool("TestSimpleScope")).
         conf(HTraceConfiguration.fromKeyValuePairs(
@@ -62,7 +62,7 @@
 
   @Test
   public void TestCreateSpans() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("TestCreateSpans").
         tracerPool(new TracerPool("TestCreateSpans")).
         conf(HTraceConfiguration.fromKeyValuePairs(
@@ -113,7 +113,7 @@
 
   @Test(timeout=60000)
   public void testRootSpansHaveNonZeroSpanId() throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("testRootSpansHaveNonZeroSpanId").
         tracerPool(new TracerPool("testRootSpansHaveNonZeroSpanId")).
         conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java b/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
index b4a579b..9388707 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
@@ -44,7 +44,7 @@
   @Test
   public void testWriteToLocalFile() throws IOException {
     String traceFileName = LocalFileSpanReceiver.getUniqueLocalTraceFileName();
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("testWriteToLocalFileTracer").
         tracerPool(new TracerPool("testWriteToLocalFile")).
         conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java b/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
index 592ce79..c8ed7f1 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
@@ -32,7 +32,7 @@
 
   @Test
   public void testNullScope() {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("testNullScope").
         tracerPool(new TracerPool("testNullScope")).
         conf(HTraceConfiguration.EMPTY).
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java b/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
index aa57d2c..2305d9f 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
@@ -25,7 +25,7 @@
 
 public class TestSampler {
   private Sampler[] getSamplersFromConf(HTraceConfiguration conf) {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("MyTracer").
         tracerPool(new TracerPool("getSamplersFromConf")).
         conf(conf).
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java b/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
index e0ce2ac..b97d624 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
@@ -32,7 +32,7 @@
       LogFactory.getLog(TestSpanReceiverBuilder.class);
 
   private List<SpanReceiver> createSpanReceivers(String classes) {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("MyTracer").
         tracerPool(new TracerPool("createSpanReceivers")).
         conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java b/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
index 6cdab2e..eaa5f08 100644
--- a/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
+++ b/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
@@ -25,7 +25,6 @@
 import org.apache.htrace.core.TraceCreator;
 import org.apache.htrace.core.TraceScope;
 import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
 import org.apache.htrace.core.TracerPool;
 
 import org.junit.Assert;
@@ -39,7 +38,7 @@
   public FakeFlume flumeServer = new FakeFlume();
 
   private Tracer newTracer() {
-    return new TracerBuilder().
+    return new Tracer.Builder().
         name("FlumeTracer").
         tracerPool(new TracerPool("newTracer")).
         conf(HTraceConfiguration.fromKeyValuePairs(
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 85de849..aa471ab 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
@@ -48,7 +48,6 @@
 import org.apache.htrace.core.TimelineAnnotation;
 import org.apache.htrace.core.TraceScope;
 import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
 import org.apache.htrace.protobuf.generated.SpanProtos;
 
 /**
@@ -348,7 +347,7 @@
    * @throws IOException
    */
   public static void main(String[] args) throws Exception {
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         conf(new HBaseHTraceConfiguration(HBaseConfiguration.create())).
         build();
     tracer.addSampler(Sampler.ALWAYS);
diff --git a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
index 253a873..bba19f5 100644
--- a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
+++ b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
@@ -47,7 +47,6 @@
 import org.apache.htrace.core.TraceGraph;
 import org.apache.htrace.core.TraceGraph.SpansByParent;
 import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
 import org.apache.htrace.core.TracerPool;
 import org.apache.htrace.protobuf.generated.SpanProtos;
 import org.junit.AfterClass;
@@ -87,7 +86,7 @@
   public void testHBaseSpanReceiver() {
     Table htable = createTable(UTIL);
     Configuration conf = UTIL.getConfiguration();
-    Tracer tracer = new TracerBuilder().
+    Tracer tracer = new Tracer.Builder().
         name("testHBaseSpanReceiver").
         tracerPool(new TracerPool("testHBaseSpanReceiver")).
         conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/src/main/site/markdown/index.md b/src/main/site/markdown/index.md
index e8e88fc..9207690 100644
--- a/src/main/site/markdown/index.md
+++ b/src/main/site/markdown/index.md
@@ -53,13 +53,13 @@
 To instrument your system you must:
 
 <b>1. Create a Tracer object.</b>
-You can create a Tracer object via the TracerBuilder.
+You can create a Tracer object via the Tracer#Builder.
 
 ````java
-    Tracer tracer = new TracerBuilder(conf).setName("MyApp").build();
+    Tracer tracer = new Tracer#Builder(conf).setName("MyApp").build();
 ...
 
-The TracerBuilder will take care of creating the appropriate Sampler and
+The Tracer#Builder will take care of creating the appropriate Sampler and
 SpanReceiver objects, as well as the Tracer itself.   If a SpanReceiver was
 created, we will install a shutdown hook to close it when the JVM shuts down.