You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by se...@apache.org on 2011/11/21 18:18:57 UTC

svn commit: r1204607 - in /jmeter/trunk: src/core/org/apache/jmeter/reporters/ResultSaver.java src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java src/core/org/apache/jmeter/resources/messages.properties xdocs/changes.xml

Author: sebb
Date: Mon Nov 21 17:18:57 2011
New Revision: 1204607

URL: http://svn.apache.org/viewvc?rev=1204607&view=rev
Log:
Bug 52214 - Save Responses to a file - improve naming algorithm
- add fixed width numbers
- add optional timestamp
- fix synchronisation

Modified:
    jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultSaver.java
    jmeter/trunk/src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java
    jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultSaver.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultSaver.java?rev=1204607&r1=1204606&r2=1204607&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultSaver.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultSaver.java Mon Nov 21 17:18:57 2011
@@ -23,6 +23,9 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.Serializable;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 import org.apache.jmeter.samplers.SampleEvent;
 import org.apache.jmeter.samplers.SampleListener;
@@ -47,10 +50,22 @@ public class ResultSaver extends Abstrac
 
     private static final long serialVersionUID = 240L;
 
+    private static final Object LOCK = new Object();
+
     // File name sequence number
-    //@GuardedBy("this")
+    //@GuardedBy("LOCK")
     private static long sequenceNumber = 0;
 
+    //@GuardedBy("LOCK")
+    private static String timeStamp;
+
+    private static final String TIMESTAMP_FORMAT = "yyyyMMdd-HHmm_"; // $NON-NLS-1$
+
+    //@GuardedBy("LOCK")
+    private static int numberPadLength;
+
+    //+ JMX property names; do not change
+
     public static final String FILENAME = "FileSaver.filename"; // $NON-NLS-1$
 
     public static final String VARIABLE_NAME = "FileSaver.variablename"; // $NON-NLS-1$
@@ -63,6 +78,12 @@ public class ResultSaver extends Abstrac
 
     public static final String SKIP_SUFFIX = "FileSaver.skipsuffix"; // $NON-NLS-1$
 
+    public static final String ADD_TIMESTAMP = "FileSaver.addTimstamp"; // $NON-NLS-1$
+
+    public static final String NUMBER_PAD_LENGTH = "FileSaver.numberPadLen"; // $NON-NLS-1$
+
+    //- JMX property names
+
     private synchronized long nextNumber() {
         return ++sequenceNumber;
     }
