Skip to content

Commit db8e4d4

Browse files
committed
refactors the PR so that we have a separate internal ExtendedTextMapGetter, as per review.
Also changes the return type of the method to Iterator<String> as per review, and renames the method to getAll(). Tests are also adjusted
1 parent bb5f97b commit db8e4d4

File tree

4 files changed

+82
-25
lines changed

4 files changed

+82
-25
lines changed

api/all/src/main/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagator.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
import io.opentelemetry.api.internal.PercentEscaper;
1414
import io.opentelemetry.api.internal.StringUtils;
1515
import io.opentelemetry.context.Context;
16+
import io.opentelemetry.context.internal.propagation.ExtendedTextMapGetter;
1617
import io.opentelemetry.context.propagation.TextMapGetter;
1718
import io.opentelemetry.context.propagation.TextMapPropagator;
1819
import io.opentelemetry.context.propagation.TextMapSetter;
1920
import java.util.Collection;
21+
import java.util.Iterator;
2022
import java.util.List;
2123
import javax.annotation.Nullable;
2224

@@ -95,14 +97,43 @@ public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C
9597
return context;
9698
}
9799

98-
List<String> baggageHeaders = getter.getList(carrier, FIELD);
99-
if (baggageHeaders == null || baggageHeaders.isEmpty()) {
100+
if (getter instanceof ExtendedTextMapGetter) {
101+
return extractMulti(context, carrier, (ExtendedTextMapGetter<C>) getter);
102+
}
103+
return extractSingle(context, carrier, getter);
104+
}
105+
106+
private static <C> Context extractSingle(
107+
Context context, @Nullable C carrier, TextMapGetter<C> getter) {
108+
String baggageHeader = getter.get(carrier, FIELD);
109+
if (baggageHeader == null) {
110+
return context;
111+
}
112+
if (baggageHeader.isEmpty()) {
113+
return context;
114+
}
115+
116+
BaggageBuilder baggageBuilder = Baggage.builder();
117+
try {
118+
extractEntries(baggageHeader, baggageBuilder);
119+
} catch (RuntimeException e) {
120+
return context;
121+
}
122+
return context.with(baggageBuilder.build());
123+
}
124+
125+
private static <C> Context extractMulti(
126+
Context context, @Nullable C carrier, ExtendedTextMapGetter<C> getter) {
127+
Iterator<String> baggageHeaders = getter.getAll(carrier, FIELD);
128+
if (baggageHeaders == null) {
100129
return context;
101130
}
102131

103132
boolean extracted = false;
104133
BaggageBuilder baggageBuilder = Baggage.builder();
105-
for (String header : baggageHeaders) {
134+
135+
while (baggageHeaders.hasNext()) {
136+
String header = baggageHeaders.next();
106137
if (header.isEmpty()) {
107138
continue;
108139
}
@@ -114,6 +145,7 @@ public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C
114145
// invalid baggage header, continue
115146
}
116147
}
148+
117149
return extracted ? context.with(baggageBuilder.build()) : context;
118150
}
119151

api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import io.opentelemetry.api.baggage.Baggage;
1414
import io.opentelemetry.api.baggage.BaggageEntryMetadata;
1515
import io.opentelemetry.context.Context;
16+
import io.opentelemetry.context.internal.propagation.ExtendedTextMapGetter;
1617
import io.opentelemetry.context.propagation.TextMapGetter;
1718
import java.util.Collections;
1819
import java.util.HashMap;
20+
import java.util.Iterator;
1921
import java.util.LinkedHashMap;
2022
import java.util.List;
2123
import java.util.Map;
@@ -38,8 +40,8 @@ public String get(Map<String, String> carrier, String key) {
3840
}
3941
};
4042

41-
private static final TextMapGetter<Map<String, List<String>>> multiGetter =
42-
new TextMapGetter<Map<String, List<String>>>() {
43+
private static final ExtendedTextMapGetter<Map<String, List<String>>> multiGetter =
44+
new ExtendedTextMapGetter<Map<String, List<String>>>() {
4345
@Override
4446
public Iterable<String> keys(Map<String, List<String>> carrier) {
4547
return carrier.keySet();
@@ -54,8 +56,9 @@ public String get(Map<String, List<String>> carrier, String key) {
5456
}
5557

5658
@Override
57-
public List<String> getList(Map<String, List<String>> carrier, String key) {
58-
return carrier.getOrDefault(key, Collections.emptyList());
59+
public Iterator<String> getAll(Map<String, List<String>> carrier, String key) {
60+
List<String> values = carrier.get(key);
61+
return values == null ? Collections.emptyIterator() : values.iterator();
5962
}
6063
};
6164

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.context.internal.propagation;
7+
8+
import io.opentelemetry.context.propagation.TextMapGetter;
9+
import java.util.Collections;
10+
import java.util.Iterator;
11+
import javax.annotation.Nullable;
12+
13+
/**
14+
* Extends {@link TextMapGetter} to return possibly multiple values for a given key.
15+
*
16+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
17+
* at any time.
18+
*
19+
* @param <C> carrier of propagation fields, such as an http request.
20+
*/
21+
public interface ExtendedTextMapGetter<C> extends TextMapGetter<C> {
22+
/**
23+
* If implemented, returns all values for a given {@code key} in order, or returns an empty list.
24+
*
25+
* <p>The default method returns the first value of the given propagation {@code key} as a
26+
* singleton list, or returns an empty list.
27+
*
28+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
29+
* at any time.
30+
*
31+
* @param carrier carrier of propagation fields, such as an http request.
32+
* @param key the key of the field.
33+
* @return all values for a given {@code key} in order, or returns an empty list. Default method
34+
* wraps {@code get()} as an {@link Iterator}.
35+
*/
36+
default Iterator<String> getAll(@Nullable C carrier, String key) {
37+
String first = get(carrier, key);
38+
return Collections.singleton(first).iterator();
39+
}
40+
}

context/src/main/java/io/opentelemetry/context/propagation/TextMapGetter.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
package io.opentelemetry.context.propagation;
77

8-
import java.util.Collections;
9-
import java.util.List;
108
import javax.annotation.Nullable;
119

1210
/**
@@ -35,20 +33,4 @@ public interface TextMapGetter<C> {
3533
*/
3634
@Nullable
3735
String get(@Nullable C carrier, String key);
38-
39-
/**
40-
* If implemented, returns all values for a given {@code key} in order, or returns an empty list.
41-
*
42-
* <p>The default method returns the first value of the given propagation {@code key} as a
43-
* singleton list, or returns an empty list.
44-
*
45-
* @param carrier carrier of propagation fields, such as an http request.
46-
* @param key the key of the field.
47-
* @return the first value of the given propagation {@code key} as a singleton list, or returns an
48-
* empty list.
49-
*/
50-
default List<String> getList(@Nullable C carrier, String key) {
51-
String first = get(carrier, key);
52-
return first == null ? Collections.emptyList() : Collections.singletonList(first);
53-
}
5436
}

0 commit comments

Comments
 (0)