/* * 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: // -The ctor should really throw an exception, but then it must have a // throws clause. How much of a ripple effect is this? // -F46082.51<daz> Remove -stateful feature. // -D60929 <klr> Update for RTF2.4 changes // -D61056 <klr> Use Util.helperName // -D62014 <klr> Move const definitions from signature to operations interf. // -D62310 <klr> Fix declaration of interfaces extending abstract intf. // -D62023 <klr> Move const definitions back from operations to signature. 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.ConstEntry; import com.sun.tools.corba.se.idl.InterfaceEntry; import com.sun.tools.corba.se.idl.InterfaceState; import com.sun.tools.corba.se.idl.MethodEntry; import com.sun.tools.corba.se.idl.PrimitiveEntry; import com.sun.tools.corba.se.idl.SequenceEntry; import com.sun.tools.corba.se.idl.StringEntry; import com.sun.tools.corba.se.idl.SymtabEntry; import com.sun.tools.corba.se.idl.TypedefEntry; /** * **/ public class InterfaceGen implements com.sun.tools.corba.se.idl.InterfaceGen, JavaGenerator { /** * Public zero-argument constructor. **/ public InterfaceGen () { //emit = ((Arguments)Compile.compiler.arguments).emit; //factories = (Factories)Compile.compiler.factories (); } // ctor /** * Generate the interface and all the files associated with it. * Provides general algorithm for binding generation: * 1.) Initialize symbol table and symbol table entry members, common to all generators. * 2.) Generate the skeleton if required by calling generateSkeletn () * 3.) Generate the holder by calling generateHolder () * 4.) Generate the helper by calling generateHelper () * 5.) Generate the stub if required by calling generateStub () * 6.) Generate the interface by calling generateInterface () **/ public void generate (Hashtable symbolTable, InterfaceEntry i, PrintWriter stream) { if (!isPseudo(i)) { this.symbolTable = symbolTable; this.i = i; init (); // for sun_local pragma, just generate the signature and operations interfaces // for sun_localservant pragma, generate the Local Stubs, and Skel, should not // have _invoke defined. // for local (is_local()) case, generate only Helpers and Holder, where they // have been modified to throw appropriate exceptions for read and write, and // narrow is modified to not invoke _is_a if (! (i.isLocalSignature())) { // generate the stubs and skeletons for non-local interfaces if (! (i.isLocal())) { // for local servant case just generate the skeleton, but // for others generate the stubs also generateSkeleton (); // _REVISIT_, Whenever there is time restructure the code to // encapsulate stub and skeleton generation. // If the option is -fallTie then generate the Tie class first // and then generate the ImplBase class to make the generation // complete for the Hierarchy. Arguments theArguments = (Arguments)Compile.compiler.arguments; if( (theArguments.TIEServer == true ) &&(theArguments.emit == theArguments.All ) ) { theArguments.TIEServer = false; // Generate the ImplBase class generateSkeleton (); // Revert in case file contains multiple interfaces theArguments.TIEServer = true; } generateStub (); } generateHolder (); generateHelper (); } intfType = SIGNATURE; generateInterface (); intfType = OPERATIONS; generateInterface (); intfType = 0; } } // generate /** * Initialize members unique to this generator. **/ protected void init () { emit = ((Arguments)Compile.compiler.arguments).emit; factories = (Factories)Compile.compiler.factories (); } // init /** * Generate a Skeleton when the user does not want just the client-side code. **/ protected void generateSkeleton () { // <f46082.51> Remove -stateful feature. // The Skeleton is generated only when the user doesn't want // JUST the client code OR when the interface is stateful //if (emit != Arguments.Client || i.state () != null) // factories.skeleton ().generate (symbolTable, i); if (emit != Arguments.Client) factories.skeleton ().generate (symbolTable, i); } // generateSkeleton /** * Generate a Stub when the user does not want just the server-side code. **/ protected void generateStub () { // <klr> According to Simon on 10/28/98, we should generate stubs for // abstract interfaces too. if (emit != Arguments.Server /* && !i.isAbstract () */) factories.stub ().generate (symbolTable, i); } // generateStub /** * Generate a Helper when the user does not want just the server-side code. **/ protected void generateHelper () { if (emit != Arguments.Server) factories.helper ().generate (symbolTable, i); } // generateHelper /** * Generate a Holder when the user does not want just the server-side code. **/ protected void generateHolder () { if (emit != Arguments.Server) factories.holder ().generate (symbolTable, i); } // generateHolder /** * Generate the interface. Provides general algorithm for binding generation: * 1.) Initialize members unique to this generator. - init () * 2.) Open print stream - openStream () * 3.) Write class heading (package, prologue, class statement, open curly - writeHeading () * 4.) Write class body (member data and methods) - write*Body () * 5.) Write class closing (close curly) - writeClosing () * 6.) Close the print stream - closeStream () * * For CORBA 2.3, interfaces are mapped to Operations and Signature * interfaces. The Operations interface contains the method definitions. * The Signature interface extends the Operations interface and adds * CORBA::Object. <klr> **/ protected void generateInterface () { init (); openStream (); if (stream == null) return; writeHeading (); if (intfType == OPERATIONS) writeOperationsBody (); if (intfType == SIGNATURE) writeSignatureBody (); writeClosing (); closeStream (); } // generateInterface /** * **/ protected void openStream () { if (i.isAbstract () || intfType == SIGNATURE) stream = Util.stream (i, ".java"); else if (intfType == OPERATIONS) stream = Util.stream (i, "Operations.java"); } // openStream /** * **/ protected void writeHeading () { Util.writePackage (stream, i, Util.TypeFile); Util.writeProlog (stream, ((GenFileStream)stream).name ()); // Transfer interface comment to target <31jul1997>. if (i.comment () != null) i.comment ().generate ("", stream); String className = i.name (); // if (((Arguments)Compile.compiler.arguments).TIEServer) // { // // For the delegate model, don't make interface a subclass of CORBA.Object // stream.print ("public interface " + className); // boolean firstTime = true; // for (int ii = 0; ii < i.derivedFrom ().size (); ++ii) // { // SymtabEntry parent = (SymtabEntry)i.derivedFrom ().elementAt (ii); // if (!parent.fullName ().equals ("org/omg/CORBA/Object")) // { // if (firstTime) // { // firstTime = false; // stream.print (" extends "); // } // else // stream.print (", "); // stream.print (Util.javaName (parent)); // } // } // if (i.derivedFrom ().size () > 0) // stream.print (", "); // stream.print ("org.omg.CORBA.portable.IDLEntity "); // } // // else // { if (intfType == SIGNATURE) writeSignatureHeading (); else if (intfType == OPERATIONS) writeOperationsHeading (); // } stream.println (); stream.println ('{'); } // writeHeading /** * **/ protected void writeSignatureHeading () { String className = i.name (); stream.print ("public interface " + className + " extends " + className + "Operations, "); boolean firstTime = true; boolean hasNonAbstractParent = false; // <d62310-klr> for (int k = 0; k < i.derivedFrom ().size (); ++k) { if (firstTime) firstTime = false; else stream.print (", "); InterfaceEntry parent = (InterfaceEntry)i.derivedFrom ().elementAt (k); stream.print (Util.javaName (parent)); if (! parent.isAbstract ()) // <d62310-klr> hasNonAbstractParent = true; // <d62310-klr> } // <d62310-klr> - begin // If this interface extends only abstract interfaces, // it should extend both org.omg.CORBA.Object and IDLEntity. if (!hasNonAbstractParent) { stream.print (", org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity "); } else { // <d62310-klr> - end // extends IDLEntity if there's only one default parent - CORBA.Object if (i.derivedFrom ().size () == 1) stream.print (", org.omg.CORBA.portable.IDLEntity "); } } // writeSignatureHeading /** * **/ protected void writeOperationsHeading () { stream.print ("public interface " + i.name ()); if ( !i.isAbstract ()) stream.print ("Operations "); else { // <d60929> - base abstract interfaces extend AbstractBase // changed to IDLEntity by SCN per latest spec... if (i.derivedFrom ().size () == 0) stream.print (" extends org.omg.CORBA.portable.IDLEntity"); } boolean firstTime = true; for (int k = 0; k < i.derivedFrom ().size (); ++k) { InterfaceEntry parent = (InterfaceEntry) i.derivedFrom ().elementAt (k); String parentName = Util.javaName (parent); // ignore the default parent - CORBA.Object if (parentName.equals ("org.omg.CORBA.Object")) continue; if (firstTime) { firstTime = false; stream.print (" extends "); } else stream.print (", "); // Don't append suffix Operations to the parents of abstract interface // or to the abstract parents of regular interface if (parent.isAbstract () || i.isAbstract ()) stream.print (parentName); else stream.print (parentName + "Operations"); } } // writeOperationsHeading /** * **/ protected void writeOperationsBody () { // Generate everything but constants Enumeration e = i.contained ().elements (); while (e.hasMoreElements ()) { SymtabEntry contained = (SymtabEntry)e.nextElement (); if (contained instanceof MethodEntry) { MethodEntry element = (MethodEntry)contained; ((MethodGen)element.generator ()).interfaceMethod (symbolTable, element, stream); } else if ( !(contained instanceof ConstEntry)) contained.generate (symbolTable, stream); } } // writeOperationsBody /** * **/ protected void writeSignatureBody () { // Generate only constants Enumeration e = i.contained ().elements (); while (e.hasMoreElements ()) { SymtabEntry contained = (SymtabEntry)e.nextElement (); if (contained instanceof ConstEntry) contained.generate (symbolTable, stream); } } // writeSignatureBody /** * **/ protected void writeClosing () { String intfName = i.name (); if ( !i.isAbstract () && intfType == OPERATIONS) intfName = intfName + "Operations"; stream.println ("} // interface " + intfName); } // writeClosing /** * **/ protected void closeStream () { stream.close (); } // closeStream /////////////// // From JavaGenerator // <f46082.51> Remove -stateful feature. /* public int helperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.state () != null && i.state ().size () > 0) index = structHelperType (index, indent, tcoffsets, name, entry, stream); else { tcoffsets.set (entry); if (entry.fullName ().equals ("org/omg/CORBA/Object")) stream.println (indent + name + " = org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_objref);"); else stream.println (indent + name // <54697> //+ " = org.omg.CORBA.ORB.init ().create_interface_tc (_id, " + " = org.omg.CORBA.ORB.init ().create_interface_tc (" + Util.helperName (i, true) + ".id (), " // <d61056> + '\"' + Util.stripLeadingUnderscores (entry.name ()) + "\");"); } return index; } // helperType */ public int helperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; tcoffsets.set (entry); if (entry.fullName ().equals ("org/omg/CORBA/Object")) stream.println (indent + name + " = org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_objref);"); else stream.println (indent + name // <54697> //+ " = org.omg.CORBA.ORB.init ().create_interface_tc (_id, " + " = org.omg.CORBA.ORB.init ().create_interface_tc (" + Util.helperName (i, true) + ".id (), " // <d61056> + '\"' + Util.stripLeadingUnderscores (entry.name ()) + "\");"); return index; } // helperType public int type (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) { stream.println (indent + name + " = " + Util.helperName (entry, true) + ".type ();"); // <d61056> return index; } // type // <f46082.51> Remove -stateful feature. /* public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.state () != null) structHelperRead (entryName, i, stream); else { if (i.isAbstract ()) stream.println (" return narrow (((org.omg.CORBA_2_3.portable.InputStream)istream).read_abstract_interface (_" + i.name () + "Stub.class));"); // <d60929> else stream.println (" return narrow (istream.read_Object (_" + i.name () + "Stub.class));"); } } // helperRead */ public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.isAbstract ()) stream.println (" return narrow (((org.omg.CORBA_2_3.portable.InputStream)istream).read_abstract_interface (_" + i.name () + "Stub.class));"); // <d60929> else stream.println (" return narrow (istream.read_Object (_" + i.name () + "Stub.class));"); } // helperRead // <f46082.51> Remove -stateful feature. /* public void helperWrite (SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.state () != null) structHelperWrite (entry, stream); else write (0, " ", "value", entry, stream); } // helperWrite */ public void helperWrite (SymtabEntry entry, PrintWriter stream) { write (0, " ", "value", entry, stream); } // helperWrite // <f46082.51> Remove -stateful feature. /* public int read (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.state () != null) index = structRead (index, indent, name, i, stream); else { if (entry.fullName ().equals ("org/omg/CORBA/Object")) stream.println (indent + name + " = istream.read_Object (_" + i.name () + "Stub.class);"); else stream.println (indent + name + " = " + Util.helperName (entry, false) + ".narrow (istream.read_Object (_" + i.name () + "Stub.class));"); // <d61056> } return index; } // read */ public int read (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (entry.fullName ().equals ("org/omg/CORBA/Object")) stream.println (indent + name + " = istream.read_Object (_" + i.name () + "Stub.class);"); else stream.println (indent + name + " = " + Util.helperName (entry, false) + ".narrow (istream.read_Object (_" + i.name () + "Stub.class));"); // <d61056> return index; } // read // <f46082.51> Remove -stateful feature. /* public int write (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.state () != null) index = structWrite (index, indent, name, entry, stream); else { if (i.isAbstract ()) stream.println (indent + "((org.omg.CORBA_2_3.portable.OutputStream)ostream).write_abstract_interface ((java.lang.Object) " + name + ");"); // <d60929> else stream.println (indent + "ostream.write_Object ((org.omg.CORBA.Object) " + name + ");"); } return index; } // write */ public int write (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) { InterfaceEntry i = (InterfaceEntry)entry; if (i.isAbstract ()) stream.println (indent + "((org.omg.CORBA_2_3.portable.OutputStream)ostream).write_abstract_interface ((java.lang.Object) " + name + ");"); // <d60929> else stream.println (indent + "ostream.write_Object ((org.omg.CORBA.Object) " + name + ");"); return index; } // write // <f46082.51> Remove -stateful feature. /* // These methods are cobbled from StructGen. Stateful interfaces // are sent across the wire as if they were structs, with the first // element being a string - the Java name of the class. public int structHelperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) { TCOffsets innerOffsets = new TCOffsets (); innerOffsets.set (entry); int offsetForStruct = innerOffsets.currentOffset (); InterfaceEntry i = (InterfaceEntry)entry; String membersName = "_members" + index++; Vector state = i.state (); stream.println (indent + "org.omg.CORBA.StructMember[] " + membersName + " = new org.omg.CORBA.StructMember [" + (state.size () + 1) + "];"); String tcOfMembers = "_tcOf" + membersName; stream.println (indent + "org.omg.CORBA.TypeCode " + tcOfMembers + ';'); // The name string is the first element of the struct String memberName = "_name"; StringEntry stringEntry = Compile.compiler.factory.stringEntry (); index = ((JavaGenerator)stringEntry.generator ()).helperType (index, indent, innerOffsets, tcOfMembers, stringEntry, stream); stream.println (indent + membersName + "[0] = new org.omg.CORBA.StructMember ("); stream.println (indent + " \"" + memberName + "\","); stream.println (indent + " " + tcOfMembers + ','); stream.println (indent + " null);"); int offsetSoFar = innerOffsets.currentOffset (); innerOffsets = new TCOffsets (); innerOffsets.set (entry); innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForStruct); for (int idx = 0; idx < state.size (); ++idx) { TypedefEntry member = ((InterfaceState)state.elementAt (idx)).entry; memberName = member.name (); index = ((JavaGenerator)member.generator ()).helperType (index, indent, innerOffsets, tcOfMembers, member, stream); stream.println (indent + membersName + '[' + (idx + 1) + "] = new org.omg.CORBA.StructMember ("); stream.println (indent + " \"" + memberName + "\","); stream.println (indent + " " + tcOfMembers + ','); stream.println (indent + " null);"); offsetSoFar = innerOffsets.currentOffset (); innerOffsets = new TCOffsets (); innerOffsets.set (entry); innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForStruct); } tcoffsets.bumpCurrentOffset (innerOffsets.currentOffset ()); stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_struct_tc (id (), \"" + entry.name () + "\", " + membersName + ");"); return index; } // structHelperType public void structHelperRead (String entryName, InterfaceEntry entry, PrintWriter stream) { String impl = implName ((InterfaceEntry)entry); stream.println (" " + Util.javaStatefulName (entry) + " value = null;"); structRead (0, " ", "value", entry, stream); stream.println (" return value;"); } // structHelperRead private String implName (InterfaceEntry entry) { String name; if (entry.container ().name ().equals ("")) name = '_' + entry.name () + "Impl"; else name = Util.containerFullName (entry.container ()) + "._" + entry.name () + "Impl"; return name.replace ('/', '.'); } // implName public int structRead (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream) { // The first element will be the name of the Java implementation class. String stringName = "_name" + index++; stream.println (indent + "String " + stringName + " = istream.read_string ();"); stream.println (indent + "try"); stream.println (indent + "{"); stream.println (indent + " " + name + " = (" + Util.javaStatefulName (entry) + ")com.sun.CORBA.iiop.ORB.getImpl (" + stringName + ".replace ('/', '.'));"); stream.println (indent + "}"); stream.println (indent + "catch (Exception e)"); stream.println (indent + "{"); stream.println (indent + " " + name + " = null;"); stream.println (indent + "}"); stream.println (indent + "if (" + name + " == null)"); stream.println (indent + " throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); stream.println (); stream.println (indent + "if (!" + stringName + ".equals (\"" + entry.fullName () + "\"))"); stream.println (indent + '{'); stream.println (indent + " Class _cls = " + name + ".getClass ();"); stream.println (indent + " boolean _found = false;"); stream.println (indent + " while (!_found && _cls != null)"); stream.println (indent + " {"); stream.println (indent + " Class[] interfaces = _cls.getInterfaces ();"); stream.println (indent + " for (int i = 0; i < interfaces.length; ++i)"); stream.println (indent + " if (interfaces[i].getName ().indexOf (\"State\") > 0)"); stream.println (indent + " {"); stream.println (indent + " _cls = interfaces[i];"); stream.println (indent + " _found = true;"); stream.println (indent + " break;"); stream.println (indent + " }"); stream.println (indent + " if (!_found)"); stream.println (indent + " _cls = _cls.getSuperclass ();"); stream.println (indent + " }"); stream.println (indent + " if (_cls == null)"); stream.println (indent + " throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); stream.println (); stream.println (indent + " String _className = _cls.getName ();"); stream.println (indent + " int _index = _className.lastIndexOf ('.');"); stream.println (indent + " String _helperName = _className.substring (0, _index + 1) + _className.substring (_index + 2, _className.length () - 5) + \"Helper\"; // 5 == \"State\".length"); stream.println (indent + " try"); stream.println (indent + " {"); stream.println (indent + " Class _helperClass = Class.forName (_helperName);"); stream.println (indent + " Class[] _formalParms = new Class [1];"); stream.println (indent + " _formalParms[0] = Class.forName (\"org.omg.CORBA.portable.InputStream\");"); stream.println (indent + " java.lang.reflect.Method _read = _helperClass.getMethod (\"read\", _formalParms);"); stream.println (indent + " Object[] _actualParms = new Object [1];"); stream.println (indent + " _actualParms[0] = istream;"); stream.println (indent + " " + name + " = (" + Util.javaStatefulName (entry) + ")_read.invoke (null, _actualParms);"); stream.println (indent + " }"); stream.println (indent + " catch (Exception e)"); stream.println (indent + " {"); stream.println (indent + " throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); stream.println (indent + " }"); stream.println (indent + '}'); // instantiate an implementation stream.println (indent + "else"); stream.println (indent + '{'); // Load the state readState (index, indent, name, (InterfaceEntry)entry, stream); stream.println (indent + '}'); return index; } // structRead private void readState (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream) { // First write the state from all parents Enumeration e = entry.derivedFrom ().elements (); while (e.hasMoreElements ()) { InterfaceEntry parent = (InterfaceEntry)e.nextElement (); if (parent.state () != null) { if (parent.state ().size () > 0) readState (index, indent, name, parent, stream); break; } } // Now write the state for the local entry e = entry.state ().elements (); while (e.hasMoreElements ()) { TypedefEntry member = ((InterfaceState)e.nextElement ()).entry; String tmpName = '_' + member.name () + "Tmp"; Util.writeInitializer (indent + " ", tmpName, "", member, stream); if (!member.arrayInfo ().isEmpty () || member.type () instanceof SequenceEntry || member.type () instanceof PrimitiveEntry || member.type () instanceof StringEntry) index = ((JavaGenerator)member.generator ()).read (index, indent + " ", tmpName, member, stream); else stream.println (indent + " " + tmpName + " = " + Util.helperName (member.type (), true) + ".read (istream);"); // <d61056> stream.println (indent + " " + name + '.' + member.name () + " (" + tmpName + ");"); } } // readState public void structHelperWrite (SymtabEntry entry, PrintWriter stream) { structWrite (0, " ", "value", entry, stream); } // structHelperWrite public int structWrite (int index, String indent, String name, SymtabEntry entry, PrintWriter stream) { // The first element of the struct must be the name of the real interface. stream.println (indent + "Class _cls = " + name + ".getClass ();"); stream.println (indent + "boolean _found = false;"); stream.println (indent + "while (!_found && _cls != null)"); stream.println (indent + "{"); stream.println (indent + " Class[] interfaces = _cls.getInterfaces ();"); stream.println (indent + " for (int i = 0; i < interfaces.length; ++i)"); stream.println (indent + " if (interfaces[i].getName ().indexOf (\"State\") > 0)"); stream.println (indent + " {"); stream.println (indent + " _cls = interfaces[i];"); stream.println (indent + " _found = true;"); stream.println (indent + " break;"); stream.println (indent + " }"); stream.println (indent + " if (!_found)"); stream.println (indent + " _cls = _cls.getSuperclass ();"); stream.println (indent + '}'); stream.println (); stream.println (indent + "if (_cls == null)"); stream.println (indent + " throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); stream.println (); stream.println (indent + "String _className = _cls.getName ();"); stream.println (indent + "int _index = _className.lastIndexOf ('.');"); stream.println (indent + "String _interfaceName = _className.substring (0, _index + 1) + _className.substring (_index + 2, _className.length () - 5); // 5 == \"State\".length"); stream.println (indent + "ostream.write_string (_interfaceName.replace ('.', '/'));"); // If _className != Util.javaName (entry), then call that class's helper class. stream.println (); stream.println (indent + "if (!_interfaceName.equals (\"" + Util.javaName (entry) + "\"))"); stream.println (indent + '{'); stream.println (indent + " try"); stream.println (indent + " {"); stream.println (indent + " Class _helperClass = Class.forName (_interfaceName + \"Helper\");"); stream.println (indent + " Class[] _formalParms = new Class [2];"); stream.println (indent + " _formalParms[0] = Class.forName (\"org.omg.CORBA.portable.OutputStream\");"); stream.println (indent + " _formalParms[1] = _cls;"); stream.println (indent + " java.lang.reflect.Method _write = _helperClass.getMethod (\"write\", _formalParms);"); stream.println (indent + " Object[] _actualParms = new Object [2];"); stream.println (indent + " _actualParms[0] = ostream;"); stream.println (indent + " _actualParms[1] = " + name + ';'); stream.println (indent + " _write.invoke (null, _actualParms);"); stream.println (indent + " }"); stream.println (indent + " catch (Exception e)"); stream.println (indent + " {"); stream.println (indent + " throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); stream.println (indent + " }"); stream.println (indent + '}'); stream.println (indent + "else"); stream.println (indent + '{'); writeState (index, indent, name, (InterfaceEntry)entry, stream); stream.println (indent + '}'); return index; } // structWrite private void writeState (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream) { // First write the state from all parents Enumeration e = entry.derivedFrom ().elements (); while (e.hasMoreElements ()) { InterfaceEntry parent = (InterfaceEntry)e.nextElement (); if (parent.state () != null) { if (parent.state ().size () > 0) writeState (index, indent, name, parent, stream); break; } } // Now write the state for the local entry Vector members = entry.state (); for (int i = 0; i < members.size (); ++i) { TypedefEntry member = ((InterfaceState)members.elementAt (i)).entry; if (!member.arrayInfo ().isEmpty () || member.type () instanceof SequenceEntry || member.type () instanceof PrimitiveEntry || member.type () instanceof StringEntry) index = ((JavaGenerator)member.generator ()).write (index, indent + " ", name + '.' + member.name () + "()", member, stream); else stream.println (indent + " " + Util.helperName (member.type (), true) + ".write (ostream, " + name + '.' + member.name () + " ());"); // <d61056> } } // writeState */ /** * @return true if the entry is for a CORBA pseudo-object. **/ private boolean isPseudo(InterfaceEntry i) { java.lang.String fullname = i.fullName(); if (fullname.equalsIgnoreCase("CORBA/TypeCode")) return true; if (fullname.equalsIgnoreCase("CORBA/Principal")) return true; if (fullname.equalsIgnoreCase("CORBA/ORB")) return true; if (fullname.equalsIgnoreCase("CORBA/Any")) return true; if (fullname.equalsIgnoreCase("CORBA/Context")) return true; if (fullname.equalsIgnoreCase("CORBA/ContextList")) return true; if (fullname.equalsIgnoreCase("CORBA/DynamicImplementation")) return true; if (fullname.equalsIgnoreCase("CORBA/Environment")) return true; if (fullname.equalsIgnoreCase("CORBA/ExceptionList")) return true; if (fullname.equalsIgnoreCase("CORBA/NVList")) return true; if (fullname.equalsIgnoreCase("CORBA/NamedValue")) return true; if (fullname.equalsIgnoreCase("CORBA/Request")) return true; if (fullname.equalsIgnoreCase("CORBA/ServerRequest")) return true; if (fullname.equalsIgnoreCase("CORBA/UserException")) return true; return false; } // From JavaGenerator /////////////// protected int emit = 0; protected Factories factories = null; protected Hashtable symbolTable = null; protected InterfaceEntry i = null; protected PrintWriter stream = null; // <f46082.03, f46838.1/.2/.3> Modify access to protected. protected static final int SIGNATURE = 1; protected static final int OPERATIONS = 2; protected int intfType = 0; } // class InterfaceGen