Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 2.63 KB | None | 0 0
  1. /*
  2.  * Created on Oct 24, 2010
  3.  */
  4.  
  5. package engine.rts;
  6.  
  7. import java.lang.reflect.Method;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.NoSuchElementException;
  13.  
  14. import craterstudio.data.tuples.Pair;
  15.  
  16. public class Binding
  17. {
  18.    class Callback
  19.    {
  20.       final Object target;
  21.       final Method method;
  22.  
  23.       public Callback(Object target, Method method)
  24.       {
  25.          this.target = target;
  26.          this.method = method;
  27.       }
  28.  
  29.       public void call()
  30.       {
  31.          try
  32.          {
  33.             this.method.invoke(this.target, new Object[] { Binding.this.source });
  34.          }
  35.          catch (Exception exc)
  36.          {
  37.             throw new RuntimeException(exc);
  38.          }
  39.       }
  40.    }
  41.  
  42.    final Object                              source;
  43.    private final Map<String, List<Callback>> eventToCallbacks;
  44.  
  45.    public Binding(Object source)
  46.    {
  47.       this.source = source;
  48.       this.eventToCallbacks = new HashMap<String, List<Callback>>();
  49.    }
  50.  
  51.    public void listen(String event, Object target)
  52.    {
  53.       String methodName = fromEventToMethodname(event);
  54.       Method method = findMethod(target, methodName);
  55.  
  56.       List<Callback> callbacks = this.eventToCallbacks.get(event);
  57.       if (callbacks == null)
  58.          this.eventToCallbacks.put(event, callbacks = new ArrayList<Callback>());
  59.       callbacks.add(new Callback(target, method));
  60.    }
  61.  
  62.    public void fire(String event)
  63.    {
  64.       List<Callback> callbacks = this.eventToCallbacks.get(event);
  65.       if (callbacks != null)
  66.          for (Callback callback : callbacks)
  67.             callback.call();
  68.    }
  69.  
  70.    // utility methods
  71.  
  72.    private static Method findMethod(Object target, String event)
  73.    {
  74.       Pair<String, Class< ? >> key = new Pair<String, Class< ? >>(event, target.getClass());
  75.       Method found = method_cache.get(key);
  76.       if (found != null)
  77.          return found;
  78.  
  79.       found = findMethodImpl(target, fromEventToMethodname(event));
  80.       method_cache.put(key, found);
  81.       return found;
  82.    }
  83.  
  84.    private static String fromEventToMethodname(String event)
  85.    {
  86.       return "on" + event.substring(0, 1).toUpperCase() + event.substring(1);
  87.    }
  88.  
  89.    private static Method findMethodImpl(Object target, String methodName)
  90.    {
  91.       for (Method method : target.getClass().getMethods())
  92.          if (method.getName().equals(methodName))
  93.             return method;
  94.       throw new NoSuchElementException(methodName);
  95.    }
  96.  
  97.    private static Map<Pair<String, Class< ? >>, Method> method_cache = new HashMap<Pair<String, Class< ? >>, Method>();
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement