| /* |
| * Copyright (c) 1999, 2001, 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.toJava |
| * |
| * 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.toJavaPortable; |
| |
| // NOTES: |
| // -09/23/98 KLR Ported -m updates (F46838.1-3) |
| // -f46082.51<daz> Transferred makefile list generation (for ODE delta-builds, |
| // see f46838) to toJava; cleaned-out dead code. |
| // -D58319<daz> Display version info. for -version option. |
| // -D58951<daz> Modify to allow QuickTest to build. |
| // -D49526<daz> Remove "TypeCode" symbol from preParse(). |
| // -D58591<daz> Publicise _factories and compile for QuickTest. Need to revert |
| // t0 private and add accessor methods. |
| // -D59437<daz> Fill typename information for value boxes. |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.BufferedWriter; |
| import java.io.FileWriter; |
| import java.io.PrintWriter; |
| |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| import java.util.Vector; |
| |
| import com.sun.tools.corba.se.idl.GenFileStream; |
| import com.sun.tools.corba.se.idl.SymtabFactory; |
| import com.sun.tools.corba.se.idl.IncludeEntry; |
| import com.sun.tools.corba.se.idl.InterfaceEntry; |
| import com.sun.tools.corba.se.idl.InterfaceState; |
| import com.sun.tools.corba.se.idl.ModuleEntry; |
| import com.sun.tools.corba.se.idl.PrimitiveEntry; |
| import com.sun.tools.corba.se.idl.SequenceEntry; |
| import com.sun.tools.corba.se.idl.StructEntry; |
| import com.sun.tools.corba.se.idl.SymtabEntry; |
| import com.sun.tools.corba.se.idl.TypedefEntry; |
| import com.sun.tools.corba.se.idl.UnionBranch; |
| import com.sun.tools.corba.se.idl.UnionEntry; |
| import com.sun.tools.corba.se.idl.ValueEntry; |
| import com.sun.tools.corba.se.idl.ValueBoxEntry; |
| import com.sun.tools.corba.se.idl.InvalidArgument; |
| |
| /** |
| * Compiler usage: |
| * <br><br> |
| * |
| * java com.sun.tools.corba.se.idl.toJavaPortable.Compile [options] <idl file> |
| * <br><br> |
| * |
| * where <idl file> is the name of a file containing IDL definitions, |
| * and [options] is any combination of the options listed below. The options |
| * may appear in any order. |
| * <br><br> |
| * |
| * Options: |
| * <dl> |
| * <dt>-i <include path> |
| * <dd>By default, the current directory is scanned for included files. |
| * This option adds another directory. See also the note below. |
| * |
| * <dt>-d <symbol> |
| * <dd>This is equivalent to the following line in an IDL file: |
| * #define <symbol> |
| * |
| * <dt>-f<side> |
| * <dd>Defines what bindings to emit. <side> is one of client, server, all, |
| * serverTIE, allTIE. serverTIE and allTIE cause delegate model skeletons |
| * to be emitted. If this flag is not used, -fclient is assumed. |
| * allPOA has the same effect as all, except for generation POA type skeletons. |
| * |
| * <dt>-keep |
| * <dd>If a file to be generated already exists, do not overwrite it. By |
| * default it is overwritten. |
| * |
| * <dt>-sep <string> |
| * <dd>Only valid with -m. Replace the file separator character with |
| * <string> in the file names listed in the .u file. |
| * |
| * <dt>-emitAll |
| * <dd>Emit all types, including those found in #included files. |
| * |
| * <dt>-v |
| * <dd>Verbose mode. |
| * |
| * <dt>-pkgPrefix <type> <package> |
| * <dd>Whereever <type> is encountered, make sure it resides within |
| * <package> in all generated files. <type> is a fully |
| * qualified, java-style name. |
| * </dl> |
| * |
| * <B>Note:</B> If you have an include path or paths that you will always |
| * be using, it can get tedious putting these on the command with the -i |
| * option all the time. Instead, these can be placed into a config file |
| * called idl.config. This file must be in the CLASSPATH. The format of |
| * the includes line is: |
| * |
| * <pre> |
| * includes=<path1>;<path2>;...;<pathN> |
| * </pre> |
| * |
| * Note that the path separator character, here shown as a semicolon, |
| * is machine dependent. For instance, on Windows 95 this character |
| * is a semicolon, on UNIX it is a colon. |
| **/ |
| public class Compile extends com.sun.tools.corba.se.idl.Compile |
| { |
| /** |
| * |
| **/ |
| public static void main (String[] args) |
| { |
| compiler = new Compile (); |
| compiler.start (args); |
| } // main |
| |
| /** |
| * |
| **/ |
| public void start (String[] args) |
| { |
| try |
| { |
| // <f46082.51> Use generator-specific messages file. |
| //Util.registerMessageFile ("com/sun/corba/se/idl/toJavaPortable/toJava.prp"); |
| Util.registerMessageFile ("com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable.prp"); |
| init (args); |
| if (arguments.versionRequest) |
| displayVersion (); |
| else |
| { |
| preParse (); |
| Enumeration e = parse (); |
| if (e != null) |
| { |
| preEmit (e); |
| generate (); |
| // <f46082.03> Move ODE delta-build support to toJava |
| //if (((Arguments)arguments).genMakefileLists) |
| // generateMakefileLists (); |
| } |
| } |
| } |
| catch (InvalidArgument e) |
| { |
| System.err.println (e); |
| } |
| catch (IOException e) |
| { |
| System.err.println (e); |
| } |
| } // start |
| |
| /** |
| * |
| **/ |
| protected Compile () |
| { |
| factory = factories ().symtabFactory (); |
| } // ctor |
| |
| // <d58591> _factories was made public for QuickTest to operate correctly, |
| // but the code needs to be changed to this: |
| //private Factories _factories = null; |
| //protected com.sun.tools.corba.se.idl.Factories factories () |
| //{ |
| // if (_factories == null) |
| // _factories = new Factories (); |
| // return _factories; |
| //} // factories |
| |
| public Factories _factories = new Factories (); // 58974 - changed for quicktest |
| protected com.sun.tools.corba.se.idl.Factories factories () |
| { |
| return _factories; |
| } // factories |
| |
| |
| ModuleEntry org; |
| ModuleEntry omg; |
| ModuleEntry corba; |
| InterfaceEntry object; |
| |
| /** |
| * |
| **/ |
| protected void preParse () |
| { |
| Util.setSymbolTable (symbolTable); |
| Util.setPackageTranslation( ((Arguments)arguments).packageTranslation ) ; |
| |
| // Need modules for the predefined objects |
| org = factory.moduleEntry (); |
| // <d61919> Suppress generation of this module. If the parser reopens it |
| // while parsing the main IDL source, any definitions appearing in the module |
| // -- and not appearing in a global-scope include file -- will be added to |
| // the emit list with emit=true for eventual generation. |
| org.emit (false); |
| org.name ("org"); |
| org.container (null); |
| omg = factory.moduleEntry (); |
| omg.emit (false); // <d61919> |
| omg.name ("omg"); |
| omg.module ("org"); |
| omg.container (org); |
| org.addContained (omg); |
| corba = factory.moduleEntry (); |
| corba.emit (false); // <d61919> |
| corba.name ("CORBA"); |
| corba.module ("org/omg"); |
| corba.container (omg); |
| omg.addContained (corba); |
| symbolTable.put ("org", org); |
| symbolTable.put ("org/omg", omg); |
| symbolTable.put ("org/omg/CORBA", corba); |
| |
| // Add CORBA::Object to symbol table. |
| object = (InterfaceEntry)symbolTable.get ("Object"); |
| object.module ("org/omg/CORBA"); |
| object.container (corba); |
| symbolTable.put ("org/omg/CORBA/Object", object); |
| |
| // <d61961> Add PIDL type (primitive) CORBA::TypeCode to symbol table. |
| PrimitiveEntry pEntry = factory.primitiveEntry (); |
| pEntry.name ("TypeCode"); |
| pEntry.module ("org/omg/CORBA"); |
| pEntry.container (corba); |
| symbolTable.put ("org/omg/CORBA/TypeCode", pEntry); |
| symbolTable.put ("CORBA/TypeCode", pEntry); // <d55699> |
| overrideNames.put ("CORBA/TypeCode", "org/omg/CORBA/TypeCode"); // <d55699> |
| overrideNames.put ("org/omg/CORBA/TypeCode", "CORBA/TypeCode"); // <d55699> |
| // <d49526> Allow user to specify types named "TypeCode" |
| //symbolTable.put ("TypeCode", pEntry); |
| //overrideNames.put ("TypeCode", "org/omg/CORBA/TypeCode"); |
| |
| // CORBA::Principal is deprecated! |
| // <d61961> Add PIDL type (primitive) CORBA::Principal to symbol table. |
| pEntry = factory.primitiveEntry (); |
| pEntry.name ("Principal"); |
| pEntry.module ("org/omg/CORBA"); |
| pEntry.container (corba); |
| symbolTable.put ("org/omg/CORBA/Principle", pEntry); |
| symbolTable.put ("CORBA/Principal", pEntry); |
| overrideNames.put ("CORBA/Principal", "org/omg/CORBA/Principal"); |
| overrideNames.put ("org/omg/CORBA/Principal", "CORBA/Principal"); |
| |
| // <d61961> Add PIDL type (interface) CORBA::Current to symbol table. |
| //InterfaceEntry iEntry = factory.interfaceEntry (); |
| //iEntry.name ("Current"); |
| //iEntry.module ("org/omg/CORBA"); |
| //iEntry.container (corba); |
| //symbolTable.put ("org/omg/CORBA/Current", iEntry); |
| //symbolTable.put ("CORBA/Current", iEntry); |
| //overrideNames.put ("CORBA/Current", "org/omg/CORBA/Current"); |
| //overrideNames.put ("org/omg/CORBA/Current", "CORBA/Current"); |
| |
| overrideNames.put ("TRUE", "true"); |
| overrideNames.put ("FALSE", "false"); |
| //overrideNames.put ("any", "org/omg/CORBA/Any"); |
| |
| // Add CORBA module to symbol table |
| symbolTable.put ("CORBA", corba); // 55699 |
| overrideNames.put ("CORBA", "org/omg/CORBA"); // <d55699> |
| overrideNames.put ("org/omg/CORBA", "CORBA"); // <d55699> |
| } // preParse |
| |
| |
| protected void preEmit (Enumeration emitList) |
| { |
| typedefInfo = SymtabEntry.getVariableKey (); |
| Hashtable tempST = (Hashtable)symbolTable.clone (); |
| |
| for (Enumeration e = tempST.elements (); e.hasMoreElements ();) |
| { |
| SymtabEntry element = (SymtabEntry)e.nextElement (); |
| |
| // Any other symbolTable processing? |
| preEmitSTElement (element); |
| } |
| |
| // Do this processing AFTER any other processing to get the |
| // correct names. |
| Enumeration elements = symbolTable.elements (); |
| while (elements.hasMoreElements ()) |
| { |
| // Find all TypedefEntry's and fill in the SymtabEntry.info |
| // field with it's real type , including [][]... with const |
| // exprs. |
| SymtabEntry element = (SymtabEntry)elements.nextElement (); |
| if (element instanceof TypedefEntry || element instanceof SequenceEntry) |
| Util.fillInfo (element); |
| |
| // <d59437> Members of constructed types may now be value boxes, and value |
| // boxes may contain types that are directly defined rather than typedef-ed |
| // (e.g., "valuetype vb sequence <long, 5>;"). If member resolves to a value |
| // box, then check and fillInfo() for value box and its content type BEFORE |
| // doing fillInfo() on member; otherwise, could get an exception. There's |
| // code in fillInfo() that performs this check, so it does not appear here. |
| |
| else if (element instanceof StructEntry) |
| { |
| Enumeration members = ((StructEntry)element).members ().elements (); |
| while (members.hasMoreElements ()) |
| Util.fillInfo ((SymtabEntry)members.nextElement ()); |
| } |
| else if (element instanceof InterfaceEntry && ((InterfaceEntry)element).state () != null) |
| { |
| Enumeration members = ((InterfaceEntry)element).state ().elements (); |
| while (members.hasMoreElements ()) |
| Util.fillInfo (((InterfaceState)members.nextElement ()).entry); |
| } |
| else if (element instanceof UnionEntry) |
| { |
| Enumeration branches = ((UnionEntry)element).branches ().elements (); |
| while (branches.hasMoreElements ()) |
| Util.fillInfo (((UnionBranch)branches.nextElement ()).typedef); |
| } |
| |
| // For each type that is at the top level that is NOT a module |
| // or IncludeEntry, add it to the imports list. If there are |
| // types within modules which refer to these, their types must |
| // be explicitly stated in an import statement. |
| if (element.module ().equals ("") && !(element instanceof ModuleEntry || element instanceof IncludeEntry || element instanceof PrimitiveEntry)) |
| importTypes.addElement (element); |
| } |
| |
| while (emitList.hasMoreElements ()) |
| { |
| SymtabEntry entry = (SymtabEntry)emitList.nextElement (); |
| |
| // Any other emitList processing: |
| preEmitELElement (entry); |
| } |
| } // preEmit |
| |
| /** |
| * This method is called by preEmit once for each symbol table entry. |
| * It can be called by extenders. |
| **/ |
| protected void preEmitSTElement (SymtabEntry entry) |
| { |
| // If the -package argument was used, search the packages list |
| // for the given type name and prepend the package to it. |
| Hashtable packages = ((Arguments)arguments).packages; |
| if (packages.size () > 0) |
| { |
| String substr = (String)packages.get (entry.fullName ()); |
| if (substr != null) |
| { |
| String pkg = null; |
| ModuleEntry mod = null; |
| ModuleEntry prev = null; |
| while (substr != null) |
| { |
| int dot = substr.indexOf ('.'); |
| if (dot < 0) |
| { |
| pkg = substr; |
| substr = null; |
| } |
| else |
| { |
| pkg = substr.substring (0, dot); |
| substr = substr.substring (dot + 1); |
| } |
| |
| String fullName = prev == null ? pkg : prev.fullName () + '/' + pkg; |
| mod = (ModuleEntry)symbolTable.get (fullName); |
| if (mod == null) |
| { |
| mod = factory.moduleEntry (); |
| mod.name (pkg); |
| mod.container (prev); |
| if (prev != null) mod.module (prev.fullName ()); |
| symbolTable.put (pkg, mod); |
| } |
| prev = mod; |
| } |
| entry.module (mod.fullName ()); |
| entry.container (mod); |
| } |
| } |
| } // preEmitSTElement |
| |
| /** |
| * This method is called by preEmit once for each emitList entry. |
| * It can be called by extenders. |
| **/ |
| protected void preEmitELElement (SymtabEntry entry) |
| { |
| } // preEmitELElement |
| |
| public Vector importTypes = new Vector (); |
| public SymtabFactory factory; |
| public static int typedefInfo; |
| public Hashtable list = new Hashtable (); |
| public static Compile compiler = null; // <d58591> |
| } // class Compile |