package org.petah.spring.bai;
import com.springrts.ai.oo.OOAI;
import com.springrts.ai.oo.clb.OOAICallback;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.petah.spring.bai.listener.EventListener;
import org.petah.spring.bai.log.Log;
/**
*
* @author David Neilsen
*/
public class EventHandler extends OOAI {
private ArrayList<BAI> ais = new ArrayList<BAI>();
private ConcurrentHashMap<String, CopyOnWriteArrayList<EventListener>> eventListeners =
new ConcurrentHashMap<String, CopyOnWriteArrayList<EventListener>>();
public EventHandler() {
Log.entry(EventHandler.class, "BAI");
}
public void addEventListener(String event, EventListener listener) {
Log.entry(EventHandler.class, "addEventListener");
// Get the list of event listeners
CopyOnWriteArrayList<EventListener> listeners = eventListeners.get(event);
// Check the list exists, and create a new one if it doesn't
if (listeners == null) {
listeners = new CopyOnWriteArrayList<EventListener>();
eventListeners.put(event, listeners);
}
// Add the new event listener
listeners.add(listener);
}
public int handleEvent(String type, Object... options) {
Log.entry(EventHandler.class, "handleEvent");
// Get the list of event listeners
Collection listeners = eventListeners.get(type);
// If there is no event listeners, return
if (listeners == null) {
return AIReturnCode.NORMAL;
}
// Get the list of classes used for the method parameters
Class[] paramterClasses = new Class[options.length];
int i = 0;
for (Object o : options) {
paramterClasses[i++] = o.getClass();
}
// Iterate the event listeners
for (Object listener : listeners) {
try {
// Find the event method
Method event = listener.getClass().getMethod(type, paramterClasses);
// Call the event
event.invoke(listener, options);
} catch (Exception ex) {
// Ignore all exceptions
Log.ignoredException(ex);
}
}
return AIReturnCode.NORMAL;
}
double rand;
@Override
public int init(int id, OOAICallback callback) {
Log.entry(EventHandler.class, "init");
this.rand = Math.random();
Log.debug(rand);
ais.add(new BAI(id, callback, this));
return AIReturnCode.NORMAL;
}
@Override
public int update(int frame) {
Log.entry(EventHandler.class, "update");
return AIReturnCode.NORMAL;
}
@Override
public int message(int player, String message) {
Log.entry(EventHandler.class, "message");
Log.debug(rand);
handleEvent("message", player, message);
return AIReturnCode.NORMAL;
}
@Override
public int release(int reason) {
Log.entry(EventHandler.class, "release");
return AIReturnCode.NORMAL;
}
}