usr/src/java/rad/org/opensolaris/os/rad/jmx/RadJMXConnector.java
author David Powell <David.Powell@sun.com>
Wed, 16 Dec 2009 19:06:12 -0800
changeset 401 fc1223edbd8d
parent 391 71abce159a62
child 433 e629b84699e3
permissions -rw-r--r--
13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave 13426 TLS transport auto-generates readable private keys 13429 file browsing API hard codes incorrect attributes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     1
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     2
 * CDDL HEADER START
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     3
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     7
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    11
 * and limitations under the License.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    12
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    18
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    19
 * CDDL HEADER END
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    20
 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    21
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    22
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    24
 * Use is subject to license terms.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    25
 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    26
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    27
package org.opensolaris.os.rad.jmx;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    28
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    29
import java.io.File;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    30
import java.io.IOException;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    31
import java.net.InetAddress;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    32
import java.net.MalformedURLException;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    33
import java.util.HashMap;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    34
import java.util.Map;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    35
import javax.management.ListenerNotFoundException;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    36
import javax.management.MBeanServerConnection;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    37
import javax.management.NotificationBroadcasterSupport;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    38
import javax.management.NotificationFilter;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    39
import javax.management.NotificationListener;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    40
import javax.management.remote.JMXConnectionNotification;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    41
import javax.management.remote.JMXConnector;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    42
import javax.management.remote.JMXServiceURL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    43
import javax.security.auth.Subject;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    44
import org.opensolaris.os.rad.Client;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    45
import org.opensolaris.os.rad.ClientFramer;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    46
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    47
public class RadJMXConnector implements JMXConnector
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    48
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    49
    private File path_ = null;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    50
    private String host_;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    51
    private int port_;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    52
    private boolean tls_;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    53
    private Map<String, ?> env_;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    54
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    55
    private Client client_ = null;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    56
    private boolean closed_ = false;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    57
    private MBeanServerConnection mbsc_ = null;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    58
    private NotificationBroadcasterSupport notify_ =
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    59
	new NotificationBroadcasterSupport();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    60
    private int serial_ = 0;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    61
401
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
    62
    RadJMXConnector(JMXServiceURL url, Map<String, ?> env, boolean usetls) {
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    63
	host_ = url.getHost();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    64
	port_ = url.getPort();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    65
	env_ = env;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    66
	tls_ = usetls;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    67
	if (port_ == 0)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    68
	    port_ = 12302;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    69
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    70
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    71
    RadJMXConnector(JMXServiceURL url, Map<String, ?> env)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    72
	throws MalformedURLException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    73
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    74
	path_ = new File(url.getURLPath());
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    75
	if (!path_.isAbsolute())
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    76
	    throw new MalformedURLException("Absolute path required");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    77
	env_ = env;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    78
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    79
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    80
    private void checkState(boolean connect) throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    81
	if (closed_)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    82
	    throw new IOException("Connection was closed.");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    83
	if (!connect && client_ == null)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    84
	    throw new IOException("Connection not established.");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    85
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    86
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    87
    public void connect() throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    88
	connect(env_);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    89
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    90
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    91
    public void connect(Map<String, ?> env) throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    92
	checkState(true);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    93
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    94
	if (env == null) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    95
	    env = env_;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    96
	} else if (env_ != null) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    97
	    Map<String, Object> t = new HashMap<String, Object>(env_);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    98
	    t.putAll(env);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    99
	    env = t;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   100
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   101
	ClientFramer framer = path_ != null ? new ClientFramer(path_) :
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   102
	    new ClientFramer(InetAddress.getByName(host_), port_, tls_, env);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   103
	client_ = new Client(framer);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   104
	notify_.sendNotification(new JMXConnectionNotification(
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   105
	    JMXConnectionNotification.OPENED, this, getConnectionId(),
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   106
	    ++serial_, null, null));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   107
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   108
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   109
    public MBeanServerConnection getMBeanServerConnection() throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   110
	checkState(false);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   111
	if (mbsc_ == null)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   112
	    mbsc_ = new RadMBeanServerConnection(client_);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   113
	return (mbsc_);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   114
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   115
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   116
    public MBeanServerConnection getMBeanServerConnection(
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   117
	Subject delegationSubject) throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   118
401
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
   119
	if (delegationSubject == null)
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
   120
	    return getMBeanServerConnection();
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
   121
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   122
	checkState(false);
401
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
   123
	throw new IOException("Subject delegation not supported");
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   124
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   125
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   126
    public void close() throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   127
	if (client_ == null)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   128
	    return;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   129
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   130
	String id = getConnectionId();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   131
	closed_ = true;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   132
	client_.close();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   133
	client_ = null;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   134
	mbsc_ = null;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   135
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   136
	notify_.sendNotification(new JMXConnectionNotification(
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   137
	    JMXConnectionNotification.CLOSED, this, id, ++serial_, null, null));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   138
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   139
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   140
    public void addConnectionNotificationListener(NotificationListener listener,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   141
	NotificationFilter filter, Object handback) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   142
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   143
	notify_.addNotificationListener(listener, filter, handback);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   144
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   145
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   146
    public void removeConnectionNotificationListener(
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   147
	NotificationListener listener) throws ListenerNotFoundException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   148
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   149
	notify_.removeNotificationListener(listener);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   150
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   151
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   152
    public void removeConnectionNotificationListener(NotificationListener l,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   153
	NotificationFilter f, Object handback) throws ListenerNotFoundException
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   154
    {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   155
	notify_.removeNotificationListener(l, f, handback);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   156
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   157
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   158
    public String getConnectionId() throws IOException {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   159
	checkState(false);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   160
	/* XXX */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   161
	return "service:jmx:rad://" + host_ + ":" + port_ + " " + "foo 1";
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   162
    }
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   163
}