blob: 0c0d8cc8ff9ecbdfefdb761b630fbf62b407bc03 [file] [log] [blame]
/*******************************************************************************
* Copyright 2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* All rights reserved. This program and the accompanying materials
* are made available under the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
******************************************************************************/
package org.eclipse.emf.emfstore.client.model.connectionmanager.xmlrpc;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcSun15HttpTransportFactory;
import org.eclipse.emf.emfstore.client.model.Configuration;
import org.eclipse.emf.emfstore.client.model.ServerInfo;
import org.eclipse.emf.emfstore.client.model.connectionmanager.ConnectionManager;
import org.eclipse.emf.emfstore.client.model.connectionmanager.KeyStoreManager;
import org.eclipse.emf.emfstore.client.model.exceptions.CertificateStoreException;
import org.eclipse.emf.emfstore.common.model.util.SerializationException;
import org.eclipse.emf.emfstore.server.connection.xmlrpc.util.EObjectTypeFactory;
import org.eclipse.emf.emfstore.server.exceptions.ConnectionException;
import org.eclipse.emf.emfstore.server.exceptions.EmfStoreException;
import org.xml.sax.SAXException;
/**
* Manager for XML RPC server calls.
*
* @author wesendon
*/
public class XmlRpcClientManager {
/**
* Default constructor.
*
* @param serverInterface name of interface
*/
public XmlRpcClientManager(String serverInterface) {
this.serverInterface = serverInterface;
}
private String serverInterface;
private XmlRpcClient client;
/**
* Initializes the connection.
*
* @param serverInfo server info
* @throws ConnectionException in case of failure
*/
public void initConnection(ServerInfo serverInfo) throws ConnectionException {
try {
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(createURL(serverInfo));
config.setEnabledForExceptions(true);
config.setEnabledForExtensions(true);
config.setConnectionTimeout(Configuration.getXMLRPCConnectionTimeout());
config.setReplyTimeout(Configuration.getXMLRPCReplyTimeout());
config.setContentLengthOptional(true);
client = new XmlRpcClient();
client.setTypeFactory(new EObjectTypeFactory(client));
XmlRpcSun15HttpTransportFactory factory = new XmlRpcSun15HttpTransportFactory(client);
try {
factory.setSSLSocketFactory(KeyStoreManager.getInstance().getSSLContext().getSocketFactory());
} catch (CertificateStoreException e) {
throw new ConnectionException("Couldn't load certificate", e);
}
client.setTransportFactory(factory);
client.setConfig(config);
// } catch (XmlRpcException e) {
// throw new ConnectionException("", e);
} catch (MalformedURLException e) {
throw new ConnectionException("Malformed Url or Port", e);
}
}
private URL createURL(ServerInfo serverInfo) throws MalformedURLException {
checkUrl(serverInfo.getUrl());
return new URL("https", serverInfo.getUrl(), serverInfo.getPort(), "xmlrpc");
}
private void checkUrl(String url) throws MalformedURLException {
if (url != null && !url.equals("")) {
if (!(url.contains(":") || url.contains("/"))) {
return;
}
}
throw new MalformedURLException();
}
/**
* Executes a server call with return value.
*
* @param <T> return type
* @param methodName method name
* @param returnType return type
* @param parameters parameters
* @return returned object from server
* @throws EmfStoreException in case of failure
*/
public <T> T callWithResult(String methodName, Class<T> returnType, Object... parameters) throws EmfStoreException {
return executeCall(methodName, returnType, parameters);
}
/**
* Executes a server call with list return value.
*
* @param <T> return type
* @param methodName method name
* @param returnType list return type
* @param parameters parameters
* @return list return type
* @throws EmfStoreException in case of failure
*/
@SuppressWarnings("unchecked")
public <T> List<T> callWithListResult(String methodName, Class<T> returnType, Object... parameters)
throws EmfStoreException {
List<T> result = new ArrayList<T>();
Object[] callResult = executeCall(methodName, Object[].class, parameters);
if (callResult == null) {
return result;
}
for (Object obj : callResult) {
result.add((T) obj);
}
return result;
}
/**
* Executes a server call without return value.
*
* @param methodName method name
* @param parameters parameters
* @throws EmfStoreException in case of failure
*/
public void call(String methodName, Object... parameters) throws EmfStoreException {
executeCall(methodName, null, parameters);
}
@SuppressWarnings("unchecked")
private <T> T executeCall(String methodName, Class<T> returnType, Object[] params) throws EmfStoreException {
if (client == null) {
throw new ConnectionException(ConnectionManager.REMOTE);
}
try {
return (T) client.execute(serverInterface + "." + methodName, params);
} catch (XmlRpcException e) {
if (e.getCause() instanceof EmfStoreException) {
throw ((EmfStoreException) e.getCause());
} else if (e.linkedException instanceof SAXException
&& ((SAXException) e.linkedException).getException() instanceof SerializationException) {
SerializationException serialE = (SerializationException) ((SAXException) e.linkedException)
.getException();
throw new org.eclipse.emf.emfstore.server.exceptions.SerializationException(serialE);
} else {
throw new ConnectionException(ConnectionManager.REMOTE, e);
}
}
}
}