Skip to content
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# vNext

* Improve Kotlin compatibility for SdkVersion
* Feat: Support logging via JUL (#1211)

# 4.0.0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 3 additions & 6 deletions sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -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 <init> ()V
public fun <init> (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
Expand All @@ -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 {
Expand Down Expand Up @@ -1522,6 +1524,7 @@ public final class io/sentry/protocol/SentryId {

public final class io/sentry/protocol/SentryPackage : io/sentry/IUnknownPropertiesConsumer {
public fun <init> ()V
public fun <init> (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;
Expand Down
17 changes: 13 additions & 4 deletions sentry/src/main/java/io/sentry/SentryEnvelopeHeaderAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<SentryEnvelopeHeader> {

@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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand Down
5 changes: 2 additions & 3 deletions sentry/src/main/java/io/sentry/SentryOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
75 changes: 58 additions & 17 deletions sentry/src/main/java/io/sentry/protocol/SdkVersion.java
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand All @@ -23,7 +25,7 @@ public final class SdkVersion implements IUnknownPropertiesConsumer {
* <p>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;
Comment thread
marandaneto marked this conversation as resolved.
private @NotNull String name;
/**
* The version of the SDK. _Required._
*
Expand All @@ -32,7 +34,7 @@ public final class SdkVersion implements IUnknownPropertiesConsumer {
*
* <p>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._
*
Expand All @@ -41,46 +43,63 @@ 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<SentryPackage> packages;
private @Nullable List<SentryPackage> packages;
/**
* List of integrations that are enabled in the SDK. _Optional._
*
* <p>The list should have all enabled integrations, including default integrations. Default
* integrations are included because different SDK releases may contain different default
* integrations.
*/
private List<String> integrations;
private @Nullable List<String> integrations;

@SuppressWarnings("unused")
private Map<String, Object> unknown;
private @Nullable Map<String, Object> 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
* <p>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<>();
}
Expand All @@ -89,7 +108,7 @@ public void addIntegration(String integration) {

@ApiStatus.Internal
@Override
public void acceptUnknownProperties(Map<String, Object> unknown) {
public void acceptUnknownProperties(final @Nullable Map<String, Object> unknown) {
this.unknown = unknown;
}

Expand All @@ -100,4 +119,26 @@ public void acceptUnknownProperties(Map<String, Object> unknown) {
public @Nullable List<String> 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;
}
}
Loading