Showing the changes to java/pkg/java/rmi/server (60 of 18352 files). Show all
Unified · Split
Binary file not shown.
| @@ -0,0 +1,68 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * An <code>ExportException</code> is a <code>RemoteException</code> | |
| 30 | + * thrown if an attempt to export a remote object fails. A remote object is | |
| 31 | + * exported via the constructors and <code>exportObject</code> methods of | |
| 32 | + * <code>java.rmi.server.UnicastRemoteObject</code> and | |
| 33 | + * <code>java.rmi.activation.Activatable</code>. | |
| 34 | + * | |
| 35 | + * @author Ann Wollrath | |
| 36 | + * @since JDK1.1 | |
| 37 | + * @see java.rmi.server.UnicastRemoteObject | |
| 38 | + * @see java.rmi.activation.Activatable | |
| 39 | + */ | |
| 40 | +public class ExportException extends java.rmi.RemoteException { | |
| 41 | + | |
| 42 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 43 | + private static final long serialVersionUID = -9155485338494060170L; | |
| 44 | + | |
| 45 | + /** | |
| 46 | + * Constructs an <code>ExportException</code> with the specified | |
| 47 | + * detail message. | |
| 48 | + * | |
| 49 | + * @param s the detail message | |
| 50 | + * @since JDK1.1 | |
| 51 | + */ | |
| 52 | + public ExportException(String s) { | |
| 53 | + super(s); | |
| 54 | + } | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * Constructs an <code>ExportException</code> with the specified | |
| 58 | + * detail message and nested exception. | |
| 59 | + * | |
| 60 | + * @param s the detail message | |
| 61 | + * @param ex the nested exception | |
| 62 | + * @since JDK1.1 | |
| 63 | + */ | |
| 64 | + public ExportException(String s, Exception ex) { | |
| 65 | + super(s, ex); | |
| 66 | + } | |
| 67 | + | |
| 68 | +} | |
Binary file not shown.
| @@ -0,0 +1,95 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.net.MalformedURLException; | |
| 29 | +import java.net.URL; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * <code>LoaderHandler</code> is an interface used internally by the RMI | |
| 33 | + * runtime in previous implementation versions. It should never be accessed | |
| 34 | + * by application code. | |
| 35 | + * | |
| 36 | + * @author Ann Wollrath | |
| 37 | + * @since JDK1.1 | |
| 38 | + * | |
| 39 | + * @deprecated no replacement | |
| 40 | + */ | |
| 41 | +@Deprecated | |
| 42 | +public interface LoaderHandler { | |
| 43 | + | |
| 44 | + /** package of system <code>LoaderHandler</code> implementation. */ | |
| 45 | + final static String packagePrefix = "sun.rmi.server"; | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Loads a class from the location specified by the | |
| 49 | + * <code>java.rmi.server.codebase</code> property. | |
| 50 | + * | |
| 51 | + * @param name the name of the class to load | |
| 52 | + * @return the <code>Class</code> object representing the loaded class | |
| 53 | + * @exception MalformedURLException | |
| 54 | + * if the system property <b>java.rmi.server.codebase</b> | |
| 55 | + * contains an invalid URL | |
| 56 | + * @exception ClassNotFoundException | |
| 57 | + * if a definition for the class could not | |
| 58 | + * be found at the codebase location. | |
| 59 | + * @since JDK1.1 | |
| 60 | + * @deprecated no replacement | |
| 61 | + */ | |
| 62 | + @Deprecated | |
| 63 | + Class<?> loadClass(String name) | |
| 64 | + throws MalformedURLException, ClassNotFoundException; | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * Loads a class from a URL. | |
| 68 | + * | |
| 69 | + * @param codebase the URL from which to load the class | |
| 70 | + * @param name the name of the class to load | |
| 71 | + * @return the <code>Class</code> object representing the loaded class | |
| 72 | + * @exception MalformedURLException | |
| 73 | + * if the <code>codebase</code> paramater | |
| 74 | + * contains an invalid URL | |
| 75 | + * @exception ClassNotFoundException | |
| 76 | + * if a definition for the class could not | |
| 77 | + * be found at the specified URL | |
| 78 | + * @since JDK1.1 | |
| 79 | + * @deprecated no replacement | |
| 80 | + */ | |
| 81 | + @Deprecated | |
| 82 | + Class<?> loadClass(URL codebase, String name) | |
| 83 | + throws MalformedURLException, ClassNotFoundException; | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * Returns the security context of the given class loader. | |
| 87 | + * | |
| 88 | + * @param loader a class loader from which to get the security context | |
| 89 | + * @return the security context | |
| 90 | + * @since JDK1.1 | |
| 91 | + * @deprecated no replacement | |
| 92 | + */ | |
| 93 | + @Deprecated | |
| 94 | + Object getSecurityContext(ClassLoader loader); | |
| 95 | +} | |
Binary file not shown.
| @@ -0,0 +1,265 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.io.*; | |
| 28 | +import java.util.*; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * <code>LogStream</code> provides a mechanism for logging errors that are | |
| 32 | + * of possible interest to those monitoring a system. | |
| 33 | + * | |
| 34 | + * @author Ann Wollrath (lots of code stolen from Ken Arnold) | |
| 35 | + * @since JDK1.1 | |
| 36 | + * @deprecated no replacement | |
| 37 | + */ | |
| 38 | +@Deprecated | |
| 39 | +public class LogStream extends PrintStream { | |
| 40 | + | |
| 41 | + /** table mapping known log names to log stream objects */ | |
| 42 | + private static Hashtable known = new Hashtable(5); | |
| 43 | + /** default output stream for new logs */ | |
| 44 | + private static PrintStream defaultStream = System.err; | |
| 45 | + | |
| 46 | + /** log name for this log */ | |
| 47 | + private String name; | |
| 48 | + | |
| 49 | + /** stream where output of this log is sent to */ | |
| 50 | + private OutputStream logOut; | |
| 51 | + | |
| 52 | + /** string writer for writing message prefixes to log stream */ | |
| 53 | + private OutputStreamWriter logWriter; | |
| 54 | + | |
| 55 | + /** string buffer used for constructing log message prefixes */ | |
| 56 | + private StringBuffer buffer = new StringBuffer(); | |
| 57 | + | |
| 58 | + /** stream used for buffering lines */ | |
| 59 | + private ByteArrayOutputStream bufOut; | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Create a new LogStream object. Since this only constructor is | |
| 63 | + * private, users must have a LogStream created through the "log" | |
| 64 | + * method. | |
| 65 | + * @param name string identifying messages from this log | |
| 66 | + * @out output stream that log messages will be sent to | |
| 67 | + * @since JDK1.1 | |
| 68 | + * @deprecated no replacement | |
| 69 | + */ | |
| 70 | + @Deprecated | |
| 71 | + private LogStream(String name, OutputStream out) | |
| 72 | + { | |
| 73 | + super(new ByteArrayOutputStream()); | |
| 74 | + bufOut = (ByteArrayOutputStream) super.out; | |
| 75 | + | |
| 76 | + this.name = name; | |
| 77 | + setOutputStream(out); | |
| 78 | + } | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Return the LogStream identified by the given name. If | |
| 82 | + * a log corresponding to "name" does not exist, a log using | |
| 83 | + * the default stream is created. | |
| 84 | + * @param name name identifying the desired LogStream | |
| 85 | + * @return log associated with given name | |
| 86 | + * @since JDK1.1 | |
| 87 | + * @deprecated no replacement | |
| 88 | + */ | |
| 89 | + @Deprecated | |
| 90 | + public static LogStream log(String name) { | |
| 91 | + LogStream stream; | |
| 92 | + synchronized (known) { | |
| 93 | + stream = (LogStream)known.get(name); | |
| 94 | + if (stream == null) { | |
| 95 | + stream = new LogStream(name, defaultStream); | |
| 96 | + } | |
| 97 | + known.put(name, stream); | |
| 98 | + } | |
| 99 | + return stream; | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Return the current default stream for new logs. | |
| 104 | + * @return default log stream | |
| 105 | + * @see #setDefaultStream | |
| 106 | + * @since JDK1.1 | |
| 107 | + * @deprecated no replacement | |
| 108 | + */ | |
| 109 | + @Deprecated | |
| 110 | + public static synchronized PrintStream getDefaultStream() { | |
| 111 | + return defaultStream; | |
| 112 | + } | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * Set the default stream for new logs. | |
| 116 | + * @param newDefault new default log stream | |
| 117 | + * @see #getDefaultStream | |
| 118 | + * @since JDK1.1 | |
| 119 | + * @deprecated no replacement | |
| 120 | + */ | |
| 121 | + @Deprecated | |
| 122 | + public static synchronized void setDefaultStream(PrintStream newDefault) { | |
| 123 | + defaultStream = newDefault; | |
| 124 | + } | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Return the current stream to which output from this log is sent. | |
| 128 | + * @return output stream for this log | |
| 129 | + * @see #setOutputStream | |
| 130 | + * @since JDK1.1 | |
| 131 | + * @deprecated no replacement | |
| 132 | + */ | |
| 133 | + @Deprecated | |
| 134 | + public synchronized OutputStream getOutputStream() | |
| 135 | + { | |
| 136 | + return logOut; | |
| 137 | + } | |
| 138 | + | |
| 139 | + /** | |
| 140 | + * Set the stream to which output from this log is sent. | |
| 141 | + * @param out new output stream for this log | |
| 142 | + * @see #getOutputStream | |
| 143 | + * @since JDK1.1 | |
| 144 | + * @deprecated no replacement | |
| 145 | + */ | |
| 146 | + @Deprecated | |
| 147 | + public synchronized void setOutputStream(OutputStream out) | |
| 148 | + { | |
| 149 | + logOut = out; | |
| 150 | + // Maintain an OutputStreamWriter with default CharToByteConvertor | |
| 151 | + // (just like new PrintStream) for writing log message prefixes. | |
| 152 | + logWriter = new OutputStreamWriter(logOut); | |
| 153 | + } | |
| 154 | + | |
| 155 | + /** | |
| 156 | + * Write a byte of data to the stream. If it is not a newline, then | |
| 157 | + * the byte is appended to the internal buffer. If it is a newline, | |
| 158 | + * then the currently buffered line is sent to the log's output | |
| 159 | + * stream, prefixed with the appropriate logging information. | |
| 160 | + * @since JDK1.1 | |
| 161 | + * @deprecated no replacement | |
| 162 | + */ | |
| 163 | + @Deprecated | |
| 164 | + public void write(int b) | |
| 165 | + { | |
| 166 | + if (b == '\n') { | |
| 167 | + // synchronize on "this" first to avoid potential deadlock | |
| 168 | + synchronized (this) { | |
| 169 | + synchronized (logOut) { | |
| 170 | + // construct prefix for log messages: | |
| 171 | + buffer.setLength(0);; | |
| 172 | + buffer.append( // date/time stamp... | |
| 173 | + (new Date()).toString()); | |
| 174 | + buffer.append(':'); | |
| 175 | + buffer.append(name); // ...log name... | |
| 176 | + buffer.append(':'); | |
| 177 | + buffer.append(Thread.currentThread().getName()); | |
| 178 | + buffer.append(':'); // ...and thread name | |
| 179 | + | |
| 180 | + try { | |
| 181 | + // write prefix through to underlying byte stream | |
| 182 | + logWriter.write(buffer.toString()); | |
| 183 | + logWriter.flush(); | |
| 184 | + | |
| 185 | + // finally, write the already converted bytes of | |
| 186 | + // the log message | |
| 187 | + bufOut.writeTo(logOut); | |
| 188 | + logOut.write(b); | |
| 189 | + logOut.flush(); | |
| 190 | + } catch (IOException e) { | |
| 191 | + setError(); | |
| 192 | + } finally { | |
| 193 | + bufOut.reset(); | |
| 194 | + } | |
| 195 | + } | |
| 196 | + } | |
| 197 | + } | |
| 198 | + else | |
| 199 | + super.write(b); | |
| 200 | + } | |
| 201 | + | |
| 202 | + /** | |
| 203 | + * Write a subarray of bytes. Pass each through write byte method. | |
| 204 | + * @since JDK1.1 | |
| 205 | + * @deprecated no replacement | |
| 206 | + */ | |
| 207 | + @Deprecated | |
| 208 | + public void write(byte b[], int off, int len) | |
| 209 | + { | |
| 210 | + if (len < 0) | |
| 211 | + throw new ArrayIndexOutOfBoundsException(len); | |
| 212 | + for (int i = 0; i < len; ++ i) | |
| 213 | + write(b[off + i]); | |
| 214 | + } | |
| 215 | + | |
| 216 | + /** | |
| 217 | + * Return log name as string representation. | |
| 218 | + * @return log name | |
| 219 | + * @since JDK1.1 | |
| 220 | + * @deprecated no replacement | |
| 221 | + */ | |
| 222 | + @Deprecated | |
| 223 | + public String toString() | |
| 224 | + { | |
| 225 | + return name; | |
| 226 | + } | |
| 227 | + | |
| 228 | + /** log level constant (no logging). */ | |
| 229 | + public static final int SILENT = 0; | |
| 230 | + /** log level constant (brief logging). */ | |
| 231 | + public static final int BRIEF = 10; | |
| 232 | + /** log level constant (verbose logging). */ | |
| 233 | + public static final int VERBOSE = 20; | |
| 234 | + | |
| 235 | + /** | |
| 236 | + * Convert a string name of a logging level to its internal | |
| 237 | + * integer representation. | |
| 238 | + * @param s name of logging level (e.g., 'SILENT', 'BRIEF', 'VERBOSE') | |
| 239 | + * @return corresponding integer log level | |
| 240 | + * @since JDK1.1 | |
| 241 | + * @deprecated no replacement | |
| 242 | + */ | |
| 243 | + @Deprecated | |
| 244 | + public static int parseLevel(String s) | |
| 245 | + { | |
| 246 | + if ((s == null) || (s.length() < 1)) | |
| 247 | + return -1; | |
| 248 | + | |
| 249 | + try { | |
| 250 | + return Integer.parseInt(s); | |
| 251 | + } catch (NumberFormatException e) { | |
| 252 | + } | |
| 253 | + if (s.length() < 1) | |
| 254 | + return -1; | |
| 255 | + | |
| 256 | + if ("SILENT".startsWith(s.toUpperCase())) | |
| 257 | + return SILENT; | |
| 258 | + else if ("BRIEF".startsWith(s.toUpperCase())) | |
| 259 | + return BRIEF; | |
| 260 | + else if ("VERBOSE".startsWith(s.toUpperCase())) | |
| 261 | + return VERBOSE; | |
| 262 | + | |
| 263 | + return -1; | |
| 264 | + } | |
| 265 | +} | |
Binary file not shown.
| @@ -0,0 +1,248 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.io.DataInput; | |
| 28 | +import java.io.DataOutput; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.io.ObjectInput; | |
| 31 | +import java.io.ObjectOutput; | |
| 32 | +import java.io.Serializable; | |
| 33 | +import java.security.AccessController; | |
| 34 | +import java.security.SecureRandom; | |
| 35 | +import java.util.concurrent.atomic.AtomicLong; | |
| 36 | +import sun.security.action.GetPropertyAction; | |
| 37 | + | |
| 38 | +/** | |
| 39 | + * An <code>ObjID</code> is used to identify a remote object exported | |
| 40 | + * to an RMI runtime. When a remote object is exported, it is assigned | |
| 41 | + * an object identifier either implicitly or explicitly, depending on | |
| 42 | + * the API used to export. | |
| 43 | + * | |
| 44 | + * <p>The {@link #ObjID()} constructor can be used to generate a unique | |
| 45 | + * object identifier. Such an <code>ObjID</code> is unique over time | |
| 46 | + * with respect to the host it is generated on. | |
| 47 | + * | |
| 48 | + * The {@link #ObjID(int)} constructor can be used to create a | |
| 49 | + * "well-known" object identifier. The scope of a well-known | |
| 50 | + * <code>ObjID</code> depends on the RMI runtime it is exported to. | |
| 51 | + * | |
| 52 | + * <p>An <code>ObjID</code> instance contains an object number (of type | |
| 53 | + * <code>long</code>) and an address space identifier (of type | |
| 54 | + * {@link UID}). In a unique <code>ObjID</code>, the address space | |
| 55 | + * identifier is unique with respect to a given host over time. In a | |
| 56 | + * well-known <code>ObjID</code>, the address space identifier is | |
| 57 | + * equivalent to one returned by invoking the {@link UID#UID(short)} | |
| 58 | + * constructor with the value zero. | |
| 59 | + * | |
| 60 | + * <p>If the system property <code>java.rmi.server.randomIDs</code> | |
| 61 | + * is defined to equal the string <code>"true"</code> (case insensitive), | |
| 62 | + * then the {@link #ObjID()} constructor will use a cryptographically | |
| 63 | + * strong random number generator to choose the object number of the | |
| 64 | + * returned <code>ObjID</code>. | |
| 65 | + * | |
| 66 | + * @author Ann Wollrath | |
| 67 | + * @author Peter Jones | |
| 68 | + * @since JDK1.1 | |
| 69 | + */ | |
| 70 | +public final class ObjID implements Serializable { | |
| 71 | + | |
| 72 | + /** Object number for well-known <code>ObjID</code> of the registry. */ | |
| 73 | + public static final int REGISTRY_ID = 0; | |
| 74 | + | |
| 75 | + /** Object number for well-known <code>ObjID</code> of the activator. */ | |
| 76 | + public static final int ACTIVATOR_ID = 1; | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * Object number for well-known <code>ObjID</code> of | |
| 80 | + * the distributed garbage collector. | |
| 81 | + */ | |
| 82 | + public static final int DGC_ID = 2; | |
| 83 | + | |
| 84 | + /** indicate compatibility with JDK 1.1.x version of class */ | |
| 85 | + private static final long serialVersionUID = -6386392263968365220L; | |
| 86 | + | |
| 87 | + private static final AtomicLong nextObjNum = new AtomicLong(0); | |
| 88 | + private static final UID mySpace = new UID(); | |
| 89 | + private static final SecureRandom secureRandom = new SecureRandom(); | |
| 90 | + | |
| 91 | + /** | |
| 92 | + * @serial object number | |
| 93 | + * @see #hashCode | |
| 94 | + */ | |
| 95 | + private final long objNum; | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * @serial address space identifier (unique to host over time) | |
| 99 | + */ | |
| 100 | + private final UID space; | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Generates a unique object identifier. | |
| 104 | + * | |
| 105 | + * <p>If the system property <code>java.rmi.server.randomIDs</code> | |
| 106 | + * is defined to equal the string <code>"true"</code> (case insensitive), | |
| 107 | + * then this constructor will use a cryptographically | |
| 108 | + * strong random number generator to choose the object number of the | |
| 109 | + * returned <code>ObjID</code>. | |
| 110 | + */ | |
| 111 | + public ObjID() { | |
| 112 | + /* | |
| 113 | + * If generating random object numbers, create a new UID to | |
| 114 | + * ensure uniqueness; otherwise, use a shared UID because | |
| 115 | + * sequential object numbers already ensure uniqueness. | |
| 116 | + */ | |
| 117 | + if (useRandomIDs()) { | |
| 118 | + space = new UID(); | |
| 119 | + objNum = secureRandom.nextLong(); | |
| 120 | + } else { | |
| 121 | + space = mySpace; | |
| 122 | + objNum = nextObjNum.getAndIncrement(); | |
| 123 | + } | |
| 124 | + } | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Creates a "well-known" object identifier. | |
| 128 | + * | |
| 129 | + * <p>An <code>ObjID</code> created via this constructor will not | |
| 130 | + * clash with any <code>ObjID</code>s generated via the no-arg | |
| 131 | + * constructor. | |
| 132 | + * | |
| 133 | + * @param objNum object number for well-known object identifier | |
| 134 | + */ | |
| 135 | + public ObjID(int objNum) { | |
| 136 | + space = new UID((short) 0); | |
| 137 | + this.objNum = objNum; | |
| 138 | + } | |
| 139 | + | |
| 140 | + /** | |
| 141 | + * Constructs an object identifier given data read from a stream. | |
| 142 | + */ | |
| 143 | + private ObjID(long objNum, UID space) { | |
| 144 | + this.objNum = objNum; | |
| 145 | + this.space = space; | |
| 146 | + } | |
| 147 | + | |
| 148 | + /** | |
| 149 | + * Marshals a binary representation of this <code>ObjID</code> to | |
| 150 | + * an <code>ObjectOutput</code> instance. | |
| 151 | + * | |
| 152 | + * <p>Specifically, this method first invokes the given stream's | |
| 153 | + * {@link ObjectOutput#writeLong(long)} method with this object | |
| 154 | + * identifier's object number, and then it writes its address | |
| 155 | + * space identifier by invoking its {@link UID#write(DataOutput)} | |
| 156 | + * method with the stream. | |
| 157 | + * | |
| 158 | + * @param out the <code>ObjectOutput</code> instance to write | |
| 159 | + * this <code>ObjID</code> to | |
| 160 | + * | |
| 161 | + * @throws IOException if an I/O error occurs while performing | |
| 162 | + * this operation | |
| 163 | + */ | |
| 164 | + public void write(ObjectOutput out) throws IOException { | |
| 165 | + out.writeLong(objNum); | |
| 166 | + space.write(out); | |
| 167 | + } | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Constructs and returns a new <code>ObjID</code> instance by | |
| 171 | + * unmarshalling a binary representation from an | |
| 172 | + * <code>ObjectInput</code> instance. | |
| 173 | + * | |
| 174 | + * <p>Specifically, this method first invokes the given stream's | |
| 175 | + * {@link ObjectInput#readLong()} method to read an object number, | |
| 176 | + * then it invokes {@link UID#read(DataInput)} with the | |
| 177 | + * stream to read an address space identifier, and then it | |
| 178 | + * creates and returns a new <code>ObjID</code> instance that | |
| 179 | + * contains the object number and address space identifier that | |
| 180 | + * were read from the stream. | |
| 181 | + * | |
| 182 | + * @param in the <code>ObjectInput</code> instance to read | |
| 183 | + * <code>ObjID</code> from | |
| 184 | + * | |
| 185 | + * @return unmarshalled <code>ObjID</code> instance | |
| 186 | + * | |
| 187 | + * @throws IOException if an I/O error occurs while performing | |
| 188 | + * this operation | |
| 189 | + */ | |
| 190 | + public static ObjID read(ObjectInput in) throws IOException { | |
| 191 | + long num = in.readLong(); | |
| 192 | + UID space = UID.read(in); | |
| 193 | + return new ObjID(num, space); | |
| 194 | + } | |
| 195 | + | |
| 196 | + /** | |
| 197 | + * Returns the hash code value for this object identifier, the | |
| 198 | + * object number. | |
| 199 | + * | |
| 200 | + * @return the hash code value for this object identifier | |
| 201 | + */ | |
| 202 | + public int hashCode() { | |
| 203 | + return (int) objNum; | |
| 204 | + } | |
| 205 | + | |
| 206 | + /** | |
| 207 | + * Compares the specified object with this <code>ObjID</code> for | |
| 208 | + * equality. | |
| 209 | + * | |
| 210 | + * This method returns <code>true</code> if and only if the | |
| 211 | + * specified object is an <code>ObjID</code> instance with the same | |
| 212 | + * object number and address space identifier as this one. | |
| 213 | + * | |
| 214 | + * @param obj the object to compare this <code>ObjID</code> to | |
| 215 | + * | |
| 216 | + * @return <code>true</code> if the given object is equivalent to | |
| 217 | + * this one, and <code>false</code> otherwise | |
| 218 | + */ | |
| 219 | + public boolean equals(Object obj) { | |
| 220 | + if (obj instanceof ObjID) { | |
| 221 | + ObjID id = (ObjID) obj; | |
| 222 | + return objNum == id.objNum && space.equals(id.space); | |
| 223 | + } else { | |
| 224 | + return false; | |
| 225 | + } | |
| 226 | + } | |
| 227 | + | |
| 228 | + /** | |
| 229 | + * Returns a string representation of this object identifier. | |
| 230 | + * | |
| 231 | + * @return a string representation of this object identifier | |
| 232 | + */ | |
| 233 | + /* | |
| 234 | + * The address space identifier is only included in the string | |
| 235 | + * representation if it does not denote the local address space | |
| 236 | + * (or if the randomIDs property was set). | |
| 237 | + */ | |
| 238 | + public String toString() { | |
| 239 | + return "[" + (space.equals(mySpace) ? "" : space + ", ") + | |
| 240 | + objNum + "]"; | |
| 241 | + } | |
| 242 | + | |
| 243 | + private static boolean useRandomIDs() { | |
| 244 | + String value = AccessController.doPrivileged( | |
| 245 | + new GetPropertyAction("java.rmi.server.randomIDs")); | |
| 246 | + return value == null ? true : Boolean.parseBoolean(value); | |
| 247 | + } | |
| 248 | +} | |
Binary file not shown.
| @@ -0,0 +1,73 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * An <code>Operation</code> contains a description of a Java method. | |
| 30 | + * <code>Operation</code> objects were used in JDK1.1 version stubs and | |
| 31 | + * skeletons. The <code>Operation</code> class is not needed for 1.2 style | |
| 32 | + * stubs (stubs generated with <code>rmic -v1.2</code>); hence, this class | |
| 33 | + * is deprecated. | |
| 34 | + * | |
| 35 | + * @since JDK1.1 | |
| 36 | + * @deprecated no replacement | |
| 37 | + */ | |
| 38 | +@Deprecated | |
| 39 | +public class Operation { | |
| 40 | + private String operation; | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Creates a new Operation object. | |
| 44 | + * @param op method name | |
| 45 | + * @deprecated no replacement | |
| 46 | + * @since JDK1.1 | |
| 47 | + */ | |
| 48 | + @Deprecated | |
| 49 | + public Operation(String op) { | |
| 50 | + operation = op; | |
| 51 | + } | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Returns the name of the method. | |
| 55 | + * @return method name | |
| 56 | + * @deprecated no replacement | |
| 57 | + * @since JDK1.1 | |
| 58 | + */ | |
| 59 | + @Deprecated | |
| 60 | + public String getOperation() { | |
| 61 | + return operation; | |
| 62 | + } | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Returns the string representation of the operation. | |
| 66 | + * @deprecated no replacement | |
| 67 | + * @since JDK1.1 | |
| 68 | + */ | |
| 69 | + @Deprecated | |
| 70 | + public String toString() { | |
| 71 | + return operation; | |
| 72 | + } | |
| 73 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,722 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.net.MalformedURLException; | |
| 29 | +import java.net.URL; | |
| 30 | +import java.security.AccessController; | |
| 31 | +import java.security.PrivilegedAction; | |
| 32 | +import java.util.Iterator; | |
| 33 | +import java.util.ServiceLoader; | |
| 34 | + | |
| 35 | +/** | |
| 36 | + * <code>RMIClassLoader</code> comprises static methods to support | |
| 37 | + * dynamic class loading with RMI. Included are methods for loading | |
| 38 | + * classes from a network location (one or more URLs) and obtaining | |
| 39 | + * the location from which an existing class should be loaded by | |
| 40 | + * remote parties. These methods are used by the RMI runtime when | |
| 41 | + * marshalling and unmarshalling classes contained in the arguments | |
| 42 | + * and return values of remote method calls, and they also may be | |
| 43 | + * invoked directly by applications in order to mimic RMI's dynamic | |
| 44 | + * class loading behavior. | |
| 45 | + * | |
| 46 | + * <p>The implementation of the following static methods | |
| 47 | + * | |
| 48 | + * <ul> | |
| 49 | + * | |
| 50 | + * <li>{@link #loadClass(URL,String)} | |
| 51 | + * <li>{@link #loadClass(String,String)} | |
| 52 | + * <li>{@link #loadClass(String,String,ClassLoader)} | |
| 53 | + * <li>{@link #loadProxyClass(String,String[],ClassLoader)} | |
| 54 | + * <li>{@link #getClassLoader(String)} | |
| 55 | + * <li>{@link #getClassAnnotation(Class)} | |
| 56 | + * | |
| 57 | + * </ul> | |
| 58 | + * | |
| 59 | + * is provided by an instance of {@link RMIClassLoaderSpi}, the | |
| 60 | + * service provider interface for those methods. When one of the | |
| 61 | + * methods is invoked, its behavior is to delegate to a corresponding | |
| 62 | + * method on the service provider instance. The details of how each | |
| 63 | + * method delegates to the provider instance is described in the | |
| 64 | + * documentation for each particular method. | |
| 65 | + * | |
| 66 | + * <p>The service provider instance is chosen as follows: | |
| 67 | + * | |
| 68 | + * <ul> | |
| 69 | + * | |
| 70 | + * <li>If the system property | |
| 71 | + * <code>java.rmi.server.RMIClassLoaderSpi</code> is defined, then if | |
| 72 | + * its value equals the string <code>"default"</code>, the provider | |
| 73 | + * instance will be the value returned by an invocation of the {@link | |
| 74 | + * #getDefaultProviderInstance()} method, and for any other value, if | |
| 75 | + * a class named with the value of the property can be loaded by the | |
| 76 | + * system class loader (see {@link ClassLoader#getSystemClassLoader}) | |
| 77 | + * and that class is assignable to {@link RMIClassLoaderSpi} and has a | |
| 78 | + * public no-argument constructor, then that constructor will be | |
| 79 | + * invoked to create the provider instance. If the property is | |
| 80 | + * defined but any other of those conditions are not true, then an | |
| 81 | + * unspecified <code>Error</code> will be thrown to code that attempts | |
| 82 | + * to use <code>RMIClassLoader</code>, indicating the failure to | |
| 83 | + * obtain a provider instance. | |
| 84 | + * | |
| 85 | + * <li>If a resource named | |
| 86 | + * <code>META-INF/services/java.rmi.server.RMIClassLoaderSpi</code> is | |
| 87 | + * visible to the system class loader, then the contents of that | |
| 88 | + * resource are interpreted as a provider-configuration file, and the | |
| 89 | + * first class name specified in that file is used as the provider | |
| 90 | + * class name. If a class with that name can be loaded by the system | |
| 91 | + * class loader and that class is assignable to {@link | |
| 92 | + * RMIClassLoaderSpi} and has a public no-argument constructor, then | |
| 93 | + * that constructor will be invoked to create the provider instance. | |
| 94 | + * If the resource is found but a provider cannot be instantiated as | |
| 95 | + * described, then an unspecified <code>Error</code> will be thrown to | |
| 96 | + * code that attempts to use <code>RMIClassLoader</code>, indicating | |
| 97 | + * the failure to obtain a provider instance. | |
| 98 | + * | |
| 99 | + * <li>Otherwise, the provider instance will be the value returned by | |
| 100 | + * an invocation of the {@link #getDefaultProviderInstance()} method. | |
| 101 | + * | |
| 102 | + * </ul> | |
| 103 | + * | |
| 104 | + * @author Ann Wollrath | |
| 105 | + * @author Peter Jones | |
| 106 | + * @author Laird Dornin | |
| 107 | + * @see RMIClassLoaderSpi | |
| 108 | + * @since JDK1.1 | |
| 109 | + */ | |
| 110 | +public class RMIClassLoader { | |
| 111 | + | |
| 112 | + /** "default" provider instance */ | |
| 113 | + private static final RMIClassLoaderSpi defaultProvider = | |
| 114 | + newDefaultProviderInstance(); | |
| 115 | + | |
| 116 | + /** provider instance */ | |
| 117 | + private static final RMIClassLoaderSpi provider = | |
| 118 | + AccessController.doPrivileged( | |
| 119 | + new PrivilegedAction<RMIClassLoaderSpi>() { | |
| 120 | + public RMIClassLoaderSpi run() { return initializeProvider(); } | |
| 121 | + }); | |
| 122 | + | |
| 123 | + /* | |
| 124 | + * Disallow anyone from creating one of these. | |
| 125 | + */ | |
| 126 | + private RMIClassLoader() {} | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Loads the class with the specified <code>name</code>. | |
| 130 | + * | |
| 131 | + * <p>This method delegates to {@link #loadClass(String,String)}, | |
| 132 | + * passing <code>null</code> as the first argument and | |
| 133 | + * <code>name</code> as the second argument. | |
| 134 | + * | |
| 135 | + * @param name the name of the class to load | |
| 136 | + * | |
| 137 | + * @return the <code>Class</code> object representing the loaded class | |
| 138 | + * | |
| 139 | + * @throws MalformedURLException if a provider-specific URL used | |
| 140 | + * to load classes is invalid | |
| 141 | + * | |
| 142 | + * @throws ClassNotFoundException if a definition for the class | |
| 143 | + * could not be found at the codebase location | |
| 144 | + * | |
| 145 | + * @deprecated replaced by <code>loadClass(String,String)</code> method | |
| 146 | + * @see #loadClass(String,String) | |
| 147 | + */ | |
| 148 | + @Deprecated | |
| 149 | + public static Class<?> loadClass(String name) | |
| 150 | + throws MalformedURLException, ClassNotFoundException | |
| 151 | + { | |
| 152 | + return loadClass((String) null, name); | |
| 153 | + } | |
| 154 | + | |
| 155 | + /** | |
| 156 | + * Loads a class from a codebase URL. | |
| 157 | + * | |
| 158 | + * If <code>codebase</code> is <code>null</code>, then this method | |
| 159 | + * will behave the same as {@link #loadClass(String,String)} with a | |
| 160 | + * <code>null</code> <code>codebase</code> and the given class name. | |
| 161 | + * | |
| 162 | + * <p>This method delegates to the | |
| 163 | + * {@link RMIClassLoaderSpi#loadClass(String,String,ClassLoader)} | |
| 164 | + * method of the provider instance, passing the result of invoking | |
| 165 | + * {@link URL#toString} on the given URL (or <code>null</code> if | |
| 166 | + * <code>codebase</code> is null) as the first argument, | |
| 167 | + * <code>name</code> as the second argument, | |
| 168 | + * and <code>null</code> as the third argument. | |
| 169 | + * | |
| 170 | + * @param codebase the URL to load the class from, or <code>null</code> | |
| 171 | + * | |
| 172 | + * @param name the name of the class to load | |
| 173 | + * | |
| 174 | + * @return the <code>Class</code> object representing the loaded class | |
| 175 | + * | |
| 176 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 177 | + * <code>null</code> and a provider-specific URL used | |
| 178 | + * to load classes is invalid | |
| 179 | + * | |
| 180 | + * @throws ClassNotFoundException if a definition for the class | |
| 181 | + * could not be found at the specified URL | |
| 182 | + */ | |
| 183 | + public static Class<?> loadClass(URL codebase, String name) | |
| 184 | + throws MalformedURLException, ClassNotFoundException | |
| 185 | + { | |
| 186 | + return provider.loadClass( | |
| 187 | + codebase != null ? codebase.toString() : null, name, null); | |
| 188 | + } | |
| 189 | + | |
| 190 | + /** | |
| 191 | + * Loads a class from a codebase URL path. | |
| 192 | + * | |
| 193 | + * <p>This method delegates to the | |
| 194 | + * {@link RMIClassLoaderSpi#loadClass(String,String,ClassLoader)} | |
| 195 | + * method of the provider instance, passing <code>codebase</code> | |
| 196 | + * as the first argument, <code>name</code> as the second argument, | |
| 197 | + * and <code>null</code> as the third argument. | |
| 198 | + * | |
| 199 | + * @param codebase the list of URLs (separated by spaces) to load | |
| 200 | + * the class from, or <code>null</code> | |
| 201 | + * | |
| 202 | + * @param name the name of the class to load | |
| 203 | + * | |
| 204 | + * @return the <code>Class</code> object representing the loaded class | |
| 205 | + * | |
| 206 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 207 | + * non-<code>null</code> and contains an invalid URL, or if | |
| 208 | + * <code>codebase</code> is <code>null</code> and a provider-specific | |
| 209 | + * URL used to load classes is invalid | |
| 210 | + * | |
| 211 | + * @throws ClassNotFoundException if a definition for the class | |
| 212 | + * could not be found at the specified location | |
| 213 | + * | |
| 214 | + * @since 1.2 | |
| 215 | + */ | |
| 216 | + public static Class<?> loadClass(String codebase, String name) | |
| 217 | + throws MalformedURLException, ClassNotFoundException | |
| 218 | + { | |
| 219 | + return provider.loadClass(codebase, name, null); | |
| 220 | + } | |
| 221 | + | |
| 222 | + /** | |
| 223 | + * Loads a class from a codebase URL path, optionally using the | |
| 224 | + * supplied loader. | |
| 225 | + * | |
| 226 | + * This method should be used when the caller would like to make | |
| 227 | + * available to the provider implementation an additional contextual | |
| 228 | + * class loader to consider, such as the loader of a caller on the | |
| 229 | + * stack. Typically, a provider implementation will attempt to | |
| 230 | + * resolve the named class using the given <code>defaultLoader</code>, | |
| 231 | + * if specified, before attempting to resolve the class from the | |
| 232 | + * codebase URL path. | |
| 233 | + * | |
| 234 | + * <p>This method delegates to the | |
| 235 | + * {@link RMIClassLoaderSpi#loadClass(String,String,ClassLoader)} | |
| 236 | + * method of the provider instance, passing <code>codebase</code> | |
| 237 | + * as the first argument, <code>name</code> as the second argument, | |
| 238 | + * and <code>defaultLoader</code> as the third argument. | |
| 239 | + * | |
| 240 | + * @param codebase the list of URLs (separated by spaces) to load | |
| 241 | + * the class from, or <code>null</code> | |
| 242 | + * | |
| 243 | + * @param name the name of the class to load | |
| 244 | + * | |
| 245 | + * @param defaultLoader additional contextual class loader | |
| 246 | + * to use, or <code>null</code> | |
| 247 | + * | |
| 248 | + * @return the <code>Class</code> object representing the loaded class | |
| 249 | + * | |
| 250 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 251 | + * non-<code>null</code> and contains an invalid URL, or if | |
| 252 | + * <code>codebase</code> is <code>null</code> and a provider-specific | |
| 253 | + * URL used to load classes is invalid | |
| 254 | + * | |
| 255 | + * @throws ClassNotFoundException if a definition for the class | |
| 256 | + * could not be found at the specified location | |
| 257 | + * | |
| 258 | + * @since 1.4 | |
| 259 | + */ | |
| 260 | + public static Class<?> loadClass(String codebase, String name, | |
| 261 | + ClassLoader defaultLoader) | |
| 262 | + throws MalformedURLException, ClassNotFoundException | |
| 263 | + { | |
| 264 | + return provider.loadClass(codebase, name, defaultLoader); | |
| 265 | + } | |
| 266 | + | |
| 267 | + /** | |
| 268 | + * Loads a dynamic proxy class (see {@link java.lang.reflect.Proxy}) | |
| 269 | + * that implements a set of interfaces with the given names | |
| 270 | + * from a codebase URL path. | |
| 271 | + * | |
| 272 | + * <p>The interfaces will be resolved similar to classes loaded via | |
| 273 | + * the {@link #loadClass(String,String)} method using the given | |
| 274 | + * <code>codebase</code>. | |
| 275 | + * | |
| 276 | + * <p>This method delegates to the | |
| 277 | + * {@link RMIClassLoaderSpi#loadProxyClass(String,String[],ClassLoader)} | |
| 278 | + * method of the provider instance, passing <code>codebase</code> | |
| 279 | + * as the first argument, <code>interfaces</code> as the second argument, | |
| 280 | + * and <code>defaultLoader</code> as the third argument. | |
| 281 | + * | |
| 282 | + * @param codebase the list of URLs (space-separated) to load | |
| 283 | + * classes from, or <code>null</code> | |
| 284 | + * | |
| 285 | + * @param interfaces the names of the interfaces for the proxy class | |
| 286 | + * to implement | |
| 287 | + * | |
| 288 | + * @param defaultLoader additional contextual class loader | |
| 289 | + * to use, or <code>null</code> | |
| 290 | + * | |
| 291 | + * @return a dynamic proxy class that implements the named interfaces | |
| 292 | + * | |
| 293 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 294 | + * non-<code>null</code> and contains an invalid URL, or | |
| 295 | + * if <code>codebase</code> is <code>null</code> and a provider-specific | |
| 296 | + * URL used to load classes is invalid | |
| 297 | + * | |
| 298 | + * @throws ClassNotFoundException if a definition for one of | |
| 299 | + * the named interfaces could not be found at the specified location, | |
| 300 | + * or if creation of the dynamic proxy class failed (such as if | |
| 301 | + * {@link java.lang.reflect.Proxy#getProxyClass(ClassLoader,Class[])} | |
| 302 | + * would throw an <code>IllegalArgumentException</code> for the given | |
| 303 | + * interface list) | |
| 304 | + * | |
| 305 | + * @since 1.4 | |
| 306 | + */ | |
| 307 | + public static Class<?> loadProxyClass(String codebase, String[] interfaces, | |
| 308 | + ClassLoader defaultLoader) | |
| 309 | + throws ClassNotFoundException, MalformedURLException | |
| 310 | + { | |
| 311 | + return provider.loadProxyClass(codebase, interfaces, defaultLoader); | |
| 312 | + } | |
| 313 | + | |
| 314 | + /** | |
| 315 | + * Returns a class loader that loads classes from the given codebase | |
| 316 | + * URL path. | |
| 317 | + * | |
| 318 | + * <p>The class loader returned is the class loader that the | |
| 319 | + * {@link #loadClass(String,String)} method would use to load classes | |
| 320 | + * for the same <code>codebase</code> argument. | |
| 321 | + * | |
| 322 | + * <p>This method delegates to the | |
| 323 | + * {@link RMIClassLoaderSpi#getClassLoader(String)} method | |
| 324 | + * of the provider instance, passing <code>codebase</code> as the argument. | |
| 325 | + * | |
| 326 | + * <p>If there is a security manger, its <code>checkPermission</code> | |
| 327 | + * method will be invoked with a | |
| 328 | + * <code>RuntimePermission("getClassLoader")</code> permission; | |
| 329 | + * this could result in a <code>SecurityException</code>. | |
| 330 | + * The provider implementation of this method may also perform further | |
| 331 | + * security checks to verify that the calling context has permission to | |
| 332 | + * connect to all of the URLs in the codebase URL path. | |
| 333 | + * | |
| 334 | + * @param codebase the list of URLs (space-separated) from which | |
| 335 | + * the returned class loader will load classes from, or <code>null</code> | |
| 336 | + * | |
| 337 | + * @return a class loader that loads classes from the given codebase URL | |
| 338 | + * path | |
| 339 | + * | |
| 340 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 341 | + * non-<code>null</code> and contains an invalid URL, or | |
| 342 | + * if <code>codebase</code> is <code>null</code> and a provider-specific | |
| 343 | + * URL used to identify the class loader is invalid | |
| 344 | + * | |
| 345 | + * @throws SecurityException if there is a security manager and the | |
| 346 | + * invocation of its <code>checkPermission</code> method fails, or | |
| 347 | + * if the caller does not have permission to connect to all of the | |
| 348 | + * URLs in the codebase URL path | |
| 349 | + * | |
| 350 | + * @since 1.3 | |
| 351 | + */ | |
| 352 | + public static ClassLoader getClassLoader(String codebase) | |
| 353 | + throws MalformedURLException, SecurityException | |
| 354 | + { | |
| 355 | + return provider.getClassLoader(codebase); | |
| 356 | + } | |
| 357 | + | |
| 358 | + /** | |
| 359 | + * Returns the annotation string (representing a location for | |
| 360 | + * the class definition) that RMI will use to annotate the class | |
| 361 | + * descriptor when marshalling objects of the given class. | |
| 362 | + * | |
| 363 | + * <p>This method delegates to the | |
| 364 | + * {@link RMIClassLoaderSpi#getClassAnnotation(Class)} method | |
| 365 | + * of the provider instance, passing <code>cl</code> as the argument. | |
| 366 | + * | |
| 367 | + * @param cl the class to obtain the annotation for | |
| 368 | + * | |
| 369 | + * @return a string to be used to annotate the given class when | |
| 370 | + * it gets marshalled, or <code>null</code> | |
| 371 | + * | |
| 372 | + * @throws NullPointerException if <code>cl</code> is <code>null</code> | |
| 373 | + * | |
| 374 | + * @since 1.2 | |
| 375 | + */ | |
| 376 | + /* | |
| 377 | + * REMIND: Should we say that the returned class annotation will or | |
| 378 | + * should be a (space-separated) list of URLs? | |
| 379 | + */ | |
| 380 | + public static String getClassAnnotation(Class<?> cl) { | |
| 381 | + return provider.getClassAnnotation(cl); | |
| 382 | + } | |
| 383 | + | |
| 384 | + /** | |
| 385 | + * Returns the canonical instance of the default provider | |
| 386 | + * for the service provider interface {@link RMIClassLoaderSpi}. | |
| 387 | + * If the system property <code>java.rmi.server.RMIClassLoaderSpi</code> | |
| 388 | + * is not defined, then the <code>RMIClassLoader</code> static | |
| 389 | + * methods | |
| 390 | + * | |
| 391 | + * <ul> | |
| 392 | + * | |
| 393 | + * <li>{@link #loadClass(URL,String)} | |
| 394 | + * <li>{@link #loadClass(String,String)} | |
| 395 | + * <li>{@link #loadClass(String,String,ClassLoader)} | |
| 396 | + * <li>{@link #loadProxyClass(String,String[],ClassLoader)} | |
| 397 | + * <li>{@link #getClassLoader(String)} | |
| 398 | + * <li>{@link #getClassAnnotation(Class)} | |
| 399 | + * | |
| 400 | + * </ul> | |
| 401 | + * | |
| 402 | + * will use the canonical instance of the default provider | |
| 403 | + * as the service provider instance. | |
| 404 | + * | |
| 405 | + * <p>If there is a security manager, its | |
| 406 | + * <code>checkPermission</code> method will be invoked with a | |
| 407 | + * <code>RuntimePermission("setFactory")</code> permission; this | |
| 408 | + * could result in a <code>SecurityException</code>. | |
| 409 | + * | |
| 410 | + * <p>The default service provider instance implements | |
| 411 | + * {@link RMIClassLoaderSpi} as follows: | |
| 412 | + * | |
| 413 | + * <blockquote> | |
| 414 | + * | |
| 415 | + * <p>The <b>{@link RMIClassLoaderSpi#getClassAnnotation(Class) | |
| 416 | + * getClassAnnotation}</b> method returns a <code>String</code> | |
| 417 | + * representing the codebase URL path that a remote party should | |
| 418 | + * use to download the definition for the specified class. The | |
| 419 | + * format of the returned string is a path of URLs separated by | |
| 420 | + * spaces. | |
| 421 | + * | |
| 422 | + * The codebase string returned depends on the defining class | |
| 423 | + * loader of the specified class: | |
| 424 | + * | |
| 425 | + * <ul> | |
| 426 | + * | |
| 427 | + * <p><li>If the class loader is the system class loader (see | |
| 428 | + * {@link ClassLoader#getSystemClassLoader}), a parent of the | |
| 429 | + * system class loader such as the loader used for installed | |
| 430 | + * extensions, or the bootstrap class loader (which may be | |
| 431 | + * represented by <code>null</code>), then the value of the | |
| 432 | + * <code>java.rmi.server.codebase</code> property (or possibly an | |
| 433 | + * earlier cached value) is returned, or | |
| 434 | + * <code>null</code> is returned if that property is not set. | |
| 435 | + * | |
| 436 | + * <p><li>Otherwise, if the class loader is an instance of | |
| 437 | + * <code>URLClassLoader</code>, then the returned string is a | |
| 438 | + * space-separated list of the external forms of the URLs returned | |
| 439 | + * by invoking the <code>getURLs</code> methods of the loader. If | |
| 440 | + * the <code>URLClassLoader</code> was created by this provider to | |
| 441 | + * service an invocation of its <code>loadClass</code> or | |
| 442 | + * <code>loadProxyClass</code> methods, then no permissions are | |
| 443 | + * required to get the associated codebase string. If it is an | |
| 444 | + * arbitrary other <code>URLClassLoader</code> instance, then if | |
| 445 | + * there is a security manager, its <code>checkPermission</code> | |
| 446 | + * method will be invoked once for each URL returned by the | |
| 447 | + * <code>getURLs</code> method, with the permission returned by | |
| 448 | + * invoking <code>openConnection().getPermission()</code> on each | |
| 449 | + * URL; if any of those invocations throws a | |
| 450 | + * <code>SecurityException</code> or an <code>IOException</code>, | |
| 451 | + * then the value of the <code>java.rmi.server.codebase</code> | |
| 452 | + * property (or possibly an earlier cached value) is returned, or | |
| 453 | + * <code>null</code> is returned if that property is not set. | |
| 454 | + * | |
| 455 | + * <p><li>Finally, if the class loader is not an instance of | |
| 456 | + * <code>URLClassLoader</code>, then the value of the | |
| 457 | + * <code>java.rmi.server.codebase</code> property (or possibly an | |
| 458 | + * earlier cached value) is returned, or | |
| 459 | + * <code>null</code> is returned if that property is not set. | |
| 460 | + * | |
| 461 | + * </ul> | |
| 462 | + * | |
| 463 | + * <p>For the implementations of the methods described below, | |
| 464 | + * which all take a <code>String</code> parameter named | |
| 465 | + * <code>codebase</code> that is a space-separated list of URLs, | |
| 466 | + * each invocation has an associated <i>codebase loader</i> that | |
| 467 | + * is identified using the <code>codebase</code> argument in | |
| 468 | + * conjunction with the current thread's context class loader (see | |
| 469 | + * {@link Thread#getContextClassLoader()}). When there is a | |
| 470 | + * security manager, this provider maintains an internal table of | |
| 471 | + * class loader instances (which are at least instances of {@link | |
| 472 | + * java.net.URLClassLoader}) keyed by the pair of their parent | |
| 473 | + * class loader and their codebase URL path (an ordered list of | |
| 474 | + * URLs). If the <code>codebase</code> argument is <code>null</code>, | |
| 475 | + * the codebase URL path is the value of the system property | |
| 476 | + * <code>java.rmi.server.codebase</code> or possibly an | |
| 477 | + * earlier cached value. For a given codebase URL path passed as the | |
| 478 | + * <code>codebase</code> argument to an invocation of one of the | |
| 479 | + * below methods in a given context, the codebase loader is the | |
| 480 | + * loader in the table with the specified codebase URL path and | |
| 481 | + * the current thread's context class loader as its parent. If no | |
| 482 | + * such loader exists, then one is created and added to the table. | |
| 483 | + * The table does not maintain strong references to its contained | |
| 484 | + * loaders, in order to allow them and their defined classes to be | |
| 485 | + * garbage collected when not otherwise reachable. In order to | |
| 486 | + * prevent arbitrary untrusted code from being implicitly loaded | |
| 487 | + * into a virtual machine with no security manager, if there is no | |
| 488 | + * security manager set, the codebase loader is just the current | |
| 489 | + * thread's context class loader (the supplied codebase URL path | |
| 490 | + * is ignored, so remote class loading is disabled). | |
| 491 | + * | |
| 492 | + * <p>The <b>{@link RMIClassLoaderSpi#getClassLoader(String) | |
| 493 | + * getClassLoader}</b> method returns the codebase loader for the | |
| 494 | + * specified codebase URL path. If there is a security manager, | |
| 495 | + * then if the calling context does not have permission to connect | |
| 496 | + * to all of the URLs in the codebase URL path, a | |
| 497 | + * <code>SecurityException</code> will be thrown. | |
| 498 | + * | |
| 499 | + * <p>The <b>{@link | |
| 500 | + * RMIClassLoaderSpi#loadClass(String,String,ClassLoader) | |
| 501 | + * loadClass}</b> method attempts to load the class with the | |
| 502 | + * specified name as follows: | |
| 503 | + * | |
| 504 | + * <blockquote> | |
| 505 | + * | |
| 506 | + * If the <code>defaultLoader</code> argument is | |
| 507 | + * non-<code>null</code>, it first attempts to load the class with the | |
| 508 | + * specified <code>name</code> using the | |
| 509 | + * <code>defaultLoader</code>, such as by evaluating | |
| 510 | + * | |
| 511 | + * <pre> | |
| 512 | + * Class.forName(name, false, defaultLoader) | |
| 513 | + * </pre> | |
| 514 | + * | |
| 515 | + * If the class is successfully loaded from the | |
| 516 | + * <code>defaultLoader</code>, that class is returned. If an | |
| 517 | + * exception other than <code>ClassNotFoundException</code> is | |
| 518 | + * thrown, that exception is thrown to the caller. | |
| 519 | + * | |
| 520 | + * <p>Next, the <code>loadClass</code> method attempts to load the | |
| 521 | + * class with the specified <code>name</code> using the codebase | |
| 522 | + * loader for the specified codebase URL path. | |
| 523 | + * If there is a security manager, then the calling context | |
| 524 | + * must have permission to connect to all of the URLs in the | |
| 525 | + * codebase URL path; otherwise, the current thread's context | |
| 526 | + * class loader will be used instead of the codebase loader. | |
| 527 | + * | |
| 528 | + * </blockquote> | |
| 529 | + * | |
| 530 | + * <p>The <b>{@link | |
| 531 | + * RMIClassLoaderSpi#loadProxyClass(String,String[],ClassLoader) | |
| 532 | + * loadProxyClass}</b> method attempts to return a dynamic proxy | |
| 533 | + * class with the named interface as follows: | |
| 534 | + * | |
| 535 | + * <blockquote> | |
| 536 | + * | |
| 537 | + * <p>If the <code>defaultLoader</code> argument is | |
| 538 | + * non-<code>null</code> and all of the named interfaces can be | |
| 539 | + * resolved through that loader, then, | |
| 540 | + * | |
| 541 | + * <ul> | |
| 542 | + * | |
| 543 | + * <li>if all of the resolved interfaces are <code>public</code>, | |
| 544 | + * then it first attempts to obtain a dynamic proxy class (using | |
| 545 | + * {@link | |
| 546 | + * java.lang.reflect.Proxy#getProxyClass(ClassLoader,Class[]) | |
| 547 | + * Proxy.getProxyClass}) for the resolved interfaces defined in | |
| 548 | + * the codebase loader; if that attempt throws an | |
| 549 | + * <code>IllegalArgumentException</code>, it then attempts to | |
| 550 | + * obtain a dynamic proxy class for the resolved interfaces | |
| 551 | + * defined in the <code>defaultLoader</code>. If both attempts | |
| 552 | + * throw <code>IllegalArgumentException</code>, then this method | |
| 553 | + * throws a <code>ClassNotFoundException</code>. If any other | |
| 554 | + * exception is thrown, that exception is thrown to the caller. | |
| 555 | + * | |
| 556 | + * <li>if all of the non-<code>public</code> resolved interfaces | |
| 557 | + * are defined in the same class loader, then it attempts to | |
| 558 | + * obtain a dynamic proxy class for the resolved interfaces | |
| 559 | + * defined in that loader. | |
| 560 | + * | |
| 561 | + * <li>otherwise, a <code>LinkageError</code> is thrown (because a | |
| 562 | + * class that implements all of the specified interfaces cannot be | |
| 563 | + * defined in any loader). | |
| 564 | + * | |
| 565 | + * </ul> | |
| 566 | + * | |
| 567 | + * <p>Otherwise, if all of the named interfaces can be resolved | |
| 568 | + * through the codebase loader, then, | |
| 569 | + * | |
| 570 | + * <ul> | |
| 571 | + * | |
| 572 | + * <li>if all of the resolved interfaces are <code>public</code>, | |
| 573 | + * then it attempts to obtain a dynamic proxy class for the | |
| 574 | + * resolved interfaces in the codebase loader. If the attempt | |
| 575 | + * throws an <code>IllegalArgumentException</code>, then this | |
| 576 | + * method throws a <code>ClassNotFoundException</code>. | |
| 577 | + * | |
| 578 | + * <li>if all of the non-<code>public</code> resolved interfaces | |
| 579 | + * are defined in the same class loader, then it attempts to | |
| 580 | + * obtain a dynamic proxy class for the resolved interfaces | |
| 581 | + * defined in that loader. | |
| 582 | + * | |
| 583 | + * <li>otherwise, a <code>LinkageError</code> is thrown (because a | |
| 584 | + * class that implements all of the specified interfaces cannot be | |
| 585 | + * defined in any loader). | |
| 586 | + * | |
| 587 | + * </ul> | |
| 588 | + * | |
| 589 | + * <p>Otherwise, a <code>ClassNotFoundException</code> is thrown | |
| 590 | + * for one of the named interfaces that could not be resolved. | |
| 591 | + * | |
| 592 | + * </blockquote> | |
| 593 | + * | |
| 594 | + * </blockquote> | |
| 595 | + * | |
| 596 | + * @return the canonical instance of the default service provider | |
| 597 | + * | |
| 598 | + * @throws SecurityException if there is a security manager and the | |
| 599 | + * invocation of its <code>checkPermission</code> method fails | |
| 600 | + * | |
| 601 | + * @since 1.4 | |
| 602 | + */ | |
| 603 | + public static RMIClassLoaderSpi getDefaultProviderInstance() { | |
| 604 | + SecurityManager sm = System.getSecurityManager(); | |
| 605 | + if (sm != null) { | |
| 606 | + sm.checkPermission(new RuntimePermission("setFactory")); | |
| 607 | + } | |
| 608 | + return defaultProvider; | |
| 609 | + } | |
| 610 | + | |
| 611 | + /** | |
| 612 | + * Returns the security context of the given class loader. | |
| 613 | + * | |
| 614 | + * @param loader a class loader from which to get the security context | |
| 615 | + * | |
| 616 | + * @return the security context | |
| 617 | + * | |
| 618 | + * @deprecated no replacement. As of the Java 2 platform v1.2, RMI no | |
| 619 | + * longer uses this method to obtain a class loader's security context. | |
| 620 | + * @see java.lang.SecurityManager#getSecurityContext() | |
| 621 | + */ | |
| 622 | + @Deprecated | |
| 623 | + public static Object getSecurityContext(ClassLoader loader) | |
| 624 | + { | |
| 625 | + return sun.rmi.server.LoaderHandler.getSecurityContext(loader); | |
| 626 | + } | |
| 627 | + | |
| 628 | + /** | |
| 629 | + * Creates an instance of the default provider class. | |
| 630 | + */ | |
| 631 | + private static RMIClassLoaderSpi newDefaultProviderInstance() { | |
| 632 | + return new RMIClassLoaderSpi() { | |
| 633 | + public Class<?> loadClass(String codebase, String name, | |
| 634 | + ClassLoader defaultLoader) | |
| 635 | + throws MalformedURLException, ClassNotFoundException | |
| 636 | + { | |
| 637 | + return sun.rmi.server.LoaderHandler.loadClass( | |
| 638 | + codebase, name, defaultLoader); | |
| 639 | + } | |
| 640 | + | |
| 641 | + public Class<?> loadProxyClass(String codebase, | |
| 642 | + String[] interfaces, | |
| 643 | + ClassLoader defaultLoader) | |
| 644 | + throws MalformedURLException, ClassNotFoundException | |
| 645 | + { | |
| 646 | + return sun.rmi.server.LoaderHandler.loadProxyClass( | |
| 647 | + codebase, interfaces, defaultLoader); | |
| 648 | + } | |
| 649 | + | |
| 650 | + public ClassLoader getClassLoader(String codebase) | |
| 651 | + throws MalformedURLException | |
| 652 | + { | |
| 653 | + return sun.rmi.server.LoaderHandler.getClassLoader(codebase); | |
| 654 | + } | |
| 655 | + | |
| 656 | + public String getClassAnnotation(Class<?> cl) { | |
| 657 | + return sun.rmi.server.LoaderHandler.getClassAnnotation(cl); | |
| 658 | + } | |
| 659 | + }; | |
| 660 | + } | |
| 661 | + | |
| 662 | + /** | |
| 663 | + * Chooses provider instance, following above documentation. | |
| 664 | + * | |
| 665 | + * This method assumes that it has been invoked in a privileged block. | |
| 666 | + */ | |
| 667 | + private static RMIClassLoaderSpi initializeProvider() { | |
| 668 | + /* | |
| 669 | + * First check for the system property being set: | |
| 670 | + */ | |
| 671 | + String providerClassName = | |
| 672 | + System.getProperty("java.rmi.server.RMIClassLoaderSpi"); | |
| 673 | + | |
| 674 | + if (providerClassName != null) { | |
| 675 | + if (providerClassName.equals("default")) { | |
| 676 | + return defaultProvider; | |
| 677 | + } | |
| 678 | + | |
| 679 | + try { | |
| 680 | + Class<? extends RMIClassLoaderSpi> providerClass = | |
| 681 | + Class.forName(providerClassName, false, | |
| 682 | + ClassLoader.getSystemClassLoader()) | |
| 683 | + .asSubclass(RMIClassLoaderSpi.class); | |
| 684 | + return providerClass.newInstance(); | |
| 685 | + | |
| 686 | + } catch (ClassNotFoundException e) { | |
| 687 | + throw new NoClassDefFoundError(e.getMessage()); | |
| 688 | + } catch (IllegalAccessException e) { | |
| 689 | + throw new IllegalAccessError(e.getMessage()); | |
| 690 | + } catch (InstantiationException e) { | |
| 691 | + throw new InstantiationError(e.getMessage()); | |
| 692 | + } catch (ClassCastException e) { | |
| 693 | + Error error = new LinkageError( | |
| 694 | + "provider class not assignable to RMIClassLoaderSpi"); | |
| 695 | + error.initCause(e); | |
| 696 | + throw error; | |
| 697 | + } | |
| 698 | + } | |
| 699 | + | |
| 700 | + /* | |
| 701 | + * Next look for a provider configuration file installed: | |
| 702 | + */ | |
| 703 | + Iterator<RMIClassLoaderSpi> iter = | |
| 704 | + ServiceLoader.load(RMIClassLoaderSpi.class, | |
| 705 | + ClassLoader.getSystemClassLoader()).iterator(); | |
| 706 | + if (iter.hasNext()) { | |
| 707 | + try { | |
| 708 | + return iter.next(); | |
| 709 | + } catch (ClassCastException e) { | |
| 710 | + Error error = new LinkageError( | |
| 711 | + "provider class not assignable to RMIClassLoaderSpi"); | |
| 712 | + error.initCause(e); | |
| 713 | + throw error; | |
| 714 | + } | |
| 715 | + } | |
| 716 | + | |
| 717 | + /* | |
| 718 | + * Finally, return the canonical instance of the default provider. | |
| 719 | + */ | |
| 720 | + return defaultProvider; | |
| 721 | + } | |
| 722 | +} | |
Binary file not shown.
| @@ -0,0 +1,192 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.net.MalformedURLException; | |
| 29 | +import java.net.URL; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * <code>RMIClassLoaderSpi</code> is the service provider interface for | |
| 33 | + * <code>RMIClassLoader</code>. | |
| 34 | + * | |
| 35 | + * In particular, an <code>RMIClassLoaderSpi</code> instance provides an | |
| 36 | + * implementation of the following static methods of | |
| 37 | + * <code>RMIClassLoader</code>: | |
| 38 | + * | |
| 39 | + * <ul> | |
| 40 | + * | |
| 41 | + * <li>{@link RMIClassLoader#loadClass(URL,String)} | |
| 42 | + * <li>{@link RMIClassLoader#loadClass(String,String)} | |
| 43 | + * <li>{@link RMIClassLoader#loadClass(String,String,ClassLoader)} | |
| 44 | + * <li>{@link RMIClassLoader#loadProxyClass(String,String[],ClassLoader)} | |
| 45 | + * <li>{@link RMIClassLoader#getClassLoader(String)} | |
| 46 | + * <li>{@link RMIClassLoader#getClassAnnotation(Class)} | |
| 47 | + * | |
| 48 | + * </ul> | |
| 49 | + * | |
| 50 | + * When one of those methods is invoked, its behavior is to delegate | |
| 51 | + * to a corresponding method on an instance of this class. | |
| 52 | + * The details of how each method delegates to the provider instance is | |
| 53 | + * described in the documentation for each particular method. | |
| 54 | + * See the documentation for {@link RMIClassLoader} for a description | |
| 55 | + * of how a provider instance is chosen. | |
| 56 | + * | |
| 57 | + * @author Peter Jones | |
| 58 | + * @author Laird Dornin | |
| 59 | + * @see RMIClassLoader | |
| 60 | + * @since 1.4 | |
| 61 | + */ | |
| 62 | +public abstract class RMIClassLoaderSpi { | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Provides the implementation for | |
| 66 | + * {@link RMIClassLoader#loadClass(URL,String)}, | |
| 67 | + * {@link RMIClassLoader#loadClass(String,String)}, and | |
| 68 | + * {@link RMIClassLoader#loadClass(String,String,ClassLoader)}. | |
| 69 | + * | |
| 70 | + * Loads a class from a codebase URL path, optionally using the | |
| 71 | + * supplied loader. | |
| 72 | + * | |
| 73 | + * Typically, a provider implementation will attempt to | |
| 74 | + * resolve the named class using the given <code>defaultLoader</code>, | |
| 75 | + * if specified, before attempting to resolve the class from the | |
| 76 | + * codebase URL path. | |
| 77 | + * | |
| 78 | + * <p>An implementation of this method must either return a class | |
| 79 | + * with the given name or throw an exception. | |
| 80 | + * | |
| 81 | + * @param codebase the list of URLs (separated by spaces) to load | |
| 82 | + * the class from, or <code>null</code> | |
| 83 | + * | |
| 84 | + * @param name the name of the class to load | |
| 85 | + * | |
| 86 | + * @param defaultLoader additional contextual class loader | |
| 87 | + * to use, or <code>null</code> | |
| 88 | + * | |
| 89 | + * @return the <code>Class</code> object representing the loaded class | |
| 90 | + * | |
| 91 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 92 | + * non-<code>null</code> and contains an invalid URL, or | |
| 93 | + * if <code>codebase</code> is <code>null</code> and a provider-specific | |
| 94 | + * URL used to load classes is invalid | |
| 95 | + * | |
| 96 | + * @throws ClassNotFoundException if a definition for the class | |
| 97 | + * could not be found at the specified location | |
| 98 | + */ | |
| 99 | + public abstract Class<?> loadClass(String codebase, String name, | |
| 100 | + ClassLoader defaultLoader) | |
| 101 | + throws MalformedURLException, ClassNotFoundException; | |
| 102 | + | |
| 103 | + /** | |
| 104 | + * Provides the implementation for | |
| 105 | + * {@link RMIClassLoader#loadProxyClass(String,String[],ClassLoader)}. | |
| 106 | + * | |
| 107 | + * Loads a dynamic proxy class (see {@link java.lang.reflect.Proxy} | |
| 108 | + * that implements a set of interfaces with the given names | |
| 109 | + * from a codebase URL path, optionally using the supplied loader. | |
| 110 | + * | |
| 111 | + * <p>An implementation of this method must either return a proxy | |
| 112 | + * class that implements the named interfaces or throw an exception. | |
| 113 | + * | |
| 114 | + * @param codebase the list of URLs (space-separated) to load | |
| 115 | + * classes from, or <code>null</code> | |
| 116 | + * | |
| 117 | + * @param interfaces the names of the interfaces for the proxy class | |
| 118 | + * to implement | |
| 119 | + * | |
| 120 | + * @return a dynamic proxy class that implements the named interfaces | |
| 121 | + * | |
| 122 | + * @param defaultLoader additional contextual class loader | |
| 123 | + * to use, or <code>null</code> | |
| 124 | + * | |
| 125 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 126 | + * non-<code>null</code> and contains an invalid URL, or | |
| 127 | + * if <code>codebase</code> is <code>null</code> and a provider-specific | |
| 128 | + * URL used to load classes is invalid | |
| 129 | + * | |
| 130 | + * @throws ClassNotFoundException if a definition for one of | |
| 131 | + * the named interfaces could not be found at the specified location, | |
| 132 | + * or if creation of the dynamic proxy class failed (such as if | |
| 133 | + * {@link java.lang.reflect.Proxy#getProxyClass(ClassLoader,Class[])} | |
| 134 | + * would throw an <code>IllegalArgumentException</code> for the given | |
| 135 | + * interface list) | |
| 136 | + */ | |
| 137 | + public abstract Class<?> loadProxyClass(String codebase, | |
| 138 | + String[] interfaces, | |
| 139 | + ClassLoader defaultLoader) | |
| 140 | + throws MalformedURLException, ClassNotFoundException; | |
| 141 | + | |
| 142 | + /** | |
| 143 | + * Provides the implementation for | |
| 144 | + * {@link RMIClassLoader#getClassLoader(String)}. | |
| 145 | + * | |
| 146 | + * Returns a class loader that loads classes from the given codebase | |
| 147 | + * URL path. | |
| 148 | + * | |
| 149 | + * <p>If there is a security manger, its <code>checkPermission</code> | |
| 150 | + * method will be invoked with a | |
| 151 | + * <code>RuntimePermission("getClassLoader")</code> permission; | |
| 152 | + * this could result in a <code>SecurityException</code>. | |
| 153 | + * The implementation of this method may also perform further security | |
| 154 | + * checks to verify that the calling context has permission to connect | |
| 155 | + * to all of the URLs in the codebase URL path. | |
| 156 | + * | |
| 157 | + * @param codebase the list of URLs (space-separated) from which | |
| 158 | + * the returned class loader will load classes from, or <code>null</code> | |
| 159 | + * | |
| 160 | + * @return a class loader that loads classes from the given codebase URL | |
| 161 | + * path | |
| 162 | + * | |
| 163 | + * @throws MalformedURLException if <code>codebase</code> is | |
| 164 | + * non-<code>null</code> and contains an invalid URL, or | |
| 165 | + * if <code>codebase</code> is <code>null</code> and a provider-specific | |
| 166 | + * URL used to identify the class loader is invalid | |
| 167 | + * | |
| 168 | + * @throws SecurityException if there is a security manager and the | |
| 169 | + * invocation of its <code>checkPermission</code> method fails, or | |
| 170 | + * if the caller does not have permission to connect to all of the | |
| 171 | + * URLs in the codebase URL path | |
| 172 | + */ | |
| 173 | + public abstract ClassLoader getClassLoader(String codebase) | |
| 174 | + throws MalformedURLException; // SecurityException | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Provides the implementation for | |
| 178 | + * {@link RMIClassLoader#getClassAnnotation(Class)}. | |
| 179 | + * | |
| 180 | + * Returns the annotation string (representing a location for | |
| 181 | + * the class definition) that RMI will use to annotate the class | |
| 182 | + * descriptor when marshalling objects of the given class. | |
| 183 | + * | |
| 184 | + * @param cl the class to obtain the annotation for | |
| 185 | + * | |
| 186 | + * @return a string to be used to annotate the given class when | |
| 187 | + * it gets marshalled, or <code>null</code> | |
| 188 | + * | |
| 189 | + * @throws NullPointerException if <code>cl</code> is <code>null</code> | |
| 190 | + */ | |
| 191 | + public abstract String getClassAnnotation(Class<?> cl); | |
| 192 | +} | |
Binary file not shown.
| @@ -0,0 +1,74 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.io.*; | |
| 29 | +import java.net.*; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An <code>RMIClientSocketFactory</code> instance is used by the RMI runtime | |
| 33 | + * in order to obtain client sockets for RMI calls. A remote object can be | |
| 34 | + * associated with an <code>RMIClientSocketFactory</code> when it is | |
| 35 | + * created/exported via the constructors or <code>exportObject</code> methods | |
| 36 | + * of <code>java.rmi.server.UnicastRemoteObject</code> and | |
| 37 | + * <code>java.rmi.activation.Activatable</code> . | |
| 38 | + * | |
| 39 | + * <p>An <code>RMIClientSocketFactory</code> instance associated with a remote | |
| 40 | + * object will be downloaded to clients when the remote object's reference is | |
| 41 | + * transmitted in an RMI call. This <code>RMIClientSocketFactory</code> will | |
| 42 | + * be used to create connections to the remote object for remote method calls. | |
| 43 | + * | |
| 44 | + * <p>An <code>RMIClientSocketFactory</code> instance can also be associated | |
| 45 | + * with a remote object registry so that clients can use custom socket | |
| 46 | + * communication with a remote object registry. | |
| 47 | + * | |
| 48 | + * <p>An implementation of this interface should be serializable and | |
| 49 | + * should implement {@link Object#equals} to return <code>true</code> when | |
| 50 | + * passed an instance that represents the same (functionally equivalent) | |
| 51 | + * client socket factory, and <code>false</code> otherwise (and it should also | |
| 52 | + * implement {@link Object#hashCode} consistently with its | |
| 53 | + * <code>Object.equals</code> implementation). | |
| 54 | + * | |
| 55 | + * @author Ann Wollrath | |
| 56 | + * @author Peter Jones | |
| 57 | + * @since 1.2 | |
| 58 | + * @see java.rmi.server.UnicastRemoteObject | |
| 59 | + * @see java.rmi.activation.Activatable | |
| 60 | + * @see java.rmi.registry.LocateRegistry | |
| 61 | + */ | |
| 62 | +public interface RMIClientSocketFactory { | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Create a client socket connected to the specified host and port. | |
| 66 | + * @param host the host name | |
| 67 | + * @param port the port number | |
| 68 | + * @return a socket connected to the specified host and port. | |
| 69 | + * @exception IOException if an I/O error occurs during socket creation | |
| 70 | + * @since 1.2 | |
| 71 | + */ | |
| 72 | + public Socket createSocket(String host, int port) | |
| 73 | + throws IOException; | |
| 74 | +} | |
Binary file not shown.
| @@ -0,0 +1,60 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * An <code>RMIFailureHandler</code> can be registered via the | |
| 30 | + * <code>RMISocketFactory.setFailureHandler</code> call. The | |
| 31 | + * <code>failure</code> method of the handler is invoked when the RMI | |
| 32 | + * runtime is unable to create a <code>ServerSocket</code> to listen | |
| 33 | + * for incoming calls. The <code>failure</code> method returns a boolean | |
| 34 | + * indicating whether the runtime should attempt to re-create the | |
| 35 | + * <code>ServerSocket</code>. | |
| 36 | + * | |
| 37 | + * @author Ann Wollrath | |
| 38 | + * @since JDK1.1 | |
| 39 | + */ | |
| 40 | +public interface RMIFailureHandler { | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * The <code>failure</code> callback is invoked when the RMI | |
| 44 | + * runtime is unable to create a <code>ServerSocket</code> via the | |
| 45 | + * <code>RMISocketFactory</code>. An <code>RMIFailureHandler</code> | |
| 46 | + * is registered via a call to | |
| 47 | + * <code>RMISocketFacotry.setFailureHandler</code>. If no failure | |
| 48 | + * handler is installed, the default behavior is to attempt to | |
| 49 | + * re-create the ServerSocket. | |
| 50 | + * | |
| 51 | + * @param ex the exception that occurred during <code>ServerSocket</code> | |
| 52 | + * creation | |
| 53 | + * @return if true, the RMI runtime attempts to retry | |
| 54 | + * <code>ServerSocket</code> creation | |
| 55 | + * @see java.rmi.server.RMISocketFactory#setFailureHandler(RMIFailureHandler) | |
| 56 | + * @since JDK1.1 | |
| 57 | + */ | |
| 58 | + public boolean failure(Exception ex); | |
| 59 | + | |
| 60 | +} | |
Binary file not shown.
| @@ -0,0 +1,74 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.io.*; | |
| 29 | +import java.net.*; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An <code>RMIServerSocketFactory</code> instance is used by the RMI runtime | |
| 33 | + * in order to obtain server sockets for RMI calls. A remote object can be | |
| 34 | + * associated with an <code>RMIServerSocketFactory</code> when it is | |
| 35 | + * created/exported via the constructors or <code>exportObject</code> methods | |
| 36 | + * of <code>java.rmi.server.UnicastRemoteObject</code> and | |
| 37 | + * <code>java.rmi.activation.Activatable</code> . | |
| 38 | + * | |
| 39 | + * <p>An <code>RMIServerSocketFactory</code> instance associated with a remote | |
| 40 | + * object is used to obtain the <code>ServerSocket</code> used to accept | |
| 41 | + * incoming calls from clients. | |
| 42 | + * | |
| 43 | + * <p>An <code>RMIServerSocketFactory</code> instance can also be associated | |
| 44 | + * with a remote object registry so that clients can use custom socket | |
| 45 | + * communication with a remote object registry. | |
| 46 | + * | |
| 47 | + * <p>An implementation of this interface | |
| 48 | + * should implement {@link Object#equals} to return <code>true</code> when | |
| 49 | + * passed an instance that represents the same (functionally equivalent) | |
| 50 | + * server socket factory, and <code>false</code> otherwise (and it should also | |
| 51 | + * implement {@link Object#hashCode} consistently with its | |
| 52 | + * <code>Object.equals</code> implementation). | |
| 53 | + * | |
| 54 | + * @author Ann Wollrath | |
| 55 | + * @author Peter Jones | |
| 56 | + * @since 1.2 | |
| 57 | + * @see java.rmi.server.UnicastRemoteObject | |
| 58 | + * @see java.rmi.activation.Activatable | |
| 59 | + * @see java.rmi.registry.LocateRegistry | |
| 60 | + */ | |
| 61 | +public interface RMIServerSocketFactory { | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Create a server socket on the specified port (port 0 indicates | |
| 65 | + * an anonymous port). | |
| 66 | + * @param port the port number | |
| 67 | + * @return the server socket on the specified port | |
| 68 | + * @exception IOException if an I/O error occurs during server socket | |
| 69 | + * creation | |
| 70 | + * @since 1.2 | |
| 71 | + */ | |
| 72 | + public ServerSocket createServerSocket(int port) | |
| 73 | + throws IOException; | |
| 74 | +} | |
Binary file not shown.
| @@ -0,0 +1,188 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.io.*; | |
| 29 | +import java.net.*; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An <code>RMISocketFactory</code> instance is used by the RMI runtime | |
| 33 | + * in order to obtain client and server sockets for RMI calls. An | |
| 34 | + * application may use the <code>setSocketFactory</code> method to | |
| 35 | + * request that the RMI runtime use its socket factory instance | |
| 36 | + * instead of the default implementation.<p> | |
| 37 | + * | |
| 38 | + * The default socket factory implementation used goes through a | |
| 39 | + * three-tiered approach to creating client sockets. First, a direct | |
| 40 | + * socket connection to the remote VM is attempted. If that fails | |
| 41 | + * (due to a firewall), the runtime uses HTTP with the explicit port | |
| 42 | + * number of the server. If the firewall does not allow this type of | |
| 43 | + * communication, then HTTP to a cgi-bin script on the server is used | |
| 44 | + * to POST the RMI call.<p> | |
| 45 | + * | |
| 46 | + * @author Ann Wollrath | |
| 47 | + * @author Peter Jones | |
| 48 | + * @since JDK1.1 | |
| 49 | + */ | |
| 50 | +public abstract class RMISocketFactory | |
| 51 | + implements RMIClientSocketFactory, RMIServerSocketFactory | |
| 52 | +{ | |
| 53 | + | |
| 54 | + /** Client/server socket factory to be used by RMI runtime */ | |
| 55 | + private static RMISocketFactory factory = null; | |
| 56 | + /** default socket factory used by this RMI implementation */ | |
| 57 | + private static RMISocketFactory defaultSocketFactory; | |
| 58 | + /** Handler for socket creation failure */ | |
| 59 | + private static RMIFailureHandler handler = null; | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Constructs an <code>RMISocketFactory</code>. | |
| 63 | + * @since JDK1.1 | |
| 64 | + */ | |
| 65 | + public RMISocketFactory() { | |
| 66 | + super(); | |
| 67 | + } | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * Creates a client socket connected to the specified host and port. | |
| 71 | + * @param host the host name | |
| 72 | + * @param port the port number | |
| 73 | + * @return a socket connected to the specified host and port. | |
| 74 | + * @exception IOException if an I/O error occurs during socket creation | |
| 75 | + * @since JDK1.1 | |
| 76 | + */ | |
| 77 | + public abstract Socket createSocket(String host, int port) | |
| 78 | + throws IOException; | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Create a server socket on the specified port (port 0 indicates | |
| 82 | + * an anonymous port). | |
| 83 | + * @param port the port number | |
| 84 | + * @return the server socket on the specified port | |
| 85 | + * @exception IOException if an I/O error occurs during server socket | |
| 86 | + * creation | |
| 87 | + * @since JDK1.1 | |
| 88 | + */ | |
| 89 | + public abstract ServerSocket createServerSocket(int port) | |
| 90 | + throws IOException; | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * Set the global socket factory from which RMI gets sockets (if the | |
| 94 | + * remote object is not associated with a specific client and/or server | |
| 95 | + * socket factory). The RMI socket factory can only be set once. Note: The | |
| 96 | + * RMISocketFactory may only be set if the current security manager allows | |
| 97 | + * setting a socket factory; if disallowed, a SecurityException will be | |
| 98 | + * thrown. | |
| 99 | + * @param fac the socket factory | |
| 100 | + * @exception IOException if the RMI socket factory is already set | |
| 101 | + * @exception SecurityException if a security manager exists and its | |
| 102 | + * <code>checkSetFactory</code> method doesn't allow the operation. | |
| 103 | + * @see #getSocketFactory | |
| 104 | + * @see java.lang.SecurityManager#checkSetFactory() | |
| 105 | + * @since JDK1.1 | |
| 106 | + */ | |
| 107 | + public synchronized static void setSocketFactory(RMISocketFactory fac) | |
| 108 | + throws IOException | |
| 109 | + { | |
| 110 | + if (factory != null) { | |
| 111 | + throw new SocketException("factory already defined"); | |
| 112 | + } | |
| 113 | + SecurityManager security = System.getSecurityManager(); | |
| 114 | + if (security != null) { | |
| 115 | + security.checkSetFactory(); | |
| 116 | + } | |
| 117 | + factory = fac; | |
| 118 | + } | |
| 119 | + | |
| 120 | + /** | |
| 121 | + * Returns the socket factory set by the <code>setSocketFactory</code> | |
| 122 | + * method. Returns <code>null</code> if no socket factory has been | |
| 123 | + * set. | |
| 124 | + * @return the socket factory | |
| 125 | + * @see #setSocketFactory(RMISocketFactory) | |
| 126 | + * @since JDK1.1 | |
| 127 | + */ | |
| 128 | + public synchronized static RMISocketFactory getSocketFactory() | |
| 129 | + { | |
| 130 | + return factory; | |
| 131 | + } | |
| 132 | + | |
| 133 | + /** | |
| 134 | + * Returns a reference to the default socket factory used | |
| 135 | + * by this RMI implementation. This will be the factory used | |
| 136 | + * by the RMI runtime when <code>getSocketFactory</code> | |
| 137 | + * returns <code>null</code>. | |
| 138 | + * @return the default RMI socket factory | |
| 139 | + * @since JDK1.1 | |
| 140 | + */ | |
| 141 | + public synchronized static RMISocketFactory getDefaultSocketFactory() { | |
| 142 | + if (defaultSocketFactory == null) { | |
| 143 | + defaultSocketFactory = | |
| 144 | + new sun.rmi.transport.proxy.RMIMasterSocketFactory(); | |
| 145 | + } | |
| 146 | + return defaultSocketFactory; | |
| 147 | + } | |
| 148 | + | |
| 149 | + /** | |
| 150 | + * Sets the failure handler to be called by the RMI runtime if server | |
| 151 | + * socket creation fails. By default, if no failure handler is installed | |
| 152 | + * and server socket creation fails, the RMI runtime does attempt to | |
| 153 | + * recreate the server socket. | |
| 154 | + * | |
| 155 | + * <p>If there is a security manager, this method first calls | |
| 156 | + * the security manager's <code>checkSetFactory</code> method | |
| 157 | + * to ensure the operation is allowed. | |
| 158 | + * This could result in a <code>SecurityException</code>. | |
| 159 | + * | |
| 160 | + * @param fh the failure handler | |
| 161 | + * @throws SecurityException if a security manager exists and its | |
| 162 | + * <code>checkSetFactory</code> method doesn't allow the | |
| 163 | + * operation. | |
| 164 | + * @see #getFailureHandler | |
| 165 | + * @see java.rmi.server.RMIFailureHandler#failure(Exception) | |
| 166 | + * @since JDK1.1 | |
| 167 | + */ | |
| 168 | + public synchronized static void setFailureHandler(RMIFailureHandler fh) | |
| 169 | + { | |
| 170 | + SecurityManager security = System.getSecurityManager(); | |
| 171 | + if (security != null) { | |
| 172 | + security.checkSetFactory(); | |
| 173 | + } | |
| 174 | + handler = fh; | |
| 175 | + } | |
| 176 | + | |
| 177 | + /** | |
| 178 | + * Returns the handler for socket creation failure set by the | |
| 179 | + * <code>setFailureHandler</code> method. | |
| 180 | + * @return the failure handler | |
| 181 | + * @see #setFailureHandler(RMIFailureHandler) | |
| 182 | + * @since JDK1.1 | |
| 183 | + */ | |
| 184 | + public synchronized static RMIFailureHandler getFailureHandler() | |
| 185 | + { | |
| 186 | + return handler; | |
| 187 | + } | |
| 188 | +} | |
Binary file not shown.
| @@ -0,0 +1,132 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | +import java.rmi.*; | |
| 28 | +import java.io.ObjectOutput; | |
| 29 | +import java.io.ObjectInput; | |
| 30 | +import java.io.StreamCorruptedException; | |
| 31 | +import java.io.IOException; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * <code>RemoteCall</code> is an abstraction used solely by the RMI runtime | |
| 35 | + * (in conjunction with stubs and skeletons of remote objects) to carry out a | |
| 36 | + * call to a remote object. The <code>RemoteCall</code> interface is | |
| 37 | + * deprecated because it is only used by deprecated methods of | |
| 38 | + * <code>java.rmi.server.RemoteRef</code>. | |
| 39 | + * | |
| 40 | + * @since JDK1.1 | |
| 41 | + * @author Ann Wollrath | |
| 42 | + * @author Roger Riggs | |
| 43 | + * @see java.rmi.server.RemoteRef | |
| 44 | + * @deprecated no replacement. | |
| 45 | + */ | |
| 46 | +@Deprecated | |
| 47 | +public interface RemoteCall { | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Return the output stream the stub/skeleton should put arguments/results | |
| 51 | + * into. | |
| 52 | + * | |
| 53 | + * @return output stream for arguments/results | |
| 54 | + * @exception java.io.IOException if an I/O error occurs. | |
| 55 | + * @since JDK1.1 | |
| 56 | + * @deprecated no replacement | |
| 57 | + */ | |
| 58 | + @Deprecated | |
| 59 | + ObjectOutput getOutputStream() throws IOException; | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Release the output stream; in some transports this would release | |
| 63 | + * the stream. | |
| 64 | + * | |
| 65 | + * @exception java.io.IOException if an I/O error occurs. | |
| 66 | + * @since JDK1.1 | |
| 67 | + * @deprecated no replacement | |
| 68 | + */ | |
| 69 | + @Deprecated | |
| 70 | + void releaseOutputStream() throws IOException; | |
| 71 | + | |
| 72 | + /** | |
| 73 | + * Get the InputStream that the stub/skeleton should get | |
| 74 | + * results/arguments from. | |
| 75 | + * | |
| 76 | + * @return input stream for reading arguments/results | |
| 77 | + * @exception java.io.IOException if an I/O error occurs. | |
| 78 | + * @since JDK1.1 | |
| 79 | + * @deprecated no replacement | |
| 80 | + */ | |
| 81 | + @Deprecated | |
| 82 | + ObjectInput getInputStream() throws IOException; | |
| 83 | + | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * Release the input stream. This would allow some transports to release | |
| 87 | + * the channel early. | |
| 88 | + * | |
| 89 | + * @exception java.io.IOException if an I/O error occurs. | |
| 90 | + * @since JDK1.1 | |
| 91 | + * @deprecated no replacement | |
| 92 | + */ | |
| 93 | + @Deprecated | |
| 94 | + void releaseInputStream() throws IOException; | |
| 95 | + | |
| 96 | + /** | |
| 97 | + * Returns an output stream (may put out header information | |
| 98 | + * relating to the success of the call). Should only succeed | |
| 99 | + * once per remote call. | |
| 100 | + * | |
| 101 | + * @param success If true, indicates normal return, else indicates | |
| 102 | + * exceptional return. | |
| 103 | + * @return output stream for writing call result | |
| 104 | + * @exception java.io.IOException if an I/O error occurs. | |
| 105 | + * @exception java.io.StreamCorruptedException If already been called. | |
| 106 | + * @since JDK1.1 | |
| 107 | + * @deprecated no replacement | |
| 108 | + */ | |
| 109 | + @Deprecated | |
| 110 | + ObjectOutput getResultStream(boolean success) throws IOException, | |
| 111 | + StreamCorruptedException; | |
| 112 | + | |
| 113 | + /** | |
| 114 | + * Do whatever it takes to execute the call. | |
| 115 | + * | |
| 116 | + * @exception java.lang.Exception if a general exception occurs. | |
| 117 | + * @since JDK1.1 | |
| 118 | + * @deprecated no replacement | |
| 119 | + */ | |
| 120 | + @Deprecated | |
| 121 | + void executeCall() throws Exception; | |
| 122 | + | |
| 123 | + /** | |
| 124 | + * Allow cleanup after the remote call has completed. | |
| 125 | + * | |
| 126 | + * @exception java.io.IOException if an I/O error occurs. | |
| 127 | + * @since JDK1.1 | |
| 128 | + * @deprecated no replacement | |
| 129 | + */ | |
| 130 | + @Deprecated | |
| 131 | + void done() throws IOException; | |
| 132 | +} | |
Binary file not shown.
| @@ -0,0 +1,458 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.rmi.Remote; | |
| 29 | +import java.rmi.NoSuchObjectException; | |
| 30 | +import java.lang.reflect.Proxy; | |
| 31 | +import sun.rmi.server.Util; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * The <code>RemoteObject</code> class implements the | |
| 35 | + * <code>java.lang.Object</code> behavior for remote objects. | |
| 36 | + * <code>RemoteObject</code> provides the remote semantics of Object by | |
| 37 | + * implementing methods for hashCode, equals, and toString. | |
| 38 | + * | |
| 39 | + * @author Ann Wollrath | |
| 40 | + * @author Laird Dornin | |
| 41 | + * @author Peter Jones | |
| 42 | + * @since JDK1.1 | |
| 43 | + */ | |
| 44 | +public abstract class RemoteObject implements Remote, java.io.Serializable { | |
| 45 | + | |
| 46 | + /** The object's remote reference. */ | |
| 47 | + transient protected RemoteRef ref; | |
| 48 | + | |
| 49 | + /** indicate compatibility with JDK 1.1.x version of class */ | |
| 50 | + private static final long serialVersionUID = -3215090123894869218L; | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Creates a remote object. | |
| 54 | + */ | |
| 55 | + protected RemoteObject() { | |
| 56 | + ref = null; | |
| 57 | + } | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Creates a remote object, initialized with the specified remote | |
| 61 | + * reference. | |
| 62 | + * @param newref remote reference | |
| 63 | + */ | |
| 64 | + protected RemoteObject(RemoteRef newref) { | |
| 65 | + ref = newref; | |
| 66 | + } | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Returns the remote reference for the remote object. | |
| 70 | + * | |
| 71 | + * <p>Note: The object returned from this method may be an instance of | |
| 72 | + * an implementation-specific class. The <code>RemoteObject</code> | |
| 73 | + * class ensures serialization portability of its instances' remote | |
| 74 | + * references through the behavior of its custom | |
| 75 | + * <code>writeObject</code> and <code>readObject</code> methods. An | |
| 76 | + * instance of <code>RemoteRef</code> should not be serialized outside | |
| 77 | + * of its <code>RemoteObject</code> wrapper instance or the result may | |
| 78 | + * be unportable. | |
| 79 | + * | |
| 80 | + * @return remote reference for the remote object | |
| 81 | + * @since 1.2 | |
| 82 | + */ | |
| 83 | + public RemoteRef getRef() { | |
| 84 | + return ref; | |
| 85 | + } | |
| 86 | + | |
| 87 | + /** | |
| 88 | + * Returns the stub for the remote object <code>obj</code> passed | |
| 89 | + * as a parameter. This operation is only valid <i>after</i> | |
| 90 | + * the object has been exported. | |
| 91 | + * @param obj the remote object whose stub is needed | |
| 92 | + * @return the stub for the remote object, <code>obj</code>. | |
| 93 | + * @exception NoSuchObjectException if the stub for the | |
| 94 | + * remote object could not be found. | |
| 95 | + * @since 1.2 | |
| 96 | + */ | |
| 97 | + public static Remote toStub(Remote obj) throws NoSuchObjectException { | |
| 98 | + if (obj instanceof RemoteStub || | |
| 99 | + (obj != null && | |
| 100 | + Proxy.isProxyClass(obj.getClass()) && | |
| 101 | + Proxy.getInvocationHandler(obj) instanceof | |
| 102 | + RemoteObjectInvocationHandler)) | |
| 103 | + { | |
| 104 | + return obj; | |
| 105 | + } else { | |
| 106 | + return sun.rmi.transport.ObjectTable.getStub(obj); | |
| 107 | + } | |
| 108 | + } | |
| 109 | + | |
| 110 | + /** | |
| 111 | + * Returns a hashcode for a remote object. Two remote object stubs | |
| 112 | + * that refer to the same remote object will have the same hash code | |
| 113 | + * (in order to support remote objects as keys in hash tables). | |
| 114 | + * | |
| 115 | + * @see java.util.Hashtable | |
| 116 | + */ | |
| 117 | + public int hashCode() { | |
| 118 | + return (ref == null) ? super.hashCode() : ref.remoteHashCode(); | |
| 119 | + } | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * Compares two remote objects for equality. | |
| 123 | + * Returns a boolean that indicates whether this remote object is | |
| 124 | + * equivalent to the specified Object. This method is used when a | |
| 125 | + * remote object is stored in a hashtable. | |
| 126 | + * If the specified Object is not itself an instance of RemoteObject, | |
| 127 | + * then this method delegates by returning the result of invoking the | |
| 128 | + * <code>equals</code> method of its parameter with this remote object | |
| 129 | + * as the argument. | |
| 130 | + * @param obj the Object to compare with | |
| 131 | + * @return true if these Objects are equal; false otherwise. | |
| 132 | + * @see java.util.Hashtable | |
| 133 | + */ | |
| 134 | + public boolean equals(Object obj) { | |
| 135 | + if (obj instanceof RemoteObject) { | |
| 136 | + if (ref == null) { | |
| 137 | + return obj == this; | |
| 138 | + } else { | |
| 139 | + return ref.remoteEquals(((RemoteObject)obj).ref); | |
| 140 | + } | |
| 141 | + } else if (obj != null) { | |
| 142 | + /* | |
| 143 | + * Fix for 4099660: if object is not an instance of RemoteObject, | |
| 144 | + * use the result of its equals method, to support symmetry is a | |
| 145 | + * remote object implementation class that does not extend | |
| 146 | + * RemoteObject wishes to support equality with its stub objects. | |
| 147 | + */ | |
| 148 | + return obj.equals(this); | |
| 149 | + } else { | |
| 150 | + return false; | |
| 151 | + } | |
| 152 | + } | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Returns a String that represents the value of this remote object. | |
| 156 | + */ | |
| 157 | + public String toString() { | |
| 158 | + String classname = Util.getUnqualifiedName(getClass()); | |
| 159 | + return (ref == null) ? classname : | |
| 160 | + classname + "[" + ref.remoteToString() + "]"; | |
| 161 | + } | |
| 162 | + | |
| 163 | + /** | |
| 164 | + * <code>writeObject</code> for custom serialization. | |
| 165 | + * | |
| 166 | + * <p>This method writes this object's serialized form for this class | |
| 167 | + * as follows: | |
| 168 | + * | |
| 169 | + * <p>The {@link RemoteRef#getRefClass(java.io.ObjectOutput) getRefClass} | |
| 170 | + * method is invoked on this object's <code>ref</code> field | |
| 171 | + * to obtain its external ref type name. | |
| 172 | + * If the value returned by <code>getRefClass</code> was | |
| 173 | + * a non-<code>null</code> string of length greater than zero, | |
| 174 | + * the <code>writeUTF</code> method is invoked on <code>out</code> | |
| 175 | + * with the value returned by <code>getRefClass</code>, and then | |
| 176 | + * the <code>writeExternal</code> method is invoked on | |
| 177 | + * this object's <code>ref</code> field passing <code>out</code> | |
| 178 | + * as the argument; otherwise, | |
| 179 | + * the <code>writeUTF</code> method is invoked on <code>out</code> | |
| 180 | + * with a zero-length string (<code>""</code>), and then | |
| 181 | + * the <code>writeObject</code> method is invoked on <code>out</code> | |
| 182 | + * passing this object's <code>ref</code> field as the argument. | |
| 183 | + * | |
| 184 | + * @serialData | |
| 185 | + * | |
| 186 | + * The serialized data for this class comprises a string (written with | |
| 187 | + * <code>ObjectOutput.writeUTF</code>) that is either the external | |
| 188 | + * ref type name of the contained <code>RemoteRef</code> instance | |
| 189 | + * (the <code>ref</code> field) or a zero-length string, followed by | |
| 190 | + * either the external form of the <code>ref</code> field as written by | |
| 191 | + * its <code>writeExternal</code> method if the string was of non-zero | |
| 192 | + * length, or the serialized form of the <code>ref</code> field as | |
| 193 | + * written by passing it to the serialization stream's | |
| 194 | + * <code>writeObject</code> if the string was of zero length. | |
| 195 | + * | |
| 196 | + * <p>If this object is an instance of | |
| 197 | + * {@link RemoteStub} or {@link RemoteObjectInvocationHandler} | |
| 198 | + * that was returned from any of | |
| 199 | + * the <code>UnicastRemoteObject.exportObject</code> methods | |
| 200 | + * and custom socket factories are not used, | |
| 201 | + * the external ref type name is <code>"UnicastRef"</code>. | |
| 202 | + * | |
| 203 | + * If this object is an instance of | |
| 204 | + * <code>RemoteStub</code> or <code>RemoteObjectInvocationHandler</code> | |
| 205 | + * that was returned from any of | |
| 206 | + * the <code>UnicastRemoteObject.exportObject</code> methods | |
| 207 | + * and custom socket factories are used, | |
| 208 | + * the external ref type name is <code>"UnicastRef2"</code>. | |
| 209 | + * | |
| 210 | + * If this object is an instance of | |
| 211 | + * <code>RemoteStub</code> or <code>RemoteObjectInvocationHandler</code> | |
| 212 | + * that was returned from any of | |
| 213 | + * the <code>java.rmi.activation.Activatable.exportObject</code> methods, | |
| 214 | + * the external ref type name is <code>"ActivatableRef"</code>. | |
| 215 | + * | |
| 216 | + * If this object is an instance of | |
| 217 | + * <code>RemoteStub</code> or <code>RemoteObjectInvocationHandler</code> | |
| 218 | + * that was returned from | |
| 219 | + * the <code>RemoteObject.toStub</code> method (and the argument passed | |
| 220 | + * to <code>toStub</code> was not itself a <code>RemoteStub</code>), | |
| 221 | + * the external ref type name is a function of how the remote object | |
| 222 | + * passed to <code>toStub</code> was exported, as described above. | |
| 223 | + * | |
| 224 | + * If this object is an instance of | |
| 225 | + * <code>RemoteStub</code> or <code>RemoteObjectInvocationHandler</code> | |
| 226 | + * that was originally created via deserialization, | |
| 227 | + * the external ref type name is the same as that which was read | |
| 228 | + * when this object was deserialized. | |
| 229 | + * | |
| 230 | + * <p>If this object is an instance of | |
| 231 | + * <code>java.rmi.server.UnicastRemoteObject</code> that does not | |
| 232 | + * use custom socket factories, | |
| 233 | + * the external ref type name is <code>"UnicastServerRef"</code>. | |
| 234 | + * | |
| 235 | + * If this object is an instance of | |
| 236 | + * <code>UnicastRemoteObject</code> that does | |
| 237 | + * use custom socket factories, | |
| 238 | + * the external ref type name is <code>"UnicastServerRef2"</code>. | |
| 239 | + * | |
| 240 | + * <p>Following is the data that must be written by the | |
| 241 | + * <code>writeExternal</code> method and read by the | |
| 242 | + * <code>readExternal</code> method of <code>RemoteRef</code> | |
| 243 | + * implementation classes that correspond to the each of the | |
| 244 | + * defined external ref type names: | |
| 245 | + * | |
| 246 | + * <p>For <code>"UnicastRef"</code>: | |
| 247 | + * | |
| 248 | + * <ul> | |
| 249 | + * | |
| 250 | + * <li>the hostname of the referenced remote object, | |
| 251 | + * written by {@link java.io.ObjectOutput#writeUTF(String)} | |
| 252 | + * | |
| 253 | + * <li>the port of the referenced remote object, | |
| 254 | + * written by {@link java.io.ObjectOutput#writeInt(int)} | |
| 255 | + * | |
| 256 | + * <li>the data written as a result of calling | |
| 257 | + * {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} | |
| 258 | + * on the <code>ObjID</code> instance contained in the reference | |
| 259 | + * | |
| 260 | + * <li>the boolean value <code>false</code>, | |
| 261 | + * written by {@link java.io.ObjectOutput#writeBoolean(boolean)} | |
| 262 | + * | |
| 263 | + * </ul> | |
| 264 | + * | |
| 265 | + * <p>For <code>"UnicastRef2"</code> with a | |
| 266 | + * <code>null</code> client socket factory: | |
| 267 | + * | |
| 268 | + * <ul> | |
| 269 | + * | |
| 270 | + * <li>the byte value <code>0x00</code> | |
| 271 | + * (indicating <code>null</code> client socket factory), | |
| 272 | + * written by {@link java.io.ObjectOutput#writeByte(int)} | |
| 273 | + * | |
| 274 | + * <li>the hostname of the referenced remote object, | |
| 275 | + * written by {@link java.io.ObjectOutput#writeUTF(String)} | |
| 276 | + * | |
| 277 | + * <li>the port of the referenced remote object, | |
| 278 | + * written by {@link java.io.ObjectOutput#writeInt(int)} | |
| 279 | + * | |
| 280 | + * <li>the data written as a result of calling | |
| 281 | + * {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} | |
| 282 | + * on the <code>ObjID</code> instance contained in the reference | |
| 283 | + * | |
| 284 | + * <li>the boolean value <code>false</code>, | |
| 285 | + * written by {@link java.io.ObjectOutput#writeBoolean(boolean)} | |
| 286 | + * | |
| 287 | + * </ul> | |
| 288 | + * | |
| 289 | + * <p>For <code>"UnicastRef2"</code> with a | |
| 290 | + * non-<code>null</code> client socket factory: | |
| 291 | + * | |
| 292 | + * <ul> | |
| 293 | + * | |
| 294 | + * <li>the byte value <code>0x01</code> | |
| 295 | + * (indicating non-<code>null</code> client socket factory), | |
| 296 | + * written by {@link java.io.ObjectOutput#writeByte(int)} | |
| 297 | + * | |
| 298 | + * <li>the hostname of the referenced remote object, | |
| 299 | + * written by {@link java.io.ObjectOutput#writeUTF(String)} | |
| 300 | + * | |
| 301 | + * <li>the port of the referenced remote object, | |
| 302 | + * written by {@link java.io.ObjectOutput#writeInt(int)} | |
| 303 | + * | |
| 304 | + * <li>a client socket factory (object of type | |
| 305 | + * <code>java.rmi.server.RMIClientSocketFactory</code>), | |
| 306 | + * written by passing it to an invocation of | |
| 307 | + * <code>writeObject</code> on the stream instance | |
| 308 | + * | |
| 309 | + * <li>the data written as a result of calling | |
| 310 | + * {link java.rmi.server.ObjID#write(java.io.ObjectOutput)} | |
| 311 | + * on the <code>ObjID</code> instance contained in the reference | |
| 312 | + * | |
| 313 | + * <li>the boolean value <code>false</code>, | |
| 314 | + * written by {@link java.io.ObjectOutput#writeBoolean(boolean)} | |
| 315 | + * | |
| 316 | + * </ul> | |
| 317 | + * | |
| 318 | + * <p>For <code>"ActivatableRef"</code> with a | |
| 319 | + * <code>null</code> nested remote reference: | |
| 320 | + * | |
| 321 | + * <ul> | |
| 322 | + * | |
| 323 | + * <li>an instance of | |
| 324 | + * <code>java.rmi.activation.ActivationID</code>, | |
| 325 | + * written by passing it to an invocation of | |
| 326 | + * <code>writeObject</code> on the stream instance | |
| 327 | + * | |
| 328 | + * <li>a zero-length string (<code>""</code>), | |
| 329 | + * written by {@link java.io.ObjectOutput#writeUTF(String)} | |
| 330 | + * | |
| 331 | + * </ul> | |
| 332 | + * | |
| 333 | + * <p>For <code>"ActivatableRef"</code> with a | |
| 334 | + * non-<code>null</code> nested remote reference: | |
| 335 | + * | |
| 336 | + * <ul> | |
| 337 | + * | |
| 338 | + * <li>an instance of | |
| 339 | + * <code>java.rmi.activation.ActivationID</code>, | |
| 340 | + * written by passing it to an invocation of | |
| 341 | + * <code>writeObject</code> on the stream instance | |
| 342 | + * | |
| 343 | + * <li>the external ref type name of the nested remote reference, | |
| 344 | + * which must be <code>"UnicastRef2"</code>, | |
| 345 | + * written by {@link java.io.ObjectOutput#writeUTF(String)} | |
| 346 | + * | |
| 347 | + * <li>the external form of the nested remote reference, | |
| 348 | + * written by invoking its <code>writeExternal</code> method | |
| 349 | + * with the stream instance | |
| 350 | + * (see the description of the external form for | |
| 351 | + * <code>"UnicastRef2"</code> above) | |
| 352 | + * | |
| 353 | + * </ul> | |
| 354 | + * | |
| 355 | + * <p>For <code>"UnicastServerRef"</code> and | |
| 356 | + * <code>"UnicastServerRef2"</code>, no data is written by the | |
| 357 | + * <code>writeExternal</code> method or read by the | |
| 358 | + * <code>readExternal</code> method. | |
| 359 | + */ | |
| 360 | + private void writeObject(java.io.ObjectOutputStream out) | |
| 361 | + throws java.io.IOException, java.lang.ClassNotFoundException | |
| 362 | + { | |
| 363 | + if (ref == null) { | |
| 364 | + throw new java.rmi.MarshalException("Invalid remote object"); | |
| 365 | + } else { | |
| 366 | + String refClassName = ref.getRefClass(out); | |
| 367 | + if (refClassName == null || refClassName.length() == 0) { | |
| 368 | + /* | |
| 369 | + * No reference class name specified, so serialize | |
| 370 | + * remote reference. | |
| 371 | + */ | |
| 372 | + out.writeUTF(""); | |
| 373 | + out.writeObject(ref); | |
| 374 | + } else { | |
| 375 | + /* | |
| 376 | + * Built-in reference class specified, so delegate | |
| 377 | + * to reference to write out its external form. | |
| 378 | + */ | |
| 379 | + out.writeUTF(refClassName); | |
| 380 | + ref.writeExternal(out); | |
| 381 | + } | |
| 382 | + } | |
| 383 | + } | |
| 384 | + | |
| 385 | + /** | |
| 386 | + * <code>readObject</code> for custom serialization. | |
| 387 | + * | |
| 388 | + * <p>This method reads this object's serialized form for this class | |
| 389 | + * as follows: | |
| 390 | + * | |
| 391 | + * <p>The <code>readUTF</code> method is invoked on <code>in</code> | |
| 392 | + * to read the external ref type name for the <code>RemoteRef</code> | |
| 393 | + * instance to be filled in to this object's <code>ref</code> field. | |
| 394 | + * If the string returned by <code>readUTF</code> has length zero, | |
| 395 | + * the <code>readObject</code> method is invoked on <code>in</code>, | |
| 396 | + * and than the value returned by <code>readObject</code> is cast to | |
| 397 | + * <code>RemoteRef</code> and this object's <code>ref</code> field is | |
| 398 | + * set to that value. | |
| 399 | + * Otherwise, this object's <code>ref</code> field is set to a | |
| 400 | + * <code>RemoteRef</code> instance that is created of an | |
| 401 | + * implementation-specific class corresponding to the external ref | |
| 402 | + * type name returned by <code>readUTF</code>, and then | |
| 403 | + * the <code>readExternal</code> method is invoked on | |
| 404 | + * this object's <code>ref</code> field. | |
| 405 | + * | |
| 406 | + * <p>If the external ref type name is | |
| 407 | + * <code>"UnicastRef"</code>, <code>"UnicastServerRef"</code>, | |
| 408 | + * <code>"UnicastRef2"</code>, <code>"UnicastServerRef2"</code>, | |
| 409 | + * or <code>"ActivatableRef"</code>, a corresponding | |
| 410 | + * implementation-specific class must be found, and its | |
| 411 | + * <code>readExternal</code> method must read the serial data | |
| 412 | + * for that external ref type name as specified to be written | |
| 413 | + * in the <b>serialData</b> documentation for this class. | |
| 414 | + * If the external ref type name is any other string (of non-zero | |
| 415 | + * length), a <code>ClassNotFoundException</code> will be thrown, | |
| 416 | + * unless the implementation provides an implementation-specific | |
| 417 | + * class corresponding to that external ref type name, in which | |
| 418 | + * case this object's <code>ref</code> field will be set to an | |
| 419 | + * instance of that implementation-specific class. | |
| 420 | + */ | |
| 421 | + private void readObject(java.io.ObjectInputStream in) | |
| 422 | + throws java.io.IOException, java.lang.ClassNotFoundException | |
| 423 | + { | |
| 424 | + String refClassName = in.readUTF(); | |
| 425 | + if (refClassName == null || refClassName.length() == 0) { | |
| 426 | + /* | |
| 427 | + * No reference class name specified, so construct | |
| 428 | + * remote reference from its serialized form. | |
| 429 | + */ | |
| 430 | + ref = (RemoteRef) in.readObject(); | |
| 431 | + } else { | |
| 432 | + /* | |
| 433 | + * Built-in reference class specified, so delegate to | |
| 434 | + * internal reference class to initialize its fields from | |
| 435 | + * its external form. | |
| 436 | + */ | |
| 437 | + String internalRefClassName = | |
| 438 | + RemoteRef.packagePrefix + "." + refClassName; | |
| 439 | + Class refClass = Class.forName(internalRefClassName); | |
| 440 | + try { | |
| 441 | + ref = (RemoteRef) refClass.newInstance(); | |
| 442 | + | |
| 443 | + /* | |
| 444 | + * If this step fails, assume we found an internal | |
| 445 | + * class that is not meant to be a serializable ref | |
| 446 | + * type. | |
| 447 | + */ | |
| 448 | + } catch (InstantiationException e) { | |
| 449 | + throw new ClassNotFoundException(internalRefClassName, e); | |
| 450 | + } catch (IllegalAccessException e) { | |
| 451 | + throw new ClassNotFoundException(internalRefClassName, e); | |
| 452 | + } catch (ClassCastException e) { | |
| 453 | + throw new ClassNotFoundException(internalRefClassName, e); | |
| 454 | + } | |
| 455 | + ref.readExternal(in); | |
| 456 | + } | |
| 457 | + } | |
| 458 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,283 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.io.InvalidObjectException; | |
| 28 | +import java.lang.reflect.InvocationHandler; | |
| 29 | +import java.lang.reflect.Method; | |
| 30 | +import java.lang.reflect.Proxy; | |
| 31 | +import java.rmi.Remote; | |
| 32 | +import java.rmi.UnexpectedException; | |
| 33 | +import java.rmi.activation.Activatable; | |
| 34 | +import java.util.Map; | |
| 35 | +import java.util.WeakHashMap; | |
| 36 | +import sun.rmi.server.Util; | |
| 37 | +import sun.rmi.server.WeakClassHashMap; | |
| 38 | + | |
| 39 | +/** | |
| 40 | + * An implementation of the <code>InvocationHandler</code> interface for | |
| 41 | + * use with Java Remote Method Invocation (Java RMI). This invocation | |
| 42 | + * handler can be used in conjunction with a dynamic proxy instance as a | |
| 43 | + * replacement for a pregenerated stub class. | |
| 44 | + * | |
| 45 | + * <p>Applications are not expected to use this class directly. A remote | |
| 46 | + * object exported to use a dynamic proxy with {@link UnicastRemoteObject} | |
| 47 | + * or {@link Activatable} has an instance of this class as that proxy's | |
| 48 | + * invocation handler. | |
| 49 | + * | |
| 50 | + * @author Ann Wollrath | |
| 51 | + * @since 1.5 | |
| 52 | + **/ | |
| 53 | +public class RemoteObjectInvocationHandler | |
| 54 | + extends RemoteObject | |
| 55 | + implements InvocationHandler | |
| 56 | +{ | |
| 57 | + private static final long serialVersionUID = 2L; | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * A weak hash map, mapping classes to weak hash maps that map | |
| 61 | + * method objects to method hashes. | |
| 62 | + **/ | |
| 63 | + private static final MethodToHash_Maps methodToHash_Maps = | |
| 64 | + new MethodToHash_Maps(); | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * Creates a new <code>RemoteObjectInvocationHandler</code> constructed | |
| 68 | + * with the specified <code>RemoteRef</code>. | |
| 69 | + * | |
| 70 | + * @param ref the remote ref | |
| 71 | + * | |
| 72 | + * @throws NullPointerException if <code>ref</code> is <code>null</code> | |
| 73 | + **/ | |
| 74 | + public RemoteObjectInvocationHandler(RemoteRef ref) { | |
| 75 | + super(ref); | |
| 76 | + if (ref == null) { | |
| 77 | + throw new NullPointerException(); | |
| 78 | + } | |
| 79 | + } | |
| 80 | + | |
| 81 | + /** | |
| 82 | + * Processes a method invocation made on the encapsulating | |
| 83 | + * proxy instance, <code>proxy</code>, and returns the result. | |
| 84 | + * | |
| 85 | + * <p><code>RemoteObjectInvocationHandler</code> implements this method | |
| 86 | + * as follows: | |
| 87 | + * | |
| 88 | + * <p>If <code>method</code> is one of the following methods, it | |
| 89 | + * is processed as described below: | |
| 90 | + * | |
| 91 | + * <ul> | |
| 92 | + * | |
| 93 | + * <li>{@link Object#hashCode Object.hashCode}: Returns the hash | |
| 94 | + * code value for the proxy. | |
| 95 | + * | |
| 96 | + * <li>{@link Object#equals Object.equals}: Returns <code>true</code> | |
| 97 | + * if the argument (<code>args[0]</code>) is an instance of a dynamic | |
| 98 | + * proxy class and this invocation handler is equal to the invocation | |
| 99 | + * handler of that argument, and returns <code>false</code> otherwise. | |
| 100 | + * | |
| 101 | + * <li>{@link Object#toString Object.toString}: Returns a string | |
| 102 | + * representation of the proxy. | |
| 103 | + * </ul> | |
| 104 | + * | |
| 105 | + * <p>Otherwise, a remote call is made as follows: | |
| 106 | + * | |
| 107 | + * <ul> | |
| 108 | + * <li>If <code>proxy</code> is not an instance of the interface | |
| 109 | + * {@link Remote}, then an {@link IllegalArgumentException} is thrown. | |
| 110 | + * | |
| 111 | + * <li>Otherwise, the {@link RemoteRef#invoke invoke} method is invoked | |
| 112 | + * on this invocation handler's <code>RemoteRef</code>, passing | |
| 113 | + * <code>proxy</code>, <code>method</code>, <code>args</code>, and the | |
| 114 | + * method hash (defined in section 8.3 of the "Java Remote Method | |
| 115 | + * Invocation (RMI) Specification") for <code>method</code>, and the | |
| 116 | + * result is returned. | |
| 117 | + * | |
| 118 | + * <li>If an exception is thrown by <code>RemoteRef.invoke</code> and | |
| 119 | + * that exception is a checked exception that is not assignable to any | |
| 120 | + * exception in the <code>throws</code> clause of the method | |
| 121 | + * implemented by the <code>proxy</code>'s class, then that exception | |
| 122 | + * is wrapped in an {@link UnexpectedException} and the wrapped | |
| 123 | + * exception is thrown. Otherwise, the exception thrown by | |
| 124 | + * <code>invoke</code> is thrown by this method. | |
| 125 | + * </ul> | |
| 126 | + * | |
| 127 | + * <p>The semantics of this method are unspecified if the | |
| 128 | + * arguments could not have been produced by an instance of some | |
| 129 | + * valid dynamic proxy class containing this invocation handler. | |
| 130 | + * | |
| 131 | + * @param proxy the proxy instance that the method was invoked on | |
| 132 | + * @param method the <code>Method</code> instance corresponding to the | |
| 133 | + * interface method invoked on the proxy instance | |
| 134 | + * @param args an array of objects containing the values of the | |
| 135 | + * arguments passed in the method invocation on the proxy instance, or | |
| 136 | + * <code>null</code> if the method takes no arguments | |
| 137 | + * @return the value to return from the method invocation on the proxy | |
| 138 | + * instance | |
| 139 | + * @throws Throwable the exception to throw from the method invocation | |
| 140 | + * on the proxy instance | |
| 141 | + **/ | |
| 142 | + public Object invoke(Object proxy, Method method, Object[] args) | |
| 143 | + throws Throwable | |
| 144 | + { | |
| 145 | + if (method.getDeclaringClass() == Object.class) { | |
| 146 | + return invokeObjectMethod(proxy, method, args); | |
| 147 | + } else { | |
| 148 | + return invokeRemoteMethod(proxy, method, args); | |
| 149 | + } | |
| 150 | + } | |
| 151 | + | |
| 152 | + /** | |
| 153 | + * Handles java.lang.Object methods. | |
| 154 | + **/ | |
| 155 | + private Object invokeObjectMethod(Object proxy, | |
| 156 | + Method method, | |
| 157 | + Object[] args) | |
| 158 | + { | |
| 159 | + String name = method.getName(); | |
| 160 | + | |
| 161 | + if (name.equals("hashCode")) { | |
| 162 | + return hashCode(); | |
| 163 | + | |
| 164 | + } else if (name.equals("equals")) { | |
| 165 | + Object obj = args[0]; | |
| 166 | + return | |
| 167 | + proxy == obj || | |
| 168 | + (obj != null && | |
| 169 | + Proxy.isProxyClass(obj.getClass()) && | |
| 170 | + equals(Proxy.getInvocationHandler(obj))); | |
| 171 | + | |
| 172 | + } else if (name.equals("toString")) { | |
| 173 | + return proxyToString(proxy); | |
| 174 | + | |
| 175 | + } else { | |
| 176 | + throw new IllegalArgumentException( | |
| 177 | + "unexpected Object method: " + method); | |
| 178 | + } | |
| 179 | + } | |
| 180 | + | |
| 181 | + /** | |
| 182 | + * Handles remote methods. | |
| 183 | + **/ | |
| 184 | + private Object invokeRemoteMethod(Object proxy, | |
| 185 | + Method method, | |
| 186 | + Object[] args) | |
| 187 | + throws Exception | |
| 188 | + { | |
| 189 | + try { | |
| 190 | + if (!(proxy instanceof Remote)) { | |
| 191 | + throw new IllegalArgumentException( | |
| 192 | + "proxy not Remote instance"); | |
| 193 | + } | |
| 194 | + return ref.invoke((Remote) proxy, method, args, | |
| 195 | + getMethodHash(method)); | |
| 196 | + } catch (Exception e) { | |
| 197 | + if (!(e instanceof RuntimeException)) { | |
| 198 | + Class<?> cl = proxy.getClass(); | |
| 199 | + try { | |
| 200 | + method = cl.getMethod(method.getName(), | |
| 201 | + method.getParameterTypes()); | |
| 202 | + } catch (NoSuchMethodException nsme) { | |
| 203 | + throw (IllegalArgumentException) | |
| 204 | + new IllegalArgumentException().initCause(nsme); | |
| 205 | + } | |
| 206 | + Class<?> thrownType = e.getClass(); | |
| 207 | + for (Class<?> declaredType : method.getExceptionTypes()) { | |
| 208 | + if (declaredType.isAssignableFrom(thrownType)) { | |
| 209 | + throw e; | |
| 210 | + } | |
| 211 | + } | |
| 212 | + e = new UnexpectedException("unexpected exception", e); | |
| 213 | + } | |
| 214 | + throw e; | |
| 215 | + } | |
| 216 | + } | |
| 217 | + | |
| 218 | + /** | |
| 219 | + * Returns a string representation for a proxy that uses this invocation | |
| 220 | + * handler. | |
| 221 | + **/ | |
| 222 | + private String proxyToString(Object proxy) { | |
| 223 | + Class<?>[] interfaces = proxy.getClass().getInterfaces(); | |
| 224 | + if (interfaces.length == 0) { | |
| 225 | + return "Proxy[" + this + "]"; | |
| 226 | + } | |
| 227 | + String iface = interfaces[0].getName(); | |
| 228 | + if (iface.equals("java.rmi.Remote") && interfaces.length > 1) { | |
| 229 | + iface = interfaces[1].getName(); | |
| 230 | + } | |
| 231 | + int dot = iface.lastIndexOf('.'); | |
| 232 | + if (dot >= 0) { | |
| 233 | + iface = iface.substring(dot + 1); | |
| 234 | + } | |
| 235 | + return "Proxy[" + iface + "," + this + "]"; | |
| 236 | + } | |
| 237 | + | |
| 238 | + /** | |
| 239 | + * @throws InvalidObjectException unconditionally | |
| 240 | + **/ | |
| 241 | + private void readObjectNoData() throws InvalidObjectException { | |
| 242 | + throw new InvalidObjectException("no data in stream; class: " + | |
| 243 | + this.getClass().getName()); | |
| 244 | + } | |
| 245 | + | |
| 246 | + /** | |
| 247 | + * Returns the method hash for the specified method. Subsequent calls | |
| 248 | + * to "getMethodHash" passing the same method argument should be faster | |
| 249 | + * since this method caches internally the result of the method to | |
| 250 | + * method hash mapping. The method hash is calculated using the | |
| 251 | + * "computeMethodHash" method. | |
| 252 | + * | |
| 253 | + * @param method the remote method | |
| 254 | + * @return the method hash for the specified method | |
| 255 | + */ | |
| 256 | + private static long getMethodHash(Method method) { | |
| 257 | + return methodToHash_Maps.get(method.getDeclaringClass()).get(method); | |
| 258 | + } | |
| 259 | + | |
| 260 | + /** | |
| 261 | + * A weak hash map, mapping classes to weak hash maps that map | |
| 262 | + * method objects to method hashes. | |
| 263 | + **/ | |
| 264 | + private static class MethodToHash_Maps | |
| 265 | + extends WeakClassHashMap<Map<Method,Long>> | |
| 266 | + { | |
| 267 | + MethodToHash_Maps() {} | |
| 268 | + | |
| 269 | + protected Map<Method,Long> computeValue(Class<?> remoteClass) { | |
| 270 | + return new WeakHashMap<Method,Long>() { | |
| 271 | + public synchronized Long get(Object key) { | |
| 272 | + Long hash = super.get(key); | |
| 273 | + if (hash == null) { | |
| 274 | + Method method = (Method) key; | |
| 275 | + hash = Util.computeMethodHash(method); | |
| 276 | + put(method, hash); | |
| 277 | + } | |
| 278 | + return hash; | |
| 279 | + } | |
| 280 | + }; | |
| 281 | + } | |
| 282 | + } | |
| 283 | +} | |
Binary file not shown.
| @@ -0,0 +1,195 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.rmi.*; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * <code>RemoteRef</code> represents the handle for a remote object. A | |
| 32 | + * <code>RemoteStub</code> uses a remote reference to carry out a | |
| 33 | + * remote method invocation to a remote object. | |
| 34 | + * | |
| 35 | + * @author Ann Wollrath | |
| 36 | + * @since JDK1.1 | |
| 37 | + * @see java.rmi.server.RemoteStub | |
| 38 | + */ | |
| 39 | +public interface RemoteRef extends java.io.Externalizable { | |
| 40 | + | |
| 41 | + /** indicate compatibility with JDK 1.1.x version of class. */ | |
| 42 | + static final long serialVersionUID = 3632638527362204081L; | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * Initialize the server package prefix: assumes that the | |
| 46 | + * implementation of server ref classes (e.g., UnicastRef, | |
| 47 | + * UnicastServerRef) are located in the package defined by the | |
| 48 | + * prefix. | |
| 49 | + */ | |
| 50 | + final static String packagePrefix = "sun.rmi.server"; | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Invoke a method. This form of delegating method invocation | |
| 54 | + * to the reference allows the reference to take care of | |
| 55 | + * setting up the connection to the remote host, marshaling | |
| 56 | + * some representation for the method and parameters, then | |
| 57 | + * communicating the method invocation to the remote host. | |
| 58 | + * This method either returns the result of a method invocation | |
| 59 | + * on the remote object which resides on the remote host or | |
| 60 | + * throws a RemoteException if the call failed or an | |
| 61 | + * application-level exception if the remote invocation throws | |
| 62 | + * an exception. | |
| 63 | + * | |
| 64 | + * @param obj the object that contains the RemoteRef (e.g., the | |
| 65 | + * RemoteStub for the object. | |
| 66 | + * @param method the method to be invoked | |
| 67 | + * @param params the parameter list | |
| 68 | + * @param opnum a hash that may be used to represent the method | |
| 69 | + * @return result of remote method invocation | |
| 70 | + * @exception Exception if any exception occurs during remote method | |
| 71 | + * invocation | |
| 72 | + * @since 1.2 | |
| 73 | + */ | |
| 74 | + Object invoke(Remote obj, | |
| 75 | + java.lang.reflect.Method method, | |
| 76 | + Object[] params, | |
| 77 | + long opnum) | |
| 78 | + throws Exception; | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Creates an appropriate call object for a new remote method | |
| 82 | + * invocation on this object. Passing operation array and index, | |
| 83 | + * allows the stubs generator to assign the operation indexes and | |
| 84 | + * interpret them. The remote reference may need the operation to | |
| 85 | + * encode in the call. | |
| 86 | + * | |
| 87 | + * @since JDK1.1 | |
| 88 | + * @deprecated 1.2 style stubs no longer use this method. Instead of | |
| 89 | + * using a sequence of method calls on the stub's the remote reference | |
| 90 | + * (<code>newCall</code>, <code>invoke</code>, and <code>done</code>), a | |
| 91 | + * stub uses a single method, <code>invoke(Remote, Method, Object[], | |
| 92 | + * int)</code>, on the remote reference to carry out parameter | |
| 93 | + * marshalling, remote method executing and unmarshalling of the return | |
| 94 | + * value. | |
| 95 | + * | |
| 96 | + * @param obj remote stub through which to make call | |
| 97 | + * @param op array of stub operations | |
| 98 | + * @param opnum operation number | |
| 99 | + * @param hash stub/skeleton interface hash | |
| 100 | + * @return call object representing remote call | |
| 101 | + * @throws RemoteException if failed to initiate new remote call | |
| 102 | + * @see #invoke(Remote,java.lang.reflect.Method,Object[],long) | |
| 103 | + */ | |
| 104 | + @Deprecated | |
| 105 | + RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) | |
| 106 | + throws RemoteException; | |
| 107 | + | |
| 108 | + /** | |
| 109 | + * Executes the remote call. | |
| 110 | + * | |
| 111 | + * Invoke will raise any "user" exceptions which | |
| 112 | + * should pass through and not be caught by the stub. If any | |
| 113 | + * exception is raised during the remote invocation, invoke should | |
| 114 | + * take care of cleaning up the connection before raising the | |
| 115 | + * "user" or remote exception. | |
| 116 | + * | |
| 117 | + * @since JDK1.1 | |
| 118 | + * @deprecated 1.2 style stubs no longer use this method. Instead of | |
| 119 | + * using a sequence of method calls to the remote reference | |
| 120 | + * (<code>newCall</code>, <code>invoke</code>, and <code>done</code>), a | |
| 121 | + * stub uses a single method, <code>invoke(Remote, Method, Object[], | |
| 122 | + * int)</code>, on the remote reference to carry out parameter | |
| 123 | + * marshalling, remote method executing and unmarshalling of the return | |
| 124 | + * value. | |
| 125 | + * | |
| 126 | + * @param call object representing remote call | |
| 127 | + * @throws Exception if any exception occurs during remote method | |
| 128 | + * @see #invoke(Remote,java.lang.reflect.Method,Object[],long) | |
| 129 | + */ | |
| 130 | + @Deprecated | |
| 131 | + void invoke(RemoteCall call) throws Exception; | |
| 132 | + | |
| 133 | + /** | |
| 134 | + * Allows the remote reference to clean up (or reuse) the connection. | |
| 135 | + * Done should only be called if the invoke returns successfully | |
| 136 | + * (non-exceptionally) to the stub. | |
| 137 | + * | |
| 138 | + * @since JDK1.1 | |
| 139 | + * @deprecated 1.2 style stubs no longer use this method. Instead of | |
| 140 | + * using a sequence of method calls to the remote reference | |
| 141 | + * (<code>newCall</code>, <code>invoke</code>, and <code>done</code>), a | |
| 142 | + * stub uses a single method, <code>invoke(Remote, Method, Object[], | |
| 143 | + * int)</code>, on the remote reference to carry out parameter | |
| 144 | + * marshalling, remote method executing and unmarshalling of the return | |
| 145 | + * value. | |
| 146 | + * | |
| 147 | + * @param call object representing remote call | |
| 148 | + * @throws RemoteException if remote error occurs during call cleanup | |
| 149 | + * @see #invoke(Remote,java.lang.reflect.Method,Object[],long) | |
| 150 | + */ | |
| 151 | + @Deprecated | |
| 152 | + void done(RemoteCall call) throws RemoteException; | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Returns the class name of the ref type to be serialized onto | |
| 156 | + * the stream 'out'. | |
| 157 | + * @param out the output stream to which the reference will be serialized | |
| 158 | + * @return the class name (without package qualification) of the reference | |
| 159 | + * type | |
| 160 | + * @since JDK1.1 | |
| 161 | + */ | |
| 162 | + String getRefClass(java.io.ObjectOutput out); | |
| 163 | + | |
| 164 | + /** | |
| 165 | + * Returns a hashcode for a remote object. Two remote object stubs | |
| 166 | + * that refer to the same remote object will have the same hash code | |
| 167 | + * (in order to support remote objects as keys in hash tables). | |
| 168 | + * | |
| 169 | + * @return remote object hashcode | |
| 170 | + * @see java.util.Hashtable | |
| 171 | + * @since JDK1.1 | |
| 172 | + */ | |
| 173 | + int remoteHashCode(); | |
| 174 | + | |
| 175 | + /** | |
| 176 | + * Compares two remote objects for equality. | |
| 177 | + * Returns a boolean that indicates whether this remote object is | |
| 178 | + * equivalent to the specified Object. This method is used when a | |
| 179 | + * remote object is stored in a hashtable. | |
| 180 | + * @param obj the Object to compare with | |
| 181 | + * @return true if these Objects are equal; false otherwise. | |
| 182 | + * @see java.util.Hashtable | |
| 183 | + * @since JDK1.1 | |
| 184 | + */ | |
| 185 | + boolean remoteEquals(RemoteRef obj); | |
| 186 | + | |
| 187 | + /** | |
| 188 | + * Returns a String that represents the reference of this remote | |
| 189 | + * object. | |
| 190 | + * @return string representing remote object reference | |
| 191 | + * @since JDK1.1 | |
| 192 | + */ | |
| 193 | + String remoteToString(); | |
| 194 | + | |
| 195 | +} | |
Binary file not shown.
| @@ -0,0 +1,115 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.rmi.*; | |
| 28 | +import sun.rmi.server.UnicastServerRef; | |
| 29 | +import sun.rmi.runtime.Log; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * The <code>RemoteServer</code> class is the common superclass to server | |
| 33 | + * implementations and provides the framework to support a wide range | |
| 34 | + * of remote reference semantics. Specifically, the functions needed | |
| 35 | + * to create and export remote objects (i.e. to make them remotely | |
| 36 | + * available) are provided abstractly by <code>RemoteServer</code> and | |
| 37 | + * concretely by its subclass(es). | |
| 38 | + * | |
| 39 | + * @author Ann Wollrath | |
| 40 | + * @since JDK1.1 | |
| 41 | + */ | |
| 42 | +public abstract class RemoteServer extends RemoteObject | |
| 43 | +{ | |
| 44 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 45 | + private static final long serialVersionUID = -4100238210092549637L; | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Constructs a <code>RemoteServer</code>. | |
| 49 | + * @since JDK1.1 | |
| 50 | + */ | |
| 51 | + protected RemoteServer() { | |
| 52 | + super(); | |
| 53 | + } | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * Constructs a <code>RemoteServer</code> with the given reference type. | |
| 57 | + * | |
| 58 | + * @param ref the remote reference | |
| 59 | + * @since JDK1.1 | |
| 60 | + */ | |
| 61 | + protected RemoteServer(RemoteRef ref) { | |
| 62 | + super(ref); | |
| 63 | + } | |
| 64 | + | |
| 65 | + /** | |
| 66 | + * Returns a string representation of the client host for the | |
| 67 | + * remote method invocation being processed in the current thread. | |
| 68 | + * | |
| 69 | + * @return a string representation of the client host | |
| 70 | + * | |
| 71 | + * @throws ServerNotActiveException if no remote method invocation | |
| 72 | + * is being processed in the current thread | |
| 73 | + * | |
| 74 | + * @since JDK1.1 | |
| 75 | + */ | |
| 76 | + public static String getClientHost() throws ServerNotActiveException { | |
| 77 | + return sun.rmi.transport.tcp.TCPTransport.getClientHost(); | |
| 78 | + } | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Log RMI calls to the output stream <code>out</code>. If | |
| 82 | + * <code>out</code> is <code>null</code>, call logging is turned off. | |
| 83 | + * | |
| 84 | + * <p>If there is a security manager, its | |
| 85 | + * <code>checkPermission</code> method will be invoked with a | |
| 86 | + * <code>java.util.logging.LoggingPermission("control")</code> | |
| 87 | + * permission; this could result in a <code>SecurityException</code>. | |
| 88 | + * | |
| 89 | + * @param out the output stream to which RMI calls should be logged | |
| 90 | + * @throws SecurityException if there is a security manager and | |
| 91 | + * the invocation of its <code>checkPermission</code> method | |
| 92 | + * fails | |
| 93 | + * @see #getLog | |
| 94 | + * @since JDK1.1 | |
| 95 | + */ | |
| 96 | + public static void setLog(java.io.OutputStream out) | |
| 97 | + { | |
| 98 | + logNull = (out == null); | |
| 99 | + UnicastServerRef.callLog.setOutputStream(out); | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Returns stream for the RMI call log. | |
| 104 | + * @return the call log | |
| 105 | + * @see #setLog | |
| 106 | + * @since JDK1.1 | |
| 107 | + */ | |
| 108 | + public static java.io.PrintStream getLog() | |
| 109 | + { | |
| 110 | + return (logNull ? null : UnicastServerRef.callLog.getPrintStream()); | |
| 111 | + } | |
| 112 | + | |
| 113 | + // initialize log status | |
| 114 | + private static boolean logNull = !UnicastServerRef.logCalls; | |
| 115 | +} | |
Binary file not shown.
| @@ -0,0 +1,74 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +/** | |
| 28 | + * The <code>RemoteStub</code> class is the common superclass to client | |
| 29 | + * stubs and provides the framework to support a wide range of remote | |
| 30 | + * reference semantics. Stub objects are surrogates that support | |
| 31 | + * exactly the same set of remote interfaces defined by the actual | |
| 32 | + * implementation of the remote object. | |
| 33 | + * | |
| 34 | + * @author Ann Wollrath | |
| 35 | + * @since JDK1.1 | |
| 36 | + */ | |
| 37 | +abstract public class RemoteStub extends RemoteObject { | |
| 38 | + | |
| 39 | + /** indicate compatibility with JDK 1.1.x version of class */ | |
| 40 | + private static final long serialVersionUID = -1585587260594494182L; | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Constructs a <code>RemoteStub</code>. | |
| 44 | + */ | |
| 45 | + protected RemoteStub() { | |
| 46 | + super(); | |
| 47 | + } | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Constructs a <code>RemoteStub</code>, with the specified remote | |
| 51 | + * reference. | |
| 52 | + * | |
| 53 | + * @param ref the remote reference | |
| 54 | + * @since JDK1.1 | |
| 55 | + */ | |
| 56 | + protected RemoteStub(RemoteRef ref) { | |
| 57 | + super(ref); | |
| 58 | + } | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * Sets the remote reference inside the remote stub. | |
| 62 | + * | |
| 63 | + * @param stub the remote stub | |
| 64 | + * @param ref the remote reference | |
| 65 | + * @since JDK1.1 | |
| 66 | + * @deprecated no replacement. The <code>setRef</code> method | |
| 67 | + * is not needed since <code>RemoteStub</code>s can be created with | |
| 68 | + * the <code>RemoteStub(RemoteRef)</code> constructor. | |
| 69 | + */ | |
| 70 | + @Deprecated | |
| 71 | + protected static void setRef(RemoteStub stub, RemoteRef ref) { | |
| 72 | + throw new UnsupportedOperationException(); | |
| 73 | + } | |
| 74 | +} | |
Binary file not shown.
| @@ -0,0 +1,112 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A <code>ServerCloneException</code> is thrown if a remote exception occurs | |
| 30 | + * during the cloning of a <code>UnicastRemoteObject</code>. | |
| 31 | + * | |
| 32 | + * <p>As of release 1.4, this exception has been retrofitted to conform to | |
| 33 | + * the general purpose exception-chaining mechanism. The "nested exception" | |
| 34 | + * that may be provided at construction time and accessed via the public | |
| 35 | + * {@link #detail} field is now known as the <i>cause</i>, and may be | |
| 36 | + * accessed via the {@link Throwable#getCause()} method, as well as | |
| 37 | + * the aforementioned "legacy field." | |
| 38 | + * | |
| 39 | + * <p>Invoking the method {@link Throwable#initCause(Throwable)} on an | |
| 40 | + * instance of <code>ServerCloneException</code> always throws {@link | |
| 41 | + * IllegalStateException}. | |
| 42 | + * | |
| 43 | + * @author Ann Wollrath | |
| 44 | + * @since JDK1.1 | |
| 45 | + * @see java.rmi.server.UnicastRemoteObject#clone() | |
| 46 | + */ | |
| 47 | +public class ServerCloneException extends CloneNotSupportedException { | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * The cause of the exception. | |
| 51 | + * | |
| 52 | + * <p>This field predates the general-purpose exception chaining facility. | |
| 53 | + * The {@link Throwable#getCause()} method is now the preferred means of | |
| 54 | + * obtaining this information. | |
| 55 | + * | |
| 56 | + * @serial | |
| 57 | + */ | |
| 58 | + public Exception detail; | |
| 59 | + | |
| 60 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 61 | + private static final long serialVersionUID = 6617456357664815945L; | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Constructs a <code>ServerCloneException</code> with the specified | |
| 65 | + * detail message. | |
| 66 | + * | |
| 67 | + * @param s the detail message. | |
| 68 | + */ | |
| 69 | + public ServerCloneException(String s) { | |
| 70 | + super(s); | |
| 71 | + initCause(null); // Disallow subsequent initCause | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Constructs a <code>ServerCloneException</code> with the specified | |
| 76 | + * detail message and cause. | |
| 77 | + * | |
| 78 | + * @param s the detail message. | |
| 79 | + * @param cause the cause | |
| 80 | + */ | |
| 81 | + public ServerCloneException(String s, Exception cause) { | |
| 82 | + super(s); | |
| 83 | + initCause(null); // Disallow subsequent initCause | |
| 84 | + detail = cause; | |
| 85 | + } | |
| 86 | + | |
| 87 | + /** | |
| 88 | + * Returns the detail message, including the message from the cause, if | |
| 89 | + * any, of this exception. | |
| 90 | + * | |
| 91 | + * @return the detail message | |
| 92 | + */ | |
| 93 | + public String getMessage() { | |
| 94 | + if (detail == null) | |
| 95 | + return super.getMessage(); | |
| 96 | + else | |
| 97 | + return super.getMessage() + | |
| 98 | + "; nested exception is: \n\t" + | |
| 99 | + detail.toString(); | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Returns the cause of this exception. This method returns the value | |
| 104 | + * of the {@link #detail} field. | |
| 105 | + * | |
| 106 | + * @return the cause, which may be <tt>null</tt>. | |
| 107 | + * @since 1.4 | |
| 108 | + */ | |
| 109 | + public Throwable getCause() { | |
| 110 | + return detail; | |
| 111 | + } | |
| 112 | +} | |
Binary file not shown.
| @@ -0,0 +1,61 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * An <code>ServerNotActiveException</code> is an <code>Exception</code> | |
| 30 | + * thrown during a call to <code>RemoteServer.getClientHost</code> if | |
| 31 | + * the getClientHost method is called outside of servicing a remote | |
| 32 | + * method call. | |
| 33 | + * | |
| 34 | + * @author Roger Riggs | |
| 35 | + * @since JDK1.1 | |
| 36 | + * @see java.rmi.server.RemoteServer#getClientHost() | |
| 37 | + */ | |
| 38 | +public class ServerNotActiveException extends java.lang.Exception { | |
| 39 | + | |
| 40 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 41 | + private static final long serialVersionUID = 4687940720827538231L; | |
| 42 | + | |
| 43 | + /** | |
| 44 | + * Constructs an <code>ServerNotActiveException</code> with no specified | |
| 45 | + * detail message. | |
| 46 | + * @since JDK1.1 | |
| 47 | + */ | |
| 48 | + public ServerNotActiveException() {} | |
| 49 | + | |
| 50 | + /** | |
| 51 | + * Constructs an <code>ServerNotActiveException</code> with the specified | |
| 52 | + * detail message. | |
| 53 | + * | |
| 54 | + * @param s the detail message. | |
| 55 | + * @since JDK1.1 | |
| 56 | + */ | |
| 57 | + public ServerNotActiveException(String s) | |
| 58 | + { | |
| 59 | + super(s); | |
| 60 | + } | |
| 61 | +} | |
Binary file not shown.
| @@ -0,0 +1,66 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.rmi.*; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * A ServerRef represents the server-side handle for a remote object | |
| 32 | + * implementation. | |
| 33 | + * | |
| 34 | + * @author Ann Wollrath | |
| 35 | + * @since JDK1.1 | |
| 36 | + */ | |
| 37 | +public interface ServerRef extends RemoteRef { | |
| 38 | + | |
| 39 | + /** indicate compatibility with JDK 1.1.x version of class. */ | |
| 40 | + static final long serialVersionUID = -4557750989390278438L; | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Creates a client stub object for the supplied Remote object. | |
| 44 | + * If the call completes successfully, the remote object should | |
| 45 | + * be able to accept incoming calls from clients. | |
| 46 | + * @param obj the remote object implementation | |
| 47 | + * @param data information necessary to export the object | |
| 48 | + * @return the stub for the remote object | |
| 49 | + * @exception RemoteException if an exception occurs attempting | |
| 50 | + * to export the object (e.g., stub class could not be found) | |
| 51 | + * @since JDK1.1 | |
| 52 | + */ | |
| 53 | + RemoteStub exportObject(Remote obj, Object data) | |
| 54 | + throws RemoteException; | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * Returns the hostname of the current client. When called from a | |
| 58 | + * thread actively handling a remote method invocation the | |
| 59 | + * hostname of the client is returned. | |
| 60 | + * @return the client's host name | |
| 61 | + * @exception ServerNotActiveException if called outside of servicing | |
| 62 | + * a remote method invocation | |
| 63 | + * @since JDK1.1 | |
| 64 | + */ | |
| 65 | + String getClientHost() throws ServerNotActiveException; | |
| 66 | +} | |
Binary file not shown.
| @@ -0,0 +1,70 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.rmi.Remote; | |
| 28 | + | |
| 29 | +/** | |
| 30 | + * The <code>Skeleton</code> interface is used solely by the RMI | |
| 31 | + * implementation. | |
| 32 | + * | |
| 33 | + * <p> Every version 1.1 (and version 1.1 compatible skeletons generated in | |
| 34 | + * 1.2 using <code>rmic -vcompat</code>) skeleton class generated by the rmic | |
| 35 | + * stub compiler implements this interface. A skeleton for a remote object is | |
| 36 | + * a server-side entity that dispatches calls to the actual remote object | |
| 37 | + * implementation. | |
| 38 | + * | |
| 39 | + * @author Ann Wollrath | |
| 40 | + * @since JDK1.1 | |
| 41 | + * @deprecated no replacement. Skeletons are no longer required for remote | |
| 42 | + * method calls in the Java 2 platform v1.2 and greater. | |
| 43 | + */ | |
| 44 | +@Deprecated | |
| 45 | +public interface Skeleton { | |
| 46 | + /** | |
| 47 | + * Unmarshals arguments, calls the actual remote object implementation, | |
| 48 | + * and marshals the return value or any exception. | |
| 49 | + * | |
| 50 | + * @param obj remote implementation to dispatch call to | |
| 51 | + * @param theCall object representing remote call | |
| 52 | + * @param opnum operation number | |
| 53 | + * @param hash stub/skeleton interface hash | |
| 54 | + * @exception java.lang.Exception if a general exception occurs. | |
| 55 | + * @since JDK1.1 | |
| 56 | + * @deprecated no replacement | |
| 57 | + */ | |
| 58 | + @Deprecated | |
| 59 | + void dispatch(Remote obj, RemoteCall theCall, int opnum, long hash) | |
| 60 | + throws Exception; | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * Returns the operations supported by the skeleton. | |
| 64 | + * @return operations supported by skeleton | |
| 65 | + * @since JDK1.1 | |
| 66 | + * @deprecated no replacement | |
| 67 | + */ | |
| 68 | + @Deprecated | |
| 69 | + Operation[] getOperations(); | |
| 70 | +} | |
Binary file not shown.
| @@ -0,0 +1,62 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.rmi.RemoteException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * This exception is thrown when a call is received that does not | |
| 32 | + * match the available skeleton. It indicates either that the | |
| 33 | + * remote method names or signatures in this interface have changed or | |
| 34 | + * that the stub class used to make the call and the skeleton | |
| 35 | + * receiving the call were not generated by the same version of | |
| 36 | + * the stub compiler (<code>rmic</code>). | |
| 37 | + * | |
| 38 | + * @author Roger Riggs | |
| 39 | + * @since JDK1.1 | |
| 40 | + * @deprecated no replacement. Skeletons are no longer required for remote | |
| 41 | + * method calls in the Java 2 platform v1.2 and greater. | |
| 42 | + */ | |
| 43 | +@Deprecated | |
| 44 | +public class SkeletonMismatchException extends RemoteException { | |
| 45 | + | |
| 46 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 47 | + private static final long serialVersionUID = -7780460454818859281L; | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Constructs a new <code>SkeletonMismatchException</code> with | |
| 51 | + * a specified detail message. | |
| 52 | + * | |
| 53 | + * @param s the detail message | |
| 54 | + * @since JDK1.1 | |
| 55 | + * @deprecated no replacement | |
| 56 | + */ | |
| 57 | + @Deprecated | |
| 58 | + public SkeletonMismatchException(String s) { | |
| 59 | + super(s); | |
| 60 | + } | |
| 61 | + | |
| 62 | +} | |
Binary file not shown.
| @@ -0,0 +1,68 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +import java.rmi.RemoteException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * A <code>SkeletonNotFoundException</code> is thrown if the | |
| 32 | + * <code>Skeleton</code> corresponding to the remote object being | |
| 33 | + * exported is not found. Skeletons are no longer required, so this | |
| 34 | + * exception is never thrown. | |
| 35 | + * | |
| 36 | + * @since JDK1.1 | |
| 37 | + * @deprecated no replacement. Skeletons are no longer required for remote | |
| 38 | + * method calls in the Java 2 platform v1.2 and greater. | |
| 39 | + */ | |
| 40 | +@Deprecated | |
| 41 | +public class SkeletonNotFoundException extends RemoteException { | |
| 42 | + | |
| 43 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 44 | + private static final long serialVersionUID = -7860299673822761231L; | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * Constructs a <code>SkeletonNotFoundException</code> with the specified | |
| 48 | + * detail message. | |
| 49 | + * | |
| 50 | + * @param s the detail message. | |
| 51 | + * @since JDK1.1 | |
| 52 | + */ | |
| 53 | + public SkeletonNotFoundException(String s) { | |
| 54 | + super(s); | |
| 55 | + } | |
| 56 | + | |
| 57 | + /** | |
| 58 | + * Constructs a <code>SkeletonNotFoundException</code> with the specified | |
| 59 | + * detail message and nested exception. | |
| 60 | + * | |
| 61 | + * @param s the detail message. | |
| 62 | + * @param ex the nested exception | |
| 63 | + * @since JDK1.1 | |
| 64 | + */ | |
| 65 | + public SkeletonNotFoundException(String s, Exception ex) { | |
| 66 | + super(s, ex); | |
| 67 | + } | |
| 68 | +} | |
Binary file not shown.
| @@ -0,0 +1,62 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * An obsolete subclass of {@link ExportException}. | |
| 30 | + * | |
| 31 | + * @author Ann Wollrath | |
| 32 | + * @since JDK1.1 | |
| 33 | + **/ | |
| 34 | +public class SocketSecurityException extends ExportException { | |
| 35 | + | |
| 36 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 37 | + private static final long serialVersionUID = -7622072999407781979L; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * Constructs an <code>SocketSecurityException</code> with the specified | |
| 41 | + * detail message. | |
| 42 | + * | |
| 43 | + * @param s the detail message. | |
| 44 | + * @since JDK1.1 | |
| 45 | + */ | |
| 46 | + public SocketSecurityException(String s) { | |
| 47 | + super(s); | |
| 48 | + } | |
| 49 | + | |
| 50 | + /** | |
| 51 | + * Constructs an <code>SocketSecurityException</code> with the specified | |
| 52 | + * detail message and nested exception. | |
| 53 | + * | |
| 54 | + * @param s the detail message. | |
| 55 | + * @param ex the nested exception | |
| 56 | + * @since JDK1.1 | |
| 57 | + */ | |
| 58 | + public SocketSecurityException(String s, Exception ex) { | |
| 59 | + super(s, ex); | |
| 60 | + } | |
| 61 | + | |
| 62 | +} | |
Binary file not shown.
| @@ -0,0 +1,267 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.io.DataInput; | |
| 28 | +import java.io.DataOutput; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.io.Serializable; | |
| 31 | +import java.security.SecureRandom; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * A <code>UID</code> represents an identifier that is unique over time | |
| 35 | + * with respect to the host it is generated on, or one of 2<sup>16</sup> | |
| 36 | + * "well-known" identifiers. | |
| 37 | + * | |
| 38 | + * <p>The {@link #UID()} constructor can be used to generate an | |
| 39 | + * identifier that is unique over time with respect to the host it is | |
| 40 | + * generated on. The {@link #UID(short)} constructor can be used to | |
| 41 | + * create one of 2<sup>16</sup> well-known identifiers. | |
| 42 | + * | |
| 43 | + * <p>A <code>UID</code> instance contains three primitive values: | |
| 44 | + * <ul> | |
| 45 | + * <li><code>unique</code>, an <code>int</code> that uniquely identifies | |
| 46 | + * the VM that this <code>UID</code> was generated in, with respect to its | |
| 47 | + * host and at the time represented by the <code>time</code> value (an | |
| 48 | + * example implementation of the <code>unique</code> value would be a | |
| 49 | + * process identifier), | |
| 50 | + * or zero for a well-known <code>UID</code> | |
| 51 | + * <li><code>time</code>, a <code>long</code> equal to a time (as returned | |
| 52 | + * by {@link System#currentTimeMillis()}) at which the VM that this | |
| 53 | + * <code>UID</code> was generated in was alive, | |
| 54 | + * or zero for a well-known <code>UID</code> | |
| 55 | + * <li><code>count</code>, a <code>short</code> to distinguish | |
| 56 | + * <code>UID</code>s generated in the same VM with the same | |
| 57 | + * <code>time</code> value | |
| 58 | + * </ul> | |
| 59 | + * | |
| 60 | + * <p>An independently generated <code>UID</code> instance is unique | |
| 61 | + * over time with respect to the host it is generated on as long as | |
| 62 | + * the host requires more than one millisecond to reboot and its system | |
| 63 | + * clock is never set backward. A globally unique identifier can be | |
| 64 | + * constructed by pairing a <code>UID</code> instance with a unique host | |
| 65 | + * identifier, such as an IP address. | |
| 66 | + * | |
| 67 | + * @author Ann Wollrath | |
| 68 | + * @author Peter Jones | |
| 69 | + * @since JDK1.1 | |
| 70 | + */ | |
| 71 | +public final class UID implements Serializable { | |
| 72 | + | |
| 73 | + private static int hostUnique; | |
| 74 | + private static boolean hostUniqueSet = false; | |
| 75 | + | |
| 76 | + private static final Object lock = new Object(); | |
| 77 | + private static long lastTime = System.currentTimeMillis(); | |
| 78 | + private static short lastCount = Short.MIN_VALUE; | |
| 79 | + | |
| 80 | + /** indicate compatibility with JDK 1.1.x version of class */ | |
| 81 | + private static final long serialVersionUID = 1086053664494604050L; | |
| 82 | + | |
| 83 | + /** | |
| 84 | + * number that uniquely identifies the VM that this <code>UID</code> | |
| 85 | + * was generated in with respect to its host and at the given time | |
| 86 | + * @serial | |
| 87 | + */ | |
| 88 | + private final int unique; | |
| 89 | + | |
| 90 | + /** | |
| 91 | + * a time (as returned by {@link System#currentTimeMillis()}) at which | |
| 92 | + * the VM that this <code>UID</code> was generated in was alive | |
| 93 | + * @serial | |
| 94 | + */ | |
| 95 | + private final long time; | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * 16-bit number to distinguish <code>UID</code> instances created | |
| 99 | + * in the same VM with the same time value | |
| 100 | + * @serial | |
| 101 | + */ | |
| 102 | + private final short count; | |
| 103 | + | |
| 104 | + /** | |
| 105 | + * Generates a <code>UID</code> that is unique over time with | |
| 106 | + * respect to the host that it was generated on. | |
| 107 | + */ | |
| 108 | + public UID() { | |
| 109 | + | |
| 110 | + synchronized (lock) { | |
| 111 | + if (!hostUniqueSet) { | |
| 112 | + hostUnique = (new SecureRandom()).nextInt(); | |
| 113 | + hostUniqueSet = true; | |
| 114 | + } | |
| 115 | + unique = hostUnique; | |
| 116 | + if (lastCount == Short.MAX_VALUE) { | |
| 117 | + boolean interrupted = Thread.interrupted(); | |
| 118 | + boolean done = false; | |
| 119 | + while (!done) { | |
| 120 | + long now = System.currentTimeMillis(); | |
| 121 | + if (now <= lastTime) { | |
| 122 | + // wait for time to change | |
| 123 | + try { | |
| 124 | + Thread.currentThread().sleep(1); | |
| 125 | + } catch (InterruptedException e) { | |
| 126 | + interrupted = true; | |
| 127 | + } | |
| 128 | + } else { | |
| 129 | + lastTime = now; | |
| 130 | + lastCount = Short.MIN_VALUE; | |
| 131 | + done = true; | |
| 132 | + } | |
| 133 | + } | |
| 134 | + if (interrupted) { | |
| 135 | + Thread.currentThread().interrupt(); | |
| 136 | + } | |
| 137 | + } | |
| 138 | + time = lastTime; | |
| 139 | + count = lastCount++; | |
| 140 | + } | |
| 141 | + } | |
| 142 | + | |
| 143 | + /** | |
| 144 | + * Creates a "well-known" <code>UID</code>. | |
| 145 | + * | |
| 146 | + * There are 2<sup>16</sup> possible such well-known ids. | |
| 147 | + * | |
| 148 | + * <p>A <code>UID</code> created via this constructor will not | |
| 149 | + * clash with any <code>UID</code>s generated via the no-arg | |
| 150 | + * constructor. | |
| 151 | + * | |
| 152 | + * @param num number for well-known <code>UID</code> | |
| 153 | + */ | |
| 154 | + public UID(short num) { | |
| 155 | + unique = 0; | |
| 156 | + time = 0; | |
| 157 | + count = num; | |
| 158 | + } | |
| 159 | + | |
| 160 | + /** | |
| 161 | + * Constructs a <code>UID</code> given data read from a stream. | |
| 162 | + */ | |
| 163 | + private UID(int unique, long time, short count) { | |
| 164 | + this.unique = unique; | |
| 165 | + this.time = time; | |
| 166 | + this.count = count; | |
| 167 | + } | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Returns the hash code value for this <code>UID</code>. | |
| 171 | + * | |
| 172 | + * @return the hash code value for this <code>UID</code> | |
| 173 | + */ | |
| 174 | + public int hashCode() { | |
| 175 | + return (int) time + (int) count; | |
| 176 | + } | |
| 177 | + | |
| 178 | + /** | |
| 179 | + * Compares the specified object with this <code>UID</code> for | |
| 180 | + * equality. | |
| 181 | + * | |
| 182 | + * This method returns <code>true</code> if and only if the | |
| 183 | + * specified object is a <code>UID</code> instance with the same | |
| 184 | + * <code>unique</code>, <code>time</code>, and <code>count</code> | |
| 185 | + * values as this one. | |
| 186 | + * | |
| 187 | + * @param obj the object to compare this <code>UID</code> to | |
| 188 | + * | |
| 189 | + * @return <code>true</code> if the given object is equivalent to | |
| 190 | + * this one, and <code>false</code> otherwise | |
| 191 | + */ | |
| 192 | + public boolean equals(Object obj) { | |
| 193 | + if (obj instanceof UID) { | |
| 194 | + UID uid = (UID) obj; | |
| 195 | + return (unique == uid.unique && | |
| 196 | + count == uid.count && | |
| 197 | + time == uid.time); | |
| 198 | + } else { | |
| 199 | + return false; | |
| 200 | + } | |
| 201 | + } | |
| 202 | + | |
| 203 | + /** | |
| 204 | + * Returns a string representation of this <code>UID</code>. | |
| 205 | + * | |
| 206 | + * @return a string representation of this <code>UID</code> | |
| 207 | + */ | |
| 208 | + public String toString() { | |
| 209 | + return Integer.toString(unique,16) + ":" + | |
| 210 | + Long.toString(time,16) + ":" + | |
| 211 | + Integer.toString(count,16); | |
| 212 | + } | |
| 213 | + | |
| 214 | + /** | |
| 215 | + * Marshals a binary representation of this <code>UID</code> to | |
| 216 | + * a <code>DataOutput</code> instance. | |
| 217 | + * | |
| 218 | + * <p>Specifically, this method first invokes the given stream's | |
| 219 | + * {@link DataOutput#writeInt(int)} method with this <code>UID</code>'s | |
| 220 | + * <code>unique</code> value, then it invokes the stream's | |
| 221 | + * {@link DataOutput#writeLong(long)} method with this <code>UID</code>'s | |
| 222 | + * <code>time</code> value, and then it invokes the stream's | |
| 223 | + * {@link DataOutput#writeShort(int)} method with this <code>UID</code>'s | |
| 224 | + * <code>count</code> value. | |
| 225 | + * | |
| 226 | + * @param out the <code>DataOutput</code> instance to write | |
| 227 | + * this <code>UID</code> to | |
| 228 | + * | |
| 229 | + * @throws IOException if an I/O error occurs while performing | |
| 230 | + * this operation | |
| 231 | + */ | |
| 232 | + public void write(DataOutput out) throws IOException { | |
| 233 | + out.writeInt(unique); | |
| 234 | + out.writeLong(time); | |
| 235 | + out.writeShort(count); | |
| 236 | + } | |
| 237 | + | |
| 238 | + /** | |
| 239 | + * Constructs and returns a new <code>UID</code> instance by | |
| 240 | + * unmarshalling a binary representation from an | |
| 241 | + * <code>DataInput</code> instance. | |
| 242 | + * | |
| 243 | + * <p>Specifically, this method first invokes the given stream's | |
| 244 | + * {@link DataInput#readInt()} method to read a <code>unique</code> value, | |
| 245 | + * then it invoke's the stream's | |
| 246 | + * {@link DataInput#readLong()} method to read a <code>time</code> value, | |
| 247 | + * then it invoke's the stream's | |
| 248 | + * {@link DataInput#readShort()} method to read a <code>count</code> value, | |
| 249 | + * and then it creates and returns a new <code>UID</code> instance | |
| 250 | + * that contains the <code>unique</code>, <code>time</code>, and | |
| 251 | + * <code>count</code> values that were read from the stream. | |
| 252 | + * | |
| 253 | + * @param in the <code>DataInput</code> instance to read | |
| 254 | + * <code>UID</code> from | |
| 255 | + * | |
| 256 | + * @return unmarshalled <code>UID</code> instance | |
| 257 | + * | |
| 258 | + * @throws IOException if an I/O error occurs while performing | |
| 259 | + * this operation | |
| 260 | + */ | |
| 261 | + public static UID read(DataInput in) throws IOException { | |
| 262 | + int unique = in.readInt(); | |
| 263 | + long time = in.readLong(); | |
| 264 | + short count = in.readShort(); | |
| 265 | + return new UID(unique, time, count); | |
| 266 | + } | |
| 267 | +} | |
Binary file not shown.
| @@ -0,0 +1,312 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | +package java.rmi.server; | |
| 26 | + | |
| 27 | +import java.rmi.*; | |
| 28 | +import sun.rmi.server.UnicastServerRef; | |
| 29 | +import sun.rmi.server.UnicastServerRef2; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * Used for exporting a remote object with JRMP and obtaining a stub | |
| 33 | + * that communicates to the remote object. | |
| 34 | + * | |
| 35 | + * <p>For the constructors and static <code>exportObject</code> methods | |
| 36 | + * below, the stub for a remote object being exported is obtained as | |
| 37 | + * follows: | |
| 38 | + * | |
| 39 | + * <p><ul> | |
| 40 | + * | |
| 41 | + * <li>If the remote object is exported using the {@link | |
| 42 | + * #exportObject(Remote) UnicastRemoteObject.exportObject(Remote)} method, | |
| 43 | + * a stub class (typically pregenerated from the remote object's class | |
| 44 | + * using the <code>rmic</code> tool) is loaded and an instance of that stub | |
| 45 | + * class is constructed as follows. | |
| 46 | + * <ul> | |
| 47 | + * | |
| 48 | + * <li>A "root class" is determined as follows: if the remote object's | |
| 49 | + * class directly implements an interface that extends {@link Remote}, then | |
| 50 | + * the remote object's class is the root class; otherwise, the root class is | |
| 51 | + * the most derived superclass of the remote object's class that directly | |
| 52 | + * implements an interface that extends <code>Remote</code>. | |
| 53 | + * | |
| 54 | + * <li>The name of the stub class to load is determined by concatenating | |
| 55 | + * the binary name of the root class with the suffix <code>"_Stub"</code>. | |
| 56 | + * | |
| 57 | + * <li>The stub class is loaded by name using the class loader of the root | |
| 58 | + * class. The stub class must extend {@link RemoteStub} and must have a | |
| 59 | + * public constructor that has one parameter, of type {@link RemoteRef}. | |
| 60 | + * | |
| 61 | + * <li>Finally, an instance of the stub class is constructed with a | |
| 62 | + * {@link RemoteRef}. | |
| 63 | + * </ul> | |
| 64 | + * | |
| 65 | + * <li>If the appropriate stub class could not be found, or the stub class | |
| 66 | + * could not be loaded, or a problem occurs creating the stub instance, a | |
| 67 | + * {@link StubNotFoundException} is thrown. | |
| 68 | + * | |
| 69 | + * <p> | |
| 70 | + * <li>For all other means of exporting: | |
| 71 | + * <p><ul> | |
| 72 | + * | |
| 73 | + * <li>If the remote object's stub class (as defined above) could not be | |
| 74 | + * loaded or the system property | |
| 75 | + * <code>java.rmi.server.ignoreStubClasses</code> is set to | |
| 76 | + * <code>"true"</code> (case insensitive), a {@link | |
| 77 | + * java.lang.reflect.Proxy} instance is constructed with the following | |
| 78 | + * properties: | |
| 79 | + * | |
| 80 | + * <ul> | |
| 81 | + * | |
| 82 | + * <li>The proxy's class is defined by the class loader of the remote | |
| 83 | + * object's class. | |
| 84 | + * | |
| 85 | + * <li>The proxy implements all the remote interfaces implemented by the | |
| 86 | + * remote object's class. | |
| 87 | + * | |
| 88 | + * <li>The proxy's invocation handler is a {@link | |
| 89 | + * RemoteObjectInvocationHandler} instance constructed with a | |
| 90 | + * {@link RemoteRef}. | |
| 91 | + * | |
| 92 | + * <li>If the proxy could not be created, a {@link StubNotFoundException} | |
| 93 | + * will be thrown. | |
| 94 | + * </ul> | |
| 95 | + * | |
| 96 | + * <p> | |
| 97 | + * <li>Otherwise, an instance of the remote object's stub class (as | |
| 98 | + * described above) is used as the stub. | |
| 99 | + * | |
| 100 | + * </ul> | |
| 101 | + * </ul> | |
| 102 | + * | |
| 103 | + * @author Ann Wollrath | |
| 104 | + * @author Peter Jones | |
| 105 | + * @since JDK1.1 | |
| 106 | + **/ | |
| 107 | +public class UnicastRemoteObject extends RemoteServer { | |
| 108 | + | |
| 109 | + /** | |
| 110 | + * @serial port number on which to export object | |
| 111 | + */ | |
| 112 | + private int port = 0; | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * @serial client-side socket factory (if any) | |
| 116 | + */ | |
| 117 | + private RMIClientSocketFactory csf = null; | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * @serial server-side socket factory (if any) to use when | |
| 121 | + * exporting object | |
| 122 | + */ | |
| 123 | + private RMIServerSocketFactory ssf = null; | |
| 124 | + | |
| 125 | + /* indicate compatibility with JDK 1.1.x version of class */ | |
| 126 | + private static final long serialVersionUID = 4974527148936298033L; | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Creates and exports a new UnicastRemoteObject object using an | |
| 130 | + * anonymous port. | |
| 131 | + * @throws RemoteException if failed to export object | |
| 132 | + * @since JDK1.1 | |
| 133 | + */ | |
| 134 | + protected UnicastRemoteObject() throws RemoteException | |
| 135 | + { | |
| 136 | + this(0); | |
| 137 | + } | |
| 138 | + | |
| 139 | + /** | |
| 140 | + * Creates and exports a new UnicastRemoteObject object using the | |
| 141 | + * particular supplied port. | |
| 142 | + * @param port the port number on which the remote object receives calls | |
| 143 | + * (if <code>port</code> is zero, an anonymous port is chosen) | |
| 144 | + * @throws RemoteException if failed to export object | |
| 145 | + * @since 1.2 | |
| 146 | + */ | |
| 147 | + protected UnicastRemoteObject(int port) throws RemoteException | |
| 148 | + { | |
| 149 | + this.port = port; | |
| 150 | + exportObject((Remote) this, port); | |
| 151 | + } | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * Creates and exports a new UnicastRemoteObject object using the | |
| 155 | + * particular supplied port and socket factories. | |
| 156 | + * @param port the port number on which the remote object receives calls | |
| 157 | + * (if <code>port</code> is zero, an anonymous port is chosen) | |
| 158 | + * @param csf the client-side socket factory for making calls to the | |
| 159 | + * remote object | |
| 160 | + * @param ssf the server-side socket factory for receiving remote calls | |
| 161 | + * @throws RemoteException if failed to export object | |
| 162 | + * @since 1.2 | |
| 163 | + */ | |
| 164 | + protected UnicastRemoteObject(int port, | |
| 165 | + RMIClientSocketFactory csf, | |
| 166 | + RMIServerSocketFactory ssf) | |
| 167 | + throws RemoteException | |
| 168 | + { | |
| 169 | + this.port = port; | |
| 170 | + this.csf = csf; | |
| 171 | + this.ssf = ssf; | |
| 172 | + exportObject((Remote) this, port, csf, ssf); | |
| 173 | + } | |
| 174 | + | |
| 175 | + /** | |
| 176 | + * Re-export the remote object when it is deserialized. | |
| 177 | + */ | |
| 178 | + private void readObject(java.io.ObjectInputStream in) | |
| 179 | + throws java.io.IOException, java.lang.ClassNotFoundException | |
| 180 | + { | |
| 181 | + in.defaultReadObject(); | |
| 182 | + reexport(); | |
| 183 | + } | |
| 184 | + | |
| 185 | + /** | |
| 186 | + * Returns a clone of the remote object that is distinct from | |
| 187 | + * the original. | |
| 188 | + * | |
| 189 | + * @exception CloneNotSupportedException if clone failed due to | |
| 190 | + * a RemoteException. | |
| 191 | + * @return the new remote object | |
| 192 | + * @since JDK1.1 | |
| 193 | + */ | |
| 194 | + public Object clone() throws CloneNotSupportedException | |
| 195 | + { | |
| 196 | + try { | |
| 197 | + UnicastRemoteObject cloned = (UnicastRemoteObject) super.clone(); | |
| 198 | + cloned.reexport(); | |
| 199 | + return cloned; | |
| 200 | + } catch (RemoteException e) { | |
| 201 | + throw new ServerCloneException("Clone failed", e); | |
| 202 | + } | |
| 203 | + } | |
| 204 | + | |
| 205 | + /* | |
| 206 | + * Exports this UnicastRemoteObject using its initialized fields because | |
| 207 | + * its creation bypassed running its constructors (via deserialization | |
| 208 | + * or cloning, for example). | |
| 209 | + */ | |
| 210 | + private void reexport() throws RemoteException | |
| 211 | + { | |
| 212 | + if (csf == null && ssf == null) { | |
| 213 | + exportObject((Remote) this, port); | |
| 214 | + } else { | |
| 215 | + exportObject((Remote) this, port, csf, ssf); | |
| 216 | + } | |
| 217 | + } | |
| 218 | + | |
| 219 | + /** | |
| 220 | + * Exports the remote object to make it available to receive incoming | |
| 221 | + * calls using an anonymous port. | |
| 222 | + * @param obj the remote object to be exported | |
| 223 | + * @return remote object stub | |
| 224 | + * @exception RemoteException if export fails | |
| 225 | + * @since JDK1.1 | |
| 226 | + */ | |
| 227 | + public static RemoteStub exportObject(Remote obj) | |
| 228 | + throws RemoteException | |
| 229 | + { | |
| 230 | + /* | |
| 231 | + * Use UnicastServerRef constructor passing the boolean value true | |
| 232 | + * to indicate that only a generated stub class should be used. A | |
| 233 | + * generated stub class must be used instead of a dynamic proxy | |
| 234 | + * because the return value of this method is RemoteStub which a | |
| 235 | + * dynamic proxy class cannot extend. | |
| 236 | + */ | |
| 237 | + return (RemoteStub) exportObject(obj, new UnicastServerRef(true)); | |
| 238 | + } | |
| 239 | + | |
| 240 | + /** | |
| 241 | + * Exports the remote object to make it available to receive incoming | |
| 242 | + * calls, using the particular supplied port. | |
| 243 | + * @param obj the remote object to be exported | |
| 244 | + * @param port the port to export the object on | |
| 245 | + * @return remote object stub | |
| 246 | + * @exception RemoteException if export fails | |
| 247 | + * @since 1.2 | |
| 248 | + */ | |
| 249 | + public static Remote exportObject(Remote obj, int port) | |
| 250 | + throws RemoteException | |
| 251 | + { | |
| 252 | + return exportObject(obj, new UnicastServerRef(port)); | |
| 253 | + } | |
| 254 | + | |
| 255 | + /** | |
| 256 | + * Exports the remote object to make it available to receive incoming | |
| 257 | + * calls, using a transport specified by the given socket factory. | |
| 258 | + * @param obj the remote object to be exported | |
| 259 | + * @param port the port to export the object on | |
| 260 | + * @param csf the client-side socket factory for making calls to the | |
| 261 | + * remote object | |
| 262 | + * @param ssf the server-side socket factory for receiving remote calls | |
| 263 | + * @return remote object stub | |
| 264 | + * @exception RemoteException if export fails | |
| 265 | + * @since 1.2 | |
| 266 | + */ | |
| 267 | + public static Remote exportObject(Remote obj, int port, | |
| 268 | + RMIClientSocketFactory csf, | |
| 269 | + RMIServerSocketFactory ssf) | |
| 270 | + throws RemoteException | |
| 271 | + { | |
| 272 | + | |
| 273 | + return exportObject(obj, new UnicastServerRef2(port, csf, ssf)); | |
| 274 | + } | |
| 275 | + | |
| 276 | + /** | |
| 277 | + * Removes the remote object, obj, from the RMI runtime. If | |
| 278 | + * successful, the object can no longer accept incoming RMI calls. | |
| 279 | + * If the force parameter is true, the object is forcibly unexported | |
| 280 | + * even if there are pending calls to the remote object or the | |
| 281 | + * remote object still has calls in progress. If the force | |
| 282 | + * parameter is false, the object is only unexported if there are | |
| 283 | + * no pending or in progress calls to the object. | |
| 284 | + * | |
| 285 | + * @param obj the remote object to be unexported | |
| 286 | + * @param force if true, unexports the object even if there are | |
| 287 | + * pending or in-progress calls; if false, only unexports the object | |
| 288 | + * if there are no pending or in-progress calls | |
| 289 | + * @return true if operation is successful, false otherwise | |
| 290 | + * @exception NoSuchObjectException if the remote object is not | |
| 291 | + * currently exported | |
| 292 | + * @since 1.2 | |
| 293 | + */ | |
| 294 | + public static boolean unexportObject(Remote obj, boolean force) | |
| 295 | + throws java.rmi.NoSuchObjectException | |
| 296 | + { | |
| 297 | + return sun.rmi.transport.ObjectTable.unexportObject(obj, force); | |
| 298 | + } | |
| 299 | + | |
| 300 | + /** | |
| 301 | + * Exports the specified object using the specified server ref. | |
| 302 | + */ | |
| 303 | + private static Remote exportObject(Remote obj, UnicastServerRef sref) | |
| 304 | + throws RemoteException | |
| 305 | + { | |
| 306 | + // if obj extends UnicastRemoteObject, set its ref. | |
| 307 | + if (obj instanceof UnicastRemoteObject) { | |
| 308 | + ((UnicastRemoteObject) obj).ref = sref; | |
| 309 | + } | |
| 310 | + return sref.exportObject(obj, null, false); | |
| 311 | + } | |
| 312 | +} | |
Binary file not shown.
| @@ -0,0 +1,45 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.rmi.server; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A remote object implementation should implement the | |
| 30 | + * <code>Unreferenced</code> interface to receive notification when there are | |
| 31 | + * no more clients that reference that remote object. | |
| 32 | + * | |
| 33 | + * @author Ann Wollrath | |
| 34 | + * @author Roger Riggs | |
| 35 | + * @since JDK1.1 | |
| 36 | + */ | |
| 37 | +public interface Unreferenced { | |
| 38 | + /** | |
| 39 | + * Called by the RMI runtime sometime after the runtime determines that | |
| 40 | + * the reference list, the list of clients referencing the remote object, | |
| 41 | + * becomes empty. | |
| 42 | + * @since JDK1.1 | |
| 43 | + */ | |
| 44 | + public void unreferenced(); | |
| 45 | +} | |
| @@ -0,0 +1,34 @@ | ||
| 1 | +<../../../../../mkconfig | |
| 2 | + | |
| 3 | +TARG=\ | |
| 4 | + ExportException.dis\ | |
| 5 | + LoaderHandler.dis\ | |
| 6 | + LogStream.dis\ | |
| 7 | + ObjID.dis\ | |
| 8 | + Operation.dis\ | |
| 9 | + RemoteCall.dis\ | |
| 10 | + RemoteObject.dis\ | |
| 11 | + RemoteObjectInvocationHandler.dis\ | |
| 12 | + RemoteRef.dis\ | |
| 13 | + RemoteServer.dis\ | |
| 14 | + RemoteStub.dis\ | |
| 15 | + RMIClassLoader.dis\ | |
| 16 | + RMIClassLoaderSpi.dis\ | |
| 17 | + RMIClientSocketFactory.dis\ | |
| 18 | + RMIFailureHandler.dis\ | |
| 19 | + RMIServerSocketFactory.dis\ | |
| 20 | + RMISocketFactory.dis\ | |
| 21 | + ServerCloneException.dis\ | |
| 22 | + ServerNotActiveException.dis\ | |
| 23 | + ServerRef.dis\ | |
| 24 | + Skeleton.dis\ | |
| 25 | + SkeletonMismatchException.dis\ | |
| 26 | + SkeletonNotFoundException.dis\ | |
| 27 | + SocketSecurityException.dis\ | |
| 28 | + UID.dis\ | |
| 29 | + UnicastRemoteObject.dis\ | |
| 30 | + Unreferenced.dis\ | |
| 31 | + | |
| 32 | +DISBIN=$ROOT/java/dis/java/java/java/rmi/server | |
| 33 | + | |
| 34 | +<$ROOT/mkfiles/mkjava | |
| @@ -0,0 +1,53 @@ | ||
| 1 | +<!-- | |
| 2 | + Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + | |
| 5 | + This code is free software; you can redistribute it and/or modify it | |
| 6 | + under the terms of the GNU General Public License version 2 only, as | |
| 7 | + published by the Free Software Foundation. Oracle designates this | |
| 8 | + particular file as subject to the "Classpath" exception as provided | |
| 9 | + by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + | |
| 11 | + This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + accompanied this code). | |
| 16 | + | |
| 17 | + You should have received a copy of the GNU General Public License version | |
| 18 | + 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + | |
| 21 | + Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + or visit www.oracle.com if you need additional information or have any | |
| 23 | + questions. | |
| 24 | +--> | |
| 25 | + | |
| 26 | +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | |
| 27 | +<html> | |
| 28 | +<body bgcolor="white"> | |
| 29 | + | |
| 30 | +Provides classes and interfaces for supporting the server | |
| 31 | +side of RMI. A group of classes are used by the stubs and skeletons | |
| 32 | +generated by the rmic stub compiler. Another group of classes | |
| 33 | +implements the RMI Transport protocol and HTTP tunneling. | |
| 34 | + | |
| 35 | +<!-- | |
| 36 | +<h2>Package Specification</h2> | |
| 37 | + | |
| 38 | +##### FILL IN ANY SPECS NEEDED BY JAVA COMPATIBILITY KIT ##### | |
| 39 | +<ul> | |
| 40 | + <li><a href="">##### REFER TO ANY FRAMEMAKER SPECIFICATION HERE #####</a> | |
| 41 | +</ul> | |
| 42 | + | |
| 43 | +<h2>Related Documentation</h2> | |
| 44 | + | |
| 45 | +For overviews, tutorials, examples, guides, and tool documentation, please see: | |
| 46 | +<ul> | |
| 47 | + <li><a href="">##### REFER TO NON-SPEC DOCUMENTATION HERE #####</a> | |
| 48 | +</ul> | |
| 49 | +--> | |
| 50 | + | |
| 51 | +@since JDK1.1 | |
| 52 | +</body> | |
| 53 | +</html> | |