From 2bea823214993c4a34d7d12a7673395d9b7422b2 Mon Sep 17 00:00:00 2001 From: Lan Liang Date: Fri, 24 Jun 2022 17:39:06 +0800 Subject: [PATCH] Support default event listener --- .../socketio/SocketIOServer.java | 6 +++- .../socketio/listener/ClientListeners.java | 2 ++ .../listener/DefaultDataListener.java | 34 +++++++++++++++++++ .../socketio/namespace/EventEntry.java | 12 +++++++ .../socketio/namespace/Namespace.java | 24 +++++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/corundumstudio/socketio/listener/DefaultDataListener.java diff --git a/src/main/java/com/corundumstudio/socketio/SocketIOServer.java b/src/main/java/com/corundumstudio/socketio/SocketIOServer.java index 83f4b92ab..ca5138e7c 100644 --- a/src/main/java/com/corundumstudio/socketio/SocketIOServer.java +++ b/src/main/java/com/corundumstudio/socketio/SocketIOServer.java @@ -251,7 +251,6 @@ public void addEventListener(String eventName, Class eventClass, DataList @Override public void addEventInterceptor(EventInterceptor eventInterceptor) { mainNamespace.addEventInterceptor(eventInterceptor); - } @@ -260,6 +259,11 @@ public void removeAllListeners(String eventName) { mainNamespace.removeAllListeners(eventName); } + @Override + public void setDefaultListener(Class eventClass, DefaultDataListener listener) { + mainNamespace.setDefaultListener(eventClass,listener); + } + @Override public void addDisconnectListener(DisconnectListener listener) { mainNamespace.addDisconnectListener(listener); diff --git a/src/main/java/com/corundumstudio/socketio/listener/ClientListeners.java b/src/main/java/com/corundumstudio/socketio/listener/ClientListeners.java index af6b82a2c..0a00e73af 100644 --- a/src/main/java/com/corundumstudio/socketio/listener/ClientListeners.java +++ b/src/main/java/com/corundumstudio/socketio/listener/ClientListeners.java @@ -35,5 +35,7 @@ public interface ClientListeners { void addListeners(Object listeners, Class listenersClass); void removeAllListeners(String eventName); + + void setDefaultListener(Class eventClass, DefaultDataListener listener); } diff --git a/src/main/java/com/corundumstudio/socketio/listener/DefaultDataListener.java b/src/main/java/com/corundumstudio/socketio/listener/DefaultDataListener.java new file mode 100644 index 000000000..6dce319df --- /dev/null +++ b/src/main/java/com/corundumstudio/socketio/listener/DefaultDataListener.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2012-2019 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.corundumstudio.socketio.listener; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.SocketIOClient; + +public interface DefaultDataListener { + + /** + * Invokes when data object received from client + * + * @param client - receiver + * @param data - received object + * @param ackSender - ack request + * @param eventName - event name + * + */ + void onData(SocketIOClient client, T data, AckRequest ackSender,String eventName) throws Exception; + +} diff --git a/src/main/java/com/corundumstudio/socketio/namespace/EventEntry.java b/src/main/java/com/corundumstudio/socketio/namespace/EventEntry.java index 635957478..6e0e6db4a 100644 --- a/src/main/java/com/corundumstudio/socketio/namespace/EventEntry.java +++ b/src/main/java/com/corundumstudio/socketio/namespace/EventEntry.java @@ -19,9 +19,11 @@ import java.util.concurrent.ConcurrentLinkedQueue; import com.corundumstudio.socketio.listener.DataListener; +import com.corundumstudio.socketio.listener.DefaultDataListener; public class EventEntry { + private final Queue> listeners = new ConcurrentLinkedQueue>();; public EventEntry() { @@ -36,4 +38,14 @@ public Queue> getListeners() { return listeners; } + private DefaultDataListener defaultDataListener; + + public void setDefaultDataListener(DefaultDataListener defaultDataListener){ + this.defaultDataListener=defaultDataListener; + } + + public DefaultDataListener getDefaultDataListener(){ + return defaultDataListener; + } + } diff --git a/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java b/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java index 97057dd0e..217f6ebee 100644 --- a/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java +++ b/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java @@ -56,6 +56,8 @@ public class Namespace implements SocketIONamespace { public static final String DEFAULT_NAME = ""; private final ScannerEngine engine = new ScannerEngine(); + + private EventEntry defaultEventListener; private final ConcurrentMap> eventListeners = PlatformDependent.newConcurrentHashMap(); private final Queue connectListeners = new ConcurrentLinkedQueue(); private final Queue disconnectListeners = new ConcurrentLinkedQueue(); @@ -113,6 +115,14 @@ public void removeAllListeners(String eventName) { } } + @Override + public void setDefaultListener(Class eventClass, DefaultDataListener listener) { + EventEntry entry = new EventEntry(); + entry.setDefaultDataListener(listener); + defaultEventListener = entry; + } + + @Override @SuppressWarnings({"unchecked", "rawtypes"}) public void addEventListener(String eventName, Class eventClass, DataListener listener) { @@ -137,6 +147,20 @@ public void addEventInterceptor(EventInterceptor eventInterceptor) { public void onEvent(NamespaceClient client, String eventName, List args, AckRequest ackRequest) { EventEntry entry = eventListeners.get(eventName); if (entry == null) { + if(defaultEventListener!=null && defaultEventListener.getDefaultDataListener()!=null){ + try { + Object data = null; + if(!args.isEmpty()){ + data = args.get(0); + } + defaultEventListener.getDefaultDataListener().onData(client, data, ackRequest,eventName); + } catch (Exception e) { + exceptionListener.onEventException(e, args, client); + if (ackMode == AckMode.AUTO_SUCCESS_ONLY) { + return; + } + } + } return; }