Add gradle build support for benchmarks and examples. (#163)

diff --git a/.travis.yml b/.travis.yml
index b8788bd..14a1e19 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -35,9 +35,7 @@
         curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add - ;
         sudo apt-get update ;;
       "GRADLE")
-        mkdir -p $HOME/.gradle ;
-        echo "checkstyle.ignoreFailures=false" >> $HOME/.gradle/gradle.properties ;
-        echo "failOnWarnings=true" >> $HOME/.gradle/gradle.properties ;;
+        mkdir -p $HOME/.gradle ;;
     esac
 
 install:
diff --git a/BUILD b/BUILD
index ac8a72d..a6e0a42 100644
--- a/BUILD
+++ b/BUILD
@@ -644,7 +644,7 @@
 java_binary(
     name = "HttpPropagationUtilBenchmark",
     srcs = [
-        "benchmarks/src/main/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java",
+        "benchmarks/src/jmh/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java",
     ],
     main_class = "com.google.instrumentation.trace.HttpPropagationUtilBenchmark",
     deps = [
diff --git a/benchmarks/README.md b/benchmarks/README.md
new file mode 100644
index 0000000..0aad24c
--- /dev/null
+++ b/benchmarks/README.md
@@ -0,0 +1,8 @@
+Instrumentation Benchmarks
+==============================================
+
+## To run the benchmark type
+
+```
+$ ./gradlew :instrumentation-benchmarks:jmh
+```
\ No newline at end of file
diff --git a/benchmarks/build.gradle b/benchmarks/build.gradle
new file mode 100644
index 0000000..9a81ef3
--- /dev/null
+++ b/benchmarks/build.gradle
@@ -0,0 +1,31 @@
+description = 'Instrumentation: Benchmarks'
+
+buildscript {
+    repositories {
+        jcenter()
+        maven {
+            url "https://plugins.gradle.org/m2/"
+        }
+    }
+    dependencies {
+        classpath "me.champeau.gradle:jmh-gradle-plugin:0.3.1"
+    }
+}
+
+apply plugin: "me.champeau.gradle.jmh"
+
+jmh {
+    jmhVersion = '1.18'
+    warmupIterations = 10
+    iterations = 10
+    fork = 1
+    jvmArgs = "-server -Xms2g -Xmx2g"
+}
+
+dependencies {
+    compile project(':instrumentation-core')
+}
+
+compileJmhJava {
+    options.compilerArgs = compileJava.options.compilerArgs
+}
\ No newline at end of file
diff --git a/benchmarks/src/main/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java b/benchmarks/src/jmh/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java
similarity index 98%
rename from benchmarks/src/main/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java
rename to benchmarks/src/jmh/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java
index 9214bc0..2a40c0d 100644
--- a/benchmarks/src/main/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java
+++ b/benchmarks/src/jmh/java/com/google/instrumentation/trace/HttpPropagationUtilBenchmark.java
@@ -38,8 +38,11 @@
   private SpanContext spanContext;
   private String spanContextStringHttp;
 
+  /**
+   * Setup function for benchmarks.
+   */
   @Setup
-  public void setUp() throws Exception {
+  public void setUp() {
     spanContext = new SpanContext(traceId, spanId, traceOptions);
     spanContextStringHttp = HttpPropagationUtil.toHttpHeaderValue(spanContext);
     spanContextBytes = new byte[16 + 8 + 4];
diff --git a/build.gradle b/build.gradle
index 8005a56..5aea52c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,6 +20,7 @@
     apply plugin: "jacoco"
     // TODO(bdrutu): enable all checks.
     apply plugin: "net.ltgt.errorprone"
+    apply plugin: 'findbugs'
 
     group = "com.google.instrumentation"
     version = "0.4.0-SNAPSHOT" // CURRENT_INSTRUMENTATION_VERSION
@@ -35,9 +36,7 @@
     [compileJava, compileTestJava].each() {
         it.options.compilerArgs += ["-Xlint:all", "-Xlint:-try"]
         it.options.encoding = "UTF-8"
-        if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) {
-            it.options.compilerArgs += ["-Werror"]
-        }
+        it.options.compilerArgs += ["-Werror"]
     }
 
     compileTestJava {
@@ -45,8 +44,6 @@
         options.compilerArgs += ["-Xlint:-serial"]
         // It undeprecates DoubleSubject.isEqualTo(Double).
         options.compilerArgs += ["-Xlint:-deprecation"]
-        sourceCompatibility = 1.7
-        targetCompatibility = 1.7
     }
 
     jar.manifest {
@@ -69,21 +66,24 @@
         grpcContextVersion = '1.1.2'
 
         libraries = [
-                errorprone   : 'com.google.errorprone:error_prone_annotations:2.0.11',
-                grpc_context : "io.grpc:grpc-context:${grpcContextVersion}",
-                guava        : "com.google.guava:guava:${guavaVersion}",
-                jsr305       : 'com.google.code.findbugs:jsr305:3.0.0',
-                protobuf     : "com.google.protobuf:protobuf-java:${protobufVersion}",
+                errorprone     : 'com.google.errorprone:error_prone_annotations:2.0.11',
+                grpc_context   : "io.grpc:grpc-context:${grpcContextVersion}",
+                guava          : "com.google.guava:guava:${guavaVersion}",
+                jsr305         : 'com.google.code.findbugs:jsr305:3.0.0',
+                protobuf       : "com.google.protobuf:protobuf-java:${protobufVersion}",
 
                 // Test dependencies.
-                guava_testlib: "com.google.guava:guava-testlib:${guavaVersion}",
-                junit        : 'junit:junit:4.11',
-                mockito      : 'org.mockito:mockito-core:1.9.5',
-                truth        : 'com.google.truth:truth:0.30',
+                guava_testlib  : "com.google.guava:guava-testlib:${guavaVersion}",
+                junit          : 'junit:junit:4.11',
+                mockito        : 'org.mockito:mockito-core:1.9.5',
+                truth          : 'com.google.truth:truth:0.30',
         ]
     }
 
     dependencies {
+        compile libraries.errorprone,
+                libraries.jsr305
+
         testCompile libraries.guava_testlib,
                 libraries.junit,
                 libraries.mockito,
@@ -94,6 +94,19 @@
         errorprone 'com.google.errorprone:error_prone_core:2.0.19'
     }
 
+    findbugs {
+        toolVersion = '3.0.1'
+        ignoreFailures = false 	        // bug free or it doesn't ship!
+        effort = 'max'
+        reportLevel = 'low'		        // low = sensitive to even minor mistakes
+        omitVisitors = []		        // bugs that we want to ignore
+    }
+    // TODO(bdrutu): Enable this when the proto will generate the builds in build not in
+    // build_gradle.
+    findbugsMain.onlyIf { !name.contains("proto") }
+    // Disable findbugs for tests.
+    findbugsTest.enabled = false
+
     checkstyle {
         configFile = file("$rootDir/checkstyle.xml")
         toolVersion = "7.6"
@@ -108,14 +121,14 @@
         // This skips proto generated files beucasue they are in gen_gradle/src/main/**
         source = fileTree(dir: "src/main", include: "**/*.java")
     }
-    checkstyleMain.onlyIf { !name.contains("proto") && !name.contains("shared")}
+    checkstyleMain.onlyIf { !name.contains("proto") && !name.contains("shared") }
 
     checkstyleTest {
         // TODO(bdrutu): Enable this when we have tests checkstyle clean.
         // source = fileTree(dir: "src/test", include: "**/*.java")
         excludes = ["**"]
     }
-    checkstyleTest.onlyIf { !name.contains("proto") && !name.contains("shared")}
+    checkstyleTest.onlyIf { !name.contains("proto") && !name.contains("shared") }
 
     // At a test failure, log the stack trace to the console so that we don't
     // have to open the HTML in a browser.
diff --git a/core/build.gradle b/core/build.gradle
index 067b34c..765f1de 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -3,9 +3,7 @@
 dependencies {
     compile project(':shared'),
             libraries.grpc_context,
-            libraries.guava,
-            libraries.errorprone,
-            libraries.jsr305
+            libraries.guava
 
     testCompile project(':instrumentation-core-impl'),
             libraries.grpc_context
diff --git a/core_impl/build.gradle b/core_impl/build.gradle
index d79924d..f1e8f48 100644
--- a/core_impl/build.gradle
+++ b/core_impl/build.gradle
@@ -3,7 +3,5 @@
 dependencies {
     compile project(':instrumentation-core'),
             project(':proto'),
-            libraries.guava,
-            libraries.errorprone,
-            libraries.jsr305
+            libraries.guava
 }
diff --git a/examples/build.gradle b/examples/build.gradle
new file mode 100644
index 0000000..8f1cec7
--- /dev/null
+++ b/examples/build.gradle
@@ -0,0 +1,14 @@
+description = 'Instrumentation: Examples'
+
+tasks.withType(JavaCompile) {
+    sourceCompatibility = '1.8'
+    targetCompatibility = '1.8'
+}
+
+dependencies {
+    compile project(':instrumentation-core'),
+            project(':instrumentation-core-impl'),
+            libraries.grpc_context
+}
+
+// TODO(bdrutu): Add application plugin and create jars for each example.
\ No newline at end of file
diff --git a/examples/src/main/java/com/google/instrumentation/stats/StatsRunner.java b/examples/src/main/java/com/google/instrumentation/stats/StatsRunner.java
index 2eb2813..0e1e0c2 100644
--- a/examples/src/main/java/com/google/instrumentation/stats/StatsRunner.java
+++ b/examples/src/main/java/com/google/instrumentation/stats/StatsRunner.java
@@ -18,9 +18,7 @@
 import io.grpc.Context;
 import java.util.Arrays;
 
-/**
- * Simple program that uses Stats contexts.
- */
+/** Simple program that uses Stats contexts. */
 public class StatsRunner {
   private static final TagKey K1 = TagKey.create("k1");
   private static final TagKey K2 = TagKey.create("k2");
@@ -39,6 +37,7 @@
   private static final MeasurementDescriptor M2 =
       MeasurementDescriptor.create("m2", "2nd test metric", simpleMeasurementUnit);
 
+  /** Main method. */
   public static void main(String[] args) {
     System.out.println("Hello Stats World");
     System.out.println("Default Tags: " + DEFAULT);
@@ -46,24 +45,25 @@
     Context context1 = withCurrent(DEFAULT.with(K1, V1, K2, V2));
     Context original = context1.attach();
     try {
-        System.out.println("  Current Tags: " + getCurrentStatsContext());
-        System.out.println("  Current == Default + tags1: "
-            + getCurrentStatsContext().equals(getStatsContext(context1)));
-        Context context2 = withCurrent(getCurrentStatsContext().with(K3, V3, K4, V4));
-        context2.attach();
-        try {
-          System.out.println("    Current Tags: " + getCurrentStatsContext());
-          System.out.println("    Current == Default + tags1 + tags2: "
-              + getCurrentStatsContext().equals(getStatsContext(context2)));
-          getCurrentStatsContext().record(MeasurementMap.of(M1, 0.2, M2, 0.4));
-        } finally {
-          context2.detach(context1);
-        }
+      System.out.println("  Current Tags: " + getCurrentStatsContext());
+      System.out.println(
+          "  Current == Default + tags1: "
+              + getCurrentStatsContext().equals(getStatsContext(context1)));
+      Context context2 = withCurrent(getCurrentStatsContext().with(K3, V3, K4, V4));
+      context2.attach();
+      try {
+        System.out.println("    Current Tags: " + getCurrentStatsContext());
+        System.out.println(
+            "    Current == Default + tags1 + tags2: "
+                + getCurrentStatsContext().equals(getStatsContext(context2)));
+        getCurrentStatsContext().record(MeasurementMap.of(M1, 0.2, M2, 0.4));
+      } finally {
+        context2.detach(context1);
+      }
     } finally {
       context1.detach(original);
     }
-    System.out.println("Current == Default: "
-        + getCurrentStatsContext().equals(DEFAULT));
+    System.out.println("Current == Default: " + getCurrentStatsContext().equals(DEFAULT));
   }
 
   private static final StatsContext DEFAULT = Stats.getStatsContextFactory().getDefault();
diff --git a/examples/src/main/java/com/google/instrumentation/trace/BasicContextTracing.java b/examples/src/main/java/com/google/instrumentation/trace/BasicContextTracing.java
index b3411b6..1b8b995 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/BasicContextTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/BasicContextTracing.java
@@ -28,6 +28,7 @@
     tracer.getCurrentSpan().addAnnotation("This is a doWork() annotation.");
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     Span span = tracer.spanBuilder("MyRootSpan").becomeRoot().startSpan();
     try (NonThrowingCloseable ws = tracer.withSpan(span)) {
diff --git a/examples/src/main/java/com/google/instrumentation/trace/BasicScopedTracing.java b/examples/src/main/java/com/google/instrumentation/trace/BasicScopedTracing.java
index 8987f26..1787982 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/BasicScopedTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/BasicScopedTracing.java
@@ -28,6 +28,7 @@
     tracer.getCurrentSpan().addAnnotation("This is a doWork() annotation.");
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     try (NonThrowingCloseable ss =
         tracer.spanBuilder("MyRootSpan").becomeRoot().startScopedSpan()) {
diff --git a/examples/src/main/java/com/google/instrumentation/trace/BasicTracing.java b/examples/src/main/java/com/google/instrumentation/trace/BasicTracing.java
index bdb5768..daaf911 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/BasicTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/BasicTracing.java
@@ -24,6 +24,7 @@
     span.end();
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     doWork();
   }
diff --git a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansContextTracing.java b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansContextTracing.java
index b5721d3..8b849de 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansContextTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansContextTracing.java
@@ -42,6 +42,7 @@
     tracer.getCurrentSpan().addAnnotation("Annotation to the root Span after child is ended.");
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     Span span = tracer.spanBuilder("MyRootSpan").becomeRoot().startSpan();
     try (NonThrowingCloseable ws = tracer.withSpan(span)) {
diff --git a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansScopedTracing.java b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansScopedTracing.java
index 827fbb6..457f4a1 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansScopedTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansScopedTracing.java
@@ -40,6 +40,7 @@
     tracer.getCurrentSpan().addAnnotation("Annotation to the root Span after child is ended.");
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     try (NonThrowingCloseable ss =
         tracer.spanBuilder("MyRootSpan").becomeRoot().startScopedSpan()) {
diff --git a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansTracing.java b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansTracing.java
index 56d6bfe..fcc7412 100644
--- a/examples/src/main/java/com/google/instrumentation/trace/MultiSpansTracing.java
+++ b/examples/src/main/java/com/google/instrumentation/trace/MultiSpansTracing.java
@@ -28,6 +28,7 @@
     rootSpan.end();
   }
 
+  /** Main method. */
   public static void main(String[] args) {
     doWork();
   }
diff --git a/settings.gradle b/settings.gradle
index ae2bf2e..f9810d1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,12 +1,16 @@
 rootProject.name = "instrumentation"
+include ":instrumentation-all"
+include ":instrumentation-benchmarks"
 include ":instrumentation-core"
 include ":instrumentation-core-impl"
-include ":instrumentation-all"
+include ":instrumentation-examples"
 include ":proto"
 include ":shared"
 
 project(':instrumentation-all').projectDir = "$rootDir/all" as File
+project(':instrumentation-benchmarks').projectDir = "$rootDir/benchmarks" as File
 project(':instrumentation-core').projectDir = "$rootDir/core" as File
 project(':instrumentation-core-impl').projectDir = "$rootDir/core_impl" as File
+project(':instrumentation-examples').projectDir = "$rootDir/examples" as File
 project(':proto').projectDir = "$rootDir/proto" as File
 project(':shared').projectDir = "$rootDir/shared" as File