From ccfcecf8fe35bf68a74f7d1242397a8574d59826 Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:38:07 -0500 Subject: [PATCH] Promote getAll to TextMapGetter stable API (#7267) --- .../propagation/W3CBaggagePropagator.java | 27 ++-------------- .../propagation/W3CBaggagePropagatorTest.java | 5 ++- .../context/propagation/TextMapGetter.java | 21 +++++++++++++ .../internal/ExtendedTextMapGetter.java | 31 +++---------------- ...GetterTest.java => TextMapGetterTest.java} | 9 +++--- .../opentelemetry-context.txt | 5 ++- 6 files changed, 38 insertions(+), 60 deletions(-) rename context/src/test/java/io/opentelemetry/context/propagation/{internal/ExtendedTextMapGetterTest.java => TextMapGetterTest.java} (88%) diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java index e03f8e9078..d5589f7fd5 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java @@ -16,7 +16,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.context.propagation.TextMapSetter; -import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -97,33 +96,11 @@ public final class W3CBaggagePropagator implements TextMapPropagator { return context; } - if (getter instanceof ExtendedTextMapGetter) { - return extractMulti(context, carrier, (ExtendedTextMapGetter) getter); - } - return extractSingle(context, carrier, getter); - } - - private static Context extractSingle( - Context context, @Nullable C carrier, TextMapGetter getter) { - String baggageHeader = getter.get(carrier, FIELD); - if (baggageHeader == null) { - return context; - } - if (baggageHeader.isEmpty()) { - return context; - } - - BaggageBuilder baggageBuilder = Baggage.builder(); - try { - extractEntries(baggageHeader, baggageBuilder); - } catch (RuntimeException e) { - return context; - } - return context.with(baggageBuilder.build()); + return extractMulti(context, carrier, getter); } private static Context extractMulti( - Context context, @Nullable C carrier, ExtendedTextMapGetter getter) { + Context context, @Nullable C carrier, TextMapGetter getter) { Iterator baggageHeaders = getter.getAll(carrier, FIELD); if (baggageHeaders == null) { return context; diff --git a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java index fb0c342aff..2d1803d7a6 100644 --- a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java @@ -14,7 +14,6 @@ import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.BaggageEntryMetadata; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; -import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -40,8 +39,8 @@ class W3CBaggagePropagatorTest { } }; - private static final ExtendedTextMapGetter>> multiGetter = - new ExtendedTextMapGetter>>() { + private static final TextMapGetter>> multiGetter = + new TextMapGetter>>() { @Override public Iterable keys(Map> carrier) { return carrier.keySet(); diff --git a/context/src/main/java/io/opentelemetry/context/propagation/TextMapGetter.java b/context/src/main/java/io/opentelemetry/context/propagation/TextMapGetter.java index f160b7857a..c435866cd0 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/TextMapGetter.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/TextMapGetter.java @@ -5,6 +5,8 @@ package io.opentelemetry.context.propagation; +import java.util.Collections; +import java.util.Iterator; import javax.annotation.Nullable; /** @@ -33,4 +35,23 @@ public interface TextMapGetter { */ @Nullable String get(@Nullable C carrier, String key); + + /** + * If implemented, returns all values for a given {@code key} in order, or returns an empty list. + * + *

The default method returns the first value of the given propagation {@code key} as a + * singleton list, or returns an empty list. + * + * @param carrier carrier of propagation fields, such as an http request. + * @param key the key of the field. + * @return all values for a given {@code key} in order, or returns an empty list. Default method + * wraps {@code get()} as an {@link Iterator}. + */ + default Iterator getAll(@Nullable C carrier, String key) { + String first = get(carrier, key); + if (first == null) { + return Collections.emptyIterator(); + } + return Collections.singleton(first).iterator(); + } } diff --git a/context/src/main/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetter.java b/context/src/main/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetter.java index d64604757d..22df25b3fa 100644 --- a/context/src/main/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetter.java +++ b/context/src/main/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetter.java @@ -6,39 +6,16 @@ package io.opentelemetry.context.propagation.internal; import io.opentelemetry.context.propagation.TextMapGetter; -import java.util.Collections; -import java.util.Iterator; -import javax.annotation.Nullable; /** - * Extends {@link TextMapGetter} to return possibly multiple values for a given key. + * Extended {@link TextMapGetter} with experimental APIs. * *

This class is internal and experimental. Its APIs are unstable and can change at any time. Its * APIs (or a version of them) may be promoted to the public stable API in the future, but no * guarantees are made. - * - * @param carrier of propagation fields, such as an http request. */ public interface ExtendedTextMapGetter extends TextMapGetter { - /** - * If implemented, returns all values for a given {@code key} in order, or returns an empty list. - * - *

The default method returns the first value of the given propagation {@code key} as a - * singleton list, or returns an empty list. - * - *

This class is internal and is hence not for public use. Its APIs are unstable and can change - * at any time. - * - * @param carrier carrier of propagation fields, such as an http request. - * @param key the key of the field. - * @return all values for a given {@code key} in order, or returns an empty list. Default method - * wraps {@code get()} as an {@link Iterator}. - */ - default Iterator getAll(@Nullable C carrier, String key) { - String first = get(carrier, key); - if (first == null) { - return Collections.emptyIterator(); - } - return Collections.singleton(first).iterator(); - } + + // keep this class even if it is empty, since experimental methods may be added in the future. + } diff --git a/context/src/test/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetterTest.java b/context/src/test/java/io/opentelemetry/context/propagation/TextMapGetterTest.java similarity index 88% rename from context/src/test/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetterTest.java rename to context/src/test/java/io/opentelemetry/context/propagation/TextMapGetterTest.java index f8c35ea2ed..851e9b92e8 100644 --- a/context/src/test/java/io/opentelemetry/context/propagation/internal/ExtendedTextMapGetterTest.java +++ b/context/src/test/java/io/opentelemetry/context/propagation/TextMapGetterTest.java @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.context.propagation.internal; +package io.opentelemetry.context.propagation; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import com.google.common.collect.ImmutableList; +import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -15,9 +16,9 @@ import java.util.List; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; -class ExtendedTextMapGetterTest { +class TextMapGetterTest { - final ExtendedTextMapGetter nullGet = + final TextMapGetter nullGet = new ExtendedTextMapGetter() { @Override public Iterable keys(Void carrier) { @@ -31,7 +32,7 @@ class ExtendedTextMapGetterTest { } }; - final ExtendedTextMapGetter nonNullGet = + final TextMapGetter nonNullGet = new ExtendedTextMapGetter() { @Override public Iterable keys(Void carrier) { diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt index 2df2ac2a56..8546589e17 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt @@ -1,2 +1,5 @@ Comparing source compatibility of opentelemetry-context-1.50.0-SNAPSHOT.jar against opentelemetry-context-1.49.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.context.propagation.TextMapGetter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + GENERIC TEMPLATES: === C:java.lang.Object + +++ NEW METHOD: PUBLIC(+) java.util.Iterator getAll(java.lang.Object, java.lang.String)