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

Java example source code file (InterfaceGen.java)

This example Java source code file (InterfaceGen.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

constentry, corba\/environment, corba\/request, enumeration, hashtable, interfaceentry, interfacegen, methodentry, operations, printwriter, signature, string, symtabentry, tcoffsets, util

The InterfaceGen.java Java example source code

/*
 * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
/*
 * COMPONENT_NAME: idl.toJava
 *
 * ORIGINS: 27
 *
 * Licensed Materials - Property of IBM
 * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
 * RMI-IIOP v1.0
 *
 */

package com.sun.tools.corba.se.idl.toJavaPortable;

// NOTES:
// -The ctor should really throw an exception, but then it must have a
//  throws clause. How much of a ripple effect is this?
// -F46082.51<daz> Remove -stateful feature.
// -D60929   <klr> Update for RTF2.4 changes
// -D61056   <klr> Use Util.helperName
// -D62014   <klr> Move const definitions from signature to operations interf.
// -D62310   <klr> Fix declaration of interfaces extending abstract intf.
// -D62023   <klr> Move const definitions back from operations to signature.

import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import com.sun.tools.corba.se.idl.GenFileStream;
import com.sun.tools.corba.se.idl.ConstEntry;
import com.sun.tools.corba.se.idl.InterfaceEntry;
import com.sun.tools.corba.se.idl.InterfaceState;
import com.sun.tools.corba.se.idl.MethodEntry;
import com.sun.tools.corba.se.idl.PrimitiveEntry;
import com.sun.tools.corba.se.idl.SequenceEntry;
import com.sun.tools.corba.se.idl.StringEntry;
import com.sun.tools.corba.se.idl.SymtabEntry;
import com.sun.tools.corba.se.idl.TypedefEntry;

/**
 *
 **/
public class InterfaceGen implements com.sun.tools.corba.se.idl.InterfaceGen, JavaGenerator
{
  /**
   * Public zero-argument constructor.
   **/
  public InterfaceGen ()
  {
    //emit = ((Arguments)Compile.compiler.arguments).emit;
    //factories = (Factories)Compile.compiler.factories ();
  } // ctor

  /**
   * Generate the interface and all the files associated with it.
   * Provides general algorithm for binding generation:
   * 1.) Initialize symbol table and symbol table entry members, common to all generators.
   * 2.) Generate the skeleton if required by calling generateSkeletn ()
   * 3.) Generate the holder by calling generateHolder ()
   * 4.) Generate the helper by calling generateHelper ()
   * 5.) Generate the stub if required by calling generateStub ()
   * 6.) Generate the interface by calling generateInterface ()
   **/
  public void generate (Hashtable symbolTable, InterfaceEntry i, PrintWriter stream)
  {
    if (!isPseudo(i))
    {
      this.symbolTable = symbolTable;
      this.i           = i;
      init ();

      // for sun_local pragma, just generate the signature and operations interfaces
      // for sun_localservant pragma, generate the Local Stubs, and Skel, should not
      // have _invoke defined.
      // for local (is_local()) case, generate only Helpers and Holder, where they
      // have been modified to throw appropriate exceptions for read and write, and
      // narrow is modified to not invoke _is_a

      if (! (i.isLocalSignature())) {
          // generate the stubs and skeletons for non-local interfaces
          if (! (i.isLocal())) {
              // for local servant case just generate the skeleton, but
              // for others generate the stubs also
              generateSkeleton ();

              // _REVISIT_, Whenever there is time restructure the code to
              // encapsulate stub and skeleton generation.

              // If the option is -fallTie then generate the Tie class first
              // and then generate the ImplBase class to make the generation
              // complete for the Hierarchy.
              Arguments theArguments = (Arguments)Compile.compiler.arguments;
              if( (theArguments.TIEServer == true )
                &&(theArguments.emit == theArguments.All ) )
              {
                  theArguments.TIEServer = false;
                  // Generate the ImplBase class
                  generateSkeleton ();
                  // Revert in case file contains multiple interfaces
                  theArguments.TIEServer = true;
              }
              generateStub ();
          }
          generateHolder ();
          generateHelper ();
      }
      intfType = SIGNATURE;
      generateInterface ();
      intfType = OPERATIONS;
      generateInterface ();
      intfType = 0;
    }
  } // generate

  /**
   * Initialize members unique to this generator.
   **/
  protected void init ()
  {
    emit = ((Arguments)Compile.compiler.arguments).emit;
    factories = (Factories)Compile.compiler.factories ();
  } // init

  /**
   * Generate a Skeleton when the user does not want just the client-side code.
   **/
  protected void generateSkeleton ()
  {
    // <f46082.51> Remove -stateful feature.
    // The Skeleton is generated only when the user doesn't want
    // JUST the client code OR when the interface is stateful
    //if (emit != Arguments.Client || i.state () != null)
    //  factories.skeleton ().generate (symbolTable, i);
    if (emit != Arguments.Client)
      factories.skeleton ().generate (symbolTable, i);
  } // generateSkeleton

  /**
   * Generate a Stub when the user does not want just the server-side code.
   **/
  protected void generateStub ()
  {
    // <klr> According to Simon on 10/28/98, we should generate stubs for
    // abstract interfaces too.
    if (emit != Arguments.Server /* && !i.isAbstract () */)
      factories.stub ().generate (symbolTable, i);
  } // generateStub

  /**
   * Generate a Helper when the user does not want just the server-side code.
   **/
  protected void generateHelper ()
  {
    if (emit != Arguments.Server)
      factories.helper ().generate (symbolTable, i);
  } // generateHelper

  /**
   * Generate a Holder when the user does not want just the server-side code.
   **/
  protected void generateHolder ()
  {
    if (emit != Arguments.Server)
      factories.holder ().generate (symbolTable, i);
  } // generateHolder

  /**
   * Generate the interface. Provides general algorithm for binding generation:
   * 1.) Initialize members unique to this generator. - init ()
   * 2.) Open print stream - openStream ()
   * 3.) Write class heading (package, prologue, class statement, open curly - writeHeading ()
   * 4.) Write class body (member data and methods) - write*Body ()
   * 5.) Write class closing (close curly) - writeClosing ()
   * 6.) Close the print stream - closeStream ()
   *
   * For CORBA 2.3, interfaces are mapped to Operations and Signature
   * interfaces. The Operations interface contains the method definitions.
   * The Signature interface extends the Operations interface and adds
   * CORBA::Object. <klr>
   **/
  protected void generateInterface ()
  {
    init ();
    openStream ();
    if (stream == null)
      return;
    writeHeading ();
    if (intfType == OPERATIONS)
      writeOperationsBody ();
    if (intfType == SIGNATURE)
      writeSignatureBody ();
    writeClosing ();
    closeStream ();
  } // generateInterface

  /**
   *
   **/
  protected void openStream ()
  {
    if (i.isAbstract () || intfType == SIGNATURE)
       stream = Util.stream (i, ".java");
    else if (intfType == OPERATIONS)
       stream = Util.stream (i, "Operations.java");
  } // openStream

  /**
   *
   **/
  protected void writeHeading ()
  {
    Util.writePackage (stream, i, Util.TypeFile);
    Util.writeProlog (stream, ((GenFileStream)stream).name ());

    // Transfer interface comment to target <31jul1997>.
    if (i.comment () != null)
      i.comment ().generate ("", stream);

    String className = i.name ();
//  if (((Arguments)Compile.compiler.arguments).TIEServer)
//  {
//    // For the delegate model, don't make interface a subclass of CORBA.Object
//    stream.print ("public interface " + className);
//    boolean firstTime = true;
//    for (int ii = 0; ii < i.derivedFrom ().size (); ++ii)
//    {
//      SymtabEntry parent = (SymtabEntry)i.derivedFrom ().elementAt (ii);
//      if (!parent.fullName ().equals ("org/omg/CORBA/Object"))
//      {
//        if (firstTime)
//        {
//          firstTime = false;
//          stream.print (" extends ");
//        }
//        else
//          stream.print (", ");
//        stream.print (Util.javaName (parent));
//      }
//    }
//    if (i.derivedFrom ().size () > 0)
//      stream.print (", ");
//    stream.print ("org.omg.CORBA.portable.IDLEntity ");
//  }
//
//  else
//  {
      if (intfType == SIGNATURE)
         writeSignatureHeading ();
      else if (intfType == OPERATIONS)
         writeOperationsHeading ();
//  }

    stream.println ();
    stream.println ('{');
  } // writeHeading

  /**
   *
   **/
  protected void writeSignatureHeading ()
  {
    String className = i.name ();
    stream.print ("public interface " + className + " extends " + className + "Operations, ");
    boolean firstTime = true;
    boolean hasNonAbstractParent = false; // <d62310-klr>
    for (int k = 0; k < i.derivedFrom ().size (); ++k)
    {
      if (firstTime)
        firstTime = false;
      else
        stream.print (", ");
      InterfaceEntry parent = (InterfaceEntry)i.derivedFrom ().elementAt (k);
      stream.print (Util.javaName (parent));
      if (! parent.isAbstract ()) // <d62310-klr>
        hasNonAbstractParent = true; // <d62310-klr>
    }
    // <d62310-klr> - begin
    // If this interface extends only abstract interfaces,
    // it should extend both org.omg.CORBA.Object and IDLEntity.
    if (!hasNonAbstractParent) {
      stream.print (", org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity ");
    }
    else {
    // <d62310-klr> - end
        // extends IDLEntity if there's only one default parent - CORBA.Object
        if (i.derivedFrom ().size () == 1)
          stream.print (", org.omg.CORBA.portable.IDLEntity ");
    }
  } // writeSignatureHeading

  /**
   *
   **/
  protected void writeOperationsHeading ()
  {
    stream.print ("public interface " + i.name ());
    if ( !i.isAbstract ())
      stream.print ("Operations ");
    else {
        // <d60929> - base abstract interfaces extend AbstractBase
        // changed to IDLEntity by SCN per latest spec...
        if (i.derivedFrom ().size () == 0)
          stream.print (" extends org.omg.CORBA.portable.IDLEntity");
    }

    boolean firstTime = true;
    for (int k = 0; k < i.derivedFrom ().size (); ++k)
    {
      InterfaceEntry parent = (InterfaceEntry) i.derivedFrom ().elementAt (k);
      String parentName = Util.javaName (parent);

      // ignore the default parent - CORBA.Object
      if (parentName.equals ("org.omg.CORBA.Object"))
          continue;

      if (firstTime)
      {
        firstTime = false;
        stream.print (" extends ");
      }
      else
        stream.print (", ");

      // Don't append suffix Operations to the parents of abstract interface
      // or to the abstract parents of regular interface
      if (parent.isAbstract () || i.isAbstract ())
        stream.print (parentName);
      else
        stream.print (parentName + "Operations");
    }
  } // writeOperationsHeading


  /**
   *
   **/
  protected void writeOperationsBody ()
  {
    // Generate everything but constants
    Enumeration e = i.contained ().elements ();
    while (e.hasMoreElements ())
    {
      SymtabEntry contained = (SymtabEntry)e.nextElement ();
      if (contained instanceof MethodEntry)
      {
        MethodEntry element = (MethodEntry)contained;
        ((MethodGen)element.generator ()).interfaceMethod (symbolTable, element, stream);
      }
      else
        if ( !(contained instanceof ConstEntry))
          contained.generate (symbolTable, stream);
    }
  } // writeOperationsBody

  /**
   *
   **/
  protected void writeSignatureBody ()
  {
    // Generate only constants
    Enumeration e = i.contained ().elements ();
    while (e.hasMoreElements ())
    {
      SymtabEntry contained = (SymtabEntry)e.nextElement ();
      if (contained instanceof ConstEntry)
        contained.generate (symbolTable, stream);
    }
  } // writeSignatureBody

  /**
   *
   **/
  protected void writeClosing ()
  {
    String intfName = i.name ();
    if ( !i.isAbstract () && intfType == OPERATIONS)
      intfName = intfName + "Operations";
    stream.println ("} // interface " + intfName);
  } // writeClosing

  /**
   *
   **/
  protected void closeStream ()
  {
    stream.close ();
  } // closeStream

  ///////////////
  // From JavaGenerator

  // <f46082.51> Remove -stateful feature.
  /*
  public int helperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.state () != null && i.state ().size () > 0)
      index = structHelperType (index, indent, tcoffsets, name, entry, stream);
    else
    {
      tcoffsets.set (entry);
      if (entry.fullName ().equals ("org/omg/CORBA/Object"))
        stream.println (indent + name
            + " = org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_objref);");
      else
        stream.println (indent + name
            // <54697>
            //+ " = org.omg.CORBA.ORB.init ().create_interface_tc (_id, "
            + " = org.omg.CORBA.ORB.init ().create_interface_tc (" + Util.helperName (i, true) + ".id (), " // <d61056>
            + '\"' + Util.stripLeadingUnderscores (entry.name ()) + "\");");
    }
    return index;
  } // helperType
  */
  public int helperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    tcoffsets.set (entry);
    if (entry.fullName ().equals ("org/omg/CORBA/Object"))
      stream.println (indent + name
          + " = org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_objref);");
    else
      stream.println (indent + name
          // <54697>
          //+ " = org.omg.CORBA.ORB.init ().create_interface_tc (_id, "
          + " = org.omg.CORBA.ORB.init ().create_interface_tc (" + Util.helperName (i, true) + ".id (), " // <d61056>
          + '\"' + Util.stripLeadingUnderscores (entry.name ()) + "\");");
    return index;
  } // helperType

  public int type (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream) {
    stream.println (indent + name + " = " + Util.helperName (entry, true) + ".type ();"); // <d61056>
    return index;
  } // type

  // <f46082.51> Remove -stateful feature.
  /*
  public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.state () != null)
      structHelperRead (entryName, i, stream);
    else
    {
      if (i.isAbstract ())
         stream.println ("    return narrow (((org.omg.CORBA_2_3.portable.InputStream)istream).read_abstract_interface (_" + i.name () + "Stub.class));"); // <d60929>
      else
         stream.println ("    return narrow (istream.read_Object (_" + i.name () + "Stub.class));");
    }
  } // helperRead

  */
  public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.isAbstract ())
      stream.println ("    return narrow (((org.omg.CORBA_2_3.portable.InputStream)istream).read_abstract_interface (_" + i.name () + "Stub.class));"); // <d60929>
    else
      stream.println ("    return narrow (istream.read_Object (_" + i.name () + "Stub.class));");
  } // helperRead

  // <f46082.51> Remove -stateful feature.
  /*
  public void helperWrite (SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.state () != null)
      structHelperWrite (entry, stream);
    else
      write (0, "    ", "value", entry, stream);
  } // helperWrite
  */
  public void helperWrite (SymtabEntry entry, PrintWriter stream)
  {
    write (0, "    ", "value", entry, stream);
  } // helperWrite

  // <f46082.51> Remove -stateful feature.
  /*
  public int read (int index, String indent, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.state () != null)
      index = structRead (index, indent, name, i, stream);
    else
    {
      if (entry.fullName ().equals ("org/omg/CORBA/Object"))
        stream.println (indent + name + " = istream.read_Object (_" + i.name () + "Stub.class);");
      else
        stream.println (indent + name + " = " + Util.helperName (entry, false) + ".narrow (istream.read_Object (_" + i.name () + "Stub.class));"); // <d61056>
    }
    return index;
  } // read
  */
  public int read (int index, String indent, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (entry.fullName ().equals ("org/omg/CORBA/Object"))
      stream.println (indent + name + " = istream.read_Object (_" + i.name () + "Stub.class);");
    else
      stream.println (indent + name + " = " + Util.helperName (entry, false) + ".narrow (istream.read_Object (_" + i.name () + "Stub.class));"); // <d61056>
    return index;
  } // read

  // <f46082.51> Remove -stateful feature.
  /*
  public int write (int index, String indent, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.state () != null)
      index = structWrite (index, indent, name, entry, stream);
    else
    {
      if (i.isAbstract ())
         stream.println (indent + "((org.omg.CORBA_2_3.portable.OutputStream)ostream).write_abstract_interface ((java.lang.Object) " + name + ");"); // <d60929>
      else
         stream.println (indent + "ostream.write_Object ((org.omg.CORBA.Object) " + name + ");");
    }
    return index;
  } // write
  */
  public int write (int index, String indent, String name, SymtabEntry entry, PrintWriter stream)
  {
    InterfaceEntry i = (InterfaceEntry)entry;
    if (i.isAbstract ())
      stream.println (indent + "((org.omg.CORBA_2_3.portable.OutputStream)ostream).write_abstract_interface ((java.lang.Object) " + name + ");"); // <d60929>
    else
      stream.println (indent + "ostream.write_Object ((org.omg.CORBA.Object) " + name + ");");
    return index;
  } // write

  // <f46082.51> Remove -stateful feature.
  /*
  // These methods are cobbled from StructGen.  Stateful interfaces
  // are sent across the wire as if they were structs, with the first
  // element being a string - the Java name of the class.

  public int structHelperType (int index, String indent, TCOffsets tcoffsets, String name, SymtabEntry entry, PrintWriter stream)
  {
    TCOffsets innerOffsets = new TCOffsets ();
    innerOffsets.set (entry);
    int offsetForStruct = innerOffsets.currentOffset ();
    InterfaceEntry i = (InterfaceEntry)entry;
    String membersName = "_members" + index++;
    Vector state = i.state ();
    stream.println (indent + "org.omg.CORBA.StructMember[] " + membersName + " = new org.omg.CORBA.StructMember [" + (state.size () + 1) + "];");
    String tcOfMembers = "_tcOf" + membersName;
    stream.println (indent + "org.omg.CORBA.TypeCode " + tcOfMembers + ';');

    // The name string is the first element of the struct
    String memberName = "_name";
    StringEntry stringEntry = Compile.compiler.factory.stringEntry ();
    index = ((JavaGenerator)stringEntry.generator ()).helperType (index, indent, innerOffsets, tcOfMembers, stringEntry, stream);
    stream.println (indent + membersName + "[0] = new org.omg.CORBA.StructMember (");
    stream.println (indent + "  \"" + memberName + "\",");
    stream.println (indent + "  " + tcOfMembers + ',');
    stream.println (indent + "  null);");
    int offsetSoFar = innerOffsets.currentOffset ();
    innerOffsets = new TCOffsets ();
    innerOffsets.set (entry);
    innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForStruct);

    for (int idx = 0; idx < state.size (); ++idx)
    {
      TypedefEntry member = ((InterfaceState)state.elementAt (idx)).entry;
      memberName = member.name ();
      index = ((JavaGenerator)member.generator ()).helperType (index, indent, innerOffsets, tcOfMembers, member, stream);
      stream.println (indent + membersName + '[' + (idx + 1) + "] = new org.omg.CORBA.StructMember (");
      stream.println (indent + "  \"" + memberName + "\",");
      stream.println (indent + "  " + tcOfMembers + ',');
      stream.println (indent + "  null);");
      offsetSoFar = innerOffsets.currentOffset ();
      innerOffsets = new TCOffsets ();
      innerOffsets.set (entry);
      innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForStruct);
    }
    tcoffsets.bumpCurrentOffset (innerOffsets.currentOffset ());
    stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_struct_tc (id (), \"" + entry.name () + "\", " + membersName + ");");
    return index;
  } // structHelperType

  public void structHelperRead (String entryName, InterfaceEntry entry, PrintWriter stream)
  {
    String impl = implName ((InterfaceEntry)entry);
    stream.println ("      " + Util.javaStatefulName (entry) + " value = null;");
    structRead (0, "      ", "value", entry, stream);
    stream.println ("      return value;");
  } // structHelperRead

  private String implName (InterfaceEntry entry)
  {
    String name;
    if (entry.container ().name ().equals (""))
      name =  '_' + entry.name () + "Impl";
    else
      name = Util.containerFullName (entry.container ()) + "._" + entry.name () + "Impl";
    return name.replace ('/', '.');
  } // implName

  public int structRead (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream)
  {
    // The first element will be the name of the Java implementation class.
    String stringName = "_name" + index++;
    stream.println (indent + "String " + stringName + " = istream.read_string ();");
    stream.println (indent + "try");
    stream.println (indent + "{");
    stream.println (indent + "  " + name + " = (" + Util.javaStatefulName (entry) + ")com.sun.CORBA.iiop.ORB.getImpl (" + stringName + ".replace ('/', '.'));");
    stream.println (indent + "}");
    stream.println (indent + "catch (Exception e)");
    stream.println (indent + "{");
    stream.println (indent + "  " + name + " = null;");
    stream.println (indent + "}");
    stream.println (indent + "if (" + name + " == null)");
    stream.println (indent + "  throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
    stream.println ();

    stream.println (indent + "if (!" + stringName + ".equals (\"" + entry.fullName () + "\"))");
    stream.println (indent + '{');
    stream.println (indent + "  Class _cls = " + name + ".getClass ();");
    stream.println (indent + "  boolean _found = false;");
    stream.println (indent + "  while (!_found && _cls != null)");
    stream.println (indent + "  {");
    stream.println (indent + "    Class[] interfaces = _cls.getInterfaces ();");
    stream.println (indent + "    for (int i = 0; i < interfaces.length; ++i)");
    stream.println (indent + "      if (interfaces[i].getName ().indexOf (\"State\") > 0)");
    stream.println (indent + "      {");
    stream.println (indent + "        _cls = interfaces[i];");
    stream.println (indent + "        _found = true;");
    stream.println (indent + "        break;");
    stream.println (indent + "      }");
    stream.println (indent + "    if (!_found)");
    stream.println (indent + "      _cls = _cls.getSuperclass ();");
    stream.println (indent + "  }");
    stream.println (indent + "  if (_cls == null)");
    stream.println (indent + "    throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
    stream.println ();
    stream.println (indent + "  String _className = _cls.getName ();");
    stream.println (indent + "  int _index = _className.lastIndexOf ('.');");
    stream.println (indent + "  String _helperName = _className.substring (0, _index + 1) + _className.substring (_index + 2, _className.length () - 5) + \"Helper\"; // 5 == \"State\".length");
    stream.println (indent + "  try");
    stream.println (indent + "  {");
    stream.println (indent + "    Class _helperClass = Class.forName (_helperName);");
    stream.println (indent + "    Class[] _formalParms = new Class [1];");
    stream.println (indent + "    _formalParms[0] = Class.forName (\"org.omg.CORBA.portable.InputStream\");");
    stream.println (indent + "    java.lang.reflect.Method _read = _helperClass.getMethod (\"read\", _formalParms);");
    stream.println (indent + "    Object[] _actualParms = new Object [1];");
    stream.println (indent + "    _actualParms[0] = istream;");
    stream.println (indent + "      " + name + " = (" + Util.javaStatefulName (entry) + ")_read.invoke (null, _actualParms);");
    stream.println (indent + "  }");
    stream.println (indent + "  catch (Exception e)");
    stream.println (indent + "  {");
    stream.println (indent + "    throw new org.omg.CORBA.NO_IMPLEMENT (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
    stream.println (indent + "  }");
    stream.println (indent + '}');

    // instantiate an implementation
    stream.println (indent + "else");
    stream.println (indent + '{');

    // Load the state
    readState (index, indent, name, (InterfaceEntry)entry, stream);

    stream.println (indent + '}');
    return index;
  } // structRead

  private void readState (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream)
  {
    // First write the state from all parents
    Enumeration e = entry.derivedFrom ().elements ();
    while (e.hasMoreElements ())
    {
      InterfaceEntry parent = (InterfaceEntry)e.nextElement ();
      if (parent.state () != null)
      {
        if (parent.state ().size () > 0)
          readState (index, indent, name, parent, stream);
        break;
      }
    }

    // Now write the state for the local entry
    e = entry.state ().elements ();
    while (e.hasMoreElements ())
    {
      TypedefEntry member = ((InterfaceState)e.nextElement ()).entry;
      String tmpName = '_' + member.name () + "Tmp";
      Util.writeInitializer (indent + "  ", tmpName, "", member, stream);
      if (!member.arrayInfo ().isEmpty () || member.type () instanceof SequenceEntry || member.type () instanceof PrimitiveEntry || member.type () instanceof StringEntry)
        index = ((JavaGenerator)member.generator ()).read (index, indent + "  ", tmpName, member, stream);
      else
        stream.println (indent + "  " + tmpName + " = " + Util.helperName (member.type (), true) + ".read (istream);"); // <d61056>
      stream.println (indent + "  " + name + '.' + member.name () + " (" + tmpName + ");");
    }
  } // readState

  public void structHelperWrite (SymtabEntry entry, PrintWriter stream)
  {
    structWrite (0, "      ", "value", entry, stream);
  } // structHelperWrite

  public int structWrite (int index, String indent, String name, SymtabEntry entry, PrintWriter stream)
  {
    // The first element of the struct must be the name of the real interface.
    stream.println (indent + "Class _cls = " + name + ".getClass ();");
    stream.println (indent + "boolean _found = false;");
    stream.println (indent + "while (!_found && _cls != null)");
    stream.println (indent + "{");
    stream.println (indent + "  Class[] interfaces = _cls.getInterfaces ();");
    stream.println (indent + "  for (int i = 0; i < interfaces.length; ++i)");
    stream.println (indent + "    if (interfaces[i].getName ().indexOf (\"State\") > 0)");
    stream.println (indent + "    {");
    stream.println (indent + "      _cls = interfaces[i];");
    stream.println (indent + "      _found = true;");
    stream.println (indent + "      break;");
    stream.println (indent + "    }");
    stream.println (indent + "  if (!_found)");
    stream.println (indent + "    _cls = _cls.getSuperclass ();");
    stream.println (indent + '}');
    stream.println ();
    stream.println (indent + "if (_cls == null)");
    stream.println (indent + "  throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
    stream.println ();
    stream.println (indent + "String _className = _cls.getName ();");
    stream.println (indent + "int _index = _className.lastIndexOf ('.');");
    stream.println (indent + "String _interfaceName = _className.substring (0, _index + 1) + _className.substring (_index + 2, _className.length () - 5); // 5 == \"State\".length");
    stream.println (indent + "ostream.write_string (_interfaceName.replace ('.', '/'));");

    // If _className != Util.javaName (entry), then call that class's helper class.
    stream.println ();
    stream.println (indent + "if (!_interfaceName.equals (\"" + Util.javaName (entry) + "\"))");
    stream.println (indent + '{');
    stream.println (indent + "  try");
    stream.println (indent + "  {");
    stream.println (indent + "    Class _helperClass = Class.forName (_interfaceName + \"Helper\");");
    stream.println (indent + "    Class[] _formalParms = new Class [2];");
    stream.println (indent + "    _formalParms[0] = Class.forName (\"org.omg.CORBA.portable.OutputStream\");");
    stream.println (indent + "    _formalParms[1] = _cls;");
    stream.println (indent + "    java.lang.reflect.Method _write = _helperClass.getMethod (\"write\", _formalParms);");
    stream.println (indent + "    Object[] _actualParms = new Object [2];");
    stream.println (indent + "    _actualParms[0] = ostream;");
    stream.println (indent + "    _actualParms[1] = " + name + ';');
    stream.println (indent + "    _write.invoke (null, _actualParms);");
    stream.println (indent + "  }");
    stream.println (indent + "  catch (Exception e)");
    stream.println (indent + "  {");
    stream.println (indent + "    throw new org.omg.CORBA.MARSHAL (0, org.omg.CORBA.CompletionStatus.COMPLETED_NO);");
    stream.println (indent + "  }");
    stream.println (indent + '}');

    stream.println (indent + "else");
    stream.println (indent + '{');

    writeState (index, indent, name, (InterfaceEntry)entry, stream);

    stream.println (indent + '}');
    return index;
  } // structWrite

  private void writeState (int index, String indent, String name, InterfaceEntry entry, PrintWriter stream)
  {
    // First write the state from all parents
    Enumeration e = entry.derivedFrom ().elements ();
    while (e.hasMoreElements ())
    {
      InterfaceEntry parent = (InterfaceEntry)e.nextElement ();
      if (parent.state () != null)
      {
        if (parent.state ().size () > 0)
          writeState (index, indent, name, parent, stream);
        break;
      }
    }

    // Now write the state for the local entry
    Vector members = entry.state ();
    for (int i = 0; i < members.size (); ++i)
    {
      TypedefEntry member = ((InterfaceState)members.elementAt (i)).entry;
      if (!member.arrayInfo ().isEmpty () || member.type () instanceof SequenceEntry || member.type () instanceof PrimitiveEntry || member.type () instanceof StringEntry)
        index = ((JavaGenerator)member.generator ()).write (index, indent + "  ", name + '.' + member.name () + "()", member, stream);
      else
        stream.println (indent + "  " + Util.helperName (member.type (), true) + ".write (ostream, " + name + '.' + member.name () + " ());"); // <d61056>
    }
  } // writeState
  */

  /**
   * @return true if the entry is for a CORBA pseudo-object.
   **/
  private boolean isPseudo(InterfaceEntry i) {
    java.lang.String fullname = i.fullName();
    if (fullname.equalsIgnoreCase("CORBA/TypeCode"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/Principal"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/ORB"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/Any"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/Context"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/ContextList"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/DynamicImplementation"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/Environment"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/ExceptionList"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/NVList"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/NamedValue"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/Request"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/ServerRequest"))
        return true;
    if (fullname.equalsIgnoreCase("CORBA/UserException"))
        return true;
    return false;
  }

  // From JavaGenerator
  ///////////////

  protected int            emit        = 0;
  protected Factories      factories   = null;

  protected Hashtable      symbolTable = null;
  protected InterfaceEntry i           = null;
  protected PrintWriter    stream      = null;

  // <f46082.03, f46838.1/.2/.3> Modify access to protected.
  protected static final   int SIGNATURE  = 1;
  protected static final   int OPERATIONS = 2;
  protected                int intfType   = 0;
} // class InterfaceGen

Other Java examples (source code examples)

Here is a short list of links related to this Java InterfaceGen.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.