Skip to content

Commit

Permalink
Redefine Java enums
Browse files Browse the repository at this point in the history
  • Loading branch information
mattjohnsonpint committed Jun 8, 2022
1 parent f3a3fdd commit 28b3e43
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 76 deletions.
71 changes: 1 addition & 70 deletions src/Sentry/Android/JavaExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,81 +5,12 @@ namespace Sentry.Android
{
internal static class JavaExtensions
{
public static SentryLevel ToSentryLevel(this Java.SentryLevel level)
{
// note: switch doesn't work here because JNI enums are not constants
if (level == Java.SentryLevel.Debug)
return SentryLevel.Debug;
if (level == Java.SentryLevel.Info)
return SentryLevel.Info;
if (level == Java.SentryLevel.Warning)
return SentryLevel.Warning;
if (level == Java.SentryLevel.Error)
return SentryLevel.Error;
if (level == Java.SentryLevel.Fatal)
return SentryLevel.Fatal;

throw new ArgumentOutOfRangeException(nameof(level), level, message: default);
}

public static Java.SentryLevel ToJavaSentryLevel(this SentryLevel level) =>
level switch
{
SentryLevel.Debug => Java.SentryLevel.Debug!,
SentryLevel.Info => Java.SentryLevel.Info!,
SentryLevel.Warning => Java.SentryLevel.Warning!,
SentryLevel.Error => Java.SentryLevel.Error!,
SentryLevel.Fatal => Java.SentryLevel.Fatal!,
_ => throw new ArgumentOutOfRangeException(nameof(level), level, message: default)
};

public static SentryId ToSentryId(this Java.Protocol.SentryId sentryId) =>
new(Guid.Parse(sentryId.ToString()));

public static SpanId ToSpanId(this Java.SpanId spanId) =>
new(spanId.ToString());

public static SpanStatus ToSpanStatus(this Java.SpanStatus status)
{
// note: switch doesn't work here because JNI enums are not constants
if (status == Java.SpanStatus.Ok)
return SpanStatus.Ok;
if (status == Java.SpanStatus.DeadlineExceeded)
return SpanStatus.DeadlineExceeded;
if (status == Java.SpanStatus.Unauthenticated)
return SpanStatus.Unauthenticated;
if (status == Java.SpanStatus.PermissionDenied)
return SpanStatus.PermissionDenied;
if (status == Java.SpanStatus.NotFound)
return SpanStatus.NotFound;
if (status == Java.SpanStatus.ResourceExhausted)
return SpanStatus.ResourceExhausted;
if (status == Java.SpanStatus.InvalidArgument)
return SpanStatus.InvalidArgument;
if (status == Java.SpanStatus.Unimplemented)
return SpanStatus.Unimplemented;
if (status == Java.SpanStatus.Unavailable)
return SpanStatus.Unavailable;
if (status == Java.SpanStatus.InternalError)
return SpanStatus.InternalError;
if (status == Java.SpanStatus.UnknownError)
return SpanStatus.UnknownError;
if (status == Java.SpanStatus.Cancelled)
return SpanStatus.Cancelled;
if (status == Java.SpanStatus.AlreadyExists)
return SpanStatus.AlreadyExists;
if (status == Java.SpanStatus.FailedPrecondition)
return SpanStatus.FailedPrecondition;
if (status == Java.SpanStatus.Aborted)
return SpanStatus.Aborted;
if (status == Java.SpanStatus.OutOfRange)
return SpanStatus.OutOfRange;
if (status == Java.SpanStatus.DataLoss)
return SpanStatus.DataLoss;

throw new ArgumentOutOfRangeException(nameof(status), status, message: default);
}

public static SentryEvent ToSentryEvent(this Java.SentryEvent sentryEvent, Java.SentryOptions javaOptions)
{
using var stream = new MemoryStream();
Expand Down Expand Up @@ -144,7 +75,7 @@ public static TransactionSamplingContext ToTransactionSamplingContext(this Java.
tc.Name,
tc.Operation,
tc.Description,
tc.Status?.ToSpanStatus(),
(SpanStatus)tc.Status,
tc.Sampled?.BooleanValue(),
tc.ParentSampled?.BooleanValue());

Expand Down
10 changes: 5 additions & 5 deletions src/Sentry/Android/JavaLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ internal class JavaLogger : JavaObject, Java.ILogger
public JavaLogger(SentryOptions options) => _options = options;

public void Log(Java.SentryLevel level, string message, JavaObject[]? args) =>
_options.DiagnosticLogger?.Log(level.ToSentryLevel(), message, null, args?.Cast<object?>());
_options.DiagnosticLogger?.Log((SentryLevel)level, message, null, args?.Cast<object?>());

public void Log(Java.SentryLevel level, string message, Throwable? throwable) =>
_options.DiagnosticLogger?.Log(level.ToSentryLevel(), message, throwable);
_options.DiagnosticLogger?.Log((SentryLevel)level, message, throwable);

public void Log(Java.SentryLevel level, Throwable? throwable, string message, params JavaObject[]? args) =>
_options.DiagnosticLogger?.Log(level.ToSentryLevel(), message, throwable, args?.Cast<object?>());
_options.DiagnosticLogger?.Log((SentryLevel)level, message, throwable, args?.Cast<object?>());

public bool IsEnabled(Java.SentryLevel? level) =>
level != null && _options.DiagnosticLogger?.IsEnabled(level.ToSentryLevel()) == true;
public bool IsEnabled(Java.SentryLevel level) =>
_options.DiagnosticLogger?.IsEnabled((SentryLevel)level) == true;
}
}
2 changes: 1 addition & 1 deletion src/Sentry/Android/SentrySdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public static IDisposable Init(AndroidContext context, SentryOptions options)
// These options are copied over from our SentryOptions
o.AttachStacktrace = options.AttachStacktrace;
o.Debug = options.Debug;
o.DiagnosticLevel = options.DiagnosticLevel.ToJavaSentryLevel();
o.DiagnosticLevel = (Java.SentryLevel)options.DiagnosticLevel;
o.Dsn = options.Dsn;
o.EnableAutoSessionTracking = options.AutoSessionTracking;
o.Environment = options.Environment;
Expand Down
47 changes: 47 additions & 0 deletions src/Sentry/Android/Transforms/EnumFields.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<enum-field-mappings>
<!--
By default, Java enums will be generated as C# classes deriving from Java.Lang.Enum.
Redefining them here will make them actual C# enums. However, we also need to prevent
the original class objects from being generated. We do that in the Metadata.xml file,
by setting the visibility to "" on the class api node, for each enum defined here.
Reference: https://docs.microsoft.com/xamarin/android/platform/binding-java-library/customizing-bindings/java-bindings-metadata#enumfieldsxml-and-enummethodsxml
Note that we do not use the EnumMethods.xml file described in the doc to update usage,
but rather we handle that in Metadata.xml also. This allows us to update all usages
of the enum, rather than having to map each usage individually.
Also, it's important that the integer values match those of our existing C# equivalents
so that we can easily cast between them in our code.
-->

<mapping jni-class="io/sentry/SentryLevel" clr-enum-type="Sentry.Java.SentryLevel">
<field jni-name="DEBUG" clr-name="Debug" value="0" />
<field jni-name="INFO" clr-name="Info" value="1" />
<field jni-name="WARNING" clr-name="Warning" value="2" />
<field jni-name="ERROR" clr-name="Error" value="3" />
<field jni-name="FATAL" clr-name="Fatal" value="4" />
</mapping>

<mapping jni-class="io/sentry/SpanStatus" clr-enum-type="Sentry.Java.SpanStatus">
<field jni-name="OK" clr-name="Ok" value="0" />
<field jni-name="DEADLINE_EXCEEDED" clr-name="DeadlineExceeded" value="1" />
<field jni-name="UNAUTHENTICATED" clr-name="Unauthenticated" value="2" />
<field jni-name="PERMISSION_DENIED" clr-name="PermissionDenied" value="3" />
<field jni-name="NOT_FOUND" clr-name="NotFound" value="4" />
<field jni-name="RESOURCE_EXHAUSTED" clr-name="ResourceExhausted" value="5" />
<field jni-name="INVALID_ARGUMENT" clr-name="InvalidArgument" value="6" />
<field jni-name="UNIMPLEMENTED" clr-name="Unimplemented" value="7" />
<field jni-name="UNAVAILABLE" clr-name="Unavailable" value="8" />
<field jni-name="INTERNAL_ERROR" clr-name="InternalError" value="9" />
<field jni-name="UNKNOWN" clr-name="Unknown" value="10" />
<field jni-name="UNKNOWN_ERROR" clr-name="UnknownError" value="10" />
<field jni-name="CANCELLED" clr-name="Cancelled" value="11" />
<field jni-name="ALREADY_EXISTS" clr-name="AlreadyExists" value="12" />
<field jni-name="FAILED_PRECONDITION" clr-name="FailedPrecondition" value="13" />
<field jni-name="ABORTED" clr-name="Aborted" value="14" />
<field jni-name="OUT_OF_RANGE" clr-name="OutOfRange" value="15" />
<field jni-name="DATA_LOSS" clr-name="DataLoss" value="16" />
</mapping>

</enum-field-mappings>
9 changes: 9 additions & 0 deletions src/Sentry/Android/Transforms/Metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@
<attr path="/api/package[@name='io.sentry']/class[@name='SentryTraceHeader']/field[@name='SENTRY_TRACE_HEADER']" name="managedName">SentryTraceHeaderName</attr>
<attr path="/api/package[@name='io.sentry']/class[@name='TraceStateHeader']/field[@name='TRACE_STATE_HEADER']" name="managedName">TraceStateHeaderName</attr>

<!-- Adjust enums and their usages. See comments in EnumFields.xml -->
<attr path="/api/package[@name='io.sentry']/class[@name='SentryLevel']" name="visibility" />
<attr path="//*[@type='io.sentry.SentryLevel']" name="enumType">Sentry.Java.SentryLevel</attr>
<attr path="//*[@return='io.sentry.SentryLevel']" name="enumReturn">Sentry.Java.SentryLevel</attr>

<attr path="/api/package[@name='io.sentry']/class[@name='SpanStatus']" name="visibility" />
<attr path="//*[@type='io.sentry.SpanStatus']" name="enumType">Sentry.Java.SpanStatus</attr>
<attr path="//*[@return='io.sentry.SpanStatus']" name="enumReturn">Sentry.Java.SpanStatus</attr>

<!--
The remaining APIS are removed to prevent various errors/warnings.
TODO: Find other workarounds for each one, rather than removing the APIs.
Expand Down

0 comments on commit 28b3e43

Please sign in to comment.