maguro      2005/03/07 23:08:33

  Added:       modules/core/src/java/org/openejb/corba/proxy
                        CORBAProxyReference.java StubGenerator.java
  Log:

  Intermediate CORBA checkin.
  
  Revision  Changes    Path
  1.1                  
openejb/modules/core/src/java/org/openejb/corba/proxy/CORBAProxyReference.java
  
  Index: CORBAProxyReference.java
  ===================================================================
  /* ====================================================================
   * Redistribution and use of this software and associated documentation
   * ("Software"), with or without modification, are permitted provided
   * that the following conditions are met:
   *
   * 1. Redistributions of source code must retain copyright
   *    statements and notices.  Redistributions must also contain a
   *    copy of this document.
   *
   * 2. Redistributions in binary form must reproduce this list of
   *    conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The name "OpenEJB" must not be used to endorse or promote
   *    products derived from this Software without prior written
   *    permission of The OpenEJB Group.  For written permission,
   *    please contact [EMAIL PROTECTED]
   *
   * 4. Products derived from this Software may not be called "OpenEJB"
   *    nor may "OpenEJB" appear in their names without prior written
   *    permission of The OpenEJB Group. OpenEJB is a registered
   *    trademark of The OpenEJB Group.
   *
   * 5. Due credit should be given to the OpenEJB Project
   *    (http://openejb.org/).
   *
   * THIS SOFTWARE IS PROVIDED BY THE OPENEJB GROUP AND CONTRIBUTORS
   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   * THE OPENEJB GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the OpenEJB Project.  For more information
   * please see <http://openejb.org/>.
   *
   * ====================================================================
   */
  package org.openejb.corba.proxy;
  
  import java.net.URI;
  import javax.management.MalformedObjectNameException;
  import javax.management.ObjectName;
  
  import org.apache.geronimo.kernel.Kernel;
  import org.apache.geronimo.naming.reference.SimpleAwareReference;
  
  
  /**
   * @version $Revision: 1.1 $ $Date: 2005/03/08 04:08:33 $
   */
  public final class CORBAProxyReference extends SimpleAwareReference {
  
      private final URI nsCorbaloc;
      private final String objectName;
      private final ObjectName containerName;
      private final String home;
  
      public CORBAProxyReference(URI corbaURL, String objectName, ObjectName 
containerName, String home) {
          this.nsCorbaloc = corbaURL;
          this.objectName = objectName;
          this.containerName = containerName;
          this.home = home;
      }
  
      public String getClassName() {
          return home;
      }
  
      public Object getContent() {
          Kernel kernel = getKernel();
  
          Object proxy = null;
          try {
              proxy = kernel.invoke(containerName, "getHome", new 
Object[]{nsCorbaloc, objectName}, new String[]{URI.class.getName(), 
String.class.getName()});
          } catch (Exception e) {
              throw (IllegalStateException) new IllegalStateException("Could 
not get proxy").initCause(e);
          }
          if (proxy == null) {
              throw new IllegalStateException("Proxy not returned. Target " + 
containerName + " not started");
          }
          if (!org.omg.CORBA.Object.class.isAssignableFrom(proxy.getClass())) {
              throw new ClassCastException("Proxy not an instance of expected 
class org.omg.CORBA.Object");
          }
          return proxy;
      }
  }
  
  
  
  1.1                  
openejb/modules/core/src/java/org/openejb/corba/proxy/StubGenerator.java
  
  Index: StubGenerator.java
  ===================================================================
  /*
  * Copyright (C) The Community OpenORB Project. All rights reserved.
  *
  * This software is published under the terms of The OpenORB Community Software
  * License version 1.0, a copy of which has been included with this 
distribution
  * in the LICENSE.txt file.
  */
  
  package org.openejb.corba.proxy;
  
  import java.io.File;
  import java.io.PrintWriter;
  
  import org.openorb.compiler.CompilerHost;
  import org.openorb.compiler.object.IdlFactoryMember;
  import org.openorb.compiler.object.IdlFixed;
  import org.openorb.compiler.object.IdlIdent;
  import org.openorb.compiler.object.IdlInterface;
  import org.openorb.compiler.object.IdlObject;
  import org.openorb.compiler.object.IdlSimple;
  import org.openorb.compiler.object.IdlUnion;
  import org.openorb.compiler.object.IdlUnionMember;
  import org.openorb.compiler.object.IdlValue;
  import org.openorb.compiler.object.IdlValueBox;
  import org.openorb.compiler.parser.IdlType;
  import org.openorb.compiler.parser.Token;
  import org.openorb.compiler.rmi.RmiCompilerProperties;
  import org.openorb.compiler.rmi.generator.Javatoidl;
  
  
  /**
   * This class takes an IDL graph and generates its IDL description.
   *
   * @author Jerome Daniel
   */
  public class StubGenerator extends Javatoidl {
      /**
       * Constructor
       */
      public StubGenerator(RmiCompilerProperties rcp, CompilerHost ch) {
          super(rcp, ch);
      }
  
      public void translate_object(IdlObject obj) {
          java.io.File writeInto = createDirectory("", m_cp.getM_destdir());
  
          obj.reset();
  
          while (obj.end() != true) {
              java.io.File tmpInto = writeInto;
  
              if (obj.current().included() == false) {
                  String old_pkg = current_pkg;
  
                  if (m_cp.getM_usePrefix()) {
                      if ((obj.current().getPrefix() != null) && (obj.kind() == 
IdlType.e_root)) {
                          tmpInto = 
createPrefixDirectories(obj.current().getPrefix(), writeInto);
  
                          if (m_cp.getM_reversePrefix())
                              addToPkg(obj, 
inversedPrefix(obj.current().getPrefix()));
                          else
                              addToPkg(obj, obj.current().getPrefix());
                      }
                  }
  
                  if (obj.current().kind() == IdlType.e_interface) {
                      translate_interface(obj, tmpInto);
                  }
  
                  current_pkg = old_pkg;
              }
  
              obj.next();
          }
      }
  
      /**
       * Add a Helper for a data type
       *
       * @param obj the object to translate
       */
      public void translate_interface(IdlObject obj, File dest_dir) {
  
          PrintWriter output = newFile(dest_dir, obj.name() + "Helper");
          boolean real_corba_object = false;
          boolean abstract_object = false;
  
          if (current_pkg != null) {
              if (current_pkg.equals("generated")) {
                  if (m_cp.getM_use_package() == true) {
                      output.println("package " + current_pkg + ";");
                      output.println("");
                  }
              } else if (!current_pkg.equals("")) {
                  output.println("package " + current_pkg + ";");
                  output.println("");
              }
          }
  
          output.println("/** ");
          output.println(" * Helper class for : " + obj.name());
          output.println(" *  ");
          output.println(" * @author OpenORB Compiler");
          output.println(" */ ");
  
          // Define the Helper class
          if (obj.kind() == IdlType.e_value_box)
              output.println("public class " + obj.name() + "Helper implements 
org.omg.CORBA.portable.BoxedValueHelper");
          else
              output.println("public class " + obj.name() + "Helper");
  
          output.println("{");
  
          switch (final_kind(obj)) {
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
  
              case IdlType.e_sequence:
  
              case IdlType.e_array:
  
              case IdlType.e_fixed:
                  output.println(tab + "/** extract_X methods found for the 
current ORBs Any type. */");
                  output.println(tab + "private static java.lang.Object [] 
_extractMethods;");
                  output.println(tab + "");
                  output.println(tab + "static");
                  output.println(tab + "{");
                  output.println(tab2 + "try");
                  output.println(tab2 + "{");
                  output.println(tab3 + "Class clz = 
Thread.currentThread().getContextClassLoader().loadClass( 
\"org.openorb.orb.core.Any\" );");
                  output.println(tab3 + "java.lang.reflect.Method meth = 
clz.getMethod( \"extract_Streamable\", null );");
                  output.println(tab3 + "_extractMethods = new 
java.lang.Object[] { clz, meth };");
                  output.println(tab2 + "}");
                  output.println(tab2 + "catch ( Exception ex )");
                  output.println(tab2 + "{");
                  output.println(tab3 + "// do nothing");
                  output.println(tab2 + "}");
                  output.println(tab2 + "");
                  output.println(tab2 + "if ( _extractMethods == null )");
                  output.println(tab2 + "{");
                  output.println(tab3 + "_extractMethods = new 
java.lang.Object[ 0 ];");
                  output.println(tab2 + "}");
                  output.println(tab + "}");
                  output.println();
                  output.println(tab + "private static java.lang.reflect.Method 
getExtract( Class clz )");
                  output.println(tab + "{");
                  output.println(tab2 + "int len = _extractMethods.length;");
                  output.println(tab2 + "for ( int i = 0; i < len; i += 2 )");
                  output.println(tab2 + "{");
                  output.println(tab3 + "if ( clz.equals( _extractMethods[ i ] 
) )");
                  output.println(tab3 + "{");
                  output.println(tab4 + "return ( java.lang.reflect.Method ) 
_extractMethods[ i + 1 ];");
                  output.println(tab3 + "}");
                  output.println(tab2 + "}");
                  output.println(tab2 + "");
                  output.println(tab2 + "// unknown class, look for method.");
                  output.println(tab2 + "synchronized ( org.omg.CORBA.Any.class 
)");
                  output.println(tab2 + "{");
                  output.println(tab3 + "for ( int i = len; i < 
_extractMethods.length; i += 2 )");
                  output.println(tab3 + "{");
                  output.println(tab4 + "if ( clz.equals( _extractMethods[ i ] 
) )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "return ( java.lang.reflect.Method ) 
_extractMethods[ i + 1 ];");
                  output.println(tab4 + "}");
                  output.println(tab3 + "}");
                  output.println(tab3 + "");
                  output.println(tab3 + "java.lang.Object [] tmp = new 
java.lang.Object[ _extractMethods.length + 2 ];");
                  output.println(tab3 + "System.arraycopy( _extractMethods, 0, 
tmp, 0, _extractMethods.length );");
                  output.println(tab3 + "tmp[ _extractMethods.length ] = clz;");
                  output.println(tab3 + "try");
                  output.println(tab3 + "{");
                  output.println(tab4 + "tmp[ _extractMethods.length + 1 ] = 
clz.getMethod( \"extract_Streamable\", null );");
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( Exception ex )");
                  output.println(tab3 + "{");
                  output.println(tab4 + "// do nothing");
                  output.println(tab3 + "}");
                  output.println(tab3 + "_extractMethods = tmp;");
                  output.println(tab3 + "return ( java.lang.reflect.Method 
)_extractMethods[ _extractMethods.length - 1 ];");
                  output.println(tab2 + "}");
                  output.println(tab + "}");
  
          }
  
          // The method  insert
          output.println(tab + "/**");
  
          output.println(tab + " * Insert " + obj.name() + " into an any");
  
          output.println(tab + " * @param a an any");
  
          output.println(tab + " * @param t " + obj.name() + " value");
  
          output.println(tab + " */");
  
          output.print(tab + "public static void insert(org.omg.CORBA.Any a, ");
  
          translate_type(obj, output);
  
          output.println(" t)");
  
          output.println(tab + "{");
  
          switch (final_kind(obj)) {
  
              case IdlType.e_interface:
  
                  output.println(tab2 + "if ( t instanceof org.omg.CORBA.Object 
)");
                  output.println(tab3 + "a.insert_Object( ( 
org.omg.CORBA.Object ) t , type() );");
                  output.println(tab2 + "else if(t instanceof 
java.io.Serializable)");
                  output.println(tab3 + 
"a.insert_Value((java.io.Serializable)t, type());");
                  output.println(tab2 + "else");
                  output.println(tab3 + "throw new org.omg.CORBA.BAD_PARAM();");
  
                  break;
  
              case IdlType.e_value:
  
              case IdlType.e_value_box:
                  output.println(tab2 + "a.insert_Value(t, type());");
  
                  break;
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
                  output.print(tab2 + "a.insert_Streamable(new ");
  
                  translate_type(obj, output);
  
                  output.println("Holder(t));");
  
                  break;
  
              case IdlType.e_sequence:
  
              case IdlType.e_array:
  
              case IdlType.e_fixed:
                  output.println(tab2 + "a.insert_Streamable(new " + 
fullname(obj) + "Holder(t));");
  
                  break;
  
              default:
                  output.println(tab2 + "a.type(type());");
  
                  output.println(tab2 + "write(a.create_output_stream(),t);");
          }
  
          output.println(tab + "}");
          output.println("");
  
          // The method  extract
          output.println(tab + "/**");
          output.println(tab + " * Extract " + obj.name() + " from an any");
          output.println(tab + " *");
          output.println(tab + " * @param a an any");
          output.println(tab + " * @return the extracted " + obj.name() + " 
value");
          output.println(tab + " */");
          output.print(tab + "public static ");
  
          translate_type(obj, output);
  
          output.println(" extract( org.omg.CORBA.Any a )");
          output.println(tab + "{");
          output.println(tab2 + "if ( !a.type().equivalent( type() ) )");
          output.println(tab2 + "{");
          output.println(tab3 + "throw new org.omg.CORBA.MARSHAL();");
          output.println(tab2 + "}");
  
          switch (final_kind(obj)) {
  
              case IdlType.e_interface:
                  output.println(tab2 + "try");
                  output.println(tab2 + "{");
                  output.print(tab3 + "return ");
                  translate_type(obj, output);
                  output.println("Helper.narrow( a.extract_Object() );");
                  output.println(tab2 + "}");
                  output.println(tab2 + "catch ( final org.omg.CORBA.BAD_PARAM 
e )");
                  output.println(tab2 + "{");
  
                  writeThrowException(output, tab3, "org.omg.CORBA.MARSHAL", 
"e.getMessage()", "e");
  
                  output.println(tab2 + "}");
  
                  if (!((IdlInterface) final_type(obj)).abstract_interface())
                      break;
  
                  output.println(tab2 + "catch ( org.omg.CORBA.BAD_OPERATION ex 
)");
                  output.println(tab2 + "{");
                  output.println(tab3 + "// do nothing");
                  output.println(tab2 + "}");
  
                  // fallthrough
  
              case IdlType.e_value:
  
              case IdlType.e_value_box:
                  output.println(tab2 + "try");
                  output.println(tab2 + "{");
  
                  output.print(tab3 + "return (");
  
                  translate_type(obj, output);
  
                  output.println(") a.extract_Value();");
  
                  output.println(tab2 + "}");
  
                  output.println(tab2 + "catch ( final ClassCastException e )");
                  output.println(tab2 + "{");
  
  
                  writeThrowException(output, tab3, "org.omg.CORBA.MARSHAL", 
"e.getMessage()", "e");
  
                  output.println(tab2 + "}");
  
                  break;
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
                  output.println(tab3 + "// streamable extraction. The jdk 
stubs incorrectly define the Any stub");
                  output.println(tab2 + "java.lang.reflect.Method meth = 
getExtract( a.getClass() );");
                  output.println(tab2 + "if ( meth != null )");
                  output.println(tab2 + "{");
                  output.println(tab3 + "try");
                  output.println(tab3 + "{");
                  output.println(tab4 + "org.omg.CORBA.portable.Streamable s 
=");
                  output.println(tab5 + "( org.omg.CORBA.portable.Streamable ) 
meth.invoke( a, null );");
  
                  output.print(tab4 + "if ( s instanceof ");
                  translate_type(obj, output);
                  output.println("Holder )");
                  output.print(tab5 + "return ( ( ");
                  translate_type(obj, output);
                  output.println("Holder ) s ).value;");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final IllegalAccessException e 
)");
                  output.println(tab3 + "{");
  
                  writeThrowException(output, tab4, "org.omg.CORBA.INTERNAL", 
"e.toString()", "e");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final IllegalArgumentException 
e )");
                  output.println(tab3 + "{");
  
                  writeThrowException(output, tab4, "org.omg.CORBA.INTERNAL", 
"e.toString()", "e");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final 
java.lang.reflect.InvocationTargetException e )");
                  output.println(tab3 + "{");
                  output.println(tab4 + "Throwable rex = 
e.getTargetException();");
                  output.println(tab4 + "if ( rex instanceof 
org.omg.CORBA.BAD_INV_ORDER )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "// do nothing");
                  output.println(tab4 + "}");
                  output.println(tab4 + "else if ( rex instanceof Error )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "throw ( Error ) rex;");
                  output.println(tab4 + "}");
                  output.println(tab4 + "else if ( rex instanceof 
RuntimeException )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "throw ( RuntimeException ) rex;");
                  output.println(tab4 + "}");
                  output.println(tab4 + "else");
                  output.println(tab4 + "{");
  
  //                writeThrowException(output, tab5, "org.omg.CORBA.INTERNAL", 
"rex.toString()", "rex");
  
                  output.println(tab4 + "}");
  
                  output.println(tab3 + "}");
  
                  output.print(tab3 + "");
                  translate_type(obj, output);
                  output.print("Holder h = new ");
                  translate_type(obj, output);
                  output.println("Holder( read( a.create_input_stream() ) );");
                  output.println(tab3 + "a.insert_Streamable( h );");
                  output.println(tab3 + "return h.value;");
                  output.println(tab2 + "}");
                  output.println(tab2 + "return read( a.create_input_stream() 
);");
                  break;
  
              case IdlType.e_sequence:
  
              case IdlType.e_array:
  
              case IdlType.e_fixed:
                  output.println(tab2 + "// streamable extraction. The jdk 
stubs incorrectly define the Any stub");
                  output.println(tab2 + "java.lang.reflect.Method meth = 
getExtract( a.getClass() );");
                  output.println(tab2 + "if ( meth != null )");
                  output.println(tab2 + "{");
                  output.println(tab3 + "try");
                  output.println(tab3 + "{");
                  output.println(tab4 + "org.omg.CORBA.portable.Streamable s ");
                  output.println(tab5 + "= ( org.omg.CORBA.portable.Streamable 
) meth.invoke( a, null );");
  
  
                  output.println(tab4 + "if ( s instanceof " + fullname(obj) + 
"Holder )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "return ( ( " + fullname(obj) + "Holder 
) s ).value;");
                  output.println(tab4 + "}");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final IllegalAccessException e 
)");
                  output.println(tab3 + "{");
  
                  writeThrowException(output, tab4, "org.omg.CORBA.INTERNAL", 
"e.toString()", "e");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final IllegalArgumentException 
e )");
                  output.println(tab3 + "{");
  
                  writeThrowException(output, tab4, "org.omg.CORBA.INTERNAL", 
"e.toString()", "e");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "catch ( final 
java.lang.reflect.InvocationTargetException e )");
                  output.println(tab3 + "{");
                  output.println(tab4 + "final Throwable rex = 
e.getTargetException();");
                  output.println(tab4 + "if ( rex instanceof 
org.omg.CORBA.BAD_INV_ORDER )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "// do nothing");
                  output.println(tab4 + "}");
                  output.println(tab4 + "else if ( rex instanceof Error )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "throw ( Error ) rex;");
                  output.println(tab4 + "}");
                  output.println(tab4 + "else if ( rex instanceof 
RuntimeException )");
                  output.println(tab4 + "{");
                  output.println(tab5 + "throw ( RuntimeException ) rex;");
                  output.println(tab4 + "}");
  
  //                writeThrowException(output, tab4, "org.omg.CORBA.INTERNAL", 
"rex.toString()", "rex");
  
                  output.println(tab3 + "}");
                  output.println(tab3 + "" + fullname(obj) + "Holder h = new " 
+ fullname(obj) + "Holder( read( a.create_input_stream() ) );");
                  output.println(tab3 + "a.insert_Streamable( h );");
                  output.println(tab3 + "return h.value;");
                  output.println(tab2 + "}");
                  output.println(tab2 + "return read( a.create_input_stream() 
);");
                  break;
  
              default:
                  output.println(tab2 + "return read( a.create_input_stream() 
);");
          }
  
          output.println(tab + "}");
          output.println("");
  
          // The method static _tc
          output.println(tab + "//");
          output.println(tab + "// Internal TypeCode value");
          output.println(tab + "//");
          output.println(tab + "private static org.omg.CORBA.TypeCode _tc = 
null;");
  
          switch (final_kind(obj)) {
  
              case IdlType.e_value:
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
                  output.println(tab + "private static boolean _working = 
false;");
          }
  
          output.println("");
  
          // The method type
          output.println(tab + "/**");
          output.println(tab + " * Return the " + obj.name() + " TypeCode");
          output.println(tab + " * @return a TypeCode");
          output.println(tab + " */");
          output.println(tab + "public static org.omg.CORBA.TypeCode type()");
          output.println(tab + "{");
          output.println(tab2 + "if (_tc == null) {");
  
          switch (final_kind(obj)) {
  
              case IdlType.e_value:
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
                  output.println(tab3 + 
"synchronized(org.omg.CORBA.TypeCode.class) {");
                  output.println(tab4 + "if (_tc != null)");
                  output.println(tab5 + "return _tc;");
                  output.println(tab4 + "if (_working)");
                  output.println(tab5 + "return 
org.omg.CORBA.ORB.init().create_recursive_tc(id());");
                  output.println(tab4 + "_working = true;");
          }
  
          translate_new_typecode(obj, output);
  
          switch (final_kind(obj)) {
  
              case IdlType.e_value:
  
              case IdlType.e_struct:
  
              case IdlType.e_union:
  
              case IdlType.e_exception:
                  output.println(tab4 + "_working = false;");
                  output.println(tab3 + "}");
          }
  
          output.println(tab2 + "}");
          output.println(tab2 + "return _tc;");
          output.println(tab + "}");
          output.println("");
  
          // The method id
          output.println(tab + "/**");
          output.println(tab + " * Return the " + obj.name() + " IDL ID");
          output.println(tab + " * @return an ID");
          output.println(tab + " */");
          output.println(tab + "public static String id()");
          output.println(tab + "{");
          output.println(tab2 + "return _id;");
          output.println(tab + "}");
          output.println("");
          output.println(tab + "private final static String _id = \"" + 
obj.getId() + "\";");
          output.println("");
  
          // The method read
          output.println(tab + "/**");
          output.println(tab + " * Read " + obj.name() + " from a marshalled 
stream");
          output.println(tab + " * @param istream the input stream");
          output.println(tab + " * @return the readed " + obj.name() + " 
value");
          output.println(tab + " */");
          output.print(tab + "public static ");
  
          translate_type(obj, output);
  
          output.println(" read(org.omg.CORBA.portable.InputStream istream)");
          output.println(tab + "{");
  
          if (final_kind(obj) == IdlType.e_value_box) {
              output.print(tab2 + "return (");
  
              translate_type(final_type(obj), output);
  
              output.println(") 
((org.omg.CORBA_2_3.portable.InputStream)istream).read_value(new " + 
fullname(final_type(obj)) + "Helper());");
          } else if (final_kind(obj) == IdlType.e_forward_interface) {
              if ((((IdlInterface) 
final_type(obj)).getInterface().local_interface()) || (m_cp.getM_pidl()))
                  output.println(tab2 + "throw new org.omg.CORBA.MARSHAL();");
              else
                  translate_unmarshalling(obj, output, "istream");
          } else if (final_kind(obj) == IdlType.e_interface) {
              if ((((IdlInterface) final_type(obj)).local_interface()) || 
(m_cp.getM_pidl()))
                  output.println(tab2 + "throw new org.omg.CORBA.MARSHAL();");
              else
                  translate_unmarshalling(obj, output, "istream");
          } else if (final_kind(obj) == IdlType.e_fixed) {
              output.println(tab2 + "java.math.BigDecimal _f = 
istream.read_fixed();");
  
              if (((IdlFixed) final_type(obj)).scale() != 0)
                  output.println(tab2 + "return _f.movePointLeft(" + 
((IdlFixed) final_type(obj)).scale() + ");");
              else
                  output.println(tab2 + "return _f;");
          } else if ((obj.kind() == IdlType.e_typedef) &&
                     (final_kind(obj) != IdlType.e_sequence) &&
                     (final_kind(obj) != IdlType.e_array) &&
                     (final_kind(obj) != IdlType.e_string) &&
                     (final_kind(obj) != IdlType.e_wstring) &&
                     (final_kind(obj) != IdlType.e_simple)) {
              output.print(tab2 + "return ");
  
              translate_type(final_type(obj), output);
  
              output.println("Helper.read(istream);");
          } else
              translate_unmarshalling(obj, output, "istream");
  
          output.println(tab + "}");
  
          output.println("");
  
          // La fonction write
          output.println(tab + "/**");
  
          output.println(tab + " * Write " + obj.name() + " into a marshalled 
stream");
  
          output.println(tab + " * @param ostream the output stream");
  
          output.println(tab + " * @param value " + obj.name() + " value");
  
          output.println(tab + " */");
  
          output.print(tab + "public static void 
write(org.omg.CORBA.portable.OutputStream ostream, ");
  
          translate_type(obj, output);
  
          output.println(" value)");
  
          output.println(tab + "{");
  
          if (final_kind(obj) == IdlType.e_value_box) {
              output.println(tab2 + 
"((org.omg.CORBA_2_3.portable.OutputStream)ostream).write_value(value, new " + 
fullname(final_type(obj)) + "Helper());");
          } else if (final_kind(obj) == IdlType.e_interface) {
              if ((((IdlInterface) final_type(obj)).local_interface()) || 
(m_cp.getM_pidl()))
                  output.println(tab2 + "throw new org.omg.CORBA.MARSHAL();");
              else
                  translate_marshalling(obj, output, "ostream", "value");
          } else if (final_kind(obj) == IdlType.e_fixed) {
              if (((IdlFixed) final_type(obj)).scale() != 0) {
                  output.println(tab2 + "if (value.scale() != " + ((IdlFixed) 
final_type(obj)).scale() + ")");
                  output.println(tab3 + "throw new 
org.omg.CORBA.DATA_CONVERSION();");
              }
  
              output.println(tab2 + "ostream.write_fixed(value);");
          } else if ((obj.kind() == IdlType.e_typedef) &&
                     (final_kind(obj) != IdlType.e_sequence) &&
                     (final_kind(obj) != IdlType.e_array) &&
                     (final_kind(obj) != IdlType.e_string) &&
                     (final_kind(obj) != IdlType.e_wstring) &&
                     (final_kind(obj) != IdlType.e_simple)) {
              output.print(tab2 + "");
  
              translate_type(final_type(obj), output);
  
              output.println("Helper.write(ostream, value);");
          } else
              translate_marshalling(obj, output, "ostream", "value");
  
          output.println(tab + "}");
  
          output.println("");
  
          // The narrow function
          if (obj.kind() == IdlType.e_interface) {
  
              if (((IdlInterface) obj).abstract_interface())
                  abstract_object = true;
              else
                  real_corba_object = true;
  
              if (isAbstractBaseInterface(obj))
                  abstract_object = true;
  
              if (abstract_object) {
                  output.println(tab + "/**");
                  output.println(tab + " * Narrow CORBA::Object to " + 
obj.name());
                  output.println(tab + " * @param obj the abstract Object");
                  output.println(tab + " * @return " + obj.name() + " Object");
                  output.println(tab + " */");
                  output.println(tab + "public static " + obj.name() + " 
narrow(Object obj)");
                  output.println(tab + "{");
                  output.println(tab2 + "if (obj == null)");
                  output.println(tab3 + "return null;");
                  output.println(tab2 + "if (obj instanceof " + obj.name() + 
")");
                  output.println(tab3 + "return (" + obj.name() + ")obj;");
  
                  if (!m_cp.getM_pidl() && !((IdlInterface) 
obj).local_interface()) {
                      output.println();
                      output.println(tab2 + "if (obj instanceof 
org.omg.CORBA.portable.ObjectImpl) {");
                      output.println(tab3 + "org.omg.CORBA.portable.ObjectImpl 
objimpl = (org.omg.CORBA.portable.ObjectImpl)obj;");
                      output.println(tab3 + "if (objimpl._is_a(id())) {");
                      output.println(tab4 + "_" + obj.name() + "_Stub stub = 
new _" + obj.name() + "_Stub();");
                      output.println(tab4 + 
"stub._set_delegate(objimpl._get_delegate());");
                      output.println(tab4 + "return stub;");
                      output.println(tab3 + "}");
                      output.println(tab2 + "}");
                      output.println();
                  }
  
                  output.println("");
                  output.println(tab2 + "throw new org.omg.CORBA.BAD_PARAM();");
                  output.println(tab + "}");
                  output.println("");
  
                  // Unchecked narrow
                  output.println(tab + "/**");
                  output.println(tab + " * Unchecked Narrow CORBA::Object to " 
+ obj.name());
                  output.println(tab + " * @param obj the abstract Object");
                  output.println(tab + " * @return " + obj.name() + " Object");
                  output.println(tab + " */");
                  output.println(tab + "public static " + obj.name() + " 
unchecked_narrow(Object obj)");
                  output.println(tab + "{");
                  output.println(tab2 + "if (obj == null)");
                  output.println(tab3 + "return null;");
                  output.println(tab2 + "if (obj instanceof " + obj.name() + 
")");
                  output.println(tab3 + "return (" + obj.name() + ")obj;");
  
                  if (!m_cp.getM_pidl() && !((IdlInterface) 
obj).local_interface()) {
                      output.println();
                      output.println(tab2 + "if (obj instanceof 
org.omg.CORBA.portable.ObjectImpl) {");
                      output.println(tab3 + "org.omg.CORBA.portable.ObjectImpl 
objimpl = (org.omg.CORBA.portable.ObjectImpl)obj;");
                      output.println(tab3 + "_" + obj.name() + "_Stub stub = 
new _" + obj.name() + "_Stub();");
                      output.println(tab3 + 
"stub._set_delegate(objimpl._get_delegate());");
                      output.println(tab3 + "return stub;");
                      output.println(tab2 + "}");
                      output.println();
                  }
  
                  output.println("");
                  output.println(tab2 + "throw new org.omg.CORBA.BAD_PARAM();");
                  output.println(tab + "}");
                  output.println("");
              }
  
              if (real_corba_object) {
                  output.println(tab + "/**");
                  output.println(tab + " * Narrow CORBA::Object to " + 
obj.name());
                  output.println(tab + " * @param obj the CORBA Object");
                  output.println(tab + " * @return " + obj.name() + " Object");
                  output.println(tab + " */");
  
                  if (!m_cp.getM_pidl())
                      output.println(tab + "public static " + obj.name() + " 
narrow(org.omg.CORBA.Object obj)");
                  else
                      output.println(tab + "public static " + obj.name() + " 
narrow(Object obj)");
  
                  output.println(tab + "{");
  
                  output.println(tab2 + "if (obj == null)");
  
                  output.println(tab3 + "return null;");
  
                  output.println(tab2 + "if (obj instanceof " + obj.name() + 
")");
  
                  output.println(tab3 + "return (" + obj.name() + ")obj;");
  
                  output.println("");
  
                  if (!m_cp.getM_pidl() && !((IdlInterface) 
obj).local_interface()) {
                      output.println(tab2 + "if (obj._is_a(id()))");
                      output.println(tab2 + "{");
                      output.println(tab3 + "_" + obj.name() + "_Stub stub = 
new _" + obj.name() + "_Stub();");
                      output.println(tab3 + 
"stub._set_delegate(((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate());");
                      output.println(tab3 + "return stub;");
                      output.println(tab2 + "}");
                      output.println("");
                  }
  
                  output.println(tab2 + "throw new org.omg.CORBA.BAD_PARAM();");
                  output.println(tab + "}");
                  output.println("");
  
                  // Unchecked narrow
                  output.println(tab + "/**");
                  output.println(tab + " * Unchecked Narrow CORBA::Object to " 
+ obj.name());
                  output.println(tab + " * @param obj the CORBA Object");
                  output.println(tab + " * @return " + obj.name() + " Object");
                  output.println(tab + " */");
  
                  if (m_cp.getM_pidl() == false)
                      output.println(tab + "public static " + obj.name() + " 
unchecked_narrow(org.omg.CORBA.Object obj)");
                  else
                      output.println(tab + "public static " + obj.name() + " 
unchecked_narrow(Object obj)");
  
                  output.println(tab + "{");
  
                  output.println(tab2 + "if (obj == null)");
  
                  output.println(tab3 + "return null;");
  
                  output.println(tab2 + "if (obj instanceof " + obj.name() + 
")");
  
                  output.println(tab3 + "return (" + obj.name() + ")obj;");
  
                  output.println("");
  
                  if (!m_cp.getM_pidl() && !((IdlInterface) 
obj).local_interface()) {
                      output.println(tab2 + "_" + obj.name() + "_Stub stub = 
new _" + obj.name() + "_Stub();");
                      output.println(tab2 + 
"stub._set_delegate(((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate());");
                      output.println(tab2 + "return stub;");
                      output.println();
                  } else {
                      output.println(tab2 + "throw new 
org.omg.CORBA.BAD_PARAM();");
                  }
  
                  output.println(tab + "}");
                  output.println("");
              }
          }
  
          // Special for value type
          if (obj.kind() == IdlType.e_value) {
              if (((IdlValue) obj).abstract_value() == false) {
                  obj.reset();
  
                  while (obj.end() != true) {
                      if (obj.current().kind() == IdlType.e_factory) {
                          output.println(tab + "/**");
                          output.println(tab + " * Create a value type (using 
factory method)");
                          output.println(tab + " */");
                          output.print(tab + "public static " + obj.name() + " 
" + obj.current().name() + "(");
  
                          output.print("org.omg.CORBA.ORB orb");
  
                          obj.current().reset();
  
                          while (obj.current().end() != true) {
                              output.print(", ");
  
                              IdlFactoryMember member = (IdlFactoryMember) 
obj.current().current();
  
                              member.reset();
                              translate_type(member.current(), output);
                              output.print(" " + member.name());
  
                              obj.current().next();
                          }
  
                          output.println(")");
                          output.println(tab + "{");
                          output.println(tab2 + 
"org.omg.CORBA.portable.ValueFactory _factory = 
((org.omg.CORBA_2_3.ORB)orb).lookup_value_factory(id());");
                          output.println(tab2 + "if ( _factory == null )");
                          output.println(tab3 + "throw new 
org.omg.CORBA.BAD_INV_ORDER();");
                          output.print(tab2 + "return ( ( " + fullname(obj) + 
"ValueFactory ) ( _factory ) )." + obj.current().name() + "(");
  
                          obj.current().reset();
  
                          while (obj.current().end() != true) {
                              IdlFactoryMember member = (IdlFactoryMember) 
obj.current().current();
  
                              member.reset();
                              output.print(" " + member.name());
  
                              obj.current().next();
  
                              if (obj.current().end() != true)
                                  output.print(", ");
                          }
  
                          output.println(");");
                          output.println(tab + "}");
                          output.println("");
                      }
  
                      obj.next();
                  }
              }
          }
  
          // Special for value box
          if (obj.kind() == IdlType.e_value_box) {
              output.println(tab + "/**");
              output.println(tab + " * Read a value from an input stream");
              output.println(tab + " */");
              output.println(tab + "public java.io.Serializable 
read_value(org.omg.CORBA.portable.InputStream is)");
              output.println(tab + "{");
  
              translate_unmarshalling(obj, output, "is");
  
              output.println(tab + "}");
              output.println("");
  
              output.println(tab + "/**");
              output.println(tab + " * Write a value into an output stream");
              output.println(tab + " */");
              output.println(tab + "public void 
write_value(org.omg.CORBA.portable.OutputStream os, java.io.Serializable 
value)");
              output.println(tab + "{");
  
              translate_marshalling(obj, output, "os", "value");
  
              output.println(tab + "}");
              output.println("");
  
              output.println(tab + "/**");
              output.println(tab + " * Return the value id");
              output.println(tab + " */");
              output.println(tab + "public String get_id()");
              output.println(tab + "{");
              output.println(tab2 + "return id();");
              output.println(tab + "}");
              output.println("");
  
          }
  
          output.println("}");
          output.close();
      }
  
      /**
       * Decode a data type
       *
       * @param obj    the data type to decode
       * @param output write access
       * @param inname inputstream name
       */
      public void translate_unmarshalling(IdlObject obj, java.io.PrintWriter 
output, String inname) {
          int i;
          int idx;
  
          switch (obj.kind()) {
  
              case IdlType.e_simple:
  
                  if (((IdlSimple) obj).internal() == Token.t_typecode)
                      output.println(tab2 + "return " + inname + 
".read_TypeCode();");
  
                  break;
  
              case IdlType.e_enum:
                  output.println(tab2 + "return " + obj.name() + ".from_int(" + 
inname + ".read_ulong());");
  
                  break;
  
              case IdlType.e_struct:
                  obj.reset();
  
                  output.println(tab2 + "" + fullname(obj) + " new_one = new " 
+ fullname(obj) + "();");
  
                  output.println("");
  
                  while (obj.end() != true) {
                      obj.current().reset();
                      translate_unmarshalling_member(obj.current().current(), 
output, inname, "new_one." + obj.current().name(), tab2 + "");
                      obj.next();
                  }
  
                  output.println("");
                  output.println(tab2 + "return new_one;");
                  break;
  
              case IdlType.e_union:
                  idx = ((IdlUnion) obj).index();
                  obj.reset();
                  output.println(tab2 + "" + fullname(obj) + " new_one = new " 
+ fullname(obj) + "();");
                  output.println("");
  
                  obj.current().reset();
                  boolean enumeration = false;
  
                  if (final_kind(obj.current().current()) == IdlType.e_enum)
                      enumeration = true;
  
                  IdlObject d = obj.current().current();
  
                  translate_unmarshalling_member(obj.current().current(), 
output, inname, "new_one._" + obj.current().name(), tab2 + "");
  
                  obj.next();
  
                  String discrim = null;
  
                  if (((IdlUnionMember) 
obj.current()).getExpression().equals("true ") ||
                      ((IdlUnionMember) 
obj.current()).getExpression().equals("false ")) {
                      discrim = "new_one.toInt()";
                  } else {
                      if (enumeration)
                          discrim = "new_one.__d.value()";
                      else
                          discrim = "new_one.__d";
                  }
  
                  i = 0;
  
                  while (obj.end() != true) {
                      if (i != idx) {
                          output.print(tab2 + "if (" + discrim + " == ");
  
                          if (((IdlUnionMember) 
obj.current()).getExpression().equals("true "))
                              output.println("1)");
                          else if (((IdlUnionMember) 
obj.current()).getExpression().equals("false "))
                              output.println("0)");
                          else {
                              if (!enumeration) {
                                  output.print("(");
                                  translate_type(d, output);
                                  output.print(")");
                              }
  
                              
output.println(translate_to_java_expression(((IdlUnionMember) 
obj.current()).getExpression(), false, ((IdlUnionMember) obj.current())) + ")");
                          }
  
                          output.println(tab2 + "{");
  
                          if (((IdlUnionMember) obj.current()).isAsNext() == 
false) {
                              obj.current().reset();
                              
translate_unmarshalling_member(obj.current().current(), output, inname, 
"new_one._" + obj.current().name(), tab3 + "");
                          } else {
                              IdlObject next = getAsNext(obj);
  
                              next.reset();
                              translate_unmarshalling_member(next.current(), 
output, inname, "new_one._" + obj.current().name(), tab3 + "");
                          }
  
                          output.println(tab2 + "}");
  
                      }
  
                      obj.next();
  
                      if ((obj.end() != true) && ((i + 1) != idx))
                          output.println(tab2 + "else");
  
                      i++;
                  }
  
                  i = 0;
                  obj.reset();
                  obj.next();
  
                  while (obj.end() != true) {
                      if (i == idx) {
                          if (obj.length() != 2)
                              output.println(tab2 + "else");
  
                          output.println(tab2 + "{");
  
                          obj.current().reset();
  
                          
translate_unmarshalling_member(obj.current().current(), output, inname, 
"new_one._" + obj.current().name(), tab3 + "");
  
                          output.println(tab2 + "}");
  
                      }
  
                      obj.next();
  
                      i++;
                  }
  
                  output.println("");
                  output.println(tab2 + "return new_one;");
                  break;
  
              case IdlType.e_typedef:
                  obj.reset();
  
                  switch (obj.current().kind()) {
  
                      case IdlType.e_string:
  
                      case IdlType.e_wstring:
  
                      case IdlType.e_simple:
  
                      case IdlType.e_sequence:
  
                      case IdlType.e_fixed:
  
                      case IdlType.e_array:
                          output.print(tab2 + "");
                          translate_type(obj.current(), output);
                          output.println(" new_one;");
                          translate_unmarshalling_member(obj.current(), output, 
inname, "new_one", tab2 + "");
                          output.println("");
                          output.println(tab2 + "return new_one;");
                          break;
  
                      default :
                          translate_unmarshalling(obj.current(), output, 
inname);
                  }
  
                  break;
  
              case IdlType.e_ident:
                  translate_unmarshalling(((IdlIdent) obj).internalObject(), 
output, inname);
                  break;
  
              case IdlType.e_exception:
                  obj.reset();
                  output.println(tab2 + "" + fullname(obj) + " new_one = new " 
+ fullname(obj) + "();");
                  output.println("");
                  output.println(tab2 + "if (!" + inname + 
".read_string().equals(id()))");
                  output.println(tab2 + " throw new org.omg.CORBA.MARSHAL();");
  
                  while (obj.end() != true) {
                      obj.current().reset();
                      translate_unmarshalling_member(obj.current().current(), 
output, inname, "new_one." + obj.current().name(), tab2 + "");
                      obj.next();
                  }
  
                  output.println("");
                  output.println(tab2 + "return new_one;");
                  break;
  
              case IdlType.e_native:
                  output.println(tab2 + "throw new org.omg.CORBA.MARSHAL();");
                  break;
  
              case IdlType.e_interface:
  
              case IdlType.e_forward_interface:
  
                  if (((IdlInterface) obj).local_interface()) {
                      output.println(tab2 + "throw new 
org.omg.CORBA.MARSHAL();");
                      break;
                  }
  
                  if (((IdlInterface) obj).abstract_interface()) {
                      output.print(tab2 + "Object new_one = 
((org.omg.CORBA_2_3.portable.InputStream)" + inname + 
").read_abstract_interface(");
  
                      String stubname = fullname(obj);
  
                      if (stubname.lastIndexOf(".") != -1)
                          stubname = stubname.substring(0, 
stubname.lastIndexOf(".") + 1);
                      else
                          stubname = "";
  
                      stubname = stubname + "_" + obj.name() + "Stub";
  
                      output.println(stubname + ".class);");
  
                      output.println(tab2 + "return (" + fullname(obj) + ") 
new_one;");
                  } else {
                      String stubname = fullname(obj);
  
                      if (stubname.lastIndexOf(".") != -1)
                          stubname = stubname.substring(0, 
stubname.lastIndexOf(".") + 1);
                      else
                          stubname = "";
  
                      stubname = stubname + "_" + obj.name() + "_Stub";
  
                      output.println(tab2 + "return(" + fullname(obj) + ")" + 
inname + ".read_Object(" + stubname + ".class);");
                  }
  
                  break;
  
              case IdlType.e_value:
  
                  if (((IdlValue) obj).abstract_value())
                      output.println(tab2 + "return (" + obj.name() + ") 
((org.omg.CORBA_2_3.portable.InputStream)istream).read_value(_id);");
                  else
                      output.println(tab2 + "return (" + obj.name() + ") 
((org.omg.CORBA_2_3.portable.InputStream)istream).read_value(_id);");
  
                  break;
  
              case IdlType.e_value_box:
                  obj.reset();
  
                  if (((IdlValueBox) obj).simple()) {
                      if (is_boolean(obj.current()))
                          output.println(tab2 + "" + fullname(obj) + " _box = 
new " + fullname(obj) + "(false);");
                      else {
                          output.print(tab2 + "" + fullname(obj) + " _box = new 
" + fullname(obj) + "((");
                          translate_type(obj.current(), output);
                          output.println(")0);");
                      }
  
                      translate_unmarshalling_member(obj.current(), output, 
inname, "_box.value", tab2 + "");
                  } else {
                      output.print(tab2 + "");
                      translate_type(obj.current(), output);
                      output.println(" _box = null;");
  
                      translate_unmarshalling_member(obj.current(), output, 
inname, "_box", tab2 + "");
                  }
  
                  output.println(tab2 + "return _box;");
                  break;
          }
      }
  
      private void writeThrowException(final java.io.PrintWriter output,
                                       final String indent, final String 
exceptionName, final String args,
                                       final String causeName) {
          output.print(indent);
          output.print("throw ");
  
          if (m_cp.getM_jdk1_4()) {
              output.print("(");
              output.print(exceptionName);
              output.print(")");
          }
  
          output.print("new ");
          output.print(exceptionName);
          output.print("(");
          output.print(args);
          output.print(")");
  
          if (m_cp.getM_jdk1_4()) {
              output.print(".initCause(");
              output.print(causeName);
              output.print(")");
          }
          output.println(";");
      }
  
      /**
       * Return the typed member for an union member
       */
      private IdlObject getAsNext(IdlObject obj) {
          int p = obj.pos();
  
          while (obj.end() != true) {
              IdlUnionMember member = (IdlUnionMember) obj.current();
  
              if (member.isAsNext() == false) {
                  obj.pos(p);
                  return member;
              }
  
              obj.next();
          }
  
          obj.pos(p);
          return null;
      }
  
      private boolean is_boolean(IdlObject obj) {
          switch (final_kind(obj)) {
  
              case IdlType.e_simple:
  
                  if (((IdlSimple) obj).internal() == Token.t_boolean)
                      return true;
  
              default :
                  return false;
          }
      }
  
  }
  
  
  
  

Reply via email to