package org.jacorb.ir; /* * 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. */ import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import org.omg.CORBA.AbstractInterfaceDef; import org.omg.CORBA.AttributeDescription; import org.omg.CORBA.ExtInitializer; import org.omg.CORBA.ExtValueDef; import org.omg.CORBA.IDLType; import org.omg.CORBA.INTF_REPOS; import org.omg.CORBA.LocalInterfaceDef; import org.omg.CORBA.NO_IMPLEMENT; import org.omg.CORBA.OperationDescription; import org.omg.CORBA.ValueDef; import org.omg.CORBA.ContainerPackage.Description; import org.omg.CORBA.InterfaceDefPackage.FullInterfaceDescription; import org.omg.PortableServer.POA; import org.slf4j.Logger; /** * JacORB implementation of org.omg.CORBA.InterfaceDef * * @author Gerald Brose */ public class InterfaceDef extends org.jacorb.ir.Contained implements org.omg.CORBA.InterfaceDefOperations, ContainerType { Class theClass; private Class signatureClass; private org.omg.CORBA.TypeCode typeCode; private OperationDef[] op_defs; private org.omg.CORBA.OperationDescription[] operations; private AttributeDef[] att_defs; private org.omg.CORBA.AttributeDescription[] attributes; private ConstantDef[] constant_defs; private org.omg.CORBA.ConstantDescription[] constants; private org.omg.CORBA.InterfaceDef[] base_interfaces; private String [] base_names; private FullInterfaceDescription fullDescription; /** local references to contained objects */ private Hashtable containedLocals = new Hashtable(); /** CORBA references to contained objects */ private Hashtable contained = new Hashtable(); /* reference to my container as a contained object */ private org.omg.CORBA.Contained myContainer; private org.omg.CORBA.InterfaceDef myReference; private File my_dir; private String path; private boolean defined = false; private boolean loaded = false; private Class containedClass = null; private ClassLoader loader; private POA poa; private Logger logger; /** * Class constructor */ InterfaceDef( Class c, Class helperClass, String path, org.omg.CORBA.Container def_in, org.omg.CORBA.Repository ir, ClassLoader loader, POA poa, Logger logger) throws INTF_REPOS { this.loader = loader; this.poa = poa; this.logger = logger; if (ir == null) { throw new INTF_REPOS ("IR null!"); } if (def_in == null) { throw new INTF_REPOS ("Defined_in null!"); } def_kind = org.omg.CORBA.DefinitionKind.dk_Interface; containing_repository = ir; defined_in = def_in; if( def_in.equals(ir) ) myContainer = null; else myContainer = org.omg.CORBA.ContainedHelper.narrow( defined_in ); this.path = path; theClass = c; String classId = c.getName(); Hashtable irInfo= null; Class irHelperClass = null; try { irHelperClass = this.loader.loadClass( theClass.getName() + "IRHelper"); irInfo = (Hashtable)irHelperClass.getDeclaredField("irInfo").get(null); } catch( ClassNotFoundException e ) { logger.error("No IR helper class for interface " + theClass.getName(), e); } catch( Exception e ) { logger.error("Caught Exception", e); } if (irInfo == null) { throw new INTF_REPOS ("IR Info null!"); } try { containedClass = this.loader.loadClass("org.omg.CORBA.Contained"); signatureClass = this.loader.loadClass(classId + "Operations"); id( (String)helperClass.getDeclaredMethod("id", (Class[]) null).invoke( null, (Object[]) null ) ); version( id().substring( id().lastIndexOf(':'))); typeCode = TypeCodeUtil.getTypeCode( c, null, this.logger ); full_name = classId; if( classId.indexOf('.') > 0 ) { name = classId.substring( classId.lastIndexOf('.')+1); if (defined_in == null) { throw new INTF_REPOS ("InterfaceDef " + name + " path " + path + " has no defined_in repository"); } if( containedClass.isAssignableFrom( defined_in.getClass() )) absolute_name = ( myContainer != null ? myContainer.absolute_name() : "Global" ) + "::" + name; else absolute_name = "::" + name; } else { name = classId; defined_in = containing_repository; absolute_name = "::" + name; } if (this.logger.isDebugEnabled()) { this.logger.debug("InterfaceDef: " + absolute_name + " path: " + path); } /* get directory for nested definitions' classes */ File f = new File( path + fileSeparator + classId.replace('.', fileSeparator) + "Package" ); if( f.exists() && f.isDirectory() ) { my_dir = f; } } catch ( Exception e ) { this.logger.error("Caught exception",e); throw new INTF_REPOS( ErrorMsg.IR_Not_Implemented, org.omg.CORBA.CompletionStatus.COMPLETED_NO); } } public void loadContents() { if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " +name+ " loading... "); } // read from the interface class (operations and atributes) if (getReference() == null) { throw new INTF_REPOS ("getReference returns null"); } myReference = org.omg.CORBA.InterfaceDefHelper.narrow( getReference()); if (myReference == null) { throw new INTF_REPOS ("narrow failed for " + getReference ()); } /* load nested definitions from interfacePackage directory */ String[] classes = null; if( my_dir != null ) { classes = my_dir.list( new IRFilenameFilter(".class") ); // load class files in this interface's Package directory if( classes != null) { for( int j = 0; j< classes.length; j++ ) { try { if (this.logger.isDebugEnabled()) { this.logger.debug( "Interface " +name+ " tries " + full_name + "Package." + classes[j].substring( 0, classes[j].indexOf(".class")) ); } ClassLoader loader = getClass().getClassLoader(); if( loader == null ) { loader = this.loader; } Class cl = loader.loadClass( ( full_name + "Package." + classes[j].substring( 0, classes[j].indexOf(".class")) )); Contained containedObject = Contained.createContained( cl, path, myReference, containing_repository, this.logger, this.loader, this.poa); if( containedObject == null ) continue; org.omg.CORBA.Contained containedRef = Contained.createContainedReference(containedObject, this.logger, this.poa); containedRef.move( myReference, containedRef.name(), containedRef.version() ); if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + full_name + " loads "+ containedRef.name()); } contained.put( containedRef.name() , containedRef ); containedLocals.put( containedRef.name(), containedObject ); if( containedObject instanceof ContainerType ) ((ContainerType)containedObject).loadContents(); } catch ( Exception e ) { this.logger.error("Caught exception",e); } } } } loaded = true; if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + name + " loaded"); } } void define() { if ( ! loaded) { throw new INTF_REPOS ("Interface " + name + " not loaded!"); } if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + name + " defining... ]"); this.logger.debug("Interface " +name+ " loads attributes/ops"); } Vector ops = new Vector(); Vector atts = new Vector(); Hashtable irInfo= null; Class irHelperClass = null; try { irHelperClass = this.loader.loadClass( theClass.getName() + "IRHelper"); irInfo = (Hashtable)irHelperClass.getDeclaredField("irInfo").get(null); } catch( ClassNotFoundException e ) { this.logger.error("!! No IR helper class for interface " + theClass.getName(), e); } catch( Exception e ) { logger.error("Caught exception", e); } Method methods[] = signatureClass.getDeclaredMethods(); for( int i = 0; i < methods.length; i++ ) { Object value = irInfo.get(methods[i].getName()); if( value == null || !((String)value).startsWith("attribute")) { ops.addElement( new OperationDef( methods[i], theClass, irHelperClass, myReference, this.logger, this.loader, this.poa)); } else { if( ((String)value).startsWith("attribute") ) { String attrDescr = (String)value; if( methods[i].getReturnType() == Void.class ) continue; int idx = attrDescr.indexOf('-'); String attrTypeName = attrDescr.substring( attrDescr.indexOf(";")+1); atts.addElement( new AttributeDef( methods[i], attrTypeName, ( idx > 0 ? org.omg.CORBA.AttributeMode.ATTR_NORMAL : org.omg.CORBA.AttributeMode.ATTR_READONLY ), myReference, containing_repository, this.logger, this.loader, this.poa)); } } } if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " +name+ " defines ops"); } op_defs = new OperationDef[ ops.size() ]; ops.copyInto( op_defs ); for( int i = 0; i < op_defs.length; i++ ) { op_defs[i].move( myReference , op_defs[i].name(), version ); containedLocals.put( op_defs[i].name(), op_defs[i] ); try { org.omg.CORBA.OperationDef operationRef = org.omg.CORBA.OperationDefHelper.narrow( this.poa.servant_to_reference( new org.omg.CORBA.OperationDefPOATie( op_defs[i] ))); contained.put( op_defs[i].name(), operationRef ) ; op_defs[i].setReference(operationRef); } catch( Exception e ) { this.logger.error("Caught exception",e); } } if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " +name+ " defines attributes"); } att_defs = new AttributeDef[ atts.size() ]; atts.copyInto( att_defs ); for( int i = 0; i < att_defs.length; i++ ) { att_defs[i].move( myReference , att_defs[i].name(), version ); containedLocals.put( att_defs[i].name(), att_defs[i] ); try { org.omg.CORBA.AttributeDef attribute = org.omg.CORBA.AttributeDefHelper.narrow( this.poa.servant_to_reference( new org.omg.CORBA.AttributeDefPOATie( att_defs[i] ))); contained.put( att_defs[i].name(), attribute ); att_defs[i].setReference( attribute ); } catch( Exception e ) { this.logger.error("Caught exception",e); } } /* constants */ if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + name + " defines constants"); } Field[] fields = theClass.getDeclaredFields(); constant_defs = new ConstantDef[ fields.length ]; for( int i = 0; i < constant_defs.length; i++ ) { constant_defs[i] = new ConstantDef( fields[i], myReference, containing_repository, this.logger, this.poa); constant_defs[i].move( myReference , constant_defs[i].name(), version ); containedLocals.put( constant_defs[i].name(), constant_defs[i] ); try { org.omg.CORBA.ConstantDef constRef = org.omg.CORBA.ConstantDefHelper.narrow( this.poa.servant_to_reference( new org.omg.CORBA.ConstantDefPOATie( constant_defs[i] ))); contained.put( constant_defs[i].name(), constRef ) ; constant_defs[i].setReference(constRef); } catch( Exception e ) { this.logger.error("Caught exception",e); } } for( Enumeration e = containedLocals.elements(); e.hasMoreElements(); ((IRObject)e.nextElement()).define()) ; /* get base interfaces */ Class class_interfaces [] = theClass.getInterfaces(); Hashtable si = new Hashtable(); Class objectClass = null; try { objectClass = this.loader.loadClass( "org.omg.CORBA.Object"); } catch( ClassNotFoundException cnfe ) {} for( int i = 0; i < class_interfaces.length; i++ ) { if( objectClass.isAssignableFrom( class_interfaces[i] ) && !class_interfaces[i].getName().equals("org.omg.CORBA.Object") ) { si.put( class_interfaces[i], ""); } } Enumeration e = si.keys(); base_names = new String[ si.size() ]; int i = 0; Vector v = new Vector(); while( e.hasMoreElements() ) { try { Class baseClass = (Class)e.nextElement(); base_names[i] = baseClass.getName(); Class helperClass = this.loader.loadClass( base_names[i] + "Helper"); String baseId = (String)helperClass.getDeclaredMethod( "id", (Class[]) null).invoke(null, (Object[]) null); org.omg.CORBA.InterfaceDef base_interface = org.omg.CORBA.InterfaceDefHelper.narrow( containing_repository.lookup_id( baseId )); if( base_interface == null ) { this.logger.error("Base interface def " + baseId + " is null!!!"); } else { v.addElement( base_interface ); } i++; } catch( Exception exc ) { logger.error("unexpected exception", exc); } } base_interfaces = new org.omg.CORBA.InterfaceDef[ v.size() ]; v.copyInto( base_interfaces ); defined = true; if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + name + " defined ]"); } } /** * @return an array containing interface definitions of the superclass and * the interfaces extended by this class. Has length 0 if this class * is Object. */ public org.omg.CORBA.InterfaceDef[] base_interfaces() { return base_interfaces; } public FullInterfaceDescription describe_interface() { if ( ! defined) { throw new INTF_REPOS ("InterfaceDef " + name + " not defined."); } if( fullDescription == null ) { String def_in = "IDL:Global:1.0"; if( defined_in instanceof org.omg.CORBA.Contained ) def_in = ((org.omg.CORBA.Contained)defined_in).id(); /* before assembling descriptions, get hold of all super types' FullInterfaceDescriptions */ FullInterfaceDescription [] baseDescriptions = new FullInterfaceDescription[ base_interfaces().length ]; for( int b = 0; b < base_interfaces.length; b++ ) { baseDescriptions[b] = base_interfaces[b].describe_interface(); } /* build operation descriptions */ Hashtable ops = new Hashtable(); for( int c = 0; c < op_defs.length; c++ ) { OperationDescription operation = op_defs[c].describe_operation(); ops.put( operation.name, operation ); } /* get operation descriptions from super types, potentially duplicate descriptions due to diamond inheritance are removed by hashing */ for( int baseOps = 0; baseOps < baseDescriptions.length; baseOps++ ) { for( int bbaseOps = 0; bbaseOps < baseDescriptions[baseOps].operations.length; bbaseOps++ ) { OperationDescription base_op = baseDescriptions[baseOps].operations[bbaseOps]; if( !ops.containsKey( base_op.name )) ops.put( base_op.name, base_op ); } } operations = new OperationDescription[ ops.size() ]; int opsCount = 0; for( Enumeration e = ops.elements(); e.hasMoreElements(); opsCount++ ) { operations[ opsCount ] = (OperationDescription)e.nextElement(); } ops.clear(); /* build attribute descriptions */ Hashtable atts = new Hashtable(); for( int a = 0; a < att_defs.length; a++ ) { AttributeDescription att = att_defs[a].describe_attribute(); atts.put( att.name, att ); } /* get attribute descriptions from super types */ for( int baseAtts = 0; baseAtts < baseDescriptions.length; baseAtts++ ) { for( int bbaseAtts = 0; bbaseAtts < baseDescriptions[ baseAtts ].attributes.length; bbaseAtts++ ) { AttributeDescription base_att = baseDescriptions[ baseAtts ].attributes[ bbaseAtts ]; if( !atts.containsKey( base_att.name )) atts.put( base_att.name, base_att ); } } attributes = new AttributeDescription[ atts.size() ]; int attsCount = 0; for( Enumeration e = atts.elements(); e.hasMoreElements(); attsCount++ ) { attributes[ attsCount ] = (AttributeDescription)e.nextElement(); } atts.clear(); /* build constant descriptions */ constants = new org.omg.CORBA.ConstantDescription[ constant_defs.length ]; for( int b = 0; b < constant_defs.length; b++ ) { constants[b] = constant_defs[b].describe_constant(); } if (operations == null) { throw new INTF_REPOS ("operations null!"); } if (attributes == null) { throw new INTF_REPOS ("attributes null!"); } fullDescription = new FullInterfaceDescription( name, id, def_in, version, operations, attributes, base_names, typeCode); } return fullDescription; } public boolean is_a( String interface_id ) { if (this.logger.isDebugEnabled()) { this.logger.debug("Is interface " + id() + " a " + interface_id + "?"); } if( id().equals( interface_id )) return true; org.omg.CORBA.InterfaceDef[] bases = base_interfaces(); for( int i = 0; i < bases.length; i++ ) { if( bases[i].is_a( interface_id )) return true; if( bases[i].id().equals("IDL:omg.org/CORBA/Object:1.0")) continue; } if (this.logger.isDebugEnabled()) { this.logger.debug( "Interface " + id() + " is not a " + interface_id ); } return false; } // write methods on an InterfaceDef, // these are not supported at the moment !! public void base_interfaces( org.omg.CORBA.InterfaceDef[] a ) { throw new INTF_REPOS(ErrorMsg.IR_Not_Implemented, org.omg.CORBA.CompletionStatus.COMPLETED_NO); } public org.omg.CORBA.AttributeDef create_attribute( String id, String name, String version, IDLType type, org.omg.CORBA.AttributeMode mode ) { throw new INTF_REPOS( ErrorMsg.IR_Not_Implemented, org.omg.CORBA.CompletionStatus.COMPLETED_NO); } public org.omg.CORBA.OperationDef create_operation( String id, String name, String version, org.omg.CORBA.IDLType result, org.omg.CORBA.OperationMode mode, org.omg.CORBA.ParameterDescription[] params, org.omg.CORBA.ExceptionDef[] exceptions, String[] contexts ) { throw new INTF_REPOS( ErrorMsg.IR_Not_Implemented, org.omg.CORBA.CompletionStatus.COMPLETED_NO); } // from org.omg.CORBA.Container public org.omg.CORBA.Contained lookup( String scopedname ) { if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + this.name + " lookup " + scopedname); } String top_level_name; String rest_of_name; String name; if( scopedname.startsWith("::") ) { name = scopedname.substring(2); } else name = scopedname; if( name.indexOf("::") > 0 ) { top_level_name = name.substring( 0, name.indexOf("::") ); rest_of_name = name.substring( name.indexOf("::") + 2); } else { top_level_name = name; rest_of_name = null; } try { org.omg.CORBA.Contained top = (org.omg.CORBA.Contained)contained.get( top_level_name ); if( top == null ) { if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + this.name + " top " + top_level_name + " not found"); } return null; } if( rest_of_name == null ) { return top; } if( top instanceof org.omg.CORBA.Container) { return ((org.omg.CORBA.Container)top).lookup( rest_of_name ); } if (this.logger.isDebugEnabled()) { this.logger.debug("Interface " + this.name + " " + scopedname + " not found "); } return null; } catch( Exception e ) { this.logger.error("Caught exception",e); return null; } } public org.omg.CORBA.Contained[] contents(org.omg.CORBA.DefinitionKind limit_type, boolean exclude_inherited) { if ( ! defined) { throw new INTF_REPOS ("InterfaceDef " + name + " not defined."); } Hashtable limited = new Hashtable(); // analog constants, exceptions etc. for( Enumeration e = contained.elements(); e.hasMoreElements(); ) { org.omg.CORBA.Contained c = (org.omg.CORBA.Contained)e.nextElement(); if( limit_type.value() == org.omg.CORBA.DefinitionKind._dk_all || limit_type.value() == c.def_kind().value() ) { limited.put( c, "" ); } } org.omg.CORBA.Contained[] c = new org.omg.CORBA.Contained[limited.size()]; int i; Enumeration e; for( e = limited.keys(), i=0 ; e.hasMoreElements(); i++ ) c[i] = (org.omg.CORBA.Contained)e.nextElement(); return c; } public org.omg.CORBA.Contained[] lookup_name(String search_name, int levels_to_search, org.omg.CORBA.DefinitionKind limit_type, boolean exclude_inherited) { if( levels_to_search == 0 ) return null; org.omg.CORBA.Contained[] c = contents( limit_type, exclude_inherited ); Hashtable found = new Hashtable(); for( int i = 0; i < c.length; i++) if( c[i].name().equals( search_name ) ) found.put( c[i], "" ); if( levels_to_search > 1 || levels_to_search < 0 ) { // search up to a specific depth or indefinitely for( int i = 0; i < c.length; i++) { if( c[i] instanceof org.omg.CORBA.Container ) { org.omg.CORBA.Contained[] tmp_seq = ((org.omg.CORBA.Container)c[i]).lookup_name( search_name, levels_to_search-1, limit_type, exclude_inherited); if( tmp_seq != null ) for( int j = 0; j < tmp_seq.length; j++) found.put( tmp_seq[j], "" ); } } } org.omg.CORBA.Contained[] result = new org.omg.CORBA.Contained[ found.size() ]; int idx = 0; for( Enumeration e = found.keys(); e.hasMoreElements(); ) result[ idx++] = (org.omg.CORBA.Contained)e.nextElement(); return result; } public Description[] describe_contents(org.omg.CORBA.DefinitionKind limit_type, boolean exclude_inherited, int max_returned_objs) { return null; } // write interface not supported! public org.omg.CORBA.ModuleDef create_module( String id, String name, String version) { return null; } public org.omg.CORBA.ConstantDef create_constant( /*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, IDLType type, org.omg.CORBA.Any value) { return null; } public org.omg.CORBA.StructDef create_struct(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, /*StructMemberSeq*/ org.omg.CORBA.StructMember[] members) { return null; } public org.omg.CORBA.UnionDef create_union( /*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, org.omg.CORBA.IDLType discriminator_type, /*UnionMemberSeq*/ org.omg.CORBA.UnionMember[] members) { return null; } public org.omg.CORBA.EnumDef create_enum(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, /*EnumMemberSeq*/ /*Identifier*/ String[] members) { return null; } public org.omg.CORBA.AliasDef create_alias(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, org.omg.CORBA.IDLType original_type) { return null; } /** * not supported */ public org.omg.CORBA.ExceptionDef create_exception(String id, String name , String version, org.omg.CORBA.StructMember[] member ) { return null; } /** * not supported */ public org.omg.CORBA.InterfaceDef create_interface(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, /*InterfaceDefSeq*/ org.omg.CORBA.InterfaceDef[] base_interfaces) { return null; } /** * not supported */ public org.omg.CORBA.ValueBoxDef create_value_box(String id, String name, String version, org.omg.CORBA.IDLType type) { return null; } /** * not supported */ public org.omg.CORBA.ValueDef create_value(String id, String name, String version, boolean is_custom, boolean is_abstract, org.omg.CORBA.ValueDef base_value, boolean is_truncatable, org.omg.CORBA.ValueDef[] abstract_base_values, org.omg.CORBA.InterfaceDef[] supported_interfaces, org.omg.CORBA.Initializer[] initializers) { return null; } /** * not supported */ public org.omg.CORBA.NativeDef create_native(String id, String name, String version) { return null; } // from Contained public org.omg.CORBA.ContainedPackage.Description describe() { if ( ! defined) { throw new INTF_REPOS ("InterfaceDef " + name + " not defined."); } org.omg.CORBA.Any a = orb.create_any(); String def_in = null; if( myContainer == null ) def_in = "Global"; else def_in = myContainer.id(); org.omg.CORBA.InterfaceDescriptionHelper.insert( a, new org.omg.CORBA.InterfaceDescription( name, id, def_in, version, base_names) ); return new org.omg.CORBA.ContainedPackage.Description( org.omg.CORBA.DefinitionKind.dk_Interface, a); } // from IRObject public void destroy() { containedLocals.clear(); contained.clear(); } // from IDLType public org.omg.CORBA.TypeCode type() { return typeCode; } public AbstractInterfaceDef create_abstract_interface (String id, String name, String version, AbstractInterfaceDef[] baseInterfaces) { throw new NO_IMPLEMENT ("NYI"); } public ExtValueDef create_ext_value (String id, String name, String version, boolean isCustom, boolean isAbstract, ValueDef baseValue, boolean isTruncatable, ValueDef[] abstractBaseValues, org.omg.CORBA.InterfaceDef[] supportedInterfaces, ExtInitializer[] initializers) { throw new NO_IMPLEMENT ("NYI"); } public LocalInterfaceDef create_local_interface (String id, String name, String version, org.omg.CORBA.InterfaceDef[] baseInterfaces) { throw new NO_IMPLEMENT ("NYI"); } }