|
19 | 19 | import io.sentry.transport.ITransportGate; |
20 | 20 | import io.sentry.transport.NoOpEnvelopeCache; |
21 | 21 | import io.sentry.transport.NoOpTransportGate; |
| 22 | +import io.sentry.util.Objects; |
22 | 23 | import io.sentry.util.Platform; |
23 | 24 | import io.sentry.util.SampleRateUtils; |
24 | 25 | import io.sentry.util.StringUtils; |
25 | 26 | import io.sentry.util.thread.IMainThreadChecker; |
26 | 27 | import io.sentry.util.thread.NoOpMainThreadChecker; |
27 | 28 | import java.io.File; |
28 | | -import java.net.Proxy; |
29 | 29 | import java.util.ArrayList; |
30 | 30 | import java.util.Collections; |
31 | 31 | import java.util.HashMap; |
@@ -119,10 +119,14 @@ public class SentryOptions { |
119 | 119 | private @NotNull SentryLevel diagnosticLevel = DEFAULT_DIAGNOSTIC_LEVEL; |
120 | 120 |
|
121 | 121 | /** Envelope reader interface */ |
122 | | - private @NotNull IEnvelopeReader envelopeReader = new EnvelopeReader(new JsonSerializer(this)); |
| 122 | + private volatile @Nullable IEnvelopeReader envelopeReader; |
| 123 | + |
| 124 | + private final @NotNull Object envelopeReaderLock = new Object(); |
123 | 125 |
|
124 | 126 | /** Serializer interface to serialize/deserialize json events */ |
125 | | - private @NotNull ISerializer serializer = new JsonSerializer(this); |
| 127 | + private volatile @Nullable ISerializer serializer; |
| 128 | + |
| 129 | + private final @NotNull Object serializerLock = new Object(); |
126 | 130 |
|
127 | 131 | /** Max depth when serializing object graphs with reflection. * */ |
128 | 132 | private int maxDepth = 100; |
@@ -416,7 +420,9 @@ public class SentryOptions { |
416 | 420 |
|
417 | 421 | /** Date provider to retrieve the current date from. */ |
418 | 422 | @ApiStatus.Internal |
419 | | - private @NotNull SentryDateProvider dateProvider = new SentryAutoDateProvider(); |
| 423 | + private volatile @Nullable SentryDateProvider dateProvider; |
| 424 | + |
| 425 | + private final @NotNull Object dateProviderLock = new Object(); |
420 | 426 |
|
421 | 427 | private final @NotNull List<IPerformanceCollector> performanceCollectors = new ArrayList<>(); |
422 | 428 |
|
@@ -479,7 +485,7 @@ public class SentryOptions { |
479 | 485 |
|
480 | 486 | @ApiStatus.Experimental private @Nullable Cron cron = null; |
481 | 487 |
|
482 | | - private final @NotNull ExperimentalOptions experimental = new ExperimentalOptions(); |
| 488 | + private final @NotNull ExperimentalOptions experimental; |
483 | 489 |
|
484 | 490 | private @NotNull ReplayController replayController = NoOpReplayController.getInstance(); |
485 | 491 |
|
@@ -605,7 +611,14 @@ public void setDiagnosticLevel(@Nullable final SentryLevel diagnosticLevel) { |
605 | 611 | * @return the serializer |
606 | 612 | */ |
607 | 613 | public @NotNull ISerializer getSerializer() { |
608 | | - return serializer; |
| 614 | + if (serializer == null) { |
| 615 | + synchronized (serializerLock) { |
| 616 | + if (serializer == null) { |
| 617 | + serializer = new JsonSerializer(this); |
| 618 | + } |
| 619 | + } |
| 620 | + } |
| 621 | + return Objects.requireNonNull(serializer, "Serializer was null"); |
609 | 622 | } |
610 | 623 |
|
611 | 624 | /** |
@@ -636,7 +649,14 @@ public void setMaxDepth(int maxDepth) { |
636 | 649 | } |
637 | 650 |
|
638 | 651 | public @NotNull IEnvelopeReader getEnvelopeReader() { |
639 | | - return envelopeReader; |
| 652 | + if (envelopeReader == null) { |
| 653 | + synchronized (envelopeReaderLock) { |
| 654 | + if (envelopeReader == null) { |
| 655 | + envelopeReader = new EnvelopeReader(getSerializer()); |
| 656 | + } |
| 657 | + } |
| 658 | + } |
| 659 | + return Objects.requireNonNull(envelopeReader, "EnvelopeReader was null"); |
640 | 660 | } |
641 | 661 |
|
642 | 662 | public void setEnvelopeReader(final @Nullable IEnvelopeReader envelopeReader) { |
@@ -2212,7 +2232,14 @@ public void setIgnoredCheckIns(final @Nullable List<String> ignoredCheckIns) { |
2212 | 2232 | /** Returns the current {@link SentryDateProvider} that is used to retrieve the current date. */ |
2213 | 2233 | @ApiStatus.Internal |
2214 | 2234 | public @NotNull SentryDateProvider getDateProvider() { |
2215 | | - return dateProvider; |
| 2235 | + if (dateProvider == null) { |
| 2236 | + synchronized (dateProviderLock) { |
| 2237 | + if (dateProvider == null) { |
| 2238 | + dateProvider = new SentryAutoDateProvider(); |
| 2239 | + } |
| 2240 | + } |
| 2241 | + } |
| 2242 | + return Objects.requireNonNull(dateProvider, "DateProvider is not set"); |
2216 | 2243 | } |
2217 | 2244 |
|
2218 | 2245 | /** |
@@ -2540,6 +2567,7 @@ public SentryOptions() { |
2540 | 2567 | * @param empty if options should be empty. |
2541 | 2568 | */ |
2542 | 2569 | private SentryOptions(final boolean empty) { |
| 2570 | + experimental = new ExperimentalOptions(empty); |
2543 | 2571 | if (!empty) { |
2544 | 2572 | // SentryExecutorService should be initialized before any |
2545 | 2573 | // SendCachedEventFireAndForgetIntegration |
|
0 commit comments