duke@1: /* skoppar@227: * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@158: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@158: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@158: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@158: * or visit www.oracle.com if you need additional information or have any ohair@158: * questions. duke@1: */ duke@1: /* duke@1: * COMPONENT_NAME: idl.toJava duke@1: * duke@1: * ORIGINS: 27 duke@1: * duke@1: * Licensed Materials - Property of IBM duke@1: * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999 duke@1: * RMI-IIOP v1.0 duke@1: * duke@1: */ duke@1: duke@1: package com.sun.tools.corba.se.idl.toJavaPortable; duke@1: duke@1: // NOTES: duke@1: duke@1: import java.io.File; duke@1: import java.io.PrintWriter; duke@1: import java.util.Enumeration; duke@1: import java.util.Hashtable; duke@1: import java.util.Vector; duke@1: duke@1: import com.sun.tools.corba.se.idl.AttributeEntry; duke@1: import com.sun.tools.corba.se.idl.GenFileStream; duke@1: import com.sun.tools.corba.se.idl.InterfaceEntry; duke@1: import com.sun.tools.corba.se.idl.MethodEntry; duke@1: import com.sun.tools.corba.se.idl.SymtabEntry; duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: public class Stub implements AuxGen duke@1: { duke@1: /** duke@1: * Public zero-argument constructor. duke@1: **/ duke@1: public Stub () duke@1: { duke@1: } // ctor duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: public void generate (Hashtable symbolTable, SymtabEntry entry) duke@1: { duke@1: this.symbolTable = symbolTable; duke@1: this.i = (InterfaceEntry)entry; duke@1: this.localStub = i.isLocalServant(); duke@1: this.isAbstract = i.isAbstract( ); duke@1: init (); duke@1: duke@1: openStream (); duke@1: if (stream == null) duke@1: return; duke@1: writeHeading (); duke@1: writeBody (); duke@1: writeClosing (); duke@1: closeStream (); duke@1: } // generate duke@1: duke@1: /** duke@1: * Initialize unique members of this generator. duke@1: **/ duke@1: protected void init () duke@1: { duke@1: classSuffix = "Stub"; duke@1: } // init duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void openStream () duke@1: { duke@1: String name = '_' + i.name () + classSuffix; duke@1: String pkg = Util.containerFullName (i.container ()); duke@1: if (pkg != null && !pkg.equals ("")) duke@1: { duke@1: Util.mkdir (pkg); duke@1: name = pkg + '/' + name; duke@1: } duke@1: stream = Util.getStream (name.replace ('/', File.separatorChar) + ".java", i); duke@1: } // openStream duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeHeading () duke@1: { duke@1: Util.writePackage (stream, i, Util.StubFile); duke@1: Util.writeProlog (stream, ((GenFileStream)stream).name ()); duke@1: duke@1: // Transfer interface comment to target <31jul1997>. duke@1: if (i.comment () != null) duke@1: i.comment ().generate ("", stream); duke@1: duke@1: writeClassDeclaration (); duke@1: stream.println ('{'); duke@1: } // writeHeading duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeClassDeclaration () duke@1: { duke@1: stream.print ("public class _" + i.name () + classSuffix + " extends org.omg.CORBA.portable.ObjectImpl"); duke@1: stream.println (" implements " + Util.javaName (i)); duke@1: } // writeClassDeclaration duke@1: duke@1: /** duke@1: * Steps done within writeBody include: duke@1: * 1.) makeCtors (); duke@1: * 2.) buildMethodList (); duke@1: * 3.) makeMethods (); duke@1: * 4.) makeCORBAObjectMethods () duke@1: **/ duke@1: protected void writeBody () duke@1: { duke@1: writeCtors (); duke@1: buildMethodList (); duke@1: writeMethods (); duke@1: writeCORBAObjectMethods (); duke@1: writeSerializationMethods (); duke@1: } // writeBody duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeClosing () duke@1: { duke@1: stream.println ("} // class _" + i.name () + classSuffix); duke@1: } // writeClosing duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void closeStream () duke@1: { duke@1: stream.close (); duke@1: } // closeStream duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeCtors () duke@1: { duke@1: String name = i.name (); duke@1: duke@1: /*** the constructors are not generated as per ptc/00-01-08.pdf duke@1: * since these are non-standard APIs, and same can be accomplished duke@1: * programatically, we need to comment this out, in order to duke@1: * be able to generate standard stubs duke@1: */ duke@1: duke@1: /************* duke@1: stream.println (" // Constructors"); duke@1: stream.println (" // NOTE: If the default constructor is used, the"); duke@1: stream.println (" // object is useless until _set_delegate (...)"); duke@1: stream.println (" // is called."); duke@1: stream.println (" public _" + name + classSuffix + " ()"); duke@1: stream.println (" {"); duke@1: stream.println (" super ();"); duke@1: stream.println (" }"); duke@1: stream.println (); duke@1: stream.println (" public _" + name + classSuffix + " (org.omg.CORBA.portable.Delegate delegate)"); duke@1: stream.println (" {"); duke@1: stream.println (" super ();"); duke@1: stream.println (" _set_delegate (delegate);"); duke@1: stream.println (" }"); duke@1: ***************/ duke@1: // This is confusing since we have localOptimization flag as well. duke@1: // We have left this code because JCK team filed a P1 bug for changing duke@1: // _opsClass to $opsClass. Will clean it up in Tiger duke@1: // _REVISIT_ (Hemanth 03/05/2002) duke@1: if (localStub) { duke@1: stream.println (" final public static java.lang.Class _opsClass = " + duke@1: name + "Operations.class;"); duke@1: stream.println (); duke@1: } duke@1: stream.println (); duke@1: } // writeCtors duke@1: duke@1: /** duke@1: * Build a list of all of the methods, keeping out duplicates. duke@1: **/ duke@1: protected void buildMethodList () duke@1: { duke@1: // Start from scratch duke@1: methodList = new Vector (); duke@1: duke@1: buildMethodList (i); duke@1: } // buildMethodList duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: private void buildMethodList (InterfaceEntry entry) duke@1: { duke@1: // Add the local methods duke@1: Enumeration locals = entry.methods ().elements (); duke@1: while (locals.hasMoreElements ()) duke@1: addMethod ((MethodEntry)locals.nextElement ()); duke@1: duke@1: // Add the inherited methods duke@1: Enumeration parents = entry.derivedFrom ().elements (); duke@1: while (parents.hasMoreElements ()) duke@1: { duke@1: InterfaceEntry parent = (InterfaceEntry)parents.nextElement (); duke@1: if (!parent.name ().equals ("Object")) duke@1: buildMethodList (parent); duke@1: } duke@1: } // buildMethodList duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: private void addMethod (MethodEntry method) duke@1: { duke@1: if (!methodList.contains (method)) duke@1: methodList.addElement (method); duke@1: } // addMethod duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeMethods () duke@1: { duke@1: // Count the methods, attributes which are not readonly are duke@1: // counted as 2 methods. duke@1: int count = methodList.size (); duke@1: Enumeration e = methodList.elements (); duke@1: while (e.hasMoreElements ()) duke@1: { duke@1: Object method = e.nextElement (); duke@1: if (method instanceof AttributeEntry && !((AttributeEntry)method).readOnly ()) duke@1: ++count; duke@1: } duke@1: duke@1: if( (((Arguments)Compile.compiler.arguments).LocalOptimization ) duke@1: && !isAbstract ) duke@1: { duke@1: stream.println( " final public static java.lang.Class _opsClass =" ); duke@1: stream.println( " " + this.i.name() + "Operations.class;" ); duke@1: } duke@1: duke@1: // Write the methods duke@1: int realI = 0; duke@1: for (int i = 0; i < methodList.size (); ++i) duke@1: { duke@1: MethodEntry method = (MethodEntry)methodList.elementAt (i); duke@1: if (!localStub) { duke@1: ((MethodGen)method.generator ()).stub (this.i.name(), isAbstract, symbolTable, method, stream, realI); duke@1: } else { duke@1: ((MethodGen)method.generator ()).localstub (symbolTable, method, stream, realI, this.i); duke@1: } duke@1: if (method instanceof AttributeEntry && !((AttributeEntry)method).readOnly ()) duke@1: realI += 2; duke@1: else duke@1: ++realI; duke@1: } duke@1: } // writeMethods duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: private void buildIDList (InterfaceEntry entry, Vector list) duke@1: { duke@1: if (!entry.fullName ().equals ("org/omg/CORBA/Object")) duke@1: { duke@1: String id = Util.stripLeadingUnderscoresFromID (entry.repositoryID ().ID ()); duke@1: if (!list.contains (id)) duke@1: list.addElement (id); duke@1: Enumeration e = entry.derivedFrom ().elements (); duke@1: while (e.hasMoreElements ()) duke@1: buildIDList ((InterfaceEntry)e.nextElement (), list); duke@1: } duke@1: } // buildIDList duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: private void writeIDs () duke@1: { duke@1: Vector list = new Vector (); duke@1: buildIDList (i, list); duke@1: Enumeration e = list.elements (); duke@1: boolean first = true; duke@1: while (e.hasMoreElements ()) duke@1: { duke@1: if (first) duke@1: first = false; duke@1: else duke@1: stream.println (", "); duke@1: stream.print (" \"" + (String)e.nextElement () + '"'); duke@1: } duke@1: } // writeIDs duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeCORBAObjectMethods () duke@1: { duke@1: stream.println (" // Type-specific CORBA::Object operations"); duke@1: stream.println (" private static String[] __ids = {"); duke@1: writeIDs (); duke@1: stream.println ("};"); duke@1: stream.println (); duke@1: stream.println (" public String[] _ids ()"); duke@1: stream.println (" {"); duke@1: stream.println (" return (String[])__ids.clone ();"); duke@1: stream.println (" }"); duke@1: stream.println (); duke@1: } // writeCORBAObjectMethods duke@1: duke@1: /** duke@1: * duke@1: **/ duke@1: protected void writeSerializationMethods () duke@1: { duke@1: stream.println (" private void readObject (java.io.ObjectInputStream s) throws java.io.IOException"); duke@1: stream.println (" {"); duke@1: stream.println (" String str = s.readUTF ();"); duke@1: stream.println (" String[] args = null;"); duke@1: stream.println (" java.util.Properties props = null;"); skoppar@227: stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);"); skoppar@227: stream.println (" try {"); skoppar@227: stream.println (" org.omg.CORBA.Object obj = orb.string_to_object (str);"); skoppar@236: stream.println (" org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate ();"); duke@1: stream.println (" _set_delegate (delegate);"); skoppar@227: stream.println (" } finally {"); skoppar@227: stream.println (" orb.destroy() ;"); skoppar@227: stream.println (" }"); duke@1: stream.println (" }"); duke@1: stream.println (); duke@1: stream.println (" private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException"); duke@1: stream.println (" {"); duke@1: stream.println (" String[] args = null;"); duke@1: stream.println (" java.util.Properties props = null;"); skoppar@227: stream.println (" org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);"); skoppar@227: stream.println (" try {"); skoppar@227: stream.println (" String str = orb.object_to_string (this);"); duke@1: stream.println (" s.writeUTF (str);"); skoppar@227: stream.println (" } finally {"); skoppar@227: stream.println (" orb.destroy() ;"); skoppar@227: stream.println (" }"); duke@1: stream.println (" }"); duke@1: } duke@1: duke@1: protected Hashtable symbolTable = null; duke@1: protected InterfaceEntry i = null; duke@1: protected PrintWriter stream = null; duke@1: duke@1: // Unique to this generator duke@1: protected Vector methodList = null; duke@1: protected String classSuffix = ""; duke@1: protected boolean localStub = false; duke@1: private boolean isAbstract = false; duke@1: } // class Stub