@Override
 public void addMultiTypeEventListener(
     String eventName, MultiTypeEventListener listener, Class<?>... eventClass) {
   EventEntry entry = eventListeners.get(eventName);
   if (entry == null) {
     entry = new EventEntry();
     EventEntry<?> oldEntry = eventListeners.putIfAbsent(eventName, entry);
     if (oldEntry != null) {
       entry = oldEntry;
     }
   }
   entry.addListener(listener);
   jsonSupport.addEventMapping(name, eventName, eventClass);
 }
 @Override
 @SuppressWarnings({"unchecked", "rawtypes"})
 public <T> void addEventListener(
     String eventName, Class<T> eventClass, DataListener<T> listener) {
   EventEntry entry = eventListeners.get(eventName);
   if (entry == null) {
     entry = new EventEntry<T>();
     EventEntry<?> oldEntry = eventListeners.putIfAbsent(eventName, entry);
     if (oldEntry != null) {
       entry = oldEntry;
     }
   }
   entry.addListener(listener);
   jsonSupport.addEventMapping(name, eventName, eventClass);
 }
  @SuppressWarnings({"rawtypes", "unchecked"})
  public void onEvent(
      NamespaceClient client, String eventName, List<Object> args, AckRequest ackRequest) {
    EventEntry entry = eventListeners.get(eventName);
    if (entry == null) {
      return;
    }

    try {
      Queue<DataListener> listeners = entry.getListeners();
      for (DataListener dataListener : listeners) {
        Object data = getEventData(args, dataListener);
        dataListener.onData(client, data, ackRequest);
      }
    } catch (Exception e) {
      exceptionListener.onEventException(e, args, client);
      if (ackMode == AckMode.AUTO_SUCCESS_ONLY) {
        return;
      }
    }

    sendAck(ackRequest);
  }