KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > jmeter > testbeans > TestBean


1 // $Header: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/TestBean.java,v 1.9.2.1 2004/10/13 00:38:39 sebb Exp $
2
/*
3  * Copyright 2004 The Apache Software Foundation.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * 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 package org.apache.jmeter.testbeans;
18
19 import java.beans.BeanInfo JavaDoc;
20 import java.beans.IntrospectionException JavaDoc;
21 import java.beans.Introspector JavaDoc;
22 import java.beans.PropertyDescriptor JavaDoc;
23 import java.lang.reflect.InvocationTargetException JavaDoc;
24 import java.lang.reflect.Method JavaDoc;
25 import java.util.HashMap JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.Map JavaDoc;
28
29 import org.apache.jmeter.control.NextIsNullException;
30 import org.apache.jmeter.samplers.Sampler;
31 import org.apache.jmeter.testelement.AbstractTestElement;
32 import org.apache.jmeter.testelement.TestElement;
33 import org.apache.jmeter.testelement.TestElementTraverser;
34 import org.apache.jmeter.testelement.property.CollectionProperty;
35 import org.apache.jmeter.testelement.property.JMeterProperty;
36 import org.apache.jmeter.testelement.property.MapProperty;
37 import org.apache.jmeter.testelement.property.NullProperty;
38 import org.apache.jmeter.testelement.property.PropertyIterator;
39 import org.apache.jorphan.logging.LoggingManager;
40 import org.apache.jorphan.util.JOrphanUtils;
41 import org.apache.log.Logger;
42
43 /**
44  * This is an experimental class. An attempt to address the complexity of
45  * writing new JMeter components.
46  * <p>
47  * TestBean currently extends AbstractTestElement to support
48  * backward-compatibility, but the property-value-map may later on be
49  * separated from the test beans themselves. To ensure this will be doable
50  * with minimum damage, all inherited methods are deprecated.
51  *
52  * @author <a HREF="mailto:jsalvata@apache.org">Jordi Salvat i Alabart</a>
53  * @version $Revision: 1.9.2.1 $ updated on $Date: 2004/10/13 00:38:39 $
54  */

55 public abstract class TestBean extends AbstractTestElement
56 {
57     private static final Logger log = LoggingManager.getLoggerForClass();
58
59     /**
60      * Property name to property descriptor method map.
61      */

62     private transient Map JavaDoc descriptors;
63
64     /**
65      * Parameter-less constructor.
66      * <p>
67      * This implementation will take care of obtaining bean-management
68      * information if this was not already done.
69      */

70     protected TestBean()
71     {
72         super();
73         
74         try
75         {
76             // Obtain the property descriptors:
77
BeanInfo JavaDoc beanInfo= Introspector.getBeanInfo(this.getClass());
78             PropertyDescriptor JavaDoc[] desc= beanInfo.getPropertyDescriptors();
79             descriptors= new HashMap JavaDoc();
80             for (int i=0; i<desc.length; i++)
81             {
82                 descriptors.put(desc[i].getName(), desc[i]);
83             }
84         }
85         catch (IntrospectionException JavaDoc e)
86         {
87             log.error("Can't get beanInfo for "+this.getClass().getName(),
88                 e);
89             throw new Error JavaDoc(e.toString()); // Programming error. Don't continue.
90
}
91     }
92
93     /**
94      * Prepare the bean for work by populating the bean's properties from the
95      * property value map.
96      * <p>
97      * @deprecated to limit it's usage in expectation of moving it elsewhere.
98      */

99     public void prepare()
100     {
101         Object JavaDoc[] param= new Object JavaDoc[1];
102         
103         if (log.isDebugEnabled()) log.debug("Preparing "+this.getClass());
104         
105         for (PropertyIterator jprops= propertyIterator(); jprops.hasNext(); )
106         {
107             // Obtain a value of the appropriate type for this property.
108
JMeterProperty jprop= jprops.next();
109             PropertyDescriptor JavaDoc descriptor= (PropertyDescriptor JavaDoc)descriptors.get(jprop.getName());
110
111             if (descriptor == null)
112             {
113                 if (log.isDebugEnabled())
114                 {
115                     log.debug("Ignoring auxiliary property "+jprop.getName());
116                 }
117                 continue;
118             }
119
120             Class JavaDoc type= descriptor.getPropertyType();
121             Object JavaDoc value= unwrapProperty(jprop, type);
122             
123             if (log.isDebugEnabled()) log.debug("Setting "+jprop.getName()+"="+value);
124
125             // Set the bean's property to the value we just obtained:
126
if (value != null || !type.isPrimitive())
127                 // We can't assign null to primitive types.
128
{
129                 param[0]= value;
130                 invokeOrBailOut(descriptor.getWriteMethod(), param);
131             }
132         }
133     }
134     
135     /**
136      * Utility method that invokes a method and does the error handling
137      * around the invocation.
138      *
139      * @param method
140      * @param params
141      * @return the result of the method invocation.
142      */

143     private Object JavaDoc invokeOrBailOut(Method JavaDoc method, Object JavaDoc[] params)
144     {
145         try
146         {
147                  return method.invoke(this, params);
148         }
149         catch (IllegalArgumentException JavaDoc e)
150         {
151             log.error("This should never happen.", e);
152             throw new Error JavaDoc(e.toString()); // Programming error: bail out.
153
}
154         catch (IllegalAccessException JavaDoc e)
155         {
156             log.error("This should never happen.", e);
157             throw new Error JavaDoc(e.toString()); // Programming error: bail out.
158
}
159         catch (InvocationTargetException JavaDoc e)
160         {
161             log.error("This should never happen.", e);
162             throw new Error JavaDoc(e.toString()); // Programming error: bail out.
163
}
164     }
165
166     /**
167      * Utility method to obtain the value of a property in the given type.
168      * <p>
169      * I plan to get rid of this sooner than later, so please don't use it much.
170      *
171      * @param property Property to get the value of.
172      * @param type Type of the result.
173      * @return an object of the given type if it is one of the known supported
174      * types, or the value returned by property.getObjectValue
175      * @deprecated
176      */

177     private static Object JavaDoc unwrapProperty(JMeterProperty property, Class JavaDoc type)
178     {
179         // TODO: Awful, but there will be time to improve... maybe using
180
// property editors? Or just having each property know its
181
// proper type? Or pre-building a type-to-valuegetter map?
182
// Or maybe just getting rid of all this property mess and storing
183
// the original objects instead?
184

185         Object JavaDoc value;
186         if (property instanceof NullProperty)
187         {
188             // Because we work through primitive types, we need to handle
189
// the null case differently.
190
value= null;
191         }
192         else if (type == boolean.class || type == Boolean JavaDoc.class)
193         {
194             value= JOrphanUtils.valueOf(property.getBooleanValue());//JDK1.4:
195
}
196         else if (type == double.class || type == Double JavaDoc.class)
197         {
198             value= new Double JavaDoc(property.getDoubleValue());
199         }
200         else if (type == float.class || type == Float JavaDoc.class)
201         {
202             value= new Float JavaDoc(property.getFloatValue());
203         }
204         else if (type == int.class || type == Integer JavaDoc.class)
205         {
206             value= new Integer JavaDoc(property.getIntValue());
207         }
208         else if (type == long.class || type == Long JavaDoc.class)
209         {
210             value= new Long JavaDoc(property.getLongValue());
211         }
212         else if (type == String JavaDoc.class)
213         {
214             value= property.getStringValue();
215         }
216         else
217         {
218             value= property.getObjectValue();
219         }
220         
221         return value;
222     }
223
224     /*
225      * ---------------------------------------------------------------------
226      * All AbstractTestElement methods overriden just to mark them deprecate.
227      * ---------------------------------------------------------------------
228      */

229      
230     /**
231      * @see org.apache.jmeter.testelement.AbstractTestElement#addProperty(org.apache.jmeter.testelement.property.JMeterProperty)
232      * @deprecated
233      */

234     protected void addProperty(JMeterProperty property)
235     {
236         super.addProperty(property);
237     }
238
239     /**
240      * @see org.apache.jmeter.testelement.TestElement#addTestElement(org.apache.jmeter.testelement.TestElement)
241      * @deprecated
242      */

243     public void addTestElement(TestElement el)
244     {
245         // Scan all properties for a writable property of the appropriate type:
246
for (Iterator JavaDoc descs= descriptors.values().iterator();
247             descs.hasNext(); )
248         {
249             PropertyDescriptor JavaDoc desc= (PropertyDescriptor JavaDoc)descs.next();
250             if (desc.getPropertyType().isInstance(el)
251                 && desc.getPropertyEditorClass() == null)
252                             // Note we ignore those for which we have an editor,
253
// in assumption that they are already provided via
254
// the GUI. Not very nice, but it's a solution.
255
// TODO: find a nicer way to specify which TestElement
256
// properties should be in the GUI and which should come
257
// from the tree structure.
258
{
259                 invokeOrBailOut(desc.getWriteMethod(), new Object JavaDoc[] { el });
260                 return; // We're done
261
}
262         }
263         // If we found no property for this one...
264
super.addTestElement(el);
265     }
266
267     /**
268      * @see org.apache.jmeter.testelement.TestElement#clear()
269      * @deprecated
270      */

271     public void clear()
272     {
273         super.clear();
274     }
275
276     /**
277      * @see org.apache.jmeter.testelement.AbstractTestElement#clearTemporary(org.apache.jmeter.testelement.property.JMeterProperty)
278      * @deprecated
279      */

280     protected void clearTemporary(JMeterProperty property)
281     {
282         super.clearTemporary(property);
283     }
284
285     /**
286      * @see java.lang.Object#clone()
287      * @deprecated
288      */

289     public Object JavaDoc clone()
290     {
291         return super.clone();
292     }
293
294     /**
295      * @see org.apache.jmeter.testelement.AbstractTestElement#emptyTemporary()
296      * @deprecated
297      */

298     protected void emptyTemporary()
299     {
300         super.emptyTemporary();
301     }
302
303     /**
304      * @see java.lang.Object#equals(java.lang.Object)
305      * @deprecated
306      */

307     public boolean equals(Object JavaDoc o)
308     {
309         return super.equals(o);
310     }
311
312     /**
313      * This one is NOT deprecated.
314      *
315      * @see org.apache.jmeter.testelement.AbstractTestElement#getName()
316      */

317     public String JavaDoc getName()
318     {
319         return super.getName();
320     }
321
322     /**
323      * @see org.apache.jmeter.testelement.TestElement#getProperty(java.lang.String)
324      * @deprecated
325      */

326     public JMeterProperty getProperty(String JavaDoc key)
327     {
328         return super.getProperty(key);
329     }
330
331     /**
332      * @see org.apache.jmeter.testelement.AbstractTestElement#getPropertyAsBoolean(java.lang.String, boolean)
333      * @deprecated
334      */

335     public boolean getPropertyAsBoolean(String JavaDoc key, boolean defaultVal)
336     {
337         return super.getPropertyAsBoolean(key, defaultVal);
338     }
339
340     /**
341      * @see org.apache.jmeter.testelement.TestElement#getPropertyAsBoolean(java.lang.String)
342      * @deprecated
343      */

344     public boolean getPropertyAsBoolean(String JavaDoc key)
345     {
346         return super.getPropertyAsBoolean(key);
347     }
348
349     /**
350      * @see org.apache.jmeter.testelement.AbstractTestElement#getPropertyAsDouble(java.lang.String)
351      * @deprecated
352      */

353     public double getPropertyAsDouble(String JavaDoc key)
354     {
355         return super.getPropertyAsDouble(key);
356     }
357
358     /**
359      * @see org.apache.jmeter.testelement.TestElement#getPropertyAsFloat(java.lang.String)
360      * @deprecated
361      */

362     public float getPropertyAsFloat(String JavaDoc key)
363     {
364         return super.getPropertyAsFloat(key);
365     }
366
367     /**
368      * @see org.apache.jmeter.testelement.TestElement#getPropertyAsInt(java.lang.String)
369      * @deprecated
370      */

371     public int getPropertyAsInt(String JavaDoc key)
372     {
373         return super.getPropertyAsInt(key);
374     }
375
376     /**
377      * @see org.apache.jmeter.testelement.TestElement#getPropertyAsLong(java.lang.String)
378      * @deprecated
379      */

380     public long getPropertyAsLong(String JavaDoc key)
381     {
382         return super.getPropertyAsLong(key);
383     }
384
385     /**
386      * @see org.apache.jmeter.testelement.TestElement#getPropertyAsString(java.lang.String)
387      * @deprecated
388      */

389     public String JavaDoc getPropertyAsString(String JavaDoc key)
390     {
391         return super.getPropertyAsString(key);
392     }
393
394     /**
395      * @see org.apache.jmeter.testelement.TestElement#isRunningVersion()
396      * @deprecated
397      */

398     public boolean isRunningVersion()
399     {
400         return super.isRunningVersion();
401     }
402
403     /**
404      * @see org.apache.jmeter.testelement.TestElement#isTemporary(org.apache.jmeter.testelement.property.JMeterProperty)
405      * @deprecated
406      */

407     public boolean isTemporary(JMeterProperty property)
408     {
409         return super.isTemporary(property);
410     }
411
412     /**
413      * @see org.apache.jmeter.testelement.AbstractTestElement#logProperties()
414      * @deprecated
415      */

416     protected void logProperties()
417     {
418         super.logProperties();
419     }
420
421     /**
422      * @see org.apache.jmeter.testelement.AbstractTestElement#mergeIn(org.apache.jmeter.testelement.TestElement)
423      * @deprecated
424      */

425     protected void mergeIn(TestElement element)
426     {
427         super.mergeIn(element);
428     }
429
430     /**
431      * @see org.apache.jmeter.testelement.AbstractTestElement#nextIsNull()
432      * @deprecated
433      */

434     protected Sampler nextIsNull() throws NextIsNullException
435     {
436         return super.nextIsNull();
437     }
438
439     /**
440      * @see org.apache.jmeter.testelement.TestElement#propertyIterator()
441      * @deprecated
442      */

443     public PropertyIterator propertyIterator()
444     {
445         return super.propertyIterator();
446     }
447
448     /**
449      * @see org.apache.jmeter.testelement.TestElement#recoverRunningVersion()
450      * @deprecated
451      */

452     public void recoverRunningVersion()
453     {
454         super.recoverRunningVersion();
455     }
456
457     /**
458      * @see org.apache.jmeter.testelement.TestElement#removeProperty(java.lang.String)
459      * @deprecated
460      */

461     public void removeProperty(String JavaDoc key)
462     {
463         super.removeProperty(key);
464     }
465
466     /**
467      * @see org.apache.jmeter.testelement.AbstractTestElement#setName(java.lang.String)
468      * @deprecated
469      */

470     public void setName(String JavaDoc name)
471     {
472         super.setName(name);
473     }
474
475     /**
476      * @see org.apache.jmeter.testelement.TestElement#setProperty(org.apache.jmeter.testelement.property.JMeterProperty)
477      * @deprecated
478      */

479     public void setProperty(JMeterProperty property)
480     {
481         super.setProperty(property);
482     }
483
484     /**
485      * @see org.apache.jmeter.testelement.TestElement#setProperty(java.lang.String, java.lang.String)
486      * @deprecated
487      */

488     public void setProperty(String JavaDoc name, String JavaDoc value)
489     {
490         super.setProperty(name, value);
491     }
492
493     /**
494      * @see org.apache.jmeter.testelement.TestElement#setRunningVersion(boolean)
495      * @deprecated
496      */

497     public void setRunningVersion(boolean runningVersion)
498     {
499         super.setRunningVersion(runningVersion);
500     }
501
502     /**
503      * @see org.apache.jmeter.testelement.TestElement#setTemporary(org.apache.jmeter.testelement.property.JMeterProperty)
504      * @deprecated
505      */

506     public void setTemporary(JMeterProperty property)
507     {
508         super.setTemporary(property);
509     }
510
511     /**
512      * @see org.apache.jmeter.testelement.TestElement#traverse(org.apache.jmeter.testelement.TestElementTraverser)
513      * @deprecated
514      */

515     public void traverse(TestElementTraverser traverser)
516     {
517         super.traverse(traverser);
518     }
519
520     /**
521      * @see org.apache.jmeter.testelement.AbstractTestElement#traverseCollection(org.apache.jmeter.testelement.property.CollectionProperty, org.apache.jmeter.testelement.TestElementTraverser)
522      * @deprecated
523      */

524     protected void traverseCollection(
525         CollectionProperty col,
526         TestElementTraverser traverser)
527     {
528         super.traverseCollection(col, traverser);
529     }
530
531     /**
532      * @see org.apache.jmeter.testelement.AbstractTestElement#traverseMap(org.apache.jmeter.testelement.property.MapProperty, org.apache.jmeter.testelement.TestElementTraverser)
533      * @deprecated
534      */

535     protected void traverseMap(MapProperty map, TestElementTraverser traverser)
536     {
537         super.traverseMap(map, traverser);
538     }
539
540     /**
541      * @see org.apache.jmeter.testelement.AbstractTestElement#traverseProperty(org.apache.jmeter.testelement.TestElementTraverser, org.apache.jmeter.testelement.property.JMeterProperty)
542      * @deprecated
543      */

544     protected void traverseProperty(
545         TestElementTraverser traverser,
546         JMeterProperty value)
547     {
548         super.traverseProperty(traverser, value);
549     }
550 }
551
Popular Tags