diff options
| author | slewis | 2005-01-05 23:40:21 +0000 |
|---|---|---|
| committer | slewis | 2005-01-05 23:40:21 +0000 |
| commit | 93a61b29e9739c7f307024926830e388f716f8f1 (patch) | |
| tree | cea0dd57717a286175bff4a1eb7ea4b8d732021a | |
| parent | ae07a85e65e1b0a91477acf51d8dd95b833cf93c (diff) | |
| download | org.eclipse.ecf-93a61b29e9739c7f307024926830e388f716f8f1.tar.gz org.eclipse.ecf-93a61b29e9739c7f307024926830e388f716f8f1.tar.xz org.eclipse.ecf-93a61b29e9739c7f307024926830e388f716f8f1.zip | |
Added event interface and class for handling eject events. Fixed handling of eject and leaveGroup operations in provider implementation. Added test code.
6 files changed, 140 insertions, 29 deletions
diff --git a/framework/bundles/org.eclipse.ecf.provider/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.provider/META-INF/MANIFEST.MF index c3a4d3fac..cc6122bc7 100644 --- a/framework/bundles/org.eclipse.ecf.provider/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.provider/META-INF/MANIFEST.MF @@ -8,6 +8,6 @@ Bundle-Localization: plugin Eclipse-AutoStart: true Require-Bundle: org.eclipse.core.runtime, org.eclipse.ecf -Provide-Package: org.eclipse.ecf.provider.comm.tcp +Provide-Package: org.eclipse.ecf.provider.comm.tcp, org.eclipse.ecf.provider.generic, org.eclipse.ecf.provider.generic.gmm DynamicImport-Package: * diff --git a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ClientSOContainer.java b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ClientSOContainer.java index 0e2d5b17e..cafc8ecad 100644 --- a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ClientSOContainer.java +++ b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ClientSOContainer.java @@ -26,6 +26,7 @@ import org.eclipse.ecf.core.comm.IConnection; import org.eclipse.ecf.core.comm.ISynchAsynchConnection; import org.eclipse.ecf.core.comm.SynchConnectionEvent; import org.eclipse.ecf.core.events.SharedObjectContainerDepartedEvent; +import org.eclipse.ecf.core.events.SharedObjectContainerEjectedEvent; import org.eclipse.ecf.core.events.SharedObjectContainerJoinGroupEvent; import org.eclipse.ecf.core.events.SharedObjectContainerJoinedEvent; import org.eclipse.ecf.core.events.SharedObjectContainerLeaveGroupEvent; @@ -161,6 +162,20 @@ public abstract class ClientSOContainer extends SOContainer { } } + protected void handleLeaveGroupMessage(ContainerMessage mess) { + ContainerMessage.LeaveGroupMessage lgm = (ContainerMessage.LeaveGroupMessage) mess.getData(); + ID fromID = mess.getFromContainerID(); + if (fromID == null || !fromID.equals(remoteServerID)) { + // we ignore anything not from our server + return; + } + debug("We've been ejected from group "+remoteServerID); + synchronized (getGroupMembershipLock()) { + memberLeave(fromID,connection); + } + // Now notify that we've been ejected + fireContainerEvent(new SharedObjectContainerEjectedEvent(fromID,getID(),lgm.getData())); + } protected void handleViewChangeMessage(ContainerMessage mess) throws IOException { debug("handleViewChangeMessage(" + mess + ")"); @@ -184,9 +199,19 @@ public abstract class ClientSOContainer extends SOContainer { // Notify listeners fireContainerEvent(new SharedObjectContainerJoinedEvent(getID(),changeIDs[i])); } else { - groupManager.removeMember(changeIDs[i]); - // Notify listeners - fireContainerEvent(new SharedObjectContainerDepartedEvent(getID(),changeIDs[i])); + if (changeIDs[i].equals(getID())) { + // We've been ejected. + ID serverID = remoteServerID; + synchronized (getGroupMembershipLock()) { + memberLeave(remoteServerID,connection); + } + // Notify listeners that we've been ejected + fireContainerEvent(new SharedObjectContainerEjectedEvent(getID(),serverID,vc.getData())); + } else { + groupManager.removeMember(changeIDs[i]); + // Notify listeners that another remote has gone away + fireContainerEvent(new SharedObjectContainerDepartedEvent(getID(),changeIDs[i])); + } } } } diff --git a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java index 788457ad5..dd8e3fc4b 100644 --- a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java +++ b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java @@ -757,6 +757,7 @@ public abstract class SOContainer implements ISharedObjectContainer { protected void memberLeave(ID target, IConnection conn) { debug("memberLeave:" + target + ":" + conn); + if (target == null) return; if (groupManager.removeMember(target)) { try { forwardExcluding(getID(),target,ContainerMessage.makeViewChangeMessage(getID(),null,getNextSequenceNumber(),new ID[] { target },false,null)); @@ -807,6 +808,11 @@ public abstract class SOContainer implements ISharedObjectContainer { } } + /** + * @param mess + */ + protected abstract void handleLeaveGroupMessage(ContainerMessage mess); + protected void processDisconnect(DisconnectConnectionEvent e) { debug("processDisconnect:" + e); try { @@ -820,9 +826,10 @@ public abstract class SOContainer implements ISharedObjectContainer { throws IOException { debug("processSynch:" + e); ContainerMessage mess = getObjectFromBytes((byte[]) e.getData()); - ID fromID = mess.getFromContainerID(); - synchronized (getGroupMembershipLock()) { - memberLeave(fromID, e.getConnection()); + Serializable data = mess.getData(); + // Must be non null + if (data != null && data instanceof ContainerMessage.LeaveGroupMessage) { + handleLeaveGroupMessage(mess); } return null; } diff --git a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ServerSOContainer.java b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ServerSOContainer.java index 70f973dcd..4bb2a081e 100644 --- a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ServerSOContainer.java +++ b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ServerSOContainer.java @@ -19,9 +19,10 @@ import java.net.Socket; import org.eclipse.ecf.core.ISharedObjectContainerConfig; import org.eclipse.ecf.core.SharedObjectContainerJoinException; import org.eclipse.ecf.core.comm.IAsynchConnection; -import org.eclipse.ecf.core.comm.IConnection; import org.eclipse.ecf.core.comm.ISynchAsynchConnection; +import org.eclipse.ecf.core.comm.ISynchConnection; import org.eclipse.ecf.core.events.SharedObjectContainerDepartedEvent; +import org.eclipse.ecf.core.events.SharedObjectContainerEjectedEvent; import org.eclipse.ecf.core.events.SharedObjectContainerJoinedEvent; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.provider.generic.gmm.Member; @@ -104,7 +105,7 @@ public class ServerSOContainer extends SOContainer { } public void leaveGroup() { - ejectAllGroupMembers(); + ejectAllGroupMembers(null); } protected ContainerMessage acceptNewClient(Socket socket, String target, @@ -158,45 +159,49 @@ public class ServerSOContainer extends SOContainer { return null; } } - - protected Serializable getConnectDataFromInput(Serializable input) - throws Exception { - return input; - } - protected Object checkJoin(String hostname, ID id, Serializable data) throws Exception { return null; } - - protected void memberLeave(ID leaveID, IConnection conn) { - super.memberLeave(leaveID,conn); + protected void handleLeaveGroupMessage(ContainerMessage mess) { + ID fromID = mess.getFromContainerID(); + if (fromID == null) return; + ID toID = mess.getToContainerID(); + debug("Member "+fromID+"leaving group"); + synchronized (getGroupMembershipLock()) { + IAsynchConnection conn = getConnectionForID(fromID); + if (conn == null) return; + memberLeave(fromID,conn); + } // Notify listeners - fireContainerEvent(new SharedObjectContainerDepartedEvent(getID(),leaveID)); + fireContainerEvent(new SharedObjectContainerDepartedEvent(getID(),fromID)); } - public void ejectGroupMember(ID memberID) { - IAsynchConnection conn = null; + public void ejectFromGroup(ID memberID, Serializable reason) { + if (memberID == null) return; + ISynchConnection conn = null; synchronized (getGroupMembershipLock()) { - conn = getConnectionForID(memberID); + conn = getSynchConnectionForID(memberID); if (conn == null) return; try { - conn.sendAsynch(memberID, getBytesForObject(ContainerMessage + conn.sendSynch(memberID, getBytesForObject(ContainerMessage .makeLeaveGroupMessage(getID(), memberID, - getNextSequenceNumber(), null))); + getNextSequenceNumber(), reason))); } catch (Exception e) { logException("Exception in ejectGroupMember.sendAsynch()",e); } memberLeave(memberID, conn); } + // Notify listeners + fireContainerEvent(new SharedObjectContainerEjectedEvent(memberID,getID(),reason)); } - public void ejectAllGroupMembers() { + public void ejectAllGroupMembers(Serializable reason) { synchronized (getGroupMembershipLock()) { Object[] members = groupManager.getMembers(); for (int i = 0; i < members.length; i++) { - ejectGroupMember(((Member) members[i]).getID()); + ejectFromGroup(((Member) members[i]).getID(),reason); } } } @@ -214,11 +219,19 @@ public class ServerSOContainer extends SOContainer { protected IAsynchConnection getConnectionForID(ID memberID) { Member mem = groupManager.getMemberForID(memberID); - if (mem == null) + if (mem == null || !(mem.getData() instanceof IAsynchConnection)) return null; return (IAsynchConnection) mem.getData(); } + protected ISynchConnection getSynchConnectionForID(ID memberID) { + Member mem = groupManager.getMemberForID(memberID); + if (mem == null || !(mem.getData() instanceof ISynchConnection)) + return null; + + return (ISynchConnection) mem.getData(); + } + private final void queueToAll(ContainerMessage message) { Object[] members = groupManager.getMembers(); for (int i = 0; i < members.length; i++) { @@ -229,7 +242,7 @@ public class ServerSOContainer extends SOContainer { conn.sendAsynch(message.getToContainerID(), getBytesForObject(message)); } catch (IOException e) { - // XXX report + logException("Exception in queueToAll for ContainerMessage "+message,e); } } } @@ -237,7 +250,7 @@ public class ServerSOContainer extends SOContainer { public void dispose(long timeout) { // For servers, we'll eject all members - ejectAllGroupMembers(); + ejectAllGroupMembers(null); super.dispose(timeout); } }
\ No newline at end of file diff --git a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/ISharedObjectContainerEjectedEvent.java b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/ISharedObjectContainerEjectedEvent.java new file mode 100644 index 000000000..c736c13da --- /dev/null +++ b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/ISharedObjectContainerEjectedEvent.java @@ -0,0 +1,17 @@ +/******************************************************************************* + * Copyright (c) 2004 Composent, Inc. and others. All rights reserved. This + * program and the accompanying materials are made available under the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: Composent, Inc. - initial API and implementation + ******************************************************************************/ +package org.eclipse.ecf.core.events; + +import java.io.Serializable; +import org.eclipse.ecf.core.identity.ID; + +public interface ISharedObjectContainerEjectedEvent extends IContainerEvent { + public ID getGroupID(); + public Serializable getReason(); +}
\ No newline at end of file diff --git a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/SharedObjectContainerEjectedEvent.java b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/SharedObjectContainerEjectedEvent.java new file mode 100644 index 000000000..9dceae471 --- /dev/null +++ b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/SharedObjectContainerEjectedEvent.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2004 Composent, Inc. and others. All rights reserved. This + * program and the accompanying materials are made available under the terms of + * the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: Composent, Inc. - initial API and implementation + ******************************************************************************/ +package org.eclipse.ecf.core.events; + +import java.io.Serializable; +import org.eclipse.ecf.core.identity.ID; + +public class SharedObjectContainerEjectedEvent implements + ISharedObjectContainerEjectedEvent { + private final ID localContainerID; + private final ID groupID; + private final Serializable reason; + + public SharedObjectContainerEjectedEvent(ID containerID, ID groupID, Serializable reason) { + super(); + this.localContainerID = containerID; + this.groupID = groupID; + this.reason = reason; + } + + public ID getGroupID() { + return groupID; + } + public ID getLocalContainerID() { + return localContainerID; + } + public Serializable getReason() { + return reason; + } + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuffer buf = new StringBuffer( + "SharedObjectContainerEjectedEvent["); + buf.append(getLocalContainerID()).append(";"); + buf.append(getGroupID()).append(";"); + buf.append(getReason()).append("]"); + return buf.toString(); + } +}
\ No newline at end of file |
