1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
  5. * reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. *
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. *
  19. * 3. The end-user documentation included with the redistribution, if
  20. * any, must include the following acknowlegement:
  21. * "This product includes software developed by the
  22. * Apache Software Foundation (http://www.apache.org/)."
  23. * Alternately, this acknowlegement may appear in the software itself,
  24. * if and wherever such third-party acknowlegements normally appear.
  25. *
  26. * 4. The names "The Jakarta Project", "Ant", and "Apache Software
  27. * Foundation" must not be used to endorse or promote products derived
  28. * from this software without prior written permission. For written
  29. * permission, please contact apache@apache.org.
  30. *
  31. * 5. Products derived from this software may not be called "Apache"
  32. * nor may "Apache" appear in their names without prior written
  33. * permission of the Apache Group.
  34. *
  35. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46. * SUCH DAMAGE.
  47. * ====================================================================
  48. *
  49. * This software consists of voluntary contributions made by many
  50. * individuals on behalf of the Apache Software Foundation. For more
  51. * information on the Apache Software Foundation, please see
  52. * <http://www.apache.org/>.
  53. */
  54. package org.apache.commons.modeler.ant;
  55. import java.net.URL;
  56. import java.util.ArrayList;
  57. import java.util.List;
  58. import javax.management.JMException;
  59. import javax.management.MBeanServer;
  60. import javax.management.MBeanServerFactory;
  61. import javax.management.ObjectName;
  62. import javax.management.loading.MLet;
  63. import org.apache.commons.logging.Log;
  64. import org.apache.commons.logging.LogFactory;
  65. import org.apache.tools.ant.BuildException;
  66. import org.apache.tools.ant.Task;
  67. /**
  68. * Load an MBean. The syntax is similar with the <mlet>, with few
  69. * ant-specific extensions.
  70. *
  71. * A separate classloader can be used, the mechanism is similar with
  72. * what taskdef is using.
  73. *
  74. * Note that mlet will use the arguments in the constructor.
  75. *
  76. *
  77. */
  78. public class MLETTask extends Task {
  79. private static Log log = LogFactory.getLog(MLETTask.class);
  80. String code;
  81. String archive;
  82. String codebase;
  83. String objectName;
  84. ObjectName oname;
  85. List args=new ArrayList();
  86. List attributes=new ArrayList();
  87. // ant specific
  88. String loaderRef; // class loader ref
  89. public MLETTask() {
  90. }
  91. public void addArg(Arg arg ) {
  92. args.add(arg);
  93. }
  94. public void addAttribute( JmxSet arg ) {
  95. attributes.add( arg );
  96. }
  97. public void setCode(String code) {
  98. this.code = code;
  99. }
  100. public void setArchive(String archive) {
  101. this.archive = archive;
  102. }
  103. public void setCodebase(String codebase) {
  104. this.codebase = codebase;
  105. }
  106. public void setName(String name) {
  107. this.objectName = name;
  108. }
  109. MBeanServer server;
  110. public MBeanServer getMBeanServer() {
  111. if( server!= null ) return server;
  112. server=(MBeanServer)project.getReference("jmx.server");
  113. if (server != null) return server;
  114. try {
  115. if( MBeanServerFactory.findMBeanServer(null).size() > 0 ) {
  116. server=(MBeanServer)MBeanServerFactory.findMBeanServer(null).get(0);
  117. } else {
  118. server=MBeanServerFactory.createMBeanServer();
  119. // Register a loader that will be find ant classes.
  120. ObjectName defaultLoader= new ObjectName("modeler-ant",
  121. "loader", "ant");
  122. MLet mlet=new MLet( new URL[0], this.getClass().getClassLoader());
  123. server.registerMBean(mlet, defaultLoader);
  124. if( log.isDebugEnabled())
  125. log.debug("Creating mbean server and loader "+ mlet +
  126. " " + this.getClass().getClassLoader());
  127. }
  128. project.addReference("jmx.server", server);
  129. // Create the MLet object
  130. } catch( JMException ex ) {
  131. log.error("Error creating server", ex);
  132. }
  133. if( log.isDebugEnabled()) log.debug("Using Mserver " + server );
  134. return server;
  135. }
  136. boolean modeler=false;
  137. public void setModeler(boolean modeler) {
  138. this.modeler = modeler;
  139. }
  140. protected void bindJmx(String objectName, String code,
  141. String arg0, List args)
  142. throws Exception
  143. {
  144. MBeanServer server=getMBeanServer();
  145. oname=new ObjectName( objectName );
  146. if( modeler ) {
  147. Arg codeArg=new Arg();
  148. codeArg.setType("java.lang.String");
  149. codeArg.setValue( code );
  150. if( args==null) args=new ArrayList();
  151. args.add(0, codeArg);
  152. code="org.apache.commons.modeler.BaseModelMBean";
  153. }
  154. Object argsA[]=new Object[ args.size()];
  155. String sigA[]=new String[args.size()];
  156. for( int i=0; i<args.size(); i++ ) {
  157. Arg arg=(Arg)args.get(i);
  158. if( arg.type==null )
  159. arg.type="java.lang.String";
  160. sigA[i]=arg.getType();
  161. argsA[i]=arg.getValue();
  162. // XXX Deal with not string types - IntrospectionUtils
  163. }
  164. // XXX Use the loader ref, if any
  165. if( args.size()==0 ) {
  166. server.createMBean(code, oname);
  167. } else {
  168. server.createMBean(code, oname, argsA, sigA );
  169. }
  170. log.debug( "Created MBEAN " + oname + " " + code);
  171. }
  172. public ObjectName getObjectName() {
  173. return oname;
  174. }
  175. public void execute() throws BuildException {
  176. try {
  177. // create the mbean
  178. bindJmx( objectName, code, null, args);
  179. // process attributes
  180. for( int i=0; i<attributes.size(); i++ ) {
  181. JmxSet att=(JmxSet)attributes.get(i);
  182. att.setObjectName( oname );
  183. log.info("Setting attribute " + oname + " " + att.getName());
  184. att.execute();
  185. }
  186. } catch(Exception ex) {
  187. log.error("Can't create mbean " + objectName, ex);
  188. }
  189. }
  190. }