/* * 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 Transferred makefile list generation (for ODE delta-builds, // see f46838) to toJava; cleaned-out dead code. // -D58319 Display version info. for -version option. // -D58951 Modify to allow QuickTest to build. // -D49526 Remove "TypeCode" symbol from preParse(). // -D58591 Publicise _factories and compile for QuickTest. Need to revert // t0 private and add accessor methods. // -D59437 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: *

* * java com.sun.tools.corba.se.idl.toJavaPortable.Compile [options] <idl file> *

* * 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. *

* * Options: *
*
{@code -i } *
By default, the current directory is scanned for included files. * This option adds another directory. See also the note below. * *
{@code -d } *
This is equivalent to the following line in an IDL file: * {@code #define } * *
{@code -f } *
Defines what bindings to emit. {@code } 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. * *
{@code -keep} *
If a file to be generated already exists, do not overwrite it. By * default it is overwritten. * *
{@code -sep } *
Only valid with -m. Replace the file separator character with * {@code } in the file names listed in the .u file. * *
{@code -emitAll} *
Emit all types, including those found in #included files. * *
{@code -v} *
Verbose mode. * *
{@code -pkgPrefix } *
Whereever {@code } is encountered, make sure it resides within * {@code } in all generated files. {@code } is a fully * qualified, java-style name. *
* * Note: 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: * *
{@code
 * includes=;;...;
 * }
* * 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 { // 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 (); // 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 // _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 (); // 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); // omg.name ("omg"); omg.module ("org"); omg.container (org); org.addContained (omg); corba = factory.moduleEntry (); corba.emit (false); // 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); // 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); // overrideNames.put ("CORBA/TypeCode", "org/omg/CORBA/TypeCode"); // overrideNames.put ("org/omg/CORBA/TypeCode", "CORBA/TypeCode"); // // Allow user to specify types named "TypeCode" //symbolTable.put ("TypeCode", pEntry); //overrideNames.put ("TypeCode", "org/omg/CORBA/TypeCode"); // CORBA::Principal is deprecated! // 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"); // 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"); // overrideNames.put ("org/omg/CORBA", "CORBA"); // } // 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); // 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 ;"). 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; // } // class Compile