001 /*
002 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package javax.management.remote.rmi;
027
028 import java.io.IOException;
029 import java.rmi.Remote;
030 import java.security.AccessControlContext;
031 import java.security.AccessController;
032 import java.security.PrivilegedActionException;
033 import java.security.PrivilegedExceptionAction;
034 import java.util.Map;
035 import java.util.Collections;
036 import javax.rmi.PortableRemoteObject;
037 import javax.security.auth.Subject;
038
039 /**
040 * <p>An {@link RMIServerImpl} that is exported through IIOP and that
041 * creates client connections as RMI objects exported through IIOP.
042 * User code does not usually reference this class directly.</p>
043 *
044 * @see RMIServerImpl
045 *
046 * @since 1.5
047 */
048 public class RMIIIOPServerImpl extends RMIServerImpl {
049 /**
050 * <p>Creates a new {@link RMIServerImpl}.</p>
051 *
052 * @param env the environment containing attributes for the new
053 * <code>RMIServerImpl</code>. Can be null, which is equivalent
054 * to an empty Map.
055 *
056 * @exception IOException if the RMI object cannot be created.
057 */
058 public RMIIIOPServerImpl(Map<String, ?> env) throws IOException {
059 super (env);
060
061 this .env = (env == null) ? Collections
062 .<String, Object> emptyMap() : env;
063
064 callerACC = AccessController.getContext();
065 }
066
067 protected void export() throws IOException {
068 PortableRemoteObject.exportObject(this );
069 }
070
071 protected String getProtocol() {
072 return "iiop";
073 }
074
075 /**
076 * <p>Returns an IIOP stub.</p>
077 * The stub might not yet be connected to the ORB. The stub will
078 * be serializable only if it is connected to the ORB.
079 * @return an IIOP stub.
080 * @exception IOException if the stub cannot be created - e.g the
081 * RMIIIOPServerImpl has not been exported yet.
082 **/
083 public Remote toStub() throws IOException {
084 // javax.rmi.CORBA.Stub stub =
085 // (javax.rmi.CORBA.Stub) PortableRemoteObject.toStub(this);
086 final Remote stub = PortableRemoteObject.toStub(this );
087 // java.lang.System.out.println("NON CONNECTED STUB " + stub);
088 // org.omg.CORBA.ORB orb =
089 // org.omg.CORBA.ORB.init((String[])null, (Properties)null);
090 // stub.connect(orb);
091 // java.lang.System.out.println("CONNECTED STUB " + stub);
092 return stub;
093 }
094
095 /**
096 * <p>Creates a new client connection as an RMI object exported
097 * through IIOP.
098 *
099 * @param connectionId the ID of the new connection. Every
100 * connection opened by this connector server will have a
101 * different ID. The behavior is unspecified if this parameter is
102 * null.
103 *
104 * @param subject the authenticated subject. Can be null.
105 *
106 * @return the newly-created <code>RMIConnection</code>.
107 *
108 * @exception IOException if the new client object cannot be
109 * created or exported.
110 */
111 protected RMIConnection makeClient(String connectionId,
112 Subject subject) throws IOException {
113
114 if (connectionId == null)
115 throw new NullPointerException("Null connectionId");
116
117 RMIConnection client = new RMIConnectionImpl(this ,
118 connectionId, getDefaultClassLoader(), subject, env);
119 PortableRemoteObject.exportObject(client);
120 return client;
121 }
122
123 protected void closeClient(RMIConnection client) throws IOException {
124 PortableRemoteObject.unexportObject(client);
125 }
126
127 /**
128 * <p>Called by {@link #close()} to close the connector server by
129 * unexporting this object. After returning from this method, the
130 * connector server must not accept any new connections.</p>
131 *
132 * @exception IOException if the attempt to close the connector
133 * server failed.
134 */
135 protected void closeServer() throws IOException {
136 PortableRemoteObject.unexportObject(this );
137 }
138
139 @Override
140 RMIConnection doNewClient(final Object credentials)
141 throws IOException {
142 if (callerACC == null) {
143 throw new SecurityException(
144 "AccessControlContext cannot be null");
145 }
146 try {
147 return AccessController.doPrivileged(
148 new PrivilegedExceptionAction<RMIConnection>() {
149 public RMIConnection run() throws IOException {
150 return super DoNewClient(credentials);
151 }
152 }, callerACC);
153 } catch (PrivilegedActionException pae) {
154 throw (IOException) pae.getCause();
155 }
156 }
157
158 RMIConnection super DoNewClient(Object credentials)
159 throws IOException {
160 return super .doNewClient(credentials);
161 }
162
163 private final Map<String, ?> env;
164 private final AccessControlContext callerACC;
165 }
|