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

Wed, 28 Mar 2012 02:50:50 -0700

author
mbankal
date
Wed, 28 Mar 2012 02:50:50 -0700
changeset 371
e324dfb90c9e
parent 158
91006f157c46
child 748
6845b95cba6b
permissions
-rw-r--r--

7079902: Refine CORBA data models
Reviewed-by: coffeys

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 /*
duke@1 27 * Licensed Materials - Property of IBM
duke@1 28 * RMI-IIOP v1.0
duke@1 29 * Copyright IBM Corp. 1998 1999 All Rights Reserved
duke@1 30 *
duke@1 31 */
duke@1 32
duke@1 33 package sun.rmi.rmic.iiop;
duke@1 34
duke@1 35 import java.util.Vector;
duke@1 36 import java.util.Hashtable;
duke@1 37 import java.util.Enumeration;
duke@1 38 import java.io.IOException;
duke@1 39 import sun.tools.java.ClassDefinition;
duke@1 40 import sun.tools.java.ClassDeclaration;
duke@1 41 import sun.tools.java.Identifier;
duke@1 42 import sun.tools.java.ClassNotFound;
duke@1 43 import sun.tools.java.CompilerError;
duke@1 44 import sun.rmi.rmic.IndentingWriter;
duke@1 45 import java.util.HashSet;
duke@1 46 import com.sun.corba.se.impl.util.RepositoryId;
duke@1 47 import sun.rmi.rmic.Names;
duke@1 48
duke@1 49 /**
duke@1 50 * Type is an abstract base class for a family of types which provide
duke@1 51 * conformance checking and name mapping as defined in the "Java to IDL
duke@1 52 * Mapping" OMG specification. The family is composed of the following
duke@1 53 * fixed set of types:
duke@1 54 * <pre>
duke@1 55 *
duke@1 56 * +- RemoteType <-- AbstractType
duke@1 57 * |
duke@1 58 * +- InterfaceType <-+- SpecialInterfaceType
duke@1 59 * +- PrimitiveType | |
duke@1 60 * | | +- NCInterfaceType
duke@1 61 * Type <-+- CompoundType <-|
duke@1 62 * | | +- ValueType
duke@1 63 * +- ArrayType | |
duke@1 64 * +- ClassType <-----+- ImplementationType
duke@1 65 * |
duke@1 66 * +- SpecialClassType
duke@1 67 * |
duke@1 68 * +- NCClassType
duke@1 69 *
duke@1 70 * </pre>
duke@1 71 * PrimitiveType represents a primitive or a void type.
duke@1 72 * <p>
duke@1 73 * CompoundType is an abstract base representing any non-special class
duke@1 74 * or interface type.
duke@1 75 * <p>
duke@1 76 * InterfaceType is an abstract base representing any non-special
duke@1 77 * interface type.
duke@1 78 * <p>
duke@1 79 * RemoteType represents any non-special interface which inherits
duke@1 80 * from java.rmi.Remote.
duke@1 81 * <p>
duke@1 82 * AbstractType represents any non-special interface which does not
duke@1 83 * inherit from java.rmi.Remote, for which all methods throw RemoteException.
duke@1 84 * <p>
duke@1 85 * SpecialInterfaceType represents any one of the following types:
duke@1 86 * <pre>
duke@1 87 * java.rmi.Remote
duke@1 88 * java.io.Serializable
duke@1 89 * java.io.Externalizable
duke@1 90 * </pre>
duke@1 91 * all of which are treated as special cases.
duke@1 92 * <p>
duke@1 93 * NCInterfaceType represents any non-special, non-conforming interface.
duke@1 94 * <p>
duke@1 95 * ClassType is an abstract base representing any non-special class
duke@1 96 * type.
duke@1 97 * <p>
duke@1 98 * ValueType represents any non-special class which does inherit from
duke@1 99 * java.io.Serializable and does not inherit from java.rmi.Remote.
duke@1 100 * <p>
duke@1 101 * ImplementationType represents any non-special class which implements
duke@1 102 * one or more interfaces which inherit from java.rmi.Remote.
duke@1 103 * <p>
duke@1 104 * SpecialClassType represents any one of the following types:
duke@1 105 * <pre>
duke@1 106 * java.lang.Object
duke@1 107 * java.lang.String
duke@1 108 * org.omg.CORBA.Object
duke@1 109 * </pre>
duke@1 110 * all of which are treated as special cases. For all but CORBA.Object,
duke@1 111 * the type must match exactly. For CORBA.Object, the type must either be
duke@1 112 * CORBA.Object or inherit from it.
duke@1 113 * <p>
duke@1 114 * NCClassType represents any non-special, non-conforming class.
duke@1 115 * <p>
duke@1 116 * ArrayType is a wrapper for any of the other types. The getElementType()
duke@1 117 * method can be used to get the array element type. The getArrayDimension()
duke@1 118 * method can be used to get the array dimension.
duke@1 119 * <p>
duke@1 120 * <i><strong>NOTE:</strong> None of these types is multi-thread-safe</i>
duke@1 121 * @author Bryan Atsatt
duke@1 122 */
duke@1 123 public abstract class Type implements sun.rmi.rmic.iiop.Constants, ContextElement, Cloneable {
duke@1 124
duke@1 125 private int typeCode;
duke@1 126 private int fullTypeCode;
duke@1 127 private Identifier id;
duke@1 128
duke@1 129 private String name;
duke@1 130 private String packageName;
duke@1 131 private String qualifiedName;
duke@1 132
duke@1 133 private String idlName;
duke@1 134 private String[] idlModuleNames;
duke@1 135 private String qualifiedIDLName;
duke@1 136
duke@1 137 private String repositoryID;
duke@1 138 private Class ourClass;
duke@1 139
duke@1 140 private int status = STATUS_PENDING;
duke@1 141
duke@1 142 protected BatchEnvironment env; // Easy access for subclasses.
duke@1 143 protected ContextStack stack; // Easy access for subclasses.
duke@1 144
duke@1 145 protected boolean destroyed = false;
duke@1 146
duke@1 147 //_____________________________________________________________________
duke@1 148 // Public Interfaces
duke@1 149 //_____________________________________________________________________
duke@1 150
duke@1 151 /**
duke@1 152 * Return the unqualified name for this type (e.g. com.acme.Dynamite would
duke@1 153 * return "Dynamite").
duke@1 154 */
duke@1 155 public String getName() {
duke@1 156 return name;
duke@1 157 }
duke@1 158
duke@1 159 /**
duke@1 160 * Return the package of this type (e.g. com.acme.Dynamite would
duke@1 161 * return "com.acme"). Will return null if default package or
duke@1 162 * if this type is a primitive.
duke@1 163 */
duke@1 164 public String getPackageName() {
duke@1 165 return packageName;
duke@1 166 }
duke@1 167
duke@1 168 /**
duke@1 169 * Return the fully qualified name of this type (e.g. com.acme.Dynamite
duke@1 170 * would return "com.acme.Dynamite")
duke@1 171 */
duke@1 172 public String getQualifiedName() {
duke@1 173 return qualifiedName;
duke@1 174 }
duke@1 175
duke@1 176 /**
duke@1 177 * Return signature for this type (e.g. com.acme.Dynamite
duke@1 178 * would return "com.acme.Dynamite", byte = "B")
duke@1 179 */
duke@1 180 public abstract String getSignature();
duke@1 181
duke@1 182 /**
duke@1 183 * IDL_Naming
duke@1 184 * Return the unqualified IDL name of this type (e.g. com.acme.Dynamite would
duke@1 185 * return "Dynamite").
duke@1 186 */
duke@1 187 public String getIDLName() {
duke@1 188 return idlName;
duke@1 189 }
duke@1 190
duke@1 191 /**
duke@1 192 * IDL_Naming
duke@1 193 * Return the IDL module name for this type (e.g. com.acme.Dynamite would return
duke@1 194 * a three element array of {"com","acme"). May be a zero length array if
duke@1 195 * there is no module name.
duke@1 196 */
duke@1 197 public String[] getIDLModuleNames() {
duke@1 198 return idlModuleNames;
duke@1 199 }
duke@1 200
duke@1 201 /**
duke@1 202 * IDL_Naming
duke@1 203 * Return the fully qualified IDL name for this type (e.g. com.acme.Dynamite would
duke@1 204 * return "com::acme::Dynamite").
duke@1 205 * @param global If true, prepends "::".
duke@1 206 */
duke@1 207 public String getQualifiedIDLName(boolean global) {
duke@1 208 if (global && getIDLModuleNames().length > 0) {
duke@1 209 return IDL_NAME_SEPARATOR + qualifiedIDLName;
duke@1 210 } else {
duke@1 211 return qualifiedIDLName;
duke@1 212 }
duke@1 213 }
duke@1 214
duke@1 215 /**
duke@1 216 * Return the identifier for this type. May be qualified.
duke@1 217 */
duke@1 218 public Identifier getIdentifier() {
duke@1 219 return id;
duke@1 220 }
duke@1 221
duke@1 222 /**
duke@1 223 * Return the repository ID for this type.
duke@1 224 */
duke@1 225 public String getRepositoryID() {
duke@1 226 return repositoryID;
duke@1 227 }
duke@1 228
duke@1 229 /**
duke@1 230 * Return the repository ID for this "boxed" type.
duke@1 231 */
duke@1 232 public String getBoxedRepositoryID() {
duke@1 233 return RepositoryId.createForJavaType(ourClass);
duke@1 234 }
duke@1 235
duke@1 236 /**
duke@1 237 * Return the Class for this type.
duke@1 238 */
duke@1 239 public Class getClassInstance() {
duke@1 240 if (ourClass == null) {
duke@1 241 initClass();
duke@1 242 }
duke@1 243 return ourClass;
duke@1 244 }
duke@1 245
duke@1 246 /**
duke@1 247 * Return the status of this type.
duke@1 248 */
duke@1 249 public int getStatus() {
duke@1 250 return status;
duke@1 251 }
duke@1 252
duke@1 253 /**
duke@1 254 * Set the status of this type.
duke@1 255 */
duke@1 256 public void setStatus(int status) {
duke@1 257 this.status = status;
duke@1 258 }
duke@1 259
duke@1 260 /**
duke@1 261 * Return the compiler environment for this type.
duke@1 262 */
duke@1 263 public BatchEnvironment getEnv() {
duke@1 264 return env;
duke@1 265 }
duke@1 266
duke@1 267 /**
duke@1 268 * Get type code, without modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
duke@1 269 */
duke@1 270 public int getTypeCode() {
duke@1 271 return typeCode;
duke@1 272 }
duke@1 273
duke@1 274 /**
duke@1 275 * Get type code, with modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
duke@1 276 */
duke@1 277 public int getFullTypeCode() {
duke@1 278 return fullTypeCode;
duke@1 279 }
duke@1 280
duke@1 281 /**
duke@1 282 * Get type code modifiers. Type codes are defined in sun.rmi.rmic.iiop.Constants.
duke@1 283 */
duke@1 284 public int getTypeCodeModifiers() {
duke@1 285 return fullTypeCode & TM_MASK;
duke@1 286 }
duke@1 287
duke@1 288 /**
duke@1 289 * Check for a certain type. Type codes are defined in sun.rmi.rmic.iiop.Constants.
duke@1 290 * Returns true if all of the bits in typeCodeMask are present in the full type code
duke@1 291 * of this object.
duke@1 292 */
duke@1 293 public boolean isType(int typeCodeMask) {
duke@1 294 return (fullTypeCode & typeCodeMask) == typeCodeMask;
duke@1 295 }
duke@1 296
duke@1 297 /**
duke@1 298 * Like isType(), but returns true if <em>any</em> of the bits in typeCodeMask are
duke@1 299 * present in the full type code of this object.
duke@1 300 */
duke@1 301 public boolean typeMatches(int typeCodeMask) {
duke@1 302 return (fullTypeCode & typeCodeMask) > 0;
duke@1 303 }
duke@1 304
duke@1 305
duke@1 306 /**
duke@1 307 * Return the fullTypeCode. If an array, returns the
duke@1 308 * type code from the element type.
duke@1 309 */
duke@1 310 public int getRootTypeCode() {
duke@1 311 if (isArray()) {
duke@1 312 return getElementType().getFullTypeCode();
duke@1 313 } else {
duke@1 314 return fullTypeCode;
duke@1 315 }
duke@1 316 }
duke@1 317
duke@1 318 /**
duke@1 319 * Return true if this type is-a InterfaceType.
duke@1 320 */
duke@1 321 public boolean isInterface() {
duke@1 322 return (fullTypeCode & TM_INTERFACE) == TM_INTERFACE;
duke@1 323 }
duke@1 324
duke@1 325 /**
duke@1 326 * Return true if this type is-a ClassType.
duke@1 327 */
duke@1 328 public boolean isClass() {
duke@1 329 return (fullTypeCode & TM_CLASS) == TM_CLASS;
duke@1 330 }
duke@1 331
duke@1 332 /**
duke@1 333 * Return true if this type is-a inner class or interface.
duke@1 334 */
duke@1 335 public boolean isInner() {
duke@1 336 return (fullTypeCode & TM_INNER) == TM_INNER;
duke@1 337 }
duke@1 338
duke@1 339
duke@1 340 /**
duke@1 341 * Return true if this type is-a SpecialInterfaceType.
duke@1 342 */
duke@1 343 public boolean isSpecialInterface() {
duke@1 344 return (fullTypeCode & TM_SPECIAL_INTERFACE) == TM_SPECIAL_INTERFACE;
duke@1 345 }
duke@1 346
duke@1 347 /**
duke@1 348 * Return true if this type is-a SpecialClassType.
duke@1 349 */
duke@1 350 public boolean isSpecialClass() {
duke@1 351 return (fullTypeCode & TM_SPECIAL_CLASS) == TM_SPECIAL_CLASS;
duke@1 352 }
duke@1 353
duke@1 354 /**
duke@1 355 * Return true if this type is-a CompoundType.
duke@1 356 */
duke@1 357 public boolean isCompound() {
duke@1 358 return (fullTypeCode & TM_COMPOUND) == TM_COMPOUND;
duke@1 359 }
duke@1 360
duke@1 361 /**
duke@1 362 * Return true if this type is-a PrimitiveType.
duke@1 363 */
duke@1 364 public boolean isPrimitive() {
duke@1 365 return (fullTypeCode & TM_PRIMITIVE) == TM_PRIMITIVE;
duke@1 366 }
duke@1 367
duke@1 368 /**
duke@1 369 * Return true if this type is-a ArrayType.
duke@1 370 */
duke@1 371 public boolean isArray() {
duke@1 372 return (fullTypeCode & TYPE_ARRAY) == TYPE_ARRAY;
duke@1 373 }
duke@1 374
duke@1 375 /**
duke@1 376 * Return true if this type is a conforming type.
duke@1 377 */
duke@1 378 public boolean isConforming() {
duke@1 379 return (fullTypeCode & TM_NON_CONFORMING) == TM_NON_CONFORMING;
duke@1 380 }
duke@1 381
duke@1 382 /**
duke@1 383 * Return a string representation of this type.
duke@1 384 */
duke@1 385 public String toString () {
duke@1 386 return getQualifiedName();
duke@1 387 }
duke@1 388
duke@1 389 /**
duke@1 390 * Get element type. Returns null if not an array.
duke@1 391 */
duke@1 392 public Type getElementType () {
duke@1 393 return null;
duke@1 394 }
duke@1 395
duke@1 396 /**
duke@1 397 * Get array dimension. Returns zero if not an array.
duke@1 398 */
duke@1 399 public int getArrayDimension () {
duke@1 400 return 0;
duke@1 401 }
duke@1 402
duke@1 403 /**
duke@1 404 * Get brackets string. Returns "" if not an array.
duke@1 405 */
duke@1 406 public String getArrayBrackets () {
duke@1 407 return "";
duke@1 408 }
duke@1 409
duke@1 410 /**
duke@1 411 * Equality check based on the string representation.
duke@1 412 */
duke@1 413 public boolean equals(Object obj) {
duke@1 414
duke@1 415 String us = toString();
duke@1 416 String them = ((Type)obj).toString();
duke@1 417 return us.equals(them);
duke@1 418 }
duke@1 419
duke@1 420 /**
duke@1 421 * Collect all the matching types referenced directly or indirectly
duke@1 422 * by this type, including itself.
duke@1 423 * @param typeCodeFilter The typeCode to use as a filter.
duke@1 424 */
duke@1 425 public Type[] collectMatching (int typeCodeFilter) {
duke@1 426 return collectMatching(typeCodeFilter,new HashSet(env.allTypes.size()));
duke@1 427 }
duke@1 428
duke@1 429 /**
duke@1 430 * Collect all the matching types referenced directly or indirectly
duke@1 431 * by this type, including itself.
duke@1 432 * @param typeCodeFilter The typeCode to use as a filter.
duke@1 433 * @param alreadyChecked Contains types which have previously been checked
duke@1 434 * and will be ignored. Updated during collection.
duke@1 435 */
duke@1 436 public Type[] collectMatching (int typeCodeFilter, HashSet alreadyChecked) {
duke@1 437 Vector matching = new Vector();
duke@1 438
duke@1 439 // Fill up the list...
duke@1 440
duke@1 441 addTypes(typeCodeFilter,alreadyChecked,matching);
duke@1 442
duke@1 443 // Copy vector contents to array and return it...
duke@1 444
duke@1 445 Type[] result = new Type[matching.size()];
duke@1 446 matching.copyInto(result);
duke@1 447
duke@1 448 return result;
duke@1 449 }
duke@1 450
duke@1 451 /**
duke@1 452 * Return a string describing this type.
duke@1 453 */
duke@1 454 public abstract String getTypeDescription ();
duke@1 455
duke@1 456 /**
duke@1 457 * Return the name of this type. For arrays, will include "[]" if useIDLNames == false.
duke@1 458 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 459 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 460 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 461 */
duke@1 462 public String getTypeName ( boolean useQualifiedNames,
duke@1 463 boolean useIDLNames,
duke@1 464 boolean globalIDLNames) {
duke@1 465 if (useIDLNames) {
duke@1 466 if (useQualifiedNames) {
duke@1 467 return getQualifiedIDLName(globalIDLNames);
duke@1 468 } else {
duke@1 469 return getIDLName();
duke@1 470 }
duke@1 471 } else {
duke@1 472 if (useQualifiedNames) {
duke@1 473 return getQualifiedName();
duke@1 474 } else {
duke@1 475 return getName();
duke@1 476 }
duke@1 477 }
duke@1 478 }
duke@1 479
duke@1 480 /**
duke@1 481 * Print all types referenced directly or indirectly by this type which
duke@1 482 * match the filter.
duke@1 483 * @param writer The stream to print to.
duke@1 484 * @param typeCodeFilter The type codes to print.
duke@1 485 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 486 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 487 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 488 */
duke@1 489 public void print ( IndentingWriter writer,
duke@1 490 int typeCodeFilter,
duke@1 491 boolean useQualifiedNames,
duke@1 492 boolean useIDLNames,
duke@1 493 boolean globalIDLNames) throws IOException {
duke@1 494
duke@1 495 Type[] theTypes = collectMatching(typeCodeFilter);
duke@1 496 print(writer,theTypes,useQualifiedNames,useIDLNames,globalIDLNames);
duke@1 497 }
duke@1 498
duke@1 499 /**
duke@1 500 * Print an array of types.
duke@1 501 * @param writer The stream to print to.
duke@1 502 * @param theTypes The types to print.
duke@1 503 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 504 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 505 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 506 */
duke@1 507 public static void print ( IndentingWriter writer,
duke@1 508 Type[] theTypes,
duke@1 509 boolean useQualifiedNames,
duke@1 510 boolean useIDLNames,
duke@1 511 boolean globalIDLNames) throws IOException {
duke@1 512
duke@1 513 for (int i = 0; i < theTypes.length; i++) {
duke@1 514 theTypes[i].println(writer,useQualifiedNames,useIDLNames,globalIDLNames);
duke@1 515 }
duke@1 516 }
duke@1 517
duke@1 518
duke@1 519 /**
duke@1 520 * Print this type.
duke@1 521 * @param writer The stream to print to.
duke@1 522 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 523 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 524 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 525 */
duke@1 526 public void print ( IndentingWriter writer,
duke@1 527 boolean useQualifiedNames,
duke@1 528 boolean useIDLNames,
duke@1 529 boolean globalIDLNames) throws IOException {
duke@1 530 printTypeName(writer,useQualifiedNames,useIDLNames,globalIDLNames);
duke@1 531 }
duke@1 532
duke@1 533 /**
duke@1 534 * Print this type, followed by a newline.
duke@1 535 * @param writer The stream to print to.
duke@1 536 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 537 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 538 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 539 */
duke@1 540 public void println ( IndentingWriter writer,
duke@1 541 boolean useQualifiedNames,
duke@1 542 boolean useIDLNames,
duke@1 543 boolean globalIDLNames) throws IOException {
duke@1 544
duke@1 545 print(writer,useQualifiedNames,useIDLNames,globalIDLNames);
duke@1 546 writer.pln();
duke@1 547 }
duke@1 548
duke@1 549
duke@1 550
duke@1 551 /**
duke@1 552 * Print the name of this type.
duke@1 553 * @param writer The stream to print to.
duke@1 554 * @param useQualifiedNames If true, print qualified names; otherwise, print unqualified names.
duke@1 555 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 556 * @param globalIDLNames If true and useIDLNames true, prepends "::".
duke@1 557 */
duke@1 558 public void printTypeName ( IndentingWriter writer,
duke@1 559 boolean useQualifiedNames,
duke@1 560 boolean useIDLNames,
duke@1 561 boolean globalIDLNames) throws IOException {
duke@1 562
duke@1 563 writer.p(getTypeName(useQualifiedNames,useIDLNames,globalIDLNames));
duke@1 564 }
duke@1 565
duke@1 566 /**
duke@1 567 * Return context element name.
duke@1 568 */
duke@1 569 public String getElementName() {
duke@1 570 return getQualifiedName();
duke@1 571 }
duke@1 572
duke@1 573 //_____________________________________________________________________
duke@1 574 // Subclass Interfaces
duke@1 575 //_____________________________________________________________________
duke@1 576
duke@1 577 /**
duke@1 578 * Print the "opening" of the package or module of this type.
duke@1 579 * @param writer The stream to print to.
duke@1 580 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 581 */
duke@1 582 protected void printPackageOpen ( IndentingWriter writer,
duke@1 583 boolean useIDLNames) throws IOException {
duke@1 584
duke@1 585 if (useIDLNames) {
duke@1 586 String[] moduleNames = getIDLModuleNames();
duke@1 587 for (int i = 0; i < moduleNames.length; i++ ) {
duke@1 588 writer.plnI("module " + moduleNames[i] + " {");
duke@1 589 }
duke@1 590 } else {
duke@1 591 String packageName = getPackageName();
duke@1 592 if (packageName != null) {
duke@1 593 writer.pln("package " + packageName + ";");
duke@1 594 }
duke@1 595 }
duke@1 596 }
duke@1 597
duke@1 598 /**
duke@1 599 * Get a type out of the table.
duke@1 600 */
duke@1 601 protected static Type getType (sun.tools.java.Type key, ContextStack stack) {
duke@1 602 return getType(key.toString(),stack);
duke@1 603 }
duke@1 604
duke@1 605 /**
duke@1 606 * Get a type out of the table.
duke@1 607 */
duke@1 608 protected static Type getType (String key, ContextStack stack) {
duke@1 609 Type result = (Type) stack.getEnv().allTypes.get(key);
duke@1 610
duke@1 611 if (result != null) {
duke@1 612 stack.traceExistingType(result);
duke@1 613 }
duke@1 614
duke@1 615 return result;
duke@1 616 }
duke@1 617
duke@1 618 /**
duke@1 619 * Remove a type from the table.
duke@1 620 */
duke@1 621 protected static void removeType (String key, ContextStack stack) {
duke@1 622 Type value = (Type) stack.getEnv().allTypes.remove(key);
duke@1 623 stack.getEnv().invalidTypes.put(value,key);
duke@1 624 }
duke@1 625
duke@1 626 /**
duke@1 627 * Remove a type from the table.
duke@1 628 */
duke@1 629 protected static void removeType (sun.tools.java.Type key, ContextStack stack) {
duke@1 630 String theKey = key.toString();
duke@1 631 Type old = (Type) stack.getEnv().allTypes.remove(theKey);
duke@1 632 putInvalidType(old,theKey,stack);
duke@1 633 }
duke@1 634
duke@1 635 /**
duke@1 636 * Put a type into the table.
duke@1 637 */
duke@1 638 protected static void putType (sun.tools.java.Type key, Type value, ContextStack stack) {
duke@1 639 stack.getEnv().allTypes.put(key.toString(),value);
duke@1 640 }
duke@1 641
duke@1 642 /**
duke@1 643 * Put a type into the table.
duke@1 644 */
duke@1 645 protected static void putType (String key, Type value, ContextStack stack) {
duke@1 646 stack.getEnv().allTypes.put(key,value);
duke@1 647 }
duke@1 648
duke@1 649 /**
duke@1 650 * Put an invalid type into the.
duke@1 651 */
duke@1 652 protected static void putInvalidType (Type key, String value, ContextStack stack) {
duke@1 653 stack.getEnv().invalidTypes.put(key,value);
duke@1 654 }
duke@1 655
duke@1 656
duke@1 657 /**
duke@1 658 * Remove all invalid types...
duke@1 659 */
duke@1 660 public void removeInvalidTypes () {
duke@1 661 if (env.invalidTypes.size() > 0) {
duke@1 662 env.invalidTypes.clear();
duke@1 663 }
duke@1 664 }
duke@1 665
duke@1 666 /**
duke@1 667 * Walk all types and tell them to update invalid types...
duke@1 668 */
duke@1 669 protected static void updateAllInvalidTypes (ContextStack stack) {
duke@1 670 BatchEnvironment env = stack.getEnv();
duke@1 671 if (env.invalidTypes.size() > 0) {
duke@1 672
duke@1 673 // Walk all types and swap invalid...
duke@1 674
duke@1 675 for (Enumeration e = env.allTypes.elements() ; e.hasMoreElements() ;) {
duke@1 676 Type it = (Type) e.nextElement();
duke@1 677 it.swapInvalidTypes();
duke@1 678 }
duke@1 679
duke@1 680 // Delete all invalidTypes...
duke@1 681
duke@1 682 env.invalidTypes.clear();
duke@1 683 }
duke@1 684 }
duke@1 685
duke@1 686 /**
duke@1 687 * Return count of previously parsed types.
duke@1 688 */
duke@1 689 protected int countTypes () {
duke@1 690 return env.allTypes.size();
duke@1 691 }
duke@1 692
duke@1 693 /**
duke@1 694 * Reset types removes all previously parsed types.
duke@1 695 */
duke@1 696 void resetTypes () {
duke@1 697 env.reset();
duke@1 698 }
duke@1 699
duke@1 700 /**
duke@1 701 * Release all resources.
duke@1 702 */
duke@1 703 protected void destroy () {
duke@1 704 if (!destroyed) {
duke@1 705 id = null;
duke@1 706 name = null;
duke@1 707 packageName = null;
duke@1 708 qualifiedName = null;
duke@1 709 idlName = null;
duke@1 710 idlModuleNames = null;
duke@1 711 qualifiedIDLName = null;
duke@1 712 repositoryID = null;
duke@1 713 ourClass = null;
duke@1 714 env = null;
duke@1 715 stack = null;
duke@1 716 destroyed = true;
duke@1 717 }
duke@1 718 }
duke@1 719
duke@1 720 /**
duke@1 721 * Convert all invalid types to valid ones.
duke@1 722 */
duke@1 723 protected void swapInvalidTypes () {
duke@1 724 }
duke@1 725
duke@1 726 /**
duke@1 727 * Convert an invalid type to a valid one.
duke@1 728 */
duke@1 729 protected Type getValidType (Type invalidType) {
duke@1 730 if (invalidType.getStatus() == STATUS_VALID) {
duke@1 731 return invalidType;
duke@1 732 }
duke@1 733
duke@1 734 String key = (String)env.invalidTypes.get(invalidType);
duke@1 735 Type result = null;
duke@1 736 if (key != null) {
duke@1 737 result = (Type) env.allTypes.get(key);
duke@1 738 }
duke@1 739
duke@1 740 if (result == null) {
duke@1 741 throw new Error("Failed to find valid type to swap for " + invalidType + " mis-identified as " + invalidType.getTypeDescription());
duke@1 742 }
duke@1 743 //System.out.println("Swapped " + result + " from " + invalidType.getTypeDescription()
duke@1 744 // + " to " + result.getTypeDescription());
duke@1 745 //ContextStack.dumpCallStack();
duke@1 746 return result;
duke@1 747 }
duke@1 748
duke@1 749 /**
duke@1 750 * Print the "closing" of the package or module of this type.
duke@1 751 * @param writer The stream to print to.
duke@1 752 * @param useIDLNames If true, print IDL names; otherwise, print java names.
duke@1 753 */
duke@1 754 protected void printPackageClose ( IndentingWriter writer,
duke@1 755 boolean useIDLNames) throws IOException {
duke@1 756 if (useIDLNames) {
duke@1 757 String[] moduleNames = getIDLModuleNames();
duke@1 758 for (int i = 0; i < moduleNames.length; i++ ) {
duke@1 759 writer.pOln("};");
duke@1 760 }
duke@1 761 }
duke@1 762 }
duke@1 763
duke@1 764 /**
duke@1 765 * Create a Type instance for the given type. Requires that
duke@1 766 * setName(Identifier) be called afterward.
duke@1 767 */
duke@1 768 protected Type(ContextStack stack, int fullTypeCode) {
duke@1 769 this.env = stack.getEnv();
duke@1 770 this.stack = stack;
duke@1 771 this.fullTypeCode = fullTypeCode;
duke@1 772 typeCode = fullTypeCode & TYPE_MASK;
duke@1 773 }
duke@1 774
duke@1 775 /**
duke@1 776 * Set type codes. May only be called during initialization.
duke@1 777 */
duke@1 778 protected void setTypeCode(int fullTypeCode) {
duke@1 779 this.fullTypeCode = fullTypeCode;
duke@1 780 typeCode = fullTypeCode & TYPE_MASK;
duke@1 781 }
duke@1 782
duke@1 783 /**
duke@1 784 * Set name and package. May only be called during initialization.
duke@1 785 */
duke@1 786 protected void setNames(Identifier id, String[] idlModuleNames, String idlName) {
duke@1 787
duke@1 788 this.id = id;
duke@1 789 name = Names.mangleClass(id).getName().toString();
duke@1 790 packageName = null;
duke@1 791
duke@1 792 if (id.isQualified()) {
duke@1 793 packageName = id.getQualifier().toString();
duke@1 794 qualifiedName = packageName + NAME_SEPARATOR + name;
duke@1 795 } else {
duke@1 796 qualifiedName = name;
duke@1 797 }
duke@1 798
duke@1 799 setIDLNames(idlModuleNames,idlName);
duke@1 800 }
duke@1 801
duke@1 802
duke@1 803 /**
duke@1 804 * Set IDL name. May only be called during initialization.
duke@1 805 */
duke@1 806 protected void setIDLNames(String[] idlModuleNames, String idlName) {
duke@1 807 this.idlName = idlName;
duke@1 808
duke@1 809 if (idlModuleNames != null) {
duke@1 810 this.idlModuleNames = idlModuleNames;
duke@1 811 } else {
duke@1 812 this.idlModuleNames = new String[0];
duke@1 813 }
duke@1 814 qualifiedIDLName = IDLNames.getQualifiedName(idlModuleNames,idlName);
duke@1 815 }
duke@1 816
duke@1 817 /**
duke@1 818 * Report a ClassNotFoundException thru the compiler environment.
duke@1 819 */
duke@1 820 protected static void classNotFound(ContextStack stack,
duke@1 821 ClassNotFound e) {
duke@1 822 classNotFound(false,stack,e);
duke@1 823 }
duke@1 824
duke@1 825 /**
duke@1 826 * Report a ClassNotFoundException thru the compiler environment.
duke@1 827 */
duke@1 828 protected static void classNotFound(boolean quiet,
duke@1 829 ContextStack stack,
duke@1 830 ClassNotFound e) {
duke@1 831 if (!quiet) stack.getEnv().error(0, "rmic.class.not.found", e.name);
duke@1 832 stack.traceCallStack();
duke@1 833 }
duke@1 834
duke@1 835 /**
duke@1 836 * Report a constraint failure thru the compiler environment.
duke@1 837 * @param constraintNum Used to generate a key of the form
duke@1 838 "rmic.iiop.constraint.N", which must identify a message
duke@1 839 in the "rmic.properties" file.
duke@1 840 * @param quiet True if should not cause failure or message.
duke@1 841 * @param stack The context stack.
duke@1 842 * @param arg0 An object to substitute for {0} in the message.
duke@1 843 * @param arg1 An object to substitute for {1} in the message.
duke@1 844 * @param arg2 An object to substitute for {2} in the message.
duke@1 845 * @return false.
duke@1 846 */
duke@1 847 protected static boolean failedConstraint(int constraintNum,
duke@1 848 boolean quiet,
duke@1 849 ContextStack stack,
duke@1 850 Object arg0, Object arg1, Object arg2) {
duke@1 851 String message = "rmic.iiop.constraint." + constraintNum;
duke@1 852
duke@1 853 if (!quiet) {
duke@1 854 stack.getEnv().error(0,message,
duke@1 855 (arg0 != null ? arg0.toString() : null),
duke@1 856 (arg1 != null ? arg1.toString() : null),
duke@1 857 (arg2 != null ? arg2.toString() : null));
duke@1 858 } else {
duke@1 859 String error = stack.getEnv().errorString(message,arg0,arg1,arg2);
duke@1 860 stack.traceln(error);
duke@1 861 }
duke@1 862
duke@1 863 return false;
duke@1 864 }
duke@1 865
duke@1 866 /**
duke@1 867 * Report a constraint failure thru the compiler environment.
duke@1 868 * @param constraintNum Used to generate a key of the form
duke@1 869 "rmic.iiop.constraint.N", which must identify a message
duke@1 870 in the "rmic.properties" file.
duke@1 871 * @param quiet True if should not cause failure or message.
duke@1 872 * @param stack The context stack.
duke@1 873 * @param arg0 An object to substitute for {0} in the message.
duke@1 874 * @param arg1 An object to substitute for {1} in the message.
duke@1 875 * @return false.
duke@1 876 */
duke@1 877 protected static boolean failedConstraint(int constraintNum,
duke@1 878 boolean quiet,
duke@1 879 ContextStack stack,
duke@1 880 Object arg0, Object arg1) {
duke@1 881 return failedConstraint(constraintNum,quiet,stack,arg0,arg1,null);
duke@1 882 }
duke@1 883
duke@1 884
duke@1 885 /**
duke@1 886 * Report a constraint failure thru the compiler environment.
duke@1 887 * @param constraintNum Used to generate a key of the form
duke@1 888 "rmic.iiop.constraint.N", which must identify a message
duke@1 889 in the "rmic.properties" file.
duke@1 890 * @param quiet True if should not cause failure or message.
duke@1 891 * @param stack The context stack.
duke@1 892 * @param arg0 An object to substitute for {0} in the message.
duke@1 893 * @return false.
duke@1 894 */
duke@1 895 protected static boolean failedConstraint(int constraintNum,
duke@1 896 boolean quiet,
duke@1 897 ContextStack stack,
duke@1 898 Object arg0) {
duke@1 899 return failedConstraint(constraintNum,quiet,stack,arg0,null,null);
duke@1 900 }
duke@1 901
duke@1 902 /**
duke@1 903 * Report a constraint failure thru the compiler environment.
duke@1 904 * @param quiet True if should not cause failure or message.
duke@1 905 * @param stack The context stack.
duke@1 906 * @param constraintNum Used to generate a key of the form
duke@1 907 "rmic.iiop.constraint.N", which must identify a message
duke@1 908 in the "rmic.properties" file.
duke@1 909 * @return false.
duke@1 910 */
duke@1 911 protected static boolean failedConstraint(int constraintNum,
duke@1 912 boolean quiet,
duke@1 913 ContextStack stack) {
duke@1 914 return failedConstraint(constraintNum,quiet,stack,null,null,null);
duke@1 915 }
duke@1 916
duke@1 917 /**
duke@1 918 * Cloning is supported by returning a shallow copy of this object.
duke@1 919 */
duke@1 920 protected Object clone() {
duke@1 921 try {
duke@1 922 return super.clone();
duke@1 923 } catch (CloneNotSupportedException e) {
duke@1 924 throw new Error("clone failed");
duke@1 925 }
duke@1 926 }
duke@1 927
duke@1 928 /*
duke@1 929 * Add matching types to list. Return true if this type has not
duke@1 930 * been previously checked, false otherwise.
duke@1 931 */
duke@1 932 protected boolean addTypes (int typeCodeFilter,
duke@1 933 HashSet checked,
duke@1 934 Vector matching) {
duke@1 935
duke@1 936 boolean result;
duke@1 937
duke@1 938 // Have we already checked this type?
duke@1 939
duke@1 940 if (checked.contains(this)) {
duke@1 941
duke@1 942 // Yes, so return false.
duke@1 943
duke@1 944 result = false;
duke@1 945
duke@1 946 } else {
duke@1 947
duke@1 948 // Nope, so add it...
duke@1 949
duke@1 950 checked.add(this);
duke@1 951
duke@1 952 // Do we match the filter?
duke@1 953
duke@1 954 if (typeMatches(typeCodeFilter)) {
duke@1 955
duke@1 956 // Yep. so add it and set result to true...
duke@1 957
duke@1 958 matching.addElement(this);
duke@1 959 }
duke@1 960
duke@1 961 // Return true.
duke@1 962
duke@1 963 result = true;
duke@1 964 }
duke@1 965
duke@1 966 return result;
duke@1 967 }
duke@1 968
duke@1 969 /*
duke@1 970 * Load a Class instance. Return null if fail.
duke@1 971 */
duke@1 972 protected abstract Class loadClass();
duke@1 973
duke@1 974 private boolean initClass() {
duke@1 975 if (ourClass == null) {
duke@1 976 ourClass = loadClass();
duke@1 977 if (ourClass == null) {
duke@1 978 failedConstraint(27,false,stack,getQualifiedName());
duke@1 979 return false;
duke@1 980 }
duke@1 981 }
duke@1 982 return true;
duke@1 983 }
duke@1 984
duke@1 985 /*
duke@1 986 * Set the clz and repositoryID fields. Reports error
duke@1 987 * and returns false if fails, returns true if succeeds.
duke@1 988 */
duke@1 989 protected boolean setRepositoryID() {
duke@1 990
duke@1 991 // First, load the class...
duke@1 992
duke@1 993 if (!initClass()) {
duke@1 994 return false;
duke@1 995 }
duke@1 996
duke@1 997 // Now make the repositoryID and return success...
duke@1 998
duke@1 999 repositoryID = RepositoryId.createForAnyType(ourClass);
duke@1 1000 return true;
duke@1 1001 }
duke@1 1002
duke@1 1003
duke@1 1004 //_____________________________________________________________________
duke@1 1005 // Internal Interfaces
duke@1 1006 //_____________________________________________________________________
duke@1 1007
duke@1 1008 private Type () {} // Disallowed.
duke@1 1009 }

mercurial