src/share/classes/sun/rmi/rmic/iiop/IDLGenerator.java

Mon, 26 Mar 2012 14:01:40 +0100

author
coffeys
date
Mon, 26 Mar 2012 14:01:40 +0100
changeset 370
5222b7d658d4
parent 158
91006f157c46
child 748
6845b95cba6b
permissions
-rw-r--r--

7143851: Improve IIOP stub and tie generation in RMIC
7149048: Changes to corba rmic stubGenerator class are not used during jdk build process
Reviewed-by: mschoene, robm

duke@1 1 /*
ohair@158 2 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@158 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@158 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@158 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@158 22 * or visit www.oracle.com if you need additional information or have any
ohair@158 23 * questions.
duke@1 24 */
duke@1 25 /*
duke@1 26 * Licensed Materials - Property of IBM
duke@1 27 * RMI-IIOP v1.0
duke@1 28 * Copyright IBM Corp. 1998 1999 All Rights Reserved
duke@1 29 *
duke@1 30 */
duke@1 31
duke@1 32 package sun.rmi.rmic.iiop;
duke@1 33
duke@1 34 import java.io.File;
duke@1 35 import java.io.IOException;
duke@1 36 import java.text.DateFormat;
duke@1 37 import java.util.Date;
duke@1 38 import java.util.Enumeration;
duke@1 39 import java.util.Hashtable;
duke@1 40 import java.util.Locale;
duke@1 41 import java.util.StringTokenizer;
duke@1 42 import java.util.Vector;
duke@1 43 import sun.tools.java.Identifier;
duke@1 44 import sun.tools.java.ClassDefinition;
duke@1 45 import sun.tools.java.CompilerError;
duke@1 46 import sun.rmi.rmic.IndentingWriter;
duke@1 47 import java.util.HashSet;
duke@1 48 import sun.rmi.rmic.Main;
duke@1 49
duke@1 50 /**
duke@1 51 * An IDL generator for rmic.
duke@1 52 *
duke@1 53 * @author Steve Newberry, Bryan Atsatt
duke@1 54 */
duke@1 55 public class IDLGenerator extends sun.rmi.rmic.iiop.Generator {
duke@1 56
duke@1 57 private boolean valueMethods = true;
duke@1 58 private boolean factory = true; //init==!factory
duke@1 59 private Hashtable ifHash = new Hashtable(); //IDL file Hashtable
duke@1 60 private Hashtable imHash = new Hashtable(); //IDL module Hashtable
duke@1 61
duke@1 62 private boolean isThrown = true; //flag for writeInclude
duke@1 63 private boolean isException = true; //flag for writeBanner, writeIfndef
duke@1 64 private boolean isForward = true; //flag for writeIfndef
duke@1 65 private boolean forValuetype = true; //flag for writeInherits
duke@1 66
duke@1 67 /**
duke@1 68 * Default constructor for Main to use.
duke@1 69 */
duke@1 70 public IDLGenerator() {
duke@1 71 }
duke@1 72
duke@1 73
duke@1 74 /**
duke@1 75 * Return true if a new instance should be created for each
duke@1 76 * class on the command line. Subclasses which return true
duke@1 77 * should override newInstance() to return an appropriately
duke@1 78 * constructed instance.
duke@1 79 */
duke@1 80 protected boolean requireNewInstance() {
duke@1 81 return false;
duke@1 82 }
duke@1 83
duke@1 84 /**
duke@1 85 * Return true if non-conforming types should be parsed.
duke@1 86 * @param stack The context stack.
duke@1 87 */
duke@1 88 protected boolean parseNonConforming(ContextStack stack) {
duke@1 89 return valueMethods;
duke@1 90 }
duke@1 91
duke@1 92 /**
duke@1 93 * Create and return a top-level type.
duke@1 94 * @param env The compiler environment.
duke@1 95 * @param cdef The top-level class definition.
duke@1 96 * @return An RemoteType or null if is non-conforming.
duke@1 97 */
duke@1 98 protected sun.rmi.rmic.iiop.CompoundType getTopType(ClassDefinition cdef,
duke@1 99 ContextStack stack) {
duke@1 100 return CompoundType.forCompound(cdef,stack);
duke@1 101 }
duke@1 102
duke@1 103
duke@1 104 /**
duke@1 105 * Return an Identifier which contains the fully-qualified IDL filename
duke@1 106 * for the given OutputType.
duke@1 107 * The OutputType contains a filename string (not directory) and Type.
duke@1 108 * @param ot the OutputType for which directory nesting is to be defined.
duke@1 109 * @return the new identifier.
duke@1 110 */
duke@1 111 protected Identifier getOutputId (
duke@1 112 OutputType ot ) {
duke@1 113 Identifier id = super.getOutputId( ot );
duke@1 114
duke@1 115 Type t = ot.getType();
duke@1 116 String fName = ot.getName();
duke@1 117
duke@1 118 if ( id == idJavaLangClass ) //java.lang.Class and array of
duke@1 119 if ( t.isArray() )
duke@1 120 return Identifier.lookup(
duke@1 121 "org.omg.boxedRMI.javax.rmi.CORBA." + fName );
duke@1 122 else return idClassDesc;
duke@1 123
duke@1 124 if ( id == idJavaLangString && //array of java.lang.String
duke@1 125 t.isArray() )
duke@1 126 return Identifier.lookup( "org.omg.boxedRMI.CORBA." + fName );
duke@1 127
duke@1 128 if ( "org.omg.CORBA.Object".equals( t.getQualifiedName() ) &&
duke@1 129 t.isArray() ) //array of org.omg.CORBA.Object
duke@1 130 return Identifier.lookup( "org.omg.boxedRMI." + fName );
duke@1 131
duke@1 132 if ( t.isArray()) { //array
duke@1 133 ArrayType at = (ArrayType)t;
duke@1 134 Type et = at.getElementType();
duke@1 135 if ( et.isCompound() ) {
duke@1 136 CompoundType ct = (CompoundType)et;
duke@1 137 String qName = ct.getQualifiedName();
duke@1 138 if ( ct.isIDLEntity() )
duke@1 139 return Identifier.lookup( getQualifiedName( at ) );
duke@1 140 }
duke@1 141 return Identifier.lookup( idBoxedRMI,id );
duke@1 142 }
duke@1 143
duke@1 144 if ( t.isCompound() ) { //boxed IDLEntity
duke@1 145 CompoundType ct = (CompoundType)t;
duke@1 146 String qName = ct.getQualifiedName();
duke@1 147 if ( ct.isBoxed() )
duke@1 148 return Identifier.lookup( getQualifiedName( ct ) );
duke@1 149 }
duke@1 150
duke@1 151 return id;
duke@1 152 }
duke@1 153
duke@1 154
duke@1 155
duke@1 156 /**
duke@1 157 * Return the file name extension for the given file name (e.g. ".java").
duke@1 158 * All files generated with the ".java" extension will be compiled. To
duke@1 159 * change this behavior for ".java" files, override the compileJavaSourceFile
duke@1 160 * method to return false.
duke@1 161 * @param outputType One of the items returned by getOutputTypesFor(...)
duke@1 162 */
duke@1 163 protected String getFileNameExtensionFor(OutputType outputType) {
duke@1 164 return IDL_FILE_EXTENSION;
duke@1 165 }
duke@1 166
duke@1 167
duke@1 168 /**
duke@1 169 * Examine and consume command line arguments.
duke@1 170 * @param argv The command line arguments. Ignore null
duke@1 171 * and unknown arguments. Set each consumed argument to null.
duke@1 172 * @param error Report any errors using the main.error() methods.
duke@1 173 * @return true if no errors, false otherwise.
duke@1 174 */
duke@1 175 public boolean parseArgs(String argv[], Main main) {
duke@1 176 boolean result = super.parseArgs(argv,main);
duke@1 177 String idlFrom;
duke@1 178 String idlTo;
duke@1 179 if (result) {
duke@1 180 nextArg:
duke@1 181 for (int i = 0; i < argv.length; i++) {
duke@1 182 if (argv[i] != null) {
duke@1 183 if (argv[i].equalsIgnoreCase("-idl")) {
duke@1 184 idl = true;
duke@1 185 argv[i] = null;
duke@1 186 }
duke@1 187 else if ( argv[i].equalsIgnoreCase( "-valueMethods" ) ) {
duke@1 188 valueMethods = true;
duke@1 189 argv[i] = null;
duke@1 190 }
duke@1 191 else if ( argv[i].equalsIgnoreCase( "-noValueMethods" ) ) {
duke@1 192 valueMethods = false;
duke@1 193 argv[i] = null;
duke@1 194 }
duke@1 195 else if ( argv[i].equalsIgnoreCase( "-init" ) ) {
duke@1 196 factory = false;
duke@1 197 argv[i] = null;
duke@1 198 }
duke@1 199 else if ( argv[i].equalsIgnoreCase( "-factory" ) ) {
duke@1 200 factory = true;
duke@1 201 argv[i] = null;
duke@1 202 }
duke@1 203 else if ( argv[i].equalsIgnoreCase( "-idlfile" ) ) {
duke@1 204 argv[i] = null;
duke@1 205 if ( ++i < argv.length && argv[i] != null && !argv[i].startsWith("-") ) {
duke@1 206 idlFrom = argv[i];
duke@1 207 argv[i] = null;
duke@1 208 if ( ++i < argv.length && argv[i] != null && !argv[i].startsWith("-") ) {
duke@1 209 idlTo = argv[i];
duke@1 210 argv[i] = null;
duke@1 211 ifHash.put( idlFrom,idlTo );
duke@1 212 continue nextArg;
duke@1 213 }
duke@1 214 }
duke@1 215 main.error("rmic.option.requires.argument", "-idlfile");
duke@1 216 result = false;
duke@1 217 }
duke@1 218 else if ( argv[i].equalsIgnoreCase( "-idlmodule" ) ) {
duke@1 219 argv[i] = null;
duke@1 220 if ( ++i < argv.length && argv[i] != null && !argv[i].startsWith("-") ) {
duke@1 221 idlFrom = argv[i];
duke@1 222 argv[i] = null;
duke@1 223 if ( ++i < argv.length && argv[i] != null && !argv[i].startsWith("-") ) {
duke@1 224 idlTo = argv[i];
duke@1 225 argv[i] = null;
duke@1 226 imHash.put( idlFrom,idlTo );
duke@1 227 continue nextArg;
duke@1 228 }
duke@1 229 }
duke@1 230 main.error("rmic.option.requires.argument", "-idlmodule");
duke@1 231 result = false;
duke@1 232 }
duke@1 233
duke@1 234
duke@1 235 }
duke@1 236 }
duke@1 237 }
duke@1 238 return result;
duke@1 239 }
duke@1 240
duke@1 241
duke@1 242
duke@1 243 /**
duke@1 244 * Return an array of OutputTypes for the IDL files that need to be
duke@1 245 * generated for the given top-level type.
duke@1 246 * OutputTypes contain filename string (not directory) and Type.
duke@1 247 * @param topType The type returned by getTopType().
duke@1 248 * @param alreadyChecked A set of Types which have already been checked.
duke@1 249 * @return Array of OutputTypes to generate
duke@1 250 */
duke@1 251 protected OutputType[] getOutputTypesFor(
duke@1 252 CompoundType topType,
duke@1 253 HashSet alreadyChecked ) {
duke@1 254 Vector refVec = getAllReferencesFor( topType );
duke@1 255 Vector outVec = new Vector();
duke@1 256 for ( int i1 = 0; i1 < refVec.size(); i1++ ) { //forall references
duke@1 257 Type t = (Type)refVec.elementAt( i1 );
duke@1 258 if ( t.isArray() ) {
duke@1 259 ArrayType at = (ArrayType)t;
duke@1 260 int dim = at.getArrayDimension();
duke@1 261 Type et = at.getElementType();
duke@1 262 String fName = unEsc( et.getIDLName() ).replace( ' ','_' );
duke@1 263 for ( int i2 = 0; i2 < dim; i2++ ) { //foreach dimension
duke@1 264 String fileName = "seq" + ( i2 + 1 ) + "_" + fName;
duke@1 265 outVec.addElement( new OutputType( fileName,at ) );
duke@1 266 }
duke@1 267 }
duke@1 268 else if ( t.isCompound() ) {
duke@1 269 String fName = unEsc( t.getIDLName() );
duke@1 270 outVec.addElement( new OutputType( fName.replace( ' ','_' ),t ) );
duke@1 271 if ( t.isClass() ) {
duke@1 272 ClassType ct = (ClassType)t;
duke@1 273 if ( ct.isException() ) { //exception file
duke@1 274 fName = unEsc( ct.getIDLExceptionName() );
duke@1 275 outVec.addElement( new OutputType( fName.replace( ' ','_' ),t ) );
duke@1 276 }
duke@1 277 }
duke@1 278 }
duke@1 279 }
duke@1 280 OutputType[] outArr = new OutputType[outVec.size()];
duke@1 281 outVec.copyInto( outArr );
duke@1 282 return outArr;
duke@1 283 }
duke@1 284
duke@1 285 /**
duke@1 286 * Get all referenced types of a given tyoe for which an IDL file needs
duke@1 287 * to be generated.
duke@1 288 * @param ct The given type.
duke@1 289 * @return Vector of Types for which IDL must be generated.
duke@1 290 */
duke@1 291 protected Vector getAllReferencesFor(
duke@1 292 CompoundType ct ) {
duke@1 293 Hashtable refHash = new Hashtable();
duke@1 294 Hashtable spcHash = new Hashtable();
duke@1 295 Hashtable arrHash = new Hashtable();
duke@1 296 int refSize;
duke@1 297 refHash.put( ct.getQualifiedName(),ct ); //put the given type
duke@1 298 accumulateReferences( refHash,spcHash,arrHash );
duke@1 299 do {
duke@1 300 refSize = refHash.size();
duke@1 301 accumulateReferences( refHash,spcHash,arrHash );
duke@1 302 }
duke@1 303 while ( refSize < refHash.size() ); //till hashtable stays same size
duke@1 304
duke@1 305 Vector outVec = new Vector();
duke@1 306 Enumeration e = refHash.elements(); //ordinary references
duke@1 307 while ( e.hasMoreElements() ) {
duke@1 308 CompoundType t = (CompoundType)e.nextElement();
duke@1 309 outVec.addElement( t );
duke@1 310 }
duke@1 311 e = spcHash.elements(); //special references
duke@1 312 while ( e.hasMoreElements() ) {
duke@1 313 CompoundType t = (CompoundType)e.nextElement();
duke@1 314 outVec.addElement( t );
duke@1 315 }
duke@1 316 e = arrHash.elements(); //array references
duke@1 317 nextSequence:
duke@1 318 while ( e.hasMoreElements() ) {
duke@1 319 ArrayType at = (ArrayType)e.nextElement();
duke@1 320 int dim = at.getArrayDimension();
duke@1 321 Type et = at.getElementType();
duke@1 322 Enumeration e2 = arrHash.elements();
duke@1 323 while ( e2.hasMoreElements() ) { //eliminate duplicates
duke@1 324 ArrayType at2 = (ArrayType)e2.nextElement();
duke@1 325 if ( et == at2.getElementType() && //same element type &
duke@1 326 dim < at2.getArrayDimension() ) //smaller dimension?
duke@1 327 continue nextSequence; //ignore this one
duke@1 328 }
duke@1 329 outVec.addElement( at );
duke@1 330 }
duke@1 331 return outVec;
duke@1 332 }
duke@1 333
duke@1 334
duke@1 335 /**
duke@1 336 * Accumulate and filter all those types that are referenced by the given
duke@1 337 * referenced types.
duke@1 338 * Keep only those for which IDL is to be generated.
duke@1 339 * @param refHash Hashtable containing the given types
duke@1 340 * @param spcHash Hashtable containing referenced specials (IDL typedefs)
duke@1 341 * @param arrHash Hashtable containing referenced arrays (dimensioned)
duke@1 342 */
duke@1 343 protected void accumulateReferences(
duke@1 344 Hashtable refHash,
duke@1 345 Hashtable spcHash,
duke@1 346 Hashtable arrHash ) {
duke@1 347 Enumeration e = refHash.elements();
duke@1 348 while ( e.hasMoreElements() ) {
duke@1 349 CompoundType t = (CompoundType)e.nextElement();
duke@1 350 Vector datVec = getData( t ); //collect and sort data
duke@1 351 Vector mthVec = getMethods( t ); //collect and filter methods
duke@1 352 getInterfaces( t,refHash ); //collect interfaces
duke@1 353 getInheritance( t,refHash ); //add inheritance
duke@1 354 getMethodReferences( mthVec,refHash,spcHash,arrHash,refHash );
duke@1 355 getMemberReferences( datVec,refHash,spcHash,arrHash );
duke@1 356 }
duke@1 357 e = arrHash.elements(); //add array element references
duke@1 358 while ( e.hasMoreElements() ) {
duke@1 359 ArrayType at = (ArrayType)e.nextElement();
duke@1 360 Type et = at.getElementType();
duke@1 361 addReference( et,refHash,spcHash,arrHash );
duke@1 362 }
duke@1 363 e = refHash.elements();
duke@1 364 while ( e.hasMoreElements() ) {
duke@1 365 CompoundType t = (CompoundType)e.nextElement();
duke@1 366 if ( !isIDLGeneratedFor( t ) ) //remove if no IDL generation
duke@1 367 refHash.remove( t.getQualifiedName() );
duke@1 368 }
duke@1 369 }
duke@1 370
duke@1 371
duke@1 372
duke@1 373 /**
duke@1 374 * Determine if IDL should be generated for a referenced type.
duke@1 375 * Do not generate IDL for a CORBA Object reference. It gets mapped
duke@1 376 * to the original IDL or to Object (if exactly org.omg.CORBA.Object)
duke@1 377 * Generate (boxed) IDL for an IDL Entity unless it is an IDL user
duke@1 378 * exception, a ValueBase, an AbstractBase (or a CORBA Object).
duke@1 379 * Do not generate IDL for Implementation classes..unless they inherit
duke@1 380 * from multiple distinct remote interfaces
duke@1 381 * @param t The type to check.
duke@1 382 * @return true or false
duke@1 383 */
duke@1 384 protected boolean isIDLGeneratedFor(
duke@1 385 CompoundType t ) {
duke@1 386 if ( t.isCORBAObject() ) return false;
duke@1 387 if ( t.isIDLEntity() )
duke@1 388 if ( t.isBoxed() ) return true;
duke@1 389 else if ( "org.omg.CORBA.portable.IDLEntity"
duke@1 390 .equals( t.getQualifiedName() ) ) return true;
duke@1 391 else if ( t.isCORBAUserException() ) return true;
duke@1 392 else return false;
duke@1 393 Hashtable inhHash = new Hashtable();
duke@1 394 getInterfaces( t,inhHash );
duke@1 395 if ( t.getTypeCode() == TYPE_IMPLEMENTATION )
duke@1 396 if ( inhHash.size() < 2 ) return false; //no multiple inheritance
duke@1 397 else return true;
duke@1 398 return true; //generate IDL for this type
duke@1 399 }
duke@1 400
duke@1 401
duke@1 402 /**
duke@1 403 * Write the output for the given OutputFileName into the output stream.
duke@1 404 * (The IDL mapping for java.lang.Class is generated from
duke@1 405 * javax.rmi.CORBA.ClassDesc in the tools workspace)
duke@1 406 * @param OutputType ot One of the items returned by getOutputTypesFor(...)
duke@1 407 * @param alreadyChecked A set of Types which have already been checked.
duke@1 408 * Intended to be passed to Type.collectMatching(filter,alreadyChecked).
duke@1 409 * @param p The output stream.
duke@1 410 */
duke@1 411 protected void writeOutputFor(
duke@1 412 OutputType ot,
duke@1 413 HashSet alreadyChecked,
duke@1 414 IndentingWriter p )
duke@1 415 throws IOException {
duke@1 416 Type t = ot.getType();
duke@1 417 if ( t.isArray() ) { //specialcase: sequence
duke@1 418 writeSequence( ot,p );
duke@1 419 return;
duke@1 420 }
duke@1 421 if ( isSpecialReference( t ) ) { //specialcase: IDL typecode
duke@1 422 writeSpecial( t,p );
duke@1 423 return;
duke@1 424 }
duke@1 425 if ( t.isCompound() ) { //specialcase: boxed IDL
duke@1 426 CompoundType ct = (CompoundType)t;
duke@1 427 if ( ct.isIDLEntity() && ct.isBoxed() ) {
duke@1 428 writeBoxedIDL( ct,p );
duke@1 429 return;
duke@1 430 }
duke@1 431 }
duke@1 432 if ( t.isClass() ) { //specialcase: exception
duke@1 433 ClassType ct = (ClassType)t;
duke@1 434 if ( ct.isException() ) {
duke@1 435 String eName = unEsc( ct.getIDLExceptionName() );
duke@1 436 String fName = ot.getName();
duke@1 437 if ( fName.equals( eName.replace( ' ','_' ) ) ) {
duke@1 438 writeException( ct,p );
duke@1 439 return;
duke@1 440 }
duke@1 441 }
duke@1 442 }
duke@1 443 switch ( t.getTypeCode() ) { //general case
duke@1 444 case TYPE_IMPLEMENTATION:
duke@1 445 writeImplementation( (ImplementationType)t,p );
duke@1 446 break;
duke@1 447 case TYPE_NC_CLASS:
duke@1 448 case TYPE_NC_INTERFACE:
duke@1 449 writeNCType( (CompoundType)t,p );
duke@1 450 break;
duke@1 451 case TYPE_ABSTRACT: //AbstractType is a RemoteType
duke@1 452 case TYPE_REMOTE:
duke@1 453 writeRemote( (RemoteType)t,p );
duke@1 454 break;
duke@1 455 case TYPE_VALUE:
duke@1 456 writeValue( (ValueType)t,p );
duke@1 457 break;
duke@1 458 default:
duke@1 459 throw new CompilerError(
duke@1 460 "IDLGenerator got unexpected type code: "
duke@1 461 + t.getTypeCode());
duke@1 462 }
duke@1 463 }
duke@1 464
duke@1 465
duke@1 466 /**
duke@1 467 * Write an IDL interface definition for a Java implementation class
duke@1 468 * @param t The current ImplementationType
duke@1 469 * @param p The output stream.
duke@1 470 */
duke@1 471 protected void writeImplementation(
duke@1 472 ImplementationType t,
duke@1 473 IndentingWriter p )
duke@1 474 throws IOException {
duke@1 475 Hashtable inhHash = new Hashtable();
duke@1 476 Hashtable refHash = new Hashtable();
duke@1 477 getInterfaces( t,inhHash ); //collect interfaces
duke@1 478
duke@1 479 writeBanner( t,0,!isException,p );
duke@1 480 writeInheritedIncludes( inhHash,p );
duke@1 481 writeIfndef( t,0,!isException,!isForward,p );
duke@1 482 writeIncOrb( p );
duke@1 483 writeModule1( t,p );
duke@1 484 p.pln();p.pI();
duke@1 485 p.p( "interface " + t.getIDLName() );
duke@1 486 writeInherits( inhHash,!forValuetype,p );
duke@1 487
duke@1 488 p.pln( " {" );
duke@1 489 p.pln( "};" );
duke@1 490
duke@1 491 p.pO();p.pln();
duke@1 492 writeModule2( t,p );
duke@1 493 writeEpilog( t,refHash,p );
duke@1 494 }
duke@1 495
duke@1 496
duke@1 497 /**
duke@1 498 * Write an IDL valuetype definition for
duke@1 499 * 1) a nonconforming Java class
duke@1 500 * 2) a nonconforming Java interface (that is not an AbstractType)
duke@1 501 * @param t The current NC Type (NCClassType or NCInterfaceType)
duke@1 502 * @param p The output stream.
duke@1 503 */
duke@1 504 protected void writeNCType(
duke@1 505 CompoundType t,
duke@1 506 IndentingWriter p )
duke@1 507 throws IOException {
duke@1 508 Vector conVec = getConstants( t ); //collect constants
duke@1 509 Vector mthVec = getMethods( t ); //collect methods
duke@1 510 Hashtable inhHash = new Hashtable();
duke@1 511 Hashtable refHash = new Hashtable();
duke@1 512 Hashtable spcHash = new Hashtable();
duke@1 513 Hashtable arrHash = new Hashtable();
duke@1 514 Hashtable excHash = new Hashtable();
duke@1 515 getInterfaces( t,inhHash ); //collect interfaces
duke@1 516 getInheritance( t,inhHash ); //add inheritance
duke@1 517 getMethodReferences( mthVec,refHash,spcHash,arrHash,excHash );
duke@1 518
duke@1 519 writeProlog( t,refHash,spcHash,arrHash,excHash,inhHash,p );
duke@1 520 writeModule1( t,p );
duke@1 521 p.pln();p.pI();
duke@1 522 p.p( "abstract valuetype " + t.getIDLName() );
duke@1 523 writeInherits( inhHash,!forValuetype,p );
duke@1 524
duke@1 525 p.pln( " {" );
duke@1 526 if ( conVec.size() + mthVec.size() > 0 ) { //any content?
duke@1 527 p.pln();p.pI();
duke@1 528 for ( int i1 = 0; i1 < conVec.size(); i1++ ) //write constants
duke@1 529 writeConstant( (CompoundType.Member)conVec.elementAt( i1 ),p );
duke@1 530 for ( int i1 = 0; i1 < mthVec.size(); i1++ ) //write methods
duke@1 531 writeMethod( (CompoundType.Method)mthVec.elementAt( i1 ),p );
duke@1 532 p.pO();p.pln();
duke@1 533 }
duke@1 534 p.pln( "};" );
duke@1 535
duke@1 536 p.pO();p.pln();
duke@1 537 writeModule2( t,p );
duke@1 538 writeEpilog( t,refHash,p );
duke@1 539 }
duke@1 540
duke@1 541
duke@1 542 /**
duke@1 543 * Write an IDL interface definition for either:
duke@1 544 * 1) a conforming Java remote interface (RemoteType)..or
duke@1 545 * 2) a non-conforming Java interface whose methods all throw
duke@1 546 * java.rmi.RemoteException (AbstractType)
duke@1 547 * @param t The current RemoteType
duke@1 548 * @param p The output stream.
duke@1 549 */
duke@1 550 protected void writeRemote(
duke@1 551 RemoteType t,
duke@1 552 IndentingWriter p )
duke@1 553 throws IOException {
duke@1 554 Vector conVec = getConstants( t ); //collect constants
duke@1 555 Vector mthVec = getMethods( t ); //collect methods
duke@1 556 Hashtable inhHash = new Hashtable();
duke@1 557 Hashtable refHash = new Hashtable();
duke@1 558 Hashtable spcHash = new Hashtable();
duke@1 559 Hashtable arrHash = new Hashtable();
duke@1 560 Hashtable excHash = new Hashtable();
duke@1 561 getInterfaces( t,inhHash ); //collect interfaces
duke@1 562 getMethodReferences( mthVec,refHash,spcHash,arrHash,excHash );
duke@1 563
duke@1 564 writeProlog( t,refHash,spcHash,arrHash,excHash,inhHash,p );
duke@1 565 writeModule1( t,p );
duke@1 566 p.pln();p.pI();
duke@1 567 if ( t.getTypeCode() == TYPE_ABSTRACT ) p.p( "abstract " );
duke@1 568 p.p( "interface " + t.getIDLName() );
duke@1 569 writeInherits( inhHash,!forValuetype,p );
duke@1 570
duke@1 571 p.pln( " {" );
duke@1 572 if ( conVec.size() + mthVec.size() > 0 ) { //any constants or methods?
duke@1 573 p.pln();p.pI();
duke@1 574 for ( int i1 = 0; i1 < conVec.size(); i1++ ) //constants
duke@1 575 writeConstant( (CompoundType.Member)conVec.elementAt( i1 ),p );
duke@1 576 for ( int i1 = 0; i1 < mthVec.size(); i1++ ) //methods, attributes
duke@1 577 writeMethod( (CompoundType.Method)mthVec.elementAt( i1 ),p );
duke@1 578 p.pO();p.pln();
duke@1 579 }
duke@1 580 p.pln( "};" );
duke@1 581
duke@1 582 p.pO();p.pln();
duke@1 583 writeRepositoryID ( t,p );
duke@1 584 p.pln();
duke@1 585 writeModule2( t,p );
duke@1 586 writeEpilog( t,refHash,p );
duke@1 587 }
duke@1 588
duke@1 589
duke@1 590 /**
duke@1 591 * Write an IDL valuetype definition for a conforming Java class.
duke@1 592 * Methods and constructors are optional..controlled by -valueMethods flag
duke@1 593 * @param t The current ValueType
duke@1 594 * @param p The output stream.
duke@1 595 */
duke@1 596 protected void writeValue(
duke@1 597 ValueType t,
duke@1 598 IndentingWriter p )
duke@1 599 throws IOException {
duke@1 600 Vector datVec = getData( t ); //collect and sort data
duke@1 601 Vector conVec = getConstants( t ); //collect constants
duke@1 602 Vector mthVec = getMethods( t ); //collect and filter methods
duke@1 603 Hashtable inhHash = new Hashtable();
duke@1 604 Hashtable refHash = new Hashtable();
duke@1 605 Hashtable spcHash = new Hashtable();
duke@1 606 Hashtable arrHash = new Hashtable();
duke@1 607 Hashtable excHash = new Hashtable();
duke@1 608 getInterfaces( t,inhHash ); //collect interfaces
duke@1 609 getInheritance( t,inhHash ); //add inheritance
duke@1 610 getMethodReferences( mthVec,refHash,spcHash,arrHash,excHash );
duke@1 611 getMemberReferences( datVec,refHash,spcHash,arrHash );
duke@1 612
duke@1 613 writeProlog( t,refHash,spcHash,arrHash,excHash,inhHash,p );
duke@1 614 writeModule1( t,p );
duke@1 615 p.pln();p.pI();
duke@1 616 if ( t.isCustom() ) p.p( "custom " );
duke@1 617 p.p( "valuetype " + t.getIDLName() );
duke@1 618 writeInherits( inhHash,forValuetype,p );
duke@1 619
duke@1 620 p.pln( " {" );
duke@1 621 if ( conVec.size() + datVec.size() + mthVec.size() > 0 ) { //any content?
duke@1 622 p.pln();p.pI();
duke@1 623 for ( int i1 = 0; i1 < conVec.size(); i1++ ) //write constants
duke@1 624 writeConstant( (CompoundType.Member)conVec.elementAt( i1 ),p );
duke@1 625 for ( int i1 = 0; i1 < datVec.size(); i1++ ) {
duke@1 626 CompoundType.Member mem = (CompoundType.Member)datVec.elementAt( i1 );
duke@1 627 if ( mem.getType().isPrimitive() )
duke@1 628 writeData( mem,p ); //write primitive data
duke@1 629 }
duke@1 630 for ( int i1 = 0; i1 < datVec.size(); i1++ ) {
duke@1 631 CompoundType.Member mem = (CompoundType.Member)datVec.elementAt( i1 );
duke@1 632 if ( !mem.getType().isPrimitive() )
duke@1 633 writeData( mem,p ); //write non-primitive data
duke@1 634 }
duke@1 635 for ( int i1 = 0; i1 < mthVec.size(); i1++ ) //write methods
duke@1 636 writeMethod( (CompoundType.Method)mthVec.elementAt( i1 ),p );
duke@1 637 p.pO();p.pln();
duke@1 638 }
duke@1 639 p.pln( "};" );
duke@1 640
duke@1 641 p.pO();p.pln();
duke@1 642 writeRepositoryID ( t,p );
duke@1 643 p.pln();
duke@1 644 writeModule2( t,p );
duke@1 645 writeEpilog( t,refHash,p );
duke@1 646 }
duke@1 647
duke@1 648
duke@1 649 /**
duke@1 650 * Write IDL prolog for a CompoundType.
duke@1 651 * @param t The CompoundType.
duke@1 652 * @param refHash Hashtable loaded with type references.
duke@1 653 * @param spcHash Hashtable loaded with special type references.
duke@1 654 * @param arrHash Hashtable loaded with array references.
duke@1 655 * @param excHash Hashtable loaded with exceptions thrown.
duke@1 656 * @param inhHash Hashtable loaded with inherited types.
duke@1 657 * @param p The output stream.
duke@1 658 */
duke@1 659 protected void writeProlog(
duke@1 660 CompoundType t,
duke@1 661 Hashtable refHash,
duke@1 662 Hashtable spcHash,
duke@1 663 Hashtable arrHash,
duke@1 664 Hashtable excHash,
duke@1 665 Hashtable inhHash,
duke@1 666 IndentingWriter p )
duke@1 667 throws IOException {
duke@1 668 writeBanner( t,0,!isException,p );
duke@1 669 writeForwardReferences( refHash,p );
duke@1 670 writeIncludes( excHash,isThrown,p ); //#includes for exceptions thrown
duke@1 671 writeInheritedIncludes( inhHash,p );
duke@1 672 writeIncludes( spcHash,!isThrown,p ); //#includes for special types
duke@1 673 writeBoxedRMIIncludes( arrHash,p );
duke@1 674 writeIDLEntityIncludes( refHash,p );
duke@1 675 writeIncOrb( p );
duke@1 676 writeIfndef( t,0,!isException,!isForward,p );
duke@1 677 }
duke@1 678
duke@1 679
duke@1 680 /**
duke@1 681 * Write IDL epilog for a CompoundType.
duke@1 682 * @param t The CompoundType.
duke@1 683 * @param refHash Hashtable loaded with type references.
duke@1 684 * @param p The output stream.
duke@1 685 */
duke@1 686 protected void writeEpilog(
duke@1 687 CompoundType t,
duke@1 688 Hashtable refHash,
duke@1 689 IndentingWriter p )
duke@1 690 throws IOException {
duke@1 691 writeIncludes( refHash,!isThrown,p ); //#includes for forward dcl types
duke@1 692 writeEndif( p );
duke@1 693 }
duke@1 694
duke@1 695
duke@1 696
duke@1 697 /**
duke@1 698 * Write special typedef
duke@1 699 * @param t A special Type.
duke@1 700 * @param p The output stream.
duke@1 701 */
duke@1 702 protected void writeSpecial(
duke@1 703 Type t,
duke@1 704 IndentingWriter p )
duke@1 705 throws IOException {
duke@1 706 String spcName = t.getQualifiedName();
duke@1 707 if ( "java.io.Serializable".equals( spcName ) )
duke@1 708 writeJavaIoSerializable( t,p );
duke@1 709 else if ( "java.io.Externalizable".equals( spcName ) )
duke@1 710 writeJavaIoExternalizable( t,p );
duke@1 711 else if ( "java.lang.Object".equals( spcName) )
duke@1 712 writeJavaLangObject( t,p );
duke@1 713 else if ( "java.rmi.Remote".equals( spcName) )
duke@1 714 writeJavaRmiRemote( t,p );
duke@1 715 else if ( "org.omg.CORBA.portable.IDLEntity".equals( spcName) )
duke@1 716 writeIDLEntity( t,p );
duke@1 717 }
duke@1 718
duke@1 719
duke@1 720
duke@1 721 /**
duke@1 722 * Write a hard-coded IDL typedef definition for the special case
duke@1 723 * java.io.Serializable.
duke@1 724 * @param t The current Type
duke@1 725 * @param p The output stream.
duke@1 726 */
duke@1 727 protected void writeJavaIoSerializable(
duke@1 728 Type t,
duke@1 729 IndentingWriter p )
duke@1 730 throws IOException {
duke@1 731 writeBanner( t,0,!isException,p );
duke@1 732 writeIfndef( t,0,!isException,!isForward,p );
duke@1 733 writeModule1( t,p );
duke@1 734 p.pln();p.pI();
duke@1 735 p.pln( "typedef any Serializable;" );
duke@1 736 p.pO();p.pln();
duke@1 737 writeModule2( t,p );
duke@1 738 writeEndif( p );
duke@1 739 }
duke@1 740
duke@1 741
duke@1 742 /**
duke@1 743 * Write a hard-coded IDL typedef definition for the special case
duke@1 744 * java.io.Externalizable.
duke@1 745 * @param t The current Type
duke@1 746 * @param p The output stream.
duke@1 747 */
duke@1 748 protected void writeJavaIoExternalizable(
duke@1 749 Type t,
duke@1 750 IndentingWriter p )
duke@1 751 throws IOException {
duke@1 752 writeBanner( t,0,!isException,p );
duke@1 753 writeIfndef( t,0,!isException,!isForward,p );
duke@1 754 writeModule1( t,p );
duke@1 755 p.pln();p.pI();
duke@1 756 p.pln( "typedef any Externalizable;" );
duke@1 757 p.pO();p.pln();
duke@1 758 writeModule2( t,p );
duke@1 759 writeEndif( p );
duke@1 760 }
duke@1 761
duke@1 762
duke@1 763 /**
duke@1 764 * Write a hard-coded IDL typedef definition for the special case
duke@1 765 * java.lang.Object.
duke@1 766 * @param t The current Type
duke@1 767 * @param p The output stream.
duke@1 768 */
duke@1 769 protected void writeJavaLangObject(
duke@1 770 Type t,
duke@1 771 IndentingWriter p )
duke@1 772 throws IOException {
duke@1 773 writeBanner( t,0,!isException,p );
duke@1 774 writeIfndef( t,0,!isException,!isForward,p );
duke@1 775 writeModule1( t,p );
duke@1 776 p.pln();p.pI();
duke@1 777 p.pln( "typedef any _Object;" );
duke@1 778 p.pO();p.pln();
duke@1 779 writeModule2( t,p );
duke@1 780 writeEndif( p );
duke@1 781 }
duke@1 782
duke@1 783
duke@1 784 /**
duke@1 785 * Write a hard-coded IDL typedef definition for the special case
duke@1 786 * java.rmi.Remote.
duke@1 787 * @param t The current Type
duke@1 788 * @param p The output stream.
duke@1 789 */
duke@1 790 protected void writeJavaRmiRemote(
duke@1 791 Type t,
duke@1 792 IndentingWriter p )
duke@1 793 throws IOException {
duke@1 794 writeBanner( t,0,!isException,p );
duke@1 795 writeIfndef( t,0,!isException,!isForward,p );
duke@1 796 writeModule1( t,p );
duke@1 797 p.pln();p.pI();
duke@1 798 p.pln( "typedef Object Remote;" );
duke@1 799 p.pO();p.pln();
duke@1 800 writeModule2( t,p );
duke@1 801 writeEndif( p );
duke@1 802 }
duke@1 803
duke@1 804
duke@1 805
duke@1 806 /**
duke@1 807 * Write a hard-coded IDL typedef definition for the special case
duke@1 808 * org.omg.CORBA.portable.IDLEntity
duke@1 809 * @param t The current Type
duke@1 810 * @param p The output stream.
duke@1 811 */
duke@1 812 protected void writeIDLEntity(
duke@1 813 Type t,
duke@1 814 IndentingWriter p )
duke@1 815 throws IOException {
duke@1 816 writeBanner( t,0,!isException,p );
duke@1 817 writeIfndef( t,0,!isException,!isForward,p );
duke@1 818 writeModule1( t,p );
duke@1 819 p.pln();p.pI();
duke@1 820 p.pln( "typedef any IDLEntity;" );
duke@1 821 p.pO();p.pln();
duke@1 822 writeModule2( t,p );
duke@1 823 writeEndif( p );
duke@1 824 }
duke@1 825
duke@1 826
duke@1 827 /**
duke@1 828 * Filter and collect non-duplicate inherited interfaces for a type
duke@1 829 * @param ct The current CompoundType
duke@1 830 * @param inhHash Hashtable containing the inherited interfaces
duke@1 831 */
duke@1 832 protected void getInterfaces(
duke@1 833 CompoundType ct,
duke@1 834 Hashtable inhHash ) {
duke@1 835 InterfaceType[] infs = ct.getInterfaces();
duke@1 836 nextInterface:
duke@1 837 for ( int i1 = 0; i1 < infs.length; i1++ ) { //forall inherited interfaces
duke@1 838 String inhName = infs[i1].getQualifiedName();
duke@1 839 switch ( ct.getTypeCode() ) {
duke@1 840 case TYPE_NC_CLASS:
duke@1 841 case TYPE_VALUE: //filter for classes
duke@1 842 if ( "java.io.Externalizable".equals( inhName ) ||
duke@1 843 "java.io.Serializable".equals( inhName ) ||
duke@1 844 "org.omg.CORBA.portable.IDLEntity".equals( inhName ) )
duke@1 845 continue nextInterface;
duke@1 846 break;
duke@1 847 default: //filter for all others
duke@1 848 if ( "java.rmi.Remote".equals( inhName ) )
duke@1 849 continue nextInterface;
duke@1 850 break;
duke@1 851 }
duke@1 852 inhHash.put( inhName,infs[i1] ); //add this one
duke@1 853 }
duke@1 854 }
duke@1 855
duke@1 856
duke@1 857 /**
duke@1 858 * Filter and add base class inheritance for a class type
duke@1 859 * @param ct The current CompoundType
duke@1 860 * @param inhHash Hashtable containing inherited types
duke@1 861 */
duke@1 862 protected void getInheritance(
duke@1 863 CompoundType ct,
duke@1 864 Hashtable inhHash ) {
duke@1 865 ClassType par = ct.getSuperclass(); //get parent
duke@1 866 if ( par == null ) return;
duke@1 867 String parName = par.getQualifiedName();
duke@1 868 switch ( ct.getTypeCode() ) {
duke@1 869 case TYPE_NC_CLASS:
duke@1 870 case TYPE_VALUE:
duke@1 871 if ( "java.lang.Object".equals( parName ) ) //this is implicit
duke@1 872 return;
duke@1 873 break;
duke@1 874 default: return; //ignore other types
duke@1 875 }
duke@1 876 inhHash.put( parName,par ); //add valid base class
duke@1 877 }
duke@1 878
duke@1 879
duke@1 880 /**
duke@1 881 * Collect and filter type and array references from methods
duke@1 882 * @param mthVec Given Vector of methods
duke@1 883 * @param refHash Hashtable for type references
duke@1 884 * @param spcHash Hashtable for special type references
duke@1 885 * @param arrHash Hashtable for array references
duke@1 886 * @param excHash Hashtable for exceptions thrown
duke@1 887 */
duke@1 888 protected void getMethodReferences(
duke@1 889 Vector mthVec,
duke@1 890 Hashtable refHash,
duke@1 891 Hashtable spcHash,
duke@1 892 Hashtable arrHash,
duke@1 893 Hashtable excHash ) {
duke@1 894 for ( int i1 = 0; i1 < mthVec.size(); i1++ ) { //forall methods
duke@1 895 CompoundType.Method mth = (CompoundType.Method)mthVec.elementAt( i1 );
duke@1 896 Type[] args = mth.getArguments();
duke@1 897 Type ret = mth.getReturnType();
duke@1 898 getExceptions( mth,excHash ); //collect exceptions thrown
duke@1 899 for ( int i2 = 0; i2 < args.length; i2++ ) //forall arguments
duke@1 900 addReference( args[i2],refHash,spcHash,arrHash );
duke@1 901 addReference( ret,refHash,spcHash,arrHash );
duke@1 902 }
duke@1 903 }
duke@1 904
duke@1 905
duke@1 906 /**
duke@1 907 * Collect and filter type and array references from data members
duke@1 908 * @param datVec Given Vector of data members
duke@1 909 * @param refHash Hashtable for type references
duke@1 910 * @param spcHash Hashtable for special type references
duke@1 911 * @param arrHash Hashtable for array references
duke@1 912 */
duke@1 913 protected void getMemberReferences(
duke@1 914 Vector datVec,
duke@1 915 Hashtable refHash,
duke@1 916 Hashtable spcHash,
duke@1 917 Hashtable arrHash ) {
duke@1 918 for ( int i1 = 0; i1 < datVec.size(); i1++ ) { //forall datamembers
duke@1 919 CompoundType.Member mem = (CompoundType.Member)datVec.elementAt( i1 );
duke@1 920 Type dat = mem.getType();
duke@1 921 addReference( dat,refHash,spcHash,arrHash );
duke@1 922 }
duke@1 923 }
duke@1 924
duke@1 925
duke@1 926 /**
duke@1 927 * Add reference for given type avoiding duplication.
duke@1 928 * Sort into specials, arrays and regular references.
duke@1 929 * Filter out types which are not required.
duke@1 930 * @param t Given Type
duke@1 931 * @param refHash Hashtable for type references
duke@1 932 * @param spcHash Hashtable for special type references
duke@1 933 * @param arrHash Hashtable for array references
duke@1 934 */
duke@1 935 protected void addReference(
duke@1 936 Type ref,
duke@1 937 Hashtable refHash,
duke@1 938 Hashtable spcHash,
duke@1 939 Hashtable arrHash ) {
duke@1 940 String rName = ref.getQualifiedName();
duke@1 941 switch ( ref.getTypeCode() ) {
duke@1 942 case TYPE_ABSTRACT:
duke@1 943 case TYPE_REMOTE:
duke@1 944 case TYPE_NC_CLASS:
duke@1 945 case TYPE_NC_INTERFACE:
duke@1 946 case TYPE_VALUE:
duke@1 947 refHash.put( rName,ref );
duke@1 948 return;
duke@1 949 case TYPE_CORBA_OBJECT:
duke@1 950 if ( "org.omg.CORBA.Object".equals( rName ) ) return; //don't want
duke@1 951 refHash.put( rName,ref );
duke@1 952 return;
duke@1 953 case TYPE_ARRAY: //array?
duke@1 954 arrHash.put( rName + ref.getArrayDimension(),ref );
duke@1 955 return;
duke@1 956 default:
duke@1 957 if ( isSpecialReference( ref ) ) //special IDL typedef?
duke@1 958 spcHash.put( rName,ref );
duke@1 959 }
duke@1 960 }
duke@1 961
duke@1 962
duke@1 963
duke@1 964 /**
duke@1 965 * Determine whether given Type is a special reference.
duke@1 966 * Special cases are: java.io.Serializable, java.io.Externalizable,
duke@1 967 * java.lang.Object, java.rmi.Remote and org.omg.CORBA.portable.IDLEntity
duke@1 968 * They are special because they have a hard-coded typedef defined in the
duke@1 969 * spec.
duke@1 970 * @param ref A referenced Type
duke@1 971 * @return boolean indicating whether it's a special reference
duke@1 972 */
duke@1 973 protected boolean isSpecialReference(
duke@1 974 Type ref ) {
duke@1 975 String rName = ref.getQualifiedName();
duke@1 976 if ( "java.io.Serializable".equals( rName ) ) return true;
duke@1 977 if ( "java.io.Externalizable".equals( rName ) ) return true;
duke@1 978 if ( "java.lang.Object".equals( rName) ) return true;
duke@1 979 if ( "java.rmi.Remote".equals( rName) ) return true;
duke@1 980 if ( "org.omg.CORBA.portable.IDLEntity".equals( rName) ) return true;
duke@1 981 return false;
duke@1 982 }
duke@1 983
duke@1 984
duke@1 985 /**
duke@1 986 * Collect and filter thrown exceptions for a given pre-filtered method.
duke@1 987 * Keep only 'checked' exception classes minus java.rmi.RemoteException
duke@1 988 * and its subclasses
duke@1 989 * @param method The current method
duke@1 990 * @param excHash Hashtable containing non-duplicate thrown exceptions
duke@1 991 */
duke@1 992 protected void getExceptions(
duke@1 993 CompoundType.Method mth,
duke@1 994 Hashtable excHash ) {
duke@1 995 ClassType[] excs = mth.getExceptions();
duke@1 996 for ( int i1 = 0; i1 < excs.length; i1++ ) { //forall exceptions
duke@1 997 ClassType exc = excs[i1];
duke@1 998 if ( exc.isCheckedException() &&
duke@1 999 !exc.isRemoteExceptionOrSubclass() ) {
duke@1 1000 excHash.put( exc.getQualifiedName(),exc );
duke@1 1001 }
duke@1 1002 }
duke@1 1003 }
duke@1 1004
duke@1 1005
duke@1 1006 /**
duke@1 1007 * Collect and filter methods for a type.
duke@1 1008 * Remove any private or inherited methods.
duke@1 1009 * @param ct The current CompoundType
duke@1 1010 * @return Vector containing the methods
duke@1 1011 */
duke@1 1012 protected Vector getMethods(
duke@1 1013 CompoundType ct ) {
duke@1 1014 Vector vec = new Vector();
duke@1 1015 int ctType = ct.getTypeCode();
duke@1 1016 switch ( ctType ) {
duke@1 1017 case TYPE_ABSTRACT:
duke@1 1018 case TYPE_REMOTE: break;
duke@1 1019 case TYPE_NC_CLASS:
duke@1 1020 case TYPE_NC_INTERFACE:
duke@1 1021 case TYPE_VALUE: if ( valueMethods ) break;
duke@1 1022 default: return vec;
duke@1 1023 }
duke@1 1024 Identifier ctId = ct.getIdentifier();
duke@1 1025 CompoundType.Method[] mths = ct.getMethods();
duke@1 1026 nextMethod:
duke@1 1027 for ( int i1 = 0; i1 < mths.length; i1++ ) { //forall methods
duke@1 1028 if ( mths[i1].isPrivate() || //private method?
duke@1 1029 mths[i1].isInherited() ) //inherited method?
duke@1 1030 continue nextMethod; //yes..ignore it
duke@1 1031 if ( ctType == TYPE_VALUE ) {
duke@1 1032 String mthName = mths[i1].getName();
duke@1 1033 if ( "readObject" .equals( mthName ) ||
duke@1 1034 "writeObject" .equals( mthName ) ||
duke@1 1035 "readExternal".equals( mthName ) ||
duke@1 1036 "writeExternal".equals( mthName ) )
duke@1 1037 continue nextMethod; //ignore this one
duke@1 1038 }
duke@1 1039 if ( ( ctType == TYPE_NC_CLASS ||
duke@1 1040 ctType == TYPE_NC_INTERFACE ) &&
duke@1 1041 mths[i1].isConstructor() ) //init not valid for abstract valuetype
duke@1 1042 continue nextMethod; //ignore this one
duke@1 1043 vec.addElement( mths[i1] ); //add this one
duke@1 1044 }
duke@1 1045 return vec;
duke@1 1046 }
duke@1 1047
duke@1 1048
duke@1 1049 /**
duke@1 1050 * Collect constants for a type.
duke@1 1051 * A valid constant is a "public final static" field with a compile-time
duke@1 1052 * constant value for a primitive type or String
duke@1 1053 * @param ct The current CompoundType
duke@1 1054 * @return Vector containing the constants
duke@1 1055 */
duke@1 1056 protected Vector getConstants(
duke@1 1057 CompoundType ct ) {
duke@1 1058 Vector vec = new Vector();
duke@1 1059 CompoundType.Member[] mems = ct.getMembers();
duke@1 1060 for ( int i1 = 0; i1 < mems.length; i1++ ) { //forall members
duke@1 1061 Type memType = mems[i1].getType();
duke@1 1062 String memValue = mems[i1].getValue();
duke@1 1063 if ( mems[i1].isPublic() &&
duke@1 1064 mems[i1].isFinal() &&
duke@1 1065 mems[i1].isStatic() &&
duke@1 1066 ( memType.isPrimitive() || "String".equals( memType.getName() ) ) &&
duke@1 1067 memValue != null )
duke@1 1068 vec.addElement( mems[i1] ); //add this one
duke@1 1069 }
duke@1 1070 return vec;
duke@1 1071 }
duke@1 1072
duke@1 1073
duke@1 1074 /**
duke@1 1075 * Collect and sort data fields for a ValueType.
duke@1 1076 * Sort in Java (not IDL) Unicode name string lexicographic increasing
duke@1 1077 * order.
duke@1 1078 * Non-static, non-transient fields are mapped.
duke@1 1079 * If the type is a custom valuetype, only public fields are mapped.
duke@1 1080 * @param ct The current CompoundType
duke@1 1081 * @return Vector containing the data fields
duke@1 1082 */
duke@1 1083 protected Vector getData(
duke@1 1084 CompoundType t ) {
duke@1 1085 Vector vec = new Vector();
duke@1 1086 if ( t.getTypeCode() != TYPE_VALUE ) return vec;
duke@1 1087 ValueType vt = (ValueType)t;
duke@1 1088 CompoundType.Member[] mems = vt.getMembers();
duke@1 1089 boolean notCust = !vt.isCustom();
duke@1 1090 for ( int i1 = 0; i1 < mems.length; i1++ ) { //forall members
duke@1 1091 if ( !mems[i1].isStatic() &&
duke@1 1092 !mems[i1].isTransient() &&
duke@1 1093 ( mems[i1].isPublic() || notCust ) ) {
duke@1 1094 int i2;
duke@1 1095 String memName = mems[i1].getName();
duke@1 1096 for ( i2 = 0; i2 < vec.size(); i2++ ) { //insert in java lex order
duke@1 1097 CompoundType.Member aMem = (CompoundType.Member)vec.elementAt( i2 );
duke@1 1098 if ( memName.compareTo( aMem.getName() ) < 0 ) break;
duke@1 1099 }
duke@1 1100 vec.insertElementAt( mems[i1],i2 ); //insert this one
duke@1 1101 }
duke@1 1102 }
duke@1 1103 return vec;
duke@1 1104 }
duke@1 1105
duke@1 1106
duke@1 1107 /**
duke@1 1108 * Write forward references for referenced interfaces and valuetypes
duke@1 1109 * ...but not if the reference is to a boxed IDLEntity,
duke@1 1110 * @param refHash Hashtable loaded with referenced types
duke@1 1111 * @param p The output stream.
duke@1 1112 */
duke@1 1113 protected void writeForwardReferences(
duke@1 1114 Hashtable refHash,
duke@1 1115 IndentingWriter p )
duke@1 1116 throws IOException {
duke@1 1117 Enumeration refEnum = refHash.elements();
duke@1 1118 nextReference:
duke@1 1119 while ( refEnum.hasMoreElements() ) {
duke@1 1120 Type t = (Type)refEnum.nextElement();
duke@1 1121 if ( t.isCompound() ) {
duke@1 1122 CompoundType ct = (CompoundType)t;
duke@1 1123 if ( ct.isIDLEntity() )
duke@1 1124 continue nextReference; //ignore IDLEntity reference
duke@1 1125 }
duke@1 1126 writeForwardReference( t,p );
duke@1 1127 }
duke@1 1128 }
duke@1 1129
duke@1 1130
duke@1 1131 /**
duke@1 1132 * Write forward reference for given type
duke@1 1133 * @param t Given type
duke@1 1134 * @param p The output stream.
duke@1 1135 */
duke@1 1136 protected void writeForwardReference(
duke@1 1137 Type t,
duke@1 1138 IndentingWriter p )
duke@1 1139 throws IOException {
duke@1 1140 String qName = t.getQualifiedName();
duke@1 1141 if ( "java.lang.String".equals( qName ) ) ;
duke@1 1142 else if ( "org.omg.CORBA.Object".equals( qName ) ) return ; //no fwd dcl
duke@1 1143
duke@1 1144 writeIfndef( t,0,!isException,isForward,p );
duke@1 1145 writeModule1( t,p );
duke@1 1146 p.pln();p.pI();
duke@1 1147 switch ( t.getTypeCode() ) {
duke@1 1148 case TYPE_NC_CLASS:
duke@1 1149 case TYPE_NC_INTERFACE: p.p( "abstract valuetype " ); break;
duke@1 1150 case TYPE_ABSTRACT: p.p( "abstract interface " ); break;
duke@1 1151 case TYPE_VALUE: p.p( "valuetype " ); break;
duke@1 1152 case TYPE_REMOTE:
duke@1 1153 case TYPE_CORBA_OBJECT: p.p( "interface " ); break;
duke@1 1154 default: ; //all other types were filtered
duke@1 1155 }
duke@1 1156 p.pln( t.getIDLName() + ";" );
duke@1 1157 p.pO();p.pln();
duke@1 1158 writeModule2( t,p );
duke@1 1159 writeEndif( p );
duke@1 1160 }
duke@1 1161
duke@1 1162
duke@1 1163 /**
duke@1 1164 * Write forward reference for boxed valuetype for single dimension of IDL
duke@1 1165 * sequence.
duke@1 1166 * If the dimension is <1 and the element is a CompoundType, write a
duke@1 1167 * forward declare for the element
duke@1 1168 * @param at ArrayType for forward declare
duke@1 1169 * @param dim The dimension to write
duke@1 1170 * @param p The output stream.
duke@1 1171 */
duke@1 1172 protected void writeForwardReference(
duke@1 1173 ArrayType at,
duke@1 1174 int dim,
duke@1 1175 IndentingWriter p)
duke@1 1176 throws IOException {
duke@1 1177 Type et = at.getElementType();
duke@1 1178 if ( dim < 1 ) {
duke@1 1179 if ( et.isCompound() ) {
duke@1 1180 CompoundType ct = (CompoundType)et;
duke@1 1181 writeForwardReference( et,p);
duke@1 1182 }
duke@1 1183 return;
duke@1 1184 }
duke@1 1185 String fName = unEsc( et.getIDLName() ).replace( ' ','_' );
duke@1 1186
duke@1 1187 writeIfndef( at,dim,!isException,isForward,p );
duke@1 1188 writeModule1( at,p );
duke@1 1189 p.pln();p.pI();
duke@1 1190 switch ( et.getTypeCode() ) {
duke@1 1191 case TYPE_NC_CLASS:
duke@1 1192 case TYPE_NC_INTERFACE: p.p( "abstract valuetype " ); break;
duke@1 1193 case TYPE_ABSTRACT: p.p( "abstract interface " ); break;
duke@1 1194 case TYPE_VALUE: p.p( "valuetype " ); break;
duke@1 1195 case TYPE_REMOTE:
duke@1 1196 case TYPE_CORBA_OBJECT: p.p( "interface " ); break;
duke@1 1197 default: ; //all other types were filtered
duke@1 1198 }
duke@1 1199 p.pln( "seq" + dim + "_" + fName + ";" );
duke@1 1200 p.pO();p.pln();
duke@1 1201 writeModule2( at,p );
duke@1 1202 writeEndif( p );
duke@1 1203 }
duke@1 1204
duke@1 1205
duke@1 1206 /**
duke@1 1207 * Write #includes for boxed IDLEntity references.
duke@1 1208 * @param refHash Hashtable loaded with referenced types
duke@1 1209 * @param p The output stream.
duke@1 1210 */
duke@1 1211 protected void writeIDLEntityIncludes(
duke@1 1212 Hashtable refHash,
duke@1 1213 IndentingWriter p )
duke@1 1214 throws IOException {
duke@1 1215 Enumeration refEnum = refHash.elements();
duke@1 1216 while ( refEnum.hasMoreElements() ) {
duke@1 1217 Type t = (Type)refEnum.nextElement();
duke@1 1218 if ( t.isCompound() ) {
duke@1 1219 CompoundType ct = (CompoundType)t;
duke@1 1220 if ( ct.isIDLEntity() ) { //select IDLEntities
duke@1 1221 writeInclude( ct,0,!isThrown,p );
duke@1 1222 refHash.remove( ct.getQualifiedName() ); //avoid another #include
duke@1 1223 }
duke@1 1224 }
duke@1 1225 }
duke@1 1226 }
duke@1 1227
duke@1 1228
duke@1 1229 /**
duke@1 1230 * Write #includes
duke@1 1231 * @param incHash Hashtable loaded with Types to include
duke@1 1232 * @param isThrown true if Types are thrown exceptions
duke@1 1233 * @param p The output stream.
duke@1 1234 */
duke@1 1235 protected void writeIncludes(
duke@1 1236 Hashtable incHash,
duke@1 1237 boolean isThrown,
duke@1 1238 IndentingWriter p )
duke@1 1239 throws IOException {
duke@1 1240 Enumeration incEnum = incHash.elements();
duke@1 1241 while ( incEnum.hasMoreElements() ) {
duke@1 1242 CompoundType t = (CompoundType)incEnum.nextElement();
duke@1 1243 writeInclude( t,0,isThrown,p );
duke@1 1244 }
duke@1 1245 }
duke@1 1246
duke@1 1247
duke@1 1248 /**
duke@1 1249 * Write includes for boxedRMI valuetypes for IDL sequences.
duke@1 1250 * Write only the maximum dimension found for an ArrayType.
duke@1 1251 * @param arrHash Hashtable loaded with array types
duke@1 1252 * @param p The output stream.
duke@1 1253 */
duke@1 1254 protected void writeBoxedRMIIncludes(
duke@1 1255 Hashtable arrHash,
duke@1 1256 IndentingWriter p)
duke@1 1257 throws IOException {
duke@1 1258 Enumeration e1 = arrHash.elements();
duke@1 1259 nextSequence:
duke@1 1260 while ( e1.hasMoreElements() ) {
duke@1 1261 ArrayType at = (ArrayType)e1.nextElement();
duke@1 1262 int dim = at.getArrayDimension();
duke@1 1263 Type et = at.getElementType();
duke@1 1264
duke@1 1265 Enumeration e2 = arrHash.elements();
duke@1 1266 while ( e2.hasMoreElements() ) { //eliminate duplicates
duke@1 1267 ArrayType at2 = (ArrayType)e2.nextElement();
duke@1 1268 if ( et == at2.getElementType() && //same element type &
duke@1 1269 dim < at2.getArrayDimension() ) //smaller dimension?
duke@1 1270 continue nextSequence; //ignore this one
duke@1 1271 }
duke@1 1272 writeInclude( at,dim,!isThrown,p );
duke@1 1273 }
duke@1 1274 }
duke@1 1275
duke@1 1276
duke@1 1277 /**
duke@1 1278 * Write #includes
duke@1 1279 * @param incHash Hashtable loaded with Types to include
duke@1 1280 * @param p The output stream.
duke@1 1281 */
duke@1 1282 protected void writeInheritedIncludes(
duke@1 1283 Hashtable inhHash,
duke@1 1284 IndentingWriter p )
duke@1 1285 throws IOException {
duke@1 1286 Enumeration inhEnum = inhHash.elements();
duke@1 1287 while ( inhEnum.hasMoreElements() ) {
duke@1 1288 CompoundType t = (CompoundType)inhEnum.nextElement();
duke@1 1289 writeInclude( t,0,!isThrown,p );
duke@1 1290 }
duke@1 1291 }
duke@1 1292
duke@1 1293
duke@1 1294 /**
duke@1 1295 * Write a #include.
duke@1 1296 * @param t Type to include
duke@1 1297 * @param dim The dimension to write if t is an array.
duke@1 1298 * @param isThrown boolean indicating if include is for thrown exception.
duke@1 1299 * @param p The output stream.
duke@1 1300 */
duke@1 1301 protected void writeInclude(
duke@1 1302 Type t,
duke@1 1303 int dim,
duke@1 1304 boolean isThrown,
duke@1 1305 IndentingWriter p)
duke@1 1306 throws IOException {
duke@1 1307 CompoundType ct;
duke@1 1308 String tName;
duke@1 1309 String[] modNames;
duke@1 1310 if ( t.isCompound() ) {
duke@1 1311 ct = (CompoundType)t;
duke@1 1312 String qName = ct.getQualifiedName();
duke@1 1313 if ( "java.lang.String".equals( qName ) ) {
duke@1 1314 writeIncOrb( p ); //#include orb.idl for String
duke@1 1315 return;
duke@1 1316 }
duke@1 1317 if ( "org.omg.CORBA.Object".equals( qName ) )
duke@1 1318 return; //Object treated like primitive
duke@1 1319 modNames = getIDLModuleNames( ct ); //module name array
duke@1 1320 tName = unEsc( ct.getIDLName() ); //file name default
duke@1 1321
duke@1 1322 if ( ct.isException() )
duke@1 1323 if ( ct.isIDLEntityException() )
duke@1 1324 if ( ct.isCORBAUserException() )
duke@1 1325 if ( isThrown ) tName = unEsc( ct.getIDLExceptionName() );
duke@1 1326 else ;
duke@1 1327 else tName = ct.getName(); //use original IDL name
duke@1 1328 else if ( isThrown )
duke@1 1329 tName = unEsc( ct.getIDLExceptionName() );
duke@1 1330 }
duke@1 1331 else if ( t.isArray() ) {
duke@1 1332 Type et = t.getElementType(); //file name for sequence
duke@1 1333 if ( dim > 0 ) {
duke@1 1334 modNames = getIDLModuleNames( t ); //module name array
duke@1 1335 tName = "seq" + dim + "_" + unEsc( et.getIDLName().replace( ' ','_' ) );
duke@1 1336 }
duke@1 1337 else{ //#include element
duke@1 1338 if ( !et.isCompound() ) return; //no include needed for primitive
duke@1 1339 ct = (CompoundType) et;
duke@1 1340 modNames = getIDLModuleNames( ct ); //no boxedRMI for element
duke@1 1341 tName = unEsc( ct.getIDLName() );
duke@1 1342 writeInclude( ct,modNames,tName,p );
duke@1 1343 return;
duke@1 1344 }
duke@1 1345 }
duke@1 1346 else return; //no include needed for primitive
duke@1 1347 writeInclude( t,modNames,tName,p );
duke@1 1348 }
duke@1 1349
duke@1 1350
duke@1 1351 /**
duke@1 1352 * Write a #include doing user specified -idlFile translation (if any) for
duke@1 1353 * IDLEntities.
duke@1 1354 * @param t Type to include.
duke@1 1355 * @param modNames Preprocessed module names (default).
duke@1 1356 * @param tName Preprocessed Type name (default).
duke@1 1357 * @param p The output stream.
duke@1 1358 */
duke@1 1359 protected void writeInclude(
duke@1 1360 Type t,
duke@1 1361 String[] modNames,
duke@1 1362 String tName,
duke@1 1363 IndentingWriter p)
duke@1 1364 throws IOException {
duke@1 1365 if ( t.isCompound() ) {
duke@1 1366 CompoundType it = (CompoundType)t;
duke@1 1367
duke@1 1368 if ( ifHash.size() > 0 && //any -idlFile translation to apply
duke@1 1369 it.isIDLEntity() ) { //..for this IDLEntity?
duke@1 1370 String qName = t.getQualifiedName(); //fully qualified orig Java name
duke@1 1371
duke@1 1372 Enumeration k = ifHash.keys();
duke@1 1373 while ( k.hasMoreElements() ) { //loop thro user-defined -idlFiles
duke@1 1374 String from = (String)k.nextElement();
duke@1 1375 if ( qName.startsWith( from ) ) { //found a match?
duke@1 1376 String to = (String)ifHash.get( from );
duke@1 1377 p.pln( "#include \"" + to + "\"" ); //user-specified idl filename
duke@1 1378 return; //don't look for any more
duke@1 1379 }
duke@1 1380 }
duke@1 1381 }
duke@1 1382 }
duke@1 1383 else if ( t.isArray() ) ; //no -idlFile translation needed for array
duke@1 1384 else return; //no #include needed for primitive
duke@1 1385
duke@1 1386 p.p( "#include \"" ); //no -idlFile translation required
duke@1 1387 for ( int i1 = 0; i1 < modNames.length; i1++ ) p.p( modNames[i1] + "/" );
duke@1 1388 p.p( tName + ".idl\"" );
duke@1 1389 p.pln();
duke@1 1390 }
duke@1 1391
duke@1 1392
duke@1 1393 /**
duke@1 1394 * Return the fully qualified Java Name for a Type.
duke@1 1395 * IDLEntity preprocessing done by getIDLModuleNames(t)
duke@1 1396 * @param t Given Type
duke@1 1397 * @return Array containing the original module nesting.
duke@1 1398 */
duke@1 1399 protected String getQualifiedName(
duke@1 1400 Type t ) {
duke@1 1401 String[] modNames = getIDLModuleNames( t );
duke@1 1402 int len = modNames.length;
duke@1 1403 StringBuffer buf = new StringBuffer();
duke@1 1404 for ( int i1 = 0; i1 < len; i1++ )
duke@1 1405 buf.append( modNames[i1] + "." );
duke@1 1406 buf.append( t.getIDLName() );
duke@1 1407 return buf.toString();
duke@1 1408 }
duke@1 1409
duke@1 1410
duke@1 1411 /**
duke@1 1412 * Return the global fully qualified IDL Name for a Type.
duke@1 1413 * IDLEntity preprocessing done by getIDLModuleNames(t)
duke@1 1414 * @param t Given Type
duke@1 1415 * @return Array containing the original module nesting.
duke@1 1416 */
duke@1 1417 protected String getQualifiedIDLName(Type t) {
duke@1 1418 if ( t.isPrimitive() )
duke@1 1419 return t.getIDLName();
duke@1 1420 if ( !t.isArray() &&
duke@1 1421 "org.omg.CORBA.Object".equals( t.getQualifiedName() ) )
duke@1 1422 return t.getIDLName();
duke@1 1423
duke@1 1424 String[] modNames = getIDLModuleNames( t );
duke@1 1425 int len = modNames.length;
duke@1 1426 if (len > 0) {
duke@1 1427 StringBuffer buf = new StringBuffer();
duke@1 1428 for ( int i1 = 0; i1 < len; i1++ )
duke@1 1429 buf.append( IDL_NAME_SEPARATOR + modNames[i1] );
duke@1 1430 buf.append( IDL_NAME_SEPARATOR + t.getIDLName() );
duke@1 1431 return buf.toString();
duke@1 1432 } else {
duke@1 1433 return t.getIDLName();
duke@1 1434 }
duke@1 1435 }
duke@1 1436
duke@1 1437
duke@1 1438 /**
duke@1 1439 * Return the IDL module nesting of the given Type.
duke@1 1440 * For IDLEntity CompoundTypes (or their arrays) apply any user specified
duke@1 1441 * -idlModule translation or, if none applicable, strip any package
duke@1 1442 * prefix.
duke@1 1443 * Add boxedIDL or boxedRMI modules if required.
duke@1 1444 * @param t Given Type
duke@1 1445 * @return Array containing the original module nesting.
duke@1 1446 */
duke@1 1447 protected String[] getIDLModuleNames(Type t) {
duke@1 1448 String[] modNames = t.getIDLModuleNames(); //default module name array
duke@1 1449 CompoundType ct;
duke@1 1450 if ( t.isCompound() ) {
duke@1 1451 ct = (CompoundType)t;
duke@1 1452 if ( !ct.isIDLEntity ) return modNames; //normal (non-IDLEntity) case
duke@1 1453 if ( "org.omg.CORBA.portable.IDLEntity"
duke@1 1454 .equals( t.getQualifiedName() ) )
duke@1 1455 return modNames;
duke@1 1456 }
duke@1 1457 else if ( t.isArray() ) {
duke@1 1458 Type et = t.getElementType();
duke@1 1459 if ( et.isCompound() ) {
duke@1 1460 ct = (CompoundType)et;
duke@1 1461 if ( !ct.isIDLEntity ) return modNames; //normal (non-IDLEntity) case
duke@1 1462 if ( "org.omg.CORBA.portable.IDLEntity"
duke@1 1463 .equals( t.getQualifiedName() ) )
duke@1 1464 return modNames;
duke@1 1465 }
duke@1 1466 else return modNames;
duke@1 1467 }
duke@1 1468 else return modNames; //no preprocessing needed for primitives
duke@1 1469
duke@1 1470 //it's an IDLEntity or an array of...
duke@1 1471 Vector mVec = new Vector();
duke@1 1472 if ( !translateJavaPackage( ct,mVec ) ) //apply -idlModule translation
duke@1 1473 stripJavaPackage( ct,mVec ); //..or strip prefixes (not both)
duke@1 1474
duke@1 1475 if ( ct.isBoxed() ) { //add boxedIDL if required
duke@1 1476 mVec.insertElementAt( "org",0 );
duke@1 1477 mVec.insertElementAt( "omg",1 );
duke@1 1478 mVec.insertElementAt( "boxedIDL",2 );
duke@1 1479 }
duke@1 1480 if ( t.isArray() ) { //add boxedRMI if required
duke@1 1481 mVec.insertElementAt( "org",0 );
duke@1 1482 mVec.insertElementAt( "omg",1 );
duke@1 1483 mVec.insertElementAt( "boxedRMI",2 );
duke@1 1484 }
duke@1 1485 String[] outArr = new String[mVec.size()];
duke@1 1486 mVec.copyInto( outArr );
duke@1 1487 return outArr;
duke@1 1488 }
duke@1 1489
duke@1 1490
duke@1 1491 /**
duke@1 1492 * Apply user specified -idlModule translation to package names of given
duke@1 1493 * IDLEntity ct. Example:
duke@1 1494 * -idlModule foo.bar real::mod::nesting
duke@1 1495 * @param ct CompoundType containing given IDLEntity.
duke@1 1496 * @param vec Returned Vector of translated IDL module names.
duke@1 1497 * @return boolean true if any translation was done.
duke@1 1498 */
duke@1 1499 protected boolean translateJavaPackage(
duke@1 1500 CompoundType ct,
duke@1 1501 Vector vec ) {
duke@1 1502 vec.removeAllElements();
duke@1 1503 boolean ret = false;
duke@1 1504 String fc = null;
duke@1 1505 if ( ! ct.isIDLEntity() ) return ret;
duke@1 1506
duke@1 1507 String pName = ct.getPackageName(); //start from Java package names
duke@1 1508 if ( pName == null ) return ret;
duke@1 1509 StringTokenizer pt = new StringTokenizer( pName,"." );
duke@1 1510 while ( pt.hasMoreTokens() ) vec.addElement( pt.nextToken() );
duke@1 1511
duke@1 1512 if ( imHash.size() > 0 ) { //any -idlModule translation to apply?
duke@1 1513 Enumeration k = imHash.keys();
duke@1 1514
duke@1 1515 nextModule:
duke@1 1516 while ( k.hasMoreElements() ) { //loop thro user-defined -idlModules
duke@1 1517 String from = (String)k.nextElement(); //from String..
duke@1 1518 StringTokenizer ft = new StringTokenizer( from,"." );
duke@1 1519 int vecLen = vec.size();
duke@1 1520 int ifr;
duke@1 1521 for ( ifr = 0; ifr < vecLen && ft.hasMoreTokens(); ifr++ )
duke@1 1522 if ( ! vec.elementAt(ifr).equals( ft.nextToken() ) )
duke@1 1523 continue nextModule; //..no match
duke@1 1524
duke@1 1525 if ( ft.hasMoreTokens() ) { //matched so far..
duke@1 1526 fc = ft.nextToken(); //a 'from' token remains
duke@1 1527 if ( ! ct.getName().equals( fc ) || //matches class name?
duke@1 1528 ft.hasMoreTokens() )
duke@1 1529 continue nextModule; //..no match
duke@1 1530 }
duke@1 1531
duke@1 1532 ret = true; //found a match
duke@1 1533 for ( int i4 = 0; i4 < ifr; i4++ )
duke@1 1534 vec.removeElementAt( 0 ); //remove 'from' package
duke@1 1535
duke@1 1536 String to = (String)imHash.get( from ); //..to String
duke@1 1537 StringTokenizer tt = new StringTokenizer( to,IDL_NAME_SEPARATOR );
duke@1 1538
duke@1 1539 int itoco = tt.countTokens();
duke@1 1540 int ito = 0;
duke@1 1541 if ( fc != null ) itoco--; //user may have given IDL type
duke@1 1542 for ( ito = 0; ito < itoco; ito++ )
duke@1 1543 vec.insertElementAt( tt.nextToken(),ito ); //insert 'to' modules
duke@1 1544 if ( fc != null ) {
duke@1 1545 String tc = tt.nextToken();
duke@1 1546 if ( ! ct.getName().equals( tc ) ) //not the IDL type, so..
duke@1 1547 vec.insertElementAt( tc,ito ); //insert final 'to' module
duke@1 1548 }
duke@1 1549 }
duke@1 1550 }
duke@1 1551 return ret;
duke@1 1552 }
duke@1 1553
duke@1 1554
duke@1 1555 /**
duke@1 1556 * Strip Java #pragma prefix and/or -pkgPrefix prefix package names from
duke@1 1557 * given IDLEntity ct.
duke@1 1558 * Strip any package prefix which may have been added by comparing with
duke@1 1559 * repository id. For example in Java package fake.omega:
duke@1 1560 * repid = IDL:phoney.pfix/omega/Juliet:1.0 gives { "omega" }
duke@1 1561 * @param ct CompoundType containing given IDLEntity.
duke@1 1562 * @param vec Returned Vector of stripped IDL module names.
duke@1 1563 */
duke@1 1564 protected void stripJavaPackage(
duke@1 1565 CompoundType ct,
duke@1 1566 Vector vec ) {
duke@1 1567 vec.removeAllElements();
duke@1 1568 if ( ! ct.isIDLEntity() ) return;
duke@1 1569
duke@1 1570 String repID = ct.getRepositoryID().substring( 4 );
duke@1 1571 StringTokenizer rept = new StringTokenizer( repID,"/" );
duke@1 1572 if ( rept.countTokens() < 2 ) return;
duke@1 1573
duke@1 1574 while ( rept.hasMoreTokens() )
duke@1 1575 vec.addElement( rept.nextToken() );
duke@1 1576 vec.removeElementAt( vec.size() - 1 );
duke@1 1577
duke@1 1578 String pName = ct.getPackageName(); //start from Java package names
duke@1 1579 if ( pName == null ) return;
duke@1 1580 Vector pVec = new Vector();
duke@1 1581 StringTokenizer pt = new StringTokenizer( pName,"." );
duke@1 1582 while ( pt.hasMoreTokens() ) pVec.addElement( pt.nextToken() );
duke@1 1583
duke@1 1584 int i1 = vec.size() - 1;
duke@1 1585 int i2 = pVec.size() - 1;
duke@1 1586 while ( i1 >= 0 && i2 >= 0 ) { //go R->L till mismatch
duke@1 1587 String rep = (String)( vec.elementAt( i1 ) );
duke@1 1588 String pkg = (String)( pVec.elementAt( i2 ) );
duke@1 1589 if ( ! pkg.equals( rep ) ) break;
duke@1 1590 i1--; i2--;
duke@1 1591 }
duke@1 1592 for ( int i3 = 0; i3 <= i1; i3++ )
duke@1 1593 vec.removeElementAt( 0 ); //strip prefix
duke@1 1594 }
duke@1 1595
duke@1 1596
duke@1 1597
duke@1 1598 /**
duke@1 1599 * Write boxedRMI valuetype for a single dimension of an IDL sequence
duke@1 1600 * indicated by the given OutputType.
duke@1 1601 * The filename for the OutputType is of the form "seqn_elemName" where n
duke@1 1602 * is the dimension required.
duke@1 1603 * @param ot Given OutputType.
duke@1 1604 * @param p The output stream.
duke@1 1605 */
duke@1 1606 protected void writeSequence(
duke@1 1607 OutputType ot,
duke@1 1608 IndentingWriter p)
duke@1 1609 throws IOException {
duke@1 1610 ArrayType at = (ArrayType)ot.getType();
duke@1 1611 Type et = at.getElementType();
duke@1 1612 String fName = ot.getName();
duke@1 1613 int dim = Integer.parseInt( fName.substring( 3,fName.indexOf( "_" ) ) );
duke@1 1614 String idlName = unEsc( et.getIDLName() ).replace( ' ','_' );
duke@1 1615 String qIdlName = getQualifiedIDLName( et );
duke@1 1616 String qName = et.getQualifiedName();
duke@1 1617
duke@1 1618 String repID = at.getRepositoryID();
duke@1 1619 int rix1 = repID.indexOf( '[' ); //edit repository id
duke@1 1620 int rix2 = repID.lastIndexOf( '[' ) + 1;
duke@1 1621 StringBuffer rid = new StringBuffer(
duke@1 1622 repID.substring( 0,rix1 ) +
duke@1 1623 repID.substring( rix2 ) );
duke@1 1624 for ( int i1 = 0; i1 < dim; i1++ ) rid.insert( rix1,'[' );
duke@1 1625
duke@1 1626 String vtName = "seq" + dim + "_" + idlName;
duke@1 1627 boolean isFromIDL = false;
duke@1 1628 if ( et.isCompound() ) {
duke@1 1629 CompoundType ct = (CompoundType)et;
duke@1 1630 isFromIDL = ct.isIDLEntity() || ct.isCORBAObject();
duke@1 1631 }
duke@1 1632 boolean isForwardInclude =
duke@1 1633 et.isCompound() &&
duke@1 1634 !isSpecialReference( et ) &&
duke@1 1635 dim == 1 &&
duke@1 1636 !isFromIDL &&
duke@1 1637 !"org.omg.CORBA.Object".equals(qName) &&
duke@1 1638 !"java.lang.String".equals(qName);
duke@1 1639
duke@1 1640 writeBanner( at,dim,!isException,p );
duke@1 1641 if ( dim == 1 && "java.lang.String".equals(qName) ) //special case
duke@1 1642 writeIncOrb( p );
duke@1 1643 if ( dim == 1 && "org.omg.CORBA.Object".equals(qName) ) ;
duke@1 1644 else if ( isSpecialReference( et ) || dim > 1 || isFromIDL )
duke@1 1645 writeInclude( at,dim-1,!isThrown,p ); //"trivial" include
duke@1 1646 writeIfndef( at,dim,!isException,!isForward,p );
duke@1 1647 if ( isForwardInclude )
duke@1 1648 writeForwardReference( at,dim-1,p ); //forward declare
duke@1 1649 writeModule1( at,p );
duke@1 1650 p.pln();p.pI();
duke@1 1651 p.p( "valuetype " + vtName );
duke@1 1652 p.p( " sequence<" );
duke@1 1653 if ( dim == 1 ) p.p( qIdlName );
duke@1 1654 else {
duke@1 1655 p.p( "seq" + ( dim - 1 ) + "_" );
duke@1 1656 p.p( idlName );
duke@1 1657 }
duke@1 1658 p.pln( ">;" );
duke@1 1659 p.pO();p.pln();
duke@1 1660 p.pln( "#pragma ID " + vtName + " \"" + rid + "\"" );
duke@1 1661 p.pln();
duke@1 1662 writeModule2( at,p );
duke@1 1663 if ( isForwardInclude )
duke@1 1664 writeInclude( at,dim-1,!isThrown,p ); //#include for forward declare
duke@1 1665 writeEndif( p );
duke@1 1666 }
duke@1 1667
duke@1 1668
duke@1 1669 /**
duke@1 1670 * Write valuetype for a boxed IDLEntity.
duke@1 1671 * @param t Given CompoundType representing the IDLEntity.
duke@1 1672 * @param p The output stream.
duke@1 1673 */
duke@1 1674 protected void writeBoxedIDL(
duke@1 1675 CompoundType t,
duke@1 1676 IndentingWriter p)
duke@1 1677 throws IOException {
duke@1 1678 String[] boxNames = getIDLModuleNames( t );
duke@1 1679 int len = boxNames.length;
duke@1 1680 String[] modNames = new String[len - 3]; //remove box modules
duke@1 1681 for ( int i1 = 0; i1 < len - 3; i1++ ) modNames[i1] = boxNames[i1 + 3];
duke@1 1682 String tName = unEsc( t.getIDLName() );
duke@1 1683
duke@1 1684 writeBanner( t,0,!isException,p );
duke@1 1685 writeInclude( t,modNames,tName,p );
duke@1 1686 writeIfndef( t,0,!isException,!isForward,p );
duke@1 1687 writeModule1( t,p );
duke@1 1688 p.pln();p.pI();
duke@1 1689
duke@1 1690 p.p( "valuetype " + tName + " " );
duke@1 1691 for ( int i1 = 0; i1 < modNames.length; i1++ )
duke@1 1692 p.p( IDL_NAME_SEPARATOR + modNames[i1] );
duke@1 1693 p.pln( IDL_NAME_SEPARATOR + tName + ";" );
duke@1 1694
duke@1 1695 p.pO();p.pln();
duke@1 1696 writeRepositoryID( t,p );
duke@1 1697 p.pln();
duke@1 1698 writeModule2( t,p );
duke@1 1699 writeEndif( p );
duke@1 1700 }
duke@1 1701
duke@1 1702
duke@1 1703 /**
duke@1 1704 * Write an exception.
duke@1 1705 * @param t Given ClassType representing the exception.
duke@1 1706 * @param p The output stream.
duke@1 1707 */
duke@1 1708 protected void writeException(
duke@1 1709 ClassType t,
duke@1 1710 IndentingWriter p)
duke@1 1711 throws IOException {
duke@1 1712 writeBanner( t,0,isException,p );
duke@1 1713 writeIfndef( t,0,isException,!isForward,p );
duke@1 1714 writeForwardReference( t,p );
duke@1 1715 writeModule1( t,p );
duke@1 1716 p.pln();p.pI();
duke@1 1717
duke@1 1718 p.pln( "exception " + t.getIDLExceptionName() + " {" );
duke@1 1719 p.pln();p.pI();
duke@1 1720 p.pln( t.getIDLName() + " value;" );
duke@1 1721 p.pO();p.pln();
duke@1 1722 p.pln( "};" );
duke@1 1723
duke@1 1724 p.pO();p.pln();
duke@1 1725 writeModule2( t,p );
duke@1 1726 writeInclude( t,0,!isThrown,p ); //include valuetype idl file
duke@1 1727 writeEndif( p );
duke@1 1728 }
duke@1 1729
duke@1 1730
duke@1 1731 /**
duke@1 1732 * Write #pragma to identify the repository ID of the given type
duke@1 1733 * @param t The given Type.
duke@1 1734 * @param p The output stream.
duke@1 1735 */
duke@1 1736 protected void writeRepositoryID(
duke@1 1737 Type t,
duke@1 1738 IndentingWriter p )
duke@1 1739 throws IOException {
duke@1 1740 String repid = t.getRepositoryID();
duke@1 1741 if ( t.isCompound() ) {
duke@1 1742 CompoundType ct = (CompoundType)t;
duke@1 1743 if ( ct.isBoxed() )
duke@1 1744 repid = ct.getBoxedRepositoryID();
duke@1 1745 }
duke@1 1746
duke@1 1747 p.pln( "#pragma ID " + t.getIDLName() + " \"" +
duke@1 1748 repid + "\"" );
duke@1 1749 }
duke@1 1750
duke@1 1751 /**
duke@1 1752 * Write inheritance for an IDL interface or valuetype. Any class
duke@1 1753 * inheritance precedes any interface inheritance.
duke@1 1754 * For a valutype any inheritance from abstract interfaces then
duke@1 1755 * follows the "supports" keyword.
duke@1 1756 * @param inhHash Hashtable loaded with inherited Types
duke@1 1757 * @param forValuetype true if writing inheritance for a valuetype
duke@1 1758 * @param p The output stream.
duke@1 1759 */
duke@1 1760 protected void writeInherits(
duke@1 1761 Hashtable inhHash,
duke@1 1762 boolean forValuetype,
duke@1 1763 IndentingWriter p )
duke@1 1764 throws IOException {
duke@1 1765 int itot = inhHash.size();
duke@1 1766 int iinh = 0;
duke@1 1767 int isup = 0;
duke@1 1768 if ( itot < 1 ) return; //any inheritance to write?
duke@1 1769 Enumeration inhEnum = inhHash.elements();
duke@1 1770 CompoundType ct;
duke@1 1771 if ( forValuetype )
duke@1 1772 while ( inhEnum.hasMoreElements() ) {
duke@1 1773 ct = (CompoundType)inhEnum.nextElement();
duke@1 1774 if ( ct.getTypeCode() == TYPE_ABSTRACT ) isup++;
duke@1 1775 }
duke@1 1776 iinh = itot - isup;
duke@1 1777
duke@1 1778 if ( iinh > 0 ) {
duke@1 1779 p.p( ": " );
duke@1 1780 inhEnum = inhHash.elements();
duke@1 1781 while ( inhEnum.hasMoreElements() ) { //write any class inheritance
duke@1 1782 ct = (CompoundType)inhEnum.nextElement();
duke@1 1783 if ( ct.isClass() ) {
duke@1 1784 p.p( getQualifiedIDLName( ct ) );
duke@1 1785 if ( iinh > 1 ) p.p( ", " ); //delimit them with commas
duke@1 1786 else if ( itot > 1 ) p.p( " " );
duke@1 1787 break; //only one parent
duke@1 1788 }
duke@1 1789 }
duke@1 1790 int i = 0;
duke@1 1791 inhEnum = inhHash.elements();
duke@1 1792 while ( inhEnum.hasMoreElements() ) { //write any interface inheritance
duke@1 1793 ct = (CompoundType)inhEnum.nextElement();
duke@1 1794 if ( !ct.isClass() &&
duke@1 1795 !( ct.getTypeCode() == TYPE_ABSTRACT ) ) {
duke@1 1796 if ( i++ > 0 ) p.p( ", " ); //delimit with commas
duke@1 1797 p.p( getQualifiedIDLName( ct ) );
duke@1 1798 }
duke@1 1799 }
duke@1 1800 }
duke@1 1801 if ( isup > 0 ) { //write abstract interface inheritance
duke@1 1802 p.p( " supports " );
duke@1 1803 int i = 0;
duke@1 1804 inhEnum = inhHash.elements();
duke@1 1805 while ( inhEnum.hasMoreElements() ) {
duke@1 1806 ct = (CompoundType)inhEnum.nextElement();
duke@1 1807 if ( ct.getTypeCode() == TYPE_ABSTRACT ) {
duke@1 1808 if ( i++ > 0 ) p.p( ", " ); //delimit with commas
duke@1 1809 p.p( getQualifiedIDLName( ct ) );
duke@1 1810 }
duke@1 1811 }
duke@1 1812 }
duke@1 1813 }
duke@1 1814
duke@1 1815
duke@1 1816 /**
duke@1 1817 * Write an IDL constant
duke@1 1818 * @param constant The current CompoundType.Member constant
duke@1 1819 * @param p The output stream.
duke@1 1820 */
duke@1 1821 protected void writeConstant(
duke@1 1822 CompoundType.Member constant,
duke@1 1823 IndentingWriter p )
duke@1 1824 throws IOException {
duke@1 1825 Type t = constant.getType();
duke@1 1826 p.p( "const " );
duke@1 1827 p.p( getQualifiedIDLName( t ) );
duke@1 1828 p.p( " " + constant.getIDLName() + " = " + constant.getValue() );
duke@1 1829 p.pln( ";" );
duke@1 1830 }
duke@1 1831
duke@1 1832
duke@1 1833
duke@1 1834 /**
duke@1 1835 * Write an IDL data member
duke@1 1836 * @param data The current CompoundType.Member data member
duke@1 1837 * @param p The output stream.
duke@1 1838 */
duke@1 1839 protected void writeData(
duke@1 1840 CompoundType.Member data,
duke@1 1841 IndentingWriter p )
duke@1 1842 throws IOException {
duke@1 1843 if ( data.isInnerClassDeclaration() ) return; //ignore
duke@1 1844 Type t = data.getType();
duke@1 1845 if ( data.isPublic() )
duke@1 1846 p.p( "public " );
duke@1 1847 else p.p( "private " );
duke@1 1848 p.pln( getQualifiedIDLName( t ) + " " +
duke@1 1849 data.getIDLName() + ";" );
duke@1 1850 }
duke@1 1851
duke@1 1852
duke@1 1853
duke@1 1854 /**
duke@1 1855 * Write an IDL Attribute
duke@1 1856 * @param attr The current CompoundType.Method attribute
duke@1 1857 * @param p The output stream.
duke@1 1858 */
duke@1 1859 protected void writeAttribute(
duke@1 1860 CompoundType.Method attr,
duke@1 1861 IndentingWriter p )
duke@1 1862 throws IOException {
duke@1 1863 if ( attr.getAttributeKind() == ATTRIBUTE_SET ) return; //use getters only
duke@1 1864 Type t = attr.getReturnType();
duke@1 1865 if ( !attr.isReadWriteAttribute() ) p.p( "readonly " );
duke@1 1866 p.p( "attribute " + getQualifiedIDLName( t ) + " " );
duke@1 1867 p.pln( attr.getAttributeName() + ";" );
duke@1 1868 }
duke@1 1869
duke@1 1870
duke@1 1871
duke@1 1872 /**
duke@1 1873 * Write an IDL method
duke@1 1874 * @param method The current CompoundType.Method
duke@1 1875 * @param p The output stream.
duke@1 1876 */
duke@1 1877 protected void writeMethod(
duke@1 1878 CompoundType.Method method,
duke@1 1879 IndentingWriter p )
duke@1 1880 throws IOException {
duke@1 1881 if ( method.isAttribute() ) {
duke@1 1882 writeAttribute( method,p );
duke@1 1883 return;
duke@1 1884 }
duke@1 1885 Type[] pts = method.getArguments();
duke@1 1886 String[] paramNames = method.getArgumentNames();
duke@1 1887 Type rt = method.getReturnType();
duke@1 1888 Hashtable excHash = new Hashtable();
duke@1 1889 getExceptions( method,excHash );
duke@1 1890
duke@1 1891 if ( method.isConstructor() )
duke@1 1892 if ( factory ) p.p( "factory " + method.getIDLName() + "(" );
duke@1 1893 else p.p( "init(" ); //IDL initializer
duke@1 1894 else {
duke@1 1895 p.p( getQualifiedIDLName( rt ) );
duke@1 1896 p.p( " " + method.getIDLName() + "(" );
duke@1 1897 }
duke@1 1898 p.pI();
duke@1 1899
duke@1 1900 for ( int i=0; i < pts.length; i++ ) {
duke@1 1901 if ( i > 0 ) p.pln( "," ); //delimit with comma and newline
duke@1 1902 else p.pln();
duke@1 1903 p.p( "in " );
duke@1 1904 p.p( getQualifiedIDLName( pts[i] ) );
duke@1 1905 p.p( " " + paramNames[i] );
duke@1 1906 }
duke@1 1907 p.pO();
duke@1 1908 p.p( " )" );
duke@1 1909
duke@1 1910 if ( excHash.size() > 0 ) { //any exceptions to write?
duke@1 1911 p.pln( " raises (" );
duke@1 1912 p.pI();
duke@1 1913 int i = 0;
duke@1 1914 Enumeration excEnum = excHash.elements();
duke@1 1915 while ( excEnum.hasMoreElements() ) {
duke@1 1916 ValueType exc = (ValueType)excEnum.nextElement();
duke@1 1917 if ( i > 0 ) p.pln( "," ); //delimit them with commas
duke@1 1918 if ( exc.isIDLEntityException() )
duke@1 1919 if ( exc.isCORBAUserException() )
duke@1 1920 p.p( "::org::omg::CORBA::UserEx" );
duke@1 1921 else {
duke@1 1922 String[] modNames = getIDLModuleNames( exc );
duke@1 1923 for ( int i2 = 0; i2 < modNames.length; i2++ )
duke@1 1924 p.p( IDL_NAME_SEPARATOR + modNames[i2] );
duke@1 1925 p.p( IDL_NAME_SEPARATOR + exc.getName() );
duke@1 1926 }
duke@1 1927 else p.p( exc.getQualifiedIDLExceptionName( true ) );
duke@1 1928 i++;
duke@1 1929 }
duke@1 1930 p.pO();
duke@1 1931 p.p( " )" );
duke@1 1932 }
duke@1 1933
duke@1 1934 p.pln( ";" );
duke@1 1935 }
duke@1 1936
duke@1 1937
duke@1 1938 /**
duke@1 1939 * Remove escape character ("_"), if any, from given String
duke@1 1940 * @param name Given String
duke@1 1941 * @return String with any escape character removed
duke@1 1942 */
duke@1 1943 protected String unEsc(
duke@1 1944 String name ) {
duke@1 1945 if ( name.startsWith( "_" ) ) return name.substring( 1 );
duke@1 1946 else return name;
duke@1 1947 }
duke@1 1948
duke@1 1949
duke@1 1950 /**
duke@1 1951 * Write IDL banner into the output stream for a given Type
duke@1 1952 * @param t The given Type.
duke@1 1953 * @param dim The dimension required if t is an ArrayType.
duke@1 1954 * @param isException true if writing an exception.
duke@1 1955 * @param p The output stream.
duke@1 1956 */
duke@1 1957 protected void writeBanner(
duke@1 1958 Type t,
duke@1 1959 int dim,
duke@1 1960 boolean isException,
duke@1 1961 IndentingWriter p )
duke@1 1962 throws IOException {
duke@1 1963 String[] modNames = getIDLModuleNames( t ); //module name array
duke@1 1964 String fName = unEsc( t.getIDLName() ); //file name default
duke@1 1965 if ( isException && t.isClass() ) {
duke@1 1966 ClassType ct = (ClassType)t; //file name for Exception
duke@1 1967 fName = unEsc( ct.getIDLExceptionName() );
duke@1 1968 }
duke@1 1969 if ( dim > 0 && t.isArray() ) {
duke@1 1970 Type et = t.getElementType(); //file name for sequence
duke@1 1971 fName = "seq" + dim + "_" + unEsc( et.getIDLName().replace( ' ','_' ) );
duke@1 1972 }
duke@1 1973
duke@1 1974 p.pln( "/**" );
duke@1 1975 p.p( " * " );
duke@1 1976 for ( int i1 = 0; i1 < modNames.length; i1++ )
duke@1 1977 p.p( modNames[i1] + "/" );
duke@1 1978 p.pln( fName + ".idl" );
duke@1 1979 p.pln( " * Generated by rmic -idl. Do not edit" );
duke@1 1980 String d = DateFormat.getDateTimeInstance(
duke@1 1981 DateFormat.FULL,DateFormat.FULL,Locale.getDefault() )
duke@1 1982 .format( new Date() );
duke@1 1983 String ocStr = "o'clock";
duke@1 1984 int ocx = d.indexOf( ocStr ); //remove unwanted o'clock, if any
duke@1 1985 p.p ( " * " );
duke@1 1986 if ( ocx > -1 )
duke@1 1987 p.pln( d.substring( 0,ocx ) + d.substring( ocx + ocStr.length() ) );
duke@1 1988 else p.pln( d );
duke@1 1989 p.pln( " */" );
duke@1 1990 p.pln();
duke@1 1991 }
duke@1 1992
duke@1 1993
duke@1 1994 /**
duke@1 1995 * Write #include for orb.idl
duke@1 1996 * @param p The output stream.
duke@1 1997 */
duke@1 1998 protected void writeIncOrb(
duke@1 1999 IndentingWriter p )
duke@1 2000 throws IOException {
duke@1 2001 p.pln( "#include \"orb.idl\"" );
duke@1 2002 }
duke@1 2003
duke@1 2004
duke@1 2005 /**
duke@1 2006 * Write #ifndef guard into the output stream for a given Type
duke@1 2007 * @param t The given Type.
duke@1 2008 * @param dim The dimension required if t is an ArrayType.
duke@1 2009 * @param isException true if writing an exception.
duke@1 2010 * @param isForward. No #define needed if it's a forward declare
duke@1 2011 * @param p The output stream.
duke@1 2012 */
duke@1 2013 protected void writeIfndef(
duke@1 2014 Type t,
duke@1 2015 int dim,
duke@1 2016 boolean isException,
duke@1 2017 boolean isForward,
duke@1 2018 IndentingWriter p )
duke@1 2019 throws IOException {
duke@1 2020 String[] modNames = getIDLModuleNames( t ); //module name array
duke@1 2021 String fName = unEsc( t.getIDLName() ); //file name default
duke@1 2022 if ( isException && t.isClass() ) {
duke@1 2023 ClassType ct = (ClassType)t; //file name for Exception
duke@1 2024 fName = unEsc( ct.getIDLExceptionName() );
duke@1 2025 }
duke@1 2026 if ( dim > 0 && t.isArray() ) {
duke@1 2027 Type et = t.getElementType(); //file name for sequence
duke@1 2028 fName = "seq" + dim + "_" + unEsc( et.getIDLName().replace( ' ','_' ) );
duke@1 2029 }
duke@1 2030 p.pln();
duke@1 2031 p.p( "#ifndef __" );
duke@1 2032 for ( int i = 0; i < modNames.length; i++ ) p.p( modNames[i] + "_" );
duke@1 2033 p.pln( fName + "__" );
duke@1 2034 if ( !isForward ) {
duke@1 2035 p.p( "#define __" );
duke@1 2036 for ( int i = 0; i < modNames.length; i++ ) p.p( modNames[i] + "_" );
duke@1 2037 p.pln( fName + "__" );
duke@1 2038 p.pln();
duke@1 2039 }
duke@1 2040 }
duke@1 2041
duke@1 2042
duke@1 2043 /**
duke@1 2044 * Write #endif bracket into the output stream
duke@1 2045 * @param p The output stream.
duke@1 2046 */
duke@1 2047 protected void writeEndif(
duke@1 2048 IndentingWriter p )
duke@1 2049 throws IOException {
duke@1 2050 p.pln("#endif");
duke@1 2051 p.pln();
duke@1 2052 }
duke@1 2053
duke@1 2054 /**
duke@1 2055 * Write Module start bracketing for the given type into the output stream
duke@1 2056 * @param t The given Type
duke@1 2057 * @param p The output stream.
duke@1 2058 */
duke@1 2059 protected void writeModule1(
duke@1 2060 Type t,
duke@1 2061 IndentingWriter p )
duke@1 2062 throws IOException {
duke@1 2063
duke@1 2064 String[] modNames = getIDLModuleNames( t );
duke@1 2065 p.pln();
duke@1 2066 for ( int i = 0; i < modNames.length; i++ )
duke@1 2067 p.pln( "module " + modNames[i] + " {" );
duke@1 2068 }
duke@1 2069
duke@1 2070 /**
duke@1 2071 * Write Module end bracketing for the given type into the output stream
duke@1 2072 * @param t The given Type
duke@1 2073 * @param p The output stream.
duke@1 2074 */
duke@1 2075 protected void writeModule2(
duke@1 2076 Type t,
duke@1 2077 IndentingWriter p )
duke@1 2078 throws IOException {
duke@1 2079 String[] modNames = getIDLModuleNames( t );
duke@1 2080 for ( int i=0; i < modNames.length; i++ ) p.pln( "};" );
duke@1 2081 p.pln();
duke@1 2082 }
duke@1 2083
duke@1 2084 }

mercurial