Skip to content

Adopt generic variant type in public APIs #971

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

### Breaking Changes

- "Value" suffix has been removed from the get/set function names for tags and extras in `SentryScope`.
- Type of input parameters in certain public API functions was changed from `FString` to `FSentryVariant`:
- Get/Set functions for contexts and extras in `SentryScope`
- Get/Set functions for arbitrary data in `SentryBreadcrumb`
- Get/Set functions for arbitrary data in `SentryTransaction` and `SentrySpan`
- `AddBreadcrumbWithParams` and `SentContext` functions in `SentrySubsystem`
- `CreateSentryBreadcrumb` function in `SentryLibrary`

### Features

- Adopt generic variant type in public APIs ([#971](https://github.com/getsentry/sentry-unreal/pull/971))

## 1.0.0-beta.3

### Breaking Changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,18 @@ FString FAndroidSentryBreadcrumb::GetCategory() const
return CallMethod<FString>(GetCategoryMethod);
}

void FAndroidSentryBreadcrumb::SetData(const TMap<FString, FString>& data)
void FAndroidSentryBreadcrumb::SetData(const TMap<FString, FSentryVariant>& data)
{
for (const auto& dataItem : data)
{
CallMethod<void>(SetDataMethod, *GetJString(dataItem.Key), *GetJString(dataItem.Value));
CallMethod<void>(SetDataMethod, *GetJString(dataItem.Key), FAndroidSentryConverters::VariantToNative(dataItem.Value)->GetJObject());
}
}

TMap<FString, FString> FAndroidSentryBreadcrumb::GetData() const
TMap<FString, FSentryVariant> FAndroidSentryBreadcrumb::GetData() const
{
auto data = CallObjectMethod<jobject>(GetDataMethod);
return FAndroidSentryConverters::StringMapToUnreal(*data);
return FAndroidSentryConverters::VariantMapToUnreal(*data);
}

void FAndroidSentryBreadcrumb::SetLevel(ESentryLevel level)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class FAndroidSentryBreadcrumb : public ISentryBreadcrumb, public FSentryJavaObj
virtual FString GetType() const override;
virtual void SetCategory(const FString& category) override;
virtual FString GetCategory() const override;
virtual void SetData(const TMap<FString, FString>& data) override;
virtual TMap<FString, FString> GetData() const override;
virtual void SetData(const TMap<FString, FSentryVariant>& data) override;
virtual TMap<FString, FSentryVariant> GetData() const override;
virtual void SetLevel(ESentryLevel level) override;
virtual ESentryLevel GetLevel() const override;

Expand Down
87 changes: 72 additions & 15 deletions plugin-dev/Source/Sentry/Private/Android/AndroidSentryScope.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,12 @@ void FAndroidSentryScope::ClearAttachments()
CallMethod<void>(ClearAttachmentsMethod);
}

void FAndroidSentryScope::SetTagValue(const FString& key, const FString& value)
void FAndroidSentryScope::SetTag(const FString& key, const FString& value)
{
CallMethod<void>(SetTagValueMethod, *GetJString(key), *GetJString(value));
}

FString FAndroidSentryScope::GetTagValue(const FString& key) const
FString FAndroidSentryScope::GetTag(const FString& key) const
{
TMap<FString, FString> tags = GetTags();
FString* tagValue = tags.Find(key);
Expand All @@ -80,6 +80,19 @@ FString FAndroidSentryScope::GetTagValue(const FString& key) const
return *tagValue;
}

bool FAndroidSentryScope::TryGetTag(const FString& key, FString& value) const
{
TMap<FString, FString> tags = GetTags();
FString* tagValue = tags.Find(key);

if (!tagValue)
return false;

value = *tagValue;

return true;
}

