// Path: api/src/main/java/io/opencensus/trace/unsafe/ContextHandleUtils.java
// public class ContextHandleUtils {
// 
//   // No instance of this class.
//   private ContextHandleUtils() {}
// 
//   private static final Logger LOGGER = Logger.getLogger(ContextHandleUtils.class.getName());
//   private static final ContextManager CONTEXT_MANAGER =
//       loadContextManager(ContextManager.class.getClassLoader());
// 
//   private static ContextManager loadContextManager(@Nullable ClassLoader classLoader) {
//     try {
//       return Provider.createInstance(
//           Class.forName(
//               "io.opentelemetry.opencensusshim.OpenTelemetryContextManager",
//               /*initialize=*/ true,
//               classLoader),
//           ContextManager.class);
//     } catch (ClassNotFoundException e) {
//       LOGGER.log(
//           Level.FINE,
//           "Couldn't load full implementation for OpenTelemetry context manager, now loading "
//               + "original implementation.",
//           e);
//     }
//     return new ContextManagerImpl();
//   }
// 
//   public static ContextHandle currentContext() {
//     return CONTEXT_MANAGER.currentContext();
//   }
// 
//   /**
//    * Creates a new {@code ContextHandle} with the given value set.
//    *
//    * @param context the parent {@code ContextHandle}.
//    * @param span the value to be set.
//    * @return a new context with the given value set.
//    */
//   public static ContextHandle withValue(
//       ContextHandle context, @javax.annotation.Nullable Span span) {
//     return CONTEXT_MANAGER.withValue(context, span);
//   }
// 
//   /**
//    * Returns the value from the specified {@code ContextHandle}.
//    *
//    * @param context the specified {@code ContextHandle}.
//    * @return the value from the specified {@code ContextHandle}.
//    */
//   public static Span getValue(ContextHandle context) {
//     return CONTEXT_MANAGER.getValue(context);
//   }
// 
//   /**
//    * Attempts to pull the {@link io.grpc.Context} out of an OpenCensus {@code ContextHandle}.
//    *
//    * @return The context, or null if not a GRPC backed context handle.
//    */
//   @Nullable
//   public static Context tryExtractGrpcContext(ContextHandle handle) {
//     if (handle instanceof ContextHandleImpl) {
//       return ((ContextHandleImpl) handle).getContext();
//     }
//     // TODO: see if we can do something for the OpenTelemetry shim.
//     return null;
//   }
// }


import io.opencensus.common.Scope;
import io.opencensus.trace.unsafe.ContextHandleUtils;
import java.util.concurrent.Callable;
import javax.annotation.Nullable;
  }

  private static final class RunnableInSpan implements Runnable {

    // TODO(bdrutu): Investigate if the extra private visibility increases the generated bytecode.
    private final Span span;
    private final Runnable runnable;
    private final boolean endSpan;

    private RunnableInSpan(Span span, Runnable runnable, boolean endSpan) {
      this.span = span;
      this.runnable = runnable;
      this.endSpan = endSpan;
    }

    @Override
    public void run() {
      ContextHandle origContext =
          ContextHandleUtils.withValue(ContextHandleUtils.currentContext(), span).attach();
      try {
        runnable.run();
      } catch (Throwable t) {
        setErrorStatus(span, t);
        if (t instanceof RuntimeException) {
          throw (RuntimeException) t;
        } else if (t instanceof Error) {
          throw (Error) t;
        }
        throw new RuntimeException("unexpected", t);
      } finally {
// Path: api/src/main/java/io/opencensus/trace/unsafe/ContextHandleUtils.java
// public class ContextHandleUtils {
// 
//   // No instance of this class.
//   private ContextHandleUtils() {}
// 
//   private static final Logger LOGGER = Logger.getLogger(ContextHandleUtils.class.getName());
//   private static final ContextManager CONTEXT_MANAGER =
//       loadContextManager(ContextManager.class.getClassLoader());
// 
//   private static ContextManager loadContextManager(@Nullable ClassLoader classLoader) {
//     try {
//       return Provider.createInstance(
//           Class.forName(
//               "io.opentelemetry.opencensusshim.OpenTelemetryContextManager",
//               /*initialize=*/ true,
//               classLoader),
//           ContextManager.class);
//     } catch (ClassNotFoundException e) {
//       LOGGER.log(
//           Level.FINE,
//           "Couldn't load full implementation for OpenTelemetry context manager, now loading "
//               + "original implementation.",
//           e);
//     }
//     return new ContextManagerImpl();
//   }
// 
//   public static ContextHandle currentContext() {
//     return CONTEXT_MANAGER.currentContext();
//   }
// 
//   /**
//    * Creates a new {@code ContextHandle} with the given value set.
//    *
//    * @param context the parent {@code ContextHandle}.
//    * @param span the value to be set.
//    * @return a new context with the given value set.
//    */
//   public static ContextHandle withValue(
//       ContextHandle context, @javax.annotation.Nullable Span span) {
//     return CONTEXT_MANAGER.withValue(context, span);
//   }
// 
//   /**
//    * Returns the value from the specified {@code ContextHandle}.
//    *
//    * @param context the specified {@code ContextHandle}.
//    * @return the value from the specified {@code ContextHandle}.
//    */
//   public static Span getValue(ContextHandle context) {
//     return CONTEXT_MANAGER.getValue(context);
//   }
// 
//   /**
//    * Attempts to pull the {@link io.grpc.Context} out of an OpenCensus {@code ContextHandle}.
//    *
//    * @return The context, or null if not a GRPC backed context handle.
//    */
//   @Nullable
//   public static Context tryExtractGrpcContext(ContextHandle handle) {
//     if (handle instanceof ContextHandleImpl) {
//       return ((ContextHandleImpl) handle).getContext();
//     }
//     // TODO: see if we can do something for the OpenTelemetry shim.
//     return null;
//   }
// }


// Path: api/src/main/java/io/opencensus/trace/CurrentSpanUtils.java
import io.opencensus.common.Scope;
import io.opencensus.trace.unsafe.ContextHandleUtils;
import java.util.concurrent.Callable;
import javax.annotation.Nullable;

  }

  private static final class RunnableInSpan implements Runnable {

    // TODO(bdrutu): Investigate if the extra private visibility increases the generated bytecode.
    private final Span span;
    private final Runnable runnable;
    private final boolean endSpan;

    private RunnableInSpan(Span span, Runnable runnable, boolean endSpan) {
      this.span = span;
      this.runnable = runnable;
      this.endSpan = endSpan;
    }

    @Override
    public void run() {
      ContextHandle origContext =
          ContextHandleUtils.withValue(ContextHandleUtils.currentContext(), span).attach();
      try {
        runnable.run();
      } catch (Throwable t) {
        setErrorStatus(span, t);
        if (t instanceof RuntimeException) {
          throw (RuntimeException) t;
        } else if (t instanceof Error) {
          throw (Error) t;
        }
        throw new RuntimeException("unexpected", t);
      } finally {
        ContextHandleUtils.currentContext().detach(origContext);