Skip to content
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- fix: add overflow check in `TimeBounds.expiresAfter()` to prevent integer overflow when timeout is too large.
- fix: add validation for `ManageDataOperation` value length to ensure it does not exceed 64 bytes.
- fix: use `StandardCharsets.UTF_8` explicitly when converting byte arrays to strings to ensure consistent behavior across different platforms.
- refactor: use static initialization for `GsonSingleton` to ensure thread safety.

## 2.2.1

Expand Down
94 changes: 45 additions & 49 deletions src/main/java/org/stellar/sdk/responses/gson/GsonSingleton.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,58 +26,54 @@
* <p>Usually, you shouldn't need to use this class directly.
*/
public class GsonSingleton {
private static Gson instance = null;
private static final Gson INSTANCE = createInstance();

protected GsonSingleton() {}
private GsonSingleton() {}

public static Gson getInstance() {
if (instance == null) {
TypeToken<Page<AccountResponse>> accountPageType = new TypeToken<Page<AccountResponse>>() {};
TypeToken<Page<AssetResponse>> assetPageType = new TypeToken<Page<AssetResponse>>() {};
TypeToken<Page<EffectResponse>> effectPageType = new TypeToken<Page<EffectResponse>>() {};
TypeToken<Page<LedgerResponse>> ledgerPageType = new TypeToken<Page<LedgerResponse>>() {};
TypeToken<Page<LiquidityPoolResponse>> liquidityPoolPageType =
new TypeToken<Page<LiquidityPoolResponse>>() {};
TypeToken<Page<OfferResponse>> offerPageType = new TypeToken<Page<OfferResponse>>() {};
TypeToken<Page<OperationResponse>> operationPageType =
new TypeToken<Page<OperationResponse>>() {};
TypeToken<Page<PathResponse>> pathPageType = new TypeToken<Page<PathResponse>>() {};
TypeToken<Page<TradeResponse>> tradePageType = new TypeToken<Page<TradeResponse>>() {};
TypeToken<Page<TradeAggregationResponse>> tradeAggregationPageType =
new TypeToken<Page<TradeAggregationResponse>>() {};
TypeToken<Page<TransactionResponse>> transactionPageType =
new TypeToken<Page<TransactionResponse>>() {};
TypeToken<Page<ClaimableBalanceResponse>> claimableBalancePageType =
new TypeToken<Page<ClaimableBalanceResponse>>() {};
return INSTANCE;
}

private static Gson createInstance() {
TypeToken<Page<AccountResponse>> accountPageType = new TypeToken<Page<AccountResponse>>() {};
TypeToken<Page<AssetResponse>> assetPageType = new TypeToken<Page<AssetResponse>>() {};
TypeToken<Page<EffectResponse>> effectPageType = new TypeToken<Page<EffectResponse>>() {};
TypeToken<Page<LedgerResponse>> ledgerPageType = new TypeToken<Page<LedgerResponse>>() {};
TypeToken<Page<LiquidityPoolResponse>> liquidityPoolPageType =
new TypeToken<Page<LiquidityPoolResponse>>() {};
TypeToken<Page<OfferResponse>> offerPageType = new TypeToken<Page<OfferResponse>>() {};
TypeToken<Page<OperationResponse>> operationPageType =
new TypeToken<Page<OperationResponse>>() {};
TypeToken<Page<PathResponse>> pathPageType = new TypeToken<Page<PathResponse>>() {};
TypeToken<Page<TradeResponse>> tradePageType = new TypeToken<Page<TradeResponse>>() {};
TypeToken<Page<TradeAggregationResponse>> tradeAggregationPageType =
new TypeToken<Page<TradeAggregationResponse>>() {};
TypeToken<Page<TransactionResponse>> transactionPageType =
new TypeToken<Page<TransactionResponse>>() {};
TypeToken<Page<ClaimableBalanceResponse>> claimableBalancePageType =
new TypeToken<Page<ClaimableBalanceResponse>>() {};

instance =
new GsonBuilder()
.registerTypeAdapter(Asset.class, new AssetDeserializer())
.registerTypeAdapter(Predicate.class, new PredicateDeserializer())
.registerTypeAdapter(OperationResponse.class, new OperationDeserializer())
.registerTypeAdapter(EffectResponse.class, new EffectDeserializer())
.registerTypeAdapter(
accountPageType.getType(), new PageDeserializer<>(accountPageType))
.registerTypeAdapter(assetPageType.getType(), new PageDeserializer<>(assetPageType))
.registerTypeAdapter(effectPageType.getType(), new PageDeserializer<>(effectPageType))
.registerTypeAdapter(ledgerPageType.getType(), new PageDeserializer<>(ledgerPageType))
.registerTypeAdapter(
liquidityPoolPageType.getType(), new PageDeserializer<>(liquidityPoolPageType))
.registerTypeAdapter(offerPageType.getType(), new PageDeserializer<>(offerPageType))
.registerTypeAdapter(
operationPageType.getType(), new PageDeserializer<>(operationPageType))
.registerTypeAdapter(pathPageType.getType(), new PageDeserializer<>(pathPageType))
.registerTypeAdapter(tradePageType.getType(), new PageDeserializer<>(tradePageType))
.registerTypeAdapter(
tradeAggregationPageType.getType(),
new PageDeserializer<>(tradeAggregationPageType))
.registerTypeAdapter(
transactionPageType.getType(), new PageDeserializer<>(transactionPageType))
.registerTypeAdapter(
claimableBalancePageType.getType(),
new PageDeserializer<>(claimableBalancePageType))
.create();
}
return instance;
return new GsonBuilder()
.registerTypeAdapter(Asset.class, new AssetDeserializer())
.registerTypeAdapter(Predicate.class, new PredicateDeserializer())
.registerTypeAdapter(OperationResponse.class, new OperationDeserializer())
.registerTypeAdapter(EffectResponse.class, new EffectDeserializer())
.registerTypeAdapter(accountPageType.getType(), new PageDeserializer<>(accountPageType))
.registerTypeAdapter(assetPageType.getType(), new PageDeserializer<>(assetPageType))
.registerTypeAdapter(effectPageType.getType(), new PageDeserializer<>(effectPageType))
.registerTypeAdapter(ledgerPageType.getType(), new PageDeserializer<>(ledgerPageType))
.registerTypeAdapter(
liquidityPoolPageType.getType(), new PageDeserializer<>(liquidityPoolPageType))
.registerTypeAdapter(offerPageType.getType(), new PageDeserializer<>(offerPageType))
.registerTypeAdapter(operationPageType.getType(), new PageDeserializer<>(operationPageType))
.registerTypeAdapter(pathPageType.getType(), new PageDeserializer<>(pathPageType))
.registerTypeAdapter(tradePageType.getType(), new PageDeserializer<>(tradePageType))
.registerTypeAdapter(
tradeAggregationPageType.getType(), new PageDeserializer<>(tradeAggregationPageType))
.registerTypeAdapter(
transactionPageType.getType(), new PageDeserializer<>(transactionPageType))
.registerTypeAdapter(
claimableBalancePageType.getType(), new PageDeserializer<>(claimableBalancePageType))
.create();
}
}
Loading