void FAndroidSentryScope::RemoveTag(const FString& key)
{
CallMethod<void>(RemoveTagMethod, *GetJString(key));
Expand All @@ -89,7 +102,7 @@ void FAndroidSentryScope::SetTags(const TMap<FString, FString>& tags)
{
for (const auto& tag : tags)
{
SetTagValue(tag.Key, tag.Value);
SetTag(tag.Key, tag.Value);
}
}

Expand Down Expand Up @@ -121,49 +134,93 @@ ESentryLevel FAndroidSentryScope::GetLevel() const
return FAndroidSentryConverters::SentryLevelToUnreal(*level);
}

void FAndroidSentryScope::SetContext(const FString& key, const TMap<FString, FString>& values)
void FAndroidSentryScope::SetContext(const FString& key, const TMap<FString, FSentryVariant>& values)
{
CallMethod<void>(SetContextMethod, *GetJString(key), FAndroidSentryConverters::VariantMapToNative(values)->GetJObject());
}

TMap<FString, FSentryVariant> FAndroidSentryScope::GetContext(const FString& key) const
{
auto context = FSentryJavaObjectWrapper::CallStaticObjectMethod<jobject>(SentryJavaClasses::SentryBridgeJava, "getScopeContext", "(Lio/sentry/IScope;Ljava/lang/String;)Ljava/lang/Object;",
GetJObject(), *FSentryJavaObjectWrapper::GetJString(key));
return FAndroidSentryConverters::VariantMapToUnreal(*context);
}

bool FAndroidSentryScope::TryGetContext(const FString& key, TMap<FString, FSentryVariant>& value) const
{
CallMethod<void>(SetContextMethod, *GetJString(key), FAndroidSentryConverters::StringMapToNative(values)->GetJObject());
auto context = FSentryJavaObjectWrapper::CallStaticObjectMethod<jobject>(SentryJavaClasses::SentryBridgeJava, "getScopeContext", "(Lio/sentry/IScope;Ljava/lang/String;)Ljava/lang/Object;",
GetJObject(), *FSentryJavaObjectWrapper::GetJString(key));

if (!context)
{
return false;
}

const FSentryVariant& contextVariant = FAndroidSentryConverters::VariantToUnreal(*context);
if (contextVariant.GetType() == ESentryVariantType::Empty)
{
return false;
}

value = contextVariant.GetValue<TMap<FString, FSentryVariant>>();

return true;
}

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

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

FString FAndroidSentryScope::GetExtraValue(const FString& key) const
FSentryVariant FAndroidSentryScope::GetExtra(const FString& key) const
{
TMap<FString, FString> extras = GetExtras();
FString* extraValue = extras.Find(key);
TMap<FString, FSentryVariant> extras = GetExtras();
FSentryVariant* extraValue = extras.Find(key);

if (!extraValue)
return FString();
return FSentryVariant();

return *extraValue;
}

bool FAndroidSentryScope::TryGetExtra(const FString& key, FSentryVariant& value) const
{
TMap<FString, FSentryVariant> extras = GetExtras();
FSentryVariant* extraValue = extras.Find(key);

if (!extraValue)
return false;

value = *extraValue;
return true;
}

void FAndroidSentryScope::RemoveExtra(const FString& key)
{
CallMethod<void>(RemoveExtraMethod, *GetJString(key));
}

void FAndroidSentryScope::SetExtras(const TMap<FString, FString>& extras)
void FAndroidSentryScope::SetExtras(const TMap<FString, FSentryVariant>& extras)
{
for (const auto& extra : extras)
{
SetExtraValue(extra.Key, extra.Value);
SetExtra(extra.Key, extra.Value);
}
}

TMap<FString, FString> FAndroidSentryScope::GetExtras() const
TMap<FString, FSentryVariant> FAndroidSentryScope::GetExtras() const
{
auto extras = CallObjectMethod<jobject>(GetExtrasMethod);
return FAndroidSentryConverters::StringMapToUnreal(*extras);
return FAndroidSentryConverters::VariantMapToUnreal(*extras);
}

void FAndroidSentryScope::Clear()
Expand Down
18 changes: 11 additions & 7 deletions plugin-dev/Source/Sentry/Private/Android/AndroidSentryScope.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,26 @@ class FAndroidSentryScope : public ISentryScope, public FSentryJavaObjectWrapper
virtual void ClearBreadcrumbs() override;
virtual void AddAttachment(TSharedPtr<ISentryAttachment> attachment) override;
virtual void ClearAttachments() override;
virtual void SetTagValue(const FString& key, const FString& value) override;
virtual FString GetTagValue(const FString& key) const override;
virtual void SetTag(const FString& key, const FString& value) override;
virtual FString GetTag(const FString& key) const override;
virtual bool TryGetTag(const FString& key, FString& value) const override;
virtual void RemoveTag(const FString& key) override;
virtual void SetTags(const TMap<FString, FString>& tags) override;
virtual TMap<FString, FString> GetTags() const override;
virtual void SetFingerprint(const TArray<FString>& fingerprint) override;
virtual TArray<FString> GetFingerprint() const override;
virtual void SetLevel(ESentryLevel level) override;
virtual ESentryLevel GetLevel() const override;
virtual void SetContext(const FString& key, const TMap<FString, FString>& values) override;
virtual void SetContext(const FString& key, const TMap<FString, FSentryVariant>& values) override;
virtual TMap<FString, FSentryVariant> GetContext(const FString& key) const override;
virtual bool TryGetContext(const FString& key, TMap<FString, FSentryVariant>& value) const override;
virtual void RemoveContext(const FString& key) override;
virtual void SetExtraValue(const FString& key, const FString& value) override;
virtual FString GetExtraValue(const FString& key) const override;
virtual void SetExtra(const FString& key, const FSentryVariant& value) override;
virtual FSentryVariant GetExtra(const FString& key) const override;
virtual bool TryGetExtra(const FString& key, FSentryVariant& value) const override;
virtual void RemoveExtra(const FString& key) override;
virtual void SetExtras(const TMap<FString, FString>& extras) override;
virtual TMap<FString, FString> GetExtras() const override;
virtual void SetExtras(const TMap<FString, FSentryVariant>& extras) override;
virtual TMap<FString, FSentryVariant> GetExtras() const override;
virtual void Clear() override;

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,14 @@ void FAndroidSentrySpan::RemoveTag(const FString& key)
SetTag(key, TEXT(""));
}

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

void FAndroidSentrySpan::RemoveData(const FString& key)
{
SetData(key, TMap<FString, FString>());
CallMethod<void>(SetDataMethod, *GetJString(key), nullptr);
}

void FAndroidSentrySpan::GetTrace(FString& name, FString& value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class FAndroidSentrySpan : public ISentrySpan, public FSentryJavaObjectWrapper
virtual bool IsFinished() const override;
virtual void SetTag(const FString& key, const FString& value) override;
virtual void RemoveTag(const FString& key) override;
virtual void SetData(const FString& key, const TMap<FString, FString>& values) override;
virtual void SetData(const FString& key, const TMap<FString, FSentryVariant>& values) override;
virtual void RemoveData(const FString& key) override;
virtual void GetTrace(FString& name, FString& value) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ void FAndroidSentrySubsystem::AddBreadcrumb(TSharedPtr<ISentryBreadcrumb> breadc
breadcrumbAndroid->GetJObject());
}

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

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

void FAndroidSentrySubsystem::SetTag(const FString& key, const FString& value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem
virtual bool IsEnabled() override;
virtual ESentryCrashedLastRun IsCrashedLastRun() override;
virtual void AddBreadcrumb(TSharedPtr<ISentryBreadcrumb> breadcrumb) override;
virtual void AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FString>& Data, ESentryLevel Level) override;
virtual void AddBreadcrumbWithParams(const FString& Message, const FString& Category, const FString& Type, const TMap<FString, FSentryVariant>& Data, ESentryLevel Level) override;
virtual void ClearBreadcrumbs() override;
virtual TSharedPtr<ISentryId> CaptureMessage(const FString& message, ESentryLevel level) override;
virtual TSharedPtr<ISentryId> CaptureMessageWithScope(const FString& message, ESentryLevel level, const FSentryScopeDelegate& onConfigureScope) override;
Expand All @@ -22,7 +22,7 @@ class FAndroidSentrySubsystem : public ISentrySubsystem
virtual void CaptureUserFeedback(TSharedPtr<ISentryUserFeedback> userFeedback) override;
virtual void SetUser(TSharedPtr<ISentryUser> user) override;
virtual void RemoveUser() override;
virtual void SetContext(const FString& key, const TMap<FString, FString>& values) override;
virtual void SetContext(const FString& key, const TMap<FString, FSentryVariant>& values) override;
virtual void SetTag(const FString& key, const FString& value) override;
virtual void RemoveTag(const FString& key) override;
virtual void SetLevel(ESentryLevel level) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,14 @@ void FAndroidSentryTransaction::RemoveTag(const FString& key)
SetTag(key, TEXT(""));
}

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

void FAndroidSentryTransaction::RemoveData(const FString& key)
{
SetData(key, TMap<FString, FString>());
CallMethod<void>(SetDataMethod, *GetJString(key), nullptr);
}

void FAndroidSentryTransaction::GetTrace(FString& name, FString& value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class FAndroidSentryTransaction : public ISentryTransaction, public FSentryJavaO
virtual void SetName(const FString& name) override;
virtual void SetTag(const FString& key, const FString& value) override;
virtual void RemoveTag(const FString& key) override;
virtual void SetData(const FString& key, const TMap<FString, FString>& values) override;
virtual void SetData(const FString& key, const TMap<FString, FSentryVariant>& values) override;
virtual void RemoveData(const FString& key) override;
virtual void GetTrace(FString& name, FString& value) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,4 +217,12 @@ public static Object getContext(final SentryEvent event, final String key) {
public static void removeContext(final SentryEvent event, final String key) {
event.getContexts().remove(key);
}

public static Object getScopeContext(final IScope scope, final String key) {
return scope.getContexts().get(key);
}

public static void setScopeExtra(final IScope scope, final String key, final Object values) {
scope.setExtra(key, values.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ FString FAppleSentryBreadcrumb::GetCategory() const
return FString(BreadcrumbApple.category);
}

void FAppleSentryBreadcrumb::SetData(const TMap<FString, FString>& data)
void FAppleSentryBreadcrumb::SetData(const TMap<FString, FSentryVariant>& data)
{
BreadcrumbApple.data = FAppleSentryConverters::StringMapToNative(data);
BreadcrumbApple.data = FAppleSentryConverters::VariantMapToNative(data);
}

TMap<FString, FString> FAppleSentryBreadcrumb::GetData() const
TMap<FString, FSentryVariant> FAppleSentryBreadcrumb::GetData() const
{
return FAppleSentryConverters::StringMapToUnreal(BreadcrumbApple.data);
return FAppleSentryConverters::VariantMapToUnreal(BreadcrumbApple.data);
}

void FAppleSentryBreadcrumb::SetLevel(ESentryLevel level)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class FAppleSentryBreadcrumb : public ISentryBreadcrumb
virtual FString GetType() const override;
virtual void SetCategory(const FString& category) override;
virtual FString GetCategory() const override;
virtual void SetData(const TMap<FString, FString>& data) override;
virtual TMap<FString, FString> GetData() const override;
virtual void SetData(const TMap<FString, FSentryVariant>& data) override;
virtual TMap<FString, FSentryVariant> GetData() const override;
virtual void SetLevel(ESentryLevel level) override;
virtual ESentryLevel GetLevel() const override;

Expand Down
Loading