View Javadoc
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