Store and exchange client minor versions.

These don't affect client visibility.
This commit is contained in:
akwizgran
2018-04-16 17:16:14 +01:00
parent 2e570ba50d
commit 05deaf42e3
18 changed files with 164 additions and 54 deletions

View File

@@ -22,6 +22,11 @@ public interface TransportPropertyManager {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the transport property client.
*/
int MINOR_VERSION = 0;
/** /**
* Stores the given properties received while adding a contact - they will * Stores the given properties received while adding a contact - they will
* be superseded by any properties synced from the contact. * be superseded by any properties synced from the contact.

View File

@@ -25,7 +25,7 @@ public interface ClientVersioningManager {
* Registers a client that will be advertised to contacts. This method * Registers a client that will be advertised to contacts. This method
* should be called before {@link LifecycleManager#startServices(String)}. * should be called before {@link LifecycleManager#startServices(String)}.
*/ */
void registerClient(ClientId clientId, int majorVersion); void registerClient(ClientId clientId, int majorVersion, int minorVersion);
/** /**
* Registers a hook that will be called when the visibility of the given * Registers a hook that will be called when the visibility of the given

View File

@@ -17,6 +17,7 @@ import dagger.Provides;
import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID;
import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION;
import static org.briarproject.bramble.api.properties.TransportPropertyManager.MINOR_VERSION;
@Module @Module
public class PropertiesModule { public class PropertiesModule {
@@ -51,7 +52,8 @@ public class PropertiesModule {
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
transportPropertyManager); transportPropertyManager);
contactManager.registerContactHook(transportPropertyManager); contactManager.registerContactHook(transportPropertyManager);
clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION,
MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook(CLIENT_ID, clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
MAJOR_VERSION, transportPropertyManager); MAJOR_VERSION, transportPropertyManager);
return transportPropertyManager; return transportPropertyManager;

View File

@@ -33,15 +33,10 @@ class ClientVersion implements Comparable<ClientVersion> {
} }
@Override @Override
public int compareTo(ClientVersion c) { public int compareTo(ClientVersion cv) {
int compare = clientId.compareTo(c.clientId); int compare = clientId.compareTo(cv.clientId);
if (compare != 0) return compare; if (compare != 0) return compare;
return majorVersion - c.majorVersion; return majorVersion - cv.majorVersion;
}
@Override
public String toString() {
return clientId.getString() + ":" + majorVersion;
} }
} }

View File

@@ -61,7 +61,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
private final Clock clock; private final Clock clock;
private final Group localGroup; private final Group localGroup;
private final Collection<ClientVersion> clients = private final List<ClientMinorVersion> clients =
new CopyOnWriteArrayList<>(); new CopyOnWriteArrayList<>();
private final Map<ClientVersion, ClientVersioningHook> hooks = private final Map<ClientVersion, ClientVersioningHook> hooks =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
@@ -79,8 +79,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
@Override @Override
public void registerClient(ClientId clientId, int majorVersion) { public void registerClient(ClientId clientId, int majorVersion,
clients.add(new ClientVersion(clientId, majorVersion)); int minorVersion) {
clients.add(new ClientMinorVersion(clientId, majorVersion,
minorVersion));
} }
@Override @Override
@@ -124,7 +126,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
@Override @Override
public void startService() throws ServiceException { public void startService() throws ServiceException {
List<ClientVersion> versions = new ArrayList<>(clients); List<ClientMinorVersion> versions = new ArrayList<>(clients);
Collections.sort(versions); Collections.sort(versions);
try { try {
Transaction txn = db.startTransaction(false); Transaction txn = db.startTransaction(false);
@@ -161,7 +163,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
throw new AssertionError(e); throw new AssertionError(e);
} }
// Create and store the first local update // Create and store the first local update
List<ClientVersion> versions = new ArrayList<>(clients); List<ClientMinorVersion> versions = new ArrayList<>(clients);
Collections.sort(versions); Collections.sort(versions);
storeFirstUpdate(txn, g.getId(), versions); storeFirstUpdate(txn, g.getId(), versions);
} }
@@ -230,7 +232,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
private void storeClientVersions(Transaction txn, private void storeClientVersions(Transaction txn,
List<ClientVersion> versions) throws DbException { List<ClientMinorVersion> versions) throws DbException {
long now = clock.currentTimeMillis(); long now = clock.currentTimeMillis();
BdfList body = encodeClientVersions(versions); BdfList body = encodeClientVersions(versions);
try { try {
@@ -242,30 +244,35 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
} }
private BdfList encodeClientVersions(List<ClientVersion> versions) { private BdfList encodeClientVersions(List<ClientMinorVersion> versions) {
BdfList encoded = new BdfList(); BdfList encoded = new BdfList();
for (ClientVersion cv : versions) for (ClientMinorVersion cm : versions)
encoded.add(BdfList.of(cv.clientId.getString(), cv.majorVersion)); encoded.add(encodeClientVersion(cm));
return encoded; return encoded;
} }
private BdfList encodeClientVersion(ClientMinorVersion cm) {
return BdfList.of(cm.version.clientId.getString(),
cm.version.majorVersion, cm.minorVersion);
}
private boolean updateClientVersions(Transaction txn, private boolean updateClientVersions(Transaction txn,
List<ClientVersion> newVersions) throws DbException { List<ClientMinorVersion> newVersions) throws DbException {
Collection<MessageId> ids = db.getMessageIds(txn, localGroup.getId()); Collection<MessageId> ids = db.getMessageIds(txn, localGroup.getId());
if (ids.isEmpty()) { if (ids.isEmpty()) {
storeClientVersions(txn, newVersions); storeClientVersions(txn, newVersions);
return true; return true;
} }
MessageId m = ids.iterator().next(); MessageId m = ids.iterator().next();
List<ClientVersion> oldVersions = loadClientVersions(txn, m); List<ClientMinorVersion> oldVersions = loadClientVersions(txn, m);
if (oldVersions.equals(newVersions)) return false; if (oldVersions.equals(newVersions)) return false;
db.removeMessage(txn, m); db.removeMessage(txn, m);
storeClientVersions(txn, newVersions); storeClientVersions(txn, newVersions);
return true; return true;
} }
private List<ClientVersion> loadClientVersions(Transaction txn, MessageId m) private List<ClientMinorVersion> loadClientVersions(Transaction txn,
throws DbException { MessageId m) throws DbException {
try { try {
BdfList body = clientHelper.getMessageAsList(txn, m); BdfList body = clientHelper.getMessageAsList(txn, m);
if (body == null) throw new DbException(); if (body == null) throw new DbException();
@@ -275,21 +282,23 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
} }
private List<ClientVersion> parseClientVersions(BdfList body) private List<ClientMinorVersion> parseClientVersions(BdfList body)
throws FormatException { throws FormatException {
int size = body.size(); int size = body.size();
List<ClientVersion> parsed = new ArrayList<>(size); List<ClientMinorVersion> parsed = new ArrayList<>(size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
BdfList cv = body.getList(i); BdfList cv = body.getList(i);
ClientId clientId = new ClientId(cv.getString(0)); ClientId clientId = new ClientId(cv.getString(0));
int majorVersion = cv.getLong(1).intValue(); int majorVersion = cv.getLong(1).intValue();
parsed.add(new ClientVersion(clientId, majorVersion)); int minorVersion = cv.getLong(2).intValue();
parsed.add(new ClientMinorVersion(clientId, majorVersion,
minorVersion));
} }
return parsed; return parsed;
} }
private void clientVersionsUpdated(Transaction txn, Contact c, private void clientVersionsUpdated(Transaction txn, Contact c,
List<ClientVersion> versions) throws DbException { List<ClientMinorVersion> versions) throws DbException {
try { try {
// Find the latest local and remote updates // Find the latest local and remote updates
Group g = getContactGroup(c); Group g = getContactGroup(c);
@@ -372,11 +381,12 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
private ClientState parseClientState(BdfList clientState) private ClientState parseClientState(BdfList clientState)
throws FormatException { throws FormatException {
// Client ID, major version, active // Client ID, major version, minor version, active
ClientId clientId = new ClientId(clientState.getString(0)); ClientId clientId = new ClientId(clientState.getString(0));
int majorVersion = clientState.getLong(1).intValue(); int majorVersion = clientState.getLong(1).intValue();
boolean active = clientState.getBoolean(2); int minorVersion = clientState.getLong(2).intValue();
return new ClientState(clientId, majorVersion, active); boolean active = clientState.getBoolean(3);
return new ClientState(clientId, majorVersion, minorVersion, active);
} }
private long parseUpdateVersion(BdfList body) throws FormatException { private long parseUpdateVersion(BdfList body) throws FormatException {
@@ -385,14 +395,15 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
private List<ClientState> updateStatesFromLocalVersions( private List<ClientState> updateStatesFromLocalVersions(
List<ClientState> oldStates, List<ClientVersion> newVersions) { List<ClientState> oldStates, List<ClientMinorVersion> newVersions) {
Map<ClientVersion, ClientState> oldMap = new HashMap<>(); Map<ClientVersion, ClientState> oldMap = new HashMap<>();
for (ClientState cs : oldStates) oldMap.put(cs.version, cs); for (ClientState cs : oldStates) oldMap.put(cs.version, cs);
List<ClientState> newStates = new ArrayList<>(newVersions.size()); List<ClientState> newStates = new ArrayList<>(newVersions.size());
for (ClientVersion newVersion : newVersions) { for (ClientMinorVersion newVersion : newVersions) {
ClientState oldState = oldMap.get(newVersion); ClientState oldState = oldMap.get(newVersion.version);
boolean active = oldState != null && oldState.active; boolean active = oldState != null && oldState.active;
newStates.add(new ClientState(newVersion, active)); newStates.add(new ClientState(newVersion.version,
newVersion.minorVersion, active));
} }
return newStates; return newStates;
} }
@@ -420,7 +431,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
private BdfList encodeClientState(ClientState cs) { private BdfList encodeClientState(ClientState cs) {
return BdfList.of(cs.version.clientId.getString(), return BdfList.of(cs.version.clientId.getString(),
cs.version.majorVersion, cs.active); cs.version.majorVersion, cs.minorVersion, cs.active);
} }
private Map<ClientVersion, Visibility> getVisibilities( private Map<ClientVersion, Visibility> getVisibilities(
@@ -461,10 +472,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
private void storeFirstUpdate(Transaction txn, GroupId g, private void storeFirstUpdate(Transaction txn, GroupId g,
List<ClientVersion> versions) throws DbException { List<ClientMinorVersion> versions) throws DbException {
List<ClientState> states = new ArrayList<>(versions.size()); List<ClientState> states = new ArrayList<>(versions.size());
for (ClientVersion cv : versions) for (ClientMinorVersion cm : versions)
states.add(new ClientState(cv, false)); states.add(new ClientState(cm.version, cm.minorVersion, false));
storeUpdate(txn, g, states, 1); storeUpdate(txn, g, states, 1);
} }
@@ -487,7 +498,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
new ArrayList<>(oldLocalStates.size()); new ArrayList<>(oldLocalStates.size());
for (ClientState oldState : oldLocalStates) { for (ClientState oldState : oldLocalStates) {
boolean active = remoteSet.contains(oldState.version); boolean active = remoteSet.contains(oldState.version);
newLocalStates.add(new ClientState(oldState.version, active)); newLocalStates.add(new ClientState(oldState.version,
oldState.minorVersion, active));
} }
return newLocalStates; return newLocalStates;
} }
@@ -526,26 +538,71 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
} }
} }
private static class ClientMinorVersion
implements Comparable<ClientMinorVersion> {
private final ClientVersion version;
private final int minorVersion;
private ClientMinorVersion(ClientVersion version, int minorVersion) {
this.version = version;
this.minorVersion = minorVersion;
}
private ClientMinorVersion(ClientId clientId, int majorVersion,
int minorVersion) {
this(new ClientVersion(clientId, majorVersion), minorVersion);
}
@Override
public boolean equals(Object o) {
if (o instanceof ClientMinorVersion) {
ClientMinorVersion cm = (ClientMinorVersion) o;
return version.equals(cm.version)
&& minorVersion == cm.minorVersion;
}
return false;
}
@Override
public int hashCode() {
return version.hashCode();
}
@Override
public int compareTo(ClientMinorVersion cm) {
int compare = version.compareTo(cm.version);
if (compare != 0) return compare;
return minorVersion - cm.minorVersion;
}
}
private static class ClientState { private static class ClientState {
private final ClientVersion version; private final ClientVersion version;
private final int minorVersion;
private final boolean active; private final boolean active;
private ClientState(ClientVersion version, boolean active) { private ClientState(ClientVersion version, int minorVersion,
boolean active) {
this.version = version; this.version = version;
this.minorVersion = minorVersion;
this.active = active; this.active = active;
} }
private ClientState(ClientId clientId, int majorVersion, private ClientState(ClientId clientId, int majorVersion,
boolean active) { int minorVersion, boolean active) {
this(new ClientVersion(clientId, majorVersion), active); this(new ClientVersion(clientId, majorVersion), minorVersion,
active);
} }
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (o instanceof ClientState) { if (o instanceof ClientState) {
ClientState cs = (ClientState) o; ClientState cs = (ClientState) o;
return version.equals(cs.version) && active == cs.active; return version.equals(cs.version)
&& minorVersion == cs.minorVersion
&& active == cs.active;
} }
return false; return false;
} }

View File

@@ -39,13 +39,15 @@ class ClientVersioningValidator extends BdfMessageValidator {
int size = states.size(); int size = states.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
BdfList clientState = states.getList(i); BdfList clientState = states.getList(i);
// Client ID, major version, active // Client ID, major version, minor version, active
checkSize(clientState, 3); checkSize(clientState, 4);
String clientId = clientState.getString(0); String clientId = clientState.getString(0);
checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH); checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH);
int majorVersion = clientState.getLong(1).intValue(); int majorVersion = clientState.getLong(1).intValue();
if (majorVersion < 0) throw new FormatException(); if (majorVersion < 0) throw new FormatException();
clientState.getBoolean(2); int minorVersion = clientState.getLong(2).intValue();
if (minorVersion < 0) throw new FormatException();
clientState.getBoolean(3);
} }
// Update version // Update version
long updateVersion = body.getLong(1); long updateVersion = body.getLong(1);

View File

@@ -26,6 +26,11 @@ public interface BlogManager {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the blog client.
*/
int MINOR_VERSION = 0;
/** /**
* Adds the given {@link Blog).} * Adds the given {@link Blog).}
*/ */

View File

@@ -14,4 +14,9 @@ public interface BlogSharingManager extends SharingManager<Blog> {
* The current major version of the blog sharing client. * The current major version of the blog sharing client.
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the blog sharing client.
*/
int MINOR_VERSION = 0;
} }

View File

@@ -27,6 +27,11 @@ public interface ForumManager {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the forum client.
*/
int MINOR_VERSION = 0;
/** /**
* Subscribes to a forum. * Subscribes to a forum.
*/ */

View File

@@ -14,4 +14,9 @@ public interface ForumSharingManager extends SharingManager<Forum> {
* The current major version of the forum sharing client. * The current major version of the forum sharing client.
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the forum sharing client.
*/
int MINOR_VERSION = 0;
} }

View File

@@ -30,6 +30,11 @@ public interface IntroductionManager extends ConversationClient {
*/ */
boolean canIntroduce(Contact c1, Contact c2) throws DbException; boolean canIntroduce(Contact c1, Contact c2) throws DbException;
/**
* The current minor version of the introduction client.
*/
int MINOR_VERSION = 0;
/** /**
* Sends two initial introduction messages. * Sends two initial introduction messages.
*/ */

View File

@@ -23,6 +23,11 @@ public interface MessagingManager extends ConversationClient {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the messaging client.
*/
int MINOR_VERSION = 0;
/** /**
* Stores a local private message. * Stores a local private message.
*/ */

View File

@@ -26,6 +26,11 @@ public interface PrivateGroupManager {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the private group client.
*/
int MINOR_VERSION = 0;
/** /**
* Adds a new private group and joins it. * Adds a new private group and joins it.
* *

View File

@@ -30,6 +30,11 @@ public interface GroupInvitationManager extends ConversationClient {
*/ */
int MAJOR_VERSION = 0; int MAJOR_VERSION = 0;
/**
* The current minor version of the private group invitation client.
*/
int MINOR_VERSION = 0;
/** /**
* Sends an invitation to share the given private group with the given * Sends an invitation to share the given private group with the given
* contact, including an optional message. * contact, including an optional message.

View File

@@ -18,6 +18,7 @@ import dagger.Provides;
import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID;
import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION;
import static org.briarproject.briar.api.introduction.IntroductionManager.MINOR_VERSION;
@Module @Module
public class IntroductionModule { public class IntroductionModule {
@@ -55,7 +56,8 @@ public class IntroductionModule {
validationManager.registerIncomingMessageHook(CLIENT_ID, validationManager.registerIncomingMessageHook(CLIENT_ID,
MAJOR_VERSION, introductionManager); MAJOR_VERSION, introductionManager);
conversationManager.registerConversationClient(introductionManager); conversationManager.registerConversationClient(introductionManager);
clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION,
MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook(CLIENT_ID, clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
MAJOR_VERSION, introductionManager); MAJOR_VERSION, introductionManager);
return introductionManager; return introductionManager;

View File

@@ -19,6 +19,7 @@ import dagger.Provides;
import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID; import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID;
import static org.briarproject.briar.api.messaging.MessagingManager.MAJOR_VERSION; import static org.briarproject.briar.api.messaging.MessagingManager.MAJOR_VERSION;
import static org.briarproject.briar.api.messaging.MessagingManager.MINOR_VERSION;
@Module @Module
public class MessagingModule { public class MessagingModule {
@@ -62,7 +63,8 @@ public class MessagingModule {
validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION,
messagingManager); messagingManager);
conversationManager.registerConversationClient(messagingManager); conversationManager.registerConversationClient(messagingManager);
clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION,
MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook(CLIENT_ID, clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
MAJOR_VERSION, messagingManager); MAJOR_VERSION, messagingManager);
return messagingManager; return messagingManager;

View File

@@ -21,6 +21,7 @@ import dagger.Provides;
import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION;
import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MINOR_VERSION;
@Module @Module
public class GroupInvitationModule { public class GroupInvitationModule {
@@ -47,13 +48,15 @@ public class GroupInvitationModule {
contactManager.registerContactHook(groupInvitationManager); contactManager.registerContactHook(groupInvitationManager);
privateGroupManager.registerPrivateGroupHook(groupInvitationManager); privateGroupManager.registerPrivateGroupHook(groupInvitationManager);
conversationManager.registerConversationClient(groupInvitationManager); conversationManager.registerConversationClient(groupInvitationManager);
clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION,
MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook(CLIENT_ID, clientVersioningManager.registerClientVersioningHook(CLIENT_ID,
MAJOR_VERSION, groupInvitationManager); MAJOR_VERSION, groupInvitationManager);
// The group invitation manager handles client visibility changes for // The group invitation manager handles client visibility changes for
// the private group manager // the private group manager
clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID, clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID,
PrivateGroupManager.MAJOR_VERSION); PrivateGroupManager.MAJOR_VERSION,
PrivateGroupManager.MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook( clientVersioningManager.registerClientVersioningHook(
PrivateGroupManager.CLIENT_ID, PrivateGroupManager.CLIENT_ID,
PrivateGroupManager.MAJOR_VERSION, PrivateGroupManager.MAJOR_VERSION,

View File

@@ -84,14 +84,15 @@ public class SharingModule {
conversationManager.registerConversationClient(blogSharingManager); conversationManager.registerConversationClient(blogSharingManager);
blogManager.registerRemoveBlogHook(blogSharingManager); blogManager.registerRemoveBlogHook(blogSharingManager);
clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID, clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID,
BlogSharingManager.MAJOR_VERSION); BlogSharingManager.MAJOR_VERSION,
BlogSharingManager.MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook( clientVersioningManager.registerClientVersioningHook(
BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION,
blogSharingManager); blogSharingManager);
// The blog sharing manager handles client visibility changes for the // The blog sharing manager handles client visibility changes for the
// blog manager // blog manager
clientVersioningManager.registerClient(BlogManager.CLIENT_ID, clientVersioningManager.registerClient(BlogManager.CLIENT_ID,
BlogManager.MAJOR_VERSION); BlogManager.MAJOR_VERSION, BlogManager.MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook( clientVersioningManager.registerClientVersioningHook(
BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION, BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION,
blogSharingManager.getShareableClientVersioningHook()); blogSharingManager.getShareableClientVersioningHook());
@@ -147,14 +148,15 @@ public class SharingModule {
conversationManager.registerConversationClient(forumSharingManager); conversationManager.registerConversationClient(forumSharingManager);
forumManager.registerRemoveForumHook(forumSharingManager); forumManager.registerRemoveForumHook(forumSharingManager);
clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID, clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID,
ForumSharingManager.MAJOR_VERSION); ForumSharingManager.MAJOR_VERSION,
ForumSharingManager.MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook( clientVersioningManager.registerClientVersioningHook(
ForumSharingManager.CLIENT_ID, ForumSharingManager.CLIENT_ID,
ForumSharingManager.MAJOR_VERSION, forumSharingManager); ForumSharingManager.MAJOR_VERSION, forumSharingManager);
// The forum sharing manager handles client visibility changes for the // The forum sharing manager handles client visibility changes for the
// forum manager // forum manager
clientVersioningManager.registerClient(ForumManager.CLIENT_ID, clientVersioningManager.registerClient(ForumManager.CLIENT_ID,
ForumManager.MAJOR_VERSION); ForumManager.MAJOR_VERSION, ForumManager.MINOR_VERSION);
clientVersioningManager.registerClientVersioningHook( clientVersioningManager.registerClientVersioningHook(
ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION, ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION,
forumSharingManager.getShareableClientVersioningHook()); forumSharingManager.getShareableClientVersioningHook());