You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by js...@apache.org on 2004/01/02 00:43:22 UTC
cvs commit: jakarta-jmeter/src/core/org/apache/jmeter/testbeans TestBean.java
jsalvata 2004/01/01 15:43:22
Modified: src/core/org/apache/jmeter/testbeans/gui Tag:
testbeans_experimental_branch TestBeanGUI.java
src/core/org/apache/jmeter/testbeans Tag:
testbeans_experimental_branch TestBean.java
Added: src/core/org/apache/jmeter/testbeans/gui Tag:
testbeans_experimental_branch WrapperEditor.java
Log:
First [hardly] useable version of TestBean / TestBeanGUI.
Revision Changes Path
No revision
No revision
1.1.2.2 +86 -225 jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/Attic/TestBeanGUI.java
Index: TestBeanGUI.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/Attic/TestBeanGUI.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- TestBeanGUI.java 30 Dec 2003 17:00:11 -0000 1.1.2.1
+++ TestBeanGUI.java 1 Jan 2004 23:43:22 -0000 1.1.2.2
@@ -59,15 +59,16 @@
import java.awt.BorderLayout;
import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Rectangle;
+
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
-import java.beans.PropertyChangeListener;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
+
+import java.lang.reflect.InvocationTargetException;
+
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -75,11 +76,6 @@
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
-import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
import org.apache.jmeter.assertions.Assertion;
import org.apache.jmeter.config.ConfigElement;
@@ -91,10 +87,8 @@
import org.apache.jmeter.processor.PreProcessor;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testbeans.TestBean;
-import org.apache.jmeter.testelement.AbstractTestElement;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.JMeterProperty;
-import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.timers.Timer;
import org.apache.jmeter.visualizers.Visualizer;
import org.apache.jorphan.logging.LoggingManager;
@@ -128,7 +122,7 @@
private PropertyDescriptor[] descriptors;
/**
- * Property editors:
+ * Property editors -- or null if the property can't be edited.
*/
private PropertyEditor[] editors;
@@ -141,20 +135,21 @@
public TestBeanGUI(Class testBeanClass)
{
super();
-
+
// A quick verification, just in case:
- if (TestBean.class.isAssignableFrom(testBeanClass))
+ if (! TestBean.class.isAssignableFrom(testBeanClass))
{
Error e= new Error();
log.error("This should never happen!", e);
throw e; // Programming error: bail out.
}
-
+
+ this.testBeanClass= testBeanClass;
+
// Get the beanInfo:
try
{
- beanInfo= Introspector.getBeanInfo(testBeanClass,
- AbstractTestElement.class);
+ beanInfo= Introspector.getBeanInfo(testBeanClass, TestBean.class);
descriptors= beanInfo.getPropertyDescriptors();
}
catch (IntrospectionException e)
@@ -163,14 +158,32 @@
e);
throw new Error(e); // Programming error. Don't continue.
}
-
+
// Obtain the propertyEditors:
editors= new PropertyEditor[descriptors.length];
for (int i=0; i<descriptors.length; i++)
{
String name= descriptors[i].getDisplayName();
+
+ // Don't get editors for hidden or non-read-write properties:
+ if (descriptors[i].isHidden()
+ || descriptors[i].getReadMethod() == null
+ || descriptors[i].getWriteMethod() == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
PropertyEditor propertyEditor;
Class editorClass= descriptors[i].getPropertyEditorClass();
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has editor class "+editorClass);
+ }
+
if (editorClass != null)
{
try
@@ -190,10 +203,23 @@
}
else
{
- propertyEditor=
- PropertyEditorManager.findEditor(descriptors[i].getPropertyType());
+ Class c= descriptors[i].getPropertyType();
+ propertyEditor= PropertyEditorManager.findEditor(c);
}
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has property editor "+propertyEditor);
+ }
+
+ if (propertyEditor == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
propertyEditor=
new WrapperEditor(propertyEditor, descriptors[i]);
@@ -203,6 +229,39 @@
// Initialize the GUI:
init();
+
+ // Initialize the property editors with the bean's default values:
+ // TODO: remove this when the WrapperEditor will have support for "default value".
+ try
+ {
+ TestBean defaults= (TestBean)testBeanClass.newInstance();
+ for (int i=0; i<descriptors.length; i++)
+ {
+ if (editors[i] == null) continue;
+ editors[i].setValue(
+ descriptors[i].getReadMethod().invoke(defaults, null));
+ }
+ }
+ catch (InstantiationException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalAccessException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalArgumentException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (InvocationTargetException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
}
public String getStaticLabel() {
@@ -219,6 +278,7 @@
for (int i=0; i<descriptors.length; i++)
{
+ if (editors[i] == null) continue;
String name= descriptors[i].getName();
JMeterProperty value= element.getProperty(name);
editors[i].setValue(value);
@@ -253,6 +313,7 @@
configureTestElement(element);
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
JMeterProperty value=
(JMeterProperty)editors[i].getValue();
element.setProperty(value);
@@ -274,7 +335,7 @@
public Collection getMenuCategories()
{
List menuCategories= new LinkedList();
-
+
// TODO: there must be a nicer way...
if (Assertion.class.isAssignableFrom(testBeanClass))
{
@@ -320,12 +381,14 @@
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH);
- //TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
- // via a tabbed pannel "Properties" vs. "Custom"
+ // TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
+ // via a tabbed pannel -- e.g. "Properties" vs. "Custom"
+ // TODO: use a table instead of this bunch of panels
VerticalPanel mainPanel = new VerticalPanel();
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
mainPanel.add(
createPropertyPanel(
descriptors[i].getName(),
@@ -344,206 +407,4 @@
return panel;
}
- private class WrapperEditor
- implements PropertyEditor, DocumentListener
- {
- PropertyEditor editor;
- PropertyDescriptor descriptor;
-
- /**
- * The swing component doing the actual GUI work.
- */
- Component component;
-
- /**
- * Copy of component if it's a text field.
- */
- JTextField field= null;
-
- WrapperEditor(PropertyEditor editor, PropertyDescriptor descriptor)
- {
- this.editor= editor;
- this.descriptor= descriptor;
-
- if (editor.supportsCustomEditor())
- {
- component= editor.getCustomEditor();
- }
- else
- {
- field= new JTextField();
- field.getDocument().addDocumentListener(this);
- component= field;
- }
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#changedUpdate(javax.swing.event.DocumentEvent)
- */
- public void changedUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#insertUpdate(javax.swing.event.DocumentEvent)
- */
- public void insertUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#removeUpdate(javax.swing.event.DocumentEvent)
- */
- public void removeUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- public void storeText(DocumentEvent e)
- {
- Document d= e.getDocument();
- String text;
- try
- {
- text= d.getText(0, d.getLength());
- }
- catch (BadLocationException e1)
- {
- log.error("This can't happen!", e1);
- throw new Error(e1); // Bail out.
- }
- editor.setAsText(text);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#addPropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void addPropertyChangeListener(PropertyChangeListener listener)
- {
- editor.addPropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getAsText()
- */
- public String getAsText()
- {
- return editor.getAsText();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getCustomEditor()
- */
- public Component getCustomEditor()
- {
- return component;
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getJavaInitializationString()
- */
- public String getJavaInitializationString()
- {
- return editor.getJavaInitializationString();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getTags()
- */
- public String[] getTags()
- {
- return editor.getTags();
- }
-
- /**
- * This bean editor always returns a JMeterProperty.
- *
- * @see java.beans.PropertyEditor#getValue()
- * @see org.apache.jmeter.testelement.property.JMeterProperty
- */
- public Object getValue()
- {
- String name= descriptor.getName();
-
- if (field != null)
- {
- return new StringProperty(name, editor.getAsText());
- }
- else
- {
- JMeterProperty p= (JMeterProperty)editor.getValue();
- p.setName(name);
- return p;
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#isPaintable()
- */
- public boolean isPaintable()
- {
- return editor.isPaintable();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#paintValue(java.awt.Graphics, java.awt.Rectangle)
- */
- public void paintValue(Graphics gfx, Rectangle box)
- {
- editor.paintValue(gfx, box);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#removePropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void removePropertyChangeListener(PropertyChangeListener listener)
- {
- editor.removePropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setAsText(java.lang.String)
- */
- public void setAsText(String text) throws IllegalArgumentException
- {
- if (field != null)
- {
- field.setText(text);
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- if (editor.supportsCustomEditor())
- {
- editor.setAsText(text);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setValue(java.lang.Object)
- */
- public void setValue(Object value)
- {
- if (field != null)
- {
- field.setText(value.toString());
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- {
- editor.setValue(value);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#supportsCustomEditor()
- */
- public boolean supportsCustomEditor()
- {
- return true;
- }
- }
}
No revision
Index: TestBeanGUI.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/Attic/TestBeanGUI.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- TestBeanGUI.java 30 Dec 2003 17:00:11 -0000 1.1.2.1
+++ TestBeanGUI.java 1 Jan 2004 23:43:22 -0000 1.1.2.2
@@ -59,15 +59,16 @@
import java.awt.BorderLayout;
import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Rectangle;
+
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
-import java.beans.PropertyChangeListener;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
+
+import java.lang.reflect.InvocationTargetException;
+
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -75,11 +76,6 @@
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
-import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
import org.apache.jmeter.assertions.Assertion;
import org.apache.jmeter.config.ConfigElement;
@@ -91,10 +87,8 @@
import org.apache.jmeter.processor.PreProcessor;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testbeans.TestBean;
-import org.apache.jmeter.testelement.AbstractTestElement;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.JMeterProperty;
-import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.timers.Timer;
import org.apache.jmeter.visualizers.Visualizer;
import org.apache.jorphan.logging.LoggingManager;
@@ -128,7 +122,7 @@
private PropertyDescriptor[] descriptors;
/**
- * Property editors:
+ * Property editors -- or null if the property can't be edited.
*/
private PropertyEditor[] editors;
@@ -141,20 +135,21 @@
public TestBeanGUI(Class testBeanClass)
{
super();
-
+
// A quick verification, just in case:
- if (TestBean.class.isAssignableFrom(testBeanClass))
+ if (! TestBean.class.isAssignableFrom(testBeanClass))
{
Error e= new Error();
log.error("This should never happen!", e);
throw e; // Programming error: bail out.
}
-
+
+ this.testBeanClass= testBeanClass;
+
// Get the beanInfo:
try
{
- beanInfo= Introspector.getBeanInfo(testBeanClass,
- AbstractTestElement.class);
+ beanInfo= Introspector.getBeanInfo(testBeanClass, TestBean.class);
descriptors= beanInfo.getPropertyDescriptors();
}
catch (IntrospectionException e)
@@ -163,14 +158,32 @@
e);
throw new Error(e); // Programming error. Don't continue.
}
-
+
// Obtain the propertyEditors:
editors= new PropertyEditor[descriptors.length];
for (int i=0; i<descriptors.length; i++)
{
String name= descriptors[i].getDisplayName();
+
+ // Don't get editors for hidden or non-read-write properties:
+ if (descriptors[i].isHidden()
+ || descriptors[i].getReadMethod() == null
+ || descriptors[i].getWriteMethod() == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
PropertyEditor propertyEditor;
Class editorClass= descriptors[i].getPropertyEditorClass();
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has editor class "+editorClass);
+ }
+
if (editorClass != null)
{
try
@@ -190,10 +203,23 @@
}
else
{
- propertyEditor=
- PropertyEditorManager.findEditor(descriptors[i].getPropertyType());
+ Class c= descriptors[i].getPropertyType();
+ propertyEditor= PropertyEditorManager.findEditor(c);
}
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has property editor "+propertyEditor);
+ }
+
+ if (propertyEditor == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
propertyEditor=
new WrapperEditor(propertyEditor, descriptors[i]);
@@ -203,6 +229,39 @@
// Initialize the GUI:
init();
+
+ // Initialize the property editors with the bean's default values:
+ // TODO: remove this when the WrapperEditor will have support for "default value".
+ try
+ {
+ TestBean defaults= (TestBean)testBeanClass.newInstance();
+ for (int i=0; i<descriptors.length; i++)
+ {
+ if (editors[i] == null) continue;
+ editors[i].setValue(
+ descriptors[i].getReadMethod().invoke(defaults, null));
+ }
+ }
+ catch (InstantiationException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalAccessException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalArgumentException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (InvocationTargetException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
}
public String getStaticLabel() {
@@ -219,6 +278,7 @@
for (int i=0; i<descriptors.length; i++)
{
+ if (editors[i] == null) continue;
String name= descriptors[i].getName();
JMeterProperty value= element.getProperty(name);
editors[i].setValue(value);
@@ -253,6 +313,7 @@
configureTestElement(element);
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
JMeterProperty value=
(JMeterProperty)editors[i].getValue();
element.setProperty(value);
@@ -274,7 +335,7 @@
public Collection getMenuCategories()
{
List menuCategories= new LinkedList();
-
+
// TODO: there must be a nicer way...
if (Assertion.class.isAssignableFrom(testBeanClass))
{
@@ -320,12 +381,14 @@
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH);
- //TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
- // via a tabbed pannel "Properties" vs. "Custom"
+ // TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
+ // via a tabbed pannel -- e.g. "Properties" vs. "Custom"
+ // TODO: use a table instead of this bunch of panels
VerticalPanel mainPanel = new VerticalPanel();
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
mainPanel.add(
createPropertyPanel(
descriptors[i].getName(),
@@ -344,206 +407,4 @@
return panel;
}
- private class WrapperEditor
- implements PropertyEditor, DocumentListener
- {
- PropertyEditor editor;
- PropertyDescriptor descriptor;
-
- /**
- * The swing component doing the actual GUI work.
- */
- Component component;
-
- /**
- * Copy of component if it's a text field.
- */
- JTextField field= null;
-
- WrapperEditor(PropertyEditor editor, PropertyDescriptor descriptor)
- {
- this.editor= editor;
- this.descriptor= descriptor;
-
- if (editor.supportsCustomEditor())
- {
- component= editor.getCustomEditor();
- }
- else
- {
- field= new JTextField();
- field.getDocument().addDocumentListener(this);
- component= field;
- }
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#changedUpdate(javax.swing.event.DocumentEvent)
- */
- public void changedUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#insertUpdate(javax.swing.event.DocumentEvent)
- */
- public void insertUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#removeUpdate(javax.swing.event.DocumentEvent)
- */
- public void removeUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- public void storeText(DocumentEvent e)
- {
- Document d= e.getDocument();
- String text;
- try
- {
- text= d.getText(0, d.getLength());
- }
- catch (BadLocationException e1)
- {
- log.error("This can't happen!", e1);
- throw new Error(e1); // Bail out.
- }
- editor.setAsText(text);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#addPropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void addPropertyChangeListener(PropertyChangeListener listener)
- {
- editor.addPropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getAsText()
- */
- public String getAsText()
- {
- return editor.getAsText();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getCustomEditor()
- */
- public Component getCustomEditor()
- {
- return component;
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getJavaInitializationString()
- */
- public String getJavaInitializationString()
- {
- return editor.getJavaInitializationString();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getTags()
- */
- public String[] getTags()
- {
- return editor.getTags();
- }
-
- /**
- * This bean editor always returns a JMeterProperty.
- *
- * @see java.beans.PropertyEditor#getValue()
- * @see org.apache.jmeter.testelement.property.JMeterProperty
- */
- public Object getValue()
- {
- String name= descriptor.getName();
-
- if (field != null)
- {
- return new StringProperty(name, editor.getAsText());
- }
- else
- {
- JMeterProperty p= (JMeterProperty)editor.getValue();
- p.setName(name);
- return p;
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#isPaintable()
- */
- public boolean isPaintable()
- {
- return editor.isPaintable();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#paintValue(java.awt.Graphics, java.awt.Rectangle)
- */
- public void paintValue(Graphics gfx, Rectangle box)
- {
- editor.paintValue(gfx, box);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#removePropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void removePropertyChangeListener(PropertyChangeListener listener)
- {
- editor.removePropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setAsText(java.lang.String)
- */
- public void setAsText(String text) throws IllegalArgumentException
- {
- if (field != null)
- {
- field.setText(text);
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- if (editor.supportsCustomEditor())
- {
- editor.setAsText(text);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setValue(java.lang.Object)
- */
- public void setValue(Object value)
- {
- if (field != null)
- {
- field.setText(value.toString());
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- {
- editor.setValue(value);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#supportsCustomEditor()
- */
- public boolean supportsCustomEditor()
- {
- return true;
- }
- }
}
No revision
Index: TestBeanGUI.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/Attic/TestBeanGUI.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- TestBeanGUI.java 30 Dec 2003 17:00:11 -0000 1.1.2.1
+++ TestBeanGUI.java 1 Jan 2004 23:43:22 -0000 1.1.2.2
@@ -59,15 +59,16 @@
import java.awt.BorderLayout;
import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Rectangle;
+
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
-import java.beans.PropertyChangeListener;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
+
+import java.lang.reflect.InvocationTargetException;
+
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -75,11 +76,6 @@
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
-import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
import org.apache.jmeter.assertions.Assertion;
import org.apache.jmeter.config.ConfigElement;
@@ -91,10 +87,8 @@
import org.apache.jmeter.processor.PreProcessor;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testbeans.TestBean;
-import org.apache.jmeter.testelement.AbstractTestElement;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.JMeterProperty;
-import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.timers.Timer;
import org.apache.jmeter.visualizers.Visualizer;
import org.apache.jorphan.logging.LoggingManager;
@@ -128,7 +122,7 @@
private PropertyDescriptor[] descriptors;
/**
- * Property editors:
+ * Property editors -- or null if the property can't be edited.
*/
private PropertyEditor[] editors;
@@ -141,20 +135,21 @@
public TestBeanGUI(Class testBeanClass)
{
super();
-
+
// A quick verification, just in case:
- if (TestBean.class.isAssignableFrom(testBeanClass))
+ if (! TestBean.class.isAssignableFrom(testBeanClass))
{
Error e= new Error();
log.error("This should never happen!", e);
throw e; // Programming error: bail out.
}
-
+
+ this.testBeanClass= testBeanClass;
+
// Get the beanInfo:
try
{
- beanInfo= Introspector.getBeanInfo(testBeanClass,
- AbstractTestElement.class);
+ beanInfo= Introspector.getBeanInfo(testBeanClass, TestBean.class);
descriptors= beanInfo.getPropertyDescriptors();
}
catch (IntrospectionException e)
@@ -163,14 +158,32 @@
e);
throw new Error(e); // Programming error. Don't continue.
}
-
+
// Obtain the propertyEditors:
editors= new PropertyEditor[descriptors.length];
for (int i=0; i<descriptors.length; i++)
{
String name= descriptors[i].getDisplayName();
+
+ // Don't get editors for hidden or non-read-write properties:
+ if (descriptors[i].isHidden()
+ || descriptors[i].getReadMethod() == null
+ || descriptors[i].getWriteMethod() == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
PropertyEditor propertyEditor;
Class editorClass= descriptors[i].getPropertyEditorClass();
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has editor class "+editorClass);
+ }
+
if (editorClass != null)
{
try
@@ -190,10 +203,23 @@
}
else
{
- propertyEditor=
- PropertyEditorManager.findEditor(descriptors[i].getPropertyType());
+ Class c= descriptors[i].getPropertyType();
+ propertyEditor= PropertyEditorManager.findEditor(c);
}
+ if (log.isDebugEnabled())
+ {
+ log.debug("Property "+name
+ +" has property editor "+propertyEditor);
+ }
+
+ if (propertyEditor == null)
+ {
+ log.debug("No editor for property "+name);
+ editors[i]= null;
+ continue;
+ }
+
propertyEditor=
new WrapperEditor(propertyEditor, descriptors[i]);
@@ -203,6 +229,39 @@
// Initialize the GUI:
init();
+
+ // Initialize the property editors with the bean's default values:
+ // TODO: remove this when the WrapperEditor will have support for "default value".
+ try
+ {
+ TestBean defaults= (TestBean)testBeanClass.newInstance();
+ for (int i=0; i<descriptors.length; i++)
+ {
+ if (editors[i] == null) continue;
+ editors[i].setValue(
+ descriptors[i].getReadMethod().invoke(defaults, null));
+ }
+ }
+ catch (InstantiationException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalAccessException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (IllegalArgumentException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
+ catch (InvocationTargetException e)
+ {
+ log.error("Can't initialize property editors.", e);
+ throw new Error(e); // programming error: bail out.
+ }
}
public String getStaticLabel() {
@@ -219,6 +278,7 @@
for (int i=0; i<descriptors.length; i++)
{
+ if (editors[i] == null) continue;
String name= descriptors[i].getName();
JMeterProperty value= element.getProperty(name);
editors[i].setValue(value);
@@ -253,6 +313,7 @@
configureTestElement(element);
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
JMeterProperty value=
(JMeterProperty)editors[i].getValue();
element.setProperty(value);
@@ -274,7 +335,7 @@
public Collection getMenuCategories()
{
List menuCategories= new LinkedList();
-
+
// TODO: there must be a nicer way...
if (Assertion.class.isAssignableFrom(testBeanClass))
{
@@ -320,12 +381,14 @@
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH);
- //TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
- // via a tabbed pannel "Properties" vs. "Custom"
+ // TODO: add support for beanInfo.getBeanDescriptor().getCustomizerClass()
+ // via a tabbed pannel -- e.g. "Properties" vs. "Custom"
+ // TODO: use a table instead of this bunch of panels
VerticalPanel mainPanel = new VerticalPanel();
for (int i=0; i<editors.length; i++)
{
+ if (editors[i] == null) continue;
mainPanel.add(
createPropertyPanel(
descriptors[i].getName(),
@@ -344,206 +407,4 @@
return panel;
}
- private class WrapperEditor
- implements PropertyEditor, DocumentListener
- {
- PropertyEditor editor;
- PropertyDescriptor descriptor;
-
- /**
- * The swing component doing the actual GUI work.
- */
- Component component;
-
- /**
- * Copy of component if it's a text field.
- */
- JTextField field= null;
-
- WrapperEditor(PropertyEditor editor, PropertyDescriptor descriptor)
- {
- this.editor= editor;
- this.descriptor= descriptor;
-
- if (editor.supportsCustomEditor())
- {
- component= editor.getCustomEditor();
- }
- else
- {
- field= new JTextField();
- field.getDocument().addDocumentListener(this);
- component= field;
- }
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#changedUpdate(javax.swing.event.DocumentEvent)
- */
- public void changedUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#insertUpdate(javax.swing.event.DocumentEvent)
- */
- public void insertUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.event.DocumentListener#removeUpdate(javax.swing.event.DocumentEvent)
- */
- public void removeUpdate(DocumentEvent e)
- {
- storeText(e);
- }
-
- public void storeText(DocumentEvent e)
- {
- Document d= e.getDocument();
- String text;
- try
- {
- text= d.getText(0, d.getLength());
- }
- catch (BadLocationException e1)
- {
- log.error("This can't happen!", e1);
- throw new Error(e1); // Bail out.
- }
- editor.setAsText(text);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#addPropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void addPropertyChangeListener(PropertyChangeListener listener)
- {
- editor.addPropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getAsText()
- */
- public String getAsText()
- {
- return editor.getAsText();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getCustomEditor()
- */
- public Component getCustomEditor()
- {
- return component;
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getJavaInitializationString()
- */
- public String getJavaInitializationString()
- {
- return editor.getJavaInitializationString();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#getTags()
- */
- public String[] getTags()
- {
- return editor.getTags();
- }
-
- /**
- * This bean editor always returns a JMeterProperty.
- *
- * @see java.beans.PropertyEditor#getValue()
- * @see org.apache.jmeter.testelement.property.JMeterProperty
- */
- public Object getValue()
- {
- String name= descriptor.getName();
-
- if (field != null)
- {
- return new StringProperty(name, editor.getAsText());
- }
- else
- {
- JMeterProperty p= (JMeterProperty)editor.getValue();
- p.setName(name);
- return p;
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#isPaintable()
- */
- public boolean isPaintable()
- {
- return editor.isPaintable();
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#paintValue(java.awt.Graphics, java.awt.Rectangle)
- */
- public void paintValue(Graphics gfx, Rectangle box)
- {
- editor.paintValue(gfx, box);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#removePropertyChangeListener(java.beans.PropertyChangeListener)
- */
- public void removePropertyChangeListener(PropertyChangeListener listener)
- {
- editor.removePropertyChangeListener(listener);
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setAsText(java.lang.String)
- */
- public void setAsText(String text) throws IllegalArgumentException
- {
- if (field != null)
- {
- field.setText(text);
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- if (editor.supportsCustomEditor())
- {
- editor.setAsText(text);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#setValue(java.lang.Object)
- */
- public void setValue(Object value)
- {
- if (field != null)
- {
- field.setText(value.toString());
- // The property change event will cause the text to be stored in the
- // editor.
- }
- else
- {
- editor.setValue(value);
- }
- }
-
- /* (non-Javadoc)
- * @see java.beans.PropertyEditor#supportsCustomEditor()
- */
- public boolean supportsCustomEditor()
- {
- return true;
- }
- }
}
1.1.2.1 +301 -0 jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/Attic/WrapperEditor.java
No revision
No revision
1.1.2.2 +128 -44 jakarta-jmeter/src/core/org/apache/jmeter/testbeans/Attic/TestBean.java
Index: TestBean.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/Attic/TestBean.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- TestBean.java 30 Dec 2003 17:00:12 -0000 1.1.2.1
+++ TestBean.java 1 Jan 2004 23:43:22 -0000 1.1.2.2
@@ -68,11 +68,18 @@
import org.apache.jmeter.testelement.AbstractTestElement;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestElementTraverser;
+import org.apache.jmeter.testelement.property.BooleanProperty;
import org.apache.jmeter.testelement.property.CollectionProperty;
+import org.apache.jmeter.testelement.property.DoubleProperty;
+import org.apache.jmeter.testelement.property.FloatProperty;
+import org.apache.jmeter.testelement.property.IntegerProperty;
import org.apache.jmeter.testelement.property.JMeterProperty;
+import org.apache.jmeter.testelement.property.LongProperty;
import org.apache.jmeter.testelement.property.MapProperty;
import org.apache.jmeter.testelement.property.NullProperty;
import org.apache.jmeter.testelement.property.PropertyIterator;
+import org.apache.jmeter.testelement.property.StringProperty;
+import org.apache.jmeter.testelement.property.TestElementProperty;
/**
* This is an experimental class. An attempt to address the complexity of
@@ -106,7 +113,7 @@
try
{
BeanInfo beanInfo= Introspector.getBeanInfo(this.getClass(),
- AbstractTestElement.class);
+ TestBean.class);
descriptors= beanInfo.getPropertyDescriptors();
}
catch (IntrospectionException e)
@@ -125,55 +132,17 @@
* This is package-scoped to limit its usage to this package in expectation
* of this functionality being moved somewhere else later on.
*/
- void prepare()
+ protected void prepare()
{
Object[] param= new Object[1];
for (int i=0; i<descriptors.length; i++)
{
-
// Obtain a value of the appropriate type for this property.
- // TODO: Awful, but there will be time to improve... maybe using
- // property editors? Or just having each property know its
- // proper type? Or pre-building a type-to-valuegetter map?
JMeterProperty property= getProperty(descriptors[i].getName());
Class type= descriptors[i].getPropertyType();
- Object value;
- if (property instanceof NullProperty)
- {
- // Because we work through primitive types, we need to handle
- // the null case differently.
- value= null;
- }
- else if (type == boolean.class || type == Boolean.class)
- {
- value= new Boolean(property.getBooleanValue());
- }
- else if (type == double.class || type == Double.class)
- {
- value= new Double(property.getDoubleValue());
- }
- else if (type == float.class || type == Float.class)
- {
- value= new Float(property.getFloatValue());
- }
- else if (type == int.class || type == Integer.class)
- {
- value= new Integer(property.getIntValue());
- }
- else if (type == long.class || type == Long.class)
- {
- value= new Long(property.getLongValue());
- }
- else if (type == String.class)
- {
- value= property.getStringValue();
- }
- else
- {
- value= property.getObjectValue();
- }
-
+ Object value= unwrapProperty(property, type);
+
// Set the bean's property to the value we just obtained:
try
{
@@ -201,6 +170,120 @@
}
}
}
+
+ /**
+ * Utility method to obtain the value of a property in the given type.
+ * <p>
+ * I plan to get rid of this sooner than later, so please don't use it much.
+ *
+ * @param property Property to get the value of.
+ * @param type Type of the result.
+ * @return an object of the given type if it is one of the known supported
+ * types, or the value returned by property.getObjectValue
+ */
+ public static Object unwrapProperty(JMeterProperty property, Class type)
+ {
+ // TODO: Awful, but there will be time to improve... maybe using
+ // property editors? Or just having each property know its
+ // proper type? Or pre-building a type-to-valuegetter map?
+ // Or maybe just getting rid of all this property mess and storing
+ // the original objects instead?
+
+ Object value;
+ if (property instanceof NullProperty)
+ {
+ // Because we work through primitive types, we need to handle
+ // the null case differently.
+ value= null;
+ }
+ else if (type == boolean.class || type == Boolean.class)
+ {
+ value= new Boolean(property.getBooleanValue());
+ }
+ else if (type == double.class || type == Double.class)
+ {
+ value= new Double(property.getDoubleValue());
+ }
+ else if (type == float.class || type == Float.class)
+ {
+ value= new Float(property.getFloatValue());
+ }
+ else if (type == int.class || type == Integer.class)
+ {
+ value= new Integer(property.getIntValue());
+ }
+ else if (type == long.class || type == Long.class)
+ {
+ value= new Long(property.getLongValue());
+ }
+ else if (type == String.class)
+ {
+ value= property.getStringValue();
+ }
+ else
+ {
+ value= property.getObjectValue();
+ }
+
+ return value;
+ }
+
+ /**
+ * Utility method to wrap an object in a property of an appropriate type.
+ * <p>
+ * I plan to get rid of this sooner than later, so please don't use it much.
+ *
+ * @param value Object to be wrapped.
+ * @return an unnamed property holding the provided value.
+ */
+ public static JMeterProperty wrapInProperty(Object value)
+ {
+ // TODO: Awful, again...
+
+ if (value instanceof JMeterProperty)
+ {
+ return (JMeterProperty)value;
+ }
+
+ JMeterProperty property;
+ if (value == null)
+ {
+ property= new NullProperty();
+ }
+ else if (value instanceof Boolean)
+ {
+ property= new BooleanProperty();
+ }
+ else if (value instanceof Double)
+ {
+ property= new DoubleProperty();
+ }
+ else if (value instanceof Float)
+ {
+ property= new FloatProperty();
+ }
+ else if (value instanceof Integer)
+ {
+ property= new IntegerProperty();
+ }
+ else if (value instanceof Long)
+ {
+ property= new LongProperty();
+ }
+ else if (value instanceof String)
+ {
+ property= new StringProperty();
+ }
+ else if (value instanceof TestElement)
+ {
+ property= new TestElementProperty();
+ }
+ else throw new Error("Ouch!");
+
+ property.setObjectValue(value);
+
+ return property;
+ }
/*
* ---------------------------------------------------------------------
@@ -272,8 +355,9 @@
}
/**
+ * This one is NOT deprecated.
+ *
* @see org.apache.jmeter.testelement.AbstractTestElement#getName()
- * @deprecated
*/
public String getName()
{
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org