1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18
19 package org.apache.catalina.ant.jmx;
20
21
22 import javax.management.Attribute;
23 import javax.management.MBeanAttributeInfo;
24 import javax.management.MBeanInfo;
25 import javax.management.MBeanServerConnection;
26 import javax.management.ObjectName;
27
28 import org.apache.tools.ant.BuildException;
29
30
31 /**
32 * Access <em>JMX</em> JSR 160 MBeans Server.
33 * <ul>
34 * <li>Get Mbeans attributes</li>
35 * <li>Show Get result as Ant console log</li>
36 * <li>Bind Get result as Ant properties</li>
37 * </ul>
38 * <p>
39 * Examples:
40 * Set a Mbean Manager attribute maxActiveSessions.
41 * Set this attribute with fresh jmx connection without save reference
42 * <pre>
43 * <jmx:set
44 * host="127.0.0.1"
45 * port="9014"
46 * ref=""
47 * name="Catalina:type=Manager,path="/ClusterTest",host=localhost"
48 * attribute="maxActiveSessions"
49 * value="100"
50 * type="int"
51 * echo="false">
52 * />
53 * </pre>
54 * </p>
55 * <p>
56 * First call to a remote MBeanserver save the JMXConnection a referenz <em>jmx.server</em>
57 * </p>
58 * These tasks require Ant 1.6 or later interface.
59 *
60 * @author Peter Rossbach
61 * @version $Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (mar., 24 oct. 2006) $
62 * @since 5.5.10
63 */
64
65 public class JMXAccessorSetTask extends JMXAccessorTask {
66
67 // ----------------------------------------------------- Instance Variables
68
69 private String attribute;
70 private String value;
71 private String type;
72 private boolean convert = false ;
73
74 // ----------------------------------------------------- Instance Info
75
76 /**
77 * Descriptive information describing this implementation.
78 */
79 private static final String info = "org.apache.catalina.ant.JMXAccessorSetTask/1.0";
80
81 /**
82 * Return descriptive information about this implementation and the
83 * corresponding version number, in the format
84 * <code><description>/<version></code>.
85 */
86 public String getInfo() {
87
88 return (info);
89
90 }
91
92 // ------------------------------------------------------------- Properties
93
94 /**
95 * @return Returns the attribute.
96 */
97 public String getAttribute() {
98 return attribute;
99 }
100
101 /**
102 * @param attribute The attribute to set.
103 */
104 public void setAttribute(String attribute) {
105 this.attribute = attribute;
106 }
107
108 /**
109 * @return Returns the value.
110 */
111 public String getValue() {
112 return value;
113 }
114 /**
115 * @param value The value to set.
116 */
117 public void setValue(String value) {
118 this.value = value;
119 }
120
121
122 /**
123 * @return Returns the type.
124 */
125 public String getType() {
126 return type;
127 }
128
129 /**
130 * @param valueType The type to set.
131 */
132 public void setType(String valueType) {
133 this.type = valueType;
134 }
135
136
137 /**
138 * @return Returns the convert.
139 */
140 public boolean isConvert() {
141 return convert;
142 }
143 /**
144 * @param convert The convert to set.
145 */
146 public void setConvert(boolean convert) {
147 this.convert = convert;
148 }
149 // ------------------------------------------------------ protected Methods
150
151 /**
152 * Execute the specified command, based on the configured properties. The
153 * input stream will be closed upon completion of this task, whether it was
154 * executed successfully or not.
155 *
156 * @exception Exception
157 * if an error occurs
158 */
159 public String jmxExecute(MBeanServerConnection jmxServerConnection)
160 throws Exception {
161
162 if (getName() == null) {
163 throw new BuildException("Must specify a 'name'");
164 }
165 if ((attribute == null || value == null)) {
166 throw new BuildException(
167 "Must specify a 'attribute' and 'value' for set");
168 }
169 return jmxSet(jmxServerConnection, getName());
170 }
171
172 /**
173 * @param jmxServerConnection
174 * @param name
175 * @throws Exception
176 */
177 protected String jmxSet(MBeanServerConnection jmxServerConnection,
178 String name) throws Exception {
179 Object realValue;
180 if (type != null) {
181 realValue = convertStringToType(value, type);
182 } else {
183 if (isConvert()) {
184 String mType = getMBeanAttributeType(jmxServerConnection, name,
185 attribute);
186 realValue = convertStringToType(value, mType);
187 } else
188 realValue = value;
189 }
190 jmxServerConnection.setAttribute(new ObjectName(name), new Attribute(
191 attribute, realValue));
192 return null;
193 }
194
195
196
197 /**
198 * Get MBean Attriute from Mbean Server
199 * @param jmxServerConnection
200 * @param name
201 * @param attribute
202 * @return The type
203 * @throws Exception
204 */
205 protected String getMBeanAttributeType(
206 MBeanServerConnection jmxServerConnection,
207 String name,
208 String attribute) throws Exception {
209 ObjectName oname = new ObjectName(name);
210 String mattrType = null;
211 MBeanInfo minfo = jmxServerConnection.getMBeanInfo(oname);
212 MBeanAttributeInfo attrs[] = minfo.getAttributes();
213 if (attrs != null) {
214 for (int i = 0; mattrType == null && i < attrs.length; i++) {
215 if (attribute.equals(attrs[i].getName()))
216 mattrType = attrs[i].getType();
217 }
218 }
219 return mattrType;
220 }
221 }