ServerComponent.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:13k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * RHQ Management Platform
  3.  * Copyright (C) 2005-2008 Red Hat, Inc.
  4.  * All rights reserved.
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation version 2 of the License.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. package org.rhq.plugins.blacktie;
  20. import java.io.InputStream;
  21. import java.io.StringWriter;
  22. import java.util.List;
  23. import java.util.Properties;
  24. import java.util.Set;
  25. import javax.management.MBeanServerConnection;
  26. import javax.management.ObjectName;
  27. import javax.management.remote.JMXConnector;
  28. import javax.management.remote.JMXConnectorFactory;
  29. import javax.management.remote.JMXServiceURL;
  30. import javax.xml.transform.OutputKeys;
  31. import javax.xml.transform.Transformer;
  32. import javax.xml.transform.TransformerException;
  33. import javax.xml.transform.TransformerFactory;
  34. import javax.xml.transform.dom.DOMSource;
  35. import javax.xml.transform.stream.StreamResult;
  36. import org.apache.commons.logging.Log;
  37. import org.apache.commons.logging.LogFactory;
  38. import org.jboss.blacktie.jatmibroker.core.conf.XMLEnvHandler;
  39. import org.jboss.blacktie.jatmibroker.core.conf.XMLParser;
  40. import org.rhq.core.domain.configuration.Configuration;
  41. import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
  42. import org.rhq.core.domain.content.PackageType;
  43. import org.rhq.core.domain.content.transfer.DeployPackageStep;
  44. import org.rhq.core.domain.content.transfer.DeployPackagesResponse;
  45. import org.rhq.core.domain.content.transfer.RemovePackagesResponse;
  46. import org.rhq.core.domain.content.transfer.ResourcePackageDetails;
  47. import org.rhq.core.domain.measurement.AvailabilityType;
  48. import org.rhq.core.domain.measurement.MeasurementDataNumeric;
  49. import org.rhq.core.domain.measurement.MeasurementReport;
  50. import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
  51. import org.rhq.core.pluginapi.configuration.ConfigurationFacet;
  52. import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
  53. import org.rhq.core.pluginapi.content.ContentFacet;
  54. import org.rhq.core.pluginapi.content.ContentServices;
  55. import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet;
  56. import org.rhq.core.pluginapi.inventory.CreateResourceReport;
  57. import org.rhq.core.pluginapi.inventory.DeleteResourceFacet;
  58. import org.rhq.core.pluginapi.inventory.ResourceComponent;
  59. import org.rhq.core.pluginapi.inventory.ResourceContext;
  60. import org.rhq.core.pluginapi.measurement.MeasurementFacet;
  61. import org.rhq.core.pluginapi.operation.OperationFacet;
  62. import org.rhq.core.pluginapi.operation.OperationResult;
  63. import org.w3c.dom.Element;
  64. /**
  65.  * This can be the start of your own custom plugin's server component. Review
  66.  * the javadoc for {@link ResourceComponent} and all the facet interfaces to
  67.  * learn what you can do in your resource component. This component has a lot of
  68.  * methods in it because it implements all possible facets. If your resource
  69.  * does not support, for example, configuration, you can remove the
  70.  * {@link ConfigurationFacet} from the <code>implements</code> clause and remove
  71.  * all method implementations that that facet required.
  72.  * 
  73.  * <p>
  74.  * You should not only read the javadoc in each of this class' methods, but you
  75.  * should also read the javadocs linked by their "see" javadoc tags since those
  76.  * additional javadocs will contain a good deal of additional information you
  77.  * will need to know.
  78.  * </p>
  79.  * 
  80.  * @author John Mazzitelli
  81.  */
  82. public class ServerComponent implements ResourceComponent, MeasurementFacet,
  83. OperationFacet, ConfigurationFacet, ContentFacet, DeleteResourceFacet,
  84. CreateChildResourceFacet {
  85. private final Log log = LogFactory.getLog(ServerComponent.class);
  86. /**
  87.  * Represents the resource configuration of the custom product being
  88.  * managed.
  89.  */
  90. private Configuration resourceConfiguration;
  91. private ResourceContext resourceContext;
  92. private MBeanServerConnection beanServerConnection;
  93. private String serverName = null;
  94. private ObjectName blacktieAdmin = null;
  95. @SuppressWarnings("unchecked")
  96. private List getInstancesCount() throws Exception {
  97. List<Integer> ids = (List<Integer>)beanServerConnection.invoke(blacktieAdmin, 
  98. "listRunningInstanceIds",
  99. new Object[] { serverName }, 
  100. new String[] {"java.lang.String"});
  101. return ids;
  102. }
  103. /**
  104.  * This is called when your component has been started with the given
  105.  * context. You normally initialize some internal state of your component as
  106.  * well as attempt to make a stateful connection to your managed resource.
  107.  * 
  108.  * @see ResourceComponent#start(ResourceContext)
  109.  */
  110. public void start(ResourceContext context) {
  111. try {
  112. Properties prop = new Properties();
  113. XMLEnvHandler handler = new XMLEnvHandler(prop);
  114. XMLParser xmlenv = new XMLParser(handler, "btconfig.xsd");
  115. xmlenv.parse("btconfig.xml");
  116. JMXServiceURL u = new JMXServiceURL((String) prop.get("JMXURL"));
  117. JMXConnector c = JMXConnectorFactory.connect(u);
  118. beanServerConnection = c.getMBeanServerConnection();
  119. serverName = context.getResourceKey();;
  120. blacktieAdmin = new ObjectName("jboss.blacktie:service=Admin");
  121. } catch (Exception e) {
  122. log.error("start server " + serverName + " plugin error with " + e);
  123. }
  124. log.debug("start resource: " + serverName);
  125. }
  126. /**
  127.  * This is called when the component is being stopped, usually due to the
  128.  * plugin container shutting down. You can perform some cleanup here; though
  129.  * normally not much needs to be done here.
  130.  * 
  131.  * @see ResourceComponent#stop()
  132.  */
  133. public void stop() {
  134. }
  135. /**
  136.  * All resource components must be able to tell the plugin container if the
  137.  * managed resource is available or not. This method is called by the plugin
  138.  * container when it needs to know if the managed resource is actually up
  139.  * and available.
  140.  * 
  141.  * @see ResourceComponent#getAvailability()
  142.  */
  143. public AvailabilityType getAvailability() {
  144. int n = 0;
  145. try {
  146. n = getInstancesCount().size();
  147. } catch (Exception e) {
  148. }
  149. if (n > 0) {
  150. return AvailabilityType.UP;
  151. } else {
  152. return AvailabilityType.DOWN;
  153. }
  154. }
  155. /**
  156.  * The plugin container will call this method when your resource component
  157.  * has been scheduled to collect some measurements now. It is within this
  158.  * method that you actually talk to the managed resource and collect the
  159.  * measurement data that is has emitted.
  160.  * 
  161.  * @see MeasurementFacet#getValues(MeasurementReport, Set)
  162.  */
  163. public void getValues(MeasurementReport report,
  164. Set<MeasurementScheduleRequest> requests) {
  165. for (MeasurementScheduleRequest request : requests) {
  166. String name = request.getName();
  167. try {
  168. if (name.equals("instanceCount")) {
  169. int n = getInstancesCount().size();
  170. Number value = new Integer(n); // dummy measurement value -
  171. // this should come from the
  172. // managed resource
  173. report.addData(new MeasurementDataNumeric(request, value
  174. .doubleValue()));
  175. }
  176. } catch (Exception e) {
  177. log.error("Failed to obtain measurement [" + name
  178. + "]. Cause: " + e);
  179. }
  180. }
  181. return;
  182. }
  183. /**
  184.  * The plugin container will call this method when it wants to invoke an
  185.  * operation on your managed resource. Your plugin will connect to the
  186.  * managed resource and invoke the analogous operation in your own custom
  187.  * way.
  188.  * 
  189.  * @see OperationFacet#invokeOperation(String, Configuration)
  190.  */
  191. public OperationResult invokeOperation(String name, Configuration params) {
  192. OperationResult result = new OperationResult();
  193. int id = Integer.parseInt(params.getSimpleValue("id", "0"));
  194. if (name.equals("shutdown")) {
  195. try {
  196. beanServerConnection.invoke(blacktieAdmin, 
  197. "shutdown",
  198. new Object[] { serverName, id}, 
  199. new String[] {"java.lang.String", "int"});
  200. result.setSimpleResult("OK");
  201. } catch (Exception e) {
  202. log.error("call shutdown servers failed with " + e);
  203. result.setErrorMessage("call shutdown servers failed with " + e);
  204. }
  205. } else if (name.equals("listRunningInstanceIds")) {
  206. try {
  207. result.setSimpleResult(getInstancesCount().toString());
  208. } catch (Exception e) {
  209. log.error("call getInstancesCounter failed with " + e);
  210. result.setErrorMessage("call getInstancesCounter failed with " + e);
  211. }
  212. } else if(name.equals("getSoftwareVersion")) {
  213. try {
  214. String version = (String)beanServerConnection.invoke(blacktieAdmin, 
  215. "getServerVersionById",
  216. new Object[] { serverName, id}, 
  217. new String[] {"java.lang.String", "int"});
  218. result.setSimpleResult(version);
  219. } catch (Exception e) {
  220. log.error("call getServerVersionById failed with " + e);
  221. result.setErrorMessage("call getServerVersionById failed with " + e);
  222. }
  223. }
  224. return result;
  225. }
  226. /**
  227.  * The plugin container will call this method and it needs to obtain the
  228.  * current configuration of the managed resource. Your plugin will obtain
  229.  * the managed resource's configuration in your own custom way and populate
  230.  * the returned Configuration object with the managed resource's
  231.  * configuration property values.
  232.  * 
  233.  * @see ConfigurationFacet#loadResourceConfiguration()
  234.  */
  235. public Configuration loadResourceConfiguration() {
  236. // here we simulate the loading of the managed resource's configuration
  237. if (resourceConfiguration == null) {
  238. // for this example, we will create a simple dummy configuration to
  239. // start with.
  240. // note that it is empty, so we're assuming there are no required
  241. // configs in the plugin descriptor.
  242. resourceConfiguration = new Configuration();
  243. }
  244. Configuration config = resourceConfiguration;
  245. return config;
  246. }
  247. /**
  248.  * The plugin container will call this method when it has a new
  249.  * configuration for your managed resource. Your plugin will re-configure
  250.  * the managed resource in your own custom way, setting its configuration
  251.  * based on the new values of the given configuration.
  252.  * 
  253.  * @see ConfigurationFacet#updateResourceConfiguration(ConfigurationUpdateReport)
  254.  */
  255. public void updateResourceConfiguration(ConfigurationUpdateReport report) {
  256. // this simulates the plugin taking the new configuration and
  257. // reconfiguring the managed resource
  258. resourceConfiguration = report.getConfiguration().deepCopy();
  259. report.setStatus(ConfigurationUpdateStatus.SUCCESS);
  260. }
  261. /**
  262.  * When this is called, the plugin is responsible for scanning its managed
  263.  * resource and look for content that need to be managed for that resource.
  264.  * This method should only discover packages of the given package type.
  265.  * 
  266.  * @see ContentFacet#discoverDeployedPackages(PackageType)
  267.  */
  268. public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
  269. return null;
  270. }
  271. /**
  272.  * The plugin container calls this method when new packages need to be
  273.  * deployed/installed on resources.
  274.  * 
  275.  * @see ContentFacet#deployPackages(Set, ContentServices)
  276.  */
  277. public DeployPackagesResponse deployPackages(
  278. Set<ResourcePackageDetails> packages,
  279. ContentServices contentServices) {
  280. return null;
  281. }
  282. /**
  283.  * When a remote client wants to see the actual data content for an
  284.  * installed package, this method will be called. This method must return a
  285.  * stream of data containing the full content of the package.
  286.  * 
  287.  * @see ContentFacet#retrievePackageBits(ResourcePackageDetails)
  288.  */
  289. public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) {
  290. return null;
  291. }
  292. /**
  293.  * This is the method that is used when the component has to create the
  294.  * installation steps and their results.
  295.  * 
  296.  * @see ContentFacet#generateInstallationSteps(ResourcePackageDetails)
  297.  */
  298. public List<DeployPackageStep> generateInstallationSteps(
  299. ResourcePackageDetails packageDetails) {
  300. return null;
  301. }
  302. /**
  303.  * This is called when the actual content of packages should be deleted from
  304.  * the managed resource.
  305.  * 
  306.  * @see ContentFacet#removePackages(Set)
  307.  */
  308. public RemovePackagesResponse removePackages(
  309. Set<ResourcePackageDetails> packages) {
  310. return null;
  311. }
  312. /**
  313.  * When called, the plugin container is asking the plugin to create a new
  314.  * managed resource. The new resource's details need to be added to the
  315.  * given report.
  316.  * 
  317.  * @see CreateChildResourceFacet#createResource(CreateResourceReport)
  318.  */
  319. public CreateResourceReport createResource(CreateResourceReport report) {
  320. return null;
  321. }
  322. /**
  323.  * When called, the plugin container is asking the plugin to delete a
  324.  * managed resource.
  325.  * 
  326.  * @see DeleteResourceFacet#deleteResource()
  327.  */
  328. public void deleteResource() {
  329. }
  330. }