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); } }
final synchronized void handleNetworkRequest(NetworkRequest m) { switch (m.getRequestCode()) { case NetworkRequest.INJECT_MESSAGE: try { Message m2 = (Message) m.getArgument(); getCurrentKernel().sendLocalMessage(m2); if (!(m2 instanceof PrivateMessage)) kernelAgent.callHooks(Kernel.SEND_MESSAGE, m2.clone()); } catch (MessageException me) { if (getDebug()) System.err.println(me); } break; case NetworkRequest.CONNECTION_REQUEST: if (m.getSender().equals(myCommunicator)) { establishConnectionWith((AgentAddress) m.getArgument(), true); // distantKernels.add(m.getArgument()); } break; case NetworkRequest.DECONNECTED_FROM: distantKernels.remove(m.getArgument()); deconnection((String) m.getArgument()); break; case NetworkRequest.BE_COMMUNICATOR: if (myCommunicator == null) { redisplayMyGUI(); myCommunicator = m.getSender(); } break; case NetworkRequest.STOP_COMMUNICATOR: if (myCommunicator != null && myCommunicator.equals(m.getSender())) { disposeMyGUI(); myCommunicator = null; for (Iterator i = organizations.entrySet().iterator(); i.hasNext(); ) { Map.Entry e = (Map.Entry) i.next(); Organization org = (Organization) e.getValue(); if (org.removeDistantAgents()) { // communities.leaveGroup(getAddress(), (String) e.getKey()); leaveGroup("communities", (String) e.getKey()); i.remove(); } } distantKernels.clear(); System.gc(); System.runFinalization(); } break; case NetworkRequest.GET_AVAILABLE_DESTINATIONS: KernelAddress[] destinations = new KernelAddress[distantKernels.size()]; int j = 0; for (Iterator i = distantKernels.iterator(); i.hasNext(); j++) destinations[j] = ((AgentAddress) i.next()).getKernel(); sendMessage( m.getSender(), new NetworkRequest(NetworkRequest.GET_AVAILABLE_DESTINATIONS, destinations)); break; case NetworkRequest.REQUEST_MIGRATION: if (getDebug()) println("receiving a migration request of " + m.getSender()); // kernelAgent.callsHook(Kernel.MIGRATION... à rajouter tryMigration((KernelAddress) m.getArgument(), m.getSender()); break; } }