/* * 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; /** * @author Gerald Brose * * This class is used to represent accessor operations */ import java.io.PrintWriter; public class Method implements Operation { public TypeSpec resultType; public TypeSpec parameterType; private String name; private RaisesExpr raisesExpr; private boolean pseudo; public Method(TypeSpec res, TypeSpec params, String name, RaisesExpr raisesExpr, boolean pseudo) { resultType = res; parameterType = params; this.name = name; this.raisesExpr = raisesExpr; this.pseudo = pseudo; } public boolean isGetter() { return resultType != null; } public String name() { return name; } public String opName() { if( isGetter() ) return "_get_" + name; else return "_set_" + name; } public String signature() { StringBuffer sb = new StringBuffer(); sb.append( name + "(" ); if( parameterType != null ) { sb.append( parameterType.toString() ); } sb.append( ")" ); return sb.toString(); } public void printSignature( PrintWriter ps ) { printSignature( ps, pseudo ); } /** * @param printModifiers whether "public abstract" should be added */ public void printSignature( PrintWriter ps, boolean printModifiers ) { ps.print( "\t" ); if( printModifiers ) ps.print( "public abstract " ); if( isGetter() ) { ps.print( resultType.toString() ); ps.print( " " + name + "()" ); raisesExpr.print(ps); ps.println(";"); } else { ps.print("void " + name + "("); ps.print(parameterType.toString()); ps.print(" arg)"); raisesExpr.print(ps); ps.println(";"); } } public void printMethod( PrintWriter ps, String classname, boolean is_local, boolean is_abstract ) { ps.print( "\tpublic " ); if( isGetter() ) { // accessor method ps.print( resultType.toString() ); ps.print( " " + name + "()" ); raisesExpr.print(ps); ps.println(); ps.println( "\t{" ); 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.println( "\t\t\t\t\t_os = _request(\"_get_" + name + "\",true);" ); ps.println( "\t\t\t\t\t_is = _invoke(_os);" ); TypeSpec ts = resultType.typeSpec(); ps.println( "\t\t\t\t\treturn " + ts.printReadExpression( "_is" ) + ";" ); 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();" ); ps.println( "\t\t\t\t\ttry"); ps.println( "\t\t\t\t\t{"); ps.println( "\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}" ); if( !raisesExpr.empty() ) { String[] exceptIds = raisesExpr.getExceptionIds(); String[] classNames = raisesExpr.getExceptionClassNames(); ps.print( "\t\t\t\t" ); for( int i = 0; i < exceptIds.length; i++ ) { if (i > 0) { ps.print( "\t\t\t\telse " ); } ps.println( "if( _id.equals(\"" + exceptIds[ i ] + "\"))" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tthrow " + classNames[ i ] + "Helper.read(_ax.getInputStream());" ); ps.println( "\t\t\t\t}" ); } } ps.println( "\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tfinally" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif (_os != null)"); 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_os.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}"); ps.println( "\t\t\t\t\tthis._releaseReply(_is);" ); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t}" + Environment.NL ); // local part ps.println( "\t\t\telse" ); ps.println( "\t\t\t{" ); } ps.println( "\t\t\t\torg.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( \"_get_" + name + "\", _opsClass);" ); ps.println( "\t\t\t\tif( _so == null )" ); ps.println( "\t\t\t\t\tcontinue;" ); if( is_abstract ) { ps.println( "\t\t\t\t" + classname + " _localServant = (" + classname + ")_so.servant;" ); } else { ps.println( "\t\t\t\t" + classname + "Operations _localServant = (" + classname + "Operations)_so.servant;" ); } ps.println( "\t\t\t\t" + resultType + " _result;" ); ps.println( "\t\t\t\ttry" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\t_result = _localServant." + name + "();" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();"); ps.println( "\t\t\t\t\t\treturn _result;" ); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tcatch (RuntimeException re) "); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);"); ps.println( "\t\t\t\t\tthrow re;"); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tcatch (java.lang.Error err) "); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);"); ps.println( "\t\t\t\t\tthrow err;"); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tfinally" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\t_servant_postinvoke(_so);" ); ps.println( "\t\t\t\t}" ); if( !is_local ) ps.println( "\t\t\t}" + Environment.NL ); ps.println( "\t\t}" + Environment.NL ); ps.println( "\t}" + Environment.NL ); } else { /** modifier */ ps.print( "void " + name + "(" + parameterType.toString() ); ps.print( " a)" ); raisesExpr.print(ps); ps.println(); ps.println( "\t{" ); 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.println( "\t\t\t\t\t_os = _request(\"_set_" + name + "\",true);" ); ps.println( "\t\t\t\t\t" + parameterType.typeSpec().printWriteStatement( "a", "_os" ) ); ps.println( "\t\t\t\t\t_is = _invoke(_os);" ); ps.println( "\t\t\t\t\treturn;" ); 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();" ); 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\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}" ); if( !raisesExpr.empty() ) { String[] exceptIds = raisesExpr.getExceptionIds(); String[] classNames = raisesExpr.getExceptionClassNames(); ps.print( "\t\t\t\t" ); for( int i = 0; i < exceptIds.length; i++ ) { if (i > 0) { ps.print( "\t\t\t\telse " ); } ps.println( "if( _id.equals(\"" + exceptIds[ i ] + "\"))" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tthrow " + classNames[ i ] + "Helper.read(_ax.getInputStream());" ); ps.println( "\t\t\t\t}" ); } } ps.println( "\t\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tfinally" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif (_os != null)"); 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_os.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}"); ps.println( "\t\t\t\t\tthis._releaseReply(_is);" ); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t}" + Environment.NL ); // local part ps.println( "\t\t\telse" ); ps.println( "\t\t\t{" ); } ps.println( "\t\t\t\torg.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( \"_set_" + name + "\", _opsClass);" ); ps.println( "\t\t\t\tif( _so == null )" ); ps.println( "\t\t\t\t\tcontinue;" ); ps.println( "\t\t\t\t" + classname + "Operations _localServant = (" + classname + "Operations)_so.servant;" ); ps.println( "\t\t\t\ttry" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\t_localServant." + name + "(a);" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();"); ps.println( "\t\t\t\t\treturn;"); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tcatch (RuntimeException re) "); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);"); ps.println( "\t\t\t\t\tthrow re;"); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tcatch (java.lang.Error err) "); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) "); ps.println( "\t\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);"); ps.println( "\t\t\t\t\tthrow err;"); ps.println( "\t\t\t\t}" ); ps.println( "\t\t\t\tfinally" ); ps.println( "\t\t\t\t{" ); ps.println( "\t\t\t\t\t_servant_postinvoke(_so);" ); ps.println( "\t\t\t\t}" ); if( !is_local ) ps.println( "\t\t\t}" + Environment.NL ); ps.println( "\t\t}" + Environment.NL ); ps.println( "\t}" + Environment.NL ); } } public void print_sendc_Method( PrintWriter ps, String classname ) { ps.print( "\tpublic void sendc_" ); if( isGetter() ) { // accessor method ps.print ( "get_" + name ); ps.println( "(AMI_" + classname + "Handler ami_handler)" ); ps.println( "\t{" ); ps.println( "\t\twhile(true)" ); ps.println( "\t\t{" ); ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\torg.omg.CORBA.portable.OutputStream _os = _request(\"_get_" + name + "\",true);" ); ps.println( "\t\t\t\t((org.jacorb.orb.Delegate)_get_delegate()).invoke(this, _os, ami_handler);" ); ps.println( "\t\t\t\treturn;" ); ps.println( "\t\t\t}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.RemarshalException _rx ){}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.ApplicationException _ax )" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tString _id = _ax.getId();" ); 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\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); ps.println( "\t\t\t}" ); ps.println( "\t\t}" ); ps.println( "\t}" + Environment.NL ); } else { // modifier ps.print ( "set_" + name ); ps.print ( "(AMI_" + classname + "Handler ami_handler, " ); ps.println ( parameterType.toString() + " attr_" + name + ")"); ps.println( "\t{" ); ps.println( "\t\twhile(true)" ); ps.println( "\t\t{" ); ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\torg.omg.CORBA.portable.OutputStream _os = _request(\"_set_" + name + "\",true);" ); ps.println( "\t\t\t\t" + parameterType.typeSpec().printWriteStatement( "attr_" + name, "_os" ) ); ps.println( "\t\t\t\t((org.jacorb.orb.Delegate)_get_delegate()).invoke(this, _os, ami_handler);" ); ps.println( "\t\t\t\treturn;" ); ps.println( "\t\t\t}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.RemarshalException _rx ){}" ); ps.println( "\t\t\tcatch( org.omg.CORBA.portable.ApplicationException _ax )" ); ps.println( "\t\t\t{" ); ps.println( "\t\t\t\tString _id = _ax.getId();" ); 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\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );" ); ps.println( "\t\t\t\t\t}" ); ps.println( "\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );" ); ps.println( "\t\t\t}" ); ps.println( "\t\t}" ); ps.println( "\t}" + Environment.NL ); } } public void printDelegatedMethod( PrintWriter ps ) { ps.print( "\tpublic " ); if( isGetter() ) { ps.print( resultType.toString() ); ps.print( " " + name + "()" ); raisesExpr.print(ps); ps.println(); ps.println( "\t{" ); ps.println( "\t\treturn _delegate." + name + "();" ); ps.println( "\t}" + Environment.NL ); } else { /** modifier */ ps.print( "void " + name + "(" + parameterType.toString() ); ps.print( " a)" ); raisesExpr.print(ps); ps.println(); ps.println( "\t{" ); ps.println( "\t\t_delegate." + name + "(a);" ); ps.println( "\t}" + Environment.NL ); } } public void printInvocation( PrintWriter ps ) { if( !raisesExpr.empty() ) { ps.println( "\t\t\ttry" ); ps.println( "\t\t\t{" ); } ps.println( "\t\t\t_out = handler.createReply();" ); ps.print( "\t\t\t" ); if( isGetter() ) { ps.println( resultType.typeSpec().printWriteStatement( name + "()", "_out" ) ); } else { ps.println( name + "(" + parameterType.printReadExpression( "_input" ) + ");" ); } 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 + ");" ); ps.println( "\t\t\t}" ); } } } public void accept( IDLTreeVisitor visitor ) { visitor.visitMethod( this ); } }