src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Arguments.java

Mon, 04 May 2009 18:40:45 -0700

author
tbell
date
Mon, 04 May 2009 18:40:45 -0700
changeset 72
e149090eb21a
parent 1
55540e827aef
child 158
91006f157c46
permissions
-rw-r--r--

6529590: flaw in com.sun.corba.se.impl.presentation.rmi.IDLNameTranslatorImpl
Reviewed-by: darcy

     1 /*
     2  * Copyright 1999-2007 Sun Microsystems, Inc.  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.  Sun designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
    23  * have any 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  */
    36 package com.sun.tools.corba.se.idl.toJavaPortable;
    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.
    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;
    52 import com.sun.tools.corba.se.idl.InvalidArgument;
    54 /**
    55  *
    56  **/
    57 public class Arguments extends com.sun.tools.corba.se.idl.Arguments
    58 {
    59   /**
    60    * Public, zero-argument constructor.
    61    **/
    62   public Arguments ()
    63   {
    64     super ();
    65     corbaLevel = 2.4f;
    66   } // ctor
    68   /**
    69    *
    70    **/
    71   protected void parseOtherArgs (String[] args,
    72     Properties properties) throws InvalidArgument
    73   {
    74     String skeletonPattern = null ;
    75     String tiePattern = null ;
    77     // Get package prefixes from user's properties file.
    78     packages.put ("CORBA", "org.omg"); // klr - always needed
    79     packageFromProps (properties);
    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 ();
    88       // Process command line parameters
    89       for (int i = 0; i < args.length; ++i)
    90       {
    91         String lcArg = args[i].toLowerCase ();
    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         }
    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 ();
   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.
   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] ) ;
   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]);
   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       }
   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       }
   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
   229   /**
   230    *
   231    **/
   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
   241   /**
   242    *
   243    **/
   244   // XXX Either generalize this facility or remove it completely.
   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
   262   /**
   263    * d57482 <klr> method added so default emitter check could be overriden.
   264    **/
   265   protected void setDefaultEmitter () {
   266       // If the flag -fclient was not found, assume it.
   267       if (emit == None) emit = Client;
   268   }
   270   protected void setNameModifiers( String skeletonPattern,
   271     String tiePattern ) {
   272     if (emit>Client) {
   273         String tp ;
   274         String sp ;
   276         if (skeletonPattern != null)
   277             sp = skeletonPattern ;
   278         else if (POAServer)
   279             sp = "%POA" ;
   280         else
   281             sp = "_%ImplBase" ;
   283         if (tiePattern != null)
   284             tp = tiePattern ;
   285         else if (POAServer)
   286             tp = "%POATie" ;
   287         else
   288             tp = "%_Tie" ;
   290         skeletonNameModifier = new NameModifierImpl( sp ) ;
   291         tieNameModifier = new NameModifierImpl( tp ) ;
   292     }
   293   }
   295   /**
   296    *
   297    **/
   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
   312   // <46082.03><46838> Modified access restrictions from protected to public.
   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 ();
   319   public    String separator        = null;
   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 ;
   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() ;
   341   public String    targetDir        = "";     // <f46838.4>
   342 } // class Arguments

mercurial