Skip to content

Commit d1d0aa8

Browse files
authored
Add support for Optional(Int|Double|Long) (#7581)
We added special field access for Optional but forgot about specialized version for primitives: Int, Double and Long
1 parent 5ca22e4 commit d1d0aa8

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import java.util.HashSet;
1010
import java.util.Map;
1111
import java.util.Optional;
12+
import java.util.OptionalDouble;
13+
import java.util.OptionalInt;
14+
import java.util.OptionalLong;
1215
import java.util.Set;
1316
import java.util.function.Function;
1417
import org.slf4j.Logger;
@@ -116,14 +119,26 @@ public class WellKnownClasses {
116119

117120
private static final Map<String, Function<Object, CapturedContext.CapturedValue>>
118121
OPTIONAL_SPECIAL_FIELDS = new HashMap<>();
122+
private static final Map<String, Function<Object, CapturedContext.CapturedValue>>
123+
OPTIONALINT_SPECIAL_FIELDS = new HashMap<>();
124+
private static final Map<String, Function<Object, CapturedContext.CapturedValue>>
125+
OPTIONALDOUBLE_SPECIAL_FIELDS = new HashMap<>();
126+
private static final Map<String, Function<Object, CapturedContext.CapturedValue>>
127+
OPTIONALLONG_SPECIAL_FIELDS = new HashMap<>();
119128

120129
static {
121130
OPTIONAL_SPECIAL_FIELDS.put("value", OptionalFields::value);
131+
OPTIONALINT_SPECIAL_FIELDS.put("value", OptionalFields::valueInt);
132+
OPTIONALDOUBLE_SPECIAL_FIELDS.put("value", OptionalFields::valueDouble);
133+
OPTIONALLONG_SPECIAL_FIELDS.put("value", OptionalFields::valueLong);
122134
}
123135

124136
static {
125137
SPECIAL_TYPE_ACCESS.put(StackTraceElement.class, STACKTRACEELEMENT_SPECIAL_FIELDS);
126138
SPECIAL_TYPE_ACCESS.put(Optional.class, OPTIONAL_SPECIAL_FIELDS);
139+
SPECIAL_TYPE_ACCESS.put(OptionalInt.class, OPTIONALINT_SPECIAL_FIELDS);
140+
SPECIAL_TYPE_ACCESS.put(OptionalDouble.class, OPTIONALDOUBLE_SPECIAL_FIELDS);
141+
SPECIAL_TYPE_ACCESS.put(OptionalLong.class, OPTIONALLONG_SPECIAL_FIELDS);
127142
}
128143

129144
private static final Map<String, Function<Object, CapturedContext.CapturedValue>>
@@ -337,5 +352,20 @@ public static CapturedContext.CapturedValue value(Object o) {
337352
return CapturedContext.CapturedValue.of(
338353
"value", Object.class.getTypeName(), ((Optional<?>) o).orElse(null));
339354
}
355+
356+
public static CapturedContext.CapturedValue valueInt(Object o) {
357+
return CapturedContext.CapturedValue.of(
358+
"value", Integer.TYPE.getTypeName(), ((OptionalInt) o).orElse(0));
359+
}
360+
361+
public static CapturedContext.CapturedValue valueDouble(Object o) {
362+
return CapturedContext.CapturedValue.of(
363+
"value", Double.TYPE.getTypeName(), ((OptionalDouble) o).orElse(0.0));
364+
}
365+
366+
public static CapturedContext.CapturedValue valueLong(Object o) {
367+
return CapturedContext.CapturedValue.of(
368+
"value", Long.TYPE.getTypeName(), ((OptionalLong) o).orElse(0L));
369+
}
340370
}
341371
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SnapshotSerializationTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
import java.util.List;
5656
import java.util.Map;
5757
import java.util.Optional;
58+
import java.util.OptionalDouble;
59+
import java.util.OptionalInt;
60+
import java.util.OptionalLong;
5861
import java.util.Random;
5962
import java.util.UUID;
6063
import java.util.concurrent.atomic.AtomicLong;
@@ -299,6 +302,9 @@ static class WellKnownClasses {
299302
URI uri = URI.create("https://www.datadoghq.com");
300303
Optional<Date> maybeDate = Optional.of(new Date());
301304
Optional<Object> empty = Optional.empty();
305+
OptionalInt maybeInt = OptionalInt.of(42);
306+
OptionalDouble maybeDouble = OptionalDouble.of(3.14);
307+
OptionalLong maybeLong = OptionalLong.of(84);
302308
Exception ex = new IllegalArgumentException("invalid arg");
303309
StackTraceElement element = new StackTraceElement("Foo", "bar", "foo.java", 42);
304310
}
@@ -335,17 +341,35 @@ public void wellKnownClasses() throws IOException {
335341
assertPrimitiveValue(objLocalFields, "atomicLong", AtomicLong.class.getTypeName(), "123");
336342
assertPrimitiveValue(
337343
objLocalFields, "uri", URI.class.getTypeName(), "https://www.datadoghq.com");
344+
// maybeDate
338345
Map<String, Object> maybeDate = (Map<String, Object>) objLocalFields.get("maybeDate");
339346
assertComplexClass(maybeDate, Optional.class.getTypeName());
340-
Map<String, Object> maybeUiidFields = (Map<String, Object>) maybeDate.get(FIELDS);
341-
Map<String, Object> value = (Map<String, Object>) maybeUiidFields.get("value");
347+
Map<String, Object> maybeDateFields = (Map<String, Object>) maybeDate.get(FIELDS);
348+
Map<String, Object> value = (Map<String, Object>) maybeDateFields.get("value");
342349
assertComplexClass(value, Date.class.getTypeName());
350+
// empty
343351
Map<String, Object> empty = (Map<String, Object>) objLocalFields.get("empty");
344352
assertComplexClass(empty, Optional.class.getTypeName());
345353
Map<String, Object> emptyFields = (Map<String, Object>) empty.get(FIELDS);
346354
value = (Map<String, Object>) emptyFields.get("value");
347355
assertEquals(Object.class.getTypeName(), value.get(TYPE));
348356
assertTrue((Boolean) value.get(IS_NULL));
357+
// maybeInt
358+
Map<String, Object> maybeInt = (Map<String, Object>) objLocalFields.get("maybeInt");
359+
assertComplexClass(maybeInt, OptionalInt.class.getTypeName());
360+
Map<String, Object> maybeIntFields = (Map<String, Object>) maybeInt.get(FIELDS);
361+
assertPrimitiveValue(maybeIntFields, "value", "int", "42");
362+
// maybeDouble
363+
Map<String, Object> maybeDouble = (Map<String, Object>) objLocalFields.get("maybeDouble");
364+
assertComplexClass(maybeDouble, OptionalDouble.class.getTypeName());
365+
Map<String, Object> maybeDoubleFields = (Map<String, Object>) maybeDouble.get(FIELDS);
366+
assertPrimitiveValue(maybeDoubleFields, "value", "double", "3.14");
367+
// maybeLong
368+
Map<String, Object> maybeLong = (Map<String, Object>) objLocalFields.get("maybeLong");
369+
assertComplexClass(maybeLong, OptionalLong.class.getTypeName());
370+
Map<String, Object> maybeLongFields = (Map<String, Object>) maybeLong.get(FIELDS);
371+
assertPrimitiveValue(maybeLongFields, "value", "long", "84");
372+
// ex
349373
Map<String, Object> ex = (Map<String, Object>) objLocalFields.get("ex");
350374
assertComplexClass(ex, IllegalArgumentException.class.getTypeName());
351375
Map<String, Object> exFields = (Map<String, Object>) ex.get(FIELDS);

0 commit comments

Comments
 (0)