Package com.sun.grid.jgdi.rmi

Source Code of com.sun.grid.jgdi.rmi.JGDIRmiProxy$ShutdownHook

/*___INFO__MARK_BEGIN__*/
/*************************************************************************
*
*  The Contents of this file are made available subject to the terms of
*  the Sun Industry Standards Source License Version 1.2
*
*  Sun Microsystems Inc., March, 2001
*
*
*  Sun Industry Standards Source License Version 1.2
*  =================================================
*  The contents of this file are subject to the Sun Industry Standards
*  Source License Version 1.2 (the "License"); You may not use this file
*  except in compliance with the License. You may obtain a copy of the
*  License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
*
*  Software provided under this License is provided on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
*  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
*  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
*  See the License for the specific provisions governing your rights and
*  obligations concerning the Software.
*
*   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
*   Copyright: 2001 by Sun Microsystems, Inc.
*
*   All Rights Reserved.
*
************************************************************************/
/*___INFO__MARK_END__*/
package com.sun.grid.jgdi.rmi;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.logging.Logger;
import java.rmi.Remote;
import java.rmi.server.Unreferenced;

/**
*  Reference implementation of a JGDI Rmi proxy.
*
<p>The rmi proxy can be started from the commandline. Use the <code>-help</code>
*     to get more information.</p>
*
<p>The JGDI Rmi proxy needs shared libs of the Sun&trade; Grid Engine in the
*     <code>LD_LIBRARY_PATH</code>.</p>
*
<p><b>Example:</b></p>
<pre>
*  % setenv LD_LIBRARY_PATH $SGE_ROOT/lib/sol-sparc64
*  % java -d64 -cp $SGE_ROOT/lib/jgdi.jar com.sun.grid.jgdi.rmi.JGDIRmiProxy -help
*  ...
</pre>
*
<p>The JGDIRMIProxy do not install a <code>SecurityManager</code>. Please use the
*     <code>java.security.manager</code> system property to install <code>SecurityManager</code>.
*     The JGDIRMIProxy needs the following permissions:</p>
*
<pre>
*  permission java.lang.RuntimePermission "loadLibrary.jgdi"
*  permission java.lang.RuntimePermission "shutdownHooks"
</pre>
*
*
*
<p>This class uses the logger <code>com.sun.grid.jgdi.rmi</code>.
*
*/
public class JGDIRmiProxy implements Unreferenced {
   
    private static Logger logger = Logger.getLogger("com.sun.grid.jgdi.rmi");
   
    /**
     * Main method of the <code>JGDIRMIProxy</code>. Please use the <code>-help</code> option
     * for a detailed usage message.
     *
     * @param args  arguments for the <code>JGDIRMIProxy</code>
     */
    public final static void main(String [] args) {
       
        if( args.length < 2 ) {
            usage("Invalid number of arguments", 1);
        }
       
        String registryHost = null;
        int    registryPort = 0;
       
        int i = 0;
        while( i < args.length - 2) {
            if(args[i].equals("-help")) {
                usage(null, 0);
            } else if(args[i].equals("-reg")) {
                i++;
                if (i>=args.length-2) {
                    usage("-reg option needs <host>[:<port>]", 1);
                }
               
                int del = args[i].indexOf(':');
                if(del < 0 ) {
                    registryHost = args[i];
                    if(registryHost.equals("local")) {
                        usage("For a local registry a port in mandatory", 1);
                    }
                } else {
                    registryHost = args[i].substring(0,del);
                    String portString = args[i].substring(del+1);
                    try {
                        registryPort = Integer.parseInt(portString);
                    } catch(NumberFormatException nfe) {
                        usage("Invalid port " + portString, 1);
                    }
                }
            } else {
                usage("Invalid option " + args[i], 1);
            }
            i++;
        }
       
        String serviceName = args[i++];
        String sge_url = args[i++];
       
        try {
           
            Registry reg = null;
            if(registryHost == null) {
                reg = LocateRegistry.getRegistry();
            } else if (registryHost.equals("local")) {
                reg = LocateRegistry.createRegistry(registryPort);
                logger.info("local registry at port " + registryPort + " created" );
            } else if ( registryPort == 0 ) {
                logger.info("Get registry from " + registryHost);
                reg = LocateRegistry.getRegistry(registryHost);
            } else {
                logger.info("Get registry from " + registryHost + ":" + registryPort);
                reg = LocateRegistry.getRegistry(registryHost, registryPort);
            }
            JGDIRemoteFactoryImpl service = new JGDIRemoteFactoryImpl(sge_url);
            Thread.sleep(1000);
            Remote stub = (Remote)UnicastRemoteObject.exportObject(service, 0);
           
            reg.bind(serviceName, stub);
           
            logger.info("JGDIRemoteFactory bound to name " + serviceName );
           
            ShutdownHook shutdownHook = new ShutdownHook(reg, serviceName);
            Runtime.getRuntime().addShutdownHook(shutdownHook);
           
            shutdownHook.waitForShutdown();
           
        } catch( Exception e ) {
            e.printStackTrace();
        }
    }
   
    private static class ShutdownHook extends Thread {
       
        private Registry registry;
        private String serviceName;
       
        public ShutdownHook(Registry registry, String serviceName ) {
            this.registry = registry;
            this.serviceName = serviceName;
        }
       
        public void run() {
            try {
                registry.unbind(serviceName);
            } catch(Exception re) {
                logger.throwing(getClass().getName(), "run", re);
            } finally {
                synchronized(this) {
                    notifyAll();
                }
            }
        }
       
        public synchronized void waitForShutdown() throws InterruptedException {
            wait();
        }
    }
   
   
    private static void usage(String msg, int exitCode ) {
        if( msg != null ) {
            System.err.println(msg);
        }
        System.err.println("JGDIRmiProxy [options] <service name> <sge_url>");
        System.err.println();
        System.err.println("  <service name>   Bind name for the rmi service");
        System.err.println("  <sge_url>        Grid Engine connection URL");
        System.err.println("  Options:");
        System.err.println("    -help                 Print this help message");
        System.err.println("    -reg  <host>[:port]   Host and port of the rmi registry.");
        System.err.println("                          If <host> is equal to \"local\" then");
        System.err.println("                          the rmi proxy creates a new rmi registry");
        System.err.println("                          which binds port <port>.");
        System.err.println("                          Port defaults to 1099 and host to localhost");
        System.exit(exitCode);
    }
   
    public void unreferenced() {
        System.out.println("unreferenced");
    }
}
TOP

Related Classes of com.sun.grid.jgdi.rmi.JGDIRmiProxy$ShutdownHook

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.