// ---------------------------------------------------------------------------
// 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.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 name for shared custom variable <tt>username</tt>.
*/
public final static String VAR_USERNAME = "$username";
/**
* Default name for shared custom variable <tt>nodeid</tt>.
*/
public final static String VAR_NODEID = "$nodeid";
private WebSocketEngine engine = null;
private RequestHeader header = null;
private final WebSocketSession session = new WebSocketSession();
private final Map<String, Object> customVars = new FastMap<String, Object>();
/**
*
* @param aEngine
*/
public BaseConnector(WebSocketEngine aEngine) {
engine = aEngine;
}
@Override
public void startConnector() {
if (engine != null) {
engine.connectorStarted(this);
}
}
@Override
public void stopConnector(CloseReason aCloseReason) {
if (engine != null) {
engine.connectorStopped(this, aCloseReason);
}
}
@Override
public void processPacket(WebSocketPacket aDataPacket) {
if (engine != null) {
engine.processPacket(this, aDataPacket);
}
}
@Override
public void sendPacket(WebSocketPacket aDataPacket) {
}
@Override
public WebSocketEngine getEngine() {
return engine;
}
@Override
public RequestHeader getHeader() {
return header;
}
/**
* @param header the header to set
*/
@Override
public void setHeader(RequestHeader header) {
// TODO: the sub protocol should be a connector variable! not part of the header!
this.header = header;
// TODO: this can be improved, maybe distinguish between header and URL args!
Map lArgs = header.getArgs();
String lNodeId = (String) lArgs.get("unid");
if (lNodeId != null) {
setNodeId(lNodeId);
lArgs.remove("unid");
}
}
@Override
public Object getVar(String aKey) {
return customVars.get(aKey);
}
@Override
public void setVar(String aKey, Object aValue) {
customVars.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) {
customVars.remove(aKey);
}
@Override
public String generateUID() {
return null;
}
@Override
public int getRemotePort() {
return -1;
}
@Override
public InetAddress getRemoteHost() {
return null;
}
@Override
public String getId() {
return String.valueOf(getRemotePort());
}
/*
* Returns the session for the websocket connection.
* @return
*/
@Override
public WebSocketSession getSession() {
return session;
}
// some convenience methods to easier process username (login-status)
// and configured unique node id for clusters (independent from tcp port)
/**
*
* @return
*/
@Override
public String getUsername() {
return getString(BaseConnector.VAR_USERNAME);
}
/**
*
* @param aUsername
*/
@Override
public void setUsername(String aUsername) {
setString(BaseConnector.VAR_USERNAME, aUsername);
}
/**
*
*/
@Override
public void removeUsername() {
removeVar(BaseConnector.VAR_USERNAME);
}
/**
*
* @return
*/
@Override
public String getNodeId() {
return getString(BaseConnector.VAR_NODEID);
}
/**
*
* @param aNodeId
*/
@Override
public void setNodeId(String aNodeId) {
setString(BaseConnector.VAR_NODEID, aNodeId);
}
/**
*
*/
@Override
public void removeNodeId() {
removeVar(BaseConnector.VAR_NODEID);
}
}