// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/AgentMessaging.java
// public class AgentMessaging {
// 
//     // the storage of all message service instance, associated to the message
//     /** The instancied msg services. */
//     // type class the handle
//     private static Map<Class<?>, IMsgService<?>> instanciedMsgServices = new HashMap<Class<?>, IMsgService<?>>();
// 
//     /**
//      * Instantiates a new agent messaging.
//      */
//     private AgentMessaging() {
// 
//     }
// 
//     /**
//      * Get or create a message box for the given agentId, associated to the
//      * given class message service type.
//      *
//      * @param <T>
//      *            the generic type
//      * @param agentId
//      *            the agent
//      * @param messageClassType
//      *            the class type or the messages handled by the message box
//      * @return the msg box
//      */
//     public static <T> IMsgBox<T> getMsgBox(String agentId,
//         Class<T> messageClassType) {
//         return AgentMessaging.<T> getMsgService(messageClassType)
//             .getMsgBox(agentId);
//     }
// 
//     /**
//      * Get or create a message service associated to the given class message
//      * service type.
//      *
//      * @param <T>
//      *            the generic type
//      * @param messageClassType
//      *            the message class type
//      * @return the msg service
//      */
//     public static <T> IMsgService<T> getMsgService(
//         Class<T> messageClassType) {
//         @SuppressWarnings("unchecked")
//         IMsgService<T> msgService = (IMsgService<T>) instanciedMsgServices
//             .get(messageClassType);
//         if (msgService == null) {
//             msgService = new DefaultMsgService<T>();
//             instanciedMsgServices.put(messageClassType, msgService);
//         }
// 
//         return msgService;
//     }
//     
//     /**
//      * Shutdown the message service associated with the given class message
//      * @param messageClassType
//      */
//     public static <T> void shutdownMsgService(Class<T> messageClassType) {
//         @SuppressWarnings("unchecked")
//         IMsgService<T> msgService = (IMsgService<T>) instanciedMsgServices
//             .get(messageClassType);
//         if (msgService != null) {
//             instanciedMsgServices.remove(messageClassType);
//         } else {
//             throw new IllegalArgumentException(
//                 "Trying to shutdown a non existing service : "+messageClassType
//             );
//         }
//     }
// }
// 
// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/IMsgBox.java
// public interface IMsgBox<T> extends ISender<T>, IReceiver<T> {
// 
//     /**
//      * The ref of the agent using the message box.
//      *
//      * @return the ref
//      */
//     public Ref<T> getRef();
// 
//     /**
//      * Disable the message box and uninscrible it to all the previously
//      * subscribed groups.
//      */
//     public void dispose();
// }
// 
// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/impl/Ref.java
// public abstract class Ref<T> implements Comparable<Ref<T>> {
//     
//     /** The id. */
//     private final String id;
// 
//     /**
//      * Instantiates a new ref.
//      *
//      * @param id the id
//      */
//     public Ref(String id) {
//         this.id = id;
//     }
// 
//     /* (non-Javadoc)
//      * @see java.lang.Object#toString()
//      */
//     @Override
//     public String toString() {
//         return "@" + id;
//     }
// 
//     /**
//      * Gets the id.
//      *
//      * @return the id
//      */
//     public String getId() {
//         return id;
//     }
// 
//     /* (non-Javadoc)
//      * @see java.lang.Comparable#compareTo(java.lang.Object)
//      */
//     @Override
//     public int compareTo(Ref<T> ref) {
//         return this.getId().compareTo(ref.getId());
//     }
// 
//     /**
//      * Gets the msg sink.
//      *
//      * @return the external package hidden message sink
//      */
//     abstract IMsgSink<T> getMsgSink();
// }


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import fr.irit.smac.libs.tooling.messaging.AgentMessaging;
import fr.irit.smac.libs.tooling.messaging.IMsgBox;
import fr.irit.smac.libs.tooling.messaging.impl.Ref;

        for (int i = 0; i < nbCycles; i++) {

            for (ChattingAgent agent : chattingAgents) {
                agent.readMessages();
            }
            for (ChattingAgent agent : chattingAgents) {
                agent.sendMessages();
            }
        }
        long toc = System.currentTimeMillis();
        System.out.println("Stop system...");

        int nbReceivedMsgs = 0;
        for (ChattingAgent agent : chattingAgents) {
            nbReceivedMsgs += agent.getNbReceivedMessages();
        }
        long nbMillis = toc - tic;

        System.out.println("Total received messages : " + nbReceivedMsgs);
        System.out.println("Total time : " + nbMillis / 1000. + " s");
        System.out.println("Speed : " + (nbMillis) / ((double) nbReceivedMsgs) * 1000 + " μs / message");

    }

    /**
     * The Class ChattingAgent.
     */
    private static abstract class ChattingAgent {

        /** The msg box. */

// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/AgentMessaging.java
// public class AgentMessaging {
// 
//     // the storage of all message service instance, associated to the message
//     /** The instancied msg services. */
//     // type class the handle
//     private static Map<Class<?>, IMsgService<?>> instanciedMsgServices = new HashMap<Class<?>, IMsgService<?>>();
// 
//     /**
//      * Instantiates a new agent messaging.
//      */
//     private AgentMessaging() {
// 
//     }
// 
//     /**
//      * Get or create a message box for the given agentId, associated to the
//      * given class message service type.
//      *
//      * @param <T>
//      *            the generic type
//      * @param agentId
//      *            the agent
//      * @param messageClassType
//      *            the class type or the messages handled by the message box
//      * @return the msg box
//      */
//     public static <T> IMsgBox<T> getMsgBox(String agentId,
//         Class<T> messageClassType) {
//         return AgentMessaging.<T> getMsgService(messageClassType)
//             .getMsgBox(agentId);
//     }
// 
//     /**
//      * Get or create a message service associated to the given class message
//      * service type.
//      *
//      * @param <T>
//      *            the generic type
//      * @param messageClassType
//      *            the message class type
//      * @return the msg service
//      */
//     public static <T> IMsgService<T> getMsgService(
//         Class<T> messageClassType) {
//         @SuppressWarnings("unchecked")
//         IMsgService<T> msgService = (IMsgService<T>) instanciedMsgServices
//             .get(messageClassType);
//         if (msgService == null) {
//             msgService = new DefaultMsgService<T>();
//             instanciedMsgServices.put(messageClassType, msgService);
//         }
// 
//         return msgService;
//     }
//     
//     /**
//      * Shutdown the message service associated with the given class message
//      * @param messageClassType
//      */
//     public static <T> void shutdownMsgService(Class<T> messageClassType) {
//         @SuppressWarnings("unchecked")
//         IMsgService<T> msgService = (IMsgService<T>) instanciedMsgServices
//             .get(messageClassType);
//         if (msgService != null) {
//             instanciedMsgServices.remove(messageClassType);
//         } else {
//             throw new IllegalArgumentException(
//                 "Trying to shutdown a non existing service : "+messageClassType
//             );
//         }
//     }
// }
// 
// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/IMsgBox.java
// public interface IMsgBox<T> extends ISender<T>, IReceiver<T> {
// 
//     /**
//      * The ref of the agent using the message box.
//      *
//      * @return the ref
//      */
//     public Ref<T> getRef();
// 
//     /**
//      * Disable the message box and uninscrible it to all the previously
//      * subscribed groups.
//      */
//     public void dispose();
// }
// 
// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/impl/Ref.java
// public abstract class Ref<T> implements Comparable<Ref<T>> {
//     
//     /** The id. */
//     private final String id;
// 
//     /**
//      * Instantiates a new ref.
//      *
//      * @param id the id
//      */
//     public Ref(String id) {
//         this.id = id;
//     }
// 
//     /* (non-Javadoc)
//      * @see java.lang.Object#toString()
//      */
//     @Override
//     public String toString() {
//         return "@" + id;
//     }
// 
//     /**
//      * Gets the id.
//      *
//      * @return the id
//      */
//     public String getId() {
//         return id;
//     }
// 
//     /* (non-Javadoc)
//      * @see java.lang.Comparable#compareTo(java.lang.Object)
//      */
//     @Override
//     public int compareTo(Ref<T> ref) {
//         return this.getId().compareTo(ref.getId());
//     }
// 
//     /**
//      * Gets the msg sink.
//      *
//      * @return the external package hidden message sink
//      */
//     abstract IMsgSink<T> getMsgSink();
// }


// Path: agent-messaging/src/main/java/fr/irit/smac/libs/tooling/messaging/example/AdvancedMessagingExample.java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import fr.irit.smac.libs.tooling.messaging.AgentMessaging;
import fr.irit.smac.libs.tooling.messaging.IMsgBox;
import fr.irit.smac.libs.tooling.messaging.impl.Ref;

        for (int i = 0; i < nbCycles; i++) {

            for (ChattingAgent agent : chattingAgents) {
                agent.readMessages();
            }
            for (ChattingAgent agent : chattingAgents) {
                agent.sendMessages();
            }
        }
        long toc = System.currentTimeMillis();
        System.out.println("Stop system...");

        int nbReceivedMsgs = 0;
        for (ChattingAgent agent : chattingAgents) {
            nbReceivedMsgs += agent.getNbReceivedMessages();
        }
        long nbMillis = toc - tic;

        System.out.println("Total received messages : " + nbReceivedMsgs);
        System.out.println("Total time : " + nbMillis / 1000. + " s");
        System.out.println("Speed : " + (nbMillis) / ((double) nbReceivedMsgs) * 1000 + " μs / message");

    }

    /**
     * The Class ChattingAgent.
     */
    private static abstract class ChattingAgent {

        /** The msg box. */

        protected IMsgBox<String> msgBox;
