1 /*
   2  * Copyright (c) 1999, 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.parser
  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;
  37 
  38 // NOTES:
  39 // -capitalize and parseTypeModifier should probably be in the
  40 //  generators package.
  41 // -D58319<daz> Add version() method.
  42 // -D62023<daz> Add absDelta() method to support float computations.
  43 
  44 import java.io.DataInputStream;
  45 import java.io.File;
  46 import java.io.FileNotFoundException;
  47 import java.io.IOException;
  48 
  49 import java.util.Enumeration;
  50 import java.util.Hashtable;
  51 import java.util.Properties;
  52 import java.util.Vector;
  53 
  54 import com.sun.tools.corba.se.idl.som.cff.FileLocator;
  55 
  56 public class Util
  57 {
  58   // <d58319>
  59   /**
  60    * Fetch the version number of this build of the IDL Parser Framework
  61    * from the appropriate properties file.
  62    * @return the version number contained within the appropriate properties
  63    *  file, which indicates the build of this IDL Parser Framework.
  64    **/
  65   public static String getVersion ()
  66   {
  67     return getVersion ("com/sun/tools/corba/se/idl/idl.prp");
  68   } // getVersion
  69 
  70   /**
  71    * Fetch the version number of this build of the IDL Parser Framework.
  72    * This method may be called before or after the framework has been
  73    * initialized. If the framework is inititialized, the version information
  74    * is extracted from the message properties object; otherwise, it is extracted
  75    * from the indicated messages file.
  76    * @return the version number.
  77    **/
  78   public static String getVersion (String filename)
  79   {
  80     String version = "";
  81     if (messages == null)  // Use supplied file
  82     {
  83       Vector oldMsgFiles = msgFiles;
  84       if (filename == null || filename.equals (""))
  85         filename = "com/sun/tools/corba/se/idl/idl.prp";
  86       filename = filename.replace ('/', File.separatorChar);
  87       registerMessageFile (filename);
  88       version = getMessage ("Version.product", getMessage ("Version.number"));
  89       msgFiles = oldMsgFiles;
  90       messages = null;
  91     }
  92     else
  93     {
  94       version = getMessage ("Version.product", getMessage ("Version.number"));
  95     }
  96     return version;
  97   } // getVersion
  98 
  99   public static boolean isAttribute (String name, Hashtable symbolTable)
 100   {
 101     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 102     return entry == null ? false : entry instanceof AttributeEntry;
 103   } // isAttribute
 104 
 105   public static boolean isConst (String name, Hashtable symbolTable)
 106   {
 107     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 108     return entry == null ? false : entry instanceof ConstEntry;
 109   } // isConst
 110 
 111   public static boolean isEnum (String name, Hashtable symbolTable)
 112   {
 113     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 114     return entry == null ? false : entry instanceof EnumEntry;
 115   } // isEnum
 116 
 117   public static boolean isException (String name, Hashtable symbolTable)
 118   {
 119     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 120     return entry == null ? false : entry instanceof ExceptionEntry;
 121   } // isException
 122 
 123   public static boolean isInterface (String name, Hashtable symbolTable)
 124   {
 125     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 126     return entry == null ? false : entry instanceof InterfaceEntry;
 127   } // isInterface
 128 
 129   public static boolean isMethod (String name, Hashtable symbolTable)
 130   {
 131     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 132     return entry == null ? false : entry instanceof MethodEntry;
 133   } // isMethod
 134 
 135   public static boolean isModule (String name, Hashtable symbolTable)
 136   {
 137     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 138     return entry == null ? false : entry instanceof ModuleEntry;
 139   } // isModule
 140 
 141   public static boolean isParameter (String name, Hashtable symbolTable)
 142   {
 143     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 144     return entry == null ? false : entry instanceof ParameterEntry;
 145   } // isParameter
 146 
 147   public static boolean isPrimitive (String name, Hashtable symbolTable)
 148   {
 149     // Distinguish "string" because the name could be something like:
 150     // string(25 + 1)
 151     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 152     if (entry == null)
 153     {
 154       // If it is null then it may be of the form string(<exp>).
 155       // Don't just check for string because the name "string" may
 156       // have been overridden.
 157       int parenIndex = name.indexOf ('(');
 158       if (parenIndex >= 0)
 159         entry = (SymtabEntry)symbolTable.get (name.substring (0, parenIndex));
 160     }
 161     return entry == null ? false : entry instanceof PrimitiveEntry;
 162   } // isPrimitive
 163 
 164   public static boolean isSequence (String name, Hashtable symbolTable)
 165   {
 166     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 167     return entry == null ? false : entry instanceof SequenceEntry;
 168   } // isSequence
 169 
 170   public static boolean isStruct (String name, Hashtable symbolTable)
 171   {
 172     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 173     return entry == null ? false : entry instanceof StructEntry;
 174   } // isStruct
 175 
 176   public static boolean isString (String name, Hashtable symbolTable)
 177   {
 178     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 179     return entry == null ? false : entry instanceof StringEntry;
 180   } // isString
 181 
 182   public static boolean isTypedef (String name, Hashtable symbolTable)
 183   {
 184     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 185     return entry == null ? false : entry instanceof TypedefEntry;
 186   } // isTypedef
 187 
 188   public static boolean isUnion (String name, Hashtable symbolTable)
 189   {
 190     SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
 191     return entry == null ? false : entry instanceof UnionEntry;
 192   } // isUnion
 193 
 194   //////////////
 195   // Message-related methods
 196 
 197   public static String getMessage (String key)
 198   {
 199     if (messages == null)
 200       readMessages ();
 201     String message = messages.getProperty (key);
 202     if (message == null)
 203       message = getDefaultMessage (key);
 204     return message;
 205   } // getMessage
 206 
 207   public static String getMessage (String key, String fill)
 208   {
 209     if (messages == null)
 210       readMessages ();
 211     String message = messages.getProperty (key);
 212     if (message == null)
 213       message = getDefaultMessage (key);
 214     else
 215     {
 216       int index = message.indexOf ("%0");
 217       if (index >= 0)
 218         message = message.substring (0, index) + fill + message.substring (index + 2);
 219     }
 220     return message;
 221   } // getMessage
 222 
 223   public static String getMessage (String key, String[] fill)
 224   {
 225     if (messages == null)
 226       readMessages ();
 227     String message = messages.getProperty (key);
 228     if (message == null)
 229       message = getDefaultMessage (key);
 230     else
 231       for (int i = 0; i < fill.length; ++i)
 232       {
 233         int index = message.indexOf ("%" + i);
 234         if (index >= 0)
 235           message = message.substring (0, index) + fill[i] + message.substring (index + 2);
 236       }
 237     return message;
 238   } // getMessage
 239 
 240   private static String getDefaultMessage (String keyNotFound)
 241   {
 242     String message = messages.getProperty (defaultKey);
 243     int index = message.indexOf ("%0");
 244     if (index > 0)
 245       message = message.substring (0, index) + keyNotFound;
 246     return message;
 247   } // getDefaultMessage
 248 
 249   /*
 250   findFile is no longer used now that FileLocator has been provided
 251   by Larry Raper of the Shasta team.
 252 
 253   static File findFile (String name) throws FileNotFoundException
 254   {
 255     String classpath = System.getProperty ("java.class.path");
 256     String separator = System.getProperty ("path.separator");
 257     int end = -separator.length (); // so the first pass classpath == original classpath
 258     File file;
 259     do
 260     {
 261       classpath = classpath.substring (end + separator.length ());
 262       end = classpath.indexOf (separator);
 263       if (end < 0) end = classpath.length ();
 264       file = new File (classpath.substring (0, end) + File.separator + "com" + File.separator + "ibm" + File.separator + "idl" + File.separator + name);
 265     } while (!file.exists () && end != classpath.length ());
 266     if (!file.exists ()) throw new FileNotFoundException ();
 267     return file;
 268   } // findFile
 269   */
 270 
 271   private static void readMessages ()
 272   {
 273     messages = new Properties ();
 274     Enumeration fileList = msgFiles.elements ();
 275     DataInputStream stream;
 276     while (fileList.hasMoreElements ())
 277       try
 278       {
 279         stream = FileLocator.locateLocaleSpecificFileInClassPath ((String)fileList.nextElement ());
 280         messages.load (stream);
 281       }
 282       catch (IOException e)
 283       {
 284       }
 285     if (messages.size () == 0)
 286       messages.put (defaultKey, "Error reading Messages File.");
 287   } // readMessages
 288 
 289   /** Register a message file.  This file will be searched for
 290       in the CLASSPATH. */
 291   public static void registerMessageFile (String filename)
 292   {
 293     if (filename != null)
 294       if (messages == null)
 295         msgFiles.addElement (filename);
 296       else
 297         try
 298         {
 299           DataInputStream stream = FileLocator.locateLocaleSpecificFileInClassPath (filename);
 300           messages.load (stream);
 301         }
 302         catch (IOException e)
 303         {
 304         }
 305   } // registerMessageFile
 306 
 307   private static Properties messages   = null;
 308   private static String     defaultKey = "default";
 309   private static Vector     msgFiles = new Vector ();
 310   static
 311   {
 312     msgFiles.addElement ("com/sun/tools/corba/se/idl/idl.prp");
 313   }
 314 
 315   // Message-related methods
 316   ///////////////
 317 
 318   public static String capitalize (String lc)
 319   {
 320     String first = new String (lc.substring (0, 1));
 321     first = first.toUpperCase ();
 322     return first + lc.substring (1);
 323   } // capitalize
 324 
 325   ///////////////
 326   // General file methods
 327 
 328   /** Searches the current user directory and a list of directories for
 329       a given short file name and returns its absolute file specification.
 330       @return Absolute file name of a given short filename
 331       @throws FileNotFoundException The file does not exist in the
 332        current user or specified directories.
 333       @see java.io.File.getAbsolutePath */
 334   public static String getAbsolutePath (String filename, Vector includePaths) throws FileNotFoundException
 335   {
 336     String filepath = null;
 337     File file = new File (filename);
 338     if (file.canRead ())
 339       filepath = file.getAbsolutePath ();
 340     else
 341     {
 342       String fullname = null;
 343       Enumeration pathList = includePaths.elements ();
 344       while (!file.canRead () && pathList.hasMoreElements ())
 345       {
 346         fullname = (String)pathList.nextElement () + File.separatorChar + filename;
 347         file = new File (fullname);
 348       }
 349       if (file.canRead ())
 350         filepath = file.getPath ();
 351       else
 352         throw new FileNotFoundException (filename);
 353     }
 354     return filepath;
 355   } // getAbsolutePath
 356 
 357   // General file methods
 358   ///////////////
 359 
 360   ///////////////
 361   // Numeric computations
 362 
 363   // <d62023>
 364   /**
 365    * Compute the absolute value of the difference between two floating-point
 366    * numbers having single precision.
 367    * @return the absolute value of the difference between two floats.
 368    **/
 369   public static float absDelta (float f1, float f2)
 370   {
 371     double delta = f1 - f2;
 372     return (float)((delta < 0) ? delta * -1.0 : delta);
 373   } // absDelta
 374 
 375   // Numeric computations
 376   ///////////////
 377 
 378   static RepositoryID emptyID = new RepositoryID ();
 379 } // class Util