001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.farm.config;
021
022 import java.io.IOException;
023 import java.util.HashMap;
024 import java.util.Map;
025
026 import javax.management.MBeanServerConnection;
027 import javax.management.remote.JMXConnector;
028 import javax.management.remote.JMXConnectorFactory;
029 import javax.management.remote.JMXServiceURL;
030
031 import org.apache.geronimo.gbean.GBeanInfo;
032 import org.apache.geronimo.gbean.GBeanInfoBuilder;
033 import org.apache.geronimo.kernel.Kernel;
034 import org.apache.geronimo.system.jmx.KernelDelegate;
035
036 /**
037 *
038 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
039 */
040 public class BasicNodeInfo implements NodeInfo {
041 private final String name;
042 private final ExtendedJMXConnectorInfo connectorInfo;
043 private final Kernel kernel;
044
045 public BasicNodeInfo(Kernel kernel, String name, ExtendedJMXConnectorInfo connectorInfo) {
046 if (null == kernel) {
047 throw new IllegalArgumentException("kernel is required");
048 } else if (null == name) {
049 throw new IllegalArgumentException("name is required");
050 } else if (null == connectorInfo) {
051 throw new IllegalArgumentException("connectorInfo is required");
052 }
053 this.kernel = kernel;
054 this.name = name;
055 this.connectorInfo = connectorInfo;
056 }
057
058 public String getName() {
059 return name;
060 }
061
062 public ExtendedJMXConnectorInfo getConnectorInfo() {
063 return connectorInfo;
064 }
065
066 public Kernel newKernel() throws IOException {
067 if (connectorInfo.isLocal()) {
068 return kernel;
069 }
070
071 String url = "service:jmx:rmi://" + connectorInfo.getHost() + "/jndi/"
072 + connectorInfo.getProtocol() + "://" + connectorInfo.getHost() + ":"
073 + connectorInfo.getPort() + "/" + connectorInfo.getUrlPath();
074
075 Map environment = new HashMap();
076 environment.put("jmx.remote.credentials",
077 new String[] {connectorInfo.getUsername(), connectorInfo.getPassword()});
078
079 return newKernel(url, environment);
080 }
081
082 protected Kernel newKernel(String url, Map environment) throws IOException {
083 JMXConnector jmxConnector = JMXConnectorFactory.connect(new JMXServiceURL(url), environment);
084 MBeanServerConnection mbServerConnection = jmxConnector.getMBeanServerConnection();
085 return new KernelDelegate(mbServerConnection);
086 }
087
088 public static final GBeanInfo GBEAN_INFO;
089
090 public static final String GBEAN_J2EE_TYPE = "NodeInfo";
091 public static final String GBEAN_ATTR_KERNEL = "kernel";
092 public static final String GBEAN_ATTR_NODE_NAME = "name";
093 public static final String GBEAN_ATTR_EXT_JMX_CONN_INFO = "extendedJMXConnectorInfo";
094 static {
095 GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(BasicNodeInfo.class, GBEAN_J2EE_TYPE);
096
097 builder.addAttribute(GBEAN_ATTR_KERNEL, Kernel.class, false);
098 builder.addAttribute(GBEAN_ATTR_NODE_NAME, String.class, true);
099 builder.addAttribute(GBEAN_ATTR_EXT_JMX_CONN_INFO, ExtendedJMXConnectorInfo.class, true);
100
101 builder.addInterface(NodeInfo.class);
102
103 builder.setConstructor(new String[]{GBEAN_ATTR_KERNEL,
104 GBEAN_ATTR_NODE_NAME,
105 GBEAN_ATTR_EXT_JMX_CONN_INFO});
106
107 GBEAN_INFO = builder.getBeanInfo();
108 }
109
110 public static GBeanInfo getGBeanInfo() {
111 return GBEAN_INFO;
112 }
113
114 }