/* * JacORB - a free Java ORB * * Copyright (C) 1999-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.ArrayList; import java.util.Iterator; import java.util.List; /** * A ReplyHandler receives replies of asynchronous invocations of * another interface (we call this interface the "parent" of the * ReplyHandler). * * @author Andre Spiegel */ public class ReplyHandler extends Interface { public ReplyHandler (Interface parent) { super (new_num()); name = "AMI_" + parent.name + "Handler"; pack_name = parent.pack_name; createInheritanceSpec (parent.inheritanceSpec); body = new InterfaceBody (new_num()); body.set_name (name); body.my_interface = this; body.setEnclosingSymbol (this); body.inheritance_spec = this.inheritanceSpec; createOperations (parent); } /** * Creates an inheritance spec for this ReplyHandler, based * on the inheritance spec of the parent interface. */ private void createInheritanceSpec (SymbolList source) { inheritanceSpec = new SymbolList (new_num()); if (source.v.isEmpty()) { ScopedName n = new ScopedName (new_num()); n.pack_name = "org.omg.Messaging"; n.typeName = "ReplyHandler"; inheritanceSpec.v.add (n); } else { for (Iterator i = source.v.iterator(); i.hasNext();) { ScopedName n1 = (ScopedName)i.next(); ScopedName n2 = new ScopedName (new_num()); StringBuffer typeName = new StringBuffer(n1.typeName()); int nameStart = typeName.lastIndexOf(".") + 1; typeName.insert(nameStart, "AMI_"); typeName.append("Handler"); n2.typeName = typeName.toString(); inheritanceSpec.v.add (n2); } } } /** * Creates the operations of this ReplyHandler and puts them into the body. */ private void createOperations (Interface parent) { for (Iterator<Definition> i = parent.body.v.iterator(); i.hasNext();) { Declaration d = i.next().get_declaration(); if (d instanceof OpDecl) { createOperationsFor ((OpDecl)d); } else if (d instanceof AttrDecl) { createOperationsFor ((AttrDecl)d); } } } /** * Creates the ReplyHandler operations for the given operation of the * parent interface, and puts them into the body of this ReplyHandler. */ private void createOperationsFor (OpDecl d) { // Create the parameter list for the NO_EXCEPTION reply operation List paramDecls = new ArrayList(); if (!(d.opTypeSpec.type_spec instanceof VoidTypeSpec)) { paramDecls.add (new ParamDecl (ParamDecl.MODE_IN, d.opTypeSpec, "ami_return_val")); } for (Iterator i = d.paramDecls.iterator(); i.hasNext();) { ParamDecl p = (ParamDecl)i.next(); if (p.paramAttribute != ParamDecl.MODE_IN) { paramDecls.add (new ParamDecl (ParamDecl.MODE_IN, p.paramTypeSpec, p.simple_declarator)); } } body.addDefinition (new OpDecl (this, d.name, paramDecls)); body.addDefinition (new OpDecl (this, d.name + "_excep", excepParameterList())); } /** * Creates the ReplyHandler operations for the given attribute declaration * of the parent interface, and puts them into the body of this ReplyHandler. */ private void createOperationsFor (AttrDecl d) { for (Iterator i = d.declarators.v.iterator(); i.hasNext();) { SimpleDeclarator decl = (SimpleDeclarator)i.next(); body.addDefinition (new OpDecl (this, "_get_" + decl.name, parameterList (d.param_type_spec, "ami_return_val"))); body.addDefinition (new OpDecl (this, "_get_" + decl.name + "_excep", excepParameterList())); if (!d.readOnly) { body.addDefinition (new OpDecl (this, "_set_" + decl.name, new ArrayList())); body.addDefinition (new OpDecl (this, "_set_" + decl.name + "_excep", excepParameterList())); } } } /** * Returns a parameter list with a single "in" argument that has * the given type and name. */ private List parameterList(TypeSpec type, String name) { List result = new ArrayList(); result.add (new ParamDecl (ParamDecl.MODE_IN, type, name)); return result; } private List excepParameterList() { return parameterList (new ExceptionHolderTypeSpec (new_num()), "excep_holder"); } public String id() { return "IDL:" + full_name().replace('.', '/') + ":1.0"; } public void parse() { if (!NameTable.isDefined ("org.omg.Messaging.ReplyHandler")) { try { NameTable.define ("org.omg.Messaging.ReplyHandler", IDLTypes.TYPE); TypeMap.typedef ("org.omg.Messaging.ReplyHandler", new ReplyHandlerTypeSpec (IdlSymbol.new_num())); } catch (Exception e) { throw new RuntimeException (e.toString()); } } ConstrTypeSpec ctspec = new ConstrTypeSpec (this); try { NameTable.define (full_name(), IDLTypes.INTERFACE); TypeMap.typedef(full_name(), ctspec); } catch (NameAlreadyDefined e) { parser.error( "Interface " + typeName() + " already defined", token ); } body.parse(); } public void print (PrintWriter ps) { printInterface(); printOperations(); printStub(); printHelper(); printImplSkeleton(); printTieSkeleton(); } }