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    import java.lang.reflect.Method;
024    
025    import javax.management.Descriptor;
026    import javax.management.modelmbean.ModelMBeanAttributeInfo;
027    
028    
029    /**
030     * <p>Internal configuration information for an <code>Attribute</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 AttributeInfo extends FeatureInfo implements Serializable {
038        static final long serialVersionUID = -2511626862303972143L;
039    
040        // ----------------------------------------------------- Instance Variables
041    
042    
043        /**
044         * The <code>ModelMBeanAttributeInfo</code> object that corresponds
045         * to this <code>AttributeInfo</code> instance.
046         */
047        protected transient ModelMBeanAttributeInfo info = null;
048        protected String displayName = null;
049        protected String getMethod = null;
050        protected String setMethod = null;
051    
052        protected transient Method getMethodObj = null;
053        protected transient Method setMethodObj = null;
054    
055        protected boolean readable = true;
056        protected boolean writeable = true;
057    
058        protected boolean is = false;
059        protected String type = null;
060    
061        protected String persist;
062        protected String defaultStringValue;
063        // ------------------------------------------------------------- Properties
064    
065    
066        /**
067         * Override the <code>description</code> property setter.
068         *
069         * @param description The new description
070         */
071        public void setDescription(String description) {
072            super.setDescription(description);
073            this.info = null;
074        }
075    
076        /**
077         * Override the <code>name</code> property setter.
078         *
079         * @param name The new name
080         */
081        public void setName(String name) {
082            super.setName(name);
083            this.info = null;
084        }
085    
086        /**
087         * The display name of this attribute.
088         */
089        public String getDisplayName() {
090            return (this.displayName);
091        }
092    
093        public void setDisplayName(String displayName) {
094            this.displayName = displayName;
095        }
096    
097        /**
098         * The name of the property getter method, if non-standard.
099         */
100        public String getGetMethod() {
101            return (this.getMethod);
102        }
103    
104        public void setGetMethod(String getMethod) {
105            this.getMethod = getMethod;
106            this.info = null;
107        }
108    
109        public Method getGetMethodObj() {
110            return getMethodObj;
111        }
112    
113        public void setGetMethodObj(Method getMethodObj) {
114            this.getMethodObj = getMethodObj;
115        }
116    
117        public Method getSetMethodObj() {
118            return setMethodObj;
119        }
120    
121        public void setSetMethodObj(Method setMethodObj) {
122            this.setMethodObj = setMethodObj;
123        }
124    
125        /**
126         * Is this a boolean attribute with an "is" getter?
127         */
128        public boolean isIs() {
129            return (this.is);
130        }
131    
132        public void setIs(boolean is) {
133            this.is = is;
134            this.info = null;
135        }
136    
137    
138        /**
139         * Is this attribute readable by management applications?
140         */
141        public boolean isReadable() {
142            return (this.readable);
143        }
144    
145        public void setReadable(boolean readable) {
146            this.readable = readable;
147            this.info = null;
148        }
149    
150    
151        /**
152         * The name of the property setter method, if non-standard.
153         */
154        public String getSetMethod() {
155            return (this.setMethod);
156        }
157    
158        public void setSetMethod(String setMethod) {
159            this.setMethod = setMethod;
160            this.info = null;
161        }
162    
163    
164        /**
165         * The fully qualified Java class name of this attribute.
166         */
167        public String getType() {
168            return (this.type);
169        }
170    
171        public void setType(String type) {
172            this.type = type;
173            this.info = null;
174        }
175    
176    
177        /**
178         * Is this attribute writeable by management applications?
179         */
180        public boolean isWriteable() {
181            return (this.writeable);
182        }
183    
184        public void setWriteable(boolean writeable) {
185            this.writeable = writeable;
186            this.info = null;
187        }
188    
189        /** Persistence policy.
190         * All persistent attributes should have this attribute set.
191         * Valid values:
192         *   ???
193         */
194        public String getPersist() {
195            return persist;
196        }
197    
198        public void setPersist(String persist) {
199            this.persist = persist;
200        }
201    
202        /** Default value. If set, it can provide info to the user and
203         * it can be used by persistence mechanism to generate a more compact
204         * representation ( a value may not be saved if it's default )
205         */
206        public String getDefault() {
207            return defaultStringValue;
208        }
209    
210        public void setDefault(String defaultStringValue) {
211            this.defaultStringValue = defaultStringValue;
212        }
213    
214    
215        // --------------------------------------------------------- Public Methods
216    
217    
218        /**
219         * Create and return a <code>ModelMBeanAttributeInfo</code> object that
220         * corresponds to the attribute described by this instance.
221         */
222        public ModelMBeanAttributeInfo createAttributeInfo() {
223            // Return our cached information (if any)
224            if (info != null)
225                return (info);
226            if((getMethodObj != null) || (setMethodObj != null) ) {
227                try {
228                    info=new ModelMBeanAttributeInfo(getName(), getDescription(),
229                                            getMethodObj,  setMethodObj);
230                    return info;
231                } catch( Exception ex) {
232                    ex.printStackTrace();
233                }
234            }
235    
236            // Create and return a new information object
237            info = new ModelMBeanAttributeInfo
238                (getName(), getType(), getDescription(),
239                 isReadable(), isWriteable(), false);
240            Descriptor descriptor = info.getDescriptor();
241            if (getDisplayName() != null)
242                descriptor.setField("displayName", getDisplayName());
243            if (isReadable()) {
244                if (getGetMethod() != null)
245                    descriptor.setField("getMethod", getGetMethod());
246                else
247                    descriptor.setField("getMethod",
248                                        getMethodName(getName(), true, isIs()));
249            }
250            if (isWriteable()) {
251                if (getSetMethod() != null)
252                    descriptor.setField("setMethod", getSetMethod());
253                else
254                    descriptor.setField("setMethod",
255                                        getMethodName(getName(), false, false));
256            }
257            addFields(descriptor);
258            info.setDescriptor(descriptor);
259            return (info);
260    
261        }
262    
263    
264        /**
265         * Return a string representation of this attribute descriptor.
266         */
267        public String toString() {
268    
269            StringBuffer sb = new StringBuffer("AttributeInfo[");
270            sb.append("name=");
271            sb.append(name);
272            sb.append(", description=");
273            sb.append(description);
274            if (!readable) {
275                sb.append(", readable=");
276                sb.append(readable);
277            }
278            sb.append(", type=");
279            sb.append(type);
280            if (!writeable) {
281                sb.append(", writeable=");
282                sb.append(writeable);
283            }
284            sb.append("]");
285            return (sb.toString());
286    
287        }
288    
289    
290        // -------------------------------------------------------- Private Methods
291    
292    
293        /**
294         * Create and return the name of a default property getter or setter
295         * method, according to the specified values.
296         *
297         * @param name Name of the property itself
298         * @param getter Do we want a get method (versus a set method)?
299         * @param is If returning a getter, do we want the "is" form?
300         */
301        private String getMethodName(String name, boolean getter, boolean is) {
302    
303            StringBuffer sb = new StringBuffer();
304            if (getter) {
305                if (is)
306                    sb.append("is");
307                else
308                    sb.append("get");
309            } else
310                sb.append("set");
311            sb.append(Character.toUpperCase(name.charAt(0)));
312            sb.append(name.substring(1));
313            return (sb.toString());
314    
315        }
316    
317    
318    }