Skip to content

Commit 12822e1

Browse files
authored
Adopt generic variant type in public APIs (#971)
* Rename tag and extra get/set funtions for scope class * Update scope extras to use variant instead of string * Add scope context getter and utilize variants * Use variant for breadcrumb data * Use variant for global context * Use variant for transactions and spans * Fix lint errors * Fix tests * Update CHANGELOG.md * Add workeround for setting extras on Android * FIx json string memory leak
1 parent c1cf6bf commit 12822e1

File tree

65 files changed

+654
-283
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+654
-283
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# Changelog
22

3+
### Breaking Changes
4+
5+
- "Value" suffix has been removed from the get/set function names for tags and extras in `SentryScope`.
6+
- Type of input parameters in certain public API functions was changed from `FString` to `FSentryVariant`:
7+
- Get/Set functions for contexts and extras in `SentryScope`
8+
- Get/Set functions for arbitrary data in `SentryBreadcrumb`
9+
- Get/Set functions for arbitrary data in `SentryTransaction` and `SentrySpan`
10+
- `AddBreadcrumbWithParams` and `SentContext` functions in `SentrySubsystem`
11+
- `CreateSentryBreadcrumb` function in `SentryLibrary`
12+
13+
### Features
14+
15+
- Adopt generic variant type in public APIs ([#971](https://github.com/getsentry/sentry-unreal/pull/971))
16+
317
## 1.0.0-beta.3
418

519
### Breaking Changes

plugin-dev/Source/Sentry/Private/Android/AndroidSentryBreadcrumb.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,18 @@ FString FAndroidSentryBreadcrumb::GetCategory() const
6161
return CallMethod<FString>(GetCategoryMethod);
6262
}
6363

64-
void FAndroidSentryBreadcrumb::SetData(const TMap<FString, FString>& data)
64+
void FAndroidSentryBreadcrumb::SetData(const TMap<FString, FSentryVariant>& data)
6565
{
6666
for (const auto& dataItem : data)
6767
{
68-
CallMethod<void>(SetDataMethod, *GetJString(dataItem.Key), *GetJString(dataItem.Value));
68+
CallMethod<void>(SetDataMethod, *GetJString(dataItem.Key), FAndroidSentryConverters::VariantToNative(dataItem.Value)->GetJObject());
6969
}
7070
}
7171

72-
TMap<FString, FString> FAndroidSentryBreadcrumb::GetData() const
72+
TMap<FString, FSentryVariant> FAndroidSentryBreadcrumb::GetData() const
7373
{
7474
auto data = CallObjectMethod<jobject>(GetDataMethod);
75-
return FAndroidSentryConverters::StringMapToUnreal(*data);
75+
return FAndroidSentryConverters::VariantMapToUnreal(*data);
7676
}
7777

7878
void FAndroidSentryBreadcrumb::SetLevel(ESentryLevel level)

plugin-dev/Source/Sentry/Private/Android/AndroidSentryBreadcrumb.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class FAndroidSentryBreadcrumb : public ISentryBreadcrumb, public FSentryJavaObj
2020
virtual FString GetType() const override;
2121
virtual void SetCategory(const FString& category) override;
2222
virtual FString GetCategory() const override;
23-
virtual void SetData(const TMap<FString, FString>& data) override;
24-
virtual TMap<FString, FString> GetData() const override;
23+
virtual void SetData(const TMap<FString, FSentryVariant>& data) override;
24+
virtual TMap<FString, FSentryVariant> GetData() const override;
2525
virtual void SetLevel(ESentryLevel level) override;
2626
virtual ESentryLevel GetLevel() const override;
2727

plugin-dev/Source/Sentry/Private/Android/AndroidSentryScope.cpp

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ void FAndroidSentryScope::ClearAttachments()
6464
CallMethod<void>(ClearAttachmentsMethod);
6565
}
6666

67-
void FAndroidSentryScope::SetTagValue(const FString& key, const FString& value)
67+
void FAndroidSentryScope::SetTag(const FString& key, const FString& value)
6868
{
6969
CallMethod<void>(SetTagValueMethod, *GetJString(key), *GetJString(value));
7070
}
7171

72-
FString FAndroidSentryScope::GetTagValue(const FString& key) const
72+
FString FAndroidSentryScope::GetTag(const FString& key) const
7373
{
7474
TMap<FString, FString> tags = GetTags();
7575
FString* tagValue = tags.Find(key);
@@ -80,6 +80,19 @@ FString FAndroidSentryScope::GetTagValue(const FString& key) const
8080
return *tagValue;
8181
}
8282

83+
bool FAndroidSentryScope::TryGetTag(const FString& key, FString& value) const
84+
{
85+
TMap<FString, FString> tags = GetTags();
86+
FString* tagValue = tags.Find(key);
87+
88+
if (!tagValue)
89+
return false;
90+
91+
value = *tagValue;
92+
93+
return true;
94+
}
95+
8396
void FAndroidSentryScope::RemoveTag(const FString& key)
8497
{
8598
CallMethod<void>(RemoveTagMethod, *GetJString(key));
@@ -89,7 +102,7 @@ void FAndroidSentryScope::SetTags(const TMap<FString, FString>& tags)
89102
{
90103
for (const auto& tag : tags)
91104
{
92-
SetTagValue(tag.Key, tag.Value);
105+
SetTag(tag.Key, tag.Value);
93106
}
94107
}
95108

@@ -121,49 +134,93 @@ ESentryLevel FAndroidSentryScope::GetLevel() const
121134
return FAndroidSentryConverters::SentryLevelToUnreal(*level);
122135
}
123136

124-
void FAndroidSentryScope::SetContext(const FString& key, const TMap<FString, FString>& values)
137+
void FAndroidSentryScope::SetContext(const FString& key, const TMap<FString, FSentryVariant>& values)
138+
{
139+
CallMethod<void>(SetContextMethod, *GetJString(key), FAndroidSentryConverters::VariantMapToNative(values)->GetJObject());
140+
}
141+
142+
TMap<FString, FSentryVariant> FAndroidSentryScope::GetContext(const FString& key) const
143+
{
144+
auto context = FSentryJavaObjectWrapper::CallStaticObjectMethod<jobject>(SentryJavaClasses::SentryBridgeJava, "getScopeContext", "(Lio/sentry/IScope;Ljava/lang/String;)Ljava/lang/Object;",
145+
GetJObject(), *FSentryJavaObjectWrapper::GetJString(key));
146+
return FAndroidSentryConverters::VariantMapToUnreal(*context);
147+
}
148+
149+
bool FAndroidSentryScope::TryGetContext(const FString& key, TMap<FString, FSentryVariant>& value) const
125150
{
126-
CallMethod<void>(SetContextMethod, *GetJString(key), FAndroidSentryConverters::StringMapToNative(values)->GetJObject());
151+
auto context = FSentryJavaObjectWrapper::CallStaticObjectMethod<jobject>(SentryJavaClasses::SentryBridgeJava, "getScopeContext", "(Lio/sentry/IScope;Ljava/lang/String;)Ljava/lang/Object;",
152+
GetJObject(), *FSentryJavaObjectWrapper::GetJString(key));
153+
154+
if (!context)
155+
{
156+
return false;
157+
}
158+
159+
const FSentryVariant& contextVariant = FAndroidSentryConverters::VariantToUnreal(*context);
160+
if (contextVariant.GetType() == ESentryVariantType::Empty)
161+
{
162+
return false;
163+
}
164+
165+
value = contextVariant.GetValue<TMap<FString, FSentryVariant>>();
166+
167+
return true;
127168
}
128169

129170
void FAndroidSentryScope::RemoveContext(const FString& key)
130171
{
131172
CallMethod<void>(RemoveContextMethod, *GetJString(key));
132173
}
133174

134-
void FAndroidSentryScope::SetExtraValue(const FString& key, const FString& value)
175+
void FAndroidSentryScope::SetExtra(const FString& key, const FSentryVariant& value)
135176
{
136-
CallMethod<void>(SetExtraValueMethod, *GetJString(key), *GetJString(value));
177+
// Sentry's Android SDK currently supports only string type for extras (see https://github.com/getsentry/sentry-java/issues/2032)
178+
// Variants with array/map values will be set as strings
179+
// When retrieving such values using `GetExtra`, `TryGetExtra` or `GetExtras` they have to be interpreted as strings
180+
FSentryJavaObjectWrapper::CallStaticMethod<void>(SentryJavaClasses::SentryBridgeJava, "setScopeExtra", "(Lio/sentry/IScope;Ljava/lang/String;Ljava/lang/Object;)V",
181+
GetJObject(), *FSentryJavaObjectWrapper::GetJString(key), FAndroidSentryConverters::VariantToNative(value)->GetJObject());
137182
}
138183

139-
FString FAndroidSentryScope::GetExtraValue(const FString& key) const
184+
FSentryVariant FAndroidSentryScope::GetExtra(const FString& key) const
140185
{
141-
TMap<FString, FString> extras = GetExtras();
142-
FString* extraValue = extras.Find(key);
186+
TMap<FString, FSentryVariant> extras = GetExtras();
187+
FSentryVariant* extraValue = extras.Find(key);
143188

144189
if (!extraValue)
145-
return FString();
190+
return FSentryVariant();
146191

147192
return *extraValue;
148193
}
149194

195+
bool FAndroidSentryScope::TryGetExtra(const FString& key, FSentryVariant& value) const
196+
{
197+
TMap<FString, FSentryVariant> extras = GetExtras();
198+
FSentryVariant* extraValue = extras.Find(key);
199+
200+
if (!extraValue)
201+
return false;
202+
203+
value = *extraValue;
204+
return true;
205+
}
206+
150207
void FAndroidSentryScope::RemoveExtra(const FString& key)
151208
{
152209
CallMethod<void>(RemoveExtraMethod, *GetJString(key));
153210
}
154211

155-
void FAndroidSentryScope::SetExtras(const TMap<FString, FString>& extras)
212+
void FAndroidSentryScope::SetExtras(const TMap<FString, FSentryVariant>& extras)
156213
{
157214
for (const auto& extra : extras)
158215
{
159-
SetExtraValue(extra.Key, extra.Value);
216+
SetExtra(extra.Key, extra.Value);
160217
}
161218
}
162219

163-
TMap<FString, FString> FAndroidSentryScope::GetExtras() const
220+
TMap<FString, FSentryVariant> FAndroidSentryScope::GetExtras() const
164221
{
165222
auto extras = CallObjectMethod<jobject>(GetExtrasMethod);
166-
return FAndroidSentryConverters::StringMapToUnreal(*extras);
223+
return FAndroidSentryConverters::VariantMapToUnreal(*extras);
167224
}
168225

169226
void FAndroidSentryScope::Clear()

plugin-dev/Source/Sentry/Private/Android/AndroidSentryScope.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,26 @@ class FAndroidSentryScope : public ISentryScope, public FSentryJavaObjectWrapper
1818
virtual void ClearBreadcrumbs() override;
1919
virtual void AddAttachment(TSharedPtr<ISentryAttachment> attachment) override;
2020
virtual void ClearAttachments() override;
21-
virtual void SetTagValue(const FString& key, const FString& value) override;
22-
virtual FString GetTagValue(const FString& key) const override;
21+
virtual void SetTag(const FString& key, const FString& value) override;
22+
virtual FString GetTag(const FString& key) const override;
23+
virtual bool TryGetTag(const FString& key, FString& value) const override;
2324
virtual void RemoveTag(const FString& key) override;
2425
virtual void SetTags(const TMap<FString, FString>& tags) override;
2526
virtual TMap<FString, FString> GetTags() const override;
2627
virtual void SetFingerprint(const TArray<FString>& fingerprint) override;
2728
virtual TArray<FString> GetFingerprint() const override;
2829
virtual void SetLevel(ESentryLevel level) override;
2930
virtual ESentryLevel GetLevel() const override;
30-
virtual void SetContext(const FString& key, const TMap<FString, FString>& values) override;
31+
virtual void SetContext(const FString& key, const TMap<FString, FSentryVariant>& values) override;
32+
virtual TMap<FString, FSentryVariant> GetContext(const FString& key) const override;
33+
virtual bool TryGetContext(const FString& key, TMap<FString, FSentryVariant>& value) const override;
3134
virtual void RemoveContext(const FString& key) override;
32-
virtual void SetExtraValue(const FString& key, const FString& value) override;
33-
virtual FString GetExtraValue(const FString& key) const override;
35+
virtual void SetExtra(const FString& key, const FSentryVariant& value) override;
36+
virtual FSentryVariant GetExtra(const FString& key) const override;
37+
virtual bool TryGetExtra(const FString& key, FSentryVariant& value) const override;
3438
virtual void RemoveExtra(const FString& key) override;
35-
virtual void SetExtras(const TMap<FString, FString>& extras) override;
36-
virtual TMap<FString, FString> GetExtras() const override;
39+
virtual void SetExtras(const TMap<FString, FSentryVariant>& extras) override;
40+
virtual TMap<FString, FSentryVariant> GetExtras() const override;
3741
virtual void Clear() override;
3842

3943
private:

plugin-dev/Source/Sentry/Private/Android/AndroidSentrySpan.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ void FAndroidSentrySpan::RemoveTag(const FString& key)
6161
SetTag(key, TEXT(""));
6262
}
6363

