package railo.cli;
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.ConnectException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;
import java.util.Map;
import javax.servlet.ServletException;
//import railo.cli.servlet.ServletConfigImpl;
//import railo.cli.servlet.ServletContextImpl;
public class CLIFactory extends Thread {
private static final int PORT=8893;
private File root;
private String servletName;
private Map<String, String> config;
private long idleTime;
public CLIFactory(File root, String servletName, Map<String, String> config) {
this.root=root;
this.servletName=servletName;
this.config=config;
this.idleTime=60000;
String strIdle = config.get("idle");
if(strIdle!=null) {
try{
idleTime=Long.parseLong(strIdle);
}
catch(Throwable t){}
}
}
@Override
public void run() {
String name=root.getAbsolutePath();
InetAddress current=null;
try {
current = InetAddress.getLocalHost();
} catch (UnknownHostException e1) {
e1.printStackTrace();
return;
}
try {
try {
// first try to call existing service
invoke(current,name);
}
catch (ConnectException e) {
startInvoker(name);
invoke(current,name);
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
private void invoke(InetAddress current, String name) throws RemoteException, NotBoundException {
Registry registry = LocateRegistry.getRegistry(current.getHostAddress(),PORT);
CLIInvoker invoker = (CLIInvoker) registry.lookup( name );
invoker.invoke(config);
}
private void startInvoker(String name) throws ServletException, RemoteException {
Registry myReg = getRegistry(PORT);
CLIInvokerImpl invoker=new CLIInvokerImpl(root, servletName);
CLIInvoker stub = (CLIInvoker) UnicastRemoteObject.exportObject( invoker, 0 );
myReg.rebind( name, stub );
if(idleTime>0){
Closer closer = new Closer(myReg,invoker,name,idleTime);
closer.setDaemon(false);
closer.start();
}
}
public static Registry getRegistry(int port) {
Registry registry=null;
try {
registry= LocateRegistry.createRegistry( port );
}
catch (RemoteException e) {}
try {
if(registry==null)registry= LocateRegistry.getRegistry(port);
}
catch (RemoteException e) {
}
RemoteServer.setLog(System.out );
return registry;
}
}