5
5
import io .sentry .JsonObjectReader ;
6
6
import io .sentry .JsonObjectWriter ;
7
7
import io .sentry .JsonSerializable ;
8
+ import io .sentry .JsonUnknown ;
9
+ import io .sentry .vendor .gson .stream .JsonToken ;
8
10
import java .io .IOException ;
11
+ import java .util .Map ;
12
+ import java .util .concurrent .ConcurrentHashMap ;
9
13
import org .jetbrains .annotations .ApiStatus ;
10
14
import org .jetbrains .annotations .NotNull ;
15
+ import org .jetbrains .annotations .Nullable ;
11
16
import org .jetbrains .annotations .TestOnly ;
12
17
13
18
@ ApiStatus .Internal
14
- public final class MeasurementValue implements JsonSerializable {
19
+ public final class MeasurementValue implements JsonUnknown , JsonSerializable {
20
+
21
+ public static final @ NotNull String NONE_UNIT = "none" ;
22
+ public static final @ NotNull String MILLISECOND_UNIT = "millisecond" ;
23
+
15
24
@ SuppressWarnings ("UnusedVariable" )
16
25
private final float value ;
17
26
18
- public MeasurementValue (final float value ) {
27
+ private final @ Nullable String unit ;
28
+
29
+ /** the unknown fields of breadcrumbs, internal usage only */
30
+ private @ Nullable Map <String , Object > unknown ;
31
+
32
+ public MeasurementValue (final float value , final @ Nullable String unit ) {
19
33
this .value = value ;
34
+ this .unit = unit ;
35
+ }
36
+
37
+ @ TestOnly
38
+ public MeasurementValue (
39
+ final float value , final @ Nullable String unit , final @ Nullable Map <String , Object > unknown ) {
40
+ this .value = value ;
41
+ this .unit = unit ;
42
+ this .unknown = unknown ;
20
43
}
21
44
22
45
@ TestOnly
23
46
public float getValue () {
24
47
return value ;
25
48
}
26
49
50
+ public @ Nullable String getUnit () {
51
+ return unit ;
52
+ }
53
+
54
+ @ Nullable
55
+ @ Override
56
+ public Map <String , Object > getUnknown () {
57
+ return unknown ;
58
+ }
59
+
60
+ @ Override
61
+ public void setUnknown (@ Nullable Map <String , Object > unknown ) {
62
+ this .unknown = unknown ;
63
+ }
64
+
27
65
// JsonSerializable
28
66
29
67
public static final class JsonKeys {
30
68
public static final String VALUE = "value" ;
69
+ public static final String UNIT = "unit" ;
31
70
}
32
71
33
72
@ Override
34
73
public void serialize (@ NotNull JsonObjectWriter writer , @ NotNull ILogger logger )
35
74
throws IOException {
36
75
writer .beginObject ();
37
76
writer .name (JsonKeys .VALUE ).value (value );
77
+
78
+ if (unit != null ) {
79
+ writer .name (JsonKeys .UNIT ).value (unit );
80
+ }
81
+
82
+ if (unknown != null ) {
83
+ for (final String key : unknown .keySet ()) {
84
+ final Object value = unknown .get (key );
85
+ writer .name (key );
86
+ writer .value (logger , value );
87
+ }
88
+ }
89
+
38
90
writer .endObject ();
39
91
}
40
92
@@ -43,10 +95,34 @@ public static final class Deserializer implements JsonDeserializer<MeasurementVa
43
95
public @ NotNull MeasurementValue deserialize (
44
96
@ NotNull JsonObjectReader reader , @ NotNull ILogger logger ) throws Exception {
45
97
reader .beginObject ();
46
- reader .nextName ();
47
- MeasurementValue measurementValue = new MeasurementValue (reader .nextFloat ());
98
+
99
+ String unit = null ;
100
+ float value = 0 ;
101
+ Map <String , Object > unknown = null ;
102
+
103
+ while (reader .peek () == JsonToken .NAME ) {
104
+ final String nextName = reader .nextName ();
105
+ switch (nextName ) {
106
+ case JsonKeys .VALUE :
107
+ value = reader .nextFloat ();
108
+ break ;
109
+ case JsonKeys .UNIT :
110
+ unit = reader .nextStringOrNull ();
111
+ break ;
112
+ default :
113
+ if (unknown == null ) {
114
+ unknown = new ConcurrentHashMap <>();
115
+ }
116
+ reader .nextUnknown (logger , unknown , nextName );
117
+ break ;
118
+ }
119
+ }
120
+
48
121
reader .endObject ();
49
- return measurementValue ;
122
+ final MeasurementValue measurement = new MeasurementValue (value , unit );
123
+ measurement .setUnknown (unknown );
124
+
125
+ return measurement ;
50
126
}
51
127
}
52
128
}
0 commit comments