src/share/classes/sun/rmi/rmic/iiop/IDLNames.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 /*
mbankal@371 2 * Copyright (c) 1998, 2012, 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.Hashtable;
duke@1 36 import java.util.Locale;
duke@1 37 import sun.tools.java.Identifier;
duke@1 38 import sun.tools.java.CompilerError;
duke@1 39 import sun.tools.java.ClassDefinition;
duke@1 40 import sun.tools.java.ClassNotFound;
duke@1 41 import com.sun.corba.se.impl.util.RepositoryId;
duke@1 42
duke@1 43 /**
duke@1 44 * IDLNames provides static utility methods to perform the IDL
duke@1 45 * name mappings specified in Chapter 5 of the Java Language
duke@1 46 * to IDL specification.
duke@1 47 *
duke@1 48 * @author Bryan Atsatt
duke@1 49 */
duke@1 50 public class IDLNames implements sun.rmi.rmic.iiop.Constants {
duke@1 51
duke@1 52 /**
duke@1 53 * Used to convert ascii to hex.
duke@1 54 */
duke@1 55 public static final byte ASCII_HEX[] = {
duke@1 56 (byte)'0',
duke@1 57 (byte)'1',
duke@1 58 (byte)'2',
duke@1 59 (byte)'3',
duke@1 60 (byte)'4',
duke@1 61 (byte)'5',
duke@1 62 (byte)'6',
duke@1 63 (byte)'7',
duke@1 64 (byte)'8',
duke@1 65 (byte)'9',
duke@1 66 (byte)'A',
duke@1 67 (byte)'B',
duke@1 68 (byte)'C',
duke@1 69 (byte)'D',
duke@1 70 (byte)'E',
duke@1 71 (byte)'F',
duke@1 72 };
duke@1 73
mbankal@371 74 // Legal IDL Identifier characters (1 = legal). Note
mbankal@371 75 // that '.' (2E) is marked as legal even though it is
mbankal@371 76 // not legal in IDL. This allows us to treat a fully
mbankal@371 77 // qualified Java name with '.' package separators
mbankal@371 78 // uniformly, and is safe because that is the only
mbankal@371 79 // legal use of '.' in a Java name.
mbankal@371 80
mbankal@371 81 private static final byte[] IDL_IDENTIFIER_CHARS = {
mbankal@371 82
mbankal@371 83 // 0 1 2 3 4 5 6 7 8 9 a b c d e f
mbankal@371 84 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 00-0f
mbankal@371 85 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 10-1f
mbankal@371 86 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0, // 20-2f
mbankal@371 87 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0, // 30-3f
mbankal@371 88 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 40-4f
mbankal@371 89 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,1, // 50-5f
mbankal@371 90 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 60-6f
mbankal@371 91 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0, // 70-7f
mbankal@371 92 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 80-8f
mbankal@371 93 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 90-9f
mbankal@371 94 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // a0-af
mbankal@371 95 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // b0-bf
mbankal@371 96 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // c0-cf
mbankal@371 97 0,1,1,1, 1,1,1,0, 1,1,1,1, 1,0,0,1, // d0-df
mbankal@371 98 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // e0-ef
mbankal@371 99 0,1,1,1, 1,1,1,0, 1,1,1,1, 1,0,0,1, // f0-ff
mbankal@371 100 };
mbankal@371 101
duke@1 102 //_____________________________________________________________________
duke@1 103 // Public Interfaces
duke@1 104 //_____________________________________________________________________
duke@1 105
duke@1 106 /**
duke@1 107 * Convert a name. The nameContext argument MUST be pre-filled with
duke@1 108 * all names from the appropriate context (e.g. all the method names
duke@1 109 * in a given class). The names must not have had any IDL conversions
duke@1 110 * applied.
duke@1 111 * <p>
duke@1 112 * Section 28.3.2.2
duke@1 113 * Section 28.3.2.3
duke@1 114 * Section 28.3.2.4
duke@1 115 * Section 28.3.2.7 (member and method names only)
duke@1 116 */
duke@1 117 public static String getMemberOrMethodName (NameContext nameContext,
duke@1 118 String name,
duke@1 119 BatchEnvironment env) {
duke@1 120
duke@1 121 // Check namesCache...
duke@1 122
duke@1 123 String result = (String) env.namesCache.get(name);
duke@1 124
duke@1 125 if (result == null) {
duke@1 126
duke@1 127 // 28.3.2.7 Case sensitive member names.
duke@1 128
duke@1 129 // Note: This must be done before any of
duke@1 130 // the other conversions!
duke@1 131
duke@1 132 result = nameContext.get(name);
duke@1 133
duke@1 134 // 28.3.2.3 Leading underscores...
duke@1 135
duke@1 136 result = convertLeadingUnderscores(result);
duke@1 137
duke@1 138 // 28.3.2.2 IDL keywords (NOTE: must be done
duke@1 139 // after leading underscore conversion because
duke@1 140 // the mangling for IDL keywords creates a
duke@1 141 // leading underscore!)...
duke@1 142
duke@1 143 result = convertIDLKeywords(result);
duke@1 144
duke@1 145 // 28.3.2.4 Illegal IDL identifier characters...
duke@1 146
duke@1 147 result = convertToISOLatin1(result);
duke@1 148
duke@1 149 // Add to namesCache...
duke@1 150
duke@1 151 env.namesCache.put(name,result);
duke@1 152 }
duke@1 153
duke@1 154 return result;
duke@1 155 }
duke@1 156
duke@1 157 /**
duke@1 158 * Convert names with illegal IDL identifier characters.
duke@1 159 * <p>
duke@1 160 * Section 28.3.2.4
duke@1 161 */
duke@1 162 public static String convertToISOLatin1 (String name) {
duke@1 163
duke@1 164 // First, replace any escape sequences...
duke@1 165
duke@1 166 String result = replace(name,"x\\u","U");
duke@1 167 result = replace(result,"x\\U","U");
duke@1 168
duke@1 169 // Now see if we have any remaining illegal characters (see
mbankal@371 170 // IDL_IDENTIFIER_CHARS array)...
duke@1 171
duke@1 172 int length = result.length();
duke@1 173 StringBuffer buffer = null;
duke@1 174
duke@1 175 for (int i = 0; i < length; i++) {
duke@1 176
duke@1 177 char c = result.charAt(i);
duke@1 178
mbankal@371 179 if (c > 255 || IDL_IDENTIFIER_CHARS[c] == 0) {
duke@1 180
duke@1 181 // We gotta convert. Have we already started?
duke@1 182
duke@1 183 if (buffer == null) {
duke@1 184
duke@1 185 // No, so get set up...
duke@1 186
duke@1 187 buffer = new StringBuffer(result.substring(0,i));
duke@1 188 }
duke@1 189
duke@1 190 // Convert the character into the IDL escape syntax...
duke@1 191
duke@1 192 buffer.append("U");
duke@1 193 buffer.append((char)ASCII_HEX[(c & 0xF000) >>> 12]);
duke@1 194 buffer.append((char)ASCII_HEX[(c & 0x0F00) >>> 8]);
duke@1 195 buffer.append((char)ASCII_HEX[(c & 0x00F0) >>> 4]);
duke@1 196 buffer.append((char)ASCII_HEX[(c & 0x000F)]);
duke@1 197
duke@1 198 } else {
duke@1 199 if (buffer != null) {
duke@1 200 buffer.append(c);
duke@1 201 }
duke@1 202 }
duke@1 203 }
duke@1 204
duke@1 205 if (buffer != null) {
duke@1 206 result = buffer.toString();
duke@1 207 }
duke@1 208
duke@1 209 return result;
duke@1 210 }
duke@1 211
duke@1 212 /**
duke@1 213 * Convert names which collide with IDL keywords.
duke@1 214 * <p>
duke@1 215 * Section 28.3.2.5
duke@1 216 */
duke@1 217 public static String convertIDLKeywords (String name) {
duke@1 218
duke@1 219 for (int i = 0; i < IDL_KEYWORDS.length; i++) {
duke@1 220 if (name.equalsIgnoreCase(IDL_KEYWORDS[i])) {
duke@1 221 return "_" + name;
duke@1 222 }
duke@1 223 }
duke@1 224
duke@1 225 return name;
duke@1 226 }
duke@1 227
duke@1 228 /**
duke@1 229 * Convert names which have leading underscores
duke@1 230 * <p>
duke@1 231 * Section 28.3.2.3
duke@1 232 */
duke@1 233 public static String convertLeadingUnderscores (String name) {
duke@1 234
duke@1 235 if (name.startsWith("_")) {
duke@1 236 return "J" + name;
duke@1 237 }
duke@1 238
duke@1 239 return name;
duke@1 240 }
duke@1 241
duke@1 242 /**
duke@1 243 * Convert a type name.
duke@1 244 * <p>
duke@1 245 * Section 28.3.2.5
duke@1 246 * Section 28.3.2.7 (class or interface names only)
duke@1 247 * Throws exception if fails 28.3.2.7.
duke@1 248 */
duke@1 249 public static String getClassOrInterfaceName (Identifier id,
duke@1 250 BatchEnvironment env) throws Exception {
duke@1 251
duke@1 252 // Get the type and package name...
duke@1 253
duke@1 254 String typeName = id.getName().toString();
duke@1 255 String packageName = null;
duke@1 256
duke@1 257 if (id.isQualified()) {
duke@1 258 packageName = id.getQualifier().toString();
duke@1 259 }
duke@1 260
duke@1 261 // Check namesCache...
duke@1 262
duke@1 263 String result = (String) env.namesCache.get(typeName);
duke@1 264
duke@1 265 if (result == null) {
duke@1 266
duke@1 267 // 28.3.2.5 Inner classes...
duke@1 268
duke@1 269 result = replace(typeName,". ","__");
duke@1 270
duke@1 271 // 28.3.2.4 Illegal identifier characters...
duke@1 272
duke@1 273 result = convertToISOLatin1(result);
duke@1 274
duke@1 275 // 28.3.2.7 Case sensitive class or interface names...
duke@1 276
duke@1 277 NameContext context = NameContext.forName(packageName,false,env);
duke@1 278 context.assertPut(result);
duke@1 279
duke@1 280 // Run it through the name checks...
duke@1 281
duke@1 282 result = getTypeOrModuleName(result);
duke@1 283
duke@1 284 // Add it to the namesCache...
duke@1 285
duke@1 286 env.namesCache.put(typeName,result);
duke@1 287 }
duke@1 288
duke@1 289 return result;
duke@1 290 }
duke@1 291
duke@1 292 /**
duke@1 293 * Convert an Exception name.
duke@1 294 * <p>
duke@1 295 * Section 28.3.7.2 (see ValueType)
duke@1 296 */
duke@1 297 public static String getExceptionName (String idlName) {
duke@1 298
duke@1 299 String result = idlName;
duke@1 300 // d.11315 Incorrectly mangled exception names
duke@1 301 if (idlName.endsWith(EXCEPTION_SUFFIX)) {
duke@1 302
duke@1 303 // Remove "Exception" and append "Ex". Strip leading underscore
duke@1 304 // in case the idlName is exactly "_Exception"...
duke@1 305
duke@1 306 result = stripLeadingUnderscore(idlName.substring(0,idlName.lastIndexOf(EXCEPTION_SUFFIX)) + EX_SUFFIX);
duke@1 307 } else {
duke@1 308 result = idlName + EX_SUFFIX;
duke@1 309 }
duke@1 310
duke@1 311 return result;
duke@1 312 }
duke@1 313
duke@1 314 /**
duke@1 315 * Convert a qualified Identifier into an array of IDL names.
duke@1 316 * <p>
duke@1 317 * Section 28.3.2.1 (see CompoundType)
duke@1 318 * Throws exception if fails 28.3.2.7.
duke@1 319 */
duke@1 320 public static String[] getModuleNames (Identifier theID,
duke@1 321 boolean boxIt,
duke@1 322 BatchEnvironment env) throws Exception {
duke@1 323
duke@1 324 String[] result = null;
duke@1 325
duke@1 326 if (theID.isQualified()) {
duke@1 327
duke@1 328 // Extract the qualifier...
duke@1 329
duke@1 330 Identifier id = theID.getQualifier();
duke@1 331
duke@1 332 // 28.3.2.7 Case sensitive module names.
duke@1 333
duke@1 334 env.modulesContext.assertPut(id.toString());
duke@1 335
duke@1 336 // Count them...
duke@1 337
duke@1 338 int count = 1;
duke@1 339 Identifier current = id;
duke@1 340 while (current.isQualified()) {
duke@1 341 current = current.getQualifier();
duke@1 342 count++;
duke@1 343 }
duke@1 344
duke@1 345 result = new String[count];
duke@1 346 int index = count-1;
duke@1 347 current = id;
duke@1 348
duke@1 349 // Now walk them and fill our array (backwards)...
duke@1 350
duke@1 351 for (int i = 0; i < count; i++) {
duke@1 352
duke@1 353 String item = current.getName().toString();
duke@1 354
duke@1 355 // Check namesCache...
duke@1 356
duke@1 357 String cachedItem = (String) env.namesCache.get(item);
duke@1 358
duke@1 359 if (cachedItem == null) {
duke@1 360
duke@1 361 // 28.3.2.4 Illegal identifier characters...
duke@1 362
duke@1 363 cachedItem = convertToISOLatin1(item);
duke@1 364
duke@1 365 // Run it through the name checks...
duke@1 366
duke@1 367 cachedItem = getTypeOrModuleName(cachedItem);
duke@1 368
duke@1 369 // Add it to the namesCache...
duke@1 370
duke@1 371 env.namesCache.put(item,cachedItem);
duke@1 372 }
duke@1 373
duke@1 374 result[index--] = cachedItem;
duke@1 375 current = current.getQualifier();
duke@1 376 }
duke@1 377 }
duke@1 378
duke@1 379
duke@1 380 // If it is supposed to be "boxed", prepend
duke@1 381 // IDL_BOXEDIDL_MODULE...
duke@1 382
duke@1 383 if (boxIt) {
duke@1 384 if (result == null) {
duke@1 385 result = IDL_BOXEDIDL_MODULE;
duke@1 386 } else {
duke@1 387 String[] boxed = new String[result.length+IDL_BOXEDIDL_MODULE.length];
duke@1 388 System.arraycopy(IDL_BOXEDIDL_MODULE,0,boxed,0,IDL_BOXEDIDL_MODULE.length);
duke@1 389 System.arraycopy(result,0,boxed,IDL_BOXEDIDL_MODULE.length,result.length);
duke@1 390 result = boxed;
duke@1 391 }
duke@1 392 }
duke@1 393
duke@1 394 return result;
duke@1 395 }
duke@1 396
duke@1 397 /**
duke@1 398 * Get an array name with the specified dimensions.
duke@1 399 * <p>
duke@1 400 * Section 28.3.6 (see ArrayType)
duke@1 401 */
duke@1 402 public static String getArrayName (Type theType, int arrayDimension) {
duke@1 403
duke@1 404 StringBuffer idlName = new StringBuffer(64);
duke@1 405
duke@1 406 // Prefix with seq<n>_...
duke@1 407
duke@1 408 idlName.append(IDL_SEQUENCE);
duke@1 409 idlName.append(Integer.toString(arrayDimension));
duke@1 410 idlName.append("_");
duke@1 411
duke@1 412 // Add the type name. We need to map any spaces in the
duke@1 413 // name to "_"...
duke@1 414
duke@1 415 idlName.append(replace(stripLeadingUnderscore(theType.getIDLName())," ","_"));
duke@1 416
duke@1 417 // And we're done...
duke@1 418
duke@1 419 return idlName.toString();
duke@1 420 }
duke@1 421
duke@1 422 /**
duke@1 423 * Get an array module names.
duke@1 424 */
duke@1 425 public static String[] getArrayModuleNames (Type theType) {
duke@1 426
duke@1 427 String[] moduleName;
duke@1 428 String[] typeModule = theType.getIDLModuleNames();
duke@1 429 int typeModuleLength = typeModule.length;
duke@1 430
duke@1 431 // Does the type have a module?
duke@1 432
duke@1 433 if (typeModuleLength == 0) {
duke@1 434
duke@1 435 // Nope, so just use the sequence module...
duke@1 436
duke@1 437 moduleName = IDL_SEQUENCE_MODULE;
duke@1 438 } else {
duke@1 439
duke@1 440 // Yes, so gotta concatenate...
duke@1 441
duke@1 442 moduleName = new String[typeModuleLength + IDL_SEQUENCE_MODULE.length];
duke@1 443 System.arraycopy(IDL_SEQUENCE_MODULE,0,moduleName,0,IDL_SEQUENCE_MODULE.length);
duke@1 444 System.arraycopy(typeModule,0,moduleName,IDL_SEQUENCE_MODULE.length,typeModuleLength);
duke@1 445 }
duke@1 446
duke@1 447 return moduleName;
duke@1 448 }
duke@1 449
duke@1 450 private static int getInitialAttributeKind (CompoundType.Method method,
duke@1 451 BatchEnvironment env) throws ClassNotFound {
duke@1 452
duke@1 453 int result = ATTRIBUTE_NONE;
duke@1 454
duke@1 455 // First make sure it is not a constructor...
duke@1 456
duke@1 457 if (!method.isConstructor()) {
duke@1 458
duke@1 459 // Now check exceptions. It may not throw any checked
duke@1 460 // exception other than RemoteException or one of its
duke@1 461 // subclasses...
duke@1 462
duke@1 463 boolean validExceptions = true;
duke@1 464 ClassType[] exceptions = method.getExceptions();
duke@1 465
duke@1 466 if (exceptions.length > 0) {
duke@1 467 for (int i = 0; i < exceptions.length; i++) {
duke@1 468 if (exceptions[i].isCheckedException() &&
duke@1 469 !exceptions[i].isRemoteExceptionOrSubclass()) {
duke@1 470 validExceptions = false;
duke@1 471 break;
duke@1 472 }
duke@1 473 }
duke@1 474 } else {
duke@1 475
duke@1 476 // If this is a ValueType, it is ok to not have any exceptions,
duke@1 477 // otherwise this method does not qualify...
duke@1 478
duke@1 479 validExceptions = method.getEnclosing().isType(TYPE_VALUE);
duke@1 480 }
duke@1 481
duke@1 482 if (validExceptions) {
duke@1 483 String name = method.getName();
duke@1 484 int nameLength = name.length();
duke@1 485 int argCount = method.getArguments().length;
duke@1 486 Type returnType = method.getReturnType();
duke@1 487 boolean voidReturn = returnType.isType(TYPE_VOID);
duke@1 488 boolean booleanReturn = returnType.isType(TYPE_BOOLEAN);
duke@1 489
duke@1 490 // It's a getter if name starts with "get" and it has no arguments
duke@1 491 // and a return type that is not void...
duke@1 492
duke@1 493 if (name.startsWith("get") && nameLength > 3 && argCount == 0 && !voidReturn) {
duke@1 494 result = ATTRIBUTE_GET;
duke@1 495 } else {
duke@1 496
duke@1 497 // It's a getter if name starts with "is" and it has no arguments
duke@1 498 // and a boolean return type...
duke@1 499
duke@1 500 if (name.startsWith("is") && nameLength > 2 && argCount == 0 && booleanReturn) {
duke@1 501 result = ATTRIBUTE_IS;
duke@1 502 } else {
duke@1 503
duke@1 504 // It's a setter if name starts with "set" and it has 1 argument
duke@1 505 // and a void return type...
duke@1 506
duke@1 507 if (name.startsWith("set") && nameLength > 3 && argCount == 1 && voidReturn) {
duke@1 508 result = ATTRIBUTE_SET;
duke@1 509 }
duke@1 510 }
duke@1 511 }
duke@1 512 }
duke@1 513 }
duke@1 514
duke@1 515 return result;
duke@1 516 }
duke@1 517
duke@1 518 private static void setAttributeKinds (CompoundType.Method[] methods,
duke@1 519 int[] kinds,
duke@1 520 String[] names) {
duke@1 521
duke@1 522 int count = methods.length;
duke@1 523
duke@1 524 // Strip the prefixes off of the attribute names...
duke@1 525
duke@1 526 for (int i = 0; i < count; i++) {
duke@1 527 switch (kinds[i]) {
duke@1 528 case ATTRIBUTE_GET: names[i] = names[i].substring(3); break;
duke@1 529 case ATTRIBUTE_IS: names[i] = names[i].substring(2); break;
duke@1 530 case ATTRIBUTE_SET: names[i] = names[i].substring(3); break;
duke@1 531 }
duke@1 532 }
duke@1 533
duke@1 534 // Now, we need to look at all the IS attributes to see
duke@1 535 // if there is a corresponding getter or setter which has
duke@1 536 // a different return type. If so, mark it as not an
duke@1 537 // attribute. Do this before checking for invalid setters...
duke@1 538
duke@1 539 for (int i = 0; i < count; i++) {
duke@1 540 if (kinds[i] == ATTRIBUTE_IS) {
duke@1 541 for (int j = 0; j < count; j++) {
duke@1 542 if (j != i &&
duke@1 543 (kinds[j] == ATTRIBUTE_GET || kinds[j] == ATTRIBUTE_SET) &&
duke@1 544 names[i].equals(names[j])) {
duke@1 545
duke@1 546 // We have matching getter or setter. Do the types match?
duke@1 547
duke@1 548 Type isType = methods[i].getReturnType();
duke@1 549 Type targetType;
duke@1 550
duke@1 551 if (kinds[j] == ATTRIBUTE_GET) {
duke@1 552 targetType = methods[j].getReturnType();
duke@1 553 } else {
duke@1 554 targetType = methods[j].getArguments()[0];
duke@1 555 }
duke@1 556
duke@1 557 if (!isType.equals(targetType)) {
duke@1 558
duke@1 559 // No, so forget this guy as an attribute...
duke@1 560
duke@1 561 kinds[i] = ATTRIBUTE_NONE;
duke@1 562 names[i] = methods[i].getName();
duke@1 563 break;
duke@1 564 }
duke@1 565 }
duke@1 566 }
duke@1 567 }
duke@1 568 }
duke@1 569
duke@1 570 // Now, we need to look at all the setters to see if there
duke@1 571 // is a corresponding getter. If not, it is not a setter.
duke@1 572 // If there is, change the getter type to _RW and set the
duke@1 573 // pair index...
duke@1 574
duke@1 575 for (int i = 0; i < count; i++) {
duke@1 576 if (kinds[i] == ATTRIBUTE_SET) {
duke@1 577 int getterIndex = -1;
duke@1 578 int isGetterIndex = -1;
duke@1 579 // First look for is-getters, then for getters.
duke@1 580 // This is preferred for boolean attributes.
duke@1 581 for (int j = 0; j < count; j++) {
duke@1 582 if (j != i && names[i].equals(names[j])) {
duke@1 583 // Yep, is the return type of the getter the same
duke@1 584 // as the argument type of the setter?
duke@1 585
duke@1 586 Type getterReturn = methods[j].getReturnType();
duke@1 587 Type setterArg = methods[i].getArguments()[0];
duke@1 588
duke@1 589 if (getterReturn.equals(setterArg)) {
duke@1 590 if (kinds[j] == ATTRIBUTE_IS) {
duke@1 591 isGetterIndex = j;
duke@1 592 // continue looking for another getter
duke@1 593 } else if (kinds[j] == ATTRIBUTE_GET) {
duke@1 594 getterIndex = j;
duke@1 595 // continue looking for an is-getter
duke@1 596 }
duke@1 597 }
duke@1 598 }
duke@1 599 }
duke@1 600
duke@1 601 if (getterIndex > -1) {
duke@1 602 if (isGetterIndex > -1) {
duke@1 603 // We have both, a boolean is-getter and a boolean getter.
duke@1 604 // Use the is-getter and drop the getter.
duke@1 605
duke@1 606 // We have a matching getter. Change it to a read-write type...
duke@1 607 kinds[isGetterIndex] = ATTRIBUTE_IS_RW;
duke@1 608
duke@1 609 // Now set the pair index for both the getter and the setter...
duke@1 610 methods[isGetterIndex].setAttributePairIndex(i);
duke@1 611 methods[i].setAttributePairIndex(isGetterIndex);
duke@1 612
duke@1 613 // We found a better matching is-getter.
duke@1 614 // Forget this other getter as an attribute.
duke@1 615 kinds[getterIndex] = ATTRIBUTE_NONE;
duke@1 616 names[getterIndex] = methods[getterIndex].getName();
duke@1 617 } else {
duke@1 618 // We only have one getter.
duke@1 619
duke@1 620 // We have a matching getter. Change it to a read-write type...
duke@1 621 kinds[getterIndex] = ATTRIBUTE_GET_RW;
duke@1 622
duke@1 623 // Now set the pair index for both the getter and the setter...
duke@1 624 methods[getterIndex].setAttributePairIndex(i);
duke@1 625 methods[i].setAttributePairIndex(getterIndex);
duke@1 626 }
duke@1 627 } else {
duke@1 628 if (isGetterIndex > -1) {
duke@1 629 // We only have one is-getter.
duke@1 630
duke@1 631 // We have a matching getter. Change it to a read-write type...
duke@1 632 kinds[isGetterIndex] = ATTRIBUTE_IS_RW;
duke@1 633
duke@1 634 // Now set the pair index for both the getter and the setter...
duke@1 635 methods[isGetterIndex].setAttributePairIndex(i);
duke@1 636 methods[i].setAttributePairIndex(isGetterIndex);
duke@1 637 } else {
duke@1 638 // We did not find a matching getter.
duke@1 639 // Forget this setter as an attribute.
duke@1 640 kinds[i] = ATTRIBUTE_NONE;
duke@1 641 names[i] = methods[i].getName();
duke@1 642 }
duke@1 643 }
duke@1 644 }
duke@1 645 }
duke@1 646
duke@1 647 // Finally, do the case conversion and set the
duke@1 648 // attribute kinds for each method...
duke@1 649
duke@1 650 for (int i = 0; i < count; i++) {
duke@1 651
duke@1 652 if (kinds[i] != ATTRIBUTE_NONE) {
duke@1 653
duke@1 654 String name = names[i];
duke@1 655
duke@1 656 // Is the first character upper case?
duke@1 657
duke@1 658 if (Character.isUpperCase(name.charAt(0))) {
duke@1 659
duke@1 660 // Yes, is the second?
duke@1 661
duke@1 662 if (name.length() == 1 || Character.isLowerCase(name.charAt(1))) {
duke@1 663
duke@1 664 // No, so convert the first character to lower case...
duke@1 665
duke@1 666 StringBuffer buffer = new StringBuffer(name);
duke@1 667 buffer.setCharAt(0,Character.toLowerCase(name.charAt(0)));
duke@1 668 names[i] = buffer.toString();
duke@1 669 }
duke@1 670 }
duke@1 671 }
duke@1 672
duke@1 673 methods[i].setAttributeKind(kinds[i]);
duke@1 674 }
duke@1 675 }
duke@1 676
duke@1 677 /**
duke@1 678 * Set all the method names in a given class.
duke@1 679 * <p>
duke@1 680 * Section 28.3.2.7 (see CompoundType)
duke@1 681 * Section 28.3.2.7
duke@1 682 * Section 28.3.4.3 (RemoteType/AbstractType only).
duke@1 683 */
duke@1 684 public static void setMethodNames (CompoundType container,
duke@1 685 CompoundType.Method[] allMethods,
duke@1 686 BatchEnvironment env)
duke@1 687 throws Exception {
duke@1 688
duke@1 689 // This method implements the following name mangling sequence:
duke@1 690 //
duke@1 691 // 1. If methods belong to a Remote interface, identify
duke@1 692 // those which qualify as an attribute under 28.3.4.3.
duke@1 693 // Those that do are referred to as 'attributes' below;
duke@1 694 // those that do not are referred to as 'methods'.
duke@1 695 //
duke@1 696 // 2. Apply the 28.3.4.3 manglings, except "__", to all
duke@1 697 // attribute names.
duke@1 698 //
duke@1 699 // 3. Apply all 28.3 manglings, except 28.3.2.7, to all names.
duke@1 700 //
duke@1 701 // 4. Apply 28.3.2.7 manglings to all method names.
duke@1 702 //
duke@1 703 // 5. Compare each attribute name to each method name. For
duke@1 704 // any which compare equal, append "__" to the attribute
duke@1 705 // name.
duke@1 706 //
duke@1 707 // 6. Compare each name (attribute and method) to all others.
duke@1 708 // If any compare equal, throw an Exception with the
duke@1 709 // conflicting name as the message.
duke@1 710
duke@1 711 int count = allMethods.length;
duke@1 712
duke@1 713 if (count == 0) return;
duke@1 714
duke@1 715 // Make an array of all the method names...
duke@1 716
duke@1 717 String[] names = new String[count];
duke@1 718 for (int i = 0; i < count; i++) {
duke@1 719 names[i] = allMethods[i].getName();
duke@1 720 }
duke@1 721
duke@1 722 // Are we dealing with a RemoteType, AbstractType, or ValueType?
duke@1 723
duke@1 724 CompoundType enclosing = allMethods[0].getEnclosing();
duke@1 725 if (enclosing.isType(TYPE_REMOTE) ||
duke@1 726 enclosing.isType(TYPE_ABSTRACT) ||
duke@1 727 enclosing.isType(TYPE_VALUE)) {
duke@1 728
duke@1 729 // Yes, so we must do the 28.3.4.3 attribute mapping. First, get
duke@1 730 // the initial attribute kind of each method...
duke@1 731
duke@1 732 int[] kinds = new int[count];
duke@1 733
duke@1 734 for (int i = 0; i < count; i++) {
duke@1 735 kinds[i] = getInitialAttributeKind(allMethods[i],env);
duke@1 736 }
duke@1 737
duke@1 738 // Now set the attribute kind for each method and do the
duke@1 739 // 28.3.4.3 name mangling...
duke@1 740
duke@1 741 setAttributeKinds(allMethods,kinds,names);
duke@1 742 }
duke@1 743
duke@1 744 // Make and populate a new context from our names array...
duke@1 745
duke@1 746 NameContext context = new NameContext(true);
duke@1 747
duke@1 748 for (int i = 0; i < count; i++) {
duke@1 749 context.put(names[i]);
duke@1 750 }
duke@1 751
duke@1 752 // Apply the appropriate 28.3 manglings to all the names...
duke@1 753
duke@1 754 boolean haveConstructor = false;
duke@1 755 for (int i = 0; i < count; i++) {
duke@1 756 if (!allMethods[i].isConstructor()) {
duke@1 757 names[i] = getMemberOrMethodName(context,names[i],env);
duke@1 758 } else {
duke@1 759 names[i] = IDL_CONSTRUCTOR;
duke@1 760 haveConstructor = true;
duke@1 761 }
duke@1 762 }
duke@1 763
duke@1 764 // Now do the 28.3.2.7 mangling for method name collisions...
duke@1 765 // Do this in two passes so that we don't change one during
duke@1 766 // the detection of collisions and then miss a real one...
duke@1 767
duke@1 768 boolean overloaded[] = new boolean[count];
duke@1 769 for (int i = 0; i < count; i++) {
duke@1 770 overloaded[i] = (!allMethods[i].isAttribute() &&
duke@1 771 !allMethods[i].isConstructor() &&
duke@1 772 doesMethodCollide(names[i],allMethods[i],allMethods,names,true));
duke@1 773 }
duke@1 774 convertOverloadedMethods(allMethods,names,overloaded);
duke@1 775
duke@1 776 // Now do the same mangling for constructor name collisions...
duke@1 777
duke@1 778 for (int i = 0; i < count; i++) {
duke@1 779 overloaded[i] = (!allMethods[i].isAttribute() &&
duke@1 780 allMethods[i].isConstructor() &&
duke@1 781 doesConstructorCollide(names[i],allMethods[i],allMethods,names,true));
duke@1 782 }
duke@1 783 convertOverloadedMethods(allMethods,names,overloaded);
duke@1 784
duke@1 785 // Now do the 28.3.4.3 mangling for attribute name collisions...
duke@1 786
duke@1 787 for (int i = 0; i < count; i++) {
duke@1 788
duke@1 789 CompoundType.Method method = allMethods[i];
duke@1 790
duke@1 791 // If this is an attribute name, does it collide with a method?
duke@1 792
duke@1 793 if (method.isAttribute() &&
duke@1 794 doesMethodCollide(names[i],method,allMethods,names,true)) {
duke@1 795
duke@1 796 // Yes, so add double underscore...
duke@1 797
duke@1 798 names[i] += "__";
duke@1 799 }
duke@1 800 }
duke@1 801
duke@1 802 // Do the same mangling for any constructors which collide with
duke@1 803 // methods...
duke@1 804
duke@1 805 if (haveConstructor) {
duke@1 806 for (int i = 0; i < count; i++) {
duke@1 807 CompoundType.Method method = allMethods[i];
duke@1 808
duke@1 809 // Is this a constructor which collides with a method?
duke@1 810
duke@1 811 if (method.isConstructor() &&
duke@1 812 doesConstructorCollide(names[i],method,allMethods,names,false)) {
duke@1 813
duke@1 814 // Yes, so add double underscore...
duke@1 815
duke@1 816 names[i] += "__";
duke@1 817 }
duke@1 818 }
duke@1 819 }
duke@1 820
duke@1 821 // Now see if we have a collision with the container name (28.3.2.9).
duke@1 822
duke@1 823 String containerName = container.getIDLName();
duke@1 824 for (int i = 0; i < count; i++) {
duke@1 825 if (names[i].equalsIgnoreCase(containerName)) {
duke@1 826 // Do not add underscore to attributes.
duke@1 827 // Otherwise getFoo will turn into _get_foo_.
duke@1 828 if (! allMethods[i].isAttribute()) {
duke@1 829 names[i] += "_";
duke@1 830 }
duke@1 831 }
duke@1 832 }
duke@1 833
duke@1 834 // Now see if we have any collisions (28.3.2.9). If we do,
duke@1 835 // it's an error. Note: a get/set pair does not collide.
duke@1 836
duke@1 837 for (int i = 0; i < count; i++) {
duke@1 838
duke@1 839 // Does it collide with any other name?
duke@1 840
duke@1 841 if (doesMethodCollide(names[i],allMethods[i],allMethods,names,false)) {
duke@1 842
duke@1 843 // Yes, so bail...
duke@1 844
duke@1 845 throw new Exception(allMethods[i].toString());
duke@1 846 }
duke@1 847 }
duke@1 848
duke@1 849 // Ok. We have unique names. Create the appropriate 'wire' name
duke@1 850 // for each and set as the 'idl' name. If it is an attribute, also
duke@1 851 // set the attribute name...
duke@1 852
duke@1 853 for (int i = 0; i < count; i++) {
duke@1 854
duke@1 855 CompoundType.Method method = allMethods[i];
duke@1 856 String wireName = names[i];
duke@1 857
duke@1 858 if (method.isAttribute()) {
duke@1 859 wireName = ATTRIBUTE_WIRE_PREFIX[method.getAttributeKind()] +
duke@1 860 stripLeadingUnderscore(wireName);
duke@1 861 String attributeName = names[i];
duke@1 862 method.setAttributeName(attributeName);
duke@1 863 }
duke@1 864 method.setIDLName(wireName);
duke@1 865 }
duke@1 866 }
duke@1 867
duke@1 868 private static String stripLeadingUnderscore (String name) {
duke@1 869 if (name != null && name.length() > 1
duke@1 870 && name.charAt(0) == '_')
duke@1 871 {
duke@1 872 return name.substring(1);
duke@1 873 }
duke@1 874 return name;
duke@1 875 }
duke@1 876
duke@1 877
duke@1 878 private static String stripTrailingUnderscore (String name) {
duke@1 879 if (name != null && name.length() > 1 &&
duke@1 880 name.charAt(name.length() - 1) == '_')
duke@1 881 {
duke@1 882 return name.substring(0, name.length() - 1);
duke@1 883 }
duke@1 884 return name;
duke@1 885 }
duke@1 886
duke@1 887
duke@1 888 private static void convertOverloadedMethods(CompoundType.Method[] allMethods,
duke@1 889 String[] names,
duke@1 890 boolean[] overloaded) {
duke@1 891
duke@1 892 for (int i = 0; i < names.length; i++) {
duke@1 893
duke@1 894 // Do we need to mangle it?
duke@1 895
duke@1 896 if (overloaded[i]) {
duke@1 897
duke@1 898 // Yes, so add arguments...
duke@1 899
duke@1 900 CompoundType.Method method = allMethods[i];
duke@1 901 Type[] args = method.getArguments();
duke@1 902
duke@1 903 for (int k = 0; k < args.length; k++) {
duke@1 904
duke@1 905 // Add the separator...
duke@1 906
duke@1 907 names[i] += "__";
duke@1 908
duke@1 909 // Get the fully qualified IDL name, without the "::"
duke@1 910 // prefix...
duke@1 911
duke@1 912 String argIDLName = args[k].getQualifiedIDLName(false);
duke@1 913
duke@1 914 // Replace any occurances of "::_" with "_" to
duke@1 915 // undo any IDL keyword mangling and do next step
duke@1 916 // at the same time...
duke@1 917
duke@1 918 argIDLName = replace(argIDLName,"::_","_");
duke@1 919
duke@1 920 // Replace any occurances of "::" with "_"...
duke@1 921
duke@1 922 argIDLName = replace(argIDLName,"::","_");
duke@1 923
duke@1 924 // Replace any occurances of " " with "_"...
duke@1 925
duke@1 926 argIDLName = replace(argIDLName," ","_");
duke@1 927
duke@1 928 // Add the argument type name...
duke@1 929
duke@1 930 names[i] += argIDLName;
duke@1 931 }
duke@1 932
duke@1 933 if (args.length == 0) {
duke@1 934 names[i] += "__";
duke@1 935 }
duke@1 936
duke@1 937 // Remove any IDL keyword mangling...
duke@1 938
duke@1 939 names[i] = stripLeadingUnderscore(names[i]);
duke@1 940 }
duke@1 941 }
duke@1 942 }
duke@1 943
duke@1 944 private static boolean doesMethodCollide (String name,
duke@1 945 CompoundType.Method method,
duke@1 946 CompoundType.Method[] allMethods,
duke@1 947 String[] allNames,
duke@1 948 boolean ignoreAttributes) {
duke@1 949
duke@1 950 // Scan all methods looking for a match...
duke@1 951
duke@1 952 for (int i = 0; i < allMethods.length; i++) {
duke@1 953
duke@1 954 CompoundType.Method target = allMethods[i];
duke@1 955
duke@1 956 if (method != target && // Not same instance
duke@1 957 !target.isConstructor() && // Not a constructor
duke@1 958 (!ignoreAttributes || !target.isAttribute()) && // Correct kind
duke@1 959 name.equals(allNames[i])) { // Same names
duke@1 960
duke@1 961 // Are we looking at a get/set pair?
duke@1 962
duke@1 963 int kind1 = method.getAttributeKind();
duke@1 964 int kind2 = target.getAttributeKind();
duke@1 965
duke@1 966 if ((kind1 != ATTRIBUTE_NONE && kind2 != ATTRIBUTE_NONE) &&
duke@1 967 ((kind1 == ATTRIBUTE_SET && kind2 != ATTRIBUTE_SET) ||
duke@1 968 (kind1 != ATTRIBUTE_SET && kind2 == ATTRIBUTE_SET) ||
duke@1 969 // one is a is-getter/setter pair and the other is just a getter
duke@1 970 (kind1 == ATTRIBUTE_IS_RW && kind2 == ATTRIBUTE_GET) ||
duke@1 971 (kind1 == ATTRIBUTE_GET && kind2 == ATTRIBUTE_IS_RW))) {
duke@1 972
duke@1 973 // Yes, so ignore it...
duke@1 974
duke@1 975 } else {
duke@1 976
duke@1 977 // No, so we have a collision...
duke@1 978
duke@1 979 return true;
duke@1 980 }
duke@1 981 }
duke@1 982 }
duke@1 983
duke@1 984 return false;
duke@1 985 }
duke@1 986
duke@1 987 private static boolean doesConstructorCollide (String name,
duke@1 988 CompoundType.Method method,
duke@1 989 CompoundType.Method[] allMethods,
duke@1 990 String[] allNames,
duke@1 991 boolean compareConstructors) {
duke@1 992
duke@1 993 // Scan all methods looking for a match...
duke@1 994
duke@1 995 for (int i = 0; i < allMethods.length; i++) {
duke@1 996
duke@1 997 CompoundType.Method target = allMethods[i];
duke@1 998
duke@1 999 if (method != target && // Not same instance
duke@1 1000 (target.isConstructor() == compareConstructors) && // Correct kind
duke@1 1001 name.equals(allNames[i])) { // Same names
duke@1 1002
duke@1 1003 // We have a collision...
duke@1 1004
duke@1 1005 return true;
duke@1 1006 }
duke@1 1007 }
duke@1 1008
duke@1 1009 return false;
duke@1 1010 }
duke@1 1011
duke@1 1012
duke@1 1013 /**
duke@1 1014 * Set all the member names in a given class.
duke@1 1015 * <p>
duke@1 1016 * Section 28.3.2.7 (see CompoundType)
duke@1 1017 * Section 28.3.2.7
duke@1 1018 */
duke@1 1019 public static void setMemberNames (CompoundType container,
duke@1 1020 CompoundType.Member[] allMembers,
duke@1 1021 CompoundType.Method[] allMethods,
duke@1 1022 BatchEnvironment env)
duke@1 1023 throws Exception {
duke@1 1024
duke@1 1025 // Make and populate a new context...
duke@1 1026
duke@1 1027 NameContext context = new NameContext(true);
duke@1 1028
duke@1 1029 for (int i = 0; i < allMembers.length; i++) {
duke@1 1030 context.put(allMembers[i].getName());
duke@1 1031 }
duke@1 1032
duke@1 1033 // Now set all the idl names...
duke@1 1034
duke@1 1035 for (int i = 0; i < allMembers.length; i++) {
duke@1 1036
duke@1 1037 CompoundType.Member member = allMembers[i];
duke@1 1038 String idlName = getMemberOrMethodName(context,member.getName(),env);
duke@1 1039 member.setIDLName(idlName);
duke@1 1040 }
duke@1 1041
duke@1 1042 // First see if we have a collision with the container name (28.3.2.9).
duke@1 1043
duke@1 1044 String containerName = container.getIDLName();
duke@1 1045 for (int i = 0; i < allMembers.length; i++) {
duke@1 1046 String name = allMembers[i].getIDLName();
duke@1 1047 if (name.equalsIgnoreCase(containerName)) {
duke@1 1048 // REVISIT - How is this different than line 788
duke@1 1049 allMembers[i].setIDLName(name+"_");
duke@1 1050 }
duke@1 1051 }
duke@1 1052
duke@1 1053 // Check for collisions between member names...
duke@1 1054
duke@1 1055 for (int i = 0; i < allMembers.length; i++) {
duke@1 1056 String name = allMembers[i].getIDLName();
duke@1 1057 for (int j = 0; j < allMembers.length; j++) {
duke@1 1058 if (i != j && allMembers[j].getIDLName().equals(name)) {
duke@1 1059
duke@1 1060 // Collision...
duke@1 1061
duke@1 1062 throw new Exception(name);
duke@1 1063 }
duke@1 1064 }
duke@1 1065 }
duke@1 1066
duke@1 1067 // Now check for collisions between member names and
duke@1 1068 // method names...
duke@1 1069
duke@1 1070 boolean changed;
duke@1 1071 do {
duke@1 1072 changed = false;
duke@1 1073 for (int i = 0; i < allMembers.length; i++) {
duke@1 1074 String name = allMembers[i].getIDLName();
duke@1 1075 for (int j = 0; j < allMethods.length; j++) {
duke@1 1076 if (allMethods[j].getIDLName().equals(name)) {
duke@1 1077
duke@1 1078 // Collision, so append "_" to member name...
duke@1 1079
duke@1 1080 allMembers[i].setIDLName(name+"_");
duke@1 1081 changed = true;
duke@1 1082 break;
duke@1 1083 }
duke@1 1084 }
duke@1 1085 }
duke@1 1086 } while (changed);
duke@1 1087 }
duke@1 1088
duke@1 1089 /**
duke@1 1090 * Get the name for the specified type code.
duke@1 1091 * <p>
duke@1 1092 * Section 28.3..3 (see PrimitiveType)
duke@1 1093 * Section 28.3.5.10 (see SpecialClassType)
duke@1 1094 * Section 28.3.4.1 (see SpecialInterfaceType)
duke@1 1095 * Section 28.3.10.1 (see SpecialInterfaceType)
duke@1 1096 * Section 28.3.10.2 (see SpecialClassType)
duke@1 1097 */
duke@1 1098 public static String getTypeName(int typeCode, boolean isConstant) {
duke@1 1099
duke@1 1100 String idlName = null;
duke@1 1101
duke@1 1102 switch (typeCode) {
duke@1 1103 case TYPE_VOID: idlName = IDL_VOID; break;
duke@1 1104 case TYPE_BOOLEAN: idlName = IDL_BOOLEAN; break;
duke@1 1105 case TYPE_BYTE: idlName = IDL_BYTE; break;
duke@1 1106 case TYPE_CHAR: idlName = IDL_CHAR; break;
duke@1 1107 case TYPE_SHORT: idlName = IDL_SHORT; break;
duke@1 1108 case TYPE_INT: idlName = IDL_INT; break;
duke@1 1109 case TYPE_LONG: idlName = IDL_LONG; break;
duke@1 1110 case TYPE_FLOAT: idlName = IDL_FLOAT; break;
duke@1 1111 case TYPE_DOUBLE: idlName = IDL_DOUBLE; break;
duke@1 1112 case TYPE_ANY: idlName = IDL_ANY; break;
duke@1 1113 case TYPE_CORBA_OBJECT: idlName = IDL_CORBA_OBJECT; break;
duke@1 1114 case TYPE_STRING:
duke@1 1115 {
duke@1 1116 if (isConstant) {
duke@1 1117 idlName = IDL_CONSTANT_STRING;
duke@1 1118 } else {
duke@1 1119 idlName = IDL_STRING;
duke@1 1120 }
duke@1 1121
duke@1 1122 break;
duke@1 1123 }
duke@1 1124 }
duke@1 1125
duke@1 1126 return idlName;
duke@1 1127 }
duke@1 1128
duke@1 1129 /**
duke@1 1130 * Create a qualified name.
duke@1 1131 */
duke@1 1132 public static String getQualifiedName (String[] idlModuleNames, String idlName) {
duke@1 1133 String result = null;
duke@1 1134 if (idlModuleNames != null && idlModuleNames.length > 0) {
duke@1 1135 for (int i = 0; i < idlModuleNames.length;i++) {
duke@1 1136 if (i == 0) {
duke@1 1137 result = idlModuleNames[0];
duke@1 1138 } else {
duke@1 1139 result += IDL_NAME_SEPARATOR;
duke@1 1140 result += idlModuleNames[i];
duke@1 1141 }
duke@1 1142 }
duke@1 1143 result += IDL_NAME_SEPARATOR;
duke@1 1144 result += idlName;
duke@1 1145 } else {
duke@1 1146 result = idlName;
duke@1 1147 }
duke@1 1148 return result;
duke@1 1149 }
duke@1 1150
duke@1 1151 /**
duke@1 1152 * Replace substrings
duke@1 1153 * @param source The source string.
duke@1 1154 * @param match The string to search for within the source string.
duke@1 1155 * @param replace The replacement for any matching components.
duke@1 1156 * @return
duke@1 1157 */
duke@1 1158 public static String replace (String source, String match, String replace) {
duke@1 1159
duke@1 1160 int index = source.indexOf(match,0);
duke@1 1161
duke@1 1162 if (index >=0) {
duke@1 1163
duke@1 1164 // We have at least one match, so gotta do the
duke@1 1165 // work...
duke@1 1166
duke@1 1167 StringBuffer result = new StringBuffer(source.length() + 16);
duke@1 1168 int matchLength = match.length();
duke@1 1169 int startIndex = 0;
duke@1 1170
duke@1 1171 while (index >= 0) {
duke@1 1172 result.append(source.substring(startIndex,index));
duke@1 1173 result.append(replace);
duke@1 1174 startIndex = index + matchLength;
duke@1 1175 index = source.indexOf(match,startIndex);
duke@1 1176 }
duke@1 1177
duke@1 1178 // Grab the last piece, if any...
duke@1 1179
duke@1 1180 if (startIndex < source.length()) {
duke@1 1181 result.append(source.substring(startIndex));
duke@1 1182 }
duke@1 1183
duke@1 1184 return result.toString();
duke@1 1185
duke@1 1186 } else {
duke@1 1187
duke@1 1188 // No matches, just return the source...
duke@1 1189
duke@1 1190 return source;
duke@1 1191 }
duke@1 1192 }
duke@1 1193
duke@1 1194 /**
duke@1 1195 * Get an IDL style repository id for
duke@1 1196 */
duke@1 1197 public static String getIDLRepositoryID (String idlName) {
duke@1 1198 return IDL_REPOSITORY_ID_PREFIX +
duke@1 1199 replace(idlName,"::", "/") +
duke@1 1200 IDL_REPOSITORY_ID_VERSION;
duke@1 1201 }
duke@1 1202
duke@1 1203 //_____________________________________________________________________
duke@1 1204 // Internal Interfaces
duke@1 1205 //_____________________________________________________________________
duke@1 1206
duke@1 1207
duke@1 1208 /**
duke@1 1209 * Convert a type or module name.
duke@1 1210 * <p>
duke@1 1211 * Section 28.3.2.2
duke@1 1212 * Section 28.3.2.3
duke@1 1213 */
duke@1 1214 private static String getTypeOrModuleName (String name) {
duke@1 1215
duke@1 1216 // 28.3.2.3 Leading underscores...
duke@1 1217
duke@1 1218 String result = convertLeadingUnderscores(name);
duke@1 1219
duke@1 1220 // 28.3.2.2 IDL keywords (NOTE: must be done
duke@1 1221 // after leading underscore conversion because
duke@1 1222 // the mangling for IDL keywords creates a
duke@1 1223 // leading underscore!)...
duke@1 1224
duke@1 1225 return convertIDLKeywords(result);
duke@1 1226 }
duke@1 1227 }

mercurial