package org.opennaas.extensions.protocols.http;
/*
* #%L
* OpenNaaS :: Protocotols :: HTTP
* %%
* Copyright (C) 2007 - 2015 Fundació Privada i2CAT, Internet i Innovació a Catalunya
* %%
* 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.
* #L%
*/
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.common.util.ProxyClassLoader;
import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
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;
/**
*
* @author Adrián Roselló Rey (i2CAT)
*
*/
public class HttpProtocolSession implements IProtocolSession {
public static final String HTTP_PROTOCOL_TYPE = "http";
private ProtocolSessionContext sessionContext = null;
private String sessionId = null;
private Status status = null;
private Map<String, IProtocolSessionListener> protocolListeners = null;
private Map<String, IProtocolMessageFilter> protocolMessageFilters = null;
private URI clientUrl;
public HttpProtocolSession(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 void asyncSend(Object message) throws ProtocolException {
throw new ProtocolException("Unsuported operation");
}
@Override
public void connect() throws ProtocolException {
if (status.equals(Status.CONNECTED))
throw new ProtocolException("Cannot connect because the session is already connected");
status = 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);
status = Status.DISCONNECTED_BY_USER;
}
@Override
public ProtocolSessionContext getSessionContext() {
return sessionContext;
}
@Override
public String getSessionId() {
return sessionId;
}
@Override
public Status getStatus() {
return status;
}
@Override
public void registerProtocolSessionListener(IProtocolSessionListener protocolSessionListener, IProtocolMessageFilter protocolMessageFilter,
String idListener) {
protocolMessageFilters.put(idListener, protocolMessageFilter);
protocolListeners.put(idListener, protocolSessionListener);
}
@Override
public Object sendReceive(Object message) throws ProtocolException {
throw new ProtocolException("Unsuported operation");
}
@Override
public void setSessionContext(ProtocolSessionContext sessionContext) {
this.sessionContext = sessionContext;
}
@Override
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
@Override
public void unregisterProtocolSessionListener(IProtocolSessionListener protocolSessionListener, String idListener) {
protocolMessageFilters.remove(idListener);
protocolListeners.remove(idListener);
}
public <API> API getClient(Class<API> apiClass, Object provider) {
ProxyClassLoader classLoader = new ProxyClassLoader();
classLoader.addLoader(apiClass.getClassLoader());
classLoader.addLoader(JAXRSClientFactoryBean.class.getClassLoader());
JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
bean.setAddress(clientUrl.toString());
if (provider != null)
bean.setProvider(provider);
bean.setResourceClass(apiClass);
bean.setClassLoader(classLoader);
return bean.create(apiClass);
}
private void checkProtocolSessionContext(ProtocolSessionContext protocolSessionContext) throws ProtocolException {
String protocol = (String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL);
if ((protocol == null) || (protocol.length() == 0) || !protocol.equals(HTTP_PROTOCOL_TYPE)) {
throw new ProtocolException(
"Protocols HTTP: Invalid protocol type: " + protocol + ". Protocol type must be " + HTTP_PROTOCOL_TYPE);
}
String uri = (String) protocolSessionContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL_URI);
if ((uri == null) || (uri.length() == 0)) {
throw new ProtocolException(
"Protocols HTTP : Couldn't get " + ProtocolSessionContext.PROTOCOL_URI + " from protocolSessionContext.");
}
if (!StringUtils.startsWith(uri, "http://") && !StringUtils.startsWith(uri, "https://"))
throw new ProtocolException("Invalid protocol url: HTTPProtocol expects http or https urls.");
try {
clientUrl = new URI(uri);
} catch (URISyntaxException e) {
throw new ProtocolException(e);
}
}
}