| /* |
| * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| /* |
| * COMPONENT_NAME: idl.parser |
| * |
| * ORIGINS: 27 |
| * |
| * Licensed Materials - Property of IBM |
| * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999 |
| * RMI-IIOP v1.0 |
| * |
| */ |
| |
| package com.sun.tools.corba.se.idl; |
| |
| // NOTES: |
| // -capitalize and parseTypeModifier should probably be in the |
| // generators package. |
| // -D58319<daz> Add version() method. |
| // -D62023<daz> Add absDelta() method to support float computations. |
| |
| import java.io.DataInputStream; |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| import java.util.Properties; |
| import java.util.Vector; |
| |
| import com.sun.tools.corba.se.idl.som.cff.FileLocator; |
| |
| public class Util |
| { |
| // <d58319> |
| /** |
| * Fetch the version number of this build of the IDL Parser Framework |
| * from the appropriate properties file. |
| * @return the version number contained within the appropriate properties |
| * file, which indicates the build of this IDL Parser Framework. |
| **/ |
| public static String getVersion () |
| { |
| return getVersion ("com/sun/tools/corba/se/idl/idl.prp"); |
| } // getVersion |
| |
| /** |
| * Fetch the version number of this build of the IDL Parser Framework. |
| * This method may be called before or after the framework has been |
| * initialized. If the framework is inititialized, the version information |
| * is extracted from the message properties object; otherwise, it is extracted |
| * from the indicated messages file. |
| * @return the version number. |
| **/ |
| public static String getVersion (String filename) |
| { |
| String version = ""; |
| if (messages == null) // Use supplied file |
| { |
| Vector oldMsgFiles = msgFiles; |
| if (filename == null || filename.equals ("")) |
| filename = "com/sun/tools/corba/se/idl/idl.prp"; |
| filename = filename.replace ('/', File.separatorChar); |
| registerMessageFile (filename); |
| version = getMessage ("Version.product", getMessage ("Version.number")); |
| msgFiles = oldMsgFiles; |
| messages = null; |
| } |
| else |
| { |
| version = getMessage ("Version.product", getMessage ("Version.number")); |
| } |
| return version; |
| } // getVersion |
| |
| public static boolean isAttribute (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof AttributeEntry; |
| } // isAttribute |
| |
| public static boolean isConst (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof ConstEntry; |
| } // isConst |
| |
| public static boolean isEnum (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof EnumEntry; |
| } // isEnum |
| |
| public static boolean isException (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof ExceptionEntry; |
| } // isException |
| |
| public static boolean isInterface (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof InterfaceEntry; |
| } // isInterface |
| |
| public static boolean isMethod (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof MethodEntry; |
| } // isMethod |
| |
| public static boolean isModule (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof ModuleEntry; |
| } // isModule |
| |
| public static boolean isParameter (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof ParameterEntry; |
| } // isParameter |
| |
| public static boolean isPrimitive (String name, Hashtable symbolTable) |
| { |
| // Distinguish "string" because the name could be something like: |
| // string(25 + 1) |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| if (entry == null) |
| { |
| // If it is null then it may be of the form string(<exp>). |
| // Don't just check for string because the name "string" may |
| // have been overridden. |
| int parenIndex = name.indexOf ('('); |
| if (parenIndex >= 0) |
| entry = (SymtabEntry)symbolTable.get (name.substring (0, parenIndex)); |
| } |
| return entry == null ? false : entry instanceof PrimitiveEntry; |
| } // isPrimitive |
| |
| public static boolean isSequence (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof SequenceEntry; |
| } // isSequence |
| |
| public static boolean isStruct (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof StructEntry; |
| } // isStruct |
| |
| public static boolean isString (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof StringEntry; |
| } // isString |
| |
| public static boolean isTypedef (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof TypedefEntry; |
| } // isTypedef |
| |
| public static boolean isUnion (String name, Hashtable symbolTable) |
| { |
| SymtabEntry entry = (SymtabEntry)symbolTable.get (name); |
| return entry == null ? false : entry instanceof UnionEntry; |
| } // isUnion |
| |
| ////////////// |
| // Message-related methods |
| |
| public static String getMessage (String key) |
| { |
| if (messages == null) |
| readMessages (); |
| String message = messages.getProperty (key); |
| if (message == null) |
| message = getDefaultMessage (key); |
| return message; |
| } // getMessage |
| |
| public static String getMessage (String key, String fill) |
| { |
| if (messages == null) |
| readMessages (); |
| String message = messages.getProperty (key); |
| if (message == null) |
| message = getDefaultMessage (key); |
| else |
| { |
| int index = message.indexOf ("%0"); |
| if (index >= 0) |
| message = message.substring (0, index) + fill + message.substring (index + 2); |
| } |
| return message; |
| } // getMessage |
| |
| public static String getMessage (String key, String[] fill) |
| { |
| if (messages == null) |
| readMessages (); |
| String message = messages.getProperty (key); |
| if (message == null) |
| message = getDefaultMessage (key); |
| else |
| for (int i = 0; i < fill.length; ++i) |
| { |
| int index = message.indexOf ("%" + i); |
| if (index >= 0) |
| message = message.substring (0, index) + fill[i] + message.substring (index + 2); |
| } |
| return message; |
| } // getMessage |
| |
| private static String getDefaultMessage (String keyNotFound) |
| { |
| String message = messages.getProperty (defaultKey); |
| int index = message.indexOf ("%0"); |
| if (index > 0) |
| message = message.substring (0, index) + keyNotFound; |
| return message; |
| } // getDefaultMessage |
| |
| /* |
| findFile is no longer used now that FileLocator has been provided |
| by Larry Raper of the Shasta team. |
| |
| static File findFile (String name) throws FileNotFoundException |
| { |
| String classpath = System.getProperty ("java.class.path"); |
| String separator = System.getProperty ("path.separator"); |
| int end = -separator.length (); // so the first pass classpath == original classpath |
| File file; |
| do |
| { |
| classpath = classpath.substring (end + separator.length ()); |
| end = classpath.indexOf (separator); |
| if (end < 0) end = classpath.length (); |
| file = new File (classpath.substring (0, end) + File.separator + "com" + File.separator + "ibm" + File.separator + "idl" + File.separator + name); |
| } while (!file.exists () && end != classpath.length ()); |
| if (!file.exists ()) throw new FileNotFoundException (); |
| return file; |
| } // findFile |
| */ |
| |
| private static void readMessages () |
| { |
| messages = new Properties (); |
| Enumeration fileList = msgFiles.elements (); |
| DataInputStream stream; |
| while (fileList.hasMoreElements ()) |
| try |
| { |
| stream = FileLocator.locateLocaleSpecificFileInClassPath ((String)fileList.nextElement ()); |
| messages.load (stream); |
| } |
| catch (IOException e) |
| { |
| } |
| if (messages.size () == 0) |
| messages.put (defaultKey, "Error reading Messages File."); |
| } // readMessages |
| |
| /** Register a message file. This file will be searched for |
| in the CLASSPATH. */ |
| public static void registerMessageFile (String filename) |
| { |
| if (filename != null) |
| if (messages == null) |
| msgFiles.addElement (filename); |
| else |
| try |
| { |
| DataInputStream stream = FileLocator.locateLocaleSpecificFileInClassPath (filename); |
| messages.load (stream); |
| } |
| catch (IOException e) |
| { |
| } |
| } // registerMessageFile |
| |
| private static Properties messages = null; |
| private static String defaultKey = "default"; |
| private static Vector msgFiles = new Vector (); |
| static |
| { |
| msgFiles.addElement ("com/sun/tools/corba/se/idl/idl.prp"); |
| } |
| |
| // Message-related methods |
| /////////////// |
| |
| public static String capitalize (String lc) |
| { |
| String first = new String (lc.substring (0, 1)); |
| first = first.toUpperCase (); |
| return first + lc.substring (1); |
| } // capitalize |
| |
| /////////////// |
| // General file methods |
| |
| /** Searches the current user directory and a list of directories for |
| a given short file name and returns its absolute file specification. |
| @return Absolute file name of a given short filename |
| @throws FileNotFoundException The file does not exist in the |
| current user or specified directories. |
| @see java.io.File.getAbsolutePath */ |
| public static String getAbsolutePath (String filename, Vector includePaths) throws FileNotFoundException |
| { |
| String filepath = null; |
| File file = new File (filename); |
| if (file.canRead ()) |
| filepath = file.getAbsolutePath (); |
| else |
| { |
| String fullname = null; |
| Enumeration pathList = includePaths.elements (); |
| while (!file.canRead () && pathList.hasMoreElements ()) |
| { |
| fullname = (String)pathList.nextElement () + File.separatorChar + filename; |
| file = new File (fullname); |
| } |
| if (file.canRead ()) |
| filepath = file.getPath (); |
| else |
| throw new FileNotFoundException (filename); |
| } |
| return filepath; |
| } // getAbsolutePath |
| |
| // General file methods |
| /////////////// |
| |
| /////////////// |
| // Numeric computations |
| |
| // <d62023> |
| /** |
| * Compute the absolute value of the difference between two floating-point |
| * numbers having single precision. |
| * @return the absolute value of the difference between two floats. |
| **/ |
| public static float absDelta (float f1, float f2) |
| { |
| double delta = f1 - f2; |
| return (float)((delta < 0) ? delta * -1.0 : delta); |
| } // absDelta |
| |
| // Numeric computations |
| /////////////// |
| |
| static RepositoryID emptyID = new RepositoryID (); |
| } // class Util |