// ---------------------------------------------------------------------------
// jWebSocket - Base Connector 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.connectors;
import java.net.InetAddress;
import java.util.Map;
import javolution.util.FastMap;
import org.jwebsocket.api.WebSocketPacket;
import org.jwebsocket.api.WebSocketConnector;
import org.jwebsocket.api.WebSocketEngine;
import org.jwebsocket.async.IOFuture;
import org.jwebsocket.config.JWebSocketConfig;
import org.jwebsocket.kit.CloseReason;
import org.jwebsocket.kit.RequestHeader;
import org.jwebsocket.kit.WebSocketSession;
/**
* Provides the basic implementation of the jWebSocket connectors. The
* {@code BaseConnector} is supposed to be used as ancestor for the connector
* implementations like e.g. the {@code TCPConnector} or the
* {@code NettyConnector }.
*
* @author aschulze
*/
public class BaseConnector implements WebSocketConnector {
/**
* Default reserved name for shared custom variable <tt>username</tt>.
*/
public final static String VAR_USERNAME = "$username";
/**
* Default reserved name for shared custom variable <tt>subprot</tt>.
*/
public final static String VAR_SUBPROT = "$subprot";
/**
* Default name for shared custom variable <tt>nodeid</tt>.
*/
public final static String VAR_NODEID = "$nodeid";
/**
* Backward reference to the engine of this connector.
*/
private WebSocketEngine mEngine = null;
/**
* Backup of the original request header and it's fields.
* TODO: maybe obsolete for the future
*/
private RequestHeader mHeader = null;
/**
* Session object for the WebSocket connection.
*/
private final WebSocketSession mSession = new WebSocketSession();
/**
* Shared Variables container for this connector.
*/
private final Map<String, Object> mCustomVars = new FastMap<String, Object>();
/**
*
* @param aEngine
*/
public BaseConnector(WebSocketEngine aEngine) {
mEngine = aEngine;
}
@Override
public void startConnector() {
if (mEngine != null) {
mEngine.connectorStarted(this);
}
}
@Override
public void stopConnector(CloseReason aCloseReason) {
if (mEngine != null) {
mEngine.connectorStopped(this, aCloseReason);
}
}
@Override
public void processPacket(WebSocketPacket aDataPacket) {
if (mEngine != null) {
mEngine.processPacket(this, aDataPacket);
}
}
@Override
public void sendPacket(WebSocketPacket aDataPacket) {
}
@Override
public IOFuture sendPacketAsync(WebSocketPacket aDataPacket) {
return null;
}
@Override
public WebSocketEngine getEngine() {
return mEngine;
}
@Override
public RequestHeader getHeader() {
return mHeader;
}
/**
* @param aHeader
* the header to set
*/
@Override
public void setHeader(RequestHeader aHeader) {
// TODO: the sub protocol should be a connector variable! not part of
// the header!
this.mHeader = aHeader;
// TODO: this can be improved, maybe distinguish between header and URL
// args!
Map lArgs = aHeader.getArgs();
if (lArgs != null) {
String lNodeId = (String) lArgs.get("unid");
if (lNodeId != null) {
setNodeId(lNodeId);
lArgs.remove("unid");
}
}
}
@Override
public Object getVar(String aKey) {
return mCustomVars.get(aKey);
}
@Override
public void setVar(String aKey, Object aValue) {
mCustomVars.put(aKey, aValue);
}
@Override
public Boolean getBoolean(String aKey) {
return (Boolean) getVar(aKey);
}
@Override
public boolean getBool(String aKey) {
Boolean lBool = getBoolean(aKey);
return (lBool != null && lBool);
}
@Override
public void setBoolean(String aKey, Boolean aValue) {
setVar(aKey, aValue);
}
@Override
public String getString(String aKey) {
return (String) getVar(aKey);
}
@Override
public void setString(String aKey, String aValue) {
setVar(aKey, aValue);
}
@Override
public Integer getInteger(String aKey) {
return (Integer) getVar(aKey);
}
@Override
public void setInteger(String aKey, Integer aValue) {
setVar(aKey, aValue);
}
@Override
public void removeVar(String aKey) {
mCustomVars.remove(aKey);
}
@Override
public String generateUID() {
return null;
}
@Override
public int getRemotePort() {
return -1;
}
@Override
public InetAddress getRemoteHost() {
return null;
}
@Override
public String getId() {
String lNodeId = JWebSocketConfig.getConfig().getNodeId();
return ((lNodeId != null && lNodeId.length() > 0) ? lNodeId + "." : "")
+ String.valueOf(getRemotePort());
}
@Override
public WebSocketSession getSession() {
return mSession;
}
// some convenience methods to easier process username (login-status)
// and configured unique node id for clusters (independent from tcp port)
@Override
public String getUsername() {
return getString(BaseConnector.VAR_USERNAME);
}
@Override
public void setUsername(String aUsername) {
setString(BaseConnector.VAR_USERNAME, aUsername);
}
@Override
public void removeUsername() {
removeVar(BaseConnector.VAR_USERNAME);
}
// some convenience methods to easier process subprot (login-status)
// and configured unique node id for clusters (independent from tcp port)
@Override
public String getSubprot() {
return getString(BaseConnector.VAR_SUBPROT);
}
@Override
public void setSubprot(String aSubprot) {
setString(BaseConnector.VAR_SUBPROT, aSubprot);
}
@Override
public void removeSubprot() {
removeVar(BaseConnector.VAR_SUBPROT);
}
@Override
public String getNodeId() {
return getString(BaseConnector.VAR_NODEID);
}
@Override
public void setNodeId(String aNodeId) {
setString(BaseConnector.VAR_NODEID, aNodeId);
}
@Override
public void removeNodeId() {
removeVar(BaseConnector.VAR_NODEID);
}
}