package NetworkAdapter.Implementation; import EnvironmentPluginAPI.CustomNetworkMessages.NetworkMessage; import NetworkAdapter.Interface.INetworkMessageReceivedEventHandler; import NetworkAdapter.Interface.NetworkEventType; import java.lang.reflect.Type; import java.util.Hashtable; import java.util.Map; /** * This class provides the basic implementation of the network adapter logic, since a lot of their code is shared * between server and client. */ abstract class AbstractNetworkAdapterUseCase { //we organize the listeners for each message type in a separated list, to prevent messages from being delivered to // the wrong listeners on one hand and also better performance on the other. private Map<Class, SubscriberCollection> subscribers; Type[] types; public AbstractNetworkAdapterUseCase() { subscribers = new Hashtable<Class, SubscriberCollection>(); } public synchronized void subscribeForNetworkMessageReceivedEvent(INetworkMessageReceivedEventHandler eventHandler, Class messageType) { if (!subscribers.containsKey(messageType)) { subscribers.put(messageType, new SubscriberCollection()); } SubscriberCollection subscriberCollection = subscribers.get(messageType); subscriberCollection.addSubscriber(eventHandler); } protected void informSubscribers(NetworkMessage message) { for (Class key : subscribers.keySet()) { try { if (key.isAssignableFrom(message.getClass())) { subscribers.get(key).deliverMessage(message); } } catch (Throwable e) { System.err.println("An error occured while calling the event listener: " + subscribers.get(key)); e.printStackTrace(); } } } protected void fireNetworkEvent(NetworkEventType eventType, int clientId) { for(SubscriberCollection subscriberCollection : subscribers.values()) { for(INetworkMessageReceivedEventHandler networkMessageReceivedEventHandler : subscriberCollection) { networkMessageReceivedEventHandler.onNetworkEvent(eventType, clientId); } } } }