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/src | |
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/src')
10 files changed, 78 insertions, 85 deletions
diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/BuddyCollaboration.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/BuddyCollaboration.java index 5dfc69fe26..281adaa414 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/BuddyCollaboration.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/BuddyCollaboration.java @@ -29,7 +29,6 @@ import org.eclipse.net4j.util.container.IPluginContainer; import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * @author Eike Stepper @@ -40,9 +39,9 @@ public class BuddyCollaboration extends Collaboration implements IBuddyCollabora private IBuddySession session; - public BuddyCollaboration(IBuddySession session, long id, Set<IBuddy> buddies) + public BuddyCollaboration(IBuddySession session, long id) { - super(id, buddies); + super(id); this.session = session; } @@ -113,20 +112,20 @@ public class BuddyCollaboration extends Collaboration implements IBuddyCollabora public void invite(IBuddy... buddies) { - List<IBuddy> toBeInvited = new ArrayList<IBuddy>(); + List<IBuddy> invitations = new ArrayList<IBuddy>(); for (IBuddy buddy : buddies) { - if (getBuddy(buddy.getUserID()) == null) + if (getMembership(buddy) == null) { - toBeInvited.add(buddy); + invitations.add(buddy); } } - if (!toBeInvited.isEmpty()) + if (!invitations.isEmpty()) { try { - new InviteBuddiesNotification(session.getChannel(), getID(), toBeInvited).send(); + new InviteBuddiesNotification(session.getChannel(), getID(), invitations).send(); } catch (Exception ex) { diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientBuddy.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientBuddy.java index adf9fad3c2..b8dc21fcef 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientBuddy.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientBuddy.java @@ -13,8 +13,9 @@ package org.eclipse.net4j.internal.buddies; 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.Collection; import java.util.Set; /** @@ -53,17 +54,17 @@ public class ClientBuddy extends Buddy return account; } - public ICollaboration initiate(Set<IBuddy> buddies) + public IMembership[] initiate(Collection<IBuddy> buddies) { throw new UnsupportedOperationException(); } - public ICollaboration join(long collaborationID) + public IMembership join(long collaborationID) { throw new UnsupportedOperationException(); } - public ICollaboration join(Object invitationToken) + public IMembership join(Object invitationToken) { throw new UnsupportedOperationException(); } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientSession.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientSession.java index 6d69f5fc36..ab74d579b5 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientSession.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/ClientSession.java @@ -18,7 +18,7 @@ import org.eclipse.net4j.buddies.internal.protocol.Collaboration; import org.eclipse.net4j.buddies.protocol.IAccount; import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.IBuddyStateEvent; -import org.eclipse.net4j.buddies.protocol.ICollaboration; +import org.eclipse.net4j.buddies.protocol.IMembership; import org.eclipse.net4j.internal.buddies.bundle.OM; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; @@ -117,9 +117,10 @@ public class ClientSession extends BuddyContainer implements IBuddySession, ILis IBuddy buddy = removeBuddy(userID); if (buddy != null) { - for (ICollaboration collaboration : self.getCollaborations()) + for (IMembership membership : self.getMemberships()) { - ((Collaboration)collaboration).removeBuddy(userID); + Collaboration collaboration = (Collaboration)membership.getCollaboration(); + collaboration.removeMembership(buddy); } LifecycleUtil.deactivate(buddy); diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/Self.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/Self.java index 6716fe8987..7ff9246a58 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/Self.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/Self.java @@ -12,14 +12,18 @@ package org.eclipse.net4j.internal.buddies; import org.eclipse.net4j.IChannel; import org.eclipse.net4j.buddies.internal.protocol.Buddy; +import org.eclipse.net4j.buddies.internal.protocol.Membership; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; 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 org.eclipse.net4j.internal.buddies.protocol.InitiateCollaborationRequest; import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Set; /** @@ -51,7 +55,7 @@ public class Self extends Buddy return account; } - public ICollaboration initiate(Set<IBuddy> buddies) + public IMembership[] initiate(Collection<IBuddy> buddies) { try { @@ -59,15 +63,18 @@ public class Self extends Buddy IChannel channel = session.getChannel(); long id = new InitiateCollaborationRequest(channel, buddies).send(ProtocolConstants.TIMEOUT); - BuddyCollaboration collaboration = new BuddyCollaboration(session, id, buddies); + BuddyCollaboration collaboration = new BuddyCollaboration(session, id); LifecycleUtil.activate(collaboration); - addCollaboration(collaboration); + Membership.create(this, collaboration); + + List<IMembership> memberships = new ArrayList<IMembership>(); for (IBuddy buddy : buddies) { - ((Buddy)buddy).addCollaboration(collaboration); + IMembership membership = Membership.create(buddy, collaboration); + memberships.add(membership); } - return collaboration; + return memberships.toArray(new IMembership[memberships.size()]); } catch (Exception ex) { @@ -75,13 +82,13 @@ public class Self extends Buddy } } - public ICollaboration join(long collaborationID) + public IMembership join(long collaborationID) { // TODO Implement method Self.join() throw new UnsupportedOperationException("Not yet implemented"); } - public ICollaboration join(Object invitationToken) + public IMembership join(Object invitationToken) { // TODO Implement method Self.join() throw new UnsupportedOperationException("Not yet implemented"); @@ -90,9 +97,9 @@ public class Self extends Buddy @Override protected void doDeactivate() throws Exception { - for (ICollaboration collaboration : getCollaborations()) + for (IMembership membership : getMemberships()) { - LifecycleUtil.deactivate(collaboration); + LifecycleUtil.deactivate(membership.getCollaboration()); } super.doDeactivate(); diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyAddedIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyAddedIndication.java index 64b48dc600..7a69d06d80 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyAddedIndication.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyAddedIndication.java @@ -13,7 +13,6 @@ package org.eclipse.net4j.internal.buddies.protocol; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.internal.buddies.ClientSession; import org.eclipse.net4j.signal.Indication; -import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import java.io.IOException; @@ -37,18 +36,7 @@ public class BuddyAddedIndication extends Indication protected void indicating(ExtendedDataInputStream in) throws IOException { String buddy = in.readString(); - for (int i = 0; i < 50; i++) - { - ClientSession session = (ClientSession)getProtocol().getInfraStructure(); - if (session == null) - { - ConcurrencyUtil.sleep(100); - } - else - { - session.buddyAdded(buddy); - break; - } - } + ClientSession session = ((ClientProtocol)getProtocol()).getSession(); + session.buddyAdded(buddy); } } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyRemovedIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyRemovedIndication.java index 6cf03b6feb..c0665d3cdc 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyRemovedIndication.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/BuddyRemovedIndication.java @@ -13,7 +13,6 @@ package org.eclipse.net4j.internal.buddies.protocol; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.internal.buddies.ClientSession; import org.eclipse.net4j.signal.Indication; -import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import java.io.IOException; @@ -37,18 +36,7 @@ public class BuddyRemovedIndication extends Indication protected void indicating(ExtendedDataInputStream in) throws IOException { String buddy = in.readString(); - for (int i = 0; i < 50; i++) - { - ClientSession session = (ClientSession)getProtocol().getInfraStructure(); - if (session == null) - { - ConcurrencyUtil.sleep(100); - } - else - { - session.buddyRemoved(buddy); - break; - } - } + ClientSession session = ((ClientProtocol)getProtocol()).getSession(); + session.buddyRemoved(buddy); } } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientBuddyStateIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientBuddyStateIndication.java index ec36325620..ad0fbb9398 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientBuddyStateIndication.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientBuddyStateIndication.java @@ -4,7 +4,6 @@ import org.eclipse.net4j.buddies.internal.protocol.BuddyStateIndication; import org.eclipse.net4j.buddies.protocol.IBuddy.State; import org.eclipse.net4j.internal.buddies.ClientBuddy; import org.eclipse.net4j.internal.buddies.ClientSession; -import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; /** * @author Eike Stepper @@ -16,25 +15,13 @@ public class ClientBuddyStateIndication extends BuddyStateIndication } @Override - protected void stateChanged(String userID, State state) + protected void stateChanged(final String userID, final State state) { - for (int i = 0; i < 50; i++) + ClientSession session = ((ClientProtocol)getProtocol()).getSession(); + ClientBuddy buddy = (ClientBuddy)session.getBuddy(userID); + if (buddy != null) { - ClientSession session = (ClientSession)getProtocol().getInfraStructure(); - if (session == null) - { - ConcurrencyUtil.sleep(100); - } - else - { - ClientBuddy buddy = (ClientBuddy)session.getBuddy(userID); - if (buddy != null) - { - buddy.setState(state); - } - - break; - } + buddy.setState(state); } } }
\ No newline at end of file diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientCollaborationLeftIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientCollaborationLeftIndication.java index 3064146c44..cb98d4b437 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientCollaborationLeftIndication.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientCollaborationLeftIndication.java @@ -20,19 +20,16 @@ import org.eclipse.net4j.internal.buddies.Self; */ public class ClientCollaborationLeftIndication extends CollaborationLeftIndication { - private Self self; - public ClientCollaborationLeftIndication(Self self) { - super(self); - this.self = self; + super(self.getSession(), self); } @Override - protected void collaborationLeft(Collaboration collaboration, String userID) + protected void collaborationLeft(Buddy buddy, Collaboration collaboration) { - Buddy buddy = (Buddy)self.getSession().getBuddy(userID); - buddy.removeCollaboration(collaboration.getID()); - super.collaborationLeft(collaboration, userID); + buddy.removeMembership(collaboration); + collaboration.removeMembership(buddy); + super.collaborationLeft(buddy, collaboration); } } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientProtocol.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientProtocol.java index ac1ca69e75..7f11c483c3 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientProtocol.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/ClientProtocol.java @@ -13,15 +13,21 @@ package org.eclipse.net4j.internal.buddies.protocol; import org.eclipse.net4j.buddies.internal.protocol.MessageIndication; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.buddies.protocol.ISession; +import org.eclipse.net4j.internal.buddies.ClientSession; import org.eclipse.net4j.internal.buddies.Self; import org.eclipse.net4j.signal.SignalProtocol; import org.eclipse.net4j.signal.SignalReactor; +import org.eclipse.net4j.util.concurrent.ConcurrencyUtil; /** * @author Eike Stepper */ public class ClientProtocol extends SignalProtocol { + private static final long GET_SESSION_TIMEOUT = 20000; + + private static final int GET_SESSION_INTERVAL = 100; + public ClientProtocol() { } @@ -66,4 +72,23 @@ public class ClientProtocol extends SignalProtocol ISession session = (ISession)getInfraStructure(); return (Self)session.getSelf(); } + + public ClientSession getSession() + { + int max = (int)(GET_SESSION_TIMEOUT / GET_SESSION_INTERVAL); + for (int i = 0; i < max; i++) + { + ClientSession session = (ClientSession)getInfraStructure(); + if (session == null) + { + ConcurrencyUtil.sleep(GET_SESSION_INTERVAL); + } + else + { + return session; + } + } + + throw new IllegalStateException("No session after " + max + " milliseconds"); + } } diff --git a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java index bb4d1420b2..5c951b1aa3 100644 --- a/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java +++ b/plugins/org.eclipse.net4j.buddies/src/org/eclipse/net4j/internal/buddies/protocol/CollaborationInitiatedIndication.java @@ -11,11 +11,11 @@ package org.eclipse.net4j.internal.buddies.protocol; import org.eclipse.net4j.buddies.IBuddySession; +import org.eclipse.net4j.buddies.internal.protocol.Membership; import org.eclipse.net4j.buddies.internal.protocol.ProtocolConstants; import org.eclipse.net4j.buddies.protocol.IBuddy; import org.eclipse.net4j.buddies.protocol.ProtocolUtil; import org.eclipse.net4j.internal.buddies.BuddyCollaboration; -import org.eclipse.net4j.internal.buddies.ClientBuddy; import org.eclipse.net4j.internal.buddies.Self; import org.eclipse.net4j.signal.Indication; import org.eclipse.net4j.util.io.ExtendedDataInputStream; @@ -51,20 +51,20 @@ public class CollaborationInitiatedIndication extends Indication BuddyCollaboration collaboration = (BuddyCollaboration)self.getCollaboration(collaborationID); if (collaboration == null) { - collaboration = new BuddyCollaboration(session, collaborationID, buddies); + collaboration = new BuddyCollaboration(session, collaborationID); LifecycleUtil.activate(collaboration); - self.addCollaboration(collaboration); + + Membership.create(self, collaboration); for (IBuddy buddy : buddies) { - ((ClientBuddy)buddy).addCollaboration(collaboration); + Membership.create(buddy, collaboration); } } else { for (IBuddy buddy : buddies) { - collaboration.addBuddy(buddy); - ((ClientBuddy)buddy).addCollaboration(collaboration); + Membership.create(buddy, collaboration); } } } |