Fri, 20 Apr 2012 17:34:25 +0100
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 | } |