History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/rmi/server/RMISocketFactory.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/rmi/server/RMISocketFactory.java+188−0
@@ -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+}