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 ms...@apache.org on 2005/08/29 20:48:03 UTC

cvs commit: jakarta-jmeter/src/core/org/apache/jmeter/testelement/property AbstractProperty.java

mstover1    2005/08/29 11:48:03

  Modified:    src/components/org/apache/jmeter/assertions
                        CompareAssertionResources.properties
                        CompareAssertionBeanInfo.java CompareAssertion.java
               src/core/org/apache/jmeter/samplers
                        DataStrippingSampleSender.java
                        SampleSenderFactory.java
               src/core/org/apache/jmeter/testbeans TestBeanHelper.java
                        BeanInfoSupport.java
               src/core/org/apache/jmeter/testbeans/gui
                        GenericTestBeanCustomizer.java
               src/core/org/apache/jmeter/reporters ResultCollector.java
               src/jorphan/org/apache/jorphan/gui ObjectTableModel.java
               src/core/org/apache/jmeter/save SaveService.java
                        OldSaveService.java
               src/core/org/apache/jmeter/testelement/property
                        AbstractProperty.java
  Added:       src/core/org/apache/jmeter/testbeans/gui TableEditor.java
                        TestBeanPropertyEditor.java
  Log:
  New support for Collections in TestBean framework.
  fix for reading back CSV-formatted jtl files with non-default settings.
  
  Revision  Changes    Path
  1.2       +4 -1      jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertionResources.properties
  
  Index: CompareAssertionResources.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertionResources.properties,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CompareAssertionResources.properties	15 Aug 2005 20:33:07 -0000	1.1
  +++ CompareAssertionResources.properties	29 Aug 2005 18:48:02 -0000	1.2
  @@ -3,4 +3,7 @@
   compareContent.displayName=Compare Content
   compareContent.shortDescription=Verify that all Samplers within the Controller return the same data
   compareTime.displayName=Compare Time
  -compareTime.shortDescription=Verify that all Samplers' return times are within a given number of milliseconds
  \ No newline at end of file
  +compareTime.shortDescription=Verify that all Samplers' return times are within a given number of milliseconds
  +comparison_filters.displayName=Comparison Filters
  +stringsToSkip.displayName=Regular Expression Filters
  +stringsToSkip.shortDescription=Regular expressions to match elements of response data to be ignored when comparing
  \ No newline at end of file
  
  
  
  1.2       +12 -1     jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertionBeanInfo.java
  
  Index: CompareAssertionBeanInfo.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertionBeanInfo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CompareAssertionBeanInfo.java	15 Aug 2005 20:33:07 -0000	1.1
  +++ CompareAssertionBeanInfo.java	29 Aug 2005 18:48:02 -0000	1.2
  @@ -1,14 +1,17 @@
   package org.apache.jmeter.assertions;
   
   import java.beans.PropertyDescriptor;
  +import java.util.Arrays;
   
   import org.apache.jmeter.testbeans.BeanInfoSupport;
  +import org.apache.jmeter.testbeans.gui.TableEditor;
   
   public class CompareAssertionBeanInfo extends BeanInfoSupport {
   
   	public CompareAssertionBeanInfo() {
   		super(CompareAssertion.class);
   		createPropertyGroup("compareChoices", new String[] { "compareContent", "compareTime" });
  +		createPropertyGroup("comparison_filters", new String[]{"stringsToSkip"});
   		PropertyDescriptor p = property("compareContent");
   		p.setValue(NOT_UNDEFINED, Boolean.TRUE);
   		p.setValue(DEFAULT, Boolean.TRUE);
  @@ -16,7 +19,15 @@
   		p = property("compareTime");
   		p.setValue(NOT_UNDEFINED, Boolean.TRUE);
   		p.setValue(DEFAULT, new Long(-1));
  -		p.setValue(NOT_EXPRESSION, Boolean.FALSE);		
  +		p.setValue(NOT_EXPRESSION, Boolean.FALSE);	
  +		p = property("stringsToSkip");
  +		p.setPropertyEditorClass(TableEditor.class);
  +		p.setValue(TableEditor.CLASSNAME,"java.lang.String");
  +		p.setValue(TableEditor.HEADERS,new String[]{"Regex String"});
  +		p.setValue(NOT_UNDEFINED,Boolean.TRUE);
  +		p.setValue(DEFAULT,Arrays.asList(new String[]{"One","Two"}));
  +		p.setValue(MULTILINE,Boolean.TRUE);
  +		
   	}
   
   }
  
  
  
  1.2       +17 -0     jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertion.java
  
  Index: CompareAssertion.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/assertions/CompareAssertion.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- CompareAssertion.java	15 Aug 2005 20:33:07 -0000	1.1
  +++ CompareAssertion.java	29 Aug 2005 18:48:02 -0000	1.2
  @@ -2,6 +2,7 @@
   
   import java.io.Serializable;
   import java.io.UnsupportedEncodingException;
  +import java.util.Collection;
   import java.util.Iterator;
   import java.util.LinkedList;
   import java.util.List;
  @@ -24,6 +25,8 @@
   	private boolean compareContent = true;
   
   	private long compareTime = -1;
  +	
  +	Collection stringsToSkip;
   
   	public CompareAssertion() {
   		super();
  @@ -175,4 +178,18 @@
   		this.compareTime = compareTime;
   	}
   
  +	/**
  +	 * @return Returns the stringsToSkip.
  +	 */
  +	public Collection getStringsToSkip() {
  +		return stringsToSkip;
  +	}
  +
  +	/**
  +	 * @param stringsToSkip The stringsToSkip to set.
  +	 */
  +	public void setStringsToSkip(Collection stringsToSkip) {
  +		this.stringsToSkip = stringsToSkip;
  +	}
  +
   }
  
  
  
  1.2       +19 -6     jakarta-jmeter/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java
  
  Index: DataStrippingSampleSender.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DataStrippingSampleSender.java	25 Aug 2005 21:04:59 -0000	1.1
  +++ DataStrippingSampleSender.java	29 Aug 2005 18:48:02 -0000	1.2
  @@ -19,26 +19,39 @@
   	transient private static Logger log = LoggingManager.getLoggerForClass();
   	
   	RemoteSampleListener listener;
  +	SampleSender decoratedSender;
   
   	public DataStrippingSampleSender(RemoteSampleListener listener) {
   		this.listener = listener;
   	}
  +	
  +	public DataStrippingSampleSender(SampleSender decorate)
  +	{
  +		decoratedSender = decorate;
  +	}
   
   	public void testEnded() {
  -
  +		if(decoratedSender != null) decoratedSender.testEnded();
   	}
   
   	public void testEnded(String host) {
  -
  +		if(decoratedSender != null) decoratedSender.testEnded(host);
   	}
   
   	public void SampleOccurred(SampleEvent e) {
   		//Strip the response data before wiring, but only for a successful request.
   		if(e.getResult().isSuccessful()) e.getResult().setResponseData(new byte[0]);
  -		try {
  -			listener.sampleOccurred(e);
  -		} catch (RemoteException e1) {
  -			log.error("Error sending sample result over network ",e1);
  +		if(decoratedSender == null)
  +		{
  +			try {
  +				listener.sampleOccurred(e);
  +			} catch (RemoteException e1) {
  +				log.error("Error sending sample result over network ",e1);
  +			}
  +		}
  +		else
  +		{
  +			decoratedSender.SampleOccurred(e);
   		}
   	}
   
  
  
  
  1.4       +2 -0      jakarta-jmeter/src/core/org/apache/jmeter/samplers/SampleSenderFactory.java
  
  Index: SampleSenderFactory.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/samplers/SampleSenderFactory.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SampleSenderFactory.java	25 Aug 2005 21:04:59 -0000	1.3
  +++ SampleSenderFactory.java	29 Aug 2005 18:48:02 -0000	1.4
  @@ -46,6 +46,8 @@
   		} else if(type.equalsIgnoreCase("Full")) {
   			StandardSampleSender s = new StandardSampleSender(listener);
   			return s;
  +		}  else if(type.equalsIgnoreCase("Stripped Batch")) {
  +			return new DataStrippingSampleSender(new BatchSampleSender(listener));
   		} else {
   			return new DataStrippingSampleSender(listener);
   		}
  
  
  
  1.4       +50 -3     jakarta-jmeter/src/core/org/apache/jmeter/testbeans/TestBeanHelper.java
  
  Index: TestBeanHelper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/TestBeanHelper.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestBeanHelper.java	12 Jul 2005 20:50:43 -0000	1.3
  +++ TestBeanHelper.java	29 Aug 2005 18:48:02 -0000	1.4
  @@ -22,9 +22,15 @@
   import java.beans.PropertyDescriptor;
   import java.lang.reflect.InvocationTargetException;
   import java.lang.reflect.Method;
  +import java.util.Collection;
  +import java.util.LinkedList;
   
  +import org.apache.jmeter.testbeans.gui.TableEditor;
   import org.apache.jmeter.testelement.TestElement;
  +import org.apache.jmeter.testelement.property.CollectionProperty;
   import org.apache.jmeter.testelement.property.JMeterProperty;
  +import org.apache.jmeter.testelement.property.MultiProperty;
  +import org.apache.jmeter.testelement.property.PropertyIterator;
   import org.apache.jorphan.logging.LoggingManager;
   import org.apache.jorphan.util.Converter;
   import org.apache.log.Logger;
  @@ -67,7 +73,8 @@
   				// Obtain a value of the appropriate type for this property.
   				JMeterProperty jprop = el.getProperty(desc[x].getName());
   				Class type = desc[x].getPropertyType();
  -				Object value = Converter.convert(jprop.getStringValue(), type);
  +				Object value = null;
  +				value = unwrapProperty(desc[x], jprop, type);
   
   				if (log.isDebugEnabled())
   					log.debug("Setting " + jprop.getName() + "=" + value);
  @@ -86,6 +93,46 @@
   	}
   
   	/**
  +	 * @param desc
  +	 * @param x
  +	 * @param jprop
  +	 * @param type
  +	 * @return
  +	 */
  +	private static Object unwrapProperty(PropertyDescriptor desc, JMeterProperty jprop, Class type) {
  +		Object value;
  +		if(jprop instanceof MultiProperty)
  +		{
  +			value = unwrapCollection((MultiProperty)jprop,(String)desc.getValue(TableEditor.CLASSNAME));
  +		}
  +		else value = Converter.convert(jprop.getStringValue(), type);
  +		return value;
  +	}
  +	
  +	private static Object unwrapCollection(MultiProperty prop,String type)
  +	{
  +		if(prop instanceof CollectionProperty)
  +		{
  +			Collection values = new LinkedList();
  +			PropertyIterator iter = prop.iterator();
  +			while(iter.hasNext())
  +			{
  +				JMeterProperty propVal = iter.next();
  +				try
  +				{
  +					values.add(Converter.convert(propVal.getObjectValue(), Class.forName(type)));
  +				}
  +				catch(Exception e)
  +				{
  +					log.error("Couldn't convert object: " + propVal.getObjectValue() + " to " + type);
  +				}
  +			}
  +			return values;
  +		}
  +		return null;
  +	}
  +
  +	/**
   	 * Utility method that invokes a method and does the error handling around
   	 * the invocation.
   	 * 
  
  
  
  1.10      +4 -2      jakarta-jmeter/src/core/org/apache/jmeter/testbeans/BeanInfoSupport.java
  
  Index: BeanInfoSupport.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/BeanInfoSupport.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- BeanInfoSupport.java	12 Jul 2005 20:50:43 -0000	1.9
  +++ BeanInfoSupport.java	29 Aug 2005 18:48:02 -0000	1.10
  @@ -72,6 +72,8 @@
   	public static final String NOT_EXPRESSION = GenericTestBeanCustomizer.NOT_EXPRESSION;
   
   	public static final String NOT_OTHER = GenericTestBeanCustomizer.NOT_OTHER;
  +	
  +	public static final String MULTILINE = "multiline";
   
   	public static final String DEFAULT = GenericTestBeanCustomizer.DEFAULT;
   
  
  
  
  1.10      +38 -21    jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java
  
  Index: GenericTestBeanCustomizer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- GenericTestBeanCustomizer.java	12 Jul 2005 20:51:01 -0000	1.9
  +++ GenericTestBeanCustomizer.java	29 Aug 2005 18:48:02 -0000	1.10
  @@ -111,6 +111,8 @@
   	public static final String NOT_OTHER = "notOther";
   
   	public static final String DEFAULT = "default";
  +	
  +	public static final String MULTILINE = "multiline";
   
   	public static final String RESOURCE_BUNDLE = "resourceBundle";
   
  @@ -213,14 +215,18 @@
   				editors[i] = null;
   				continue;
   			}
  -
  +			String[] tags = mergeTags(propertyEditor,descriptors[i]);
   			if (!propertyEditor.supportsCustomEditor()) {
  -				propertyEditor = createWrapperEditor(propertyEditor, descriptors[i]);
  +				propertyEditor = createWrapperEditor(propertyEditor, descriptors[i],tags);
   
   				if (log.isDebugEnabled()) {
   					log.debug("Editor for property " + name + " is wrapped in " + propertyEditor);
   				}
   			}
  +			if(propertyEditor instanceof TestBeanPropertyEditor)
  +			{
  +				((TestBeanPropertyEditor)propertyEditor).setDescriptor(descriptors[i]);
  +			}
   			if (propertyEditor.getCustomEditor() instanceof JScrollPane) {
   				scrollerCount++;
   			}
  @@ -251,22 +257,7 @@
   	 * @param descriptor
   	 * @return
   	 */
  -	private WrapperEditor createWrapperEditor(PropertyEditor typeEditor, PropertyDescriptor descriptor) {
  -		String[] editorTags = typeEditor.getTags();
  -		String[] additionalTags = (String[]) descriptor.getValue(TAGS);
  -		String[] tags = null;
  -		if (editorTags == null)
  -			tags = additionalTags;
  -		else if (additionalTags == null)
  -			tags = editorTags;
  -		else {
  -			tags = new String[editorTags.length + additionalTags.length];
  -			int j = 0;
  -			for (int i = 0; i < editorTags.length; i++)
  -				tags[j++] = editorTags[i];
  -			for (int i = 0; i < additionalTags.length; i++)
  -				tags[j++] = additionalTags[i];
  -		}
  +	private WrapperEditor createWrapperEditor(PropertyEditor typeEditor, PropertyDescriptor descriptor,String[] tags) {
   
   		boolean notNull = Boolean.TRUE.equals(descriptor.getValue(NOT_UNDEFINED));
   		boolean notExpression = Boolean.TRUE.equals(descriptor.getValue(NOT_EXPRESSION));
  @@ -293,6 +284,30 @@
   	}
   
   	/**
  +	 * @param typeEditor
  +	 * @param descriptor
  +	 * @return
  +	 */
  +	protected String[] mergeTags(PropertyEditor typeEditor, PropertyDescriptor descriptor) {
  +		String[] editorTags = typeEditor.getTags();
  +		String[] additionalTags = (String[]) descriptor.getValue(TAGS);
  +		String[] tags = null;
  +		if (editorTags == null)
  +			tags = additionalTags;
  +		else if (additionalTags == null)
  +			tags = editorTags;
  +		else {
  +			tags = new String[editorTags.length + additionalTags.length];
  +			int j = 0;
  +			for (int i = 0; i < editorTags.length; i++)
  +				tags[j++] = editorTags[i];
  +			for (int i = 0; i < additionalTags.length; i++)
  +				tags[j++] = additionalTags[i];
  +		}
  +		return tags;
  +	}
  +
  +	/**
   	 * Set the value of the i-th property, properly reporting a possible
   	 * failure.
   	 * 
  @@ -425,7 +440,9 @@
   			Component customEditor = editors[i].getCustomEditor();
   
   			boolean multiLineEditor = false;
  -			if (customEditor.getPreferredSize().height > 50 || customEditor instanceof JScrollPane) {
  +			if (descriptors[i].getValue(MULTILINE) != null ||
  +					customEditor.getPreferredSize().height > 50 || 
  +					customEditor instanceof JScrollPane) {
   				// TODO: the above works in the current situation, but it's
   				// just a hack. How to get each editor to report whether it
   				// wants to grow bigger? Whether the property label should
  
  
  
  1.1                  jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java
  
  Index: TableEditor.java
  ===================================================================
  package org.apache.jmeter.testbeans.gui;
  
  import java.awt.BorderLayout;
  import java.awt.Component;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.FocusEvent;
  import java.awt.event.FocusListener;
  import java.beans.PropertyDescriptor;
  import java.beans.PropertyEditorSupport;
  import java.lang.reflect.Method;
  
  import javax.swing.CellEditor;
  import javax.swing.JButton;
  import javax.swing.JComponent;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTable;
  import javax.swing.ListSelectionModel;
  import javax.swing.event.TableModelEvent;
  import javax.swing.event.TableModelListener;
  
  import org.apache.jmeter.util.JMeterUtils;
  import org.apache.jorphan.gui.ObjectTableModel;
  import org.apache.jorphan.logging.LoggingManager;
  import org.apache.jorphan.reflect.Functor;
  import org.apache.log.Logger;
  
  public class TableEditor extends PropertyEditorSupport implements FocusListener,TestBeanPropertyEditor,TableModelListener{
  	Logger log = LoggingManager.getLoggerForClass();
  	
  	public static final String CLASSNAME = "tableObject.classname";
  	public static final String HEADERS = "table.headers";
  	public static final String OBJECT_PROPERTIES = "tableObject.properties";
  	
  	JTable table;
  	ObjectTableModel model;
  	Class clazz;
  	PropertyDescriptor descriptor;
  	JButton addButton,removeButton,clearButton;
  
  	public TableEditor() {
  		addButton = new JButton(JMeterUtils.getResString("add"));
  		addButton.addActionListener(new AddListener());
  		removeButton = new JButton(JMeterUtils.getResString("remove"));
  		removeButton.addActionListener(new RemoveListener());
  		clearButton = new JButton(JMeterUtils.getResString("clear"));
  		clearButton.addActionListener(new ClearListener());
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#getAsText()
  	 */
  	public String getAsText() {
  		return null;
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#getCustomEditor()
  	 */
  	public Component getCustomEditor() {
  		JComponent pane = makePanel();
  		pane.doLayout();
  		pane.validate();
  		return pane;
  	}
  	
  	private JComponent makePanel()
  	{
  		JPanel p = new JPanel(new BorderLayout());
  		JScrollPane scroller = new JScrollPane(table);
  		scroller.setPreferredSize(scroller.getMinimumSize());
  		p.add(scroller,BorderLayout.CENTER);
  		JPanel south = new JPanel();
  		south.add(addButton);
  		south.add(removeButton);
  		south.add(clearButton);
  		p.add(south,BorderLayout.SOUTH);
  		return p;
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#getValue()
  	 */
  	public Object getValue() {
  		return model.getObjectList();
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#setAsText(java.lang.String)
  	 */
  	public void setAsText(String text) throws IllegalArgumentException {
  		//not interested in this method.		
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#setValue(java.lang.Object)
  	 */
  	public void setValue(Object value) {
  		if(value != null)
  		{
  			model.setRows((Iterable)value);
  		}
  		else model.clearData();
  		this.firePropertyChange();
  	}
  
  	/* (non-Javadoc)
  	 * @see java.beans.PropertyEditor#supportsCustomEditor()
  	 */
  	public boolean supportsCustomEditor() {
  		return true;
  	}
  
  	/**
  	 * For the table editor, the tag must simply be the name of the class of object it will hold 
  	 * where each row holds one object. 
  	 */
  	public void setDescriptor(PropertyDescriptor descriptor) {
  		try {
  			this.descriptor = descriptor;
  			clazz = Class.forName((String)descriptor.getValue(CLASSNAME));
  			initializeModel();
  		} catch (ClassNotFoundException e) {
  			throw new RuntimeException("The Table Editor requires one TAG be set - the name of the object to represent a row",e);
  		}
  	}
  	
  	void initializeModel()
  	{
  		if(clazz == String.class)
  		{
  			model = new ObjectTableModel((String[])descriptor.getValue(HEADERS),new Functor[0],new Functor[0],new Class[]{String.class});
  			model.addTableModelListener(this);
  		}
  		else
  		{
  			String[] props = (String[])descriptor.getValue(OBJECT_PROPERTIES);
  			Functor[] writers = new Functor[props.length];
  			Functor[] readers = new Functor[props.length];
  			Class[] editors = new Class[props.length];
  			int count = 0;
  			for(String propName : props)
  			{
  				propName = propName.substring(0,1).toUpperCase() + propName.substring(1);
  				writers[count] = createWriter(clazz,propName);
  				readers[count] = createReader(clazz,propName);
  				editors[count] = getArgForWriter(clazz,propName);
  				count++;
  			}
  			model = new ObjectTableModel((String[])descriptor.getValue(HEADERS),readers,writers,editors);
  			model.addTableModelListener(this);
  		}
  		table = new JTable(model);
  		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  		table.addFocusListener(this);
  	}
  	
  	Functor createWriter(Class c,String propName)
  	{
  		String setter = "set" + propName;
  		return new Functor(setter);
  	}
  	
  	Functor createReader(Class c,String propName)
  	{
  		String getter = "get" + propName;
  		try
  		{
  			c.getMethod(getter,new Class[0]);
  			return new Functor(getter);
  		}
  		catch(Exception e) { return new Functor("is" + propName); }
  	}
  	
  	Class getArgForWriter(Class c,String propName)
  	{
  		String setter = "set" + propName;
  		for(Method m : c.getMethods())
  		{
  			if(m.getName().equals(setter))
  			{
  				return m.getParameterTypes()[0];
  			}
  		}
  		return null;
  	}
  
  	/* (non-Javadoc)
  	 * @see javax.swing.event.TableModelListener#tableChanged(javax.swing.event.TableModelEvent)
  	 */
  	public void tableChanged(TableModelEvent e) {
  		this.firePropertyChange();		
  	}
  
  	/* (non-Javadoc)
  	 * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
  	 */
  	public void focusGained(FocusEvent e) {
  		
  	}
  
  	/* (non-Javadoc)
  	 * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
  	 */
  	public void focusLost(FocusEvent e) {
  		CellEditor ce = table.getCellEditor(table.getEditingRow(),table.getEditingColumn());
  		Component editor = table.getEditorComponent();
  		if(ce != null && (editor == null || editor != e.getOppositeComponent()))
  		{
  			ce.stopCellEditing();
  		}
  		else if(editor != null)
  		{
  			editor.addFocusListener(this);
  		}
  		this.firePropertyChange();
  	}
  	
  	private class AddListener implements ActionListener
  	{
  		public void actionPerformed(ActionEvent e)
  		{
  			try
  			{
  				model.addRow(clazz.newInstance());
  			}catch(Exception err)
  			{
  				log.error("The class type given to TableEditor was not instantiable. ",err);
  			}
  		}
  	}
  	
  	private class RemoveListener implements ActionListener
  	{
  		public void actionPerformed(ActionEvent e)
  		{
  			model.removeRow(table.getSelectedRow());
  		}
  	}
  	
  	private class ClearListener implements ActionListener
  	{
  		public void actionPerformed(ActionEvent e)
  		{
  			model.clearData();
  		}
  	}
  
  }
  
  
  
  1.1                  jakarta-jmeter/src/core/org/apache/jmeter/testbeans/gui/TestBeanPropertyEditor.java
  
  Index: TestBeanPropertyEditor.java
  ===================================================================
  package org.apache.jmeter.testbeans.gui;
  
  import java.beans.PropertyDescriptor;
  import java.beans.PropertyEditor;
  
  public interface TestBeanPropertyEditor extends PropertyEditor {
  	
  	public void setDescriptor(PropertyDescriptor descriptor);
  
  }
  
  
  
  1.54      +1 -1      jakarta-jmeter/src/core/org/apache/jmeter/reporters/ResultCollector.java
  
  Index: ResultCollector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/reporters/ResultCollector.java,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -r1.53 -r1.54
  --- ResultCollector.java	12 Jul 2005 20:50:43 -0000	1.53
  +++ ResultCollector.java	29 Aug 2005 18:48:02 -0000	1.54
  @@ -193,7 +193,7 @@
   					dataReader = new BufferedReader(new FileReader(getFilename()));
   					String line;
   					while ((line = dataReader.readLine()) != null) {
  -						sendToVisualizer(OldSaveService.makeResultFromDelimitedString(line));
  +						sendToVisualizer(OldSaveService.makeResultFromDelimitedString(line,getSaveConfig()));
   					}
   					parsedOK = true;
   				}
  
  
  
  1.8       +23 -3     jakarta-jmeter/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java
  
  Index: ObjectTableModel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ObjectTableModel.java	12 Jul 2005 20:50:59 -0000	1.7
  +++ ObjectTableModel.java	29 Aug 2005 18:48:02 -0000	1.8
  @@ -69,6 +69,15 @@
   		objects.add(value);
   		super.fireTableRowsInserted(objects.size() - 1, objects.size());
   	}
  +	
  +	public void setRows(Iterable rows)
  +	{
  +		clearData();
  +		for(Object val : rows)
  +		{
  +			addRow(val);
  +		}
  +	}
   
   	public void insertRow(Object value, int index) {
   		objects.add(index, value);
  @@ -105,8 +114,10 @@
   	public Object getValueAt(int row, int col) {
   		log.debug("Getting row value");
   		Object value = objects.get(row);
  +		if(headers.size() == 1 && col >= readFunctors.size())
  +			return value;
   		Functor getMethod = (Functor) readFunctors.get(col);
  -		if (getMethod != null) {
  +		if (getMethod != null && value != null) {
   			return getMethod.invoke(value);
   		}
   		return null;
  @@ -152,6 +163,10 @@
   					super.fireTableDataChanged();
   				}
   			}
  +			else if(headers.size() == 1)
  +			{
  +				objects.set(row,cellValue);
  +			}
   		}
   	}
   
  @@ -161,5 +176,10 @@
   	public Class getColumnClass(int arg0) {
   		return (Class) classes.get(arg0);
   	}
  +	
  +	public List getObjectList()
  +	{
  +		return objects;
  +	}
   
   }
  
  
  
  1.69      +1 -1      jakarta-jmeter/src/core/org/apache/jmeter/save/SaveService.java
  
  Index: SaveService.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/save/SaveService.java,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- SaveService.java	12 Jul 2005 22:50:33 -0000	1.68
  +++ SaveService.java	29 Aug 2005 18:48:02 -0000	1.69
  @@ -225,7 +225,7 @@
   		checkVersion(IntegerPropertyConverter.class, "1.4");
   		checkVersion(LongPropertyConverter.class, "1.4");
   		checkVersion(MultiPropertyConverter.class, "1.4");
  -		checkVersion(SampleResultConverter.class, "1.9");
  +		checkVersion(SampleResultConverter.class, "1.10");
   		/*
   		 * Should check this, but tricky to do, because not built until later.
   		 * 
  
  
  
  1.11      +21 -16    jakarta-jmeter/src/core/org/apache/jmeter/save/OldSaveService.java
  
  Index: OldSaveService.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/save/OldSaveService.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- OldSaveService.java	25 Aug 2005 21:05:00 -0000	1.10
  +++ OldSaveService.java	29 Aug 2005 18:48:03 -0000	1.11
  @@ -74,6 +74,11 @@
   	 */
   	private OldSaveService() {
   	}
  +	
  +	public static SampleResult makeResultFromDelimitedString(String delim)
  +	{
  +		return makeResultFromDelimitedString(delim,_saveConfig);
  +	}
   
   	/**
   	 * Make a SampleResult given a delimited string.
  @@ -81,65 +86,65 @@
   	 * @param delim
   	 * @return SampleResult
   	 */
  -	public static SampleResult makeResultFromDelimitedString(String delim) {
  +	public static SampleResult makeResultFromDelimitedString(String delim,SampleSaveConfiguration saveConfig) {
   		SampleResult result = null;
   		long timeStamp = 0;
   		long elapsed = 0;
  -		StringTokenizer splitter = new StringTokenizer(delim, _saveConfig.getDelimiter());
  +		StringTokenizer splitter = new StringTokenizer(delim, saveConfig.getDelimiter());
   		String text = null;
   
   		try {
  -			if (_saveConfig.printMilliseconds()) {
  +			if (saveConfig.printMilliseconds()) {
   				text = splitter.nextToken();
   				timeStamp = Long.parseLong(text);
  -			} else if (_saveConfig.formatter() != null) {
  +			} else if (saveConfig.formatter() != null) {
   				text = splitter.nextToken();
  -				Date stamp = _saveConfig.formatter().parse(text);
  +				Date stamp = saveConfig.formatter().parse(text);
   				timeStamp = stamp.getTime();
   			}
   
  -			if (_saveConfig.saveTime()) {
  +			if (saveConfig.saveTime()) {
   				text = splitter.nextToken();
   				elapsed = Long.parseLong(text);
   			}
   
   			result = new SampleResult(timeStamp, elapsed);
   
  -			if (_saveConfig.saveContentLength()) {
  +			if (saveConfig.saveContentLength()) {
   				text = splitter.nextToken();
   				result.setContentLength(Converter.getInt(text));
   			}
   
  -			if (_saveConfig.saveLabel()) {
  +			if (saveConfig.saveLabel()) {
   				text = splitter.nextToken();
   				result.setSampleLabel(text);
   			}
  -			if (_saveConfig.saveCode()) {
  +			if (saveConfig.saveCode()) {
   				text = splitter.nextToken();
   				result.setResponseCode(text);
   			}
   
  -			if (_saveConfig.saveMessage()) {
  +			if (saveConfig.saveMessage()) {
   				text = splitter.nextToken();
   				result.setResponseMessage(text);
   			}
   
  -			if (_saveConfig.saveThreadName()) {
  +			if (saveConfig.saveThreadName()) {
   				text = splitter.nextToken();
   				result.setThreadName(text);
   			}
   
  -			if (_saveConfig.saveDataType()) {
  +			if (saveConfig.saveDataType()) {
   				text = splitter.nextToken();
   				result.setDataType(text);
   			}
   
  -			if (_saveConfig.saveSuccess()) {
  +			if (saveConfig.saveSuccess()) {
   				text = splitter.nextToken();
   				result.setSuccessful(Boolean.valueOf(text).booleanValue());
   			}
   
  -			if (_saveConfig.saveAssertionResultsFailureMessage()) {
  +			if (saveConfig.saveAssertionResultsFailureMessage()) {
   				text = splitter.nextToken();
   			}
   		} catch (NumberFormatException e) {
  
  
  
  1.24      +5 -3      jakarta-jmeter/src/core/org/apache/jmeter/testelement/property/AbstractProperty.java
  
  Index: AbstractProperty.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testelement/property/AbstractProperty.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- AbstractProperty.java	12 Jul 2005 20:50:25 -0000	1.23
  +++ AbstractProperty.java	29 Aug 2005 18:48:03 -0000	1.24
  @@ -38,6 +38,7 @@
   
   package org.apache.jmeter.testelement.property;
   
  +import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Iterator;
   import java.util.Map;
  @@ -324,7 +325,8 @@
   				try {
   					newColl = (Collection) coll.getClass().newInstance();
   				} catch (Exception e) {
  -					log.error("Bad collection", e);
  +					newColl = new ArrayList();
  +					log.warn("Bad collection", e);
   				}
   			}
   			newColl.add(convertObject(item));
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org