next up previous contents
Next: B.2 VoyagerMasaGatewayStationaryAgent Up: B Source-Code des Voyager-MASA-Gateways Previous: B Source-Code des Voyager-MASA-Gateways

B.1 NamingWebServer

package de.unimuenchen.informatik.mnm.masa.agentSystem.nameservice;

import java.io.*;
import java.net.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

/**
 * Class NamingWebServer implements a startroutine for 
 * a CORBA-NameService and WWW-server to replay the IOR
 * of the NamingContext-Object of the CORBA-NameService.
 * So a the NameService of a special ORB can be used by another ORB.
 *
 */

public class NamingWebServer{
		private String factory_name;          // Factory's name, necessary for VisiBroker's Naming Service
		private String logfile;               // Name of the logfile, necessary for VisiBroker's Naming Service
		private Thread thr_vb_nameservice;    // Thread of the NameService (VisiBroker)
		private Process proc_jdk_nameservice; // Process of the NameService (JDK1.2)
		private String ior;                   // IOR-String
		private String nameORB;               // ORB name
		private int port;                     // Port of WWW-Server
		private String host;                  // Hostname


		/**
		 * Method to get the IOR from the NamingWebServer 
		 *
		 * @return IOR of the NamingContext belonging to the NamingService started by the NamingWebServer
		 *
		 */
		public static String getIORWWW() throws Exception
    {
				String ior = null;
				try{
						// get host
						String host = System.getProperty("namingwebserver.host");
						// get portnumber
						System.out.print("NamingWebServer.getIORWWW() get port...");
						int port = new Integer (System.getProperty("namingwebserver.port")).intValue();
						System.out.println("done.");

						// Request server for IOR
						URL url_name = new URL ("http",host,port,"/");
						URLConnection con_name = url_name.openConnection();
						InputStream in = con_name.getInputStream();
						byte [] buffer = new byte[in.available()];
						in.read(buffer);
						ior = new String(buffer);
						in.close();
      
						// Extract IOR from HTTP-File
						ior = ior.substring(ior.indexOf("IOR:"),ior.length());
						System.out.println("NamingWebServer.getIORWWW(): " + ior);
				} catch (Exception e){
						e.printStackTrace();
						throw e;
				}
				return ior;
    }
  
 
		/** 
		 *  Function to extract the pur IOR from a string
		 *
		 *  @param ior the string sequenze containing the IOR
		 *  @return the pur IOR
		 */

		private static String scanIOR(String ior){
				int begin = ior.indexOf("IOR:");
				String result = "IOR:";
				int i=begin+4;
				while(i<ior.length() && 
							((47<ior.charAt(i) && ior.charAt(i)<58) ||
							 (96<ior.charAt(i) && ior.charAt(i)<103))){ //is hex number
						result += ior.substring(i,i+1);
						i++;
				}//while
				return result;
		}



		/**
		 * Constructor
		 */
		private NamingWebServer(String factory_name, String logfile) throws Exception
    {
      
				// Check property
				nameORB = System.getProperty("orb.name");
				host = System.getProperty("namingwebserver.host");
				port = new Integer(System.getProperty("namingwebserver.port")).intValue();
				if (nameORB == null || (!nameORB.equals("VisiBroker") &
																!nameORB.equals("JDK1.2")))
						throw new Exception ("No or wrong ORB name specified.\n " +
																 "Valid ORB's: VisiBroker, JDK1.2");
				// Check arguments
				if(nameORB.equals("VisiBroker")){
						if (factory_name==null)
								throw new Exception("No factory name specified!");
						else this.factory_name = factory_name;
						if(logfile==null)
								throw new Exception("No logfile specified!");
						else this.logfile = logfile;
				}
      
				System.out.println("NamingWebServer.<init>: ORB name=" + nameORB);
				
    }

		/**
		 * Wait for request and send as answer of HTTP-requests
		 * IOR of the NamingContext
		 */
		private void waitForRequests() throws Exception {
				// check if localhost host for namingwebserver
				System.out.println("NamingWebServer.waitForRequests(): localhost:" + 
													 InetAddress.getLocalHost() + "\n"+
													 "                                   configured host: " +
													 host);
				if(!InetAddress.getLocalHost().equals(InetAddress.getByName(host))){
						throw new Exception("NamingWebServer must be started on " + host +
																" or the scripts must be re-compiled on localhost/"+ 
																InetAddress.getLocalHost() + "!");
				}
    
    
				// Create Serversocket
				ServerSocket acceptSocket = new ServerSocket(port);
				while (true){
						System.out.println("NamingWebServer.waitForRequests(): Wait for requests, listening at port " + port + ".");
						// Accept client, wait for requests
						Socket socket = acceptSocket.accept();
						// Create inputstream
						InputStream in = socket.getInputStream();
						// Wait for request-input
						java.lang.Object a = new java.lang.Object();
						synchronized (a) {while(in.available() <= 0) a.wait(10);}
						System.out.println("NamingWebServer.waitForRequests(): Request:");
						byte [] buffer = new byte[in.available()];
						in.read(buffer);
						System.out.print(new String(buffer)); 
      
						// Test whether nameservice still alive
						if (thr_vb_nameservice != null && !thr_vb_nameservice.isAlive()) 
								throw new  Exception("NameService down!");
						// Create outputstream, send ior over http
						OutputStream out = socket.getOutputStream();
						String answer = new String ("HTTP/1.0 200 OK \r\n" +
																				"Server: NamingWebServer \r\r" +
																				"Content_type: text/plain \r\n \r\n" + ior );
						out.write(answer.getBytes());
						out.flush();
						in.close();
						out.close();
						socket.close();
				}
		}  
 
  
		/** 
		 * initWebServer() starts the NameService and gets the IOR from it 
		 */
		private void initWebServer()throws Exception{
				OutputStream out = System.out;   // dummy initialisation, just to satisfy the compiler
				InputStream in = System.in;
				PrintStream stdout = System.out;;
    
				if (nameORB.equals("VisiBroker")){
						///////////////////////////////////////////
						// VisiBroker specific BEGIN
						// Create PipedInput- and OutputStreams for threadcommunication
						out = new PipedOutputStream();
						in = new PipedInputStream((PipedOutputStream) out);
						// Redirect stdout to Outputstream, stdout saved
						PrintStream ptrout = new PrintStream(out,true);
						System.setOut(ptrout);
						// create thread for nameservice
						thr_vb_nameservice = new Thread(new ThreadNameService());
						// Start nameService
						thr_vb_nameservice.start();
						//VisiBroker specific END
						///////////////////////////////////////////
				} else if (nameORB.equals("JDK1.2")){
          
						///////////////////////////////////////////
						// JDK specific BEGIN
						// start NameService
						System.out.println("NamingWebServer.initWebServer(): Start tnameserv in  runtime.");
						Runtime runt_nameservice = Runtime.getRuntime();
						String [] cmd = {"/proj/java/jdk1.2-solaris/jdk1.2beta4/bin/tnameserv",
														 "-ORBInitialPort","14050"};
						proc_jdk_nameservice = runt_nameservice.exec(cmd);
						// Get I/O-Stream of NameService-Process
						out = proc_jdk_nameservice.getOutputStream();
						in = proc_jdk_nameservice.getInputStream();
						System.out.println("NamingWebServer.initWebServer(): NameService starting.");
						// JDK specific END
						///////////////////////////////////////////
				}
    
				// Wait for Nameservice output (=IOR-String)
				while(in.available() <=0) {
						java.lang.Object a = new java.lang.Object();
						// artifical deadlock for waiting, 
						// i.e. nameservice has chance to write in stream
						synchronized (a) {a.wait(1);
						}
				}
				// Read IOR-String
				byte [] buffer = new byte[in.available()];
				in.read(buffer);
				// Close streams
				out.close();
				in.close();
   
				// extract the IOR from the read string
				String iorExtFact = scanIOR(new String(buffer));
    
				if (nameORB.equals("VisiBroker")){
						///////////////////////////////////////////
						// VisiBroker specific BEGIN
						// Reset stdout
						System.setOut(stdout);
						System.out.println("NamingWebServerinitWebServer(): " + iorExtFact);
						// Get IOR of NameService, 
						// The IOR returned by the NameService is 
						// the IOR of the ExtendedNamingContextFactory
						ORB orb = ORB.init();
						org.omg.CORBA.Object refNameContFact = 
												orb.string_to_object(iorExtFact);
						ExtendedNamingContextFactory nameContFact = 
								ExtendedNamingContextFactoryHelper.narrow(refNameContFact);
						NamingContext nameService = nameContFact.root_context();
						ior = orb.object_to_string(nameService);
						System.out.println("NamingWebServerinitWebServer(): ior length" + ior.length());
						//VisiBroker specific END
						///////////////////////////////////////////
				}else if(nameORB.equals("JDK1.2")){
						///////////////////////////////////////////
						// JDK specific BEGIN
						System.out.println("NamingWebServerinitWebServer(): " + iorExtFact);
						ior  = iorExtFact;
						System.out.println("NamingWebServerinitWebServer(): ior length" + ior.length());
						// JDK specific END
						///////////////////////////////////////////
				}
    
		}
  
		/**
		 * Stops the NamingWebServer
		 */
		private void stopWebServer()
    {
				// Stop NameService
				if (thr_vb_nameservice != null && thr_vb_nameservice.isAlive()) {
						System.out.println("NamingWebServer.stopWebServer(): Stop NameService (VisiBorker).");
						thr_vb_nameservice.interrupt();
				} else if (proc_jdk_nameservice != null){
						System.out.println("NamingWebServer.stopWebServer(): Stop NameService (JDK1.2).");
						proc_jdk_nameservice.destroy();
				}
    }

		/**
		 * Destruktor
		 */
		protected void finalize()
    {
				stopWebServer();
    }
  
		//////////////////////////////////////////////
		// Main
		/////////////////////////////////////////////
		public static void main (String[] args) throws Exception {
      
				NamingWebServer nws = null;
				try {
						nws = new NamingWebServer(args[0],args[1]);
						nws.initWebServer();
						nws.waitForRequests();
				} catch (Exception e){
						if (nws != null) nws.stopWebServer();
						e.printStackTrace();
				}
		}

		/**
		 * Thread of the NamingService of VisiBroker 3.0
		 */
		private class ThreadNameService  implements Runnable {
  
				public void run(){
    
						////////////////////////////////////////
						// VisiBroker specific BEGIN
						// Prepare arguments for namegservice
						String[] args_naming = {factory_name,logfile};
						// nameservice VisiBroker in an own thread
						com.visigenic.vbroker.services.CosNaming.ExtFactory.main(args_naming);
						// VisiBroker specific END
						///////////////////////////////////////
    
				}
		}
}



Copyright Munich Network Management Team