From a844526dae696ef1c42c4c240012ead65bb33963 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 9 Oct 2019 17:48:58 +0100 Subject: [PATCH] Refactor ClientVersion to bramble-api. --- .../bramble/api/versioning/ClientVersion.java | 63 +++++++++ .../ClientVersioningManagerImpl.java | 126 +++++++----------- 2 files changed, 109 insertions(+), 80 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java new file mode 100644 index 000000000..719c1e38c --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersion.java @@ -0,0 +1,63 @@ +package org.briarproject.bramble.api.versioning; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientId; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class ClientVersion implements Comparable { + + private final ClientMajorVersion majorVersion; + private final int minorVersion; + + public ClientVersion(ClientMajorVersion majorVersion, + int minorVersion) { + this.majorVersion = majorVersion; + this.minorVersion = minorVersion; + } + + public ClientVersion(ClientId clientId, int majorVersion, + int minorVersion) { + this(new ClientMajorVersion(clientId, majorVersion), minorVersion); + } + + public ClientMajorVersion getClientMajorVersion() { + return majorVersion; + } + + public ClientId getClientId() { + return majorVersion.getClientId(); + } + + public int getMajorVersion() { + return majorVersion.getMajorVersion(); + } + + public int getMinorVersion() { + return minorVersion; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientVersion) { + ClientVersion cv = (ClientVersion) o; + return majorVersion.equals(cv.majorVersion) + && minorVersion == cv.minorVersion; + } + return false; + } + + @Override + public int hashCode() { + return majorVersion.hashCode(); + } + + @Override + public int compareTo(ClientVersion cv) { + int compare = majorVersion.compareTo(cv.majorVersion); + if (compare != 0) return compare; + return minorVersion - cv.minorVersion; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 929432c8d..ce4e323c4 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -26,6 +26,7 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.validation.IncomingMessageHook; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.versioning.ClientMajorVersion; +import org.briarproject.bramble.api.versioning.ClientVersion; import org.briarproject.bramble.api.versioning.ClientVersioningManager; import java.util.ArrayList; @@ -80,9 +81,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, @Override public void registerClient(ClientId clientId, int majorVersion, int minorVersion, ClientVersioningHook hook) { - ClientMajorVersion cv = new ClientMajorVersion(clientId, majorVersion); - clients.add(new ClientVersion(cv, minorVersion)); - hooks.put(cv, hook); + ClientMajorVersion cmv = new ClientMajorVersion(clientId, majorVersion); + clients.add(new ClientVersion(cmv, minorVersion)); + hooks.put(cmv, hook); } @Override @@ -96,9 +97,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); Map visibilities = getVisibilities(localUpdate.states, remoteUpdate.states); - ClientMajorVersion cv = + ClientMajorVersion key = new ClientMajorVersion(clientId, majorVersion); - Visibility v = visibilities.get(cv); + Visibility v = visibilities.get(key); return v == null ? INVISIBLE : v; } catch (FormatException e) { throw new DbException(e); @@ -112,10 +113,11 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, LatestUpdates latest = findLatestUpdates(txn, contactId); if (latest == null || latest.remote == null) return -1; Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); - ClientMajorVersion cv = + ClientMajorVersion key = new ClientMajorVersion(clientId, majorVersion); for (ClientState remote : remoteUpdate.states) { - if (remote.majorVersion.equals(cv)) return remote.minorVersion; + if (remote.clientVersion.getClientMajorVersion().equals(key)) + return remote.clientVersion.getMinorVersion(); } return -1; } catch (FormatException e) { @@ -256,8 +258,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } private BdfList encodeClientVersion(ClientVersion cv) { - return BdfList.of(cv.majorVersion.getClientId().getString(), - cv.majorVersion.getMajorVersion(), cv.minorVersion); + return BdfList.of(cv.getClientId().getString(), cv.getMajorVersion(), + cv.getMinorVersion()); } /** @@ -298,8 +300,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, ClientId clientId = new ClientId(cv.getString(0)); int majorVersion = cv.getLong(1).intValue(); int minorVersion = cv.getLong(2).intValue(); - parsed.add(new ClientVersion(clientId, majorVersion, - minorVersion)); + parsed.add(new ClientVersion(clientId, majorVersion, minorVersion)); } return parsed; } @@ -418,13 +419,15 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, private List updateStatesFromLocalVersions( List oldStates, List newVersions) { Map oldMap = new HashMap<>(); - for (ClientState cs : oldStates) oldMap.put(cs.majorVersion, cs); + for (ClientState cs : oldStates) { + oldMap.put(cs.clientVersion.getClientMajorVersion(), cs); + } List newStates = new ArrayList<>(newVersions.size()); for (ClientVersion newVersion : newVersions) { - ClientState oldState = oldMap.get(newVersion.majorVersion); + ClientMajorVersion key = newVersion.getClientMajorVersion(); + ClientState oldState = oldMap.get(key); boolean active = oldState != null && oldState.active; - newStates.add(new ClientState(newVersion.majorVersion, - newVersion.minorVersion, active)); + newStates.add(new ClientState(newVersion, active)); } return newStates; } @@ -451,21 +454,25 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } private BdfList encodeClientState(ClientState cs) { - return BdfList.of(cs.majorVersion.getClientId().getString(), - cs.majorVersion.getMajorVersion(), cs.minorVersion, cs.active); + ClientVersion cv = cs.clientVersion; + return BdfList.of(cv.getClientId().getString(), cv.getMajorVersion(), + cv.getMinorVersion(), cs.active); } private Map getVisibilities( List localStates, List remoteStates) { Map remoteMap = new HashMap<>(); - for (ClientState cs : remoteStates) remoteMap.put(cs.majorVersion, cs); + for (ClientState cs : remoteStates) { + remoteMap.put(cs.clientVersion.getClientMajorVersion(), cs); + } Map visibilities = new HashMap<>(); for (ClientState local : localStates) { - ClientState remote = remoteMap.get(local.majorVersion); - if (remote == null) visibilities.put(local.majorVersion, INVISIBLE); - else if (remote.active) - visibilities.put(local.majorVersion, SHARED); - else visibilities.put(local.majorVersion, VISIBLE); + ClientMajorVersion key = + local.clientVersion.getClientMajorVersion(); + ClientState remote = remoteMap.get(key); + if (remote == null) visibilities.put(key, INVISIBLE); + else if (remote.active) visibilities.put(key, SHARED); + else visibilities.put(key, VISIBLE); } return visibilities; } @@ -486,9 +493,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } } - private void callVisibilityHook(Transaction txn, ClientMajorVersion cv, + private void callVisibilityHook(Transaction txn, ClientMajorVersion cmv, Contact c, Visibility v) throws DbException { - ClientVersioningHook hook = hooks.get(cv); + ClientVersioningHook hook = hooks.get(cmv); if (hook != null) hook.onClientVisibilityChanging(txn, c, v); } @@ -496,8 +503,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, List versions) throws DbException { List states = new ArrayList<>(versions.size()); for (ClientVersion cv : versions) { - states.add(new ClientState(cv.majorVersion, cv.minorVersion, - false)); + states.add(new ClientState(cv, false)); } storeUpdate(txn, g, states, 1); } @@ -516,13 +522,16 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, private List updateStatesFromRemoteStates( List oldLocalStates, List remoteStates) { Set remoteSet = new HashSet<>(); - for (ClientState cs : remoteStates) remoteSet.add(cs.majorVersion); + for (ClientState cs : remoteStates) { + remoteSet.add(cs.clientVersion.getClientMajorVersion()); + } List newLocalStates = new ArrayList<>(oldLocalStates.size()); for (ClientState oldState : oldLocalStates) { - boolean active = remoteSet.contains(oldState.majorVersion); - newLocalStates.add(new ClientState(oldState.majorVersion, - oldState.minorVersion, active)); + ClientMajorVersion cmv = + oldState.clientVersion.getClientMajorVersion(); + boolean active = remoteSet.contains(cmv); + newLocalStates.add(new ClientState(oldState.clientVersion, active)); } return newLocalStates; } @@ -561,61 +570,19 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, } } - private static class ClientVersion implements Comparable { - - private final ClientMajorVersion majorVersion; - private final int minorVersion; - - private ClientVersion(ClientMajorVersion majorVersion, - int minorVersion) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - } - - private ClientVersion(ClientId clientId, int majorVersion, - int minorVersion) { - this(new ClientMajorVersion(clientId, majorVersion), minorVersion); - } - - @Override - public boolean equals(Object o) { - if (o instanceof ClientVersion) { - ClientVersion cv = (ClientVersion) o; - return majorVersion.equals(cv.majorVersion) - && minorVersion == cv.minorVersion; - } - return false; - } - - @Override - public int hashCode() { - return majorVersion.hashCode(); - } - - @Override - public int compareTo(ClientVersion cv) { - int compare = majorVersion.compareTo(cv.majorVersion); - if (compare != 0) return compare; - return minorVersion - cv.minorVersion; - } - } - private static class ClientState { - private final ClientMajorVersion majorVersion; - private final int minorVersion; + private final ClientVersion clientVersion; private final boolean active; - private ClientState(ClientMajorVersion majorVersion, int minorVersion, - boolean active) { - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; + private ClientState(ClientVersion clientVersion, boolean active) { + this.clientVersion = clientVersion; this.active = active; } private ClientState(ClientId clientId, int majorVersion, int minorVersion, boolean active) { - this(new ClientMajorVersion(clientId, majorVersion), minorVersion, + this(new ClientVersion(clientId, majorVersion, minorVersion), active); } @@ -623,8 +590,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, public boolean equals(Object o) { if (o instanceof ClientState) { ClientState cs = (ClientState) o; - return majorVersion.equals(cs.majorVersion) - && minorVersion == cs.minorVersion + return clientVersion.equals(cs.clientVersion) && active == cs.active; } return false; @@ -632,7 +598,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, @Override public int hashCode() { - return majorVersion.hashCode(); + return clientVersion.hashCode(); } } }