blob: 95cb2f76de7f6c26dc1d903fffd57d2bf4d39af3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2011 Naumen. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pavel Samolisov - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.remoteservice.rpc.client;
import java.io.NotSerializableException;
import java.net.MalformedURLException;
import org.apache.xmlrpc.client.*;
import org.apache.xmlrpc.client.util.ClientFactory;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.internal.remoteservice.rpc.Activator;
import org.eclipse.ecf.internal.remoteservice.rpc.Messages;
import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.client.*;
import org.eclipse.ecf.remoteservice.rpc.RpcException;
import org.eclipse.ecf.remoteservice.rpc.identity.RpcId;
public class RpcClientService extends AbstractClientService {
private XmlRpcClient client;
public RpcClientService(RpcClientContainer container, RemoteServiceClientRegistration registration)
throws RpcException {
super(container, registration);
client = getXmlRpcClient();
}
protected XmlRpcClientConfig getXmlRpcClientConfig() throws RpcException {
try {
RpcId id = (RpcId) container.getID();
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(id.toURI().toURL());
config.setEnabledForExtensions(true);
// Set default timeouts
config.setConnectionTimeout(60 * 1000);
config.setReplyTimeout(60 * 1000);
return config;
} catch (MalformedURLException e) {
handleException(e.getMessage(), e);
return null;
}
}
protected XmlRpcClient getXmlRpcClient() throws RpcException {
XmlRpcClient xmlRpcClient = new XmlRpcClient();
xmlRpcClient.setConfig(getXmlRpcClientConfig());
xmlRpcClient.setTransportFactory(new XmlRpcCommonsTransportFactory(xmlRpcClient));
return xmlRpcClient;
}
/**
* Create a Dynamic Proxy for using XML-RPC servers, which builded on Apache XML-RPC.
*/
public Object createProxy(ClassLoader cl, Class[] classes) {
if (classes == null || classes.length < 1)
return null;
ClientFactory factory = new ClientFactory(client);
return factory.newInstance(classes[0]);
}
/**
* Create a Dynamic Proxy for using XML-RPC servers, which builded on Apache XML-RPC.
* See the <a href="http://ws.apache.org/xmlrpc/advanced.html">Dynamic proxies</a> section.
*/
protected Object createProxy(Class[] classes) {
if (classes == null || classes.length < 1)
return null;
ClientFactory factory = new ClientFactory(client);
return factory.newInstance(classes[0]);
}
/**
* Calls the XML-RPC Service with given operation of IRemoteCall. The returned value is
* the returned value from server
*
* @param call The remote call to make. Must not be <code>null</code>.
* @param callable The callable with default parameters to use to make the call.
* @return The XML-RPC Service's return value
*/
protected Object invokeRemoteCall(final IRemoteCall call, final IRemoteCallable callable) throws ECFException {
String operation = prepareEndpointAddress(call, callable);
Object result = null;
try {
result = client.execute(operation, toObjectsArray(operation, call, callable));
} catch (Exception e) {
handleException(Messages.RPC_EXCEPTION_WHILE_EXECUTION_METHOD + operation, e);
}
return result;
}
protected void handleException(String message, Throwable e) throws RpcException {
logException(message, e);
throw new RpcException(message, e);
}
protected Object[] toObjectsArray(String uri, IRemoteCall call, IRemoteCallable callable)
throws NotSerializableException {
IRemoteCallParameter[] rpcParameters = prepareParameters(uri, call, callable);
Object[] result = new Object[rpcParameters.length];
for (int i = 0; i < rpcParameters.length; i++) {
result[i] = rpcParameters[i].getValue();
}
return result;
}
protected void logException(String string, Throwable e) {
Activator a = Activator.getDefault();
if (a != null)
a.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, string, e));
}
protected void logWarning(String string, Throwable e) {
Activator a = Activator.getDefault();
if (a != null)
a.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, string));
}
}