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

Thu, 24 May 2018 16:41:12 +0800

author
aoqi
date
Thu, 24 May 2018 16:41:12 +0800
changeset 1410
9c913ea7e4a1
parent 748
6845b95cba6b
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 /*
aoqi@0 27 * Licensed Materials - Property of IBM
aoqi@0 28 * RMI-IIOP v1.0
aoqi@0 29 * Copyright IBM Corp. 1998 1999 All Rights Reserved
aoqi@0 30 *
aoqi@0 31 */
aoqi@0 32
aoqi@0 33 package sun.rmi.rmic.iiop;
aoqi@0 34
aoqi@0 35 import java.util.Vector;
aoqi@0 36 import sun.tools.java.CompilerError;
aoqi@0 37 import sun.tools.java.ClassDefinition;
aoqi@0 38 import sun.tools.java.ClassNotFound;
aoqi@0 39
aoqi@0 40 /**
aoqi@0 41 * RemoteType represents any non-special interface which inherits
aoqi@0 42 * from java.rmi.Remote.
aoqi@0 43 * <p>
aoqi@0 44 * The static forRemote(...) method must be used to obtain an instance, and will
aoqi@0 45 * return null if the ClassDefinition is non-conforming.
aoqi@0 46 * @author Bryan Atsatt
aoqi@0 47 */
aoqi@0 48 public class RemoteType extends InterfaceType {
aoqi@0 49
aoqi@0 50 //_____________________________________________________________________
aoqi@0 51 // Public Interfaces
aoqi@0 52 //_____________________________________________________________________
aoqi@0 53
aoqi@0 54 /**
aoqi@0 55 * Create an RemoteType for the given class.
aoqi@0 56 *
aoqi@0 57 * If the class is not a properly formed or if some other error occurs, the
aoqi@0 58 * return value will be null, and errors will have been reported to the
aoqi@0 59 * supplied BatchEnvironment.
aoqi@0 60 */
aoqi@0 61 public static RemoteType forRemote(ClassDefinition classDef,
aoqi@0 62 ContextStack stack,
aoqi@0 63 boolean quiet) {
aoqi@0 64
aoqi@0 65 if (stack.anyErrors()) return null;
aoqi@0 66
aoqi@0 67 boolean doPop = false;
aoqi@0 68 RemoteType result = null;
aoqi@0 69
aoqi@0 70 try {
aoqi@0 71 // Do we already have it?
aoqi@0 72
aoqi@0 73 sun.tools.java.Type theType = classDef.getType();
aoqi@0 74 Type existing = getType(theType,stack);
aoqi@0 75
aoqi@0 76 if (existing != null) {
aoqi@0 77
aoqi@0 78 if (!(existing instanceof RemoteType)) return null; // False hit.
aoqi@0 79
aoqi@0 80 // Yep, so return it...
aoqi@0 81
aoqi@0 82 return (RemoteType) existing;
aoqi@0 83 }
aoqi@0 84
aoqi@0 85 // Could this be a remote type?
aoqi@0 86
aoqi@0 87 if (couldBeRemote(quiet,stack,classDef)) {
aoqi@0 88
aoqi@0 89 // Yes, so check it...
aoqi@0 90
aoqi@0 91 RemoteType it = new RemoteType(stack,classDef);
aoqi@0 92 putType(theType,it,stack);
aoqi@0 93 stack.push(it);
aoqi@0 94 doPop = true;
aoqi@0 95
aoqi@0 96 if (it.initialize(quiet,stack)) {
aoqi@0 97 stack.pop(true);
aoqi@0 98 result = it;
aoqi@0 99 } else {
aoqi@0 100 removeType(theType,stack);
aoqi@0 101 stack.pop(false);
aoqi@0 102 }
aoqi@0 103 }
aoqi@0 104 } catch (CompilerError e) {
aoqi@0 105 if (doPop) stack.pop(false);
aoqi@0 106 }
aoqi@0 107
aoqi@0 108 return result;
aoqi@0 109 }
aoqi@0 110
aoqi@0 111 /**
aoqi@0 112 * Return a string describing this type.
aoqi@0 113 */
aoqi@0 114 public String getTypeDescription () {
aoqi@0 115 return "Remote interface";
aoqi@0 116 }
aoqi@0 117
aoqi@0 118 //_____________________________________________________________________
aoqi@0 119 // Internal/Subclass Interfaces
aoqi@0 120 //_____________________________________________________________________
aoqi@0 121
aoqi@0 122 /**
aoqi@0 123 * Create a RemoteType instance for the given class. The resulting
aoqi@0 124 * object is not yet completely initialized.
aoqi@0 125 */
aoqi@0 126 protected RemoteType(ContextStack stack, ClassDefinition classDef) {
aoqi@0 127 super(stack,classDef,TYPE_REMOTE | TM_INTERFACE | TM_COMPOUND);
aoqi@0 128 }
aoqi@0 129
aoqi@0 130 /**
aoqi@0 131 * Create a RemoteType instance for the given class. The resulting
aoqi@0 132 * object is not yet completely initialized.
aoqi@0 133 */
aoqi@0 134 protected RemoteType(ContextStack stack, ClassDefinition classDef, int typeCode) {
aoqi@0 135 super(stack,classDef,typeCode);
aoqi@0 136 }
aoqi@0 137
aoqi@0 138 //_____________________________________________________________________
aoqi@0 139 // Internal Interfaces
aoqi@0 140 //_____________________________________________________________________
aoqi@0 141
aoqi@0 142
aoqi@0 143 private static boolean couldBeRemote (boolean quiet, ContextStack stack,
aoqi@0 144 ClassDefinition classDef) {
aoqi@0 145
aoqi@0 146 boolean result = false;
aoqi@0 147 BatchEnvironment env = stack.getEnv();
aoqi@0 148
aoqi@0 149 try {
aoqi@0 150 if (!classDef.isInterface()) {
aoqi@0 151 failedConstraint(16,quiet,stack,classDef.getName());
aoqi@0 152 } else {
aoqi@0 153 result = env.defRemote.implementedBy(env,classDef.getClassDeclaration());
aoqi@0 154 if (!result) failedConstraint(1,quiet,stack,classDef.getName());
aoqi@0 155 }
aoqi@0 156 } catch (ClassNotFound e) {
aoqi@0 157 classNotFound(stack,e);
aoqi@0 158 }
aoqi@0 159
aoqi@0 160 return result;
aoqi@0 161 }
aoqi@0 162
aoqi@0 163
aoqi@0 164 /**
aoqi@0 165 * Initialize this instance.
aoqi@0 166 */
aoqi@0 167 private boolean initialize (boolean quiet,ContextStack stack) {
aoqi@0 168
aoqi@0 169 boolean result = false;
aoqi@0 170
aoqi@0 171 // Go check it out and gather up the info we need...
aoqi@0 172
aoqi@0 173 Vector directInterfaces = new Vector();
aoqi@0 174 Vector directMethods = new Vector();
aoqi@0 175 Vector directConstants = new Vector();
aoqi@0 176
aoqi@0 177 if (isConformingRemoteInterface(directInterfaces,
aoqi@0 178 directMethods,
aoqi@0 179 directConstants,
aoqi@0 180 quiet,
aoqi@0 181 stack)){
aoqi@0 182
aoqi@0 183 // We're ok, so pass 'em up...
aoqi@0 184
aoqi@0 185 result = initialize(directInterfaces,directMethods,directConstants,stack,quiet);
aoqi@0 186 }
aoqi@0 187
aoqi@0 188 return result;
aoqi@0 189 }
aoqi@0 190
aoqi@0 191 /**
aoqi@0 192 * Check to ensure that the interface and all it's methods and arguments
aoqi@0 193 * conforms to the RMI/IDL java subset for remote interfaces as defined
aoqi@0 194 * by the "Java to IDL Mapping" specification, section 4.
aoqi@0 195 * @param directInterfaces All directly implmented interfaces will be
aoqi@0 196 * added to this list.
aoqi@0 197 * @param directMethods All directly implemented methods (other than
aoqi@0 198 * constructors and initializers) will be added to this list.
aoqi@0 199 * @param directConstants All constants defined by theInterface will be
aoqi@0 200 * added to this list.
aoqi@0 201 * @param quiet True if should not report constraint failures.
aoqi@0 202 * @return true if constraints satisfied, false otherwise.
aoqi@0 203 */
aoqi@0 204 private boolean isConformingRemoteInterface ( Vector directInterfaces,
aoqi@0 205 Vector directMethods,
aoqi@0 206 Vector directConstants,
aoqi@0 207 boolean quiet,
aoqi@0 208 ContextStack stack) {
aoqi@0 209
aoqi@0 210 ClassDefinition theInterface = getClassDefinition();
aoqi@0 211
aoqi@0 212 try {
aoqi@0 213
aoqi@0 214 // Get all remote interfaces...
aoqi@0 215
aoqi@0 216 if (addRemoteInterfaces(directInterfaces,false,stack) == null ) {
aoqi@0 217 return false;
aoqi@0 218 }
aoqi@0 219
aoqi@0 220 // Make sure all constants are conforming...
aoqi@0 221
aoqi@0 222 if (!addAllMembers(directConstants,true,quiet,stack)) {
aoqi@0 223 return false;
aoqi@0 224 }
aoqi@0 225
aoqi@0 226 // Now, collect up all methods...
aoqi@0 227
aoqi@0 228 if (addAllMethods(theInterface,directMethods,true,quiet,stack) == null) {
aoqi@0 229 // Failed a constraint check...
aoqi@0 230 return false;
aoqi@0 231 }
aoqi@0 232
aoqi@0 233 // Now walk 'em, ensuring each is a valid remote method...
aoqi@0 234
aoqi@0 235 boolean methodsConform = true;
aoqi@0 236 for (int i = 0; i < directMethods.size(); i++) {
aoqi@0 237 if (! isConformingRemoteMethod((Method) directMethods.elementAt(i),quiet)) {
aoqi@0 238 methodsConform = false;
aoqi@0 239 }
aoqi@0 240 }
aoqi@0 241 if (!methodsConform) {
aoqi@0 242 return false;
aoqi@0 243 }
aoqi@0 244 } catch (ClassNotFound e) {
aoqi@0 245 classNotFound(stack,e);
aoqi@0 246 return false;
aoqi@0 247 }
aoqi@0 248
aoqi@0 249 return true;
aoqi@0 250 }
aoqi@0 251 }

mercurial