1/* 2 * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.corba.se.impl.naming.cosnaming; 27 28import java.util.Properties; 29import java.net.InetAddress; 30 31import org.omg.CORBA.ORB; 32 33import org.omg.CosNaming.NamingContext; 34 35import com.sun.corba.se.spi.logging.CORBALogDomains; 36 37import com.sun.corba.se.impl.naming.cosnaming.TransientNameService; 38 39import com.sun.corba.se.impl.orbutil.ORBConstants; 40import com.sun.corba.se.impl.orbutil.CorbaResourceUtil; 41import com.sun.corba.se.impl.logging.NamingSystemException; 42 43/** 44 * Class TransientNameServer is a standalone application which 45 * implements a transient name service. It uses the TransientNameService 46 * class for the name service implementation, and the BootstrapServer 47 * for implementing bootstrapping, i.e., to get the initial NamingContext. 48 * <p> 49 * The BootstrapServer uses a Properties object specify the initial service 50 * object references supported; such as Properties object is created containing 51 * only a "NameService" entry together with the stringified object reference 52 * for the initial NamingContext. The BootstrapServer's listening port 53 * is set by first checking the supplied arguments to the name server 54 * (-ORBInitialPort), and if not set, defaults to the standard port number. 55 * The BootstrapServer is created supplying the Properties object, using no 56 * external File object for storage, and the derived initial port number. 57 * @see TransientNameService 58 * @see BootstrapServer 59 */ 60public class TransientNameServer 61{ 62 static private boolean debug = false ; 63 static NamingSystemException wrapper = NamingSystemException.get( 64 CORBALogDomains.NAMING ) ; 65 66 static public void trace( String msg ) { 67 if (debug) 68 System.out.println( msg ) ; 69 } 70 71 static public void initDebug( String[] args ) { 72 // If debug was compiled to be true for testing purposes, 73 // don't change it. 74 if (debug) 75 return ; 76 77 for (int ctr=0; ctr<args.length; ctr++) 78 if (args[ctr].equalsIgnoreCase( "-debug" )) { 79 debug = true ; 80 return ; 81 } 82 debug = false ; 83 } 84 85 private static org.omg.CORBA.Object initializeRootNamingContext( ORB orb ) { 86 org.omg.CORBA.Object rootContext = null; 87 try { 88 com.sun.corba.se.spi.orb.ORB coreORB = 89 (com.sun.corba.se.spi.orb.ORB)orb ; 90 91 TransientNameService tns = new TransientNameService(coreORB ); 92 return tns.initialNamingContext(); 93 } catch (org.omg.CORBA.SystemException e) { 94 throw wrapper.transNsCannotCreateInitialNcSys( e ) ; 95 } catch (Exception e) { 96 throw wrapper.transNsCannotCreateInitialNc( e ) ; 97 } 98 } 99 100 /** 101 * Main startup routine. It instantiates a TransientNameService 102 * object and a BootstrapServer object, and then allows invocations to 103 * happen. 104 * @param args an array of strings representing the startup arguments. 105 */ 106 public static void main(String args[]) { 107 initDebug( args ) ; 108 109 boolean invalidHostOption = false; 110 boolean orbInitialPort0 = false; 111 112 // Determine the initial bootstrap port to use 113 int initialPort = 0; 114 try { 115 trace( "Transient name server started with args " + args ) ; 116 117 // Create an ORB object 118 Properties props = System.getProperties() ; 119 120 props.put( ORBConstants.SERVER_ID_PROPERTY, ORBConstants.NAME_SERVICE_SERVER_ID ) ; 121 props.put( "org.omg.CORBA.ORBClass", 122 "com.sun.corba.se.impl.orb.ORBImpl" ); 123 124 try { 125 // Try environment 126 String ips = System.getProperty( ORBConstants.INITIAL_PORT_PROPERTY ) ; 127 if (ips != null && ips.length() > 0 ) { 128 initialPort = java.lang.Integer.parseInt(ips); 129 // -Dorg.omg.CORBA.ORBInitialPort=0 is invalid 130 if( initialPort == 0 ) { 131 orbInitialPort0 = true; 132 throw wrapper.transientNameServerBadPort() ; 133 } 134 } 135 String hostName = 136 System.getProperty( ORBConstants.INITIAL_HOST_PROPERTY ) ; 137 if( hostName != null ) { 138 invalidHostOption = true; 139 throw wrapper.transientNameServerBadHost() ; 140 } 141 } catch (java.lang.NumberFormatException e) { 142 // do nothing 143 } 144 145 // Let arguments override 146 for (int i=0;i<args.length;i++) { 147 // Was the initial port specified? 148 if (args[i].equals("-ORBInitialPort") && 149 i < args.length-1) { 150 initialPort = java.lang.Integer.parseInt(args[i+1]); 151 // -ORBInitialPort 0 is invalid 152 if( initialPort == 0 ) { 153 orbInitialPort0 = true; 154 throw wrapper.transientNameServerBadPort() ; 155 } 156 } 157 if (args[i].equals("-ORBInitialHost" ) ) { 158 invalidHostOption = true; 159 throw wrapper.transientNameServerBadHost() ; 160 } 161 } 162 163 // If initialPort is not set, then we need to set the Default 164 // Initial Port Property for the ORB 165 if( initialPort == 0 ) { 166 initialPort = ORBConstants.DEFAULT_INITIAL_PORT; 167 props.put( ORBConstants.INITIAL_PORT_PROPERTY, 168 java.lang.Integer.toString(initialPort) ); 169 } 170 171 // Set -ORBInitialPort = Persistent Server Port so that ORBImpl 172 // will start Boot Strap. 173 props.put( ORBConstants.PERSISTENT_SERVER_PORT_PROPERTY, 174 java.lang.Integer.toString(initialPort) ); 175 176 org.omg.CORBA.ORB corb = ORB.init( args, props ) ; 177 trace( "ORB object returned from init: " + corb ) ; 178 179 org.omg.CORBA.Object ns = initializeRootNamingContext( corb ) ; 180 ((com.sun.corba.se.org.omg.CORBA.ORB)corb).register_initial_reference( 181 "NamingService", ns ) ; 182 183 String stringifiedIOR = null; 184 185 if( ns != null ) { 186 stringifiedIOR = corb.object_to_string(ns) ; 187 } else { 188 NamingUtils.errprint(CorbaResourceUtil.getText( 189 "tnameserv.exception", initialPort)); 190 NamingUtils.errprint(CorbaResourceUtil.getText( 191 "tnameserv.usage")); 192 System.exit( 1 ); 193 } 194 195 trace( "name service created" ) ; 196 197 // This is used for handshaking by the IBM test framework! 198 // Do not modify, unless another synchronization protocol is 199 // used to replace this hack! 200 201 System.out.println(CorbaResourceUtil.getText( 202 "tnameserv.hs1", stringifiedIOR)); 203 System.out.println(CorbaResourceUtil.getText( 204 "tnameserv.hs2", initialPort)); 205 System.out.println(CorbaResourceUtil.getText("tnameserv.hs3")); 206 207 // Serve objects. 208 java.lang.Object sync = new java.lang.Object(); 209 synchronized (sync) {sync.wait();} 210 } catch (Exception e) { 211 if( invalidHostOption ) { 212 // Let the User Know that -ORBInitialHost is not valid for 213 // tnameserver 214 NamingUtils.errprint( CorbaResourceUtil.getText( 215 "tnameserv.invalidhostoption" ) ); 216 } else if( orbInitialPort0 ) { 217 // Let the User Know that -ORBInitialPort 0 is not valid for 218 // tnameserver 219 NamingUtils.errprint( CorbaResourceUtil.getText( 220 "tnameserv.orbinitialport0" )); 221 } else { 222 NamingUtils.errprint(CorbaResourceUtil.getText( 223 "tnameserv.exception", initialPort)); 224 NamingUtils.errprint(CorbaResourceUtil.getText( 225 "tnameserv.usage")); 226 } 227 228 e.printStackTrace() ; 229 } 230 } 231 232 /** 233 * Private constructor since no object of this type should be instantiated. 234 */ 235 private TransientNameServer() {} 236} 237