/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.connectivity;
import java.util.Properties;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import org.codehaus.aspectwerkz.exception.WrappedRuntimeException;
import org.codehaus.aspectwerkz.util.ContextClassLoader;
/**
* Manages the remote proxy server.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class RemoteProxyServerManager {
/**
* The path to the remote proxy server config file.
*/
private static final boolean START_REMOTE_PROXY_SERVER = "true".equals(
java.lang.System.getProperty(
"aspectwerkz.remote.server.run",
"false"
)
);
/**
* The sole instance.
*/
private static final RemoteProxyServerManager INSTANCE = new RemoteProxyServerManager();
/**
* The remote proxy server instance.
*/
private RemoteProxyServer m_remoteProxyServer = null;
/**
* Returns the sole instance.
*
* @return the sole instance
*/
public static RemoteProxyServerManager getInstance() {
return INSTANCE;
}
/**
* Starts up the remote proxy server.
*/
public void start() {
if (START_REMOTE_PROXY_SERVER) {
m_remoteProxyServer = new RemoteProxyServer(ContextClassLoader.getLoader(), getInvoker());
m_remoteProxyServer.start();
}
}
/**
* Returns the Invoker instance to use.
*
* @return the Invoker
*/
private Invoker getInvoker() {
Invoker invoker;
try {
Properties properties = new Properties();
properties.load(new FileInputStream(java.lang.System.getProperty("aspectwerkz.resource.bundle")));
String className = properties.getProperty("remote.server.invoker.classname");
invoker = (Invoker) ContextClassLoader.forName(className).newInstance();
} catch (Exception e) {
invoker = getDefaultInvoker();
}
return invoker;
}
/**
* Returns the default Invoker.
*
* @return the default invoker
*/
private Invoker getDefaultInvoker() {
return new Invoker() {
public Object invoke(final String handle,
final String methodName,
final Class[] paramTypes,
final Object[] args,
final Object context) {
Object result;
try {
final Object instance = RemoteProxy.getWrappedInstance(handle);
final Method method = instance.getClass().getMethod(methodName, paramTypes);
result = method.invoke(instance, args);
} catch (Exception e) {
throw new WrappedRuntimeException(e);
}
return result;
}
};
}
/**
* Private constructor.
*/
private RemoteProxyServerManager() {
}
}