Buggy code:
public abstract class ClientSOContainer extends SOContainer { protected ISynchAsynchConnection connection ; protected ID remoteServerID ; protected byte connectionState ; public static final byte UNCONNECTED = 0 ; public static final byte CONNECTING = 1 ; public static final byte CONNECTED = 2 ; static final class Lock { } protected ClientSOContainer . Lock connectLock ; protected ClientSOContainer . Lock getConnectLock ( ) { } protected ISynchAsynchConnection getConnection ( ) { } public ClientSOContainer ( ISharedObjectContainerConfig config ) { } public void dispose ( ) { } public final boolean isGroupManager ( ) { } public ID getConnectedID ( ) { } protected Callback [ ] makeAuthorizationCallbacks ( ) { } public void connect ( ID remote , IConnectContext joinContext ) throws ContainerConnectException { } protected int getConnectTimeout ( ) { } protected void handleLeaveGroupMessage ( ContainerMessage mess ) { } protected void handleViewChangeMessage ( ContainerMessage mess ) throws IOException { } protected void forwardExcluding ( ID from , ID excluding , ContainerMessage data ) throws IOException { } protected Object makeConnectData ( ID target , Callback [ ] cbs , Object data ) { } protected Serializable getLeaveData ( ID target ) { } public void disconnect ( ) { ID groupID = getConnectedID ( ) ; <START_BUG> debug ( ( "leaveGroup:" + groupID ) ) ; <END_BUG> fireContainerEvent ( new org . eclipse . ecf . core . events . SharedObjectContainerDisconnectingEvent ( this . getID ( ) , groupID ) ) ; synchronized ( connectLock ) { if ( isConnected ( ) ) { synchronized ( connection ) { try { connection . sendSynch ( groupID , serializeObject ( ContainerMessage . makeLeaveGroupMessage ( getID ( ) , groupID , getNextSequenceNumber ( ) , getLeaveData ( groupID ) ) ) ) ; } catch ( Exception e ) { } synchronized ( getGroupMembershipLock ( ) ) { memberLeave ( groupID , connection ) ; } } } connectionState = ClientSOContainer . UNCONNECTED ; connection = null ; remoteServerID = null ; } fireContainerEvent ( new org . eclipse . ecf . core . events . SharedObjectContainerDisconnectedEvent ( this . getID ( ) , groupID ) ) ; } protected abstract ISynchAsynchConnection makeConnection ( ID remoteSpace , Object data ) throws ConnectionInstantiationException { } protected void queueContainerMessage ( ContainerMessage message ) throws IOException { } protected void forwardExcluding ( ID from , ID excluding , byte msg , Serializable data ) throws IOException { } protected void forwardToRemote ( ID from , ID to , ContainerMessage message ) throws IOException { } protected ID getIDForConnection ( IAsynchConnection conn ) { } protected void memberLeave ( ID fromID , IAsynchConnection conn ) { } protected void sendMessage ( ContainerMessage data ) throws IOException { } protected ID [ ] sendCreateMsg ( ID toID , SharedObjectDescription createInfo ) throws IOException { } protected void processDisconnect ( DisconnectConnectionEvent evt ) { } protected void processAsynchPacket ( AsynchConnectionEvent evt ) throws IOException { } protected Serializable processSynch ( SynchConnectionEvent evt ) throws IOException { } protected boolean isConnected ( ) { } protected boolean isConnecting ( ) { } private void checkConnected ( ) throws ConnectException { } protected ID handleConnectResponse ( ID orginalTarget , Object serverData ) throws Exception { } }

Fix:
debug ( ( ( "disconnect(" + groupID ) + ")" ) ) ;