64-
void FAndroidSentrySpan::SetData(const FString& key, const TMap<FString, FString>& values)
64+
void FAndroidSentrySpan::SetData(const FString& key, const TMap<FString, FSentryVariant>& values)
6565
{
66-
CallMethod<void>(SetDataMethod, *GetJString(key), FAndroidSentryConverters::StringMapToNative(values)->GetJObject());
66+
CallMethod<void>(SetDataMethod, *GetJString(key), FAndroidSentryConverters::VariantMapToNative(values)->GetJObject());
6767
}
6868

6969
void FAndroidSentrySpan::RemoveData(const FString& key)
7070
{
71-
SetData(key, TMap<FString, FString>());
71+
CallMethod<void>(SetDataMethod, *GetJString(key), nullptr);
7272
}
7373

7474
void FAndroidSentrySpan::GetTrace(FString& name, FString& value)

plugin-dev/Source/Sentry/Private/Android/AndroidSentrySpan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class FAndroidSentrySpan : public ISentrySpan, public FSentryJavaObjectWrapper
2020
virtual bool IsFinished() const override;
2121
virtual void SetTag(const FString& key, const FString& value) override;
2222
virtual void RemoveTag(const FString& key) override;
23-
virtual void SetData(const FString& key, const TMap<FString, FString>& values) override;
23+
virtual void SetData(const FString& key, const TMap<FString, FSentryVariant>& values) override;
2424
virtual void RemoveData(const FString& key) override;
2525
virtual void GetTrace(FString& name, FString& value) override;
2626

plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void FAndroidSentrySubsystem::AddBreadcrumb(TSharedPtr<ISentryBreadcrumb> breadc
109109
breadcrumbAndroid->GetJObject());
110110
}
111111

112-
void FAndroidSentrySubsystem::AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FString>& Data, ESentryLevel Level)
112+
void FAndroidSentrySubsystem::AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FSentryVariant>& Data, ESentryLevel Level)
113113
{
114114
TSharedPtr<FAndroidSentryBreadcrumb> breadcrumbAndroid = MakeShareable(new FAndroidSentryBreadcrumb());
115115
breadcrumbAndroid->SetMessage(Message);
@@ -196,10 +196,10 @@ void FAndroidSentrySubsystem::RemoveUser()
196196
FSentryJavaObjectWrapper::CallStaticMethod<void>(SentryJavaClasses::Sentry, "setUser", "(Lio/sentry/protocol/User;)V", nullptr);
197197
}
198198

199-
void FAndroidSentrySubsystem::SetContext(const FString& key, const TMap<FString, FString>& values)
199+
void FAndroidSentrySubsystem::SetContext(const FString& key, const TMap<FString, FSentryVariant>& values)
200200
{
201201
FSentryJavaObjectWrapper::CallStaticMethod<void>(SentryJavaClasses::SentryBridgeJava, "setContext", "(Ljava/lang/String;Ljava/util/HashMap;)V",
202-
*FSentryJavaObjectWrapper::GetJString(key), FAndroidSentryConverters::StringMapToNative(values)->GetJObject());
202+
*FSentryJavaObjectWrapper::GetJString(key), FAndroidSentryConverters::VariantMapToNative(values)->GetJObject());
203203
}
204204

