/* Copyright (c) 2011 Danish Maritime Authority.
*
* 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 net.maritimecloud.mms.server;
import static java.util.Objects.requireNonNull;
import net.maritimecloud.internal.mms.messages.spi.MmsMessage;
import net.maritimecloud.mms.server.connection.transport.ServerTransport;
import net.maritimecloud.net.mms.MmsConnectionClosingCode;
import net.maritimecloud.util.Binary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Kasper Nielsen
*/
public abstract class ServerEventListener {
/** An event listener that does nothing. */
public static ServerEventListener EMPTY = new ServerEventListener() {};
/** The logger. */
static final Logger LOGGER = LoggerFactory.getLogger(ServerEventListener.class);
/**
* Invoked whenever the connection is lost to the MMS server. It will automatically connect again unless disabled or
* shutdown.
*
* @param closeReason
* the reason for the closing
*/
public void disconnected(MmsConnectionClosingCode closeReason) {}
public void sessionCreated(ServerTransport transport, Binary sessionID) {}
/**
* The binary message received over the connection
*
* @param message
* the message
*/
public void transportBinaryMessageReceived(ServerTransport transport, byte[] message) {}
/**
* The binary message sent over the connection
*
* @param message
* the message
*/
public void transportBinaryMessageSend(ServerTransport transport, byte[] message) {}
public void transportMessageReceived(ServerTransport transport, MmsMessage message) {}
public void transportMessageSend(ServerTransport transport, MmsMessage message) {}
/**
* The text message received over the connection
*
* @param message
* the message
*/
public void transportTextMessageReceived(ServerTransport transport, String message) {}
/**
* The text message sent over the connection
*
* @param message
* the message
*/
public void transportTextMessageSend(ServerTransport transport, String message) {}
public static ServerEventListener create(ServerEventListener... listeners) {
return new AggegatedEventListener(listeners);
}
/**
* Aggregates one or more event listeners. And makes sure not to propagate any exception that a listener might
* raise.
*/
static class AggegatedEventListener extends ServerEventListener {
/** An array of listeners */
private final ServerEventListener[] listeners;
AggegatedEventListener(ServerEventListener[] listeners) {
this.listeners = new ServerEventListener[listeners.length];
for (int i = 0; i < listeners.length; i++) {
this.listeners[i] = requireNonNull(listeners[i], "listener at index " + i + " is null");
}
}
/** {@inheritDoc} */
@Override
public void disconnected(MmsConnectionClosingCode closeReason) {
for (ServerEventListener listener : listeners) {
try {
listener.disconnected(closeReason);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void sessionCreated(ServerTransport transport, Binary sessionID) {
for (ServerEventListener listener : listeners) {
try {
listener.sessionCreated(transport, sessionID);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportBinaryMessageReceived(ServerTransport transport, byte[] message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportBinaryMessageReceived(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportBinaryMessageSend(ServerTransport transport, byte[] message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportBinaryMessageSend(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportMessageReceived(ServerTransport transport, MmsMessage message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportMessageReceived(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportMessageSend(ServerTransport transport, MmsMessage message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportMessageSend(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportTextMessageReceived(ServerTransport transport, String message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportTextMessageReceived(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
/** {@inheritDoc} */
@Override
public void transportTextMessageSend(ServerTransport transport, String message) {
for (ServerEventListener listener : listeners) {
try {
listener.transportTextMessageSend(transport, message);
} catch (RuntimeException e) {
LOGGER.error("Event listener failed", e);
}
}
}
}
}