final synchronized void deconnection(String id) { for (Iterator i = distantKernels.iterator(); i.hasNext(); ) { AgentAddress distantK = (AgentAddress) i.next(); if (distantK.getKernel().getID().equals(id)) { debug("disconnected from " + id); for (Iterator j = organizations.entrySet().iterator(); j.hasNext(); ) { Map.Entry e = (Map.Entry) j.next(); Organization org = (Organization) e.getValue(); if (org.removeAgentsFromKernel(distantK.getKernel())) { leaveGroup("communities", (String) e.getKey()); sendAll( new SynchroMessage( Kernel.LEAVE_GROUP, getAddress(), COMMUNITIES, (String) e.getKey(), null, null)); sendAll(new SynchroMessage(Kernel.DELETE_COMMUNITY, (String) e.getKey())); j.remove(); } } kernelAgent.callHooks(Kernel.DISCONNECTED_FROM, distantK.getKernel()); kernelAgent.callHooks(Kernel.REMOVE_MEMBER_ROLE, distantK, COMMUNITIES, PUBLIC, SITE); i.remove(); System.gc(); System.runFinalization(); break; } } if (gui != null) gui.refreshCommunities(); }
final synchronized void tryMigration(KernelAddress destination, AgentAddress traveler) { AbstractAgent ref = Kernel.getReference(traveler); Message message = new SynchroMessage(ref); for (Iterator i = distantKernels.iterator(); i.hasNext(); ) { AgentAddress potentialReceiver = (AgentAddress) i.next(); if (potentialReceiver.getKernel().equals(destination)) { message.setReceiver(potentialReceiver); break; } } if (message.getReceiver() != null && ref != null) { // kernelAgent.callshook ... updateDistantOrgs(Kernel.MIGRATION,traveler,null,null,null); if (ref instanceof Agent) { ((Agent) ref).getAgentThread().stop(); ref.setCurrentKernel(null); // ref.messageBox=null; } getCurrentKernel().removeAgentFromOrganizations(traveler); getCurrentKernel().removeReferenceOf(traveler); message.setSender(getAddress()); sendDistantMessage(message); } }