// ---------------------------------------------------------------------------
// jWebSocket - Base Engine Implementation
// Copyright (c) 2010 Alexander Schulze, Innotrade GmbH
// ---------------------------------------------------------------------------
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by the
// Free Software Foundation; either version 3 of the License, or (at your
// option) any later version.
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
// more details.
// You should have received a copy of the GNU Lesser General Public License along
// with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>.
// ---------------------------------------------------------------------------
package org.jwebsocket.engines;
import java.util.Map;
import javolution.util.FastMap;
import org.jwebsocket.api.EngineConfiguration;
import org.jwebsocket.api.WebSocketConnector;
import org.jwebsocket.api.WebSocketEngine;
import org.jwebsocket.api.WebSocketPacket;
import org.jwebsocket.api.WebSocketServer;
import org.jwebsocket.config.JWebSocketCommonConstants;
import org.jwebsocket.kit.CloseReason;
import org.jwebsocket.kit.WebSocketException;
/**
* Provides the basic implementation of the jWebSocket engines. The
* {@code BaseEngine} is supposed to be used as ancestor for the engine
* implementations like e.g. the {@code TCPEngine} or the {@code NettyEngine}.
*
* @author aschulze
*/
public class BaseEngine implements WebSocketEngine {
private final Map<String, WebSocketServer> mServers = new FastMap<String, WebSocketServer>();
private final Map<String, WebSocketConnector> mConnectors = new FastMap<String, WebSocketConnector>();
private int mSessionTimeout = JWebSocketCommonConstants.DEFAULT_TIMEOUT;
private EngineConfiguration mConfiguration;
public BaseEngine(EngineConfiguration aConfiguration) {
this.mConfiguration = aConfiguration;
}
@Override
public void setEngineConfiguration(EngineConfiguration aConfiguration) {
this.mConfiguration = aConfiguration;
}
@Override
public void startEngine() throws WebSocketException {
// this method will be overridden by engine implementations.
// The implementation will notify server that the engine has started
// Don't do this here: engineStarted();
}
@Override
public void stopEngine(CloseReason aCloseReason) throws WebSocketException {
try {
// stop all connectors of this engine
for (WebSocketConnector lConnector : getConnectors().values()) {
lConnector.stopConnector(aCloseReason);
}
} catch (Exception ex) {
// log.info("Exception on sleep " + ex.getMessage());
}
// this method will be overridden by engine implementations.
// The implementation will notify server that the engine has stopped
// Don't do this here: engineStopped();
}
@Override
public void engineStarted() {
// notify servers that the engine has started
for (WebSocketServer lServer : mServers.values()) {
lServer.engineStarted(this);
}
}
@Override
public void engineStopped() {
// notify servers that the engine has stopped
for (WebSocketServer lServer : mServers.values()) {
lServer.engineStopped(this);
}
}
@Override
public void connectorStarted(WebSocketConnector aConnector) {
// notify servers that a connector has started
for (WebSocketServer lServer : mServers.values()) {
lServer.connectorStarted(aConnector);
}
}
@Override
public void connectorStopped(WebSocketConnector aConnector,
CloseReason aCloseReason) {
// notify servers that a connector has stopped
for (WebSocketServer lServer : mServers.values()) {
lServer.connectorStopped(aConnector, aCloseReason);
}
// once a connector stopped remove it from the list of connectors
getConnectors().remove(aConnector.getId());
}
@Override
public boolean isAlive() {
return false;
}
@Override
public void processPacket(WebSocketConnector aConnector,
WebSocketPacket aDataPacket) {
Map<String, WebSocketServer> lServers = getServers();
for (WebSocketServer lServer : lServers.values()) {
lServer.processPacket(this, aConnector, aDataPacket);
}
}
@Override
public void sendPacket(WebSocketConnector aConnector,
WebSocketPacket aDataPacket) {
aConnector.sendPacket(aDataPacket);
}
@Override
public void broadcastPacket(WebSocketConnector aSource,
WebSocketPacket aDataPacket) {
for (WebSocketConnector lConnector : mConnectors.values()) {
lConnector.sendPacket(aDataPacket);
}
}
@Override
public void addConnector(WebSocketConnector aConnector) {
mConnectors.put(aConnector.getId(), aConnector);
}
@Override
public void removeConnector(WebSocketConnector aConnector) {
mConnectors.remove(aConnector.getId());
}
@Override
public int getSessionTimeout() {
return mSessionTimeout;
}
@Override
public void setSessionTimeout(int aSessionTimeout) {
this.mSessionTimeout = aSessionTimeout;
}
@Override
public int getMaxFrameSize() {
return mConfiguration.getMaxFramesize();
}
@Override
public Map<String, WebSocketConnector> getConnectors() {
return mConnectors;
}
@Override
public WebSocketConnector getConnectorByRemotePort(int aRemotePort) {
for (WebSocketConnector lConnector : getConnectors().values()) {
if (lConnector.getRemotePort() == aRemotePort) {
return lConnector;
}
}
return null;
}
@Override
public Map<String, WebSocketServer> getServers() {
return mServers; // (FastMap) (servers.unmodifiable());
}
@Override
public void addServer(WebSocketServer aServer) {
this.mServers.put(aServer.getId(), aServer);
}
@Override
public void removeServer(WebSocketServer aServer) {
this.mServers.remove(aServer.getId());
}
/**
* @return the id
*/
@Override
public String getId() {
return mConfiguration.getId();
}
@Override
public EngineConfiguration getConfiguration() {
return mConfiguration;
}
}