Remove log4j and its references from opencensus am: 8fd12cb94e am: 1109620313 am: 1a0247bd40 am: ef47135fc4

Original change: https://android-review.googlesource.com/c/platform/external/opencensus-java/+/1927168

Change-Id: I04aed30b35d36a3bdef9c01125175f53b7199297
diff --git a/all/build.gradle b/all/build.gradle
index 83ffb69..d46f2f6 100644
--- a/all/build.gradle
+++ b/all/build.gradle
@@ -13,7 +13,6 @@
         project(':opencensus-contrib-grpc-util'),
         project(':opencensus-contrib-grpc-metrics'),
         project(':opencensus-contrib-http-util'),
-        project(':opencensus-contrib-log-correlation-log4j2'),
         project(':opencensus-contrib-log-correlation-stackdriver'),
         project(':opencensus-contrib-monitored-resource-util'),
         project(':opencensus-contrib-spring'),
@@ -40,7 +39,6 @@
         project(':opencensus-contrib-grpc-util'),
         project(':opencensus-contrib-grpc-metrics'),
         project(':opencensus-contrib-http-util'),
-        project(':opencensus-contrib-log-correlation-log4j2'),
         project(':opencensus-contrib-log-correlation-stackdriver'),
         project(':opencensus-contrib-monitored-resource-util'),
         project(':opencensus-contrib-spring'),
diff --git a/build.gradle b/build.gradle
index dcb006c..0775167 100644
--- a/build.gradle
+++ b/build.gradle
@@ -158,7 +158,6 @@
         googleAuthVersion = '0.11.0'
         googleCloudBetaVersion = '0.64.0-beta'
         googleCloudGaVersion = '1.46.0'
-        log4j2Version = '2.11.1'
         signalfxVersion = '0.0.39'
         springBootVersion = '1.5.15.RELEASE'
         springCloudVersion = '1.3.4.RELEASE'
@@ -183,7 +182,6 @@
                 google_auth: "com.google.auth:google-auth-library-credentials:${googleAuthVersion}",
                 google_cloud_logging: "com.google.cloud:google-cloud-logging:${googleCloudGaVersion}",
                 google_cloud_trace: "com.google.cloud:google-cloud-trace:${googleCloudBetaVersion}",
-                log4j2: "org.apache.logging.log4j:log4j-core:${log4j2Version}",
                 zipkin_reporter: "io.zipkin.reporter2:zipkin-reporter:${zipkinReporterVersion}",
                 zipkin_urlconnection: "io.zipkin.reporter2:zipkin-sender-urlconnection:${zipkinReporterVersion}",
                 jaeger_reporter: "com.uber.jaeger:jaeger-core:${jaegerReporterVersion}",
@@ -425,7 +423,6 @@
                  'opencensus-contrib-grpc-metrics',
                  'opencensus-contrib-grpc-util',
                  'opencensus-contrib-http-util',
-                 'opencensus-contrib-log-correlation-log4j2',
                  'opencensus-contrib-log-correlation-stackdriver',
                  'opencensus-contrib-monitored-resource-util',
                  'opencensus-contrib-spring',
diff --git a/buildscripts/import-control.xml b/buildscripts/import-control.xml
index d545878..6dffe25 100644
--- a/buildscripts/import-control.xml
+++ b/buildscripts/import-control.xml
@@ -94,12 +94,6 @@
       <allow pkg="io.opencensus.tags"/>
       <allow pkg="io.opencensus.trace"/>
     </subpackage>
-    <subpackage name="logcorrelation.log4j2">
-      <allow pkg="io.opencensus.contrib.logcorrelation.log4j2"/>
-      <allow pkg="io.opencensus.trace"/>
-      <disallow pkg="org.apache.logging.log4j.core.impl"/>
-      <allow pkg="org.apache.logging.log4j"/>
-    </subpackage>
     <subpackage name="logcorrelation.stackdriver">
       <allow pkg="com.google.cloud"/>
       <allow pkg="io.opencensus.trace"/>
diff --git a/checker-framework/stubs/log4j.astub b/checker-framework/stubs/log4j.astub
deleted file mode 100644
index 20b3240..0000000
--- a/checker-framework/stubs/log4j.astub
+++ /dev/null
@@ -1,8 +0,0 @@
-import org.checkerframework.checker.nullness.qual.Nullable;
-
-package org.apache.logging.log4j;
-
-class ThreadContext {
-  @Nullable
-  static ReadOnlyThreadContextMap getThreadContextMap();
-}
diff --git a/contrib/log_correlation/log4j2/README.md b/contrib/log_correlation/log4j2/README.md
deleted file mode 100644
index a5bf144..0000000
--- a/contrib/log_correlation/log4j2/README.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# OpenCensus Log4j 2 Log Correlation
-
-This subproject is currently experimental, so it may be redesigned or removed in the future.  It
-will remain experimental until we have a specification for a log correlation feature in
-[opencensus-specs](https://github.com/census-instrumentation/opencensus-specs/)
-(issue [#123](https://github.com/census-instrumentation/opencensus-specs/issues/123)).
-
-The `opencensus-contrib-log-correlation-log4j2` artifact provides a
-[Log4j 2](https://logging.apache.org/log4j/2.x/)
-[`ContextDataInjector`](https://logging.apache.org/log4j/2.x/manual/extending.html#Custom_ContextDataInjector)
-that automatically adds tracing data to the context of Log4j
-[`LogEvent`](https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/LogEvent.html)s.
-The class name is
-`OpenCensusTraceContextDataInjector`. `OpenCensusTraceContextDataInjector` adds the current trace
-ID, span ID, and sampling decision to each `LogEvent`, so that they can be accessed with
-[`LogEvent.getContextData()`](https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/LogEvent.html#getContextData())
-or included in a layout.
-
-See
-https://github.com/census-ecosystem/opencensus-experiments/tree/master/java/log_correlation/log4j2
-for a demo that uses this library to correlate logs and traces in Stackdriver.
-
-## Instructions
-
-### Add the dependencies to your project
-
-For Maven add to your `pom.xml`:
-```xml
-<dependencies>
-  <dependency>
-    <groupId>io.opencensus</groupId>
-    <artifactId>opencensus-contrib-log-correlation-log4j2</artifactId>
-    <version>0.16.1</version>
-    <scope>runtime</scope>
-  </dependency>
-</dependencies>
-```
-
-For Gradle add to your dependencies:
-```groovy
-runtime 'io.opencensus:opencensus-contrib-log-correlation-log4j2:0.16.1'
-```
-
-### Configure the `OpenCensusTraceContextDataInjector`
-
-#### Specify the `ContextDataInjector` override
-
-Override Log4j's default `ContextDataInjector` by setting the system property
-`log4j2.contextDataInjector` to the full name of the class,
-`io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector`.
-
-#### Choose when to add tracing data to log events
-
-The following system property controls the decision to add tracing data from the current span to a
-log event:
-
-`io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.spanSelection`
-
-The allowed values are:
-
-* `ALL_SPANS`: adds tracing data to all log events (default)
-
-* `NO_SPANS`: disables the log correlation feature
-
-* `SAMPLED_SPANS`: adds tracing data to log events when the current span is sampled
-
-### Add the tracing data to log entries
-
-`opencensus-contrib-log-correlation-log4j2` adds the following key-value pairs to the `LogEvent`
-context:
-
-* `opencensusTraceId` - the lowercase base16 encoding of the current trace ID
-* `opencensusSpanId` - the lowercase base16 encoding of the current span ID
-* `opencensusTraceSampled` - the sampling decision of the current span ("true" or "false")
-
-These values can be accessed from layouts with
-[Context Map Lookup](http://logging.apache.org/log4j/2.x/manual/lookups.html#ContextMapLookup).  For
-example, the trace ID can be accessed with `$${ctx:opencensusTraceId}`.  The values can also be
-accessed with the `X` conversion character in
-[`PatternLayout`](http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout), for
-example, `%X{opencensusTraceId}`.
-
-See an example Log4j configuration file in the demo:
-https://github.com/census-ecosystem/opencensus-experiments/tree/master/java/log_correlation/log4j2/src/main/resources/log4j2.xml
-
-### Java Versions
-
-Java 6 or above is required for using this artifact.
diff --git a/contrib/log_correlation/log4j2/build.gradle b/contrib/log_correlation/log4j2/build.gradle
deleted file mode 100644
index 4a4a6eb..0000000
--- a/contrib/log_correlation/log4j2/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-description = 'OpenCensus Log4j 2 Log Correlation'
-
-apply plugin: 'java'
-
-dependencies {
-    compile project(':opencensus-api'),
-            libraries.log4j2
-
-    testCompile libraries.guava
-
-    signature "org.codehaus.mojo.signature:java16:+@signature"
-}
-
-compileTestJava {
-    sourceCompatibility = "1.7"
-    targetCompatibility = "1.7"
-}
-
-test {
-    systemProperties['log4j2.contextDataInjector'] =
-        'io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector'
-
-    // Each test class should run in a separate JVM. See the comment in
-    // AbstractOpenCensusLog4jLogCorrelationTest.
-    forkEvery = 1
-}
diff --git a/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/ContextDataUtils.java b/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/ContextDataUtils.java
deleted file mode 100644
index dd32e44..0000000
--- a/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/ContextDataUtils.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.Span;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.unsafe.ContextUtils;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.Immutable;
-import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
-import org.apache.logging.log4j.util.BiConsumer;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.util.TriConsumer;
-
-// Implementation of the methods inherited from ContextDataInjector.
-//
-// This class uses "shareable" to mean that a method's return value can be passed to another
-// thread.
-final class ContextDataUtils {
-  private ContextDataUtils() {}
-
-  // The implementation of this method is based on the example in the Javadocs for
-  // ContextDataInjector.injectContextData.
-  static StringMap injectContextData(
-      SpanSelection spanSelection, @Nullable List<Property> properties, StringMap reusable) {
-    if (properties == null || properties.isEmpty()) {
-      return shareableRawContextData(spanSelection);
-    }
-    // Context data has precedence over configuration properties.
-    putProperties(properties, reusable);
-    // TODO(sebright): The following line can be optimized. See
-    //     https://github.com/census-instrumentation/opencensus-java/pull/1422/files#r216425494.
-    reusable.putAll(nonShareableRawContextData(spanSelection));
-    return reusable;
-  }
-
-  private static void putProperties(Collection<Property> properties, StringMap stringMap) {
-    for (Property property : properties) {
-      stringMap.putValue(property.getName(), property.getValue());
-    }
-  }
-
-  private static StringMap shareableRawContextData(SpanSelection spanSelection) {
-    SpanContext spanContext = shouldAddTracingDataToLogEvent(spanSelection);
-    return spanContext == null
-        ? getShareableContextData()
-        : getShareableContextAndTracingData(spanContext);
-  }
-
-  static ReadOnlyStringMap nonShareableRawContextData(SpanSelection spanSelection) {
-    SpanContext spanContext = shouldAddTracingDataToLogEvent(spanSelection);
-    return spanContext == null
-        ? getNonShareableContextData()
-        : getShareableContextAndTracingData(spanContext);
-  }
-
-  // This method returns the current span context iff tracing data should be added to the LogEvent.
-  // It avoids getting the current span when the feature is disabled, for efficiency.
-  @Nullable
-  private static SpanContext shouldAddTracingDataToLogEvent(SpanSelection spanSelection) {
-    switch (spanSelection) {
-      case NO_SPANS:
-        return null;
-      case SAMPLED_SPANS:
-        SpanContext spanContext = getCurrentSpanContext();
-        if (spanContext.getTraceOptions().isSampled()) {
-          return spanContext;
-        } else {
-          return null;
-        }
-      case ALL_SPANS:
-        return getCurrentSpanContext();
-    }
-    throw new AssertionError("Unknown spanSelection: " + spanSelection);
-  }
-
-  private static StringMap getShareableContextData() {
-    ReadOnlyThreadContextMap context = ThreadContext.getThreadContextMap();
-
-    // Return a new object, since StringMap is modifiable.
-    return context == null
-        ? new SortedArrayStringMap(ThreadContext.getImmutableContext())
-        : new SortedArrayStringMap(context.getReadOnlyContextData());
-  }
-
-  private static ReadOnlyStringMap getNonShareableContextData() {
-    ReadOnlyThreadContextMap context = ThreadContext.getThreadContextMap();
-    if (context != null) {
-      return context.getReadOnlyContextData();
-    } else {
-      Map<String, String> contextMap = ThreadContext.getImmutableContext();
-      return contextMap.isEmpty()
-          ? UnmodifiableReadOnlyStringMap.EMPTY
-          : new UnmodifiableReadOnlyStringMap(contextMap);
-    }
-  }
-
-  private static StringMap getShareableContextAndTracingData(SpanContext spanContext) {
-    ReadOnlyThreadContextMap context = ThreadContext.getThreadContextMap();
-    SortedArrayStringMap stringMap;
-    if (context == null) {
-      stringMap = new SortedArrayStringMap(ThreadContext.getImmutableContext());
-    } else {
-      StringMap contextData = context.getReadOnlyContextData();
-      stringMap = new SortedArrayStringMap(contextData.size() + 3);
-      stringMap.putAll(contextData);
-    }
-    // TODO(sebright): Move the calls to TraceId.toLowerBase16() and SpanId.toLowerBase16() out of
-    // the critical path by wrapping the trace and span IDs in objects that call toLowerBase16() in
-    // their toString() methods, after there is a fix for
-    // https://github.com/census-instrumentation/opencensus-java/issues/1436.
-    stringMap.putValue(
-        OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY,
-        spanContext.getTraceId().toLowerBase16());
-    stringMap.putValue(
-        OpenCensusTraceContextDataInjector.SPAN_ID_CONTEXT_KEY,
-        spanContext.getSpanId().toLowerBase16());
-    stringMap.putValue(
-        OpenCensusTraceContextDataInjector.TRACE_SAMPLED_CONTEXT_KEY,
-        spanContext.getTraceOptions().isSampled() ? "true" : "false");
-    return stringMap;
-  }
-
-  private static SpanContext getCurrentSpanContext() {
-    Span span = ContextUtils.CONTEXT_SPAN_KEY.get();
-    return span == null ? SpanContext.INVALID : span.getContext();
-  }
-
-  @Immutable
-  private static final class UnmodifiableReadOnlyStringMap implements ReadOnlyStringMap {
-    private static final long serialVersionUID = 0L;
-
-    static final ReadOnlyStringMap EMPTY =
-        new UnmodifiableReadOnlyStringMap(Collections.<String, String>emptyMap());
-
-    private final Map<String, String> map;
-
-    UnmodifiableReadOnlyStringMap(Map<String, String> map) {
-      this.map = map;
-    }
-
-    @Override
-    public boolean containsKey(String key) {
-      return map.containsKey(key);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <V> void forEach(BiConsumer<String, ? super V> action) {
-      for (Entry<String, String> entry : map.entrySet()) {
-        action.accept(entry.getKey(), (V) entry.getValue());
-      }
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <V, S> void forEach(TriConsumer<String, ? super V, S> action, S state) {
-      for (Entry<String, String> entry : map.entrySet()) {
-        action.accept(entry.getKey(), (V) entry.getValue(), state);
-      }
-    }
-
-    @Override
-    @Nullable
-    @SuppressWarnings({
-      "unchecked",
-      "TypeParameterUnusedInFormals" // This is an overridden method.
-    })
-    public <V> V getValue(String key) {
-      return (V) map.get(key);
-    }
-
-    @Override
-    public boolean isEmpty() {
-      return map.isEmpty();
-    }
-
-    @Override
-    public int size() {
-      return map.size();
-    }
-
-    @Override
-    public Map<String, String> toMap() {
-      return map;
-    }
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjector.java b/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjector.java
deleted file mode 100644
index 38b1882..0000000
--- a/contrib/log_correlation/log4j2/src/main/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjector.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import io.opencensus.common.ExperimentalApi;
-import java.util.List;
-import javax.annotation.Nullable;
-import org.apache.logging.log4j.core.ContextDataInjector;
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.StringMap;
-
-/**
- * A Log4j {@link ContextDataInjector} that adds OpenCensus tracing data to log events.
- *
- * <p>This class adds the following key-value pairs:
- *
- * <ul>
- *   <li>{@value #TRACE_ID_CONTEXT_KEY} - the lowercase base16 encoding of the current trace ID
- *   <li>{@value #SPAN_ID_CONTEXT_KEY} - the lowercase base16 encoding of the current span ID
- *   <li>{@value #TRACE_SAMPLED_CONTEXT_KEY} - the sampling decision of the current span ({@code
- *       "true"} or {@code "false"})
- * </ul>
- *
- * <p>The tracing data can be accessed with {@link LogEvent#getContextData} or included in a {@link
- * Layout}. For example, the following patterns could be used to include the tracing data with a <a
- * href="https://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Layout">Pattern
- * Layout</a>:
- *
- * <ul>
- *   <li><code>%X{opencensusTraceId}</code>
- *   <li><code>%X{opencensusSpanId}</code>
- *   <li><code>%X{opencensusTraceSampled}</code>
- * </ul>
- *
- * <p>This feature is currently experimental.
- *
- * @since 0.16
- * @see <a
- *     href="https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/ContextDataInjector.html">org.apache.logging.log4j.core.ContextDataInjector</a>
- */
-@ExperimentalApi
-public final class OpenCensusTraceContextDataInjector implements ContextDataInjector {
-  private static final SpanSelection DEFAULT_SPAN_SELECTION = SpanSelection.ALL_SPANS;
-
-  /**
-   * Context key for the current trace ID. The name is {@value}.
-   *
-   * @since 0.16
-   */
-  public static final String TRACE_ID_CONTEXT_KEY = "opencensusTraceId";
-
-  /**
-   * Context key for the current span ID. The name is {@value}.
-   *
-   * @since 0.16
-   */
-  public static final String SPAN_ID_CONTEXT_KEY = "opencensusSpanId";
-
-  /**
-   * Context key for the sampling decision of the current span. The name is {@value}.
-   *
-   * @since 0.16
-   */
-  public static final String TRACE_SAMPLED_CONTEXT_KEY = "opencensusTraceSampled";
-
-  /**
-   * Name of the property that defines the {@link SpanSelection}. The name is {@value}.
-   *
-   * @since 0.16
-   */
-  public static final String SPAN_SELECTION_PROPERTY_NAME =
-      "io.opencensus.contrib.logcorrelation.log4j2."
-          + "OpenCensusTraceContextDataInjector.spanSelection";
-
-  private final SpanSelection spanSelection;
-
-  /**
-   * How to decide whether to add tracing data from the current span to a log entry.
-   *
-   * @since 0.16
-   */
-  public enum SpanSelection {
-
-    /**
-     * Never add tracing data to log entries. This constant disables the log correlation feature.
-     *
-     * @since 0.16
-     */
-    NO_SPANS,
-
-    /**
-     * Add tracing data to a log entry iff the current span is sampled.
-     *
-     * @since 0.16
-     */
-    SAMPLED_SPANS,
-
-    /**
-     * Always add tracing data to log entries, even when the current span is not sampled. This is
-     * the default.
-     *
-     * @since 0.16
-     */
-    ALL_SPANS
-  }
-
-  /**
-   * Returns the {@code SpanSelection} setting for this instance.
-   *
-   * @return the {@code SpanSelection} setting for this instance.
-   * @since 0.16
-   */
-  public SpanSelection getSpanSelection() {
-    return spanSelection;
-  }
-
-  /**
-   * Constructor to be called by Log4j.
-   *
-   * <p>This constructor looks up the {@link SpanSelection} using the system property {@link
-   * #SPAN_SELECTION_PROPERTY_NAME}.
-   *
-   * @since 0.16
-   */
-  public OpenCensusTraceContextDataInjector() {
-    this(lookUpSpanSelectionProperty());
-  }
-
-  // visible for testing
-  OpenCensusTraceContextDataInjector(SpanSelection spanSelection) {
-    this.spanSelection = spanSelection;
-  }
-
-  private static SpanSelection lookUpSpanSelectionProperty() {
-    String spanSelectionProperty = System.getProperty(SPAN_SELECTION_PROPERTY_NAME);
-    return spanSelectionProperty == null || spanSelectionProperty.isEmpty()
-        ? DEFAULT_SPAN_SELECTION
-        : parseSpanSelection(spanSelectionProperty);
-  }
-
-  private static SpanSelection parseSpanSelection(String spanSelection) {
-    try {
-      return SpanSelection.valueOf(spanSelection);
-    } catch (IllegalArgumentException e) {
-      return DEFAULT_SPAN_SELECTION;
-    }
-  }
-
-  // Note that this method must return an object that can be passed to another thread.
-  @Override
-  public StringMap injectContextData(@Nullable List<Property> properties, StringMap reusable) {
-    return ContextDataUtils.injectContextData(spanSelection, properties, reusable);
-  }
-
-  // Note that this method does not need to return an object that can be passed to another thread.
-  @Override
-  public ReadOnlyStringMap rawContextData() {
-    return ContextDataUtils.nonShareableRawContextData(spanSelection);
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/AbstractOpenCensusLog4jLogCorrelationTest.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/AbstractOpenCensusLog4jLogCorrelationTest.java
deleted file mode 100644
index 93ad85e..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/AbstractOpenCensusLog4jLogCorrelationTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import io.opencensus.common.Function;
-import io.opencensus.common.Scope;
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.Tracer;
-import io.opencensus.trace.Tracestate;
-import io.opencensus.trace.Tracing;
-import java.io.StringWriter;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.StringLayout;
-import org.apache.logging.log4j.core.appender.WriterAppender;
-import org.apache.logging.log4j.core.layout.PatternLayout;
-
-/**
- * Superclass for all Log4j log correlation test classes.
- *
- * <p>The tests are split into multiple classes so that each one can be run with a different value
- * for the system property {@link OpenCensusTraceContextDataInjector#SPAN_SELECTION_PROPERTY_NAME}.
- * The property must be set when Log4j initializes a static variable, and running each test class in
- * a separate JVM causes the static variable to be reinitialized.
- */
-abstract class AbstractOpenCensusLog4jLogCorrelationTest {
-  private static final Tracer tracer = Tracing.getTracer();
-
-  static final String TEST_PATTERN =
-      "traceId=%X{opencensusTraceId} spanId=%X{opencensusSpanId} "
-          + "sampled=%X{opencensusTraceSampled} %-5level - %msg";
-
-  static final Tracestate EMPTY_TRACESTATE = Tracestate.builder().build();
-
-  private static Logger logger;
-
-  // This method initializes Log4j after setting the SpanSelection, which means that Log4j
-  // initializes a static variable with a ContextDataInjector that is constructed with the proper
-  // SpanSelection. This method should be called from a @BeforeClass method in each subclass.
-  static void initializeLog4j(SpanSelection spanSelection) {
-    System.setProperty(
-        OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME, spanSelection.toString());
-    logger = (Logger) LogManager.getLogger(AbstractOpenCensusLog4jLogCorrelationTest.class);
-  }
-
-  // Reconfigures Log4j using the given arguments and runs the function with the given SpanContext
-  // in scope.
-  String logWithSpanAndLog4jConfiguration(
-      String log4jPattern, SpanContext spanContext, Function<Logger, Void> loggingFunction) {
-    StringWriter output = new StringWriter();
-    StringLayout layout = PatternLayout.newBuilder().withPattern(log4jPattern).build();
-    Appender appender =
-        WriterAppender.newBuilder()
-            .setTarget(output)
-            .setLayout(layout)
-            .setName("TestAppender")
-            .build();
-    ((LoggerContext) LogManager.getContext(false)).updateLoggers();
-    appender.start();
-    logger.addAppender(appender);
-    logger.setLevel(Level.ALL);
-    try {
-      logWithSpan(spanContext, loggingFunction, logger);
-      return output.toString();
-    } finally {
-      logger.removeAppender(appender);
-    }
-  }
-
-  private static void logWithSpan(
-      SpanContext spanContext, Function<Logger, Void> loggingFunction, Logger logger) {
-    Scope scope = tracer.withSpan(new TestSpan(spanContext));
-    try {
-      loggingFunction.apply(logger);
-    } finally {
-      scope.close();
-    }
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationAllSpansTest.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationAllSpansTest.java
deleted file mode 100644
index 355c9b6..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationAllSpansTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import io.opencensus.common.Function;
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.SpanId;
-import io.opencensus.trace.TraceId;
-import io.opencensus.trace.TraceOptions;
-import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.Logger;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for Log4j log correlation with {@link
- * OpenCensusTraceContextDataInjector#SPAN_SELECTION_PROPERTY_NAME} set to {@link
- * SpanSelection#ALL_SPANS}.
- */
-@RunWith(JUnit4.class)
-public final class OpenCensusLog4jLogCorrelationAllSpansTest
-    extends AbstractOpenCensusLog4jLogCorrelationTest {
-
-  @BeforeClass
-  public static void setUp() {
-    initializeLog4j(SpanSelection.ALL_SPANS);
-  }
-
-  @Test
-  public void addSampledSpanToLogEntryWithAllSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("b9718fe3d82d36fce0e6a1ada1c21db0"),
-                SpanId.fromLowerBase16("75159dde8c503fee"),
-                TraceOptions.builder().setIsSampled(true).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.warn("message #1");
-                return null;
-              }
-            });
-    assertThat(log)
-        .isEqualTo(
-            "traceId=b9718fe3d82d36fce0e6a1ada1c21db0 spanId=75159dde8c503fee "
-                + "sampled=true WARN  - message #1");
-  }
-
-  @Test
-  public void addNonSampledSpanToLogEntryWithAllSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("cd7061dfa9d312cdcc42edab3feab51b"),
-                SpanId.fromLowerBase16("117d42d4c7acd066"),
-                TraceOptions.builder().setIsSampled(false).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.info("message #2");
-                return null;
-              }
-            });
-    assertThat(log)
-        .isEqualTo(
-            "traceId=cd7061dfa9d312cdcc42edab3feab51b spanId=117d42d4c7acd066 sampled=false INFO  "
-                + "- message #2");
-  }
-
-  @Test
-  public void addBlankSpanToLogEntryWithAllSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.INVALID,
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.fatal("message #3");
-                return null;
-              }
-            });
-    assertThat(log)
-        .isEqualTo(
-            "traceId=00000000000000000000000000000000 spanId=0000000000000000 sampled=false FATAL "
-                + "- message #3");
-  }
-
-  @Test
-  public void preserveOtherKeyValuePairs() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            "%X{opencensusTraceId} %X{myTestKey} %-5level - %msg",
-            SpanContext.create(
-                TraceId.fromLowerBase16("c95329bb6b7de41afbc51a231c128f97"),
-                SpanId.fromLowerBase16("bf22ea74d38eddad"),
-                TraceOptions.builder().setIsSampled(true).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                String key = "myTestKey";
-                ThreadContext.put(key, "myTestValue");
-                try {
-                  logger.error("message #4");
-                } finally {
-                  ThreadContext.remove(key);
-                }
-                return null;
-              }
-            });
-    assertThat(log).isEqualTo("c95329bb6b7de41afbc51a231c128f97 myTestValue ERROR - message #4");
-  }
-
-  @Test
-  public void overwriteExistingTracingKey() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("18e4ae44273a0c44e0c9ea4380792c66"),
-                SpanId.fromLowerBase16("199a7e16daa000a7"),
-                TraceOptions.builder().setIsSampled(true).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                ThreadContext.put(
-                    OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY, "existingTraceId");
-                try {
-                  logger.error("message #5");
-                } finally {
-                  ThreadContext.remove(OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY);
-                }
-                return null;
-              }
-            });
-    assertThat(log)
-        .isEqualTo(
-            "traceId=18e4ae44273a0c44e0c9ea4380792c66 spanId=199a7e16daa000a7 "
-                + "sampled=true ERROR - message #5");
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationNoSpansTest.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationNoSpansTest.java
deleted file mode 100644
index 1205924..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationNoSpansTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import io.opencensus.common.Function;
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.SpanId;
-import io.opencensus.trace.TraceId;
-import io.opencensus.trace.TraceOptions;
-import org.apache.logging.log4j.core.Logger;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for Log4j log correlation with {@link
- * OpenCensusTraceContextDataInjector#SPAN_SELECTION_PROPERTY_NAME} set to {@link
- * SpanSelection#NO_SPANS}.
- */
-@RunWith(JUnit4.class)
-public final class OpenCensusLog4jLogCorrelationNoSpansTest
-    extends AbstractOpenCensusLog4jLogCorrelationTest {
-
-  @BeforeClass
-  public static void setUp() {
-    initializeLog4j(SpanSelection.NO_SPANS);
-  }
-
-  @Test
-  public void doNotAddSampledSpanToLogEntryWithNoSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("03d2ada98f6eb8330605a45a88c7e67d"),
-                SpanId.fromLowerBase16("ce5b1cf09fe58bcb"),
-                TraceOptions.builder().setIsSampled(true).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.trace("message #1");
-                return null;
-              }
-            });
-    assertThat(log).isEqualTo("traceId= spanId= sampled= TRACE - message #1");
-  }
-
-  @Test
-  public void doNotAddNonSampledSpanToLogEntryWithNoSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("09664283d189791de5218ffe3be88d54"),
-                SpanId.fromLowerBase16("a7203a50089a4029"),
-                TraceOptions.builder().setIsSampled(false).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.warn("message #2");
-                return null;
-              }
-            });
-    assertThat(log).isEqualTo("traceId= spanId= sampled= WARN  - message #2");
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationSampledSpansTest.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationSampledSpansTest.java
deleted file mode 100644
index bbce413..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusLog4jLogCorrelationSampledSpansTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import io.opencensus.common.Function;
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.SpanId;
-import io.opencensus.trace.TraceId;
-import io.opencensus.trace.TraceOptions;
-import org.apache.logging.log4j.core.Logger;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for Log4j log correlation with {@link
- * OpenCensusTraceContextDataInjector#SPAN_SELECTION_PROPERTY_NAME} set to {@link
- * SpanSelection#SAMPLED_SPANS}.
- */
-@RunWith(JUnit4.class)
-public final class OpenCensusLog4jLogCorrelationSampledSpansTest
-    extends AbstractOpenCensusLog4jLogCorrelationTest {
-
-  @BeforeClass
-  public static void setUp() {
-    initializeLog4j(SpanSelection.SAMPLED_SPANS);
-  }
-
-  @Test
-  public void addSampledSpanToLogEntryWithSampledSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("0af7a7bef890695f1c5e85a8e7290164"),
-                SpanId.fromLowerBase16("d3f07c467ec2fbb2"),
-                TraceOptions.builder().setIsSampled(true).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.error("message #1");
-                return null;
-              }
-            });
-    assertThat(log)
-        .isEqualTo(
-            "traceId=0af7a7bef890695f1c5e85a8e7290164 spanId=d3f07c467ec2fbb2 sampled=true ERROR "
-                + "- message #1");
-  }
-
-  @Test
-  public void doNotAddNonSampledSpanToLogEntryWithSampledSpans() {
-    String log =
-        logWithSpanAndLog4jConfiguration(
-            TEST_PATTERN,
-            SpanContext.create(
-                TraceId.fromLowerBase16("9e09b559ebb8f7f7ed7451aff68cf441"),
-                SpanId.fromLowerBase16("0fc9ef54c50a1816"),
-                TraceOptions.builder().setIsSampled(false).build(),
-                EMPTY_TRACESTATE),
-            new Function<Logger, Void>() {
-              @Override
-              public Void apply(Logger logger) {
-                logger.debug("message #2");
-                return null;
-              }
-            });
-    assertThat(log).isEqualTo("traceId= spanId= sampled= DEBUG - message #2");
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjectorTest.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjectorTest.java
deleted file mode 100644
index 3b70405..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/OpenCensusTraceContextDataInjectorTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Lists;
-import io.opencensus.common.Scope;
-import io.opencensus.contrib.logcorrelation.log4j2.OpenCensusTraceContextDataInjector.SpanSelection;
-import io.opencensus.trace.SpanContext;
-import io.opencensus.trace.SpanId;
-import io.opencensus.trace.TraceId;
-import io.opencensus.trace.TraceOptions;
-import io.opencensus.trace.Tracer;
-import io.opencensus.trace.Tracestate;
-import io.opencensus.trace.Tracing;
-import java.util.Collections;
-import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.StringMap;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link OpenCensusTraceContextDataInjector}. */
-@RunWith(JUnit4.class)
-public final class OpenCensusTraceContextDataInjectorTest {
-  static final Tracestate EMPTY_TRACESTATE = Tracestate.builder().build();
-
-  private final Tracer tracer = Tracing.getTracer();
-
-  @Test
-  @SuppressWarnings("TruthConstantAsserts")
-  public void spanSelectionPropertyName() {
-    assertThat(OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME)
-        .isEqualTo(OpenCensusTraceContextDataInjector.class.getName() + ".spanSelection");
-  }
-
-  @Test
-  public void traceIdKey() {
-    assertThat(OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY)
-        .isEqualTo("opencensusTraceId");
-  }
-
-  @Test
-  public void spanIdKey() {
-    assertThat(OpenCensusTraceContextDataInjector.SPAN_ID_CONTEXT_KEY)
-        .isEqualTo("opencensusSpanId");
-  }
-
-  @Test
-  public void traceSampledKey() {
-    assertThat(OpenCensusTraceContextDataInjector.TRACE_SAMPLED_CONTEXT_KEY)
-        .isEqualTo("opencensusTraceSampled");
-  }
-
-  @Test
-  public void spanSelectionDefaultIsAllSpans() {
-    assertThat(new OpenCensusTraceContextDataInjector().getSpanSelection())
-        .isEqualTo(SpanSelection.ALL_SPANS);
-  }
-
-  @Test
-  public void setSpanSelectionWithSystemProperty() {
-    try {
-      System.setProperty(
-          OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME, "NO_SPANS");
-      assertThat(new OpenCensusTraceContextDataInjector().getSpanSelection())
-          .isEqualTo(SpanSelection.NO_SPANS);
-    } finally {
-      System.clearProperty(OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME);
-    }
-  }
-
-  @Test
-  public void useDefaultValueForInvalidSpanSelection() {
-    try {
-      System.setProperty(
-          OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME,
-          "INVALID_SPAN_SELECTION");
-      assertThat(new OpenCensusTraceContextDataInjector().getSpanSelection())
-          .isEqualTo(SpanSelection.ALL_SPANS);
-    } finally {
-      System.clearProperty(OpenCensusTraceContextDataInjector.SPAN_SELECTION_PROPERTY_NAME);
-    }
-  }
-
-  @Test
-  public void insertConfigurationProperties() {
-    assertThat(
-            new OpenCensusTraceContextDataInjector(SpanSelection.ALL_SPANS)
-                .injectContextData(
-                    Lists.newArrayList(
-                        Property.createProperty("property1", "value1"),
-                        Property.createProperty("property2", "value2")),
-                    new SortedArrayStringMap())
-                .toMap())
-        .containsExactly(
-            "property1",
-            "value1",
-            "property2",
-            "value2",
-            "opencensusTraceId",
-            "00000000000000000000000000000000",
-            "opencensusSpanId",
-            "0000000000000000",
-            "opencensusTraceSampled",
-            "false");
-  }
-
-  @Test
-  public void handleEmptyConfigurationProperties() {
-    assertContainsOnlyDefaultTracingEntries(
-        new OpenCensusTraceContextDataInjector(SpanSelection.ALL_SPANS)
-            .injectContextData(Collections.<Property>emptyList(), new SortedArrayStringMap()));
-  }
-
-  @Test
-  public void handleNullConfigurationProperties() {
-    assertContainsOnlyDefaultTracingEntries(
-        new OpenCensusTraceContextDataInjector(SpanSelection.ALL_SPANS)
-            .injectContextData(null, new SortedArrayStringMap()));
-  }
-
-  private static void assertContainsOnlyDefaultTracingEntries(StringMap stringMap) {
-    assertThat(stringMap.toMap())
-        .containsExactly(
-            "opencensusTraceId",
-            "00000000000000000000000000000000",
-            "opencensusSpanId",
-            "0000000000000000",
-            "opencensusTraceSampled",
-            "false");
-  }
-
-  @Test
-  public void rawContextDataWithTracingData() {
-    OpenCensusTraceContextDataInjector plugin =
-        new OpenCensusTraceContextDataInjector(SpanSelection.ALL_SPANS);
-    SpanContext spanContext =
-        SpanContext.create(
-            TraceId.fromLowerBase16("e17944156660f55b8cae5ce3f45d4a40"),
-            SpanId.fromLowerBase16("fc3d2ba0d283b66a"),
-            TraceOptions.builder().setIsSampled(true).build(),
-            EMPTY_TRACESTATE);
-    Scope scope = tracer.withSpan(new TestSpan(spanContext));
-    try {
-      String key = "myTestKey";
-      ThreadContext.put(key, "myTestValue");
-      try {
-        assertThat(plugin.rawContextData().toMap())
-            .containsExactly(
-                "myTestKey",
-                "myTestValue",
-                "opencensusTraceId",
-                "e17944156660f55b8cae5ce3f45d4a40",
-                "opencensusSpanId",
-                "fc3d2ba0d283b66a",
-                "opencensusTraceSampled",
-                "true");
-      } finally {
-        ThreadContext.remove(key);
-      }
-    } finally {
-      scope.close();
-    }
-  }
-
-  @Test
-  public void rawContextDataWithoutTracingData() {
-    OpenCensusTraceContextDataInjector plugin =
-        new OpenCensusTraceContextDataInjector(SpanSelection.NO_SPANS);
-    SpanContext spanContext =
-        SpanContext.create(
-            TraceId.fromLowerBase16("ea236000f6d387fe7c06c5a6d6458b53"),
-            SpanId.fromLowerBase16("f3b39dbbadb73074"),
-            TraceOptions.builder().setIsSampled(true).build(),
-            EMPTY_TRACESTATE);
-    Scope scope = tracer.withSpan(new TestSpan(spanContext));
-    try {
-      String key = "myTestKey";
-      ThreadContext.put(key, "myTestValue");
-      try {
-        assertThat(plugin.rawContextData().toMap()).containsExactly("myTestKey", "myTestValue");
-      } finally {
-        ThreadContext.remove(key);
-      }
-    } finally {
-      scope.close();
-    }
-  }
-}
diff --git a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/TestSpan.java b/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/TestSpan.java
deleted file mode 100644
index 7af4606..0000000
--- a/contrib/log_correlation/log4j2/src/test/java/io/opencensus/contrib/logcorrelation/log4j2/TestSpan.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2018, OpenCensus Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.opencensus.contrib.logcorrelation.log4j2;
-
-import io.opencensus.trace.Annotation;
-import io.opencensus.trace.AttributeValue;
-import io.opencensus.trace.EndSpanOptions;
-import io.opencensus.trace.Link;
-import io.opencensus.trace.Span;
-import io.opencensus.trace.SpanContext;
-import java.util.EnumSet;
-import java.util.Map;
-
-// Simple test Span that holds a SpanContext. The tests cannot use Span directly, since it is
-// abstract.
-final class TestSpan extends Span {
-  TestSpan(SpanContext context) {
-    super(context, EnumSet.of(Options.RECORD_EVENTS));
-  }
-
-  @Override
-  public void end(EndSpanOptions options) {}
-
-  @Override
-  public void addLink(Link link) {}
-
-  @Override
-  public void addAnnotation(Annotation annotation) {}
-
-  @Override
-  public void addAnnotation(String description, Map<String, AttributeValue> attributes) {}
-}
diff --git a/settings.gradle b/settings.gradle
index 7c224ed..75060d2 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -21,7 +21,6 @@
 include ":opencensus-contrib-grpc-metrics"
 include ":opencensus-contrib-grpc-util"
 include ":opencensus-contrib-http-util"
-include ":opencensus-contrib-log-correlation-log4j2"
 include ":opencensus-contrib-log-correlation-stackdriver"
 include ":opencensus-contrib-monitored-resource-util"
 include ":opencensus-contrib-spring"
@@ -40,8 +39,6 @@
 project(':opencensus-contrib-grpc-metrics').projectDir = "$rootDir/contrib/grpc_metrics" as File
 project(':opencensus-contrib-grpc-util').projectDir = "$rootDir/contrib/grpc_util" as File
 project(':opencensus-contrib-http-util').projectDir = "$rootDir/contrib/http_util" as File
-project(':opencensus-contrib-log-correlation-log4j2').projectDir =
-        "$rootDir/contrib/log_correlation/log4j2" as File
 project(':opencensus-contrib-log-correlation-stackdriver').projectDir =
         "$rootDir/contrib/log_correlation/stackdriver" as File
 project(':opencensus-contrib-monitored-resource-util').projectDir =