/* * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.management.remote; import java.io.Closeable; import java.io.IOException; import java.util.Map; import javax.management.ListenerNotFoundException; import javax.management.MBeanServerConnection; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.security.auth.Subject; /** {@collect.stats} * <p>The client end of a JMX API connector. An object of this type can * be used to establish a connection to a connector server.</p> * * <p>A newly-created object of this type is unconnected. Its {@link * #connect connect} method must be called before it can be used. * However, objects created by {@link * JMXConnectorFactory#connect(JMXServiceURL, Map) * JMXConnectorFactory.connect} are already connected.</p> * * @since 1.5 */ public interface JMXConnector extends Closeable { /** {@collect.stats} * <p>Name of the attribute that specifies the credentials to send * to the connector server during connection. The value * associated with this attribute, if any, is a serializable * object of an appropriate type for the server's {@link * JMXAuthenticator}. */ public static final String CREDENTIALS = "jmx.remote.credentials"; /** {@collect.stats} * <p>Establishes the connection to the connector server. This * method is equivalent to {@link #connect(Map) * connect(null)}.</p> * * @exception IOException if the connection could not be made * because of a communication problem. * * @exception SecurityException if the connection could not be * made for security reasons. */ public void connect() throws IOException; /** {@collect.stats} * <p>Establishes the connection to the connector server.</p> * * <p>If <code>connect</code> has already been called successfully * on this object, calling it again has no effect. If, however, * {@link #close} was called after <code>connect</code>, the new * <code>connect</code> will throw an <code>IOException</code>.<p> * * <p>Otherwise, either <code>connect</code> has never been called * on this object, or it has been called but produced an * exception. Then calling <code>connect</code> will attempt to * establish a connection to the connector server.</p> * * @param env the properties of the connection. Properties in * this map override properties in the map specified when the * <code>JMXConnector</code> was created, if any. This parameter * can be null, which is equivalent to an empty map. * * @exception IOException if the connection could not be made * because of a communication problem. * * @exception SecurityException if the connection could not be * made for security reasons. */ public void connect(Map<String,?> env) throws IOException; /** {@collect.stats} * <p>Returns an <code>MBeanServerConnection</code> object * representing a remote MBean server. For a given * <code>JMXConnector</code>, two successful calls to this method * will usually return the same <code>MBeanServerConnection</code> * object, though this is not required.</p> * * <p>For each method in the returned * <code>MBeanServerConnection</code>, calling the method causes * the corresponding method to be called in the remote MBean * server. The value returned by the MBean server method is the * value returned to the client. If the MBean server method * produces an <code>Exception</code>, the same * <code>Exception</code> is seen by the client. If the MBean * server method, or the attempt to call it, produces an * <code>Error</code>, the <code>Error</code> is wrapped in a * {@link JMXServerErrorException}, which is seen by the * client.</p> * * <p>Calling this method is equivalent to calling * {@link #getMBeanServerConnection(Subject) getMBeanServerConnection(null)} * meaning that no delegation subject is specified and that all the * operations called on the <code>MBeanServerConnection</code> must * use the authenticated subject, if any.</p> * * @return an object that implements the * <code>MBeanServerConnection</code> interface by forwarding its * methods to the remote MBean server. * * @exception IOException if a valid * <code>MBeanServerConnection</code> cannot be created, for * instance because the connection to the remote MBean server has * not yet been established (with the {@link #connect(Map) * connect} method), or it has been closed, or it has broken. */ public MBeanServerConnection getMBeanServerConnection() throws IOException; /** {@collect.stats} * <p>Returns an <code>MBeanServerConnection</code> object representing * a remote MBean server on which operations are performed on behalf of * the supplied delegation subject. For a given <code>JMXConnector</code> * and <code>Subject</code>, two successful calls to this method will * usually return the same <code>MBeanServerConnection</code> object, * though this is not required.</p> * * <p>For each method in the returned * <code>MBeanServerConnection</code>, calling the method causes * the corresponding method to be called in the remote MBean * server on behalf of the given delegation subject instead of the * authenticated subject. The value returned by the MBean server * method is the value returned to the client. If the MBean server * method produces an <code>Exception</code>, the same * <code>Exception</code> is seen by the client. If the MBean * server method, or the attempt to call it, produces an * <code>Error</code>, the <code>Error</code> is wrapped in a * {@link JMXServerErrorException}, which is seen by the * client.</p> * * @param delegationSubject the <code>Subject</code> on behalf of * which requests will be performed. Can be null, in which case * requests will be performed on behalf of the authenticated * Subject, if any. * * @return an object that implements the <code>MBeanServerConnection</code> * interface by forwarding its methods to the remote MBean server on behalf * of a given delegation subject. * * @exception IOException if a valid <code>MBeanServerConnection</code> * cannot be created, for instance because the connection to the remote * MBean server has not yet been established (with the {@link #connect(Map) * connect} method), or it has been closed, or it has broken. */ public MBeanServerConnection getMBeanServerConnection( Subject delegationSubject) throws IOException; /** {@collect.stats} * <p>Closes the client connection to its server. Any ongoing or new * request using the MBeanServerConnection returned by {@link * #getMBeanServerConnection()} will get an * <code>IOException</code>.</p> * * <p>If <code>close</code> has already been called successfully * on this object, calling it again has no effect. If * <code>close</code> has never been called, or if it was called * but produced an exception, an attempt will be made to close the * connection. This attempt can succeed, in which case * <code>close</code> will return normally, or it can generate an * exception.</p> * * <p>Closing a connection is a potentially slow operation. For * example, if the server has crashed, the close operation might * have to wait for a network protocol timeout. Callers that do * not want to block in a close operation should do it in a * separate thread.</p> * * @exception IOException if the connection cannot be closed * cleanly. If this exception is thrown, it is not known whether * the server end of the connection has been cleanly closed. */ public void close() throws IOException; /** {@collect.stats} * <p>Adds a listener to be informed of changes in connection * status. The listener will receive notifications of type {@link * JMXConnectionNotification}. An implementation can send other * types of notifications too.</p> * * <p>Any number of listeners can be added with this method. The * same listener can be added more than once with the same or * different values for the filter and handback. There is no * special treatment of a duplicate entry. For example, if a * listener is registered twice with no filter, then its * <code>handleNotification</code> method will be called twice for * each notification.</p> * * @param listener a listener to receive connection status * notifications. * @param filter a filter to select which notifications are to be * delivered to the listener, or null if all notifications are to * be delivered. * @param handback an object to be given to the listener along * with each notification. Can be null. * * @exception NullPointerException if <code>listener</code> is * null. * * @see #removeConnectionNotificationListener * @see javax.management.NotificationBroadcaster#addNotificationListener */ public void addConnectionNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback); /** {@collect.stats} * <p>Removes a listener from the list to be informed of changes * in status. The listener must previously have been added. If * there is more than one matching listener, all are removed.</p> * * @param listener a listener to receive connection status * notifications. * * @exception NullPointerException if <code>listener</code> is * null. * * @exception ListenerNotFoundException if the listener is not * registered with this <code>JMXConnector</code>. * * @see #removeConnectionNotificationListener(NotificationListener, * NotificationFilter, Object) * @see #addConnectionNotificationListener * @see javax.management.NotificationEmitter#removeNotificationListener */ public void removeConnectionNotificationListener(NotificationListener listener) throws ListenerNotFoundException; /** {@collect.stats} * <p>Removes a listener from the list to be informed of changes * in status. The listener must previously have been added with * the same three parameters. If there is more than one matching * listener, only one is removed.</p> * * @param l a listener to receive connection status notifications. * @param f a filter to select which notifications are to be * delivered to the listener. Can be null. * @param handback an object to be given to the listener along * with each notification. Can be null. * * @exception ListenerNotFoundException if the listener is not * registered with this <code>JMXConnector</code>, or is not * registered with the given filter and handback. * * @see #removeConnectionNotificationListener(NotificationListener) * @see #addConnectionNotificationListener * @see javax.management.NotificationEmitter#removeNotificationListener */ public void removeConnectionNotificationListener(NotificationListener l, NotificationFilter f, Object handback) throws ListenerNotFoundException; /** {@collect.stats} * <p>Gets this connection's ID from the connector server. For a * given connector server, every connection will have a unique id * which does not change during the lifetime of the * connection.</p> * * @return the unique ID of this connection. This is the same as * the ID that the connector server includes in its {@link * JMXConnectionNotification}s. The {@link * javax.management.remote package description} describes the * conventions for connection IDs. * * @exception IOException if the connection ID cannot be obtained, * for instance because the connection is closed or broken. */ public String getConnectionId() throws IOException; }