Search in sources :

Example 1 with AckRequest

use of com.corundumstudio.socketio.AckRequest in project netty-socketio by mrniko.

the class OnEventScanner method addListener.

@Override
@SuppressWarnings("unchecked")
public void addListener(Namespace namespace, final Object object, final Method method, Annotation annot) {
    OnEvent annotation = (OnEvent) annot;
    if (annotation.value() == null || annotation.value().trim().length() == 0) {
        throw new IllegalArgumentException("OnEvent \"value\" parameter is required");
    }
    final int socketIOClientIndex = paramIndex(method, SocketIOClient.class);
    final int ackRequestIndex = paramIndex(method, AckRequest.class);
    final List<Integer> dataIndexes = dataIndexes(method);
    if (dataIndexes.size() > 1) {
        List<Class<?>> classes = new ArrayList<Class<?>>();
        for (int index : dataIndexes) {
            Class<?> param = method.getParameterTypes()[index];
            classes.add(param);
        }
        namespace.addMultiTypeEventListener(annotation.value(), new MultiTypeEventListener() {

            @Override
            public void onData(SocketIOClient client, MultiTypeArgs data, AckRequest ackSender) {
                try {
                    Object[] args = new Object[method.getParameterTypes().length];
                    if (socketIOClientIndex != -1) {
                        args[socketIOClientIndex] = client;
                    }
                    if (ackRequestIndex != -1) {
                        args[ackRequestIndex] = ackSender;
                    }
                    int i = 0;
                    for (int index : dataIndexes) {
                        args[index] = data.get(i);
                        i++;
                    }
                    method.invoke(object, args);
                } catch (InvocationTargetException e) {
                    throw new SocketIOException(e.getCause());
                } catch (Exception e) {
                    throw new SocketIOException(e);
                }
            }
        }, classes.toArray(new Class[classes.size()]));
    } else {
        Class objectType = Void.class;
        if (!dataIndexes.isEmpty()) {
            objectType = method.getParameterTypes()[dataIndexes.iterator().next()];
        }
        namespace.addEventListener(annotation.value(), objectType, new DataListener<Object>() {

            @Override
            public void onData(SocketIOClient client, Object data, AckRequest ackSender) {
                try {
                    Object[] args = new Object[method.getParameterTypes().length];
                    if (socketIOClientIndex != -1) {
                        args[socketIOClientIndex] = client;
                    }
                    if (ackRequestIndex != -1) {
                        args[ackRequestIndex] = ackSender;
                    }
                    if (!dataIndexes.isEmpty()) {
                        int dataIndex = dataIndexes.iterator().next();
                        args[dataIndex] = data;
                    }
                    method.invoke(object, args);
                } catch (InvocationTargetException e) {
                    throw new SocketIOException(e.getCause());
                } catch (Exception e) {
                    throw new SocketIOException(e);
                }
            }
        });
    }
}
Also used : SocketIOException(com.corundumstudio.socketio.handler.SocketIOException) AckRequest(com.corundumstudio.socketio.AckRequest) ArrayList(java.util.ArrayList) MultiTypeEventListener(com.corundumstudio.socketio.listener.MultiTypeEventListener) InvocationTargetException(java.lang.reflect.InvocationTargetException) SocketIOException(com.corundumstudio.socketio.handler.SocketIOException) InvocationTargetException(java.lang.reflect.InvocationTargetException) SocketIOClient(com.corundumstudio.socketio.SocketIOClient) MultiTypeArgs(com.corundumstudio.socketio.MultiTypeArgs)

Aggregations

AckRequest (com.corundumstudio.socketio.AckRequest)1 MultiTypeArgs (com.corundumstudio.socketio.MultiTypeArgs)1 SocketIOClient (com.corundumstudio.socketio.SocketIOClient)1 SocketIOException (com.corundumstudio.socketio.handler.SocketIOException)1 MultiTypeEventListener (com.corundumstudio.socketio.listener.MultiTypeEventListener)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 ArrayList (java.util.ArrayList)1