1 /* 2 * Copyright (c) 1999, 2007, 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 /* 26 * COMPONENT_NAME: idl.toJava 27 * 28 * ORIGINS: 27 29 * 30 * Licensed Materials - Property of IBM 31 * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999 32 * RMI-IIOP v1.0 33 * 34 */ 35 36 package com.sun.tools.corba.se.idl.toJavaPortable; 37 38 // NOTES: 39 // -09/23/98 <klr> Ported -td option to change output directory 40 // -09/23/98 <klr> Ported -m option to generate make dependencies 41 // -F46082.51<daz> Transferred -m, -mmin, mall, -mdepend options to com.sun.tools.corba.se.idl.toJava 42 // since these are IBM-specific (see f46838); cleaned-out dead code. 43 // -D57482 <klr> Added method setDefaultEmitter so could be overridden. 44 // -F60858.1<daz> Set corba level to 2.3. 45 46 import java.util.Enumeration; 47 import java.util.Hashtable; 48 import java.util.Properties; 49 import java.util.Vector; 50 import java.io.File; 51 52 import com.sun.tools.corba.se.idl.InvalidArgument; 53 54 /** 55 * 56 **/ 57 public class Arguments extends com.sun.tools.corba.se.idl.Arguments 58 { 59 /** 60 * Public, zero-argument constructor. 61 **/ Arguments()62 public Arguments () 63 { 64 super (); 65 corbaLevel = 2.4f; 66 } // ctor 67 68 /** 69 * 70 **/ parseOtherArgs(String[] args, Properties properties)71 protected void parseOtherArgs (String[] args, 72 Properties properties) throws InvalidArgument 73 { 74 String skeletonPattern = null ; 75 String tiePattern = null ; 76 77 // Get package prefixes from user's properties file. 78 packages.put ("CORBA", "org.omg"); // klr - always needed 79 packageFromProps (properties); 80 81 // Now get package prefixes from command line (along with other args). 82 // This order has the effect of making command line packages 83 // supercede any idl.config file packages. 84 try 85 { 86 Vector unknownArgs = new Vector (); 87 88 // Process command line parameters 89 for (int i = 0; i < args.length; ++i) 90 { 91 String lcArg = args[i].toLowerCase (); 92 93 if (lcArg.charAt (0) != '-' && lcArg.charAt (0) != '/') 94 throw new InvalidArgument (args[i]); 95 if (lcArg.charAt (0) == '-' ) { 96 lcArg = lcArg.substring (1); 97 } 98 99 // Proxy options; default is -fclient. 100 if (lcArg.startsWith ("f")) 101 { 102 // If the command line had '-f client', make it '-fclient' 103 if (lcArg.equals ("f")) 104 lcArg = 'f' + args[++i].toLowerCase (); 105 106 // Determine whether to emit bindings for client, server or both; and 107 // whether to emit delegate-style (TIE) rather than derived-style 108 // skeletons, which are the default. 109 110 if (lcArg.equals ("fclient")) 111 { 112 emit = ((emit == Server || emit == All) ? All : Client); 113 } 114 else if (lcArg.equals ("fserver")) 115 { 116 emit = ((emit == Client || emit == All) ? All : Server); 117 TIEServer = false; 118 } 119 else if (lcArg.equals ("fall")) 120 { 121 emit = All; 122 TIEServer = false; 123 //Should be removed and incorporated in the clause below 124 // POAServer = true; 125 } 126 else if (lcArg.equals ("fservertie")) 127 { 128 emit = ((emit == Client || emit == All) ? All : Server); 129 TIEServer = true; 130 } 131 else if (lcArg.equals ("falltie")) 132 { 133 emit = All; 134 TIEServer = true; 135 } 136 else 137 i = collectUnknownArg (args, i, unknownArgs); 138 } 139 else if (lcArg.equals ("pkgtranslate")) 140 { 141 if (i + 2 >= args.length) 142 throw new InvalidArgument( args[i] ) ; 143 144 String orig = args[++i] ; 145 String trans = args[++i] ; 146 checkPackageNameValid( orig ) ; 147 checkPackageNameValid( trans ) ; 148 if (orig.equals( "org" ) || orig.startsWith( "org.omg" )) 149 throw new InvalidArgument( args[i] ) ; 150 orig = orig.replace( '.', '/' ) ; 151 trans = trans.replace( '.', '/' ) ; 152 packageTranslation.put( orig, trans ) ; 153 } 154 // Package prefix 155 else if (lcArg.equals ("pkgprefix")) 156 { 157 if (i + 2 >= args.length) 158 throw new InvalidArgument (args[i]); 159 160 String type = args[++i]; 161 String pkg = args[++i]; 162 checkPackageNameValid( type ) ; 163 checkPackageNameValid( pkg ) ; 164 packages.put (type, pkg); 165 } 166 // Target directory 167 else if (lcArg.equals ("td")) // <f46838.4> 168 { 169 if (i + 1 >= args.length) 170 throw new InvalidArgument (args[i]); 171 String trgtDir = args[++i]; 172 if (trgtDir.charAt (0) == '-') 173 throw new InvalidArgument (args[i - 1]); 174 else 175 { 176 targetDir = trgtDir.replace ('/', File.separatorChar); 177 if (targetDir.charAt (targetDir.length () - 1) != File.separatorChar) 178 targetDir = targetDir + File.separatorChar; 179 } 180 } 181 // Separator 182 else if (lcArg.equals ("sep")) 183 { 184 if (i + 1 >= args.length) 185 throw new InvalidArgument (args[i]); 186 separator = args[++i]; 187 } 188 // POA flag ? 189 else if (lcArg.equals ("oldimplbase")){ 190 POAServer = false; 191 } 192 else if (lcArg.equals("skeletonname")){ 193 if (i + 1 >= args.length) 194 throw new InvalidArgument (args[i]); 195 skeletonPattern = args[++i]; 196 } 197 else if (lcArg.equals("tiename")){ 198 if (i + 1 >= args.length) 199 throw new InvalidArgument (args[i]); 200 tiePattern = args[++i]; 201 } 202 else if (lcArg.equals("localoptimization")) { 203 LocalOptimization = true; 204 } 205 else i = collectUnknownArg (args, i, unknownArgs); 206 } 207 208 // Encountered unknown arguments? 209 if (unknownArgs.size () > 0) 210 { 211 String [] otherArgs = new String [unknownArgs.size ()]; 212 unknownArgs.copyInto (otherArgs); 213 // Throws InvalidArgument by default 214 super.parseOtherArgs (otherArgs, properties); 215 } 216 217 setDefaultEmitter(); // d57482 <klr> 218 setNameModifiers( skeletonPattern, tiePattern ) ; 219 } 220 catch (ArrayIndexOutOfBoundsException e) 221 { 222 // If there is any array indexing problem, it is probably 223 // because the qualifier on the last argument is missing. 224 // Report that this last argument is invalid. 225 throw new InvalidArgument (args[args.length - 1]); 226 } 227 } // parseOtherArgs 228 229 /** 230 * 231 **/ collectUnknownArg(String[] args, int i, Vector unknownArgs)232 protected int collectUnknownArg (String[] args, int i, Vector unknownArgs) 233 { 234 unknownArgs.addElement (args [i]); 235 ++i; 236 while (i < args.length && args[i].charAt (0) != '-' && args[i].charAt (0) != '/') 237 unknownArgs.addElement (args[i++]); 238 return --i; 239 } // collectUnknownArg 240 241 /** 242 * 243 **/ 244 // XXX Either generalize this facility or remove it completely. packageFromProps(Properties props)245 protected void packageFromProps (Properties props) throws InvalidArgument 246 { 247 Enumeration propsEnum = props.propertyNames (); 248 while (propsEnum.hasMoreElements ()) 249 { 250 String prop = (String)propsEnum.nextElement (); 251 if (prop.startsWith ("PkgPrefix.")) 252 { 253 String type = prop.substring (10); 254 String pkg = props.getProperty (prop); 255 checkPackageNameValid( pkg ) ; 256 checkPackageNameValid( type ) ; 257 packages.put (type, pkg); 258 } 259 } 260 } // packageFromProps 261 262 /** 263 * d57482 <klr> method added so default emitter check could be overriden. 264 **/ setDefaultEmitter()265 protected void setDefaultEmitter () { 266 // If the flag -fclient was not found, assume it. 267 if (emit == None) emit = Client; 268 } 269 setNameModifiers( String skeletonPattern, String tiePattern )270 protected void setNameModifiers( String skeletonPattern, 271 String tiePattern ) { 272 if (emit>Client) { 273 String tp ; 274 String sp ; 275 276 if (skeletonPattern != null) 277 sp = skeletonPattern ; 278 else if (POAServer) 279 sp = "%POA" ; 280 else 281 sp = "_%ImplBase" ; 282 283 if (tiePattern != null) 284 tp = tiePattern ; 285 else if (POAServer) 286 tp = "%POATie" ; 287 else 288 tp = "%_Tie" ; 289 290 skeletonNameModifier = new NameModifierImpl( sp ) ; 291 tieNameModifier = new NameModifierImpl( tp ) ; 292 } 293 } 294 295 /** 296 * 297 **/ checkPackageNameValid(String name)298 private void checkPackageNameValid (String name) throws InvalidArgument 299 { 300 if (name.charAt (0) == '.') 301 throw new InvalidArgument (name); 302 for (int i = 0; i < name.length ();++i) 303 if (name.charAt (i) == '.') 304 { 305 if (i == name.length () - 1 || !Character.isJavaIdentifierStart (name.charAt (++i))) 306 throw new InvalidArgument (name); 307 } 308 else if (!Character.isJavaIdentifierPart (name.charAt (i))) 309 throw new InvalidArgument (name); 310 } // validatePackageName 311 312 // <46082.03><46838> Modified access restrictions from protected to public. 313 314 // This is a hash table whose keys are top-level typenames and 315 // whose values are the package prefixes to those types. 316 // For instance, <"CORBA", "org.omg"> is a possible entry. 317 public Hashtable packages = new Hashtable (); 318 319 public String separator = null; 320 321 public static final int 322 None = 0, 323 Client = 1, 324 Server = 2, 325 All = 3; 326 public int emit = None; 327 public boolean TIEServer = false; 328 public boolean POAServer = true; 329 // By default we do not generate Locally Optimized stub because of an 330 // unresolved PI problem. We will generate only if -localOptimization flag 331 // is passed 332 public boolean LocalOptimization = false; 333 public NameModifier skeletonNameModifier = null ; 334 public NameModifier tieNameModifier = null ; 335 336 // Key is original package name; value is translated package name. 337 // Note that this translation happens AFTER prefixes are added in the 338 // packages table. 339 public Hashtable packageTranslation = new Hashtable() ; 340 341 public String targetDir = ""; // <f46838.4> 342 } // class Arguments 343