/*
* Copyright (C) 2015-2016 Neo Visionaries Inc.
*
* 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.neovisionaries.ws.client;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
class ListenerManager
{
private final WebSocket mWebSocket;
private final List<WebSocketListener> mListeners = new ArrayList<WebSocketListener>();
private boolean mSyncNeeded = true;
private List<WebSocketListener> mCopiedListeners;
public ListenerManager(WebSocket websocket)
{
mWebSocket = websocket;
}
public List<WebSocketListener> getListeners()
{
return mListeners;
}
public void addListener(WebSocketListener listener)
{
if (listener == null)
{
return;
}
synchronized (mListeners)
{
mListeners.add(listener);
mSyncNeeded = true;
}
}
public void addListeners(List<WebSocketListener> listeners)
{
if (listeners == null)
{
return;
}
synchronized (mListeners)
{
for (WebSocketListener listener : listeners)
{
if (listener == null)
{
continue;
}
mListeners.add(listener);
mSyncNeeded = true;
}
}
}
public void removeListener(WebSocketListener listener)
{
if (listener == null)
{
return;
}
synchronized (mListeners)
{
if (mListeners.remove(listener))
{
mSyncNeeded = true;
}
}
}
public void removeListeners(List<WebSocketListener> listeners)
{
if (listeners == null)
{
return;
}
synchronized (mListeners)
{
for (WebSocketListener listener : listeners)
{
if (listener == null)
{
continue;
}
if (mListeners.remove(listener))
{
mSyncNeeded = true;
}
}
}
}
public void clearListeners()
{
synchronized (mListeners)
{
if (mListeners.size() == 0)
{
return;
}
mListeners.clear();
mSyncNeeded = true;
}
}
private List<WebSocketListener> getSynchronizedListeners()
{
synchronized (mListeners)
{
if (mSyncNeeded == false)
{
return mCopiedListeners;
}
// Copy mListeners to copiedListeners.
List<WebSocketListener> copiedListeners =
new ArrayList<WebSocketListener>(mListeners.size());
for (WebSocketListener listener : mListeners)
{
copiedListeners.add(listener);
}
// Synchronize.
mCopiedListeners = copiedListeners;
mSyncNeeded = false;
return copiedListeners;
}
}
public void callOnStateChanged(WebSocketState newState)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onStateChanged(mWebSocket, newState);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnConnected(Map<String, List<String>> headers)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onConnected(mWebSocket, headers);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnConnectError(WebSocketException cause)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onConnectError(mWebSocket, cause);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnDisconnected(
WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame,
boolean closedByServer)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onDisconnected(
mWebSocket, serverCloseFrame, clientCloseFrame, closedByServer);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnContinuationFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onContinuationFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnTextFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onTextFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnBinaryFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onBinaryFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnCloseFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onCloseFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnPingFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onPingFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnPongFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onPongFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnTextMessage(String message)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onTextMessage(mWebSocket, message);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnBinaryMessage(byte[] message)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onBinaryMessage(mWebSocket, message);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnSendingFrame(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onSendingFrame(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnFrameSent(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onFrameSent(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnFrameUnsent(WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onFrameUnsent(mWebSocket, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnThreadCreated(ThreadType threadType, Thread thread)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onThreadCreated(mWebSocket, threadType, thread);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnThreadStarted(ThreadType threadType, Thread thread)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onThreadStarted(mWebSocket, threadType, thread);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnThreadStopping(ThreadType threadType, Thread thread)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onThreadStopping(mWebSocket, threadType, thread);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnError(WebSocketException cause)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onError(mWebSocket, cause);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnFrameError(WebSocketException cause, WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onFrameError(mWebSocket, cause, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnMessageError(WebSocketException cause, List<WebSocketFrame> frames)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onMessageError(mWebSocket, cause, frames);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnMessageDecompressionError(WebSocketException cause, byte[] compressed)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onMessageDecompressionError(mWebSocket, cause, compressed);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnTextMessageError(WebSocketException cause, byte[] data)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onTextMessageError(mWebSocket, cause, data);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnSendError(WebSocketException cause, WebSocketFrame frame)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onSendError(mWebSocket, cause, frame);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
public void callOnUnexpectedError(WebSocketException cause)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onUnexpectedError(mWebSocket, cause);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
private void callHandleCallbackError(WebSocketListener listener, Throwable cause)
{
try
{
listener.handleCallbackError(mWebSocket, cause);
}
catch (Throwable t)
{
}
}
public void callOnSendingHandshake(String requestLine, List<String[]> headers)
{
for (WebSocketListener listener : getSynchronizedListeners())
{
try
{
listener.onSendingHandshake(mWebSocket, requestLine, headers);
}
catch (Throwable t)
{
callHandleCallbackError(listener, t);
}
}
}
}