// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/corba/com/bbn/openmap/util/corba/CORBASupport.java,v $ // $RCSfile: CORBASupport.java,v $ // $Revision: 1.4 $ // $Date: 2004/10/14 18:05:38 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.util.corba; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.Vector; import org.omg.CORBA.ORB; import org.omg.CORBA.portable.ObjectImpl; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContext; import org.omg.CosNaming.NamingContextHelper; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.Servant; import com.bbn.openmap.Environment; import com.bbn.openmap.util.Debug; /** * CORBASupport provides common functions for OpenMap servers. */ public class CORBASupport { /** * Return a static reference to the ORB. Figures out which environment * (applet or application) the jre is in, and initialize the orb accordingly. */ public ORB initORB(String[] args) { Debug.message("corba", "CORBAManager.getORB(): initializing ORB"); if (Environment.isApplet()) { // initialize the Environment with the properties passed // in. if (Debug.debugging("corba")) { System.out.println("CORBAManager: initializing applet"); } return ORB.init(Environment.getApplet(), Environment.getProperties()); } if (Debug.debugging("corba")) { System.out.println("CORBAManager: initializing application"); } return ORB.init((String[]) null, System.getProperties()); } /** * Read a IOR file from an URL, return the org.omg.CORBA.Object for that IOR. */ public org.omg.CORBA.Object readIOR(URL iorURL) throws IOException { org.omg.CORBA.Object object = null; if (iorURL != null) { URLConnection urlConnection = iorURL.openConnection(); InputStream is = urlConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader reader = new BufferedReader(isr); String ior = reader.readLine(); if (Debug.debugging("corba")) { Debug.output("CORBASupport.readIOR() using ior: " + ior); } reader.close(); if (ior != null) { object = initORB(null).string_to_object(ior); } } return object; } /** * Write the IOR for a object to a file. * * @param iorFile where to write the file * @param iorObj the object to represent in the IOR file. */ public void writeIOR(String iorFile, org.omg.CORBA.Object iorObj) throws IOException { if (iorFile != null) { ORB orb = initORB(null); java.io.FileWriter outFile = new java.io.FileWriter(iorFile); java.io.PrintWriter writer = new java.io.PrintWriter(outFile); String ior = orb.object_to_string(iorObj); writer.println(ior); writer.close(); if (Debug.debugging("corba")) { Debug.output(orb.object_to_string(iorObj)); } } } /** * Set up the CORBA NamingService with the name for an object. */ public void setUpNamingService(String naming, org.omg.CORBA.Object namingObj) { ORB orb = initORB(null); if (naming != null) { // *** Naming server stuff org.omg.CORBA.Object obj = null; try { obj = orb.resolve_initial_references("NameService"); if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): NameService Object OK"); } } catch (org.omg.CORBA.ORBPackage.InvalidName e) { Debug.error("CORBASupport.setUpNamingService(): Invalid Name exception \n" + e.getMessage()); } NamingContext rootContext = NamingContextHelper.narrow(obj); if (rootContext == null) { if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Root context null!!"); } } String temp = naming; Vector components = new Vector(); int numcomponents = 0; String temporaryTemp = null; int tindex = temp.indexOf("/"); while (tindex != -1) { numcomponents++; temporaryTemp = temp.substring(0, tindex); if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Adding Name component: " + temporaryTemp); } components.addElement(temporaryTemp); temp = temp.substring(tindex + 1); tindex = temp.indexOf("/"); } if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Adding final Name component: " + temp); } components.addElement(temp); NamingContext newContext = null; NamingContext oldContext = rootContext; for (int i = 0; i < components.size() - 1; i++) { NameComponent[] newName = new NameComponent[1]; newName[0] = new NameComponent((String) (components.elementAt(i)), ""); String debugName = (String) (components.elementAt(i)); if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Working on: " + debugName); } try { if (oldContext != null) { newContext = NamingContextHelper.narrow(oldContext.resolve(newName)); } } catch (org.omg.CosNaming.NamingContextPackage.NotFound nfe) { try { if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Doing a bind new context"); } newContext = oldContext.bind_new_context(newName); } catch (org.omg.CosNaming.NamingContextPackage.AlreadyBound abe) { Debug.output("CORBASupport.setUpNamingService(): Already bound for new context"); } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed cpe0) { Debug.output("CORBASupport.setUpNamingService(): Cannot proceed for new context"); } catch (org.omg.CosNaming.NamingContextPackage.InvalidName ine0) { Debug.output("CORBASupport.setUpNamingService(): Invalid Name for new context"); } catch (org.omg.CosNaming.NamingContextPackage.NotFound nfe0) { Debug.output("CORBASupport.setUpNamingService(): Not found for new context"); } } catch (org.omg.CosNaming.NamingContextPackage.InvalidName ine) { Debug.output("CORBASupport.setUpNamingService(): Invalid name"); } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed cpe) { Debug.output("CORBASupport.setUpNamingService(): Cannot proceed"); } oldContext = newContext; } NameComponent[] finalName = new NameComponent[1]; finalName[0] = new NameComponent((String) (components.elementAt(components.size() - 1)), ""); String debugName = (String) (components.elementAt(components.size() - 1)); if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService: Finally working on: " + debugName); } if (oldContext != null) { try { if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Doing a rebind :" + orb.object_to_string(oldContext)); } oldContext.rebind(finalName, namingObj); if (Debug.debugging("corba")) { Debug.output("CORBASupport.setUpNamingService(): Completed rebind for " + finalName[0]); } } catch (org.omg.CosNaming.NamingContextPackage.CannotProceed cpe1) { Debug.output("CORBASupport.setUpNamingService(): Cannot proceed in rebind"); } catch (org.omg.CosNaming.NamingContextPackage.InvalidName ine1) { Debug.output("CORBASupport.setUpNamingService(): Invalid Name in rebind"); } catch (org.omg.CosNaming.NamingContextPackage.NotFound nfe1) { Debug.output("CORBASupport.setUpNamingService(): Not found in rebind"); } } } } public org.omg.CORBA.Object resolveName(String naming) { if (naming != null) { try { ORB orb = initORB(null); if (Debug.debugging("corbadetail")) { listServices(orb); } // Get the root context of the name service. org.omg.CORBA.Object obj = null; try { obj = orb.resolve_initial_references("NameService"); } catch (Exception e) { Debug.error("CORBASupport.resolveName(): Error getting root naming context."); e.printStackTrace(); } NamingContext rootContext = NamingContextHelper.narrow(obj); if (Debug.debugging("corba")) { if (rootContext == null) { Debug.error("CORBASupport.resolveName(): No root context!"); } } // Resolve the specialist String temp = naming; Vector components = new Vector(); int numcomponents = 0; String temporaryTemp = null; int tindex = temp.indexOf("/"); while (tindex != -1) { numcomponents++; temporaryTemp = temp.substring(0, tindex); if (Debug.debugging("corba")) { Debug.output("CORBASupport.resolveName(): Adding Name component: " + temporaryTemp); } components.addElement(temporaryTemp); temp = temp.substring(tindex + 1); tindex = temp.indexOf("/"); } if (Debug.debugging("corba")) { Debug.output("CORBASupport.resolveName(): Adding final Name component: " + temp); } components.addElement(temp); NameComponent[] objectName = new NameComponent[components.size()]; for (int i = 0; i < components.size(); i++) { objectName[i] = new NameComponent((String) (components.elementAt(i)), ""); } obj = null; // reset try { if (rootContext != null) { obj = rootContext.resolve(objectName); } else { Debug.output("CORBASupport.resolveName(): No Root Context for naming."); } } catch (Exception e) { Debug.output("CORBASupport.resolveName(): Error resolving for the object."); e.printStackTrace(); } if (obj == null) { if (Debug.debugging("corba")) { Debug.output("CORBASupport.resolveName(): no object after resolve"); } } else { if (Debug.debugging("corba")) { Debug.output("CORBASupport.resolveName(): " + orb.object_to_string(obj)); } } return obj; } catch (org.omg.CORBA.SystemException e) { Debug.error("CORBASupport.resolveName(): " + e); } catch (Throwable t) { Debug.output("CORBASupport.resolveName(): " + t); } } return null; } protected void listServices(ORB orb) { String[] services = orb.list_initial_services(); if (services != null) { Debug.output("CORBASupport: Listing services:"); for (int k = 0; k < services.length; k++) { Debug.output(" service " + k + ": " + services[k]); } } else { Debug.output("CORBASupport: no services available"); } } /** * This is a default start method that initializes the server represented by * a Servant. This is a POA method. The args should be command line * arguments, and the ior file is written and naming service is started from * here. * * @param servant the Servant of the POA object to hook up to the ORB. * @param args a String[] of args to pass to orb on initialization. * @param iorFile the path of the ior file to write, can be null to not write * a file. * @param naming the name of the Servant to pass to the NamingService, can be * null to not register a name. */ public void start(Servant servant, String[] args, String iorFile, String naming) { start(servant, args, iorFile, naming, true); } /** * This is a default start method that initializes the server represented by * a Servant. This is a POA method. The args should be command line * arguments, and the ior file is written and naming service is started from * here. * * @param servant the Servant of the POA object to hook up to the ORB. * @param args a String[] of args to pass to orb on initialization. * @param iorFile the path of the ior file to write, can be null to not write * a file. * @param naming the name of the Servant to pass to the NamingService, can be * null to not register a name. * @param runORB flag to call orb.run() at the end of the method. This will * block the current thread! If the servant is a server, then this * should be true. If you have a callback object that you just want to * register with the orb, this should be false. */ public void start(Servant servant, String[] args, String iorFile, String naming, boolean runORB) { // Initialize the ORB ORB orb = initORB(args); POA poa = null; if (Debug.debugging("corbadetail")) { listServices(orb); } // find root poa try { org.omg.CORBA.Object raw = orb.resolve_initial_references("RootPOA"); poa = POAHelper.narrow(raw); poa.the_POAManager().activate(); } catch (Exception error) { Debug.error("Error getting root POA: " + error); error.printStackTrace(); return; } try { poa.activate_object(servant); } catch (Exception e) { Debug.error("Caught exception activating POA object: \n" + e.getMessage()); } // write the IOR out try { writeIOR(iorFile, servant._this_object()); } catch (IOException ioe) { Debug.error("CORBASupport caught IOException writing IOR file to " + iorFile); } // Set up naming service setUpNamingService(naming, servant._this_object()); // Announce ourselves to the world Debug.output(servant.toString() + " is ready."); if (runORB) { orb.run(); } } /** * This is a default start method that initializes a CORBA server This is a * BOA method, and the main BOA method calls are commented out because the * BOA isn't available in the jdk by default. If you are using a CORBA * installation with a BOA implementation, uncomment the lines below and * recompile. The args should be command line arguments, and the ior file is * written and naming service is started from here. */ public void start(ObjectImpl obj, String[] args, String iorFile, String naming) { ORB orb = initORB(args); // Initialize the BOA // org.omg.CORBA.BOA boa = orb.BOA_init(); // // Export the newly created object // boa.obj_is_ready(obj); if (Debug.debugging("corbadetail")) { listServices(orb); } // write the IOR try { writeIOR(iorFile, obj); } catch (IOException ioe) { Debug.error("CORBASupport caught IOException writing IOR file to " + iorFile); } // Set up naming service setUpNamingService(naming, obj); // Announce ourselves to the world Debug.output(obj.toString() + " is ready."); // // Wait for incoming requests // boa.impl_is_ready(); } }