src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGen.java

Thu, 31 Aug 2017 18:10:36 +0800

author
aoqi
date
Thu, 31 Aug 2017 18:10:36 +0800
changeset 748
6845b95cba6b
parent 158
91006f157c46
parent 0
7ef37b2cdcad
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 /*
    26  * COMPONENT_NAME: idl.toJava
    27  *
    28  * ORIGINS: 27
    29  *
    30  * Licensed Materials - Property of IBM
    31  * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
    32  * RMI-IIOP v1.0
    33  *
    34  */
    36 package com.sun.tools.corba.se.idl.toJavaPortable;
    38 // NOTES:
    39 // -After demarshalling an IOR, think about how to deal with the exceptions.
    40 // -catching Exception throws a string which should be in a properties file.
    41 // -30jul1997<daz> Modified to write comment immediately preceding method signature.
    42 // -07May1998<ktp> Modified to support RMI Portable Stub
    43 // -26Aug1998<klr> Modified to pass helper instance to read_Value.
    44 // -F46082.51<daz> Remove -stateful feature; javaStatefulName() obsolete.
    45 // -D56554   <klr> Port bounded string checks from toJava to toJavaPortable
    46 // -D58549   <klr> bounded string checks on in/inout parms throw BAD_PARAM
    47 // -D57112<daz> Valuetype initializers map to ctor, regardless of name, and
    48 //  "void _init(...)" methods now mapped correctly.
    49 // -D59297   <klr> pass context parm when Remarshalling
    50 // -D59560   <klr> call read/write_Context
    51 // -D60929   <klr> Update for RTF2.4 changes
    52 // -D61056   <klr> Use Util.helperName
    53 // -D61650<daz> Remove '\n' from generated strings; use println()'s.
    55 import java.io.PrintWriter;
    56 import java.util.Enumeration;
    57 import java.util.Hashtable;
    59 import com.sun.tools.corba.se.idl.EnumEntry;
    60 import com.sun.tools.corba.se.idl.ExceptionEntry;
    61 import com.sun.tools.corba.se.idl.InterfaceEntry;
    62 import com.sun.tools.corba.se.idl.MethodEntry;
    63 import com.sun.tools.corba.se.idl.ParameterEntry;
    64 import com.sun.tools.corba.se.idl.PrimitiveEntry;
    65 import com.sun.tools.corba.se.idl.StringEntry;
    66 import com.sun.tools.corba.se.idl.SymtabEntry;
    67 import com.sun.tools.corba.se.idl.SequenceEntry;
    68 import com.sun.tools.corba.se.idl.ValueEntry;
    69 import com.sun.tools.corba.se.idl.ValueBoxEntry;
    70 import com.sun.tools.corba.se.idl.InterfaceState;
    71 import com.sun.tools.corba.se.idl.TypedefEntry;
    72 import com.sun.tools.corba.se.idl.AttributeEntry;
    74 import com.sun.tools.corba.se.idl.constExpr.Expression;
    76 /**
    77  *
    78  **/
    79 public class MethodGen implements com.sun.tools.corba.se.idl.MethodGen
    80 {
    81   private static final String ONE_INDENT   = "    ";
    82   private static final String TWO_INDENT   = "        ";
    83   private static final String THREE_INDENT = "            ";
    84   private static final String FOUR_INDENT  = "                ";
    85   private static final String FIVE_INDENT  = "                    ";
    86   // This is the length of _get_ and _set_
    87   private static final int ATTRIBUTE_METHOD_PREFIX_LENGTH  = 5;
    88   /**
    89    * Public zero-argument constructor.
    90    **/
    91   public MethodGen ()
    92   {
    93   } // ctor
    95   /**
    96    * Method generate() is not used in MethodGen.  They are replaced by the
    97    * more granular interfaceMethod, stub, skeleton, dispatchSkeleton.
    98    **/
    99   public void generate (Hashtable symbolTable, MethodEntry m, PrintWriter stream)
   100   {
   101   } // generate
   103   /**
   104    *
   105    **/
   106   protected void interfaceMethod (Hashtable symbolTable, MethodEntry m, PrintWriter stream)
   107   {
   108     this.symbolTable = symbolTable;
   109     this.m           = m;
   110     this.stream      = stream;
   111     if (m.comment () != null)
   112       m.comment ().generate ("", stream);
   113     stream.print ("  ");
   114     SymtabEntry container = (SymtabEntry)m.container ();
   115     boolean isAbstract = false;
   116     boolean valueContainer = false;
   117     if (container instanceof ValueEntry)
   118     {
   119       isAbstract = ((ValueEntry)container).isAbstract ();
   120       valueContainer = true;
   121     }
   122     if (valueContainer && !isAbstract)
   123       stream.print ("public ");
   124     writeMethodSignature ();
   125     if (valueContainer && !isAbstract)
   126     {
   127       stream.println ();
   128       stream.println ("  {");
   129       stream.println ("  }");
   130       stream.println ();
   131     }
   132     else
   133       stream.println (";");
   134   } // interfaceMethod
   136   /**
   137    *
   138    **/
   139   protected void stub (String className, boolean isAbstract,
   140       Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index)
   141   {
   142     localOptimization =
   143         ((Arguments)Compile.compiler.arguments).LocalOptimization;
   144     this.isAbstract  = isAbstract;
   145     this.symbolTable = symbolTable;
   146     this.m           = m;
   147     this.stream      = stream;
   148     this.methodIndex = index;
   149     if (m.comment () != null)
   150       m.comment ().generate ("  ", stream);
   151     stream.print ("  public ");
   152     writeMethodSignature ();
   153     stream.println ();
   154     stream.println ("  {");
   155     writeStubBody ( className );
   156     stream.println ("  } // " + m.name ());
   157     stream.println ();
   158   } // stub
   160   /**
   161    *
   162    **/
   163   protected void localstub (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index, InterfaceEntry i)
   164   {
   165     this.symbolTable = symbolTable;
   166     this.m           = m;
   167     this.stream      = stream;
   168     this.methodIndex = index;
   169     if (m.comment () != null)
   170       m.comment ().generate ("  ", stream);
   171     stream.print ("  public ");
   172     writeMethodSignature ();
   173     stream.println ();
   174     stream.println ("  {");
   175     writeLocalStubBody (i);
   176     stream.println ("  } // " + m.name ());
   177     stream.println ();
   178   } // stub
   179   /**
   180    *
   181    **/
   182   protected void skeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index)
   183   {
   184     this.symbolTable = symbolTable;
   185     this.m           = m;
   186     this.stream      = stream;
   187     this.methodIndex = index;
   188     if (m.comment () != null)
   189       m.comment ().generate ("  ", stream);
   190     stream.print ("  public ");
   191     writeMethodSignature ();
   192     stream.println ();
   193     stream.println ("  {");
   194     writeSkeletonBody ();
   195     stream.println ("  } // " + m.name ());
   196   } // skeleton
   198   /**
   199    *
   200    **/
   201   protected void dispatchSkeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index)
   202   {
   203     this.symbolTable = symbolTable;
   204     this.m           = m;
   205     this.stream      = stream;
   206     this.methodIndex = index;
   207     if (m.comment () != null)
   208       m.comment ().generate ("  ", stream);
   209     writeDispatchCall ();
   210   } // dispatchSkeleton
   212   // <d57112>
   213   /**
   214    * Determine whether method entry m is a valuetype initializer.
   215    * @return true if is m is valuetype initializer, false otherwise.
   216    **/
   217   protected boolean isValueInitializer ()
   218   {
   219     MethodEntry currentInit = null;
   220     if ((m.container () instanceof ValueEntry))
   221     {
   222       Enumeration e = ((ValueEntry)m.container ()).initializers ().elements ();
   223       while (currentInit != m && e.hasMoreElements ())
   224         currentInit = (MethodEntry)e.nextElement ();
   225     }
   226     return (currentInit == m) && (null != m);  // True ==> yes, false ==> no.
   227   } // isValueInitializer
   229   /**
   230    *
   231    **/
   232   protected void writeMethodSignature ()
   233   {
   234     boolean isValueInitializer = isValueInitializer ();  // <d57112>
   236     // Step 0.  Print the return type and name.
   237     // A return type of null indicates the "void" return type. If m is a
   238     // Valuetype intitializer, it has name "init" and a null return type,
   239     // but it maps to a ctor.
   240     // <d57112>
   241     //if (m.type () == null)
   242     //{
   243     //  if (m.name ().compareTo ("init") != 0)
   244     //    stream.print ("void");
   245     //}
   246     if (m.type () == null)
   247     {
   248       if (!isValueInitializer)
   249         stream.print ("void");
   250     }
   251     else
   252     {
   253       // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete.
   254       //stream.print (Util.javaStatefulName (m.type ()));
   255       stream.print (Util.javaName (m.type ()));
   256     }
   257     // <d57112> Value initializers map to constructors.
   258     // If the value has an 'init' method with a return type, handle
   259     // the method like other regular methods
   260     //if (m.valueMethod () && m.name ().compareTo ("init") == 0 &&
   261     //    m.type () == null)
   262     if (isValueInitializer)
   263       stream.print (' ' + m.container ().name () + " (");
   264     else
   265       stream.print (' ' + m.name () + " (");
   267     // Step 1.  Print the parameter list.
   268     boolean firstTime = true;
   269     Enumeration e = m.parameters ().elements ();
   270     while (e.hasMoreElements ())
   271     {
   272       if (firstTime)
   273         firstTime = false;
   274       else
   275         stream.print (", ");
   276       ParameterEntry parm = (ParameterEntry)e.nextElement ();
   278       writeParmType (parm.type (), parm.passType ());
   280       // Print parm name
   281       stream.print (' ' + parm.name ());
   282     }
   284     // Step 2.  Add the context parameter if necessary.
   285     if (m.contexts ().size () > 0)
   286     {
   287       if (!firstTime)
   288         stream.print (", ");
   289       stream.print ("org.omg.CORBA.Context $context");
   290     }
   292     // Step 3.  Print the throws clause (if necessary).
   293     if (m.exceptions ().size () > 0)
   294     {
   295       stream.print (") throws ");
   296       e = m.exceptions ().elements ();
   297       firstTime = true;
   298       while (e.hasMoreElements ())
   299       {
   300         if (firstTime)
   301           firstTime = false;
   302         else
   303           stream.print (", ");
   304         stream.print (Util.javaName ((SymtabEntry)e.nextElement ()));
   305       }
   306     }
   307     else
   308       stream.print (')');
   309   } // writeMethodSignature
   311   /**
   312    *
   313    **/
   314   protected void writeParmType (SymtabEntry parm, int passType)
   315   {
   316     if (passType != ParameterEntry.In)
   317     {
   318       parm = Util.typeOf (parm);
   319       stream.print (Util.holderName (parm));
   320     }
   321     else // passType is `in'
   322       // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete.
   323       //stream.print (Util.javaStatefulName (parm));
   324       stream.print (Util.javaName (parm));
   325   } // writeParmType
   327   /**
   328    *
   329    **/
   330   protected void writeDispatchCall ()
   331   {
   332     String indent = "       ";
   333     String fullMethodName = m.fullName ();
   334     if (m instanceof AttributeEntry)
   335     {
   336       // determine the index at which the attribute name starts in the full name
   337       int index = fullMethodName.lastIndexOf ('/') + 1;
   338       if (m.type () == null)          // if it's a modifier
   339         fullMethodName = fullMethodName.substring (0, index) + "_set_" + m.name ();
   340       else
   341         fullMethodName = fullMethodName.substring (0, index) + "_get_" + m.name ();
   342     }
   343     stream.println (indent + "case " + methodIndex + ":  // " + fullMethodName);
   344     stream.println (indent + "{");
   345     indent = indent + "  ";
   346     if (m.exceptions ().size () > 0)
   347     {
   348       stream.println (indent + "try {");
   349       indent = indent + "  ";
   350     }
   352     // Step 1 Read arguments from the input stream
   353     SymtabEntry mtype = Util.typeOf (m.type ());
   354     Enumeration parms = m.parameters ().elements ();
   355     parms = m.parameters ().elements ();
   356     while (parms.hasMoreElements ())
   357     {
   358       ParameterEntry parm     = (ParameterEntry) parms.nextElement ();
   359       String         name     = parm.name ();
   360       String         anyName  = '_' + name;
   361       SymtabEntry    type     = parm.type ();
   362       int            passType = parm.passType ();
   364       if (passType == ParameterEntry.In)
   365         Util.writeInitializer (indent, name, "", type, writeInputStreamRead ("in", type), stream);
   367       else // the parm is a holder
   368       {
   369         String holderName = Util.holderName (type);
   370         stream.println (indent + holderName + ' ' + name + " = new " + holderName + " ();");
   371         if (passType == ParameterEntry.Inout)
   372         {
   373           if (type instanceof ValueBoxEntry)
   374           {
   375             ValueBoxEntry v = (ValueBoxEntry) type;
   376             TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry;
   377             SymtabEntry mType = member.type ();
   378             if (mType instanceof PrimitiveEntry)
   379               stream.println (indent + name + ".value = (" + writeInputStreamRead ("in", parm.type ()) + ").value;");
   380             else
   381               stream.println (indent + name + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";");
   382           }
   383           else
   384             stream.println (indent +  name  + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";");
   385         }
   386       }
   387     }
   389     // Step 1a.  Read the context parameter if necessary. <d59560>
   390     if (m.contexts ().size () > 0)
   391     {
   392       stream.println (indent + "org.omg.CORBA.Context $context = in.read_Context ();");
   393     }
   395     // Step 2 Load return if necessary
   396     if (mtype != null)
   397       Util.writeInitializer (indent, "$result", "", mtype, stream);
   399     // Step 3 Call the method with the list of parameters
   400     writeMethodCall (indent);
   402     parms = m.parameters ().elements ();
   403     boolean firstTime = true;
   404     while (parms.hasMoreElements ())
   405     {
   406       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   407       if (firstTime)
   408         firstTime = false;
   409       else
   410         stream.print (", ");
   411       stream.print (parm.name ());
   412     }
   414     // Step 3a.  Add the context parameter if necessary. <d59560>
   415     if (m.contexts ().size () > 0)
   416     {
   417       if (!firstTime)
   418         stream.print (", ");
   419       stream.print ("$context");
   420     }
   422     stream.println (");");
   424     //Step 3b. Create reply;
   425     writeCreateReply (indent);
   427     // Step 4 Write method's result to the output stream
   428     if (mtype != null)
   429     {
   430       writeOutputStreamWrite (indent, "out", "$result", mtype, stream);
   431     }
   433     // Step 5 Write inout/out value to the output stream
   434     parms = m.parameters ().elements ();
   435     while (parms.hasMoreElements ())
   436     {
   437       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   438       int passType = parm.passType ();
   439       if (passType != ParameterEntry.In)
   440       {
   441         writeOutputStreamWrite (indent, "out", parm.name () + ".value", parm.type (), stream);
   442       }
   443     }
   445     // Step 6 Handle exception
   446     if (m.exceptions ().size () > 0)
   447     {
   448       Enumeration exceptions = m.exceptions ().elements ();
   449       while (exceptions.hasMoreElements ())
   450       {
   451         indent = "         ";
   452         ExceptionEntry exc = (ExceptionEntry) exceptions.nextElement ();
   453         String fullName = Util.javaQualifiedName (exc);
   454         stream.println (indent + "} catch (" +  fullName + " $ex) {");
   455         indent = indent + "  ";
   456         stream.println (indent + "out = $rh.createExceptionReply ();");
   457         stream.println (indent + Util.helperName (exc, true) + ".write (out, $ex);"); // <d61056>
   458       }
   460       indent = "         ";
   461       stream.println (indent + "}");
   462     }
   464     stream.println ("         break;");
   465     stream.println ("       }");
   466     stream.println ();
   467   } // writeDispatchCall
   469   /**
   470    *
   471    **/
   472   protected void writeStubBody ( String className )
   473   {
   474     // Step 1  Create a request
   475     String methodName = Util.stripLeadingUnderscores (m.name ());
   476     if (m instanceof AttributeEntry)
   477     {
   478       if (m.type () == null)          // if it's a modifier
   479         methodName = "_set_" + methodName;
   480       else
   481         methodName = "_get_" + methodName;
   482     }
   483     if( localOptimization && !isAbstract ) {
   484         stream.println (ONE_INDENT + "while(true) {" );
   485         stream.println(TWO_INDENT + "if(!this._is_local()) {" );
   486     }
   487     stream.println(THREE_INDENT +
   488         "org.omg.CORBA.portable.InputStream $in = null;");
   489     stream.println(THREE_INDENT + "try {");
   490     stream.println(FOUR_INDENT + "org.omg.CORBA.portable.OutputStream $out =" +
   491         " _request (\"" +  methodName + "\", " + !m.oneway() + ");");
   493     // Step 1.b.  Check string bounds <d56554 - klr>
   494     // begin <d56554> in/inout string bounds check
   495     Enumeration parms = m.parameters ().elements ();
   496     while (parms.hasMoreElements ())
   497     {
   498       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   499       SymtabEntry parmType = Util.typeOf (parm.type ());
   500       if (parmType instanceof StringEntry)
   501         if ((parm.passType () == ParameterEntry.In) ||
   502             (parm.passType () == ParameterEntry.Inout))
   503         {
   504           StringEntry string = (StringEntry)parmType;
   505           if (string.maxSize () != null)
   506           {
   507             stream.print (THREE_INDENT + "if (" + parm.name ());
   508             if (parm.passType () == ParameterEntry.Inout)
   509               stream.print (".value"); // get from holder
   510             stream.print (" == null || " + parm.name ());
   511             if (parm.passType () == ParameterEntry.Inout)
   512               stream.print (".value"); // get from holder
   513             stream.println (".length () > (" +
   514                 Util.parseExpression (string.maxSize ()) + "))");
   515             stream.println (THREE_INDENT +
   516                 "throw new org.omg.CORBA.BAD_PARAM (0," +
   517                 " org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
   518           }
   519         }
   520     }
   521     // end <d56554> in/inout string bounds check
   523     // Step 2  Load the parameters into the outputStream
   524     parms = m.parameters ().elements ();
   525     while (parms.hasMoreElements ())
   526     {
   527       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   528       if (parm.passType () == ParameterEntry.In)
   529         writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name (), parm.type (),
   530             stream);
   531       else if (parm.passType () == ParameterEntry.Inout)
   532         writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name () + ".value",
   533             parm.type (), stream);
   534     }
   536     // Step 2a.  Write the context parameter if necessary. <d59560>
   537     if (m.contexts ().size () > 0)
   538     {
   539       stream.println(FOUR_INDENT + "org.omg.CORBA.ContextList $contextList =" +
   540          "_orb ().create_context_list ();");
   542       for (int cnt = 0; cnt < m.contexts ().size (); cnt++)
   543       {
   544           stream.println(FOUR_INDENT +
   545              "$contextList.add (\"" + m.contexts (). elementAt (cnt) + "\");");
   546       }
   547       stream.println(FOUR_INDENT +
   548           "$out.write_Context ($context, $contextList);");
   549     }
   551     // Step 3 Invoke the method with the output stream
   552     stream.println (FOUR_INDENT + "$in = _invoke ($out);");
   554     SymtabEntry mtype = m.type ();
   555     if (mtype != null)
   556       Util.writeInitializer (FOUR_INDENT, "$result", "", mtype,
   557           writeInputStreamRead ("$in", mtype), stream);
   559     // Step 4  Read the inout/out values
   560     parms = m.parameters ().elements ();
   561     while (parms.hasMoreElements ())
   562     {
   563       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   564       if (parm.passType () != ParameterEntry.In)
   565       {
   566         if (parm.type () instanceof ValueBoxEntry)
   567         {
   568           ValueBoxEntry v = (ValueBoxEntry) parm.type ();
   569           TypedefEntry member =
   570               ((InterfaceState) v.state ().elementAt (0)).entry;
   571           SymtabEntry mType = member.type ();
   572           if (mType instanceof PrimitiveEntry)
   573             stream.println(FOUR_INDENT +  parm.name () +
   574                 ".value = (" + writeInputStreamRead ("$in", parm.type ()) +
   575                 ").value;");
   576           else
   577             stream.println(FOUR_INDENT +  parm.name () +
   578                 ".value = " + writeInputStreamRead ("$in", parm.type ()) +";");
   579         }
   580         else
   581           stream.println (FOUR_INDENT +  parm.name () + ".value = " +
   582               writeInputStreamRead ("$in", parm.type ()) + ";");
   583       }
   584     }
   585     // Step 4.b.  Check string bounds <d56554 - klr>
   586     // begin <d56554> out/inout/return string bounds check
   587     parms = m.parameters ().elements ();
   588     while (parms.hasMoreElements ())
   589     {
   590       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   591       SymtabEntry parmType = Util.typeOf (parm.type ());
   592       if (parmType instanceof StringEntry)
   593         if ((parm.passType () == ParameterEntry.Out) ||
   594             (parm.passType () == ParameterEntry.Inout))
   595         {
   596           StringEntry string = (StringEntry)parmType;
   597           if (string.maxSize () != null)
   598           {
   599             stream.print (FOUR_INDENT + "if (" + parm.name () +
   600                 ".value.length ()");
   601             stream.println ("         > (" +
   602                 Util.parseExpression (string.maxSize ()) + "))");
   603             stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL(0,"+
   604                 "org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
   605           }
   606         }
   607     }
   608     if (mtype instanceof StringEntry)
   609     {
   610       StringEntry string = (StringEntry)mtype;
   611       if (string.maxSize () != null)
   612       {
   613         stream.println(FOUR_INDENT + "if ($result.length () > (" +
   614             Util.parseExpression (string.maxSize ()) + "))");
   615         stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (0," +
   616             " org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
   617       }
   618     }
   619     // end <d56554> out/inout/return string bounds check
   621     // Step 5  Handle return if necessary
   622     if (mtype != null) {
   623       stream.println(FOUR_INDENT + "return $result;");
   624     } else {
   625       stream.println(FOUR_INDENT + "return;");
   626     }
   628     // Step 6  Handle exceptions
   629     stream.println(THREE_INDENT +
   630         "} catch (org.omg.CORBA.portable.ApplicationException " + "$ex) {");
   631     stream.println(FOUR_INDENT + "$in = $ex.getInputStream ();");
   632     stream.println(FOUR_INDENT + "String _id = $ex.getId ();");
   634     if (m.exceptions ().size () > 0)
   635     {
   636       Enumeration exceptions = m.exceptions ().elements ();
   637       boolean firstExc = true;
   638       while (exceptions.hasMoreElements ())
   639       {
   640         ExceptionEntry exc = (ExceptionEntry)exceptions.nextElement ();
   641         if (firstExc)
   642         {
   643           stream.print(FOUR_INDENT + "if ");
   644           firstExc = false;
   645         }
   646         else
   647           stream.print(FOUR_INDENT + "else if ");
   649         stream.println( "(_id.equals (\"" + exc.repositoryID ().ID () + "\"))");
   650         stream.println (FIVE_INDENT + "throw " +
   651             Util.helperName ((SymtabEntry)exc, false) + ".read ($in);");
   652       }
   653       stream.println(FOUR_INDENT + "else");
   654       stream.println(FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);");
   655     }
   656     else
   657       stream.println(FOUR_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);");
   659     stream.println(THREE_INDENT +
   660         "} catch (org.omg.CORBA.portable.RemarshalException $rm) {");
   661     stream.print( FOUR_INDENT );
   662     if (m.type () != null) // not a void method
   663       stream.print ("return ");
   664     stream.print (m.name () + " (");
   665     {
   666       // write parm names
   667       boolean firstTime = true;
   668       Enumeration e = m.parameters ().elements ();
   669       while (e.hasMoreElements ())
   670       {
   671         if (firstTime)
   672           firstTime = false;
   673         else
   674           stream.print (", ");
   675         ParameterEntry parm = (ParameterEntry)e.nextElement ();
   676         stream.print (parm.name ());
   677       }
   678       // Step 2.  Add the context parameter if necessary. <d59297>
   679       if (m.contexts ().size () > 0)
   680       {
   681         if (!firstTime)
   682           stream.print (", ");
   683         stream.print ("$context");
   684       }
   685     }
   686     stream.println (TWO_INDENT + ");");
   687     stream.println (THREE_INDENT + "} finally {");
   688     stream.println (FOUR_INDENT + "_releaseReply ($in);");
   689     stream.println (THREE_INDENT + "}");
   690     if( localOptimization && !isAbstract ) {
   691         stream.println (TWO_INDENT + "}");
   692         writeStubBodyForLocalInvocation( className, methodName );
   693     }
   695   } // writeStubBody
   698   /**
   699    * This method writes the else part of the stub method invocation to
   700    * enable local invocation in case of collocation.
   701    * NOTE: This will only be invoked from writeStubBody.
   702    */
   703   private void writeStubBodyForLocalInvocation( String className,
   704       String methodName )
   705   {
   706     stream.println (TWO_INDENT + "else {" );
   707     stream.println (THREE_INDENT +
   708         "org.omg.CORBA.portable.ServantObject _so =");
   709     stream.println (FOUR_INDENT + "_servant_preinvoke(\"" + methodName +
   710                     "\", _opsClass);" );
   711     stream.println(THREE_INDENT + "if (_so == null ) {");
   712     stream.println(FOUR_INDENT + "continue;" );
   713     stream.println(THREE_INDENT + "}");
   714     stream.println(THREE_INDENT + className + "Operations _self =" );
   715     stream.println(FOUR_INDENT + "(" + className + "Operations) _so.servant;");
   716     stream.println(THREE_INDENT + "try {" );
   717     Enumeration parms = m.parameters ().elements ();
   718     if (m instanceof AttributeEntry)
   719     {
   720         // Local Method Name should drop _get_ or _set_ prefix for attribute
   721         // entry
   722         methodName = methodName.substring( ATTRIBUTE_METHOD_PREFIX_LENGTH );
   723     }
   724     boolean voidReturnType = (this.m.type() == null);
   725     if ( !voidReturnType ) {
   726         stream.println (FOUR_INDENT + Util.javaName (this.m.type ()) +
   727             " $result;");
   728     }
   729     if( !isValueInitializer() ) {
   730         if ( voidReturnType ) {
   731             stream.print(FOUR_INDENT + "_self." + methodName + "( " );
   732         } else {
   733             stream.print(FOUR_INDENT + "$result = _self." +
   734                      methodName + "( " );
   735         }
   736         while (parms.hasMoreElements ()) {
   737             ParameterEntry param = (ParameterEntry)parms.nextElement ();
   738             if( parms.hasMoreElements( ) ) {
   739                 stream.print( " " + param.name() +  "," );
   740             } else  {
   741                 stream.print( " " + param.name() );
   742             }
   743         }
   744         stream.print( ");" );
   745         stream.println( " " );
   746         if( voidReturnType ) {
   747             stream.println(FOUR_INDENT + "return;" );
   748         } else {
   749             stream.println(FOUR_INDENT + "return $result;" );
   750         }
   751     }
   752     stream.println(" ");
   753     stream.println (THREE_INDENT + "}" );
   754     stream.println (THREE_INDENT + "finally {" );
   755     stream.println (FOUR_INDENT + "_servant_postinvoke(_so);" );
   756     stream.println (THREE_INDENT + "}" );
   757     stream.println (TWO_INDENT + "}" );
   758     stream.println (ONE_INDENT + "}" );
   759   }
   762   protected void writeLocalStubBody (InterfaceEntry i)
   763   {
   764     // Step 1  Create a request
   765     String methodName = Util.stripLeadingUnderscores (m.name ());
   766     if (m instanceof AttributeEntry)
   767     {
   768       if (m.type () == null)          // if it's a modifier
   769         methodName = "_set_" + methodName;
   770       else
   771         methodName = "_get_" + methodName;
   772     }
   773     //stream.println ("    while(true) {");
   774     stream.println ("      org.omg.CORBA.portable.ServantObject $so = " +
   775                     "_servant_preinvoke (\"" + methodName + "\", " + "_opsClass);");
   776     //stream.println ("      if ($so == null) {");
   777     //stream.println ("          continue;");
   778     //stream.println ("      }");
   779     String opsName = i.name() + "Operations";
   780     stream.println ("      " + opsName + "  $self = " + "(" + opsName + ") " + "$so.servant;");
   781     stream.println ();
   782     stream.println ("      try {");
   783     stream.print ("         ");
   784     if (m.type () != null) // not a void method
   785         stream.print ("return ");
   786     stream.print ("$self." + m.name () + " (");
   787     {
   788         // write parm names
   789         boolean firstTime = true;
   790         Enumeration e = m.parameters ().elements ();
   791         while (e.hasMoreElements ())
   792         {
   793           if (firstTime)
   794             firstTime = false;
   795           else
   796             stream.print (", ");
   797           ParameterEntry parm = (ParameterEntry)e.nextElement ();
   798           stream.print (parm.name ());
   799         }
   800         // Step 2.  Add the context parameter if necessary. <d59297>
   801         if (m.contexts ().size () > 0)
   802         {
   803           if (!firstTime)
   804             stream.print (", ");
   805           stream.print ("$context");
   806         }
   807     }
   808     stream.println (");");
   809     //stream.println ("      } catch (org.omg.CORBA.portable.RemarshalException $rm) {");
   810     //stream.println ("         continue; ");
   811     stream.println ("      } finally {");
   812     stream.println ("          _servant_postinvoke ($so);");
   813     stream.println ("      }");
   814     //stream.println ("    }");
   816   } // writeLocalStubBody
   820   /**
   821    *
   822    **/
   823   private void writeInsert (String indent, String target, String source, SymtabEntry type, PrintWriter stream)
   824   {
   825     String typeName = type.name ();
   826     if (type instanceof PrimitiveEntry)
   827     {
   828       // RJB does something have to be done with TC offsets?
   829       if (typeName.equals ("long long"))
   830         stream.println (indent + source + ".insert_longlong (" + target + ");");
   831       else if (typeName.equals ("unsigned short"))
   832         stream.println (indent + source + ".insert_ushort (" + target + ");");
   833       else if (typeName.equals ("unsigned long"))
   834         stream.println (indent + source + ".insert_ulong (" + target + ");");
   835       else if (typeName.equals ("unsigned long long"))
   836         stream.println (indent + source + ".insert_ulonglong (" + target + ");");
   837       else
   838         stream.println (indent + source + ".insert_" + typeName + " (" + target + ");");
   839     }
   840     else if (type instanceof StringEntry)
   841       stream.println (indent + source + ".insert_" + typeName + " (" + target + ");");
   842     else
   843       stream.println (indent + Util.helperName (type, true) + ".insert (" + source + ", " + target + ");"); // <d61056>
   844   } // writeInsert
   846   /**
   847    *
   848    **/
   849   private void writeType (String indent, String name, SymtabEntry type, PrintWriter stream)
   850   {
   851     if (type instanceof PrimitiveEntry)
   852     {
   853       // RJB does something have to be done with TC offsets?
   854       if (type.name ().equals ("long long"))
   855         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_longlong));");
   856       else if (type.name ().equals ("unsigned short"))
   857         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ushort));");
   858       else if (type.name ().equals ("unsigned long"))
   859         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulong));");
   860       else if (type.name ().equals ("unsigned long long"))
   861         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulonglong));");
   862       else
   863         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_" + type.name () + "));");
   864     }
   865     else if (type instanceof StringEntry)
   866     {
   867       StringEntry s = (StringEntry)type;
   868       Expression e  = s.maxSize ();
   869       if (e == null)
   870         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (" + Util.parseExpression (e) + "));");
   871      else
   872         stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (0));");
   873     }
   874     else
   875       stream.println (indent + name + '(' + Util.helperName (type, true) + ".type ());"); // <d61056>
   876   } // writeType
   878   /**
   879    *
   880    **/
   881   private void writeExtract (String indent, String target, String source, SymtabEntry type, PrintWriter stream)
   882   {
   883     if (type instanceof PrimitiveEntry)
   884     {
   885       if (type.name ().equals ("long long"))
   886         stream.println (indent + target + " = " + source + ".extract_longlong ();");
   887       else if (type.name ().equals ("unsigned short"))
   888         stream.println (indent + target + " = " + source + ".extract_ushort ();");
   889       else if (type.name ().equals ("unsigned long"))
   890         stream.println (indent + target + " = " + source + ".extract_ulong ();");
   891       else if (type.name ().equals ("unsigned long long"))
   892         stream.println (indent + target + " = " + source + ".extract_ulonglong ();");
   893       else
   894         stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();");
   895     }
   896     else if (type instanceof StringEntry)
   897       stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();");
   898     else
   899       stream.println (indent + target + " = " + Util.helperName (type, true) + ".extract (" + source + ");"); // <d61056>
   900   } // writeExtract
   902   /**
   903    *
   904    **/
   905   private String writeExtract (String source, SymtabEntry type)
   906   {
   907     String extract;
   908     if (type instanceof PrimitiveEntry)
   909     {
   910       if (type.name ().equals ("long long"))
   911         extract = source + ".extract_longlong ()";
   912       else if (type.name ().equals ("unsigned short"))
   913         extract = source + ".extract_ushort ()";
   914       else if (type.name ().equals ("unsigned long"))
   915         extract = source + ".extract_ulong ()";
   916       else if (type.name ().equals ("unsigned long long"))
   917         extract = source + ".extract_ulonglong ()";
   918       else
   919         extract = source + ".extract_" + type.name () + " ()";
   920     }
   921     else if (type instanceof StringEntry)
   922       extract = source + ".extract_" + type.name () + " ()";
   923     else
   924       extract = Util.helperName (type, true) + ".extract (" + source + ')'; // <d61056>
   925     return extract;
   926   } // writeExtract
   928   /**
   929    *
   930    **/
   931   private void writeSkeletonBody ()
   932   {
   933     SymtabEntry mtype = Util.typeOf (m.type ());
   935     // If there is a return value, increment the appropriate counter
   936     stream.print ("    ");
   937     if (mtype != null)
   938       stream.print ("return ");
   939     stream.print ("_impl." + m.name () + '(');
   941     // Load the parameters
   942     Enumeration parms = m.parameters ().elements ();
   943     boolean first = true;
   944     while (parms.hasMoreElements ())
   945     {
   946       ParameterEntry parm = (ParameterEntry)parms.nextElement ();
   947       if (first)
   948         first = false;
   949       else
   950         stream.print (", ");
   951       stream.print (parm.name ());
   952     }
   953     if (m.contexts ().size () != 0)
   954     {
   955       if (!first)
   956         stream.print (", ");
   957       stream.print ("$context");
   958     }
   960     stream.println (");");
   961   } // writeSkeletonBody
   963   /**
   964    *
   965    **/
   966   protected String passType (int passType)
   967   {
   968     String type;
   969     switch (passType)
   970     {
   971       case ParameterEntry.Inout:
   972         type = "org.omg.CORBA.ARG_INOUT.value";
   973         break;
   974       case ParameterEntry.Out:
   975         type = "org.omg.CORBA.ARG_OUT.value";
   976         break;
   977       case ParameterEntry.In:
   978       default:
   979         type = "org.omg.CORBA.ARG_IN.value";
   980         break;
   981     }
   982     return type;
   983   } // passType
   985   /**
   986    * This is only used by AttributeGen.  The java mapping says
   987    * the names should be getXXX and setXXX, but CORBA says they
   988    * should be _get_XXX and _set_XXX.  this.name () will be
   989    * getXXX.  realName is set by AttributeGen to _get_XXX.
   990    **/
   991   protected void serverMethodName (String name)
   992   {
   993     realName = (name == null) ? "" : name;
   994   } // serverMethodName
   996   /**
   997    *
   998    **/
   999   private void writeOutputStreamWrite (String indent, String oStream, String name, SymtabEntry type, PrintWriter stream)
  1001     String typeName = type.name ();
  1002     stream.print (indent);
  1003     if (type instanceof PrimitiveEntry)
  1005       if (typeName.equals ("long long"))
  1006         stream.println (oStream + ".write_longlong (" + name +");");
  1007       else if (typeName.equals ("unsigned short"))
  1008         stream.println (oStream + ".write_ushort (" + name + ");");
  1009       else if (typeName.equals ("unsigned long"))
  1010         stream.println (oStream + ".write_ulong (" + name + ");");
  1011       else if (typeName.equals ("unsigned long long"))
  1012         stream.println (oStream + ".write_ulonglong (" + name + ");");
  1013       else
  1014         stream.println (oStream + ".write_" + typeName + " (" + name + ");");
  1016     else if (type instanceof StringEntry)
  1017       stream.println (oStream + ".write_" + typeName + " (" + name + ");");
  1018     else if (type instanceof SequenceEntry)
  1019       stream.println (oStream + ".write_" + type.type().name() + " (" + name + ");");
  1020     else if (type instanceof ValueBoxEntry)
  1022       ValueBoxEntry v = (ValueBoxEntry) type;
  1023       TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry;
  1024       SymtabEntry mType = member.type ();
  1026       // if write value to the boxed holder indicated by the name ending with ".value"
  1027       if (mType instanceof PrimitiveEntry && name.endsWith (".value"))
  1028         stream.println (Util.helperName (type, true) + ".write (" + oStream + ", "  // <d61056>
  1029         + " new " + Util.javaQualifiedName (type) + " (" + name + "));"); //<d60929>
  1030       else
  1031         stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // <d61056>
  1033     else if (type instanceof ValueEntry)
  1034         stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // <d61056>
  1035     else
  1036       stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // <d61056>
  1037   } // writeOutputStreamWrite
  1039   /**
  1041    **/
  1042   private String writeInputStreamRead (String source, SymtabEntry type)
  1044     String read = "";
  1045     if (type instanceof PrimitiveEntry)
  1047       if (type.name ().equals ("long long"))
  1048         read = source + ".read_longlong ()";
  1049       else if (type.name ().equals ("unsigned short"))
  1050         read = source + ".read_ushort ()";
  1051       else if (type.name ().equals ("unsigned long"))
  1052         read = source + ".read_ulong ()";
  1053       else if (type.name ().equals ("unsigned long long"))
  1054         read = source + ".read_ulonglong ()";
  1055       else
  1056         read = source + ".read_" + type.name () + " ()";
  1058     else if (type instanceof StringEntry)
  1059       read = source + ".read_" + type.name () + " ()";
  1060     else
  1061       read = Util.helperName (type, true) + ".read (" + source + ')'; // <d61056>
  1062     return read;
  1063   } // writeInputStreamRead
  1065   /**
  1067    **/
  1068   protected void writeMethodCall (String indent)
  1070     SymtabEntry mtype = Util.typeOf (m.type ());
  1071     if (mtype == null)
  1072       stream.print (indent + "this." + m.name () + " (");
  1073     else
  1074       stream.print (indent + "$result = this." + m.name () + " (");
  1075   } // writeMethodCall
  1077   /**
  1079    **/
  1080   protected void writeCreateReply(String indent){
  1081     stream.println(indent + "out = $rh.createReply();");
  1084   protected int           methodIndex = 0;
  1085   protected String        realName    = "";
  1086   protected Hashtable     symbolTable = null;
  1087   protected MethodEntry   m           = null;
  1088   protected PrintWriter   stream      = null;
  1089   protected boolean localOptimization = false;
  1090   protected boolean isAbstract        = false;
  1091 } // class MethodGen

mercurial