--- old/src/java.corba/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGen.java 2018-01-30 20:25:49.000000000 -0500 +++ /dev/null 2018-01-30 20:25:49.000000000 -0500 @@ -1,1091 +0,0 @@ -/* - * Copyright (c) 1999, 2002, 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: -// -After demarshalling an IOR, think about how to deal with the exceptions. -// -catching Exception throws a string which should be in a properties file. -// -30jul1997 Modified to write comment immediately preceding method signature. -// -07May1998 Modified to support RMI Portable Stub -// -26Aug1998 Modified to pass helper instance to read_Value. -// -F46082.51 Remove -stateful feature; javaStatefulName() obsolete. -// -D56554 Port bounded string checks from toJava to toJavaPortable -// -D58549 bounded string checks on in/inout parms throw BAD_PARAM -// -D57112 Valuetype initializers map to ctor, regardless of name, and -// "void _init(...)" methods now mapped correctly. -// -D59297 pass context parm when Remarshalling -// -D59560 call read/write_Context -// -D60929 Update for RTF2.4 changes -// -D61056 Use Util.helperName -// -D61650 Remove '\n' from generated strings; use println()'s. - -import java.io.PrintWriter; -import java.util.Enumeration; -import java.util.Hashtable; - -import com.sun.tools.corba.se.idl.EnumEntry; -import com.sun.tools.corba.se.idl.ExceptionEntry; -import com.sun.tools.corba.se.idl.InterfaceEntry; -import com.sun.tools.corba.se.idl.MethodEntry; -import com.sun.tools.corba.se.idl.ParameterEntry; -import com.sun.tools.corba.se.idl.PrimitiveEntry; -import com.sun.tools.corba.se.idl.StringEntry; -import com.sun.tools.corba.se.idl.SymtabEntry; -import com.sun.tools.corba.se.idl.SequenceEntry; -import com.sun.tools.corba.se.idl.ValueEntry; -import com.sun.tools.corba.se.idl.ValueBoxEntry; -import com.sun.tools.corba.se.idl.InterfaceState; -import com.sun.tools.corba.se.idl.TypedefEntry; -import com.sun.tools.corba.se.idl.AttributeEntry; - -import com.sun.tools.corba.se.idl.constExpr.Expression; - -/** - * - **/ -public class MethodGen implements com.sun.tools.corba.se.idl.MethodGen -{ - private static final String ONE_INDENT = " "; - private static final String TWO_INDENT = " "; - private static final String THREE_INDENT = " "; - private static final String FOUR_INDENT = " "; - private static final String FIVE_INDENT = " "; - // This is the length of _get_ and _set_ - private static final int ATTRIBUTE_METHOD_PREFIX_LENGTH = 5; - /** - * Public zero-argument constructor. - **/ - public MethodGen () - { - } // ctor - - /** - * Method generate() is not used in MethodGen. They are replaced by the - * more granular interfaceMethod, stub, skeleton, dispatchSkeleton. - **/ - public void generate (Hashtable symbolTable, MethodEntry m, PrintWriter stream) - { - } // generate - - /** - * - **/ - protected void interfaceMethod (Hashtable symbolTable, MethodEntry m, PrintWriter stream) - { - this.symbolTable = symbolTable; - this.m = m; - this.stream = stream; - if (m.comment () != null) - m.comment ().generate ("", stream); - stream.print (" "); - SymtabEntry container = (SymtabEntry)m.container (); - boolean isAbstract = false; - boolean valueContainer = false; - if (container instanceof ValueEntry) - { - isAbstract = ((ValueEntry)container).isAbstract (); - valueContainer = true; - } - if (valueContainer && !isAbstract) - stream.print ("public "); - writeMethodSignature (); - if (valueContainer && !isAbstract) - { - stream.println (); - stream.println (" {"); - stream.println (" }"); - stream.println (); - } - else - stream.println (";"); - } // interfaceMethod - - /** - * - **/ - protected void stub (String className, boolean isAbstract, - Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) - { - localOptimization = - ((Arguments)Compile.compiler.arguments).LocalOptimization; - this.isAbstract = isAbstract; - this.symbolTable = symbolTable; - this.m = m; - this.stream = stream; - this.methodIndex = index; - if (m.comment () != null) - m.comment ().generate (" ", stream); - stream.print (" public "); - writeMethodSignature (); - stream.println (); - stream.println (" {"); - writeStubBody ( className ); - stream.println (" } // " + m.name ()); - stream.println (); - } // stub - - /** - * - **/ - protected void localstub (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index, InterfaceEntry i) - { - this.symbolTable = symbolTable; - this.m = m; - this.stream = stream; - this.methodIndex = index; - if (m.comment () != null) - m.comment ().generate (" ", stream); - stream.print (" public "); - writeMethodSignature (); - stream.println (); - stream.println (" {"); - writeLocalStubBody (i); - stream.println (" } // " + m.name ()); - stream.println (); - } // stub - /** - * - **/ - protected void skeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) - { - this.symbolTable = symbolTable; - this.m = m; - this.stream = stream; - this.methodIndex = index; - if (m.comment () != null) - m.comment ().generate (" ", stream); - stream.print (" public "); - writeMethodSignature (); - stream.println (); - stream.println (" {"); - writeSkeletonBody (); - stream.println (" } // " + m.name ()); - } // skeleton - - /** - * - **/ - protected void dispatchSkeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) - { - this.symbolTable = symbolTable; - this.m = m; - this.stream = stream; - this.methodIndex = index; - if (m.comment () != null) - m.comment ().generate (" ", stream); - writeDispatchCall (); - } // dispatchSkeleton - - // - /** - * Determine whether method entry m is a valuetype initializer. - * @return true if is m is valuetype initializer, false otherwise. - **/ - protected boolean isValueInitializer () - { - MethodEntry currentInit = null; - if ((m.container () instanceof ValueEntry)) - { - Enumeration e = ((ValueEntry)m.container ()).initializers ().elements (); - while (currentInit != m && e.hasMoreElements ()) - currentInit = (MethodEntry)e.nextElement (); - } - return (currentInit == m) && (null != m); // True ==> yes, false ==> no. - } // isValueInitializer - - /** - * - **/ - protected void writeMethodSignature () - { - boolean isValueInitializer = isValueInitializer (); // - - // Step 0. Print the return type and name. - // A return type of null indicates the "void" return type. If m is a - // Valuetype intitializer, it has name "init" and a null return type, - // but it maps to a ctor. - // - //if (m.type () == null) - //{ - // if (m.name ().compareTo ("init") != 0) - // stream.print ("void"); - //} - if (m.type () == null) - { - if (!isValueInitializer) - stream.print ("void"); - } - else - { - // Remove -stateful feature; javaStatefulName() obsolete. - //stream.print (Util.javaStatefulName (m.type ())); - stream.print (Util.javaName (m.type ())); - } - // Value initializers map to constructors. - // If the value has an 'init' method with a return type, handle - // the method like other regular methods - //if (m.valueMethod () && m.name ().compareTo ("init") == 0 && - // m.type () == null) - if (isValueInitializer) - stream.print (' ' + m.container ().name () + " ("); - else - stream.print (' ' + m.name () + " ("); - - // Step 1. Print the parameter list. - boolean firstTime = true; - Enumeration e = m.parameters ().elements (); - while (e.hasMoreElements ()) - { - if (firstTime) - firstTime = false; - else - stream.print (", "); - ParameterEntry parm = (ParameterEntry)e.nextElement (); - - writeParmType (parm.type (), parm.passType ()); - - // Print parm name - stream.print (' ' + parm.name ()); - } - - // Step 2. Add the context parameter if necessary. - if (m.contexts ().size () > 0) - { - if (!firstTime) - stream.print (", "); - stream.print ("org.omg.CORBA.Context $context"); - } - - // Step 3. Print the throws clause (if necessary). - if (m.exceptions ().size () > 0) - { - stream.print (") throws "); - e = m.exceptions ().elements (); - firstTime = true; - while (e.hasMoreElements ()) - { - if (firstTime) - firstTime = false; - else - stream.print (", "); - stream.print (Util.javaName ((SymtabEntry)e.nextElement ())); - } - } - else - stream.print (')'); - } // writeMethodSignature - - /** - * - **/ - protected void writeParmType (SymtabEntry parm, int passType) - { - if (passType != ParameterEntry.In) - { - parm = Util.typeOf (parm); - stream.print (Util.holderName (parm)); - } - else // passType is `in' - // Remove -stateful feature; javaStatefulName() obsolete. - //stream.print (Util.javaStatefulName (parm)); - stream.print (Util.javaName (parm)); - } // writeParmType - - /** - * - **/ - protected void writeDispatchCall () - { - String indent = " "; - String fullMethodName = m.fullName (); - if (m instanceof AttributeEntry) - { - // determine the index at which the attribute name starts in the full name - int index = fullMethodName.lastIndexOf ('/') + 1; - if (m.type () == null) // if it's a modifier - fullMethodName = fullMethodName.substring (0, index) + "_set_" + m.name (); - else - fullMethodName = fullMethodName.substring (0, index) + "_get_" + m.name (); - } - stream.println (indent + "case " + methodIndex + ": // " + fullMethodName); - stream.println (indent + "{"); - indent = indent + " "; - if (m.exceptions ().size () > 0) - { - stream.println (indent + "try {"); - indent = indent + " "; - } - - // Step 1 Read arguments from the input stream - SymtabEntry mtype = Util.typeOf (m.type ()); - Enumeration parms = m.parameters ().elements (); - parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry) parms.nextElement (); - String name = parm.name (); - String anyName = '_' + name; - SymtabEntry type = parm.type (); - int passType = parm.passType (); - - if (passType == ParameterEntry.In) - Util.writeInitializer (indent, name, "", type, writeInputStreamRead ("in", type), stream); - - else // the parm is a holder - { - String holderName = Util.holderName (type); - stream.println (indent + holderName + ' ' + name + " = new " + holderName + " ();"); - if (passType == ParameterEntry.Inout) - { - if (type instanceof ValueBoxEntry) - { - ValueBoxEntry v = (ValueBoxEntry) type; - TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry; - SymtabEntry mType = member.type (); - if (mType instanceof PrimitiveEntry) - stream.println (indent + name + ".value = (" + writeInputStreamRead ("in", parm.type ()) + ").value;"); - else - stream.println (indent + name + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";"); - } - else - stream.println (indent + name + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";"); - } - } - } - - // Step 1a. Read the context parameter if necessary. - if (m.contexts ().size () > 0) - { - stream.println (indent + "org.omg.CORBA.Context $context = in.read_Context ();"); - } - - // Step 2 Load return if necessary - if (mtype != null) - Util.writeInitializer (indent, "$result", "", mtype, stream); - - // Step 3 Call the method with the list of parameters - writeMethodCall (indent); - - parms = m.parameters ().elements (); - boolean firstTime = true; - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - if (firstTime) - firstTime = false; - else - stream.print (", "); - stream.print (parm.name ()); - } - - // Step 3a. Add the context parameter if necessary. - if (m.contexts ().size () > 0) - { - if (!firstTime) - stream.print (", "); - stream.print ("$context"); - } - - stream.println (");"); - - //Step 3b. Create reply; - writeCreateReply (indent); - - // Step 4 Write method's result to the output stream - if (mtype != null) - { - writeOutputStreamWrite (indent, "out", "$result", mtype, stream); - } - - // Step 5 Write inout/out value to the output stream - parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - int passType = parm.passType (); - if (passType != ParameterEntry.In) - { - writeOutputStreamWrite (indent, "out", parm.name () + ".value", parm.type (), stream); - } - } - - // Step 6 Handle exception - if (m.exceptions ().size () > 0) - { - Enumeration exceptions = m.exceptions ().elements (); - while (exceptions.hasMoreElements ()) - { - indent = " "; - ExceptionEntry exc = (ExceptionEntry) exceptions.nextElement (); - String fullName = Util.javaQualifiedName (exc); - stream.println (indent + "} catch (" + fullName + " $ex) {"); - indent = indent + " "; - stream.println (indent + "out = $rh.createExceptionReply ();"); - stream.println (indent + Util.helperName (exc, true) + ".write (out, $ex);"); // - } - - indent = " "; - stream.println (indent + "}"); - } - - stream.println (" break;"); - stream.println (" }"); - stream.println (); - } // writeDispatchCall - - /** - * - **/ - protected void writeStubBody ( String className ) - { - // Step 1 Create a request - String methodName = Util.stripLeadingUnderscores (m.name ()); - if (m instanceof AttributeEntry) - { - if (m.type () == null) // if it's a modifier - methodName = "_set_" + methodName; - else - methodName = "_get_" + methodName; - } - if( localOptimization && !isAbstract ) { - stream.println (ONE_INDENT + "while(true) {" ); - stream.println(TWO_INDENT + "if(!this._is_local()) {" ); - } - stream.println(THREE_INDENT + - "org.omg.CORBA.portable.InputStream $in = null;"); - stream.println(THREE_INDENT + "try {"); - stream.println(FOUR_INDENT + "org.omg.CORBA.portable.OutputStream $out =" + - " _request (\"" + methodName + "\", " + !m.oneway() + ");"); - - // Step 1.b. Check string bounds - // begin in/inout string bounds check - Enumeration parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - SymtabEntry parmType = Util.typeOf (parm.type ()); - if (parmType instanceof StringEntry) - if ((parm.passType () == ParameterEntry.In) || - (parm.passType () == ParameterEntry.Inout)) - { - StringEntry string = (StringEntry)parmType; - if (string.maxSize () != null) - { - stream.print (THREE_INDENT + "if (" + parm.name ()); - if (parm.passType () == ParameterEntry.Inout) - stream.print (".value"); // get from holder - stream.print (" == null || " + parm.name ()); - if (parm.passType () == ParameterEntry.Inout) - stream.print (".value"); // get from holder - stream.println (".length () > (" + - Util.parseExpression (string.maxSize ()) + "))"); - stream.println (THREE_INDENT + - "throw new org.omg.CORBA.BAD_PARAM (0," + - " org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); - } - } - } - // end in/inout string bounds check - - // Step 2 Load the parameters into the outputStream - parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - if (parm.passType () == ParameterEntry.In) - writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name (), parm.type (), - stream); - else if (parm.passType () == ParameterEntry.Inout) - writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name () + ".value", - parm.type (), stream); - } - - // Step 2a. Write the context parameter if necessary. - if (m.contexts ().size () > 0) - { - stream.println(FOUR_INDENT + "org.omg.CORBA.ContextList $contextList =" + - "_orb ().create_context_list ();"); - - for (int cnt = 0; cnt < m.contexts ().size (); cnt++) - { - stream.println(FOUR_INDENT + - "$contextList.add (\"" + m.contexts (). elementAt (cnt) + "\");"); - } - stream.println(FOUR_INDENT + - "$out.write_Context ($context, $contextList);"); - } - - // Step 3 Invoke the method with the output stream - stream.println (FOUR_INDENT + "$in = _invoke ($out);"); - - SymtabEntry mtype = m.type (); - if (mtype != null) - Util.writeInitializer (FOUR_INDENT, "$result", "", mtype, - writeInputStreamRead ("$in", mtype), stream); - - // Step 4 Read the inout/out values - parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - if (parm.passType () != ParameterEntry.In) - { - if (parm.type () instanceof ValueBoxEntry) - { - ValueBoxEntry v = (ValueBoxEntry) parm.type (); - TypedefEntry member = - ((InterfaceState) v.state ().elementAt (0)).entry; - SymtabEntry mType = member.type (); - if (mType instanceof PrimitiveEntry) - stream.println(FOUR_INDENT + parm.name () + - ".value = (" + writeInputStreamRead ("$in", parm.type ()) + - ").value;"); - else - stream.println(FOUR_INDENT + parm.name () + - ".value = " + writeInputStreamRead ("$in", parm.type ()) +";"); - } - else - stream.println (FOUR_INDENT + parm.name () + ".value = " + - writeInputStreamRead ("$in", parm.type ()) + ";"); - } - } - // Step 4.b. Check string bounds - // begin out/inout/return string bounds check - parms = m.parameters ().elements (); - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - SymtabEntry parmType = Util.typeOf (parm.type ()); - if (parmType instanceof StringEntry) - if ((parm.passType () == ParameterEntry.Out) || - (parm.passType () == ParameterEntry.Inout)) - { - StringEntry string = (StringEntry)parmType; - if (string.maxSize () != null) - { - stream.print (FOUR_INDENT + "if (" + parm.name () + - ".value.length ()"); - stream.println (" > (" + - Util.parseExpression (string.maxSize ()) + "))"); - stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL(0,"+ - "org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); - } - } - } - if (mtype instanceof StringEntry) - { - StringEntry string = (StringEntry)mtype; - if (string.maxSize () != null) - { - stream.println(FOUR_INDENT + "if ($result.length () > (" + - Util.parseExpression (string.maxSize ()) + "))"); - stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (0," + - " org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); - } - } - // end out/inout/return string bounds check - - // Step 5 Handle return if necessary - if (mtype != null) { - stream.println(FOUR_INDENT + "return $result;"); - } else { - stream.println(FOUR_INDENT + "return;"); - } - - // Step 6 Handle exceptions - stream.println(THREE_INDENT + - "} catch (org.omg.CORBA.portable.ApplicationException " + "$ex) {"); - stream.println(FOUR_INDENT + "$in = $ex.getInputStream ();"); - stream.println(FOUR_INDENT + "String _id = $ex.getId ();"); - - if (m.exceptions ().size () > 0) - { - Enumeration exceptions = m.exceptions ().elements (); - boolean firstExc = true; - while (exceptions.hasMoreElements ()) - { - ExceptionEntry exc = (ExceptionEntry)exceptions.nextElement (); - if (firstExc) - { - stream.print(FOUR_INDENT + "if "); - firstExc = false; - } - else - stream.print(FOUR_INDENT + "else if "); - - stream.println( "(_id.equals (\"" + exc.repositoryID ().ID () + "\"))"); - stream.println (FIVE_INDENT + "throw " + - Util.helperName ((SymtabEntry)exc, false) + ".read ($in);"); - } - stream.println(FOUR_INDENT + "else"); - stream.println(FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);"); - } - else - stream.println(FOUR_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);"); - - stream.println(THREE_INDENT + - "} catch (org.omg.CORBA.portable.RemarshalException $rm) {"); - stream.print( FOUR_INDENT ); - if (m.type () != null) // not a void method - stream.print ("return "); - stream.print (m.name () + " ("); - { - // write parm names - boolean firstTime = true; - Enumeration e = m.parameters ().elements (); - while (e.hasMoreElements ()) - { - if (firstTime) - firstTime = false; - else - stream.print (", "); - ParameterEntry parm = (ParameterEntry)e.nextElement (); - stream.print (parm.name ()); - } - // Step 2. Add the context parameter if necessary. - if (m.contexts ().size () > 0) - { - if (!firstTime) - stream.print (", "); - stream.print ("$context"); - } - } - stream.println (TWO_INDENT + ");"); - stream.println (THREE_INDENT + "} finally {"); - stream.println (FOUR_INDENT + "_releaseReply ($in);"); - stream.println (THREE_INDENT + "}"); - if( localOptimization && !isAbstract ) { - stream.println (TWO_INDENT + "}"); - writeStubBodyForLocalInvocation( className, methodName ); - } - - } // writeStubBody - - - /** - * This method writes the else part of the stub method invocation to - * enable local invocation in case of collocation. - * NOTE: This will only be invoked from writeStubBody. - */ - private void writeStubBodyForLocalInvocation( String className, - String methodName ) - { - stream.println (TWO_INDENT + "else {" ); - stream.println (THREE_INDENT + - "org.omg.CORBA.portable.ServantObject _so ="); - stream.println (FOUR_INDENT + "_servant_preinvoke(\"" + methodName + - "\", _opsClass);" ); - stream.println(THREE_INDENT + "if (_so == null ) {"); - stream.println(FOUR_INDENT + "continue;" ); - stream.println(THREE_INDENT + "}"); - stream.println(THREE_INDENT + className + "Operations _self =" ); - stream.println(FOUR_INDENT + "(" + className + "Operations) _so.servant;"); - stream.println(THREE_INDENT + "try {" ); - Enumeration parms = m.parameters ().elements (); - if (m instanceof AttributeEntry) - { - // Local Method Name should drop _get_ or _set_ prefix for attribute - // entry - methodName = methodName.substring( ATTRIBUTE_METHOD_PREFIX_LENGTH ); - } - boolean voidReturnType = (this.m.type() == null); - if ( !voidReturnType ) { - stream.println (FOUR_INDENT + Util.javaName (this.m.type ()) + - " $result;"); - } - if( !isValueInitializer() ) { - if ( voidReturnType ) { - stream.print(FOUR_INDENT + "_self." + methodName + "( " ); - } else { - stream.print(FOUR_INDENT + "$result = _self." + - methodName + "( " ); - } - while (parms.hasMoreElements ()) { - ParameterEntry param = (ParameterEntry)parms.nextElement (); - if( parms.hasMoreElements( ) ) { - stream.print( " " + param.name() + "," ); - } else { - stream.print( " " + param.name() ); - } - } - stream.print( ");" ); - stream.println( " " ); - if( voidReturnType ) { - stream.println(FOUR_INDENT + "return;" ); - } else { - stream.println(FOUR_INDENT + "return $result;" ); - } - } - stream.println(" "); - stream.println (THREE_INDENT + "}" ); - stream.println (THREE_INDENT + "finally {" ); - stream.println (FOUR_INDENT + "_servant_postinvoke(_so);" ); - stream.println (THREE_INDENT + "}" ); - stream.println (TWO_INDENT + "}" ); - stream.println (ONE_INDENT + "}" ); - } - - - protected void writeLocalStubBody (InterfaceEntry i) - { - // Step 1 Create a request - String methodName = Util.stripLeadingUnderscores (m.name ()); - if (m instanceof AttributeEntry) - { - if (m.type () == null) // if it's a modifier - methodName = "_set_" + methodName; - else - methodName = "_get_" + methodName; - } - //stream.println (" while(true) {"); - stream.println (" org.omg.CORBA.portable.ServantObject $so = " + - "_servant_preinvoke (\"" + methodName + "\", " + "_opsClass);"); - //stream.println (" if ($so == null) {"); - //stream.println (" continue;"); - //stream.println (" }"); - String opsName = i.name() + "Operations"; - stream.println (" " + opsName + " $self = " + "(" + opsName + ") " + "$so.servant;"); - stream.println (); - stream.println (" try {"); - stream.print (" "); - if (m.type () != null) // not a void method - stream.print ("return "); - stream.print ("$self." + m.name () + " ("); - { - // write parm names - boolean firstTime = true; - Enumeration e = m.parameters ().elements (); - while (e.hasMoreElements ()) - { - if (firstTime) - firstTime = false; - else - stream.print (", "); - ParameterEntry parm = (ParameterEntry)e.nextElement (); - stream.print (parm.name ()); - } - // Step 2. Add the context parameter if necessary. - if (m.contexts ().size () > 0) - { - if (!firstTime) - stream.print (", "); - stream.print ("$context"); - } - } - stream.println (");"); - //stream.println (" } catch (org.omg.CORBA.portable.RemarshalException $rm) {"); - //stream.println (" continue; "); - stream.println (" } finally {"); - stream.println (" _servant_postinvoke ($so);"); - stream.println (" }"); - //stream.println (" }"); - - } // writeLocalStubBody - - - - /** - * - **/ - private void writeInsert (String indent, String target, String source, SymtabEntry type, PrintWriter stream) - { - String typeName = type.name (); - if (type instanceof PrimitiveEntry) - { - // RJB does something have to be done with TC offsets? - if (typeName.equals ("long long")) - stream.println (indent + source + ".insert_longlong (" + target + ");"); - else if (typeName.equals ("unsigned short")) - stream.println (indent + source + ".insert_ushort (" + target + ");"); - else if (typeName.equals ("unsigned long")) - stream.println (indent + source + ".insert_ulong (" + target + ");"); - else if (typeName.equals ("unsigned long long")) - stream.println (indent + source + ".insert_ulonglong (" + target + ");"); - else - stream.println (indent + source + ".insert_" + typeName + " (" + target + ");"); - } - else if (type instanceof StringEntry) - stream.println (indent + source + ".insert_" + typeName + " (" + target + ");"); - else - stream.println (indent + Util.helperName (type, true) + ".insert (" + source + ", " + target + ");"); // - } // writeInsert - - /** - * - **/ - private void writeType (String indent, String name, SymtabEntry type, PrintWriter stream) - { - if (type instanceof PrimitiveEntry) - { - // RJB does something have to be done with TC offsets? - if (type.name ().equals ("long long")) - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_longlong));"); - else if (type.name ().equals ("unsigned short")) - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ushort));"); - else if (type.name ().equals ("unsigned long")) - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulong));"); - else if (type.name ().equals ("unsigned long long")) - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulonglong));"); - else - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_" + type.name () + "));"); - } - else if (type instanceof StringEntry) - { - StringEntry s = (StringEntry)type; - Expression e = s.maxSize (); - if (e == null) - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (" + Util.parseExpression (e) + "));"); - else - stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (0));"); - } - else - stream.println (indent + name + '(' + Util.helperName (type, true) + ".type ());"); // - } // writeType - - /** - * - **/ - private void writeExtract (String indent, String target, String source, SymtabEntry type, PrintWriter stream) - { - if (type instanceof PrimitiveEntry) - { - if (type.name ().equals ("long long")) - stream.println (indent + target + " = " + source + ".extract_longlong ();"); - else if (type.name ().equals ("unsigned short")) - stream.println (indent + target + " = " + source + ".extract_ushort ();"); - else if (type.name ().equals ("unsigned long")) - stream.println (indent + target + " = " + source + ".extract_ulong ();"); - else if (type.name ().equals ("unsigned long long")) - stream.println (indent + target + " = " + source + ".extract_ulonglong ();"); - else - stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();"); - } - else if (type instanceof StringEntry) - stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();"); - else - stream.println (indent + target + " = " + Util.helperName (type, true) + ".extract (" + source + ");"); // - } // writeExtract - - /** - * - **/ - private String writeExtract (String source, SymtabEntry type) - { - String extract; - if (type instanceof PrimitiveEntry) - { - if (type.name ().equals ("long long")) - extract = source + ".extract_longlong ()"; - else if (type.name ().equals ("unsigned short")) - extract = source + ".extract_ushort ()"; - else if (type.name ().equals ("unsigned long")) - extract = source + ".extract_ulong ()"; - else if (type.name ().equals ("unsigned long long")) - extract = source + ".extract_ulonglong ()"; - else - extract = source + ".extract_" + type.name () + " ()"; - } - else if (type instanceof StringEntry) - extract = source + ".extract_" + type.name () + " ()"; - else - extract = Util.helperName (type, true) + ".extract (" + source + ')'; // - return extract; - } // writeExtract - - /** - * - **/ - private void writeSkeletonBody () - { - SymtabEntry mtype = Util.typeOf (m.type ()); - - // If there is a return value, increment the appropriate counter - stream.print (" "); - if (mtype != null) - stream.print ("return "); - stream.print ("_impl." + m.name () + '('); - - // Load the parameters - Enumeration parms = m.parameters ().elements (); - boolean first = true; - while (parms.hasMoreElements ()) - { - ParameterEntry parm = (ParameterEntry)parms.nextElement (); - if (first) - first = false; - else - stream.print (", "); - stream.print (parm.name ()); - } - if (m.contexts ().size () != 0) - { - if (!first) - stream.print (", "); - stream.print ("$context"); - } - - stream.println (");"); - } // writeSkeletonBody - - /** - * - **/ - protected String passType (int passType) - { - String type; - switch (passType) - { - case ParameterEntry.Inout: - type = "org.omg.CORBA.ARG_INOUT.value"; - break; - case ParameterEntry.Out: - type = "org.omg.CORBA.ARG_OUT.value"; - break; - case ParameterEntry.In: - default: - type = "org.omg.CORBA.ARG_IN.value"; - break; - } - return type; - } // passType - - /** - * This is only used by AttributeGen. The java mapping says - * the names should be getXXX and setXXX, but CORBA says they - * should be _get_XXX and _set_XXX. this.name () will be - * getXXX. realName is set by AttributeGen to _get_XXX. - **/ - protected void serverMethodName (String name) - { - realName = (name == null) ? "" : name; - } // serverMethodName - - /** - * - **/ - private void writeOutputStreamWrite (String indent, String oStream, String name, SymtabEntry type, PrintWriter stream) - { - String typeName = type.name (); - stream.print (indent); - if (type instanceof PrimitiveEntry) - { - if (typeName.equals ("long long")) - stream.println (oStream + ".write_longlong (" + name +");"); - else if (typeName.equals ("unsigned short")) - stream.println (oStream + ".write_ushort (" + name + ");"); - else if (typeName.equals ("unsigned long")) - stream.println (oStream + ".write_ulong (" + name + ");"); - else if (typeName.equals ("unsigned long long")) - stream.println (oStream + ".write_ulonglong (" + name + ");"); - else - stream.println (oStream + ".write_" + typeName + " (" + name + ");"); - } - else if (type instanceof StringEntry) - stream.println (oStream + ".write_" + typeName + " (" + name + ");"); - else if (type instanceof SequenceEntry) - stream.println (oStream + ".write_" + type.type().name() + " (" + name + ");"); - else if (type instanceof ValueBoxEntry) - { - ValueBoxEntry v = (ValueBoxEntry) type; - TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry; - SymtabEntry mType = member.type (); - - // if write value to the boxed holder indicated by the name ending with ".value" - if (mType instanceof PrimitiveEntry && name.endsWith (".value")) - stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " // - + " new " + Util.javaQualifiedName (type) + " (" + name + "));"); // - else - stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // // - } - else if (type instanceof ValueEntry) - stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // // - else - stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // - } // writeOutputStreamWrite - - /** - * - **/ - private String writeInputStreamRead (String source, SymtabEntry type) - { - String read = ""; - if (type instanceof PrimitiveEntry) - { - if (type.name ().equals ("long long")) - read = source + ".read_longlong ()"; - else if (type.name ().equals ("unsigned short")) - read = source + ".read_ushort ()"; - else if (type.name ().equals ("unsigned long")) - read = source + ".read_ulong ()"; - else if (type.name ().equals ("unsigned long long")) - read = source + ".read_ulonglong ()"; - else - read = source + ".read_" + type.name () + " ()"; - } - else if (type instanceof StringEntry) - read = source + ".read_" + type.name () + " ()"; - else - read = Util.helperName (type, true) + ".read (" + source + ')'; // - return read; - } // writeInputStreamRead - - /** - * - **/ - protected void writeMethodCall (String indent) - { - SymtabEntry mtype = Util.typeOf (m.type ()); - if (mtype == null) - stream.print (indent + "this." + m.name () + " ("); - else - stream.print (indent + "$result = this." + m.name () + " ("); - } // writeMethodCall - - /** - * - **/ - protected void writeCreateReply(String indent){ - stream.println(indent + "out = $rh.createReply();"); - } - - protected int methodIndex = 0; - protected String realName = ""; - protected Hashtable symbolTable = null; - protected MethodEntry m = null; - protected PrintWriter stream = null; - protected boolean localOptimization = false; - protected boolean isAbstract = false; -} // class MethodGen