205205
void FAndroidSentrySubsystem::SetTag(const FString& key, const FString& value)

plugin-dev/Source/Sentry/Private/Android/AndroidSentrySubsystem.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem
1212
virtual bool IsEnabled() override;
1313
virtual ESentryCrashedLastRun IsCrashedLastRun() override;
1414
virtual void AddBreadcrumb(TSharedPtr<ISentryBreadcrumb> breadcrumb) override;
15-
virtual void AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FString>& Data, ESentryLevel Level) override;
15+
virtual void AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FSentryVariant>& Data, ESentryLevel Level) override;
1616
virtual void ClearBreadcrumbs() override;
1717
virtual TSharedPtr<ISentryId> CaptureMessage(const FString& message, ESentryLevel level) override;
1818
virtual TSharedPtr<ISentryId> CaptureMessageWithScope(const FString& message, ESentryLevel level, const FSentryScopeDelegate& onConfigureScope) override;
@@ -22,7 +22,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem
2222
virtual void CaptureUserFeedback(TSharedPtr<ISentryUserFeedback> userFeedback) override;
2323
virtual void SetUser(TSharedPtr<ISentryUser> user) override;
2424
virtual void RemoveUser() override;
25-
virtual void SetContext(const FString& key, const TMap<FString, FString>& values) override;
25+
virtual void SetContext(const FString& key, const TMap<FString, FSentryVariant>& values) override;
2626
virtual void SetTag(const FString& key, const FString& value) override;
2727
virtual void RemoveTag(const FString& key) override;
2828
virtual void SetLevel(ESentryLevel level) override;

plugin-dev/Source/Sentry/Private/Android/AndroidSentryTransaction.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ void FAndroidSentryTransaction::RemoveTag(const FString& key)
6868
SetTag(key, TEXT(""));
6969
}
7070

71-
void FAndroidSentryTransaction::SetData(const FString& key, const TMap<FString, FString>& values)
71+
void FAndroidSentryTransaction::SetData(const FString& key, const TMap<FString, FSentryVariant>& values)
7272
{
73-
CallMethod<void>(SetDataMethod, *GetJString(key), FAndroidSentryConverters::StringMapToNative(values)->GetJObject());
73+
CallMethod<void>(SetDataMethod, *GetJString(key), FAndroidSentryConverters::VariantMapToNative(values)->GetJObject());
7474
}
7575

7676
void FAndroidSentryTransaction::RemoveData(const FString& key)
7777
{
78-
SetData(key, TMap<FString, FString>());
78+
CallMethod<void>(SetDataMethod, *GetJString(key), nullptr);
7979
}
8080

8181
void FAndroidSentryTransaction::GetTrace(FString& name, FString& value)

0 commit comments

Comments
 (0)