@@ -96,10 +117,17 @@ public class ResultSaver extends Abstrac
      */
     @Override
     public void clear() {
-        super.clear();
-        synchronized(this){
+        synchronized(LOCK){
             sequenceNumber = 0; // TODO is this the right thing to do?
+            if (getAddTimeStamp()) {
+                DateFormat format = new SimpleDateFormat(TIMESTAMP_FORMAT);
+                timeStamp = format.format(new Date());
+            } else {
+                timeStamp = "";
+            }
+            numberPadLength=getNumberPadLen();
         }
+        super.clear();
     }
 
     /**
@@ -174,8 +202,13 @@ public class ResultSaver extends Abstrac
      */
     private String makeFileName(String contentType, boolean skipAutoNumber, boolean skipSuffix) {
         StringBuilder sb = new StringBuilder(FileServer.resolveBaseRelativeName(getFilename()));
+        sb.append(timeStamp); // may be the empty string
         if (!skipAutoNumber){
-            sb.append(nextNumber());
+            String number = Long.toString(nextNumber());
+            for(int i=number.length(); i < numberPadLength; i++) {
+                sb.append('0');
+            }
+            sb.append(number);
         }
         if (!skipSuffix){
             sb.append('.');
@@ -236,6 +269,14 @@ public class ResultSaver extends Abstrac
         return getPropertyAsBoolean(SUCCESS_ONLY);
     }
 
+    private boolean getAddTimeStamp() {
+        return getPropertyAsBoolean(ADD_TIMESTAMP);
+    }
+
+    private int getNumberPadLen() {
+        return getPropertyAsInt(NUMBER_PAD_LENGTH, 0);
+    }
+
     // Mutable int to keep track of sample count
     private static class Counter{
         int num;

Modified: jmeter/trunk/src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java?rev=1204607&r1=1204606&r2=1204607&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/reporters/gui/ResultSaverGui.java Mon Nov 21 17:18:57 2011
@@ -32,6 +32,7 @@ import org.apache.jmeter.testelement.Abs
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.visualizers.gui.AbstractListenerGui;
+import org.apache.jorphan.gui.JLabeledTextField;
 
 /**
  * Create a ResultSaver test element, which saves the sample information in set
@@ -54,6 +55,10 @@ public class ResultSaverGui extends Abst
 
     private JCheckBox skipSuffix;
 
+    private JCheckBox addTimestamp;
+
+    private JLabeledTextField numberPadLength;
+
     public ResultSaverGui() {
         super();
         init();
@@ -78,6 +83,8 @@ public class ResultSaverGui extends Abst
         skipAutoNumber.setSelected(el.getPropertyAsBoolean(ResultSaver.SKIP_AUTO_NUMBER));
         skipSuffix.setSelected(el.getPropertyAsBoolean(ResultSaver.SKIP_SUFFIX));
         variableName.setText(el.getPropertyAsString(ResultSaver.VARIABLE_NAME,""));
+        addTimestamp.setSelected(el.getPropertyAsBoolean(ResultSaver.ADD_TIMESTAMP));
+        numberPadLength.setText(el.getPropertyAsString(ResultSaver.NUMBER_PAD_LENGTH,""));
     }
 
     /**
@@ -101,8 +108,10 @@ public class ResultSaverGui extends Abst
         te.setProperty(ResultSaver.SKIP_AUTO_NUMBER, skipAutoNumber.isSelected());
         te.setProperty(ResultSaver.SKIP_SUFFIX, skipSuffix.isSelected());
         te.setProperty(ResultSaver.SUCCESS_ONLY, successOnly.isSelected());
+        te.setProperty(ResultSaver.ADD_TIMESTAMP, addTimestamp.isSelected(), false);
         AbstractTestElement at = (AbstractTestElement) te;
         at.setProperty(ResultSaver.VARIABLE_NAME, variableName.getText(),""); //$NON-NLS-1$
+        at.setProperty(ResultSaver.NUMBER_PAD_LENGTH, numberPadLength.getText(),""); //$NON-NLS-1$
     }
 
     /**
@@ -117,7 +126,9 @@ public class ResultSaverGui extends Abst
         filename.setText(""); //$NON-NLS-1$
         errorsOnly.setSelected(false);
         successOnly.setSelected(false);
+        addTimestamp.setSelected(false);
         variableName.setText(""); //$NON-NLS-1$
+        numberPadLength.setText(""); //$NON-NLS-1$
     }
 
     private void init() {
@@ -135,6 +146,10 @@ public class ResultSaverGui extends Abst
         box.add(skipAutoNumber);
         skipSuffix = new JCheckBox(JMeterUtils.getResString("resultsaver_skipsuffix")); // $NON-NLS-1$
         box.add(skipSuffix);
+        addTimestamp = new JCheckBox(JMeterUtils.getResString("resultsaver_addtimestamp")); // $NON-NLS-1$
+        box.add(addTimestamp);
+        numberPadLength = new JLabeledTextField(JMeterUtils.getResString("resultsaver_numberpadlen"));// $NON-NLS-1$
+        box.add(numberPadLength);
         add(box, BorderLayout.NORTH);
     }
 
@@ -167,7 +182,6 @@ public class ResultSaverGui extends Abst
         return filenamePanel;
     }
 
-
     // Needed to avoid Class cast error in Clear.java
     public void clearData() {
     }

Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1204607&r1=1204606&r2=1204607&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Mon Nov 21 17:18:57 2011
@@ -694,7 +694,9 @@ reset_gui=Reset Gui
 response_save_as_md5=Save response as MD5 hash?
 restart=Restart
 resultaction_title=Result Status Action Handler
+resultsaver_addtimestamp=Add timestamp
 resultsaver_errors=Save Failed Responses only
+resultsaver_numberpadlen=Minumum Length of sequence number
 resultsaver_prefix=Filename prefix\:
 resultsaver_skipautonumber=Don't add number to prefix
 resultsaver_skipsuffix=Don't add suffix

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1204607&r1=1204606&r2=1204607&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Mon Nov 21 17:18:57 2011
@@ -181,6 +181,7 @@ This behaviour can be changed with prope
 <ul>
 <li>Bug 52022 - In View Results Tree rather than showing just a message if the results are to big, show as much of the result as are configured</li>
 <li>Bug 52201 - Add option to TableVisualiser to display child samples instead of parent </li>
+<li>Bug 52214 - Save Responses to a file - improve naming algorithm</li>
 </ul>
 
 <h3>Timers, Assertions, Config, Pre- &amp; Post-Processors</h3>