Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2007-11-12 08:17:52 +0000
committerEike Stepper2007-11-12 08:17:52 +0000
commit5ab66b90e49b2b7ab4006eb625fe97b22b2943c8 (patch)
tree0bee074589cb65eaa81c25a08bb8a1a4d7213edb /plugins/org.eclipse.net4j.buddies.server/src/org
parente8cc466cd37d0200b41628f10949cd9d5998acdb (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/BuddyAdmin.java70
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/ServerBuddy.java10
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/InviteBuddiesIndication.java12
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/OpenSessionIndication.java16
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerBuddyStateIndication.java5
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/internal/server/protocol/ServerCollaborationLeftIndication.java17
-rw-r--r--plugins/org.eclipse.net4j.buddies.server/src/org/eclipse/net4j/buddies/server/IBuddyAdmin.java6
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);

Back to the top