diff options
author | Eike Stepper | 2007-11-12 08:17:52 +0000 |
---|---|---|
committer | Eike Stepper | 2007-11-12 08:17:52 +0000 |
commit | 5ab66b90e49b2b7ab4006eb625fe97b22b2943c8 (patch) | |
tree | 0bee074589cb65eaa81c25a08bb8a1a4d7213edb /plugins/org.eclipse.net4j.buddies.server/src/org | |
parent | e8cc466cd37d0200b41628f10949cd9d5998acdb (diff) | |
download | cdo-5ab66b90e49b2b7ab4006eb625fe97b22b2943c8.tar.gz cdo-5ab66b90e49b2b7ab4006eb625fe97b22b2943c8.tar.xz cdo-5ab66b90e49b2b7ab4006eb625fe97b22b2943c8.zip |
[209380] Add invitation capability for multi buddy collaborations
https://bugs.eclipse.org/bugs/show_bug.cgi?id=209380
Diffstat (limited to 'plugins/org.eclipse.net4j.buddies.server/src/org')
7 files changed, 86 insertions, 50 deletions
diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java index c216b8b7e0..7e6dc725b1 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java @@ -13,9 +13,11 @@ package org.eclipse.net4j.buddies.internal.server; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.IProtocol; import org.eclipse.net4j.buddies.internal.protocol.Account; +import org.eclipse.net4j.buddies.internal.protocol.Buddy; import org.eclipse.net4j.buddies.internal.protocol.BuddyStateNotification; import org.eclipse.net4j.buddies.internal.protocol.Collaboration; import org.eclipse.net4j.buddies.internal.protocol.CollaborationContainer; +import org.eclipse.net4j.buddies.internal.protocol.Membership; import org.eclipse.net4j.buddies.internal.protocol.ServerFacilityFactory; import org.eclipse.net4j.buddies.internal.server.bundle.OM; import org.eclipse.net4j.buddies.internal.server.protocol.BuddyRemovedNotification; @@ -34,10 +36,13 @@ import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.lifecycle.ILifecycleEvent; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; -import java.util.HashMap; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * @author Eike Stepper @@ -48,9 +53,9 @@ public class BuddyAdmin extends CollaborationContainer implements IBuddyAdmin, I private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, BuddyAdmin.class); - private Map<String, IAccount> accounts = new HashMap<String, IAccount>(); + private ConcurrentMap<String, IAccount> accounts = new ConcurrentHashMap<String, IAccount>(); - private Map<String, ISession> sessions = new HashMap<String, ISession>(); + private ConcurrentMap<String, ISession> sessions = new ConcurrentHashMap<String, ISession>(); private long lastCollaborationID; @@ -64,9 +69,41 @@ public class BuddyAdmin extends CollaborationContainer implements IBuddyAdmin, I return accounts; } - public Map<String, ISession> getSessions() + public ISession getSession(IBuddy buddy) { - return sessions; + return getSession(buddy.getUserID()); + } + + public ISession getSession(String userID) + { + return sessions.get(userID); + } + + public ISession[] getSessions() + { + return sessions.values().toArray(new ISession[sessions.size()]); + } + + public IBuddy[] getBuddies() + { + List<IBuddy> buddies = new ArrayList<IBuddy>(); + for (ISession session : sessions.values()) + { + buddies.add(session.getSelf()); + } + + return buddies.toArray(new IBuddy[buddies.size()]); + } + + public IBuddy getBuddy(String userID) + { + ISession session = getSession(userID); + if (session == null) + { + return null; + } + + return session.getSelf(); } public synchronized ISession openSession(IChannel channel, String userID, String password, String[] facilityTypes) @@ -108,22 +145,27 @@ public class BuddyAdmin extends CollaborationContainer implements IBuddyAdmin, I public ICollaboration initiateCollaboration(IBuddy initiator, String... userIDs) { long collaborationID; - Set<IBuddy> buddies = new HashSet<IBuddy>(); - buddies.add(initiator); synchronized (this) { collaborationID = ++lastCollaborationID; - for (String userID : userIDs) + } + + Collaboration collaboration = new Collaboration(collaborationID); + LifecycleUtil.activate(collaboration); + Membership.create(initiator, collaboration); + + Set<IBuddy> buddies = new HashSet<IBuddy>(); + buddies.add(initiator); + for (String userID : userIDs) + { + Buddy buddy = (Buddy)getBuddy(userID); + if (buddy != null) { - ISession session = sessions.get(userID); - if (session != null) - { - buddies.add(session.getSelf()); - } + buddies.add(buddy); + Membership.create(buddy, collaboration); } } - Collaboration collaboration = new Collaboration(collaborationID, buddies); addCollaboration(collaboration); Set<IBuddy> invitations = new HashSet<IBuddy>(buddies); diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/ServerBuddy.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/ServerBuddy.java index fd99d1869b..6d6d097ab1 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/ServerBuddy.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/ServerBuddy.java @@ -13,11 +13,11 @@ package org.eclipse.net4j.buddies.internal.server; import org.eclipse.net4j.buddies.internal.protocol.Buddy; import org.eclipse.net4j.buddies.protocol.IAccount; import org.eclipse.net4j.buddies.protocol.IBuddy; -import org.eclipse.net4j.buddies.protocol.ICollaboration; +import org.eclipse.net4j.buddies.protocol.IMembership; import java.util.Arrays; +import java.util.Collection; import java.util.HashSet; -import java.util.Set; /** * @author Eike Stepper @@ -42,19 +42,19 @@ public class ServerBuddy extends Buddy return account; } - public ICollaboration initiate(Set<IBuddy> buddies) + public IMembership[] initiate(Collection<IBuddy> buddies) { // TODO Implement method ServerBuddy.initiate() throw new UnsupportedOperationException("Not yet implemented"); } - public ICollaboration join(long collaborationID) + public IMembership join(long collaborationID) { // TODO Implement method ServerBuddy.join() throw new UnsupportedOperationException("Not yet implemented"); } - public ICollaboration join(Object invitationToken) + public IMembership join(Object invitationToken) { // TODO Implement method ServerBuddy.join() throw new UnsupportedOperationException("Not yet implemented"); diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InviteBuddiesIndication.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InviteBuddiesIndication.java index 21e0ceaa71..248e2d7327 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InviteBuddiesIndication.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InviteBuddiesIndication.java @@ -11,12 +11,11 @@ package org.eclipse.net4j.buddies.internal.server.protocol; import org.eclipse.net4j.IChannel; -import org.eclipse.net4j.buddies.internal.protocol.Buddy; import org.eclipse.net4j.buddies.internal.protocol.Collaboration; +import org.eclipse.net4j.buddies.internal.protocol.Membership; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.buddies.internal.server.BuddyAdmin; import org.eclipse.net4j.buddies.protocol.IBuddy; -import org.eclipse.net4j.buddies.protocol.ISession; import org.eclipse.net4j.buddies.protocol.ProtocolUtil; import org.eclipse.net4j.signal.Indication; import org.eclipse.net4j.util.WrappedException; @@ -26,7 +25,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; /** @@ -51,16 +49,14 @@ public class InviteBuddiesIndication extends Indication String[] userIDs = ProtocolUtil.readUserIDs(in); Collaboration collaboration = (Collaboration)BuddyAdmin.INSTANCE.getCollaboration(collaborationID); - Map<String, ISession> sessions = BuddyAdmin.INSTANCE.getSessions(); Set<IBuddy> added = new HashSet<IBuddy>(); for (String userID : userIDs) { - ISession session = sessions.get(userID); - IBuddy buddy = session.getSelf(); - if (collaboration.addBuddy(buddy)) + IBuddy buddy = BuddyAdmin.INSTANCE.getBuddy(userID); + if (buddy != null && collaboration.getMembership(buddy) == null) { - ((Buddy)buddy).addCollaboration(collaboration); + Membership.create(buddy, collaboration); added.add(buddy); } } diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/OpenSessionIndication.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/OpenSessionIndication.java index 64c81cd358..32d927d5a1 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/OpenSessionIndication.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/OpenSessionIndication.java @@ -13,9 +13,10 @@ package org.eclipse.net4j.buddies.internal.server.protocol; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.buddies.internal.server.bundle.OM; +import org.eclipse.net4j.buddies.protocol.IAccount; +import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.ISession; import org.eclipse.net4j.buddies.protocol.ProtocolUtil; -import org.eclipse.net4j.buddies.protocol.IAccount; import org.eclipse.net4j.buddies.server.IBuddyAdmin; import org.eclipse.net4j.signal.IndicationWithResponse; import org.eclipse.net4j.util.io.ExtendedDataInputStream; @@ -24,7 +25,6 @@ import org.eclipse.net4j.util.io.ExtendedDataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * @author Eike Stepper @@ -33,7 +33,7 @@ public class OpenSessionIndication extends IndicationWithResponse { private IAccount account; - private String[] buddies; + private IBuddy[] buddies; public OpenSessionIndication() { @@ -59,9 +59,7 @@ public class OpenSessionIndication extends IndicationWithResponse synchronized (IBuddyAdmin.INSTANCE) { - Map<String, ISession> sessions = IBuddyAdmin.INSTANCE.getSessions(); - buddies = sessions.keySet().toArray(new String[sessions.size()]); - + buddies = IBuddyAdmin.INSTANCE.getBuddies(); ISession session = IBuddyAdmin.INSTANCE.openSession(getProtocol().getChannel(), userID, password, facilityTypes); if (session != null) { @@ -82,10 +80,10 @@ public class OpenSessionIndication extends IndicationWithResponse { List<IChannel> channels = new ArrayList<IChannel>(); out.writeInt(buddies.length); - for (String buddy : buddies) + for (IBuddy buddy : buddies) { - out.writeString(buddy); - ISession buddySession = IBuddyAdmin.INSTANCE.getSessions().get(buddy); + out.writeString(buddy.getUserID()); + ISession buddySession = IBuddyAdmin.INSTANCE.getSession(buddy); if (buddySession != null) { channels.add(buddySession.getChannel()); diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerBuddyStateIndication.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerBuddyStateIndication.java index c75e23cf3e..0cab41645d 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerBuddyStateIndication.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerBuddyStateIndication.java @@ -6,8 +6,6 @@ import org.eclipse.net4j.buddies.protocol.ISession; import org.eclipse.net4j.buddies.protocol.IBuddy.State; import org.eclipse.net4j.buddies.server.IBuddyAdmin; -import java.util.Map; - /** * @author Eike Stepper */ @@ -22,8 +20,7 @@ public class ServerBuddyStateIndication extends BuddyStateIndication { synchronized (IBuddyAdmin.INSTANCE) { - Map<String, ISession> sessions = IBuddyAdmin.INSTANCE.getSessions(); - ISession session = sessions.get(userID); + ISession session = IBuddyAdmin.INSTANCE.getSession(userID); if (session != null) { ServerBuddy buddy = (ServerBuddy)session.getSelf(); diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerCollaborationLeftIndication.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerCollaborationLeftIndication.java index 4d60348f90..e7f440539a 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerCollaborationLeftIndication.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerCollaborationLeftIndication.java @@ -1,12 +1,13 @@ package org.eclipse.net4j.buddies.internal.server.protocol; +import org.eclipse.net4j.buddies.internal.protocol.Buddy; import org.eclipse.net4j.buddies.internal.protocol.Collaboration; import org.eclipse.net4j.buddies.internal.protocol.CollaborationLeftIndication; import org.eclipse.net4j.buddies.internal.protocol.CollaborationLeftNotification; import org.eclipse.net4j.buddies.internal.server.BuddyAdmin; import org.eclipse.net4j.buddies.protocol.IBuddy; +import org.eclipse.net4j.buddies.protocol.IMembership; import org.eclipse.net4j.buddies.server.IBuddyAdmin; -import org.eclipse.net4j.util.ObjectUtil; import org.eclipse.net4j.util.WrappedException; /** @@ -16,19 +17,21 @@ public class ServerCollaborationLeftIndication extends CollaborationLeftIndicati { public ServerCollaborationLeftIndication() { - super(IBuddyAdmin.INSTANCE); + super(IBuddyAdmin.INSTANCE, IBuddyAdmin.INSTANCE); } @Override - protected void collaborationLeft(Collaboration collaboration, String userID) + protected void collaborationLeft(Buddy buddy, Collaboration collaboration) { - for (IBuddy buddy : collaboration.getBuddies()) + for (IMembership membership : collaboration.getMemberships()) { - if (!ObjectUtil.equals(buddy.getUserID(), userID)) + IBuddy member = membership.getBuddy(); + if (member != buddy) { try { - new CollaborationLeftNotification(buddy.getSession().getChannel(), collaboration.getID(), userID).send(); + new CollaborationLeftNotification(member.getSession().getChannel(), collaboration.getID(), member.getUserID()) + .send(); } catch (Exception ex) { @@ -37,7 +40,7 @@ public class ServerCollaborationLeftIndication extends CollaborationLeftIndicati } } - super.collaborationLeft(collaboration, userID); + super.collaborationLeft(buddy, collaboration); if (collaboration.getBuddies().length == 0 && !collaboration.isPublic()) { BuddyAdmin.INSTANCE.removeCollaboration(collaboration.getID()); diff --git a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java index 8a57521a9d..aa112210a3 100644 --- a/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java +++ b/plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java @@ -14,23 +14,23 @@ import org.eclipse.net4j.IChannel; import org.eclipse.net4j.buddies.internal.server.BuddyAdmin; import org.eclipse.net4j.buddies.protocol.IAccount; import org.eclipse.net4j.buddies.protocol.IBuddy; +import org.eclipse.net4j.buddies.protocol.IBuddyProvider; import org.eclipse.net4j.buddies.protocol.ICollaboration; import org.eclipse.net4j.buddies.protocol.ICollaborationContainer; import org.eclipse.net4j.buddies.protocol.ISession; +import org.eclipse.net4j.buddies.protocol.ISessionProvider; import java.util.Map; /** * @author Eike Stepper */ -public interface IBuddyAdmin extends ICollaborationContainer +public interface IBuddyAdmin extends ICollaborationContainer, IBuddyProvider, ISessionProvider { public static final IBuddyAdmin INSTANCE = BuddyAdmin.INSTANCE; public Map<String, IAccount> getAccounts(); - public Map<String, ISession> getSessions(); - public ISession openSession(IChannel channel, String userID, String password, String[] facilityTypes); public ICollaboration initiateCollaboration(IBuddy initiator, String... userIDs); |