alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (MethodGen.java)

This example Java source code file (MethodGen.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

attributeentry, enumeration, four_indent, hashtable, methodentry, parameterentry, primitiveentry, printwriter, string, stringentry, symtabentry, three_indent, two_indent, util, valueboxentry

The MethodGen.java Java example source code

/*
 * 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<daz> Modified to write comment immediately preceding method signature.
// -07May1998<ktp> Modified to support RMI Portable Stub
// -26Aug1998<klr> Modified to pass helper instance to read_Value.
// -F46082.51<daz> Remove -stateful feature; javaStatefulName() obsolete.
// -D56554   <klr> Port bounded string checks from toJava to toJavaPortable
// -D58549   <klr> bounded string checks on in/inout parms throw BAD_PARAM
// -D57112<daz> Valuetype initializers map to ctor, regardless of name, and
//  "void _init(...)" methods now mapped correctly.
// -D59297   <klr> pass context parm when Remarshalling
// -D59560   <klr> call read/write_Context
// -D60929   <klr> Update for RTF2.4 changes
// -D61056   <klr> Use Util.helperName
// -D61650<daz> 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

  // <d57112>
  /**
   * 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 ();  // <d57112>

    // 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.
    // <d57112>
    //if (m.type () == null)
    //{
    //  if (m.name ().compareTo ("init") != 0)
    //    stream.print ("void");
    //}
    if (m.type () == null)
    {
      if (!isValueInitializer)
        stream.print ("void");
    }
    else
    {
      // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete.
      //stream.print (Util.javaStatefulName (m.type ()));
      stream.print (Util.javaName (m.type ()));
    }
    // <d57112> 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'
      // <f46082.51> 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. <d59560>
    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. <d59560>
    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);"); // <d61056>
      }

      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 <d56554 - klr>
    // begin <d56554> 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 <d56554> 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. <d59560>
    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 <d56554 - klr>
    // begin <d56554> 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 <d56554> 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. <d59297>
      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. <d59297>
        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 + ");"); // <d61056>
  } // 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 ());"); // <d61056>
  } // 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 + ");"); // <d61056>
  } // 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 + ')'; // <d61056>
    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 + ", "  // <d61056>
        + " new " + Util.javaQualifiedName (type) + " (" + name + "));"); //<d60929>
      else
        stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // 
    }
    else if (type instanceof ValueEntry)
        stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // 
    else
      stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // <d61056>
  } // 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 + ')'; // <d61056>
    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

Other Java examples (source code examples)

Here is a short list of links related to this Java MethodGen.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.