diff --git a/CHANGELOG.md b/CHANGELOG.md index a1f77ed4c76..dd4cf00059e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # vNext +* Improve Kotlin compatibility for SdkVersion * Feat: Support logging via JUL (#1211) # 4.0.0 diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 931bc1928eb..09317564bd7 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -45,13 +45,10 @@ public SentryAndroidOptions() { private @NotNull SdkVersion createSdkVersion() { SdkVersion sdkVersion = getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } + final String name = BuildConfig.SENTRY_ANDROID_SDK_NAME; + final String version = BuildConfig.VERSION_NAME; + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); - sdkVersion.setName(BuildConfig.SENTRY_ANDROID_SDK_NAME); - String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); sdkVersion.addPackage("maven:sentry-android-core", version); return sdkVersion; diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 2744d4fcd26..62a0d0eb57e 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -237,13 +237,10 @@ public void close() throws SecurityException { private @NotNull SdkVersion createSdkVersion(final @NotNull SentryOptions sentryOptions) { SdkVersion sdkVersion = sentryOptions.getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } - - sdkVersion.setName(BuildConfig.SENTRY_JUL_SDK_NAME); + final String name = BuildConfig.SENTRY_JUL_SDK_NAME; final String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); + + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); sdkVersion.addPackage("maven:sentry-jul", version); return sdkVersion; diff --git a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java index 9d4fa460aad..6461c49e431 100644 --- a/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java +++ b/sentry-log4j2/src/main/java/io/sentry/log4j2/SentryAppender.java @@ -205,13 +205,10 @@ public void append(final @NotNull LogEvent eventObject) { private @NotNull SdkVersion createSdkVersion(final @NotNull SentryOptions sentryOptions) { SdkVersion sdkVersion = sentryOptions.getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } - - sdkVersion.setName(BuildConfig.SENTRY_LOG4J2_SDK_NAME); + final String name = BuildConfig.SENTRY_LOG4J2_SDK_NAME; final String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); + sdkVersion.addPackage("maven:sentry-log4j2", version); return sdkVersion; diff --git a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java index cd94b714067..dce782fd3b4 100644 --- a/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java +++ b/sentry-logback/src/main/java/io/sentry/logback/SentryAppender.java @@ -140,13 +140,10 @@ protected void append(@NotNull ILoggingEvent eventObject) { private @NotNull SdkVersion createSdkVersion(@NotNull SentryOptions sentryOptions) { SdkVersion sdkVersion = sentryOptions.getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } - - sdkVersion.setName(BuildConfig.SENTRY_LOGBACK_SDK_NAME); + final String name = BuildConfig.SENTRY_LOGBACK_SDK_NAME; final String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); + sdkVersion.addPackage("maven:sentry-logback", version); return sdkVersion; diff --git a/sentry-spring-boot-starter/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java b/sentry-spring-boot-starter/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java index ab1aafa510c..308a35b760e 100644 --- a/sentry-spring-boot-starter/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java +++ b/sentry-spring-boot-starter/src/main/java/io/sentry/spring/boot/SentryAutoConfiguration.java @@ -237,13 +237,10 @@ static class ApacheHttpClientTransportFactoryAutoconfiguration { final @NotNull SentryOptions sentryOptions) { SdkVersion sdkVersion = sentryOptions.getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } - - sdkVersion.setName(BuildConfig.SENTRY_SPRING_BOOT_SDK_NAME); + final String name = BuildConfig.SENTRY_SPRING_BOOT_SDK_NAME; final String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); + sdkVersion.addPackage("maven:sentry-spring-boot-starter", version); return sdkVersion; diff --git a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java index 1042bc890e6..4c8aeb2dd20 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java +++ b/sentry-spring/src/main/java/io/sentry/spring/SentryHubRegistrar.java @@ -73,13 +73,10 @@ private void registerSentryExceptionResolver( final SentryOptions defaultOptions = new SentryOptions(); SdkVersion sdkVersion = defaultOptions.getSdkVersion(); - if (sdkVersion == null) { - sdkVersion = new SdkVersion(); - } - - sdkVersion.setName(BuildConfig.SENTRY_SPRING_SDK_NAME); + final String name = BuildConfig.SENTRY_SPRING_SDK_NAME; final String version = BuildConfig.VERSION_NAME; - sdkVersion.setVersion(version); + sdkVersion = SdkVersion.updateSdkVersion(sdkVersion, name, version); + sdkVersion.addPackage("maven:sentry-spring", version); return sdkVersion; diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 187efe49d34..950b9a76ae2 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -1482,6 +1482,7 @@ public final class io/sentry/protocol/SdkInfo : io/sentry/IUnknownPropertiesCons public final class io/sentry/protocol/SdkVersion : io/sentry/IUnknownPropertiesConsumer { public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V public fun acceptUnknownProperties (Ljava/util/Map;)V public fun addIntegration (Ljava/lang/String;)V public fun addPackage (Ljava/lang/String;Ljava/lang/String;)V @@ -1491,6 +1492,7 @@ public final class io/sentry/protocol/SdkVersion : io/sentry/IUnknownPropertiesC public fun getVersion ()Ljava/lang/String; public fun setName (Ljava/lang/String;)V public fun setVersion (Ljava/lang/String;)V + public static fun updateSdkVersion (Lio/sentry/protocol/SdkVersion;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/protocol/SdkVersion; } public final class io/sentry/protocol/SentryException : io/sentry/IUnknownPropertiesConsumer { @@ -1522,6 +1524,7 @@ public final class io/sentry/protocol/SentryId { public final class io/sentry/protocol/SentryPackage : io/sentry/IUnknownPropertiesConsumer { public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V public fun acceptUnknownProperties (Ljava/util/Map;)V public fun getName ()Ljava/lang/String; public fun getVersion ()Ljava/lang/String; diff --git a/sentry/src/main/java/io/sentry/SentryEnvelopeHeaderAdapter.java b/sentry/src/main/java/io/sentry/SentryEnvelopeHeaderAdapter.java index e0266bb8ef9..4944729a94e 100644 --- a/sentry/src/main/java/io/sentry/SentryEnvelopeHeaderAdapter.java +++ b/sentry/src/main/java/io/sentry/SentryEnvelopeHeaderAdapter.java @@ -11,12 +11,14 @@ import java.util.List; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public final class SentryEnvelopeHeaderAdapter extends TypeAdapter { @Override - public void write(JsonWriter writer, SentryEnvelopeHeader value) throws IOException { + public void write(final @NotNull JsonWriter writer, final @Nullable SentryEnvelopeHeader value) + throws IOException { if (value == null) { writer.nullValue(); return; @@ -88,8 +90,9 @@ private boolean hasValidSdkVersion(final @NotNull SdkVersion sdkVersion) { && !sdkVersion.getVersion().isEmpty(); } + @SuppressWarnings("deprecation") @Override - public SentryEnvelopeHeader read(JsonReader reader) throws IOException { + public @Nullable SentryEnvelopeHeader read(final @NotNull JsonReader reader) throws IOException { if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return null; @@ -121,7 +124,10 @@ public SentryEnvelopeHeader read(JsonReader reader) throws IOException { reader.beginArray(); while (reader.hasNext()) { - sdkVersion.addIntegration(reader.nextString()); + final String integration = reader.nextString(); + if (integration != null) { + sdkVersion.addIntegration(integration); + } } reader.endArray(); break; @@ -147,7 +153,10 @@ public SentryEnvelopeHeader read(JsonReader reader) throws IOException { reader.skipValue(); } } - sdkVersion.addPackage(name, version); + // packages should not contain null names or versions + if (name != null && version != null) { + sdkVersion.addPackage(name, version); + } // packages item reader.endObject(); diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 7a96fc4b147..a766bead90f 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -1325,10 +1325,9 @@ void merge(final @NotNull SentryOptions options) { } private @NotNull SdkVersion createSdkVersion() { - final SdkVersion sdkVersion = new SdkVersion(); + final String version = BuildConfig.VERSION_NAME; + final SdkVersion sdkVersion = new SdkVersion(BuildConfig.SENTRY_JAVA_SDK_NAME, version); - sdkVersion.setName(BuildConfig.SENTRY_JAVA_SDK_NAME); - String version = BuildConfig.VERSION_NAME; sdkVersion.setVersion(version); sdkVersion.addPackage("maven:sentry", version); diff --git a/sentry/src/main/java/io/sentry/protocol/SdkVersion.java b/sentry/src/main/java/io/sentry/protocol/SdkVersion.java index 886595c532b..6b7ef32bbac 100644 --- a/sentry/src/main/java/io/sentry/protocol/SdkVersion.java +++ b/sentry/src/main/java/io/sentry/protocol/SdkVersion.java @@ -1,10 +1,12 @@ package io.sentry.protocol; import io.sentry.IUnknownPropertiesConsumer; +import io.sentry.util.Objects; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -23,7 +25,7 @@ public final class SdkVersion implements IUnknownPropertiesConsumer { *

Official Sentry SDKs use the entity `sentry`, as in `sentry.python` or * `sentry.javascript.react-native`. Please use a different entity for your own SDKs. */ - private String name; + private @NotNull String name; /** * The version of the SDK. _Required._ * @@ -32,7 +34,7 @@ public final class SdkVersion implements IUnknownPropertiesConsumer { * *

Examples: `0.1.0`, `1.0.0`, `4.3.12` */ - private String version; + private @NotNull String version; /** * List of installed and loaded SDK packages. _Optional._ * @@ -41,7 +43,7 @@ public final class SdkVersion implements IUnknownPropertiesConsumer { * is a Git repository, the `source` should be `git`, the identifier should be a checkout link and * the version should be a Git reference (branch, tag or SHA). */ - private List packages; + private @Nullable List packages; /** * List of integrations that are enabled in the SDK. _Optional._ * @@ -49,38 +51,55 @@ public final class SdkVersion implements IUnknownPropertiesConsumer { * integrations are included because different SDK releases may contain different default * integrations. */ - private List integrations; + private @Nullable List integrations; @SuppressWarnings("unused") - private Map unknown; + private @Nullable Map unknown; - public String getVersion() { + public SdkVersion(final @NotNull String name, final @NotNull String version) { + this.name = Objects.requireNonNull(name, "name is required."); + this.version = Objects.requireNonNull(version, "version is required."); + } + + /** + * @deprecated + *

Use {@link SdkVersion#SdkVersion(String, String)} instead. + */ + @Deprecated + public SdkVersion() { + this("", ""); + } + + public @NotNull String getVersion() { return version; } - public void setVersion(String version) { - this.version = version; + public void setVersion(final @NotNull String version) { + this.version = Objects.requireNonNull(version, "version is required."); } - public String getName() { + public @NotNull String getName() { return name; } - public void setName(String name) { - this.name = name; + public void setName(final @NotNull String name) { + this.name = Objects.requireNonNull(name, "name is required."); } - public void addPackage(String name, String version) { - SentryPackage newPackage = new SentryPackage(); - newPackage.setName(name); - newPackage.setVersion(version); + public void addPackage(final @NotNull String name, final @NotNull String version) { + Objects.requireNonNull(name, "name is required."); + Objects.requireNonNull(version, "version is required."); + + SentryPackage newPackage = new SentryPackage(name, version); if (packages == null) { packages = new ArrayList<>(); } packages.add(newPackage); } - public void addIntegration(String integration) { + public void addIntegration(final @NotNull String integration) { + Objects.requireNonNull(integration, "integration is required."); + if (integrations == null) { integrations = new ArrayList<>(); } @@ -89,7 +108,7 @@ public void addIntegration(String integration) { @ApiStatus.Internal @Override - public void acceptUnknownProperties(Map unknown) { + public void acceptUnknownProperties(final @Nullable Map unknown) { this.unknown = unknown; } @@ -100,4 +119,26 @@ public void acceptUnknownProperties(Map unknown) { public @Nullable List getIntegrations() { return integrations; } + + /** + * Updates the Sdk name and version or create a new one with the given values + * + * @param sdk the SdkVersion object or null + * @param name the sdk name + * @param version the sdk version + * @return the SdkVersion + */ + public static @NotNull SdkVersion updateSdkVersion( + @Nullable SdkVersion sdk, final @NotNull String name, final @NotNull String version) { + Objects.requireNonNull(name, "name is required."); + Objects.requireNonNull(version, "version is required."); + + if (sdk == null) { + sdk = new SdkVersion(name, version); + } else { + sdk.setName(name); + sdk.setVersion(version); + } + return sdk; + } } diff --git a/sentry/src/main/java/io/sentry/protocol/SentryPackage.java b/sentry/src/main/java/io/sentry/protocol/SentryPackage.java index a67b4a1aa52..b77d45ce659 100644 --- a/sentry/src/main/java/io/sentry/protocol/SentryPackage.java +++ b/sentry/src/main/java/io/sentry/protocol/SentryPackage.java @@ -1,38 +1,55 @@ package io.sentry.protocol; import io.sentry.IUnknownPropertiesConsumer; +import io.sentry.util.Objects; import java.util.Map; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** An installed and loaded package as part of the Sentry SDK. */ public final class SentryPackage implements IUnknownPropertiesConsumer { /** Name of the package. */ - private String name; + private @NotNull String name; /** Version of the package. */ - private String version; + private @NotNull String version; @SuppressWarnings("unused") - private Map unknown; + private @Nullable Map unknown; - public String getName() { + public SentryPackage(final @NotNull String name, final @NotNull String version) { + this.name = Objects.requireNonNull(name, "name is required."); + this.version = Objects.requireNonNull(version, "version is required."); + } + + /** + * @deprecated + *

Use {@link SentryPackage#SentryPackage(String, String)} instead. + */ + @Deprecated + public SentryPackage() { + this("", ""); + } + + public @NotNull String getName() { return name; } - public void setName(String name) { - this.name = name; + public void setName(final @NotNull String name) { + this.name = Objects.requireNonNull(name, "name is required."); } - public String getVersion() { + public @NotNull String getVersion() { return version; } - public void setVersion(String version) { - this.version = version; + public void setVersion(final @NotNull String version) { + this.version = Objects.requireNonNull(version, "version is required."); } @ApiStatus.Internal @Override - public void acceptUnknownProperties(Map unknown) { + public void acceptUnknownProperties(final @Nullable Map unknown) { this.unknown = unknown; } }