
ru.sendto.gwt.client.util.Bus Maven / Gradle / Ivy
package ru.sendto.gwt.client.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Event bus
* @author Lev Nadeinsky
* @date 2017-04-29
*/
public class Bus {
/**
* Event
* @author Lev Nadeinsky
* @date 2017-05-01
*/
public static interface Event{
R invoke (A a);
}
/**
* Event without return value
* @author Lev Nadeinsky
* @date 2017-05-01
*/
public static interface VoidEvent{
void invoke (A a);
}
/**
* Hashmap for event binding
* @author Lev Nadeinsky
* @date 2017-05-01
*/
static class EventMap extends HashMap>{
@Override
public List get(Object key) {
List list = super.get(key);
return list==null?new ArrayList():list;
}
public void listen(Class key, Event value) {
List list = get(key);
list.add(value);
put(key, list);
}
public void listen(Class key, VoidEvent value) {
List list = get(key);
list.add(t->{value.invoke((A)t);return null;});
put(key, list);
}
public List fire (A o){
Class clz = (Class) o.getClass();
List tmp = get(clz);
List> list =tmp;
Object[] results = new Object[list.size()];
for (int i=0 ; i< list.size(); i++){//Event event : list) {
results[i]=list.get(0).invoke(o);
}
return (List) Arrays.asList(results);
}
}
//Map for events
private EventMap map = new EventMap();
//instance of a primary bus
static private Bus bus;
//map of buss
static private Map busMap = new HashMap<>();
private Bus() {
}
/**
* Add listener
* @param key - object class
* @param value - event listener
*/
public void listen(Class key, Event value) {
map.listen(key, value);
}
/**
* Add void listener
* @param key - object class
* @param value - event listener
*/
public void listen(Class key, VoidEvent value) {
map.listen(key, value);
}
public List
fire (A o){
return map.fire(o);
}
/**
* Get bus instance
* @return event bus
*/
static public Bus get(){
return bus==null?bus=new Bus():bus;
}
/**
* Get bus instance by name
* @return event bus
*/
static public Bus get(String busName){
Bus bus = busMap.get(busName);
if(bus==null) {
bus=new Bus();
busMap.put(busName, bus);
}
return bus;
}
/**
* Get bus instance by class name
* @return event bus
*/
static public Bus get(Class> busName){
Bus bus = busMap.get(busName);
if(bus==null) {
bus=new Bus();
busMap.put(busName.getName(), bus);
}
return bus;
}
/**
* Get bus instance by object class name
* @return event bus
*/
static public Bus get(Object busName){
Bus bus = busMap.get(busName);
if(bus==null) {
bus=new Bus();
busMap.put(busName.getClass().getName(), bus);
}
return bus;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy