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