001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018
019 package org.apache.commons.modeler;
020
021
022 import java.io.Serializable;
023
024 import javax.management.Descriptor;
025 import javax.management.MBeanParameterInfo;
026 import javax.management.modelmbean.ModelMBeanOperationInfo;
027
028
029 /**
030 * <p>Internal configuration information for an <code>Operation</code>
031 * descriptor.</p>
032 *
033 * @author Craig R. McClanahan
034 * @version $Revision: 480402 $ $Date: 2006-11-29 05:43:23 +0100 (Wed, 29 Nov 2006) $
035 */
036
037 public class OperationInfo extends FeatureInfo implements Serializable {
038 static final long serialVersionUID = 4418342922072614875L;
039 // ----------------------------------------------------------- Constructors
040
041
042 /**
043 * Standard zero-arguments constructor.
044 */
045 public OperationInfo() {
046
047 super();
048
049 }
050
051
052 /**
053 * Special constructor for setting up getter and setter operations.
054 *
055 * @param name Name of this operation
056 * @param getter Is this a getter (as opposed to a setter)?
057 * @param type Data type of the return value (if this is a getter)
058 * or the parameter (if this is a setter)
059 *
060 */
061 public OperationInfo(String name, boolean getter, String type) {
062
063 super();
064 setName(name);
065 if (getter) {
066 setDescription("Attribute getter method");
067 setImpact("INFO");
068 setReturnType(type);
069 setRole("getter");
070 } else {
071 setDescription("Attribute setter method");
072 setImpact("ACTION");
073 setReturnType("void");
074 setRole("setter");
075 addParameter(new ParameterInfo("value", type,
076 "New attribute value"));
077 }
078
079 }
080
081
082 // ----------------------------------------------------- Instance Variables
083
084
085 /**
086 * The <code>ModelMBeanOperationInfo</code> object that corresponds
087 * to this <code>OperationInfo</code> instance.
088 */
089 transient ModelMBeanOperationInfo info = null;
090 protected String impact = "UNKNOWN";
091 protected String role = "operation";
092 protected String returnType = "void"; // FIXME - Validate
093 protected ParameterInfo parameters[] = new ParameterInfo[0];
094
095
096 // ------------------------------------------------------------- Properties
097
098
099 /**
100 * Override the <code>description</code> property setter.
101 *
102 * @param description The new description
103 */
104 public void setDescription(String description) {
105 super.setDescription(description);
106 this.info = null;
107 }
108
109
110 /**
111 * Override the <code>name</code> property setter.
112 *
113 * @param name The new name
114 */
115 public void setName(String name) {
116 super.setName(name);
117 this.info = null;
118 }
119
120
121 /**
122 * The "impact" of this operation, which should be a (case-insensitive)
123 * string value "ACTION", "ACTION_INFO", "INFO", or "UNKNOWN".
124 */
125 public String getImpact() {
126 return (this.impact);
127 }
128
129 public void setImpact(String impact) {
130 if (impact == null)
131 this.impact = null;
132 else
133 this.impact = impact.toUpperCase();
134 }
135
136
137 /**
138 * The role of this operation ("getter", "setter", "operation", or
139 * "constructor").
140 */
141 public String getRole() {
142 return (this.role);
143 }
144
145 public void setRole(String role) {
146 this.role = role;
147 }
148
149
150 /**
151 * The fully qualified Java class name of the return type for this
152 * operation.
153 */
154 public String getReturnType() {
155 return (this.returnType);
156 }
157
158 public void setReturnType(String returnType) {
159 this.returnType = returnType;
160 }
161
162 /**
163 * The set of parameters for this operation.
164 */
165 public ParameterInfo[] getSignature() {
166 return (this.parameters);
167 }
168
169 // --------------------------------------------------------- Public Methods
170
171
172 /**
173 * Add a new parameter to the set of arguments for this operation.
174 *
175 * @param parameter The new parameter descriptor
176 */
177 public void addParameter(ParameterInfo parameter) {
178
179 synchronized (parameters) {
180 ParameterInfo results[] = new ParameterInfo[parameters.length + 1];
181 System.arraycopy(parameters, 0, results, 0, parameters.length);
182 results[parameters.length] = parameter;
183 parameters = results;
184 this.info = null;
185 }
186
187 }
188
189
190 /**
191 * Create and return a <code>ModelMBeanOperationInfo</code> object that
192 * corresponds to the attribute described by this instance.
193 */
194 public ModelMBeanOperationInfo createOperationInfo() {
195
196 // Return our cached information (if any)
197 if (info != null)
198 return (info);
199
200 // Create and return a new information object
201 ParameterInfo params[] = getSignature();
202 MBeanParameterInfo parameters[] =
203 new MBeanParameterInfo[params.length];
204 for (int i = 0; i < params.length; i++)
205 parameters[i] = params[i].createParameterInfo();
206 int impact = ModelMBeanOperationInfo.UNKNOWN;
207 if ("ACTION".equals(getImpact()))
208 impact = ModelMBeanOperationInfo.ACTION;
209 else if ("ACTION_INFO".equals(getImpact()))
210 impact = ModelMBeanOperationInfo.ACTION_INFO;
211 else if ("INFO".equals(getImpact()))
212 impact = ModelMBeanOperationInfo.INFO;
213
214 info = new ModelMBeanOperationInfo
215 (getName(), getDescription(), parameters,
216 getReturnType(), impact);
217 Descriptor descriptor = info.getDescriptor();
218 descriptor.removeField("class");
219 descriptor.setField("role", getRole());
220 addFields(descriptor);
221 info.setDescriptor(descriptor);
222 return (info);
223
224 }
225
226
227 /**
228 * Return a string representation of this operation descriptor.
229 */
230 public String toString() {
231
232 StringBuffer sb = new StringBuffer("OperationInfo[");
233 sb.append("name=");
234 sb.append(name);
235 sb.append(", description=");
236 sb.append(description);
237 sb.append(", returnType=");
238 sb.append(returnType);
239 sb.append(", parameters=");
240 sb.append(parameters.length);
241 sb.append("]");
242 return (sb.toString());
243
244 }
245
246
247 }