src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil_save.sjava

Fri, 20 Apr 2012 17:34:25 +0100

author
coffeys
date
Fri, 20 Apr 2012 17:34:25 +0100
changeset 355
9cdcc0152526
parent 1
55540e827aef
permissions
-rw-r--r--

7161925: sjava files in corba don't have copyright string and legal notice
Reviewed-by: chegar
Contributed-by: misha.bykov@oracle.com

coffeys@355 1 /*
coffeys@355 2 * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
coffeys@355 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
coffeys@355 4 *
coffeys@355 5 * This code is free software; you can redistribute it and/or modify it
coffeys@355 6 * under the terms of the GNU General Public License version 2 only, as
coffeys@355 7 * published by the Free Software Foundation. Oracle designates this
coffeys@355 8 * particular file as subject to the "Classpath" exception as provided
coffeys@355 9 * by Oracle in the LICENSE file that accompanied this code.
coffeys@355 10 *
coffeys@355 11 * This code is distributed in the hope that it will be useful, but WITHOUT
coffeys@355 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
coffeys@355 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
coffeys@355 14 * version 2 for more details (a copy is included in the LICENSE file that
coffeys@355 15 * accompanied this code).
coffeys@355 16 *
coffeys@355 17 * You should have received a copy of the GNU General Public License version
coffeys@355 18 * 2 along with this work; if not, write to the Free Software Foundation,
coffeys@355 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
coffeys@355 20 *
coffeys@355 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
coffeys@355 22 * or visit www.oracle.com if you need additional information or have any
coffeys@355 23 * questions.
coffeys@355 24 */
duke@1 25
duke@1 26 package com.sun.corba.se.impl.presentation.rmi ;
duke@1 27
duke@1 28 import java.lang.reflect.Method;
duke@1 29 import java.lang.reflect.Field;
duke@1 30 import java.util.Set;
duke@1 31 import java.util.HashSet;
duke@1 32 import java.util.Iterator;
duke@1 33
duke@1 34 /**
duke@1 35 * Utility class for testing RMI/IDL Types as defined in
duke@1 36 * Section 1.2 of The Java Language to IDL Mapping. Note that
duke@1 37 * these are static checks only. Runtime checks, such as those
duke@1 38 * described in Section 1.2.3, #3, are not covered.
duke@1 39 */
duke@1 40 public class IDLTypesUtil {
duke@1 41
duke@1 42 public static final String JAVA_GET_PROPERTY_PREFIX = "get";
duke@1 43 public static final String JAVA_SET_PROPERTY_PREFIX = "set";
duke@1 44 public static final String JAVA_IS_PROPERTY_PREFIX = "is";
duke@1 45
duke@1 46 public static final int VALID_TYPE = 0;
duke@1 47 public static final int INVALID_TYPE = 1;
duke@1 48
duke@1 49 /**
duke@1 50 * Validate a class to ensure it conforms to the rules for a
duke@1 51 * Java RMI/IIOP interface.
duke@1 52 *
duke@1 53 * @throws IDLTypeException if not a valid RMI/IIOP interface.
duke@1 54 */
duke@1 55 public void validateRemoteInterface(Class c) throws IDLTypeException
duke@1 56 {
duke@1 57 if( c == null ) {
duke@1 58 throw new IllegalArgumentException();
duke@1 59 }
duke@1 60
duke@1 61 if( !c.isInterface() ) {
duke@1 62 String msg = "Class " + c + " must be a java interface.";
duke@1 63 throw new IDLTypeException(msg);
duke@1 64 }
duke@1 65
duke@1 66 if( !java.rmi.Remote.class.isAssignableFrom(c) ) {
duke@1 67 String msg = "Class " + c + " must extend java.rmi.Remote, " +
duke@1 68 "either directly or indirectly.";
duke@1 69 throw new IDLTypeException(msg);
duke@1 70 }
duke@1 71
duke@1 72 // Get all methods, including super-interface methods.
duke@1 73 Method[] methods = c.getMethods();
duke@1 74
duke@1 75 for(int i = 0; i < methods.length; i++) {
duke@1 76 Method next = methods[i];
duke@1 77 validateExceptions(next);
duke@1 78 }
duke@1 79
duke@1 80 // Removed because of bug 4989053
duke@1 81 // validateDirectInterfaces(c);
duke@1 82 validateConstants(c);
duke@1 83
duke@1 84 return;
duke@1 85 }
duke@1 86
duke@1 87 public boolean isRemoteInterface(Class c)
duke@1 88 {
duke@1 89 boolean remoteInterface = true;
duke@1 90 try {
duke@1 91 validateRemoteInterface(c);
duke@1 92 } catch(IDLTypeException ite) {
duke@1 93 remoteInterface = false;
duke@1 94 }
duke@1 95
duke@1 96 return remoteInterface;
duke@1 97 }
duke@1 98
duke@1 99 /**
duke@1 100 * Section 1.2.2 Primitive Types
duke@1 101 */
duke@1 102 public boolean isPrimitive(Class c)
duke@1 103 {
duke@1 104 if( c == null ) {
duke@1 105 throw new IllegalArgumentException();
duke@1 106 }
duke@1 107
duke@1 108 return c.isPrimitive();
duke@1 109 }
duke@1 110
duke@1 111 /**
duke@1 112 * Section 1.2.4
duke@1 113 */
duke@1 114 public boolean isValue(Class c)
duke@1 115 {
duke@1 116 if( c == null ) {
duke@1 117 throw new IllegalArgumentException();
duke@1 118 }
duke@1 119
duke@1 120 return
duke@1 121 (!c.isInterface() &&
duke@1 122 java.io.Serializable.class.isAssignableFrom(c) &&
duke@1 123 !java.rmi.Remote.class.isAssignableFrom(c));
duke@1 124 }
duke@1 125
duke@1 126 /**
duke@1 127 * Section 1.2.5
duke@1 128 */
duke@1 129 public boolean isArray(Class c)
duke@1 130 {
duke@1 131 boolean arrayType = false;
duke@1 132
duke@1 133 if( c == null ) {
duke@1 134 throw new IllegalArgumentException();
duke@1 135 }
duke@1 136
duke@1 137 if( c.isArray() ) {
duke@1 138 Class componentType = c.getComponentType();
duke@1 139 arrayType =
duke@1 140 (isPrimitive(componentType) || isRemoteInterface(componentType) ||
duke@1 141 isEntity(componentType) || isException(componentType) ||
duke@1 142 isValue(componentType) || isObjectReference(componentType) );
duke@1 143 }
duke@1 144
duke@1 145 return arrayType;
duke@1 146 }
duke@1 147
duke@1 148 /**
duke@1 149 * Section 1.2.6
duke@1 150 */
duke@1 151 public boolean isException(Class c)
duke@1 152 {
duke@1 153 if( c == null ) {
duke@1 154 throw new IllegalArgumentException();
duke@1 155 }
duke@1 156
duke@1 157 // Must be a checked exception, not including RemoteException or
duke@1 158 // its subclasses.
duke@1 159 return isCheckedException(c) && !isRemoteException(c) && isValue(c);
duke@1 160 }
duke@1 161
duke@1 162 public boolean isRemoteException(Class c)
duke@1 163 {
duke@1 164 if( c == null ) {
duke@1 165 throw new IllegalArgumentException();
duke@1 166 }
duke@1 167
duke@1 168 return java.rmi.RemoteException.class.isAssignableFrom(c) ;
duke@1 169 }
duke@1 170
duke@1 171 public boolean isCheckedException(Class c)
duke@1 172 {
duke@1 173 if( c == null ) {
duke@1 174 throw new IllegalArgumentException();
duke@1 175 }
duke@1 176
duke@1 177 return Throwable.class.isAssignableFrom(c) &&
duke@1 178 !RuntimeException.class.isAssignableFrom(c) &&
duke@1 179 !Error.class.isAssignableFrom(c) ;
duke@1 180 }
duke@1 181
duke@1 182 /**
duke@1 183 * Section 1.2.7
duke@1 184 */
duke@1 185 public boolean isObjectReference(Class c)
duke@1 186 {
duke@1 187 if( c == null ) {
duke@1 188 throw new IllegalArgumentException();
duke@1 189 }
duke@1 190
duke@1 191 return (c.isInterface() &&
duke@1 192 org.omg.CORBA.Object.class.isAssignableFrom(c));
duke@1 193 }
duke@1 194
duke@1 195 /**
duke@1 196 * Section 1.2.8
duke@1 197 */
duke@1 198 public boolean isEntity(Class c)
duke@1 199 {
duke@1 200 if( c == null ) {
duke@1 201 throw new IllegalArgumentException();
duke@1 202 }
duke@1 203
duke@1 204 Class superClass = c.getSuperclass();
duke@1 205 return (!c.isInterface() &&
duke@1 206 (superClass != null) &&
duke@1 207 (org.omg.CORBA.portable.IDLEntity.class.isAssignableFrom(c)));
duke@1 208 }
duke@1 209
duke@1 210 public String javaPropertyPrefixToIDL( String javaPrefix )
duke@1 211 {
duke@1 212 return "_" + javaPrefix + "_" ;
duke@1 213 }
duke@1 214
duke@1 215 /**
duke@1 216 * Return the property type if given method is legal property accessor as defined in
duke@1 217 * Section 1.3.4.3 of Java2IDL spec. Result is one of: JAVA_GET_PROPERTY_PREFIX,
duke@1 218 * JAVA_SET_PROPERTY_PREFIX, JAVA_IS_PROPERTY_PREFIX.
duke@1 219 */
duke@1 220 public String propertyAccessorMethodType(Method m, Class c) {
duke@1 221
duke@1 222 String methodName = m.getName();
duke@1 223 Class returnType = m.getReturnType();
duke@1 224 Class[] parameters = m.getParameterTypes();
duke@1 225 Class[] exceptionTypes = m.getExceptionTypes();
duke@1 226 String propertyType = null;
duke@1 227
duke@1 228 if( methodName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
duke@1 229
duke@1 230 if((parameters.length == 0) && (returnType != Void.TYPE) &&
duke@1 231 !hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX) {
duke@1 232 propertyType = JAVA_GET_PROPERTY_PREFIX;
duke@1 233 }
duke@1 234
duke@1 235 } else if( methodName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
duke@1 236
duke@1 237 if((returnType == Void.TYPE) && (parameters.length == 1)) {
duke@1 238 if (hasCorrespondingReadProperty(m, c, JAVA_GET_PROPERTY_PREFIX) ||
duke@1 239 hasCorrespondingReadProperty(m, c, JAVA_IS_PROPERTY_PREFIX)) {
duke@1 240 propertyType = JAVA_SET_PROPERTY_PREFIX;
duke@1 241 }
duke@1 242 }
duke@1 243
duke@1 244 } else if( methodName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
duke@1 245 if((parameters.length == 0) && (returnType == Boolean.TYPE)) {
duke@1 246 propertyType = JAVA_IS_PROPERTY_PREFIX;
duke@1 247 }
duke@1 248 }
duke@1 249
duke@1 250 // Some final checks that apply to all properties.
duke@1 251 if( propertyType != null ) {
duke@1 252 if(!validPropertyExceptions(m) ||
duke@1 253 (methodName.length() <= propertyType.length())) {
duke@1 254 propertyType = null;
duke@1 255 }
duke@1 256 }
duke@1 257
duke@1 258 return propertyType ;
duke@1 259 }
duke@1 260
duke@1 261 private boolean hasCorrespondingReadProperty
duke@1 262 (Method writeProperty, Class c, String readPropertyPrefix) {
duke@1 263
duke@1 264 String writePropertyMethodName = writeProperty.getName();
duke@1 265 Class[] writePropertyParameters = writeProperty.getParameterTypes();
duke@1 266 boolean foundReadProperty = false;
duke@1 267
duke@1 268 try {
duke@1 269 // Look for a valid corresponding Read property
duke@1 270 String readPropertyMethodName =
duke@1 271 writePropertyMethodName.replaceFirst
duke@1 272 (JAVA_SET_PROPERTY_PREFIX, readPropertyPrefix);
duke@1 273 Method readPropertyMethod = c.getMethod(readPropertyMethodName,
duke@1 274 new Class[] {});
duke@1 275 foundReadProperty =
duke@1 276 ((propertyAccessorMethodType(readPropertyMethod, c) != null) &&
duke@1 277 (readPropertyMethod.getReturnType() ==
duke@1 278 writePropertyParameters[0]));
duke@1 279 } catch(Exception e) {
duke@1 280 // ignore. this means we didn't find a corresponding get property.
duke@1 281 }
duke@1 282
duke@1 283 return foundReadProperty;
duke@1 284 }
duke@1 285
duke@1 286 public String getAttributeNameForProperty(String propertyName) {
duke@1 287 String attributeName = null;
duke@1 288 String prefix = null;
duke@1 289
duke@1 290 if( propertyName.startsWith(JAVA_GET_PROPERTY_PREFIX) ) {
duke@1 291 prefix = JAVA_GET_PROPERTY_PREFIX;
duke@1 292 } else if( propertyName.startsWith(JAVA_SET_PROPERTY_PREFIX) ) {
duke@1 293 prefix = JAVA_SET_PROPERTY_PREFIX;
duke@1 294 } else if( propertyName.startsWith(JAVA_IS_PROPERTY_PREFIX) ) {
duke@1 295 prefix = JAVA_IS_PROPERTY_PREFIX;
duke@1 296 }
duke@1 297
duke@1 298 if( (prefix != null) && (prefix.length() < propertyName.length()) ) {
duke@1 299 String remainder = propertyName.substring(prefix.length());
duke@1 300 if( (remainder.length() >= 2) &&
duke@1 301 Character.isUpperCase(remainder.charAt(0)) &&
duke@1 302 Character.isUpperCase(remainder.charAt(1)) ) {
duke@1 303 // don't set the first letter to lower-case if the
duke@1 304 // first two are upper-case
duke@1 305 attributeName = remainder;
duke@1 306 } else {
duke@1 307 attributeName = Character.toLowerCase(remainder.charAt(0)) +
duke@1 308 remainder.substring(1);
duke@1 309 }
duke@1 310 }
duke@1 311
duke@1 312 return attributeName;
duke@1 313 }
duke@1 314
duke@1 315 /**
duke@1 316 * Return IDL Type name for primitive types as defined in
duke@1 317 * Section 1.3.3 of Java2IDL spec or null if not a primitive type.
duke@1 318 */
duke@1 319 public IDLType getPrimitiveIDLTypeMapping(Class c) {
duke@1 320
duke@1 321 if( c == null ) {
duke@1 322 throw new IllegalArgumentException();
duke@1 323 }
duke@1 324
duke@1 325 if( c.isPrimitive() ) {
duke@1 326 if( c == Void.TYPE ) {
duke@1 327 return new IDLType( c, "void" ) ;
duke@1 328 } else if( c == Boolean.TYPE ) {
duke@1 329 return new IDLType( c, "boolean" ) ;
duke@1 330 } else if( c == Character.TYPE ) {
duke@1 331 return new IDLType( c, "wchar" ) ;
duke@1 332 } else if( c == Byte.TYPE ) {
duke@1 333 return new IDLType( c, "octet" ) ;
duke@1 334 } else if( c == Short.TYPE ) {
duke@1 335 return new IDLType( c, "short" ) ;
duke@1 336 } else if( c == Integer.TYPE ) {
duke@1 337 return new IDLType( c, "long" ) ;
duke@1 338 } else if( c == Long.TYPE ) {
duke@1 339 return new IDLType( c, "long_long" ) ;
duke@1 340 } else if( c == Float.TYPE ) {
duke@1 341 return new IDLType( c, "float" ) ;
duke@1 342 } else if( c == Double.TYPE ) {
duke@1 343 return new IDLType( c, "double" ) ;
duke@1 344 }
duke@1 345 }
duke@1 346
duke@1 347 return null;
duke@1 348 }
duke@1 349
duke@1 350 /**
duke@1 351 * Return IDL Type name for special case type mappings as defined in
duke@1 352 * Table 1-1 of Java2IDL spec or null if given class is not a special
duke@1 353 * type.
duke@1 354 */
duke@1 355 public IDLType getSpecialCaseIDLTypeMapping(Class c) {
duke@1 356
duke@1 357 if( c == null ) {
duke@1 358 throw new IllegalArgumentException();
duke@1 359 }
duke@1 360
duke@1 361 if( c == java.lang.Object.class ) {
duke@1 362 return new IDLType( c, new String[] { "java", "lang" },
duke@1 363 "Object" ) ;
duke@1 364 } else if( c == java.lang.String.class ) {
duke@1 365 return new IDLType( c, new String[] { "CORBA" },
duke@1 366 "WStringValue" ) ;
duke@1 367 } else if( c == java.lang.Class.class ) {
duke@1 368 return new IDLType( c, new String[] { "javax", "rmi", "CORBA" },
duke@1 369 "ClassDesc" ) ;
duke@1 370 } else if( c == java.io.Serializable.class ) {
duke@1 371 return new IDLType( c, new String[] { "java", "io" },
duke@1 372 "Serializable" ) ;
duke@1 373 } else if( c == java.io.Externalizable.class ) {
duke@1 374 return new IDLType( c, new String[] { "java", "io" },
duke@1 375 "Externalizable" ) ;
duke@1 376 } else if( c == java.rmi.Remote.class ) {
duke@1 377 return new IDLType( c, new String[] { "java", "rmi" },
duke@1 378 "Remote" ) ;
duke@1 379 } else if( c == org.omg.CORBA.Object.class ) {
duke@1 380 return new IDLType( c, "Object" ) ;
duke@1 381 } else {
duke@1 382 return null;
duke@1 383 }
duke@1 384 }
duke@1 385
duke@1 386 /**
duke@1 387 * Implements 1.2.3 #2 and #4
duke@1 388 */
duke@1 389 private void validateExceptions(Method method) throws IDLTypeException {
duke@1 390
duke@1 391 Class[] exceptions = method.getExceptionTypes();
duke@1 392
duke@1 393 boolean declaresRemoteExceptionOrSuperClass = false;
duke@1 394
duke@1 395 // Section 1.2.3, #2
duke@1 396 for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
duke@1 397 Class exception = exceptions[eIndex];
duke@1 398 if( isRemoteExceptionOrSuperClass(exception) ) {
duke@1 399 declaresRemoteExceptionOrSuperClass = true;
duke@1 400 break;
duke@1 401 }
duke@1 402 }
duke@1 403
duke@1 404 if( !declaresRemoteExceptionOrSuperClass ) {
duke@1 405 String msg = "Method '" + method + "' must throw at least one " +
duke@1 406 "exception of type java.rmi.RemoteException or one of its " +
duke@1 407 "super-classes";
duke@1 408 throw new IDLTypeException(msg);
duke@1 409 }
duke@1 410
duke@1 411 // Section 1.2.3, #4
duke@1 412 // See also bug 4972402
duke@1 413 // For all exceptions E in exceptions,
duke@1 414 // (isCheckedException(E) => (isValue(E) || RemoteException.isAssignableFrom( E ) )
duke@1 415 for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
duke@1 416 Class exception = exceptions[eIndex];
duke@1 417
duke@1 418 if (isCheckedException(exception) && !isValue(exception) &&
duke@1 419 !isRemoteException(exception))
duke@1 420 {
duke@1 421 String msg = "Exception '" + exception + "' on method '" +
duke@1 422 method + "' is not a allowed RMI/IIOP exception type";
duke@1 423 throw new IDLTypeException(msg);
duke@1 424 }
duke@1 425 }
duke@1 426
duke@1 427 return;
duke@1 428 }
duke@1 429
duke@1 430 /**
duke@1 431 * Returns true if the method's throw clause conforms to the exception
duke@1 432 * restrictions for properties as defined in Section 1.3.4.3 of
duke@1 433 * Java2IDL spec. This means that for all exceptions E declared on the
duke@1 434 * method, E isChecked => RemoteException.isAssignableFrom( E ).
duke@1 435 */
duke@1 436 private boolean validPropertyExceptions(Method method)
duke@1 437 {
duke@1 438 Class[] exceptions = method.getExceptionTypes();
duke@1 439
duke@1 440 for(int eIndex = 0; eIndex < exceptions.length; eIndex++) {
duke@1 441 Class exception = exceptions[eIndex];
duke@1 442
duke@1 443 if (isCheckedException(exception) && !isRemoteException(exception))
duke@1 444 return false ;
duke@1 445 }
duke@1 446
duke@1 447 return true;
duke@1 448 }
duke@1 449
duke@1 450 /**
duke@1 451 * Implements Section 1.2.3, #2.
duke@1 452 */
duke@1 453 private boolean isRemoteExceptionOrSuperClass(Class c) {
duke@1 454 return
duke@1 455 ((c == java.rmi.RemoteException.class) ||
duke@1 456 (c == java.io.IOException.class) ||
duke@1 457 (c == java.lang.Exception.class) ||
duke@1 458 (c == java.lang.Throwable.class));
duke@1 459 }
duke@1 460
duke@1 461 /**
duke@1 462 * Implements Section 1.2.3, #5.
duke@1 463 */
duke@1 464 private void validateDirectInterfaces(Class c) throws IDLTypeException {
duke@1 465
duke@1 466 Class[] directInterfaces = c.getInterfaces();
duke@1 467
duke@1 468 if( directInterfaces.length < 2 ) {
duke@1 469 return;
duke@1 470 }
duke@1 471
duke@1 472 Set allMethodNames = new HashSet();
duke@1 473 Set currentMethodNames = new HashSet();
duke@1 474
duke@1 475 for(int i = 0; i < directInterfaces.length; i++) {
duke@1 476 Class next = directInterfaces[i];
duke@1 477 Method[] methods = next.getMethods();
duke@1 478
duke@1 479 // Comparison is based on method names only. First collect
duke@1 480 // all methods from current interface, eliminating duplicate
duke@1 481 // names.
duke@1 482 currentMethodNames.clear();
duke@1 483 for(int m = 0; m < methods.length; m++) {
duke@1 484 currentMethodNames.add(methods[m].getName());
duke@1 485 }
duke@1 486
duke@1 487 // Now check each method against list of all unique method
duke@1 488 // names processed so far.
duke@1 489 for(Iterator iter=currentMethodNames.iterator(); iter.hasNext();) {
duke@1 490 String methodName = (String) iter.next();
duke@1 491 if( allMethodNames.contains(methodName) ) {
duke@1 492 String msg = "Class " + c + " inherits method " +
duke@1 493 methodName + " from multiple direct interfaces.";
duke@1 494 throw new IDLTypeException(msg);
duke@1 495 } else {
duke@1 496 allMethodNames.add(methodName);
duke@1 497 }
duke@1 498 }
duke@1 499 }
duke@1 500
duke@1 501 return;
duke@1 502 }
duke@1 503
duke@1 504 /**
duke@1 505 * Implements 1.2.3 #6
duke@1 506 */
duke@1 507 private void validateConstants(final Class c)
duke@1 508 throws IDLTypeException {
duke@1 509
duke@1 510 Field[] fields = null;
duke@1 511
duke@1 512 try {
duke@1 513 fields = (Field[])
duke@1 514 java.security.AccessController.doPrivileged
duke@1 515 (new java.security.PrivilegedExceptionAction() {
duke@1 516 public java.lang.Object run() throws Exception {
duke@1 517 return c.getFields();
duke@1 518 }
duke@1 519 });
duke@1 520 } catch(java.security.PrivilegedActionException pae) {
duke@1 521 IDLTypeException ite = new IDLTypeException();
duke@1 522 ite.initCause(pae);
duke@1 523 throw ite;
duke@1 524 }
duke@1 525
duke@1 526 for(int i = 0; i < fields.length; i++) {
duke@1 527 Field next = fields[i];
duke@1 528 Class fieldType = next.getType();
duke@1 529 if( (fieldType != java.lang.String.class) &&
duke@1 530 !isPrimitive(fieldType) ) {
duke@1 531 String msg = "Constant field '" + next.getName() +
duke@1 532 "' in class '" + next.getDeclaringClass().getName() +
duke@1 533 "' has invalid type' " + next.getType() + "'. Constants" +
duke@1 534 " in RMI/IIOP interfaces can only have primitive" +
duke@1 535 " types and java.lang.String types.";
duke@1 536 throw new IDLTypeException(msg);
duke@1 537 }
duke@1 538 }
duke@1 539
duke@1 540
duke@1 541 return;
duke@1 542 }
duke@1 543
duke@1 544 }

mercurial