/* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.jacorb.idl; import java.io.PrintWriter; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.logging.Level; /** * @author Gerald Brose */ public class OpDecl extends Declaration implements Operation { public static final int NO_ATTRIBUTE = 0; public static final int ONEWAY = 1; public int opAttribute; // either NO_ATTRIBUTE or ONEWAY public TypeSpec opTypeSpec; public Vector paramDecls; public RaisesExpr raisesExpr; public IdlSymbol myInterface; public OpDecl( int num ) { super( num ); paramDecls = new Vector(); } /** * Constructs a new OpDecl with the given characteristics. */ public OpDecl (IdlSymbol myInterface, int opAttribute, TypeSpec opTypeSpec, String name, List paramDecls, RaisesExpr raisesExpr) { super (new_num()); this.myInterface = myInterface; this.opAttribute = opAttribute; this.opTypeSpec = opTypeSpec; this.name = name; this.paramDecls = new Vector (paramDecls); this.raisesExpr = raisesExpr; setEnclosingSymbol (myInterface); this.pack_name = myInterface.full_name(); } /** * Constructs a normal (not oneway) operation with void return type * and no raises-Expression. */ public OpDecl (IdlSymbol myInterface, String name, List paramDecls) { this (myInterface, NO_ATTRIBUTE, new VoidTypeSpec (new_num()), name, paramDecls, new RaisesExpr (new_num())); } public void setPackage( String s ) { s = parser.pack_replace( s ); if( pack_name.length() > 0 ) pack_name = s + "." + pack_name; else pack_name = s; opTypeSpec.setPackage( s ); for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ( (ParamDecl)e.nextElement() ).setPackage( s ) ) ; raisesExpr.setPackage( s ); } public void setEnclosingSymbol( IdlSymbol s ) { if( parser.logger.isLoggable(Level.ALL) ) parser.logger.log(Level.ALL, "opDecl.setEnclosingSymbol " + s); if( enclosing_symbol != null && enclosing_symbol != s ) throw new RuntimeException( "Compiler Error: trying to reassign container for " + name ); if( s == null ) throw new RuntimeException( "Compiler Error: enclosing symbol is null!"); enclosing_symbol = s; raisesExpr.setEnclosingSymbol( s ); } public void parse() { if( enclosing_symbol == null ) throw new RuntimeException( "Compiler Error: enclosing symbol in parse is null!"); myInterface = enclosing_symbol; if( opAttribute == ONEWAY ) { if( !raisesExpr.empty() ) parser.error( "Oneway operation " + full_name() + " may not define a raises clause.", token ); if( !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) parser.error( "Oneway operation " + full_name() + " may only define void as return type.", token ); } try { NameTable.define( full_name(), IDLTypes.OPERATION ); } catch( NameAlreadyDefined nad ) { parser.error( "Operation " + full_name() + " already defined", token ); } for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl param = (ParamDecl)e.nextElement(); if (parser.strict_identifiers) { String typeN = (param.paramTypeSpec.typeName().indexOf(".") < 0 ? param.paramTypeSpec.typeName() : param.paramTypeSpec.typeName().substring(param.paramTypeSpec.typeName().lastIndexOf(".") + 1)); if ((parser.strict_names && typeN.toUpperCase().equals(param.simple_declarator.toString().toUpperCase())) || typeN.equals(param.simple_declarator.toString())) { parser.error("In operation " + full_name() + " argument " + param.simple_declarator + " clashes with type " + param.paramTypeSpec.typeName()); } } param.parse(); try { NameTable.define( full_name() + "." + param.simple_declarator.name(), IDLTypes.ARGUMENT ); } catch( NameAlreadyDefined nad ) { parser.error( "Argument " + param.simple_declarator.name() + " already defined in operation " + full_name(), token ); } if( param.paramAttribute != ParamDecl.MODE_IN ) { // for out and inout params myInterface.addImportedNameHolder( param.paramTypeSpec.holderName() ); } if( !(param.paramTypeSpec.typeSpec() instanceof BaseType )) { if( parser.logger.isLoggable(Level.FINEST) ) parser.logger.log(Level.FINEST, "classname: " + param.paramTypeSpec.typeSpec().getClass().getName()); myInterface.addImportedName( param.paramTypeSpec.typeSpec().full_name(), param.paramTypeSpec.typeSpec() ); } if( param.paramTypeSpec.typeSpec() instanceof ConstrTypeSpec && ((ConstrTypeSpec )param.paramTypeSpec.typeSpec()).c_type_spec instanceof StructType && ((StructType )((ConstrTypeSpec )param.paramTypeSpec.typeSpec()).c_type_spec).exc == true ) { parser.error( "Can't pass an exception as a parameter."); } } if( opTypeSpec.typeSpec() instanceof ScopedName ) { TypeSpec ts = ( (ScopedName)opTypeSpec.typeSpec() ).resolvedTypeSpec(); if( ts != null ) opTypeSpec = ts; myInterface.addImportedName( opTypeSpec.typeName() ); } raisesExpr.parse(); } public void print( PrintWriter ps ) { if( is_pseudo ) ps.print( "\tpublic abstract " + opTypeSpec.toString() ); else ps.print( "\t" + opTypeSpec.toString() ); ps.print( " " ); ps.print( name ); ps.print( "(" ); Enumeration e = paramDecls.elements(); if( e.hasMoreElements() ) ( (ParamDecl)e.nextElement() ).print( ps ); for( ; e.hasMoreElements(); ) { ps.print( ", " ); ( (ParamDecl)e.nextElement() ).print( ps ); } ps.print( ")" ); raisesExpr.print( ps ); ps.println( ";" ); } /** * Writes the Stream-based Body of the Method for the stub */ public void printStreamBody( PrintWriter ps, String classname, String idl_name, boolean is_local, boolean is_abstract) { ps.println( "\t\twhile(true)" ); ps.println( "\t\t{" ); // remote part, not for locality constrained objects // if( !is_local ) { ps.println( "\t\t\tif(! this._is_local())" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\torg.omg.CORBA.portable.InputStream _is = null;" ); ps.println( "\t\t\t\torg.omg.CORBA.portable.OutputStream _os = null;" ); ps.println( "\t\t\t\ttry" ); ps.println( "\t\t\t\t{" ); ps.print( "\t\t\t\t\t_os = _request( \"" + idl_name + "\"," ); if( opAttribute == NO_ATTRIBUTE ) ps.println( " true);" ); else ps.println( " false);" ); // arguments.. for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl p = ( (ParamDecl)e.nextElement() ); if( p.paramAttribute != ParamDecl.MODE_OUT ) ps.println( "\t\t\t\t\t" + p.printWriteStatement( "_os" ) ); } ps.println( "\t\t\t\t\t_is = _invoke(_os);" ); if( opAttribute == 0 && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.println( "\t\t\t\t\t" + opTypeSpec.toString() + " _result = " + opTypeSpec.typeSpec().printReadExpression( "_is" ) + ";" ); } for( Enumeration e2 = paramDecls.elements(); e2.hasMoreElements(); ) { ParamDecl p = (ParamDecl)e2.nextElement(); if( p.paramAttribute != ParamDecl.MODE_IN ) { ps.println( "\t\t\t\t\t" + p.simple_declarator + ".value = " + p.printReadExpression( "_is" ) + ";" ); } } if( opAttribute == NO_ATTRIBUTE && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.println( "\t\t\t\t\treturn _result;" ); } else ps.println( "\t\t\t\t\treturn;" ); /* catch exceptions */ ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tcatch( org.omg.CORBA.portable.RemarshalException _rx )" ); ps.println( "\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\tcontinue;" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\tcatch( org.omg.CORBA.portable.ApplicationException _ax )" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tString _id = _ax.getId();" ); if( !raisesExpr.empty() ) { String[] exceptIds = raisesExpr.getExceptionIds(); String[] classNames = raisesExpr.getExceptionClassNames(); ps.println( "\t\t\t\t\ttry" ); ps.println( "\t\t\t\t\t{" ); for( int i = 0; i < exceptIds.length; i++ ) { ps.println( "\t\t\t\t\t\tif( _id.equals(\"" + exceptIds[ i ] + "\"))" ); ps.println( "\t\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\t\tthrow " + classNames[ i ] + "Helper.read(_ax.getInputStream());"); ps.println( "\t\t\t\t\t\t}" ); ps.println( "\t\t\t\t\t\telse " ); } ps.println( "\t\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); ps.println( "\t\t\t\t\t\t}" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\t\tfinally" ); ps.println( "\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\ttry"); ps.println( "\t\t\t\t\t\t{"); ps.println( "\t\t\t\t\t\t\t_ax.getInputStream().close();"); ps.println( "\t\t\t\t\t\t}"); ps.println( "\t\t\t\t\t\tcatch (java.io.IOException e)"); ps.println( "\t\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );" ); ps.println( "\t\t\t\t\t\t}" ); ps.println( "\t\t\t\t\t}" ); } else { ps.println( "\t\t\t\t\ttry"); ps.println( "\t\t\t\t\t{"); ps.println( "\t\t\t\t\t\t\t_ax.getInputStream().close();"); ps.println( "\t\t\t\t\t}"); ps.println( "\t\t\t\t\tcatch (java.io.IOException e)"); ps.println( "\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); } ps.println( "\t\t\t}" ); ps.println( "\t\t\tfinally" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tif (_os != null)"); ps.println( "\t\t\t\t{"); ps.println( "\t\t\t\t\ttry"); ps.println( "\t\t\t\t\t{"); ps.println( "\t\t\t\t\t\t_os.close();"); ps.println( "\t\t\t\t\t}"); ps.println( "\t\t\t\t\tcatch (java.io.IOException e)"); ps.println( "\t\t\t\t\t{" ); ps.println( "\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\t}"); ps.println( "\t\t\t\tthis._releaseReply(_is);" ); ps.println( "\t\t\t}" ); ps.println( "\t\t}" ); // local part ps.println( "\t\telse" ); ps.println( "\t\t{" ); } ps.println( "\t\t\torg.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( \"" + idl_name + "\", _opsClass );" ); ps.println( "\t\t\tif( _so == null )" ); ps.println( "\t\t\t\tcontinue;" ); if( is_abstract ) { ps.println( "\t\t\t" + classname + " _localServant = (" + classname + ")_so.servant;" ); } else { ps.println( "\t\t\t" + classname + "Operations _localServant = (" + classname + "Operations)_so.servant;" ); } if( opAttribute == 0 && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.println( "\t\t\t" + opTypeSpec.toString() + " _result;" ); } ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); if( opAttribute == 0 && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.print( "\t\t\t\t_result = " ); } else { ps.print( "\t\t\t\t" ); } ps.print( "_localServant." + name + "(" ); for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl p = ( (ParamDecl)e.nextElement() ); ps.print( p.simple_declarator.toString() ); if( e.hasMoreElements() ) ps.print( "," ); } ps.println( ");" ); ps.println( "\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();"); if( opAttribute == 0 && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.println( "\t\t\t\treturn _result;" ); } else { ps.println( "\t\t\t\treturn;" ); } ps.println( "\t\t\t}" ); if( !raisesExpr.empty() ) { String[] exceptIds = raisesExpr.getExceptionIds(); String[] classNames = raisesExpr.getExceptionClassNames(); for( int i = 0; i < exceptIds.length; i++ ) { ps.println( "\t\t\tcatch (" + classNames[ i ] + " ex) "); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);"); ps.println( "\t\t\t\tthrow ex;"); ps.println( "\t\t\t}" ); } } ps.println( "\t\t\tcatch (RuntimeException re) "); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);"); ps.println( "\t\t\t\tthrow re;"); ps.println( "\t\t\t}" ); ps.println( "\t\t\tcatch (java.lang.Error err) "); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);"); ps.println( "\t\t\t\tthrow err;"); ps.println( "\t\t\t}" ); ps.println( "\t\t\tfinally" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\t_servant_postinvoke(_so);" ); ps.println( "\t\t\t}" ); if( !is_local ) ps.println( "\t\t}" + Environment.NL ); ps.println( "\t\t}" + Environment.NL ); // end while } /** * Writes the DII-based Body of the Method for the stub */ private void printDIIBody(PrintWriter ps, String classname, String idl_name, boolean is_local, boolean is_abstract) { ps.println( "\t\torg.omg.CORBA.Request _request = _request( \"" + idl_name + "\" );" ); ps.println(""); //set return type if ( opAttribute == NO_ATTRIBUTE && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { //old version //ps.println( "\t\t_r.set_return_type(" + opTypeSpec.typeSpec().getTypeCodeExpression() + ");"); //new version, distinguishes different types if (opTypeSpec.typeSpec() instanceof BaseType ) { BaseType bt = (BaseType) opTypeSpec.typeSpec(); ps.println( "\t\t_request.set_return_type( "+ bt.getTypeCodeExpression() + " );" ); } else if (opTypeSpec.typeSpec() instanceof StringType) { StringType st = (StringType) opTypeSpec.typeSpec(); ps.println( "\t\t_request.set_return_type( "+ st.getTypeCodeExpression() + " );" ); } else { try { //if there is a helper-class, use it to get the TypeCode for the return value String helperName = opTypeSpec.typeSpec().helperName(); ps.println("\t\t_request.set_return_type(" + helperName+".type()" + ");"); } catch ( NoHelperException e) { //otherwise use typeCodeExpression //(the old version) ps.println( "\t\t_request.set_return_type(" + opTypeSpec.typeSpec().getTypeCodeExpression() + ");"); } } } else { //return type void ps.println( "\t\t_request.set_return_type(_orb().get_primitive_tc(org.omg.CORBA.TCKind.tk_void));" ); } ps.println(""); //put parameters into the request for( Enumeration e2 = paramDecls.elements(); e2.hasMoreElements(); ) { ParamDecl p = ( (ParamDecl)e2.nextElement() ); p.printAddArgumentStatement(ps, "_request"); ps.println(""); } //add exceptions if (!raisesExpr.empty()) { String[] exceptions= raisesExpr.getExceptionClassNames(); for (int i=0; i<exceptions.length; i++) { ps.println("\t\t_request.exceptions().add(" + exceptions[i] + "Helper.type());"); } ps.println(""); } //invoke ps.println( "\t\t_request.invoke();" ); ps.println(""); //get Exception ps.println("\t\tjava.lang.Exception _exception = _request.env().exception();"); ps.println("\t\tif (_exception != null)"); ps.println("\t\t{"); if (!raisesExpr.empty()) { ps.println("\t\t\tif(_exception instanceof org.omg.CORBA.UnknownUserException)"); ps.println("\t\t\t{"); ps.println("\t\t\t\torg.omg.CORBA.UnknownUserException _userException = (org.omg.CORBA.UnknownUserException) _exception;"); ps.print("\t\t\t\t"); String[] raisesExceptions = raisesExpr.getExceptionClassNames(); for (int i=0; i<raisesExceptions.length; i++) { ps.println("if (_userException.except.type().equals(" + raisesExceptions[i] + "Helper.type()))"); ps.println("\t\t\t\t{"); ps.println("\t\t\t\t\tthrow "+raisesExceptions[i] + "Helper.extract(_userException.except);"); ps.println("\t\t\t\t}"); ps.println("\t\t\t\telse"); } ps.println("\t\t\t\t{"); ps.println("\t\t\t\t\tthrow new org.omg.CORBA.UNKNOWN();"); ps.println("\t\t\t\t}"); ps.println("\t\t\t}"); } ps.println( "\t\t\tthrow (org.omg.CORBA.SystemException) _exception;"); ps.println( "\t\t}"); ps.println(""); //Get out and inout parameters! for (Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl p = ((ParamDecl)e.nextElement()); if( p.paramAttribute != ParamDecl.MODE_IN ) { p.printExtractArgumentStatement(ps); } } //get the result if( opAttribute == NO_ATTRIBUTE && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.println("\t\t"+opTypeSpec.toString() + " _result;"); opTypeSpec.typeSpec().printExtractResult(ps, "_result", "_request.return_value()", opTypeSpec.toString()); ps.println("\t\treturn _result;"); } else ps.println("\t\treturn;"); } public void printMethod( PrintWriter ps, String classname, boolean is_local, boolean is_abstract) { /* in some cases generated name have an underscore prepended for the mapped java name. On the wire, we must use the original name */ String idl_name = ( name.startsWith( "_" ) ? name.substring( 1 ) : name ); ps.print( "\tpublic " + opTypeSpec.toString() + " " + name + "(" ); Enumeration e = paramDecls.elements(); if( e.hasMoreElements() ) ( (ParamDecl)e.nextElement() ).print( ps ); for( ; e.hasMoreElements(); ) { ps.print( ", " ); ( (ParamDecl)e.nextElement() ).print( ps ); } ps.print( ")" ); raisesExpr.print( ps ); ps.println( Environment.NL + "\t{" ); if ( parser.generateDiiStubs ) { printDIIBody(ps, classname, idl_name, is_local, is_abstract); } else { printStreamBody(ps, classname, idl_name, is_local, is_abstract); } ps.println( "\t}" + Environment.NL ); // end method^M } public void print_sendc_Method( PrintWriter ps, String classname ) { /* in some cases generated name have an underscore prepended for the mapped java name. On the wire, we must use the original name */ String idl_name = ( name.startsWith( "_" ) ? name.substring( 1 ) : name ); ps.print( "\tpublic void sendc_" + name + "(" ); ps.print( "AMI_" + classname + "Handler ami_handler" ); for ( Iterator i = paramDecls.iterator(); i.hasNext(); ) { ParamDecl p = ( ParamDecl ) i.next(); if ( p.paramAttribute != ParamDecl.MODE_OUT ) { ps.print( ", " ); p.asIn().print( ps ); } } ps.print( ")" + Environment.NL ); ps.println( "\t{" ); ps.println( "\t\twhile(true)" ); ps.println( "\t\t{" ); ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); ps.print( "\t\t\t\torg.omg.CORBA.portable.OutputStream _os = _request( \"" + idl_name + "\"," ); if( opAttribute == NO_ATTRIBUTE ) ps.println( " true);" ); else ps.println( " false);" ); // arguments.. for( Iterator i = paramDecls.iterator(); i.hasNext(); ) { ParamDecl p = ( (ParamDecl)i.next() ); if( p.paramAttribute != ParamDecl.MODE_OUT ) ps.println( "\t\t\t\t" + p.asIn().printWriteStatement( "_os" ) ); } ps.println( "\t\t\t\t((org.jacorb.orb.Delegate)_get_delegate()).invoke(this, _os, ami_handler);" ); ps.println( "\t\t\t\treturn;"); /* catch exceptions */ ps.println( "\t\t\t}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.RemarshalException _rx )" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.ApplicationException _ax )" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t}" ); ps.println( "\t\t}" + Environment.NL ); // end while ps.println( "\t}" + Environment.NL ); // end method } public void printDelegatedMethod( PrintWriter ps ) { ps.print( "\tpublic " + opTypeSpec.toString() + " " + name + "(" ); Enumeration e = paramDecls.elements(); if( e.hasMoreElements() ) ( (ParamDecl)e.nextElement() ).print( ps ); for( ; e.hasMoreElements(); ) { ps.print( ", " ); ( (ParamDecl)e.nextElement() ).print( ps ); } ps.print( ")" ); raisesExpr.print( ps ); ps.println( Environment.NL + "\t{" ); if( opAttribute == NO_ATTRIBUTE && !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) { ps.print( "\t\treturn " ); } ps.print( "_delegate." + name + "(" ); e = paramDecls.elements(); if( e.hasMoreElements() ) ps.print( ( (ParamDecl)e.nextElement() ).simple_declarator ); for( ; e.hasMoreElements(); ) { ps.print( "," ); ps.print( ( (ParamDecl)e.nextElement() ).simple_declarator ); } ps.println( ");" ); ps.println( "\t}" + Environment.NL ); } public void printInvocation( PrintWriter ps ) { if( !raisesExpr.empty() ) { ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); } /* read args */ int argc = 0; if (parser.hasObjectCachePlugin()) { parser.getObjectCachePlugin().printPreParamRead(ps, paramDecls); } for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl p = (ParamDecl)e.nextElement(); TypeSpec ts = p.paramTypeSpec.typeSpec(); boolean is_wstring = ( ( ts instanceof StringType ) && ( ( (StringType)ts ).isWide() ) ); boolean is_wchar = ( ( ts instanceof CharType ) && ( ( (CharType)ts ).isWide() ) ); if( p.paramAttribute == ParamDecl.MODE_IN ) { ps.println( "\t\t\t\t" + ts.toString() + " _arg" + ( argc++ ) + "=" + ts.printReadExpression( "_input" ) + ";" ); } else { ps.println( "\t\t\t\t" + ts.holderName() + " _arg" + ( argc++ ) + "= new " + ts.holderName() + "();" ); if( p.paramAttribute == ParamDecl.MODE_INOUT ) { // wchars and wstrings are contained in CharHolder and // StringHolder and so cannot be inserted via _read operation // on holder. Instead value of holder needs to be set directly // from correct type explicitly read from stream. if( is_wchar ) { ps.println( "\t\t\t\t_arg" + ( argc - 1 ) + ".value = _input.read_wchar ();" ); } else if( is_wstring ) { ps.println( "\t\t\t\t_arg" + ( argc - 1 ) + ".value = _input.read_wstring ();" ); } else { ps.println( "\t\t\t\t_arg" + ( argc - 1 ) + "._read (_input);" ); } } } } if (parser.hasObjectCachePlugin()) { parser.getObjectCachePlugin().printPostParamRead(ps, paramDecls); } boolean complex = ( opTypeSpec.typeSpec() instanceof ArrayTypeSpec ) || ( opTypeSpec.typeSpec() instanceof FixedPointType ); String write_str = null, write_str_prefix = null, write_str_suffix = null; // if( (!(opTypeSpec.typeSpec() instanceof VoidTypeSpec )) || holders ) // { ps.println( "\t\t\t\t_out = handler.createReply();" ); if( !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) && !complex ) { write_str = opTypeSpec.typeSpec().printWriteStatement( "**", "_out" ); int index = write_str.indexOf( "**" ); write_str_prefix = write_str.substring( 0, index ); write_str_suffix = write_str.substring( index + 2 ); ps.print( "\t\t\t\t" + write_str_prefix ); } else ps.print( "\t\t\t\t" ); // } if( complex ) ps.print( opTypeSpec.typeSpec().typeName() + " _result = " ); ps.print( name + "(" ); for( int i = 0; i < argc; i++ ) { ps.print( "_arg" + i ); if( i < argc - 1 ) ps.print( "," ); } /* Enumeration e = paramDecls.elements(); if(e.hasMoreElements()) { TypeSpec ts = ((ParamDecl)e.nextElement()).paramTypeSpec; ps.print(ts.printReadExpression("input")); } for(; e.hasMoreElements();) { TypeSpec ts = ((ParamDecl)e.nextElement()).paramTypeSpec; ps.print("," + ts.printReadExpression("input")); } */ if( !( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ) ps.print( ")" ); if( !complex ) { if( opTypeSpec.typeSpec() instanceof VoidTypeSpec ) ps.println( ");" ); else ps.println( write_str_suffix ); } else { ps.println( ";" ); ps.println( opTypeSpec.typeSpec().printWriteStatement( "_result", "_out" ) ); } /* write holder values */ argc = 0; for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl p = (ParamDecl)e.nextElement(); if( p.paramAttribute != ParamDecl.MODE_IN ) { ps.println( "\t\t\t\t" + p.printWriteStatement( ( "_arg" + ( argc ) ), "_out" ) ); } argc++; } if (parser.hasObjectCachePlugin()) { parser.getObjectCachePlugin().printSkeletonCheckin(ps, paramDecls, "_arg"); } if( !raisesExpr.empty() ) { ps.println( "\t\t\t}" ); String[] excepts = raisesExpr.getExceptionNames(); String[] classNames = raisesExpr.getExceptionClassNames(); for( int i = 0; i < excepts.length; i++ ) { ps.println( "\t\t\tcatch(" + excepts[ i ] + " _ex" + i + ")" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\t_out = handler.createExceptionReply();" ); ps.println( "\t\t\t\t" + classNames[ i ] + "Helper.write(_out, _ex" + i + ");" ); if (parser.generatedHelperPortability == parser.HELPER_JACORB) { ps.println("\t\t\t\tif (handler instanceof org.jacorb.orb.dsi.ServerRequest && !" + classNames[i]+ "Helper.id().equals(_ex" + i + ".getMessage()))"); ps.println("\t\t\t\t{"); ps.println("\t\t\t\t\t((org.jacorb.orb.giop.ReplyOutputStream)_out).addServiceContext (org.jacorb.orb.dsi.ServerRequest.createExceptionDetailMessage (_ex" + i + ".getMessage()));"); ps.println("\t\t\t\t}"); } ps.println( "\t\t\t}" ); } } } public String signature() { StringBuffer sb = new StringBuffer(); sb.append( name + "(" ); Enumeration e = paramDecls.elements(); if( e.hasMoreElements() ) sb.append( ( (ParamDecl)e.nextElement() ).paramTypeSpec.toString() ); for( ; e.hasMoreElements(); ) { sb.append( "," + ( (ParamDecl)e.nextElement() ).paramTypeSpec.toString() ); } sb.append( ")" ); return sb.toString(); } public String name() { return name; } public String opName() { return name(); } public void printSignature( PrintWriter ps ) { printSignature( ps, false ); } /** * @param printModifiers whether "public abstract" should be added */ public void printSignature( PrintWriter ps, boolean printModifiers ) { ps.print( "\t" ); if( printModifiers ) ps.print( "public abstract " ); ps.print( opTypeSpec.toString() + " " + name + "(" ); for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ( (ParamDecl)e.nextElement() ).print( ps ); if( e.hasMoreElements() ) ps.print( ", " ); } ps.print( ")" ); raisesExpr.print( ps ); ps.println( ";" ); } /** * collect Interface Repository information in the argument hashtable */ public void getIRInfo( Hashtable irInfoTable ) { StringBuffer sb = new StringBuffer(); TypeSpec ts = opTypeSpec.typeSpec(); if( ts instanceof AliasTypeSpec ) { // if( ((AliasTypeSpec)ts).originalType.typeSpec() instanceof FixedPointType ) // { sb.append( ts.full_name() ); // } } sb.append( "(" ); for( Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) { ParamDecl param = (ParamDecl)e.nextElement(); if( param.paramAttribute == ParamDecl.MODE_INOUT ) { sb.append( "inout:" + param.simple_declarator.name + " " ); } else if( param.paramAttribute == ParamDecl.MODE_OUT ) { sb.append( "out:" + param.simple_declarator.name + " " ); } else // MODE_IN sb.append( "in:" + param.simple_declarator.name + " " ); ts = param.paramTypeSpec.typeSpec(); if( ts instanceof AliasTypeSpec ) { sb.append( ts.full_name() ); } sb.append( "," ); } if( paramDecls.size() > 0 ) { // remove extra trailing "," sb.deleteCharAt( sb.length()-1); } sb.append( ")" ); if( opAttribute == ONEWAY ) sb.append( "-oneway" ); // if( enter ) irInfoTable.put( name, sb.toString() ); if( parser.logger.isLoggable(Level.ALL) ) parser.logger.log(Level.ALL, "OpInfo for " + name + " : " + sb.toString()); } public void accept( IDLTreeVisitor visitor ) { visitor.visitOpDecl( this ); } }