From: AsamK Date: Tue, 17 Oct 2023 17:52:35 +0000 (+0200) Subject: Use pattern matching switch cases X-Git-Tag: v0.13.0~125 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/8d55dfb66bc0dfbd2b601a27075f2876cde918e3 Use pattern matching switch cases --- diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java index 5991202e..532cd3e7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -224,52 +224,55 @@ public class GroupHelper { var group = getGroupForUpdating(groupId); final var avatarBytes = readAvatarBytes(avatarFile); - if (group instanceof GroupInfoV2) { - try { - return updateGroupV2((GroupInfoV2) group, - name, - description, - members, - removeMembers, - admins, - removeAdmins, - banMembers, - unbanMembers, - resetGroupLink, - groupLinkState, - addMemberPermission, - editDetailsPermission, - avatarBytes, - expirationTimer, - isAnnouncementGroup); - } catch (ConflictException e) { - // Detected conflicting update, refreshing group and trying again - group = getGroup(groupId, true); - return updateGroupV2((GroupInfoV2) group, - name, - description, - members, - removeMembers, - admins, - removeAdmins, - banMembers, - unbanMembers, - resetGroupLink, - groupLinkState, - addMemberPermission, - editDetailsPermission, - avatarBytes, - expirationTimer, - isAnnouncementGroup); + switch (group) { + case GroupInfoV2 gv2 -> { + try { + return updateGroupV2(gv2, + name, + description, + members, + removeMembers, + admins, + removeAdmins, + banMembers, + unbanMembers, + resetGroupLink, + groupLinkState, + addMemberPermission, + editDetailsPermission, + avatarBytes, + expirationTimer, + isAnnouncementGroup); + } catch (ConflictException e) { + // Detected conflicting update, refreshing group and trying again + group = getGroup(groupId, true); + return updateGroupV2((GroupInfoV2) group, + name, + description, + members, + removeMembers, + admins, + removeAdmins, + banMembers, + unbanMembers, + resetGroupLink, + groupLinkState, + addMemberPermission, + editDetailsPermission, + avatarBytes, + expirationTimer, + isAnnouncementGroup); + } } - } - final var gv1 = (GroupInfoV1) group; - final var result = updateGroupV1(gv1, name, members, avatarBytes); - if (expirationTimer != null) { - setExpirationTimer(gv1, expirationTimer); + case GroupInfoV1 gv1 -> { + final var result = updateGroupV1(gv1, name, members, avatarBytes); + if (expirationTimer != null) { + setExpirationTimer(gv1, expirationTimer); + } + return result; + } } - return result; } public void updateGroupProfileKey(GroupIdV2 groupId) throws GroupNotFoundException, NotAGroupMemberException, IOException { diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java index 3b3a5c6f..de7e4daf 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java @@ -25,19 +25,19 @@ public class PinHelper { String pin, MasterKey masterKey ) throws IOException { final var backupResponse = secureValueRecoveryV2.setPin(pin, masterKey).execute(); - if (backupResponse instanceof SecureValueRecovery.BackupResponse.Success) { - } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ServerRejected) { - logger.warn("Backup svr2 failed: ServerRejected"); - } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.EnclaveNotFound) { - logger.warn("Backup svr2 failed: EnclaveNotFound"); - } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ExposeFailure) { - logger.warn("Backup svr2 failed: ExposeFailure"); - } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ApplicationError error) { - throw new IOException(error.getException()); - } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.NetworkError error) { - throw error.getException(); - } else { - throw new AssertionError("Unexpected response"); + switch (backupResponse) { + case SecureValueRecovery.BackupResponse.Success success -> { + } + case SecureValueRecovery.BackupResponse.ServerRejected serverRejected -> + logger.warn("Backup svr2 failed: ServerRejected"); + case SecureValueRecovery.BackupResponse.EnclaveNotFound enclaveNotFound -> + logger.warn("Backup svr2 failed: EnclaveNotFound"); + case SecureValueRecovery.BackupResponse.ExposeFailure exposeFailure -> + logger.warn("Backup svr2 failed: ExposeFailure"); + case SecureValueRecovery.BackupResponse.ApplicationError error -> + throw new IOException(error.getException()); + case SecureValueRecovery.BackupResponse.NetworkError error -> throw error.getException(); + case null, default -> throw new AssertionError("Unexpected response"); } } @@ -47,17 +47,17 @@ public class PinHelper { public void removeRegistrationLockPin() throws IOException { final var deleteResponse = secureValueRecoveryV2.deleteData(); - if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.Success) { - } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.ServerRejected) { - logger.warn("Delete svr2 failed: ServerRejected"); - } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.EnclaveNotFound) { - logger.warn("Delete svr2 failed: EnclaveNotFound"); - } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.ApplicationError error) { - throw new IOException(error.getException()); - } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.NetworkError error) { - throw error.getException(); - } else { - throw new AssertionError("Unexpected response"); + switch (deleteResponse) { + case SecureValueRecovery.DeleteResponse.Success success -> { + } + case SecureValueRecovery.DeleteResponse.ServerRejected serverRejected -> + logger.warn("Delete svr2 failed: ServerRejected"); + case SecureValueRecovery.DeleteResponse.EnclaveNotFound enclaveNotFound -> + logger.warn("Delete svr2 failed: EnclaveNotFound"); + case SecureValueRecovery.DeleteResponse.ApplicationError error -> + throw new IOException(error.getException()); + case SecureValueRecovery.DeleteResponse.NetworkError error -> throw error.getException(); + case null, default -> throw new AssertionError("Unexpected response"); } } @@ -77,19 +77,21 @@ public class PinHelper { ) throws IOException, IncorrectPinException { final var restoreResponse = secureValueRecovery.restoreDataPreRegistration(authCredentials, pin); - if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.Success s) { - return s; - } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.PinMismatch pinMismatch) { - throw new IncorrectPinException(pinMismatch.getTriesRemaining()); - } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.ApplicationError error) { - throw new IOException(error.getException()); - } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.NetworkError error) { - throw error.getException(); - } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.Missing) { - logger.debug("No SVR data stored for the given credentials."); - return null; - } else { - throw new AssertionError("Unexpected response: " + restoreResponse.getClass().getSimpleName()); + switch (restoreResponse) { + case SecureValueRecovery.RestoreResponse.Success s -> { + return s; + } + case SecureValueRecovery.RestoreResponse.PinMismatch pinMismatch -> + throw new IncorrectPinException(pinMismatch.getTriesRemaining()); + case SecureValueRecovery.RestoreResponse.ApplicationError error -> + throw new IOException(error.getException()); + case SecureValueRecovery.RestoreResponse.NetworkError error -> throw error.getException(); + case SecureValueRecovery.RestoreResponse.Missing missing -> { + logger.debug("No SVR data stored for the given credentials."); + return null; + } + case null, default -> + throw new AssertionError("Unexpected response: " + restoreResponse.getClass().getSimpleName()); } } } diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index a2c90aa4..3feed994 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -1252,18 +1252,15 @@ public class ManagerImpl implements Manager { public boolean trustIdentityVerified( RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException { - if (verificationCode instanceof IdentityVerificationCode.Fingerprint fingerprint) { - return trustIdentity(recipient, + return switch (verificationCode) { + case IdentityVerificationCode.Fingerprint fingerprint -> trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint.fingerprint())); - } else if (verificationCode instanceof IdentityVerificationCode.SafetyNumber safetyNumber) { - return trustIdentity(recipient, + case IdentityVerificationCode.SafetyNumber safetyNumber -> trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); - } else if (verificationCode instanceof IdentityVerificationCode.ScannableSafetyNumber safetyNumber) { - return trustIdentity(recipient, + case IdentityVerificationCode.ScannableSafetyNumber safetyNumber -> trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); - } else { - throw new AssertionError("Invalid verification code type"); - } + case null, default -> throw new AssertionError("Invalid verification code type"); + }; } @Override diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 0a30d202..00d9d7a9 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -109,18 +109,13 @@ public class Main { } private static int getStatusForError(final CommandException e) { - if (e instanceof UserErrorException) { - return 1; - } else if (e instanceof UnexpectedErrorException) { - return 2; - } else if (e instanceof IOErrorException) { - return 3; - } else if (e instanceof UntrustedKeyErrorException) { - return 4; - } else if (e instanceof RateLimitErrorException) { - return 5; - } else { - return 2; - } + return switch (e) { + case UserErrorException userErrorException -> 1; + case UnexpectedErrorException unexpectedErrorException -> 2; + case IOErrorException ioErrorException -> 3; + case UntrustedKeyErrorException untrustedKeyErrorException -> 4; + case RateLimitErrorException rateLimitErrorException -> 5; + case null, default -> 2; + }; } } diff --git a/src/main/java/org/asamk/signal/commands/Commands.java b/src/main/java/org/asamk/signal/commands/Commands.java index 719ba132..0f26c994 100644 --- a/src/main/java/org/asamk/signal/commands/Commands.java +++ b/src/main/java/org/asamk/signal/commands/Commands.java @@ -72,8 +72,8 @@ public class Commands { private static void addCommand(Command command) { commands.put(command.getName(), command); - if (command instanceof CliCommand) { - commandSubparserAttacher.put(command.getName(), ((CliCommand) command)::attachToSubparser); + if (command instanceof CliCommand cliCommand) { + commandSubparserAttacher.put(command.getName(), cliCommand::attachToSubparser); } } } diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index d32dc69c..5c1fac53 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -249,11 +249,11 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { } private void addDefaultReceiveHandler(Manager m, OutputWriter outputWriter, final boolean isWeakListener) { - final var handler = outputWriter instanceof JsonWriter o - ? new JsonReceiveMessageHandler(m, o) - : outputWriter instanceof PlainTextWriter o - ? new ReceiveMessageHandler(m, o) - : Manager.ReceiveMessageHandler.EMPTY; + final var handler = switch (outputWriter) { + case PlainTextWriter writer -> new ReceiveMessageHandler(m, writer); + case JsonWriter writer -> new JsonReceiveMessageHandler(m, writer); + case null -> Manager.ReceiveMessageHandler.EMPTY; + }; m.addReceiveHandler(handler, isWeakListener); } diff --git a/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java index f2f0450c..160e53bc 100644 --- a/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java +++ b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java @@ -42,10 +42,9 @@ public class GetAttachmentCommand implements JsonRpcLocalCommand { try (InputStream attachment = m.retrieveAttachment(id)) { final var bytes = attachment.readAllBytes(); final var base64 = Base64.getEncoder().encodeToString(bytes); - if (outputWriter instanceof PlainTextWriter writer) { - writer.println(base64); - } else if (outputWriter instanceof JsonWriter writer) { - writer.write(new JsonAttachmentData(base64)); + switch (outputWriter) { + case PlainTextWriter writer -> writer.println(base64); + case JsonWriter writer -> writer.write(new JsonAttachmentData(base64)); } } catch (FileNotFoundException ex) { throw new UserErrorException("Could not find attachment with ID: " + id, ex); diff --git a/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java index 30fe7bf2..70a55393 100644 --- a/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java +++ b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java @@ -55,24 +55,26 @@ public class GetUserStatusCommand implements JsonRpcLocalCommand { } // Output - if (outputWriter instanceof JsonWriter jsonWriter) { - - var jsonUserStatuses = registered.entrySet().stream().map(entry -> { - final var number = entry.getValue().number(); - final var uuid = entry.getValue().uuid(); - return new JsonUserStatus(entry.getKey(), number, uuid == null ? null : uuid.toString(), uuid != null); - }).toList(); - - jsonWriter.write(jsonUserStatuses); - } else { - final var writer = (PlainTextWriter) outputWriter; - - for (var entry : registered.entrySet()) { - final var userStatus = entry.getValue(); - writer.println("{}: {}{}", - entry.getKey(), - userStatus.uuid() != null, - userStatus.unrestrictedUnidentifiedAccess() ? " (unrestricted sealed sender)" : ""); + switch (outputWriter) { + case JsonWriter writer -> { + var jsonUserStatuses = registered.entrySet().stream().map(entry -> { + final var number = entry.getValue().number(); + final var uuid = entry.getValue().uuid(); + return new JsonUserStatus(entry.getKey(), + number, + uuid == null ? null : uuid.toString(), + uuid != null); + }).toList(); + writer.write(jsonUserStatuses); + } + case PlainTextWriter writer -> { + for (var entry : registered.entrySet()) { + final var userStatus = entry.getValue(); + writer.println("{}: {}{}", + entry.getKey(), + userStatus.uuid() != null, + userStatus.unrestrictedUnidentifiedAccess() ? " (unrestricted sealed sender)" : ""); + } } } } diff --git a/src/main/java/org/asamk/signal/commands/JoinGroupCommand.java b/src/main/java/org/asamk/signal/commands/JoinGroupCommand.java index 3c3562ae..7a5b2601 100644 --- a/src/main/java/org/asamk/signal/commands/JoinGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/JoinGroupCommand.java @@ -54,35 +54,38 @@ public class JoinGroupCommand implements JsonRpcLocalCommand { try { final var results = m.joinGroup(linkUrl); var newGroupId = results.first(); - if (outputWriter instanceof JsonWriter writer) { - var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.second().results()); - if (!m.getGroup(newGroupId).isMember()) { - writer.write(Map.of("timestamp", - results.second().timestamp(), - "results", - jsonResults, - "groupId", - newGroupId.toBase64(), - "onlyRequested", - true)); - } else { - writer.write(Map.of("timestamp", - results.second().timestamp(), - "results", - jsonResults, - "groupId", - newGroupId.toBase64())); + switch (outputWriter) { + case JsonWriter writer -> { + var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.second().results()); + if (!m.getGroup(newGroupId).isMember()) { + writer.write(Map.of("timestamp", + results.second().timestamp(), + "results", + jsonResults, + "groupId", + newGroupId.toBase64(), + "onlyRequested", + true)); + } else { + writer.write(Map.of("timestamp", + results.second().timestamp(), + "results", + jsonResults, + "groupId", + newGroupId.toBase64())); + } } - } else { - final var writer = (PlainTextWriter) outputWriter; - if (!m.getGroup(newGroupId).isMember()) { - writer.println("Requested to join group \"{}\"", newGroupId.toBase64()); - } else { - writer.println("Joined group \"{}\"", newGroupId.toBase64()); + case PlainTextWriter writer -> { + if (!m.getGroup(newGroupId).isMember()) { + writer.println("Requested to join group \"{}\"", newGroupId.toBase64()); + } else { + writer.println("Joined group \"{}\"", newGroupId.toBase64()); + } + var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.second() + .results()); + SendMessageResultUtils.printSendMessageResultErrors(writer, errors); + writer.println("{}", results.second().timestamp()); } - var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.second().results()); - SendMessageResultUtils.printSendMessageResultErrors(writer, errors); - writer.println("{}", results.second().timestamp()); } } catch (IOException e) { throw new IOErrorException("Failed to send message: " diff --git a/src/main/java/org/asamk/signal/commands/ListAccountsCommand.java b/src/main/java/org/asamk/signal/commands/ListAccountsCommand.java index 68b56f29..b19a1686 100644 --- a/src/main/java/org/asamk/signal/commands/ListAccountsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListAccountsCommand.java @@ -26,12 +26,15 @@ public class ListAccountsCommand implements JsonRpcMultiLocalCommand { final Namespace ns, final MultiAccountManager c, final OutputWriter outputWriter ) throws CommandException { final var accountNumbers = c.getAccountNumbers(); - if (outputWriter instanceof JsonWriter jsonWriter) { - final var jsonAccounts = accountNumbers.stream().map(JsonAccount::new).toList(); - jsonWriter.write(jsonAccounts); - } else if (outputWriter instanceof PlainTextWriter plainTextWriter) { - for (final var number : accountNumbers) { - plainTextWriter.println("Number: {}", number); + switch (outputWriter) { + case JsonWriter jsonWriter -> { + final var jsonAccounts = accountNumbers.stream().map(JsonAccount::new).toList(); + jsonWriter.write(jsonAccounts); + } + case PlainTextWriter plainTextWriter -> { + for (final var number : accountNumbers) { + plainTextWriter.println("Number: {}", number); + } } } } diff --git a/src/main/java/org/asamk/signal/commands/ListContactsCommand.java b/src/main/java/org/asamk/signal/commands/ListContactsCommand.java index 997e31dd..42a33a14 100644 --- a/src/main/java/org/asamk/signal/commands/ListContactsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListContactsCommand.java @@ -51,48 +51,49 @@ public class ListContactsCommand implements JsonRpcLocalCommand { recipientIdentifiers, Optional.ofNullable(name)); - if (outputWriter instanceof PlainTextWriter writer) { - for (var r : recipients) { - final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact(); - final var profile = r.getProfile() == null ? Profile.newBuilder().build() : r.getProfile(); - writer.println( - "Number: {} Name: {} Profile name: {} Username: {} Color: {} Blocked: {} Message expiration: {}", - r.getAddress().getLegacyIdentifier(), - contact.getName(), - profile.getDisplayName(), - r.getAddress().username().orElse(""), - contact.getColor(), - contact.isBlocked(), - contact.getMessageExpirationTime() == 0 - ? "disabled" - : contact.getMessageExpirationTime() + "s"); + switch (outputWriter) { + case PlainTextWriter writer -> { + for (var r : recipients) { + final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact(); + final var profile = r.getProfile() == null ? Profile.newBuilder().build() : r.getProfile(); + writer.println( + "Number: {} Name: {} Profile name: {} Username: {} Color: {} Blocked: {} Message expiration: {}", + r.getAddress().getLegacyIdentifier(), + contact.getName(), + profile.getDisplayName(), + r.getAddress().username().orElse(""), + contact.getColor(), + contact.isBlocked(), + contact.getMessageExpirationTime() == 0 + ? "disabled" + : contact.getMessageExpirationTime() + "s"); + } + } + case JsonWriter writer -> { + final var jsonContacts = recipients.stream().map(r -> { + final var address = r.getAddress(); + final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact(); + return new JsonContact(address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), + address.username().orElse(null), + contact.getName(), + contact.getColor(), + contact.isBlocked(), + contact.getMessageExpirationTime(), + r.getProfile() == null + ? null + : new JsonContact.JsonProfile(r.getProfile().getLastUpdateTimestamp(), + r.getProfile().getGivenName(), + r.getProfile().getFamilyName(), + r.getProfile().getAbout(), + r.getProfile().getAboutEmoji(), + r.getProfile().getMobileCoinAddress() == null + ? null + : Base64.getEncoder() + .encodeToString(r.getProfile().getMobileCoinAddress()))); + }).toList(); + writer.write(jsonContacts); } - } else { - final var writer = (JsonWriter) outputWriter; - final var jsonContacts = recipients.stream().map(r -> { - final var address = r.getAddress(); - final var contact = r.getContact() == null ? Contact.newBuilder().build() : r.getContact(); - return new JsonContact(address.number().orElse(null), - address.uuid().map(UUID::toString).orElse(null), - address.username().orElse(null), - contact.getName(), - contact.getColor(), - contact.isBlocked(), - contact.getMessageExpirationTime(), - r.getProfile() == null - ? null - : new JsonContact.JsonProfile(r.getProfile().getLastUpdateTimestamp(), - r.getProfile().getGivenName(), - r.getProfile().getFamilyName(), - r.getProfile().getAbout(), - r.getProfile().getAboutEmoji(), - r.getProfile().getMobileCoinAddress() == null - ? null - : Base64.getEncoder() - .encodeToString(r.getProfile().getMobileCoinAddress()))); - }).toList(); - - writer.write(jsonContacts); } } diff --git a/src/main/java/org/asamk/signal/commands/ListDevicesCommand.java b/src/main/java/org/asamk/signal/commands/ListDevicesCommand.java index 7920243e..7adc8611 100644 --- a/src/main/java/org/asamk/signal/commands/ListDevicesCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListDevicesCommand.java @@ -42,21 +42,23 @@ public class ListDevicesCommand implements JsonRpcLocalCommand { throw new IOErrorException("Failed to get linked devices: " + e.getMessage(), e); } - if (outputWriter instanceof PlainTextWriter writer) { - for (var d : devices) { - writer.println("- Device {}{}:", d.id(), (d.isThisDevice() ? " (this device)" : "")); - writer.indent(w -> { - w.println("Name: {}", d.name()); - w.println("Created: {}", DateUtils.formatTimestamp(d.created())); - w.println("Last seen: {}", DateUtils.formatTimestamp(d.lastSeen())); - }); + switch (outputWriter) { + case PlainTextWriter writer -> { + for (var d : devices) { + writer.println("- Device {}{}:", d.id(), (d.isThisDevice() ? " (this device)" : "")); + writer.indent(w -> { + w.println("Name: {}", d.name()); + w.println("Created: {}", DateUtils.formatTimestamp(d.created())); + w.println("Last seen: {}", DateUtils.formatTimestamp(d.lastSeen())); + }); + } + } + case JsonWriter writer -> { + final var jsonDevices = devices.stream() + .map(d -> new JsonDevice(d.id(), d.name(), d.created(), d.lastSeen())) + .toList(); + writer.write(jsonDevices); } - } else { - final var writer = (JsonWriter) outputWriter; - final var jsonDevices = devices.stream() - .map(d -> new JsonDevice(d.id(), d.name(), d.created(), d.lastSeen())) - .toList(); - writer.write(jsonDevices); } } diff --git a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java index b22ace6c..eb53516f 100644 --- a/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListGroupsCommand.java @@ -89,34 +89,34 @@ public class ListGroupsCommand implements JsonRpcLocalCommand { groups = groups.stream().filter(g -> groupIds.contains(g.groupId())).toList(); } - if (outputWriter instanceof JsonWriter jsonWriter) { - - var jsonGroups = groups.stream().map(group -> { - final var groupInviteLink = group.groupInviteLinkUrl(); - - return new JsonGroup(group.groupId().toBase64(), - group.title(), - group.description(), - group.isMember(), - group.isBlocked(), - group.messageExpirationTimer(), - resolveJsonMembers(group.members()), - resolveJsonMembers(group.pendingMembers()), - resolveJsonMembers(group.requestingMembers()), - resolveJsonMembers(group.adminMembers()), - resolveJsonMembers(group.bannedMembers()), - group.permissionAddMember().name(), - group.permissionEditDetails().name(), - group.permissionSendMessage().name(), - groupInviteLink == null ? null : groupInviteLink.getUrl()); - }).toList(); - - jsonWriter.write(jsonGroups); - } else { - final var writer = (PlainTextWriter) outputWriter; - boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed")); - for (var group : groups) { - printGroupPlainText(writer, group, detailed); + switch (outputWriter) { + case JsonWriter jsonWriter -> { + var jsonGroups = groups.stream().map(group -> { + final var groupInviteLink = group.groupInviteLinkUrl(); + + return new JsonGroup(group.groupId().toBase64(), + group.title(), + group.description(), + group.isMember(), + group.isBlocked(), + group.messageExpirationTimer(), + resolveJsonMembers(group.members()), + resolveJsonMembers(group.pendingMembers()), + resolveJsonMembers(group.requestingMembers()), + resolveJsonMembers(group.adminMembers()), + resolveJsonMembers(group.bannedMembers()), + group.permissionAddMember().name(), + group.permissionEditDetails().name(), + group.permissionSendMessage().name(), + groupInviteLink == null ? null : groupInviteLink.getUrl()); + }).toList(); + jsonWriter.write(jsonGroups); + } + case PlainTextWriter writer -> { + boolean detailed = Boolean.TRUE.equals(ns.getBoolean("detailed")); + for (var group : groups) { + printGroupPlainText(writer, group, detailed); + } } } } diff --git a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java index 45326fbc..53d508d8 100644 --- a/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java @@ -57,28 +57,29 @@ public class ListIdentitiesCommand implements JsonRpcLocalCommand { identities = m.getIdentities(CommandUtil.getSingleRecipientIdentifier(number, m.getSelfNumber())); } - if (outputWriter instanceof PlainTextWriter writer) { - for (var id : identities) { - printIdentityFingerprint(writer, id); + switch (outputWriter) { + case PlainTextWriter writer -> { + for (var id : identities) { + printIdentityFingerprint(writer, id); + } + } + case JsonWriter writer -> { + final var jsonIdentities = identities.stream().map(id -> { + final var address = id.recipient(); + var safetyNumber = Util.formatSafetyNumber(id.safetyNumber()); + var scannableSafetyNumber = id.scannableSafetyNumber(); + return new JsonIdentity(address.number().orElse(null), + address.uuid().map(UUID::toString).orElse(null), + Hex.toString(id.getFingerprint()), + safetyNumber, + scannableSafetyNumber == null + ? null + : Base64.getEncoder().encodeToString(scannableSafetyNumber), + id.trustLevel().name(), + id.dateAddedTimestamp()); + }).toList(); + writer.write(jsonIdentities); } - } else { - final var writer = (JsonWriter) outputWriter; - final var jsonIdentities = identities.stream().map(id -> { - final var address = id.recipient(); - var safetyNumber = Util.formatSafetyNumber(id.safetyNumber()); - var scannableSafetyNumber = id.scannableSafetyNumber(); - return new JsonIdentity(address.number().orElse(null), - address.uuid().map(UUID::toString).orElse(null), - Hex.toString(id.getFingerprint()), - safetyNumber, - scannableSafetyNumber == null - ? null - : Base64.getEncoder().encodeToString(scannableSafetyNumber), - id.trustLevel().name(), - id.dateAddedTimestamp()); - }).toList(); - - writer.write(jsonIdentities); } } diff --git a/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java b/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java index 53f3f352..233eb4b5 100644 --- a/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java +++ b/src/main/java/org/asamk/signal/commands/ListStickerPacksCommand.java @@ -30,17 +30,20 @@ public class ListStickerPacksCommand implements JsonRpcLocalCommand { final Namespace ns, final Manager c, final OutputWriter outputWriter ) throws CommandException { final var stickerPacks = c.getStickerPacks(); - if (outputWriter instanceof JsonWriter jsonWriter) { - final var jsonStickerPacks = stickerPacks.stream().map(JsonStickerPack::new).toList(); - jsonWriter.write(jsonStickerPacks); - } else if (outputWriter instanceof PlainTextWriter plainTextWriter) { - for (final var sticker : stickerPacks) { - plainTextWriter.println("Pack {}: “{}” by “{}” has {} stickers. {}", - Hex.toStringCondensed(sticker.packId().serialize()), - sticker.title(), - sticker.author(), - sticker.stickers().size(), - sticker.url().getUrl()); + switch (outputWriter) { + case JsonWriter jsonWriter -> { + final var jsonStickerPacks = stickerPacks.stream().map(JsonStickerPack::new).toList(); + jsonWriter.write(jsonStickerPacks); + } + case PlainTextWriter plainTextWriter -> { + for (final var sticker : stickerPacks) { + plainTextWriter.println("Pack {}: “{}” by “{}” has {} stickers. {}", + Hex.toStringCondensed(sticker.packId().serialize()), + sticker.title(), + sticker.author(), + sticker.stickers().size(), + sticker.url().getUrl()); + } } } } diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 16421b62..228a0561 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -74,8 +74,10 @@ public class ReceiveCommand implements LocalCommand, JsonRpcSingleCommand new JsonReceiveMessageHandler(m, writer); + case PlainTextWriter writer -> new ReceiveMessageHandler(m, writer); + }; final var duration = timeout < 0 ? null : Duration.ofMillis((long) (timeout * 1000)); final var maxMessages = maxMessagesRaw < 0 ? null : maxMessagesRaw; m.receiveMessages(Optional.ofNullable(duration), Optional.ofNullable(maxMessages), handler); diff --git a/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java b/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java index 9a67d417..d430f49f 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java @@ -50,10 +50,9 @@ public class UpdateAccountCommand implements JsonRpcLocalCommand { if (username != null) { try { final var newUsername = m.setUsername(username); - if (outputWriter instanceof PlainTextWriter w) { - w.println("Your new username: {}", newUsername); - } else if (outputWriter instanceof JsonWriter w) { - w.write(new JsonAccountResponse(newUsername)); + switch (outputWriter) { + case PlainTextWriter w -> w.println("Your new username: {}", newUsername); + case JsonWriter w -> w.write(new JsonAccountResponse(newUsername)); } } catch (IOException e) { throw new IOErrorException("Failed to set username: " + e.getMessage(), e); diff --git a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java index 1f7825fb..5fe47417 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java @@ -182,27 +182,29 @@ public class UpdateGroupCommand implements JsonRpcLocalCommand { private void outputResult( final OutputWriter outputWriter, final SendGroupMessageResults results, final GroupId groupId ) { - if (outputWriter instanceof PlainTextWriter writer) { - if (groupId != null) { - writer.println("Created new group: \"{}\"", groupId.toBase64()); - } - if (results != null) { - var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.results()); - SendMessageResultUtils.printSendMessageResultErrors(writer, errors); - writer.println("{}", results.timestamp()); - } - } else { - final var writer = (JsonWriter) outputWriter; - final var response = new HashMap<>(); - if (results != null) { - response.put("timestamp", results.timestamp()); - var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.results()); - response.put("results", jsonResults); + switch (outputWriter) { + case PlainTextWriter writer -> { + if (groupId != null) { + writer.println("Created new group: \"{}\"", groupId.toBase64()); + } + if (results != null) { + var errors = SendMessageResultUtils.getErrorMessagesFromSendMessageResults(results.results()); + SendMessageResultUtils.printSendMessageResultErrors(writer, errors); + writer.println("{}", results.timestamp()); + } } - if (groupId != null) { - response.put("groupId", groupId.toBase64()); + case JsonWriter writer -> { + final var response = new HashMap<>(); + if (results != null) { + response.put("timestamp", results.timestamp()); + var jsonResults = SendMessageResultUtils.getJsonSendMessageResults(results.results()); + response.put("results", jsonResults); + } + if (groupId != null) { + response.put("groupId", groupId.toBase64()); + } + writer.write(response); } - writer.write(response); } } } diff --git a/src/main/java/org/asamk/signal/commands/UploadStickerPackCommand.java b/src/main/java/org/asamk/signal/commands/UploadStickerPackCommand.java index aad9a1e5..89f74129 100644 --- a/src/main/java/org/asamk/signal/commands/UploadStickerPackCommand.java +++ b/src/main/java/org/asamk/signal/commands/UploadStickerPackCommand.java @@ -42,11 +42,11 @@ public class UploadStickerPackCommand implements JsonRpcLocalCommand { try { var url = m.uploadStickerPack(path); - if (outputWriter instanceof PlainTextWriter writer) { - writer.println("{}", url.getUrl()); - } else { - final var writer = (JsonWriter) outputWriter; - writer.write(Map.of("url", url.getUrl())); + switch (outputWriter) { + case PlainTextWriter writer -> writer.println("{}", url.getUrl()); + case JsonWriter writer -> { + writer.write(Map.of("url", url.getUrl())); + } } } catch (IOException e) { throw new IOErrorException("Upload error (maybe image size too large):" + e.getMessage(), e); diff --git a/src/main/java/org/asamk/signal/commands/VersionCommand.java b/src/main/java/org/asamk/signal/commands/VersionCommand.java index 52099ff3..01f1a2d7 100644 --- a/src/main/java/org/asamk/signal/commands/VersionCommand.java +++ b/src/main/java/org/asamk/signal/commands/VersionCommand.java @@ -56,10 +56,9 @@ public class VersionCommand implements JsonRpcLocalCommand, JsonRpcMultiLocalCom final var projectName = BaseConfig.PROJECT_NAME == null ? "signal-cli" : BaseConfig.PROJECT_NAME; final var version = BaseConfig.PROJECT_VERSION == null ? "unknown" : BaseConfig.PROJECT_VERSION; - if (outputWriter instanceof JsonWriter jsonWriter) { - jsonWriter.write(Map.of("version", version)); - } else if (outputWriter instanceof PlainTextWriter plainTextWriter) { - plainTextWriter.println("{} {}", projectName, version); + switch (outputWriter) { + case JsonWriter jsonWriter -> jsonWriter.write(Map.of("version", version)); + case PlainTextWriter plainTextWriter -> plainTextWriter.println("{} {}", projectName, version); } } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusProperties.java b/src/main/java/org/asamk/signal/dbus/DbusProperties.java index 256b858d..a77ed164 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusProperties.java +++ b/src/main/java/org/asamk/signal/dbus/DbusProperties.java @@ -65,7 +65,7 @@ public abstract class DbusProperties implements Properties { .filter(p -> p.getGetter() != null) .collect(Collectors.toMap(DbusProperty::getName, p -> { final Object o = p.getGetter().get(); - return o instanceof Variant ? (Variant) o : new Variant<>(o); + return o instanceof Variant variant ? variant : new Variant<>(o); })); } } diff --git a/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java b/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java index 25e5c66c..f9ef71a1 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java +++ b/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java @@ -82,53 +82,55 @@ public class JsonRpcReader { final RequestHandler requestHandler, final Consumer responseHandler ) { - if (message instanceof final JsonRpcRequest jsonRpcRequest) { - logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod()); - final var response = handleRequest(requestHandler, jsonRpcRequest); - if (response != null) { - jsonRpcSender.sendResponse(response); + switch (message) { + case JsonRpcRequest jsonRpcRequest -> { + logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod()); + final var response = handleRequest(requestHandler, jsonRpcRequest); + if (response != null) { + jsonRpcSender.sendResponse(response); + } } - } else if (message instanceof JsonRpcResponse jsonRpcResponse) { - responseHandler.accept(jsonRpcResponse); - } else { - final var messages = ((JsonRpcBatchMessage) message).getMessages(); - final var responseList = new ArrayList(messages.size()); - final var executor = Executors.newFixedThreadPool(10); - try { - final var lock = new ReentrantLock(); - messages.forEach(jsonNode -> { - final JsonRpcRequest request; - try { - request = parseJsonRpcRequest(jsonNode); - } catch (JsonRpcException e) { - final var response = JsonRpcResponse.forError(e.getError(), getId(jsonNode)); - lock.lock(); + case JsonRpcResponse jsonRpcResponse -> responseHandler.accept(jsonRpcResponse); + case JsonRpcBatchMessage jsonRpcBatchMessage -> { + final var messages = jsonRpcBatchMessage.getMessages(); + final var responseList = new ArrayList(messages.size()); + final var executor = Executors.newFixedThreadPool(10); + try { + final var lock = new ReentrantLock(); + messages.forEach(jsonNode -> { + final JsonRpcRequest request; try { - responseList.add(response); - } finally { - lock.unlock(); - } - return; - } - - executor.submit(() -> { - final var response = handleRequest(requestHandler, request); - if (response != null) { + request = parseJsonRpcRequest(jsonNode); + } catch (JsonRpcException e) { + final var response = JsonRpcResponse.forError(e.getError(), getId(jsonNode)); lock.lock(); try { responseList.add(response); } finally { lock.unlock(); } + return; } + + executor.submit(() -> { + final var response = handleRequest(requestHandler, request); + if (response != null) { + lock.lock(); + try { + responseList.add(response); + } finally { + lock.unlock(); + } + } + }); }); - }); - } finally { - Util.closeExecutorService(executor); - } + } finally { + Util.closeExecutorService(executor); + } - if (!responseList.isEmpty()) { - jsonRpcSender.sendBatchResponses(responseList); + if (!responseList.isEmpty()) { + jsonRpcSender.sendBatchResponses(responseList); + } } } } @@ -221,7 +223,7 @@ public class JsonRpcReader { private ValueNode getId(JsonNode jsonNode) { final var id = jsonNode.get("id"); - return id instanceof ValueNode ? (ValueNode) id : null; + return id instanceof ValueNode value ? value : null; } private JsonRpcRequest parseJsonRpcRequest(final JsonNode input) throws JsonRpcException { diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java index 53b876b8..85ed76e6 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java @@ -223,13 +223,11 @@ public class SignalJsonRpcDispatcherHandler { } private Integer getSubscriptionId(final JsonNode request) { - if (request instanceof ArrayNode req) { - return req.get(0).asInt(); - } else if (request instanceof ObjectNode req) { - return req.get("subscription").asInt(); - } else { - return null; - } + return switch (request) { + case ArrayNode req -> req.get(0).asInt(); + case ObjectNode req -> req.get("subscription").asInt(); + case null, default -> null; + }; } } } diff --git a/src/main/java/org/asamk/signal/output/JsonWriter.java b/src/main/java/org/asamk/signal/output/JsonWriter.java index 034d2f9f..22c323a8 100644 --- a/src/main/java/org/asamk/signal/output/JsonWriter.java +++ b/src/main/java/org/asamk/signal/output/JsonWriter.java @@ -1,6 +1,6 @@ package org.asamk.signal.output; -public interface JsonWriter extends OutputWriter { +public non-sealed interface JsonWriter extends OutputWriter { void write(final Object object); } diff --git a/src/main/java/org/asamk/signal/output/OutputWriter.java b/src/main/java/org/asamk/signal/output/OutputWriter.java index a32e773d..0d84848e 100644 --- a/src/main/java/org/asamk/signal/output/OutputWriter.java +++ b/src/main/java/org/asamk/signal/output/OutputWriter.java @@ -1,5 +1,3 @@ package org.asamk.signal.output; -public interface OutputWriter { - -} +public sealed interface OutputWriter permits JsonWriter, PlainTextWriter {} diff --git a/src/main/java/org/asamk/signal/output/PlainTextWriter.java b/src/main/java/org/asamk/signal/output/PlainTextWriter.java index 29ac87af..eb42bed1 100644 --- a/src/main/java/org/asamk/signal/output/PlainTextWriter.java +++ b/src/main/java/org/asamk/signal/output/PlainTextWriter.java @@ -2,7 +2,7 @@ package org.asamk.signal.output; import java.util.function.Consumer; -public interface PlainTextWriter extends OutputWriter { +public non-sealed interface PlainTextWriter extends OutputWriter { void println(String format, Object... args); diff --git a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java index e4386b0e..108142e3 100644 --- a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java +++ b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java @@ -27,28 +27,32 @@ public class SendMessageResultUtils { } public static void outputResult(final OutputWriter outputWriter, final SendGroupMessageResults sendMessageResults) { - if (outputWriter instanceof PlainTextWriter writer) { - var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results()); - printSendMessageResultErrors(writer, errors); - writer.println("{}", sendMessageResults.timestamp()); - } else { - final var writer = (JsonWriter) outputWriter; - var results = getJsonSendMessageResults(sendMessageResults.results()); - writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results)); + switch (outputWriter) { + case PlainTextWriter writer -> { + var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results()); + printSendMessageResultErrors(writer, errors); + writer.println("{}", sendMessageResults.timestamp()); + } + case JsonWriter writer -> { + var results = getJsonSendMessageResults(sendMessageResults.results()); + writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results)); + } } } public static void outputResult( final OutputWriter outputWriter, final SendMessageResults sendMessageResults ) throws CommandException { - if (outputWriter instanceof PlainTextWriter writer) { - var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results()); - printSendMessageResultErrors(writer, errors); - writer.println("{}", sendMessageResults.timestamp()); - } else { - final var writer = (JsonWriter) outputWriter; - var results = getJsonSendMessageResults(sendMessageResults.results()); - writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results)); + switch (outputWriter) { + case PlainTextWriter writer -> { + var errors = getErrorMessagesFromSendMessageResults(sendMessageResults.results()); + printSendMessageResultErrors(writer, errors); + writer.println("{}", sendMessageResults.timestamp()); + } + case JsonWriter writer -> { + var results = getJsonSendMessageResults(sendMessageResults.results()); + writer.write(Map.of("timestamp", sendMessageResults.timestamp(), "results", results)); + } } if (!sendMessageResults.hasSuccess()) { if (sendMessageResults.hasOnlyUntrustedIdentity()) {