22
33import java .util .ArrayList ;
44import java .util .HashMap ;
5+ import java .util .Iterator ;
56import java .util .List ;
67import java .util .Map ;
8+ import org .jetbrains .annotations .ApiStatus ;
79import org .jetbrains .annotations .NotNull ;
810import org .jetbrains .annotations .Nullable ;
911
@@ -39,16 +41,17 @@ public final class Hint {
3941 return hint ;
4042 }
4143
42- public void set (@ NotNull String name , @ Nullable Object hint ) {
44+ public synchronized void set (@ NotNull String name , @ Nullable Object hint ) {
4345 internalStorage .put (name , hint );
4446 }
4547
46- public @ Nullable Object get (@ NotNull String name ) {
48+ public synchronized @ Nullable Object get (@ NotNull String name ) {
4749 return internalStorage .get (name );
4850 }
4951
5052 @ SuppressWarnings ("unchecked" )
51- public <T extends Object > @ Nullable T getAs (@ NotNull String name , @ NotNull Class <T > clazz ) {
53+ public synchronized <T extends Object > @ Nullable T getAs (
54+ @ NotNull String name , @ NotNull Class <T > clazz ) {
5255 Object hintValue = internalStorage .get (name );
5356
5457 if (clazz .isInstance (hintValue )) {
@@ -60,7 +63,7 @@ public void set(@NotNull String name, @Nullable Object hint) {
6063 }
6164 }
6265
63- public void remove (@ NotNull String name ) {
66+ public synchronized void remove (@ NotNull String name ) {
6467 internalStorage .remove (name );
6568 }
6669
@@ -89,6 +92,23 @@ public void clearAttachments() {
8992 attachments .clear ();
9093 }
9194
95+ /**
96+ * Clears all attributes added via {@link #set(String, Object)} Note: SDK internal attributes are
97+ * being kept. This is useful to avoid leaking any objects (e.g. Android activities) being
98+ * referenced.
99+ */
100+ @ ApiStatus .Internal
101+ public synchronized void clear () {
102+ final Iterator <Map .Entry <String , Object >> iterator = internalStorage .entrySet ().iterator ();
103+
104+ while (iterator .hasNext ()) {
105+ final Map .Entry <String , Object > entry = iterator .next ();
106+ if (entry .getKey () == null || !entry .getKey ().startsWith ("sentry:" )) {
107+ iterator .remove ();
108+ }
109+ }
110+ }
111+
92112 public void setScreenshot (@ Nullable Attachment screenshot ) {
93113 this .screenshot = screenshot ;
94114 }
0 commit comments