diff options
13 files changed, 63 insertions, 17 deletions
diff --git a/api/src/main/java/io/opencensus/internal/NullnessUtils.java b/api/src/main/java/io/opencensus/internal/NullnessUtils.java index ca3419cd..0301b798 100644 --- a/api/src/main/java/io/opencensus/internal/NullnessUtils.java +++ b/api/src/main/java/io/opencensus/internal/NullnessUtils.java @@ -17,15 +17,25 @@ package io.opencensus.internal; import io.opencensus.common.Function; +import javax.annotation.Nullable; /*>>> import org.checkerframework.checker.nullness.qual.KeyForBottom; */ -/** Utility methods for working around Checker Framework issues. */ +/** + * Utility methods for suppressing nullness warnings and working around Checker Framework issues. + */ public final class NullnessUtils { private NullnessUtils() {} + /** Suppress warnings about a nullable value. */ + // TODO(sebright): Try to remove all uses of this method. + @SuppressWarnings("nullness") + public static <T> T castNonNull(@Nullable T arg) { + return arg; + } + /** * Work around https://github.com/typetools/checker-framework/issues/1712 by removing {@code ? * super} from a {@code Function}'s argument type. diff --git a/api/src/main/java/io/opencensus/stats/Stats.java b/api/src/main/java/io/opencensus/stats/Stats.java index d02780f8..0830313a 100644 --- a/api/src/main/java/io/opencensus/stats/Stats.java +++ b/api/src/main/java/io/opencensus/stats/Stats.java @@ -17,6 +17,7 @@ package io.opencensus.stats; import com.google.common.annotations.VisibleForTesting; +import io.opencensus.internal.NullnessUtils; import io.opencensus.internal.Provider; import java.util.logging.Level; import java.util.logging.Logger; @@ -26,7 +27,7 @@ public final class Stats { private static final Logger logger = Logger.getLogger(Stats.class.getName()); private static final StatsComponent statsComponent = - loadStatsComponent(StatsComponent.class.getClassLoader()); + loadStatsComponent(NullnessUtils.castNonNull(StatsComponent.class.getClassLoader())); /** Returns the default {@link StatsRecorder}. */ public static StatsRecorder getStatsRecorder() { diff --git a/api/src/main/java/io/opencensus/tags/Tags.java b/api/src/main/java/io/opencensus/tags/Tags.java index 593312ae..f480714d 100644 --- a/api/src/main/java/io/opencensus/tags/Tags.java +++ b/api/src/main/java/io/opencensus/tags/Tags.java @@ -17,6 +17,7 @@ package io.opencensus.tags; import com.google.common.annotations.VisibleForTesting; +import io.opencensus.internal.NullnessUtils; import io.opencensus.internal.Provider; import io.opencensus.tags.propagation.TagPropagationComponent; import java.util.logging.Level; @@ -27,7 +28,7 @@ public final class Tags { private static final Logger logger = Logger.getLogger(Tags.class.getName()); private static final TagsComponent tagsComponent = - loadTagsComponent(TagsComponent.class.getClassLoader()); + loadTagsComponent(NullnessUtils.castNonNull(TagsComponent.class.getClassLoader())); private Tags() {} diff --git a/api/src/main/java/io/opencensus/trace/Tracing.java b/api/src/main/java/io/opencensus/trace/Tracing.java index c68f66ad..8e575265 100644 --- a/api/src/main/java/io/opencensus/trace/Tracing.java +++ b/api/src/main/java/io/opencensus/trace/Tracing.java @@ -18,6 +18,7 @@ package io.opencensus.trace; import com.google.common.annotations.VisibleForTesting; import io.opencensus.common.Clock; +import io.opencensus.internal.NullnessUtils; import io.opencensus.internal.Provider; import io.opencensus.trace.config.TraceConfig; import io.opencensus.trace.export.ExportComponent; @@ -29,7 +30,7 @@ import java.util.logging.Logger; public final class Tracing { private static final Logger logger = Logger.getLogger(Tracing.class.getName()); private static final TraceComponent traceComponent = - loadTraceComponent(TraceComponent.class.getClassLoader()); + loadTraceComponent(NullnessUtils.castNonNull(TraceComponent.class.getClassLoader())); /** * Returns the global {@link Tracer}. diff --git a/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/ContextTrampoline.java b/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/ContextTrampoline.java index dd250790..382a161d 100644 --- a/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/ContextTrampoline.java +++ b/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/ContextTrampoline.java @@ -31,6 +31,8 @@ package io.opencensus.contrib.agent.bootstrap; * <p>{@code ContextTrampoline} is implemented as a static class to allow for easy and fast use from * instrumented bytecode. We cannot use dependency injection for the instrumented bytecode. */ +// TODO(sebright): Fix the Checker Framework warnings. +@SuppressWarnings("nullness") public final class ContextTrampoline { // Not synchronized to avoid any synchronization costs after initialization. diff --git a/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/TraceTrampoline.java b/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/TraceTrampoline.java index 975caf99..b4501b45 100644 --- a/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/TraceTrampoline.java +++ b/contrib/agent/src/main/java/io/opencensus/contrib/agent/bootstrap/TraceTrampoline.java @@ -35,6 +35,8 @@ import javax.annotation.Nullable; * <p>{@code TraceTrampoline} is implemented as a static class to allow for easy and fast use from * instrumented bytecode. We cannot use dependency injection for the instrumented bytecode. */ +// TODO(sebright): Fix the Checker Framework warnings. +@SuppressWarnings("nullness") public final class TraceTrampoline { // Not synchronized to avoid any synchronization costs after initialization. diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TracezZPageHandler.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TracezZPageHandler.java index a1f3545b..7a42c2c7 100644 --- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TracezZPageHandler.java +++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/TracezZPageHandler.java @@ -370,7 +370,7 @@ final class TracezZPageHandler extends ZPageHandler { .escape( event.getEvent() instanceof Annotation ? renderAnnotation((Annotation) event.getEvent()) - : renderNetworkEvents((NetworkEvent) event.getEvent()))); + : renderNetworkEvents((NetworkEvent) castNonNull(event.getEvent())))); lastTimestampNanos = event.getTimestamp(); } @@ -383,6 +383,12 @@ final class TracezZPageHandler extends ZPageHandler { "", htmlEscaper().escape(renderAttributes(span.getAttributes().getAttributeMap()))); } + // TODO(sebright): Remove this method. + @SuppressWarnings("nullness") + private static <T> T castNonNull(@Nullable T arg) { + return arg; + } + // Emits the summary table with links to all samples. private void emitSummaryTable(PrintWriter out, Formatter formatter) throws UnsupportedEncodingException { diff --git a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java index 5f33c1ab..8e9443da 100644 --- a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java +++ b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java @@ -109,7 +109,11 @@ final class ZipkinExporterHandler extends SpanExporter.Handler { static Span generateSpan(SpanData spanData, Endpoint localEndpoint) { SpanContext context = spanData.getContext(); long startTimestamp = toEpochMicros(spanData.getStartTimestamp()); + + // TODO(sebright): Fix the Checker Framework warning. + @SuppressWarnings("nullness") long endTimestamp = toEpochMicros(spanData.getEndTimestamp()); + Span.Builder spanBuilder = Span.newBuilder() .traceId(encodeTraceId(context.getTraceId())) diff --git a/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java b/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java index 8b15c37b..02fa1b4c 100644 --- a/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java +++ b/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java @@ -173,6 +173,8 @@ public final class DisruptorEventQueue implements EventQueue { */ private static final class DisruptorEventHandler implements EventHandler<DisruptorEvent> { @Override + // TODO(sebright): Fix the Checker Framework warning. + @SuppressWarnings("nullness") public void onEvent(DisruptorEvent event, long sequence, boolean endOfBatch) { event.getEntry().process(); } diff --git a/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java b/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java index 04ed8f00..3d2d4d15 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java +++ b/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java @@ -17,15 +17,25 @@ package io.opencensus.implcore.internal; import io.opencensus.common.Function; +import javax.annotation.Nullable; /*>>> import org.checkerframework.checker.nullness.qual.KeyForBottom; */ -/** Utility methods for working around Checker Framework issues. */ +/** + * Utility methods for suppressing nullness warnings and working around Checker Framework issues. + */ public final class NullnessUtils { private NullnessUtils() {} + /** Suppress warnings about a nullable value. */ + // TODO(sebright): Try to remove all uses of this method. + @SuppressWarnings("nullness") + public static <T> T castNonNull(@Nullable T arg) { + return arg; + } + /** * Work around https://github.com/typetools/checker-framework/issues/1712 by removing {@code ? * super} from a {@code Function}'s argument type. diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java index 2c545aff..7d251559 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java +++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java @@ -26,6 +26,7 @@ import io.opencensus.common.Duration; import io.opencensus.common.Function; import io.opencensus.common.Functions; import io.opencensus.common.Timestamp; +import io.opencensus.implcore.internal.NullnessUtils; import io.opencensus.implcore.stats.MutableAggregation.MutableCount; import io.opencensus.implcore.stats.MutableAggregation.MutableDistribution; import io.opencensus.implcore.stats.MutableAggregation.MutableMean; @@ -307,7 +308,7 @@ abstract class MutableViewData { List<TagValue> tagValues = getTagValues(getTagMap(context), super.view.getColumns()); refreshBucketList(timestamp); // It is always the last bucket that does the recording. - buckets.peekLast().record(tagValues, value); + NullnessUtils.castNonNull(buckets.peekLast()).record(tagValues, value); } @Override @@ -345,7 +346,7 @@ abstract class MutableViewData { if (buckets.size() != N + 1) { throw new AssertionError("Bucket list must have exactly " + (N + 1) + " buckets."); } - Timestamp startOfLastBucket = buckets.peekLast().getStart(); + Timestamp startOfLastBucket = NullnessUtils.castNonNull(buckets.peekLast()).getStart(); // TODO(songya): decide what to do when time goes backwards checkArgument( now.compareTo(startOfLastBucket) >= 0, @@ -361,7 +362,8 @@ abstract class MutableViewData { Timestamp startOfNewBucket; if (!buckets.isEmpty()) { - startOfNewBucket = buckets.peekLast().getStart().addDuration(bucketDuration); + startOfNewBucket = + NullnessUtils.castNonNull(buckets.peekLast()).getStart().addDuration(bucketDuration); } else { // Initialize bucket list. Should only enter this block once. startOfNewBucket = subtractDuration(now, totalDuration); @@ -410,8 +412,8 @@ abstract class MutableViewData { Aggregation aggregation, Timestamp now) { // Put fractional stats of the head (oldest) bucket. - IntervalBucket head = buckets.peekFirst(); - IntervalBucket tail = buckets.peekLast(); + IntervalBucket head = NullnessUtils.castNonNull(buckets.peekFirst()); + IntervalBucket tail = NullnessUtils.castNonNull(buckets.peekLast()); double fractionTail = tail.getFraction(now); // TODO(songya): decide what to do when time goes backwards checkArgument( diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java index 9f72aa71..f80ba2bf 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkState; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.EvictingQueue; import io.opencensus.common.Clock; +import io.opencensus.implcore.internal.NullnessUtils; import io.opencensus.implcore.internal.TimestampConverter; import io.opencensus.implcore.trace.internal.ConcurrentIntrusiveList.Element; import io.opencensus.trace.Annotation; @@ -249,14 +250,16 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { parentSpanId, hasRemoteParent, name, - timestampConverter.convertNanoTime(startNanoTime), + NullnessUtils.castNonNull(timestampConverter).convertNanoTime(startNanoTime), attributesSpanData, annotationsSpanData, networkEventsSpanData, linksSpanData, null, // Not supported yet. hasBeenEnded ? getStatusWithDefault() : null, - hasBeenEnded ? timestampConverter.convertNanoTime(endNanoTime) : null); + hasBeenEnded + ? NullnessUtils.castNonNull(timestampConverter).convertNanoTime(endNanoTime) + : null); } } @@ -435,7 +438,8 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { } List<TimedEvent<T>> eventsList = new ArrayList<TimedEvent<T>>(events.events.size()); for (EventWithNanoTime<T> networkEvent : events.events) { - eventsList.add(networkEvent.toSpanDataTimedEvent(timestampConverter)); + eventsList.add( + networkEvent.toSpanDataTimedEvent(NullnessUtils.castNonNull(timestampConverter))); } return SpanData.TimedEvents.create(eventsList, events.getNumberOfDroppedEvents()); } diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java b/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java index 3eb76ae4..5b131756 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java @@ -18,6 +18,7 @@ package io.opencensus.implcore.trace.internal; import static com.google.common.base.Preconditions.checkArgument; +import io.opencensus.implcore.internal.NullnessUtils; import io.opencensus.implcore.trace.internal.ConcurrentIntrusiveList.Element; import java.util.ArrayList; import java.util.Collection; @@ -107,11 +108,11 @@ public final class ConcurrentIntrusiveList<T extends Element<T>> { } else if (element.getNext() == null) { // This is the last element, and there is at least another element because // element.getPrev() != null. - element.getPrev().setNext(null); + NullnessUtils.castNonNull(element.getPrev()).setNext(null); element.setPrev(null); } else { - element.getPrev().setNext(element.getNext()); - element.getNext().setPrev(element.getPrev()); + NullnessUtils.castNonNull(element.getPrev()).setNext(element.getNext()); + NullnessUtils.castNonNull(element.getNext()).setPrev(element.getPrev()); element.setNext(null); element.setPrev(null); } |