blob: 4cd1a31a9bb42e9d0330d6159910ad7f2b5b6082 [file] [log] [blame]
/*
* 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