Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslewis2005-01-05 23:40:21 +0000
committerslewis2005-01-05 23:40:21 +0000
commit93a61b29e9739c7f307024926830e388f716f8f1 (patch)
treecea0dd57717a286175bff4a1eb7ea4b8d732021a
parentae07a85e65e1b0a91477acf51d8dd95b833cf93c (diff)
downloadorg.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.
-rw-r--r--framework/bundles/org.eclipse.ecf.provider/META-INF/MANIFEST.MF2
-rw-r--r--framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ClientSOContainer.java31
-rw-r--r--framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java13
-rw-r--r--framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/ServerSOContainer.java57
-rw-r--r--framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/ISharedObjectContainerEjectedEvent.java17
-rw-r--r--framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/events/SharedObjectContainerEjectedEvent.java49
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

Back to the top