package org.opennaas.extensions.router.opener.protocol;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.opennaas.core.resources.protocol.IProtocolMessageFilter;
import org.opennaas.core.resources.protocol.IProtocolSession;
import org.opennaas.core.resources.protocol.IProtocolSessionListener;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.protocol.ProtocolSessionContext;
import org.opennaas.extensions.router.opener.client.OpenerQuaggaOpenAPI;
public class OpenerProtocolSession implements IProtocolSession {
public static final String OPENER_PROTOCOL_TYPE = "opener";
private ProtocolSessionContext sessionContext = null;
private String sessionId = null;
private Status status = null;
private Map<String, IProtocolSessionListener> protocolListeners = null;
private Map<String, IProtocolMessageFilter> protocolMessageFilters = null;
OpenerQuaggaOpenAPI openerClient;
public OpenerProtocolSession(String sessionID,
ProtocolSessionContext protocolSessionContext) throws ProtocolException {
super();
setSessionId(sessionID);
setSessionContext(protocolSessionContext);
this.protocolListeners = new HashMap<String, IProtocolSessionListener>();
this.protocolMessageFilters = new HashMap<String, IProtocolMessageFilter>();
this.status = Status.DISCONNECTED_BY_USER;
checkProtocolSessionContext(protocolSessionContext);
}
@Override
public String getSessionId() {
return sessionId;
}
@Override
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
@Override
public ProtocolSessionContext getSessionContext() {
return sessionContext;
}
@Override
public void setSessionContext(ProtocolSessionContext sessionContext) {
this.sessionContext = sessionContext;
}
@Override
public Status getStatus() {
return status;
}
@Override
public void connect() throws ProtocolException {
if (status.equals(Status.CONNECTED)) {
throw new ProtocolException(
"Cannot connect because the session is already connected");
}
this.openerClient = instantiateClient(getSessionContext());
setStatus(Status.CONNECTED);
}
@Override
public void disconnect() throws ProtocolException {
if (!status.equals(Status.CONNECTED)) {
throw new ProtocolException(
"Cannot disconnect because the session is already disconnected. Current state: "
+ status);
}
this.openerClient = null;
setStatus(Status.DISCONNECTED_BY_USER);
}
@Override
public Object sendReceive(Object message) throws ProtocolException {
throw new ProtocolException("Unsuported operation");
}
@Override
public void asyncSend(Object message) throws ProtocolException {
throw new ProtocolException("Unsuported operation");
}
@Override
public void registerProtocolSessionListener(
IProtocolSessionListener protocolSessionListener,
IProtocolMessageFilter protocolMessageFilter, String idListener) {
protocolMessageFilters.put(idListener, protocolMessageFilter);
protocolListeners.put(idListener, protocolSessionListener);
}
@Override
public void unregisterProtocolSessionListener(
IProtocolSessionListener protocolSessionListener, String idListener) {
protocolMessageFilters.remove(idListener);
protocolListeners.remove(idListener);
}
/**
* This method should not be used in Actions to retrieve the client. In Actions use getOpenerClientForUse instead.
*
* @return openerClient
* @see getOpenerClientForUse()
*/
public OpenerQuaggaOpenAPI getOpenerClient() {
return openerClient;
}
public void setOpenerClient(OpenerQuaggaOpenAPI openerClient) {
this.openerClient = openerClient;
}
/**
* Retrieve openerClient and checks session is connected. This method may be used in Actions to retrieve the OpenerClient and call its methods
* afterwards.
*
* @return initialized openerClient.
* @throws ProtocolException
* if this ProtocolSession is not connected.
*/
public OpenerQuaggaOpenAPI getOpenerClientForUse() throws ProtocolException {
if (!status.equals(Status.CONNECTED)) {
throw new ProtocolException(
"Cannot use client. Session is not connected. Current session status is " + status);
}
return getOpenerClient();
}
protected void setStatus(Status status) {
this.status = status;
}
private OpenerQuaggaOpenAPI instantiateClient(ProtocolSessionContext sessionContext) {
String uri = (String) sessionContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL_URI);
return JAXRSClientFactory.create(uri, OpenerQuaggaOpenAPI.class);
}
private void checkProtocolSessionContext(ProtocolSessionContext protocolSessionContext) throws ProtocolException {
String protocol = (String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL);
if ((protocol == null) || (protocol.length() == 0) || !protocol.equals(OPENER_PROTOCOL_TYPE)) {
throw new ProtocolException(
"Protocols OPENER: Invalid protocol type: " + protocol + ". Protocol type must be " + OPENER_PROTOCOL_TYPE);
}
String uri = (String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL_URI);
if ((uri == null) || (uri.length() == 0)) {
throw new ProtocolException(
"Protocols OPENER: Couldn't get " + ProtocolSessionContext.PROTOCOL_URI + " from protocolSessionContext.");
}
// check given uri is a valid URI
try {
new URI(uri);
} catch (URISyntaxException e) {
throw new ProtocolException(e);
}
}
}