Author: sebb Date: Fri Apr 28 17:18:11 2006 New Revision: 398043 URL: http://svn.apache.org/viewcvs?rev=398043&view=rev Log: Allow Counter value to be formatted
Modified: jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/CounterConfig.java jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/gui/CounterConfigGui.java jakarta/jmeter/branches/rel-2-1/src/core/org/apache/jmeter/resources/messages.properties jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/counter.png jakarta/jmeter/branches/rel-2-1/xdocs/usermanual/component_reference.xml Modified: jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/CounterConfig.java URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/CounterConfig.java?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== --- jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/CounterConfig.java (original) +++ jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/CounterConfig.java Fri Apr 28 17:18:11 2006 @@ -18,6 +18,7 @@ package org.apache.jmeter.modifiers; import java.io.Serializable; +import java.text.DecimalFormat; import org.apache.jmeter.engine.event.LoopIterationEvent; import org.apache.jmeter.engine.event.LoopIterationListener; @@ -27,26 +28,34 @@ import org.apache.jmeter.testelement.property.LongProperty; import org.apache.jmeter.threads.JMeterContextService; import org.apache.jmeter.threads.JMeterVariables; -import org.apache.jorphan.logging.LoggingManager; -import org.apache.log.Logger; /** - * @version $Revision$ + * Provides a counter per-thread/user or globally + * The long value can be */ public class CounterConfig extends AbstractTestElement implements Serializable, LoopIterationListener, NoThreadClone { - private static Logger log = LoggingManager.getLoggerForClass(); - public final static String START = "CounterConfig.start"; + public final static String START = "CounterConfig.start"; // $NON-NLS-1$ - public final static String END = "CounterConfig.end"; + public final static String END = "CounterConfig.end"; // $NON-NLS-1$ - public final static String INCREMENT = "CounterConfig.incr"; + public final static String INCREMENT = "CounterConfig.incr"; // $NON-NLS-1$ - public final static String PER_USER = "CounterConfig.per_user"; + private final static String FORMAT = "CounterConfig.format"; // $NON-NLS-1$ - public final static String VAR_NAME = "CounterConfig.name"; + public final static String PER_USER = "CounterConfig.per_user"; // $NON-NLS-1$ - private long globalCounter = -1; + public final static String VAR_NAME = "CounterConfig.name"; // $NON-NLS-1$ + + // This class is not cloned per thread, so this is shared + private long globalCounter = Long.MIN_VALUE; + + // Used for per-thread/user numbers + private ThreadLocal perTheadNumber = new ThreadLocal() { + protected synchronized Object initialValue() { + return new Long(getStart()); + } + }; /** * @see LoopIterationListener#iterationStart(LoopIterationEvent) @@ -56,30 +65,36 @@ JMeterVariables variables = JMeterContextService.getContext().getVariables(); long start = getStart(), end = getEnd(), increment = getIncrement(); if (!isPerUser()) { - if (globalCounter == -1 || globalCounter > end) { + if (globalCounter == Long.MIN_VALUE || globalCounter > end) { globalCounter = start; } - variables.put(getVarName(), Long.toString(globalCounter)); + variables.put(getVarName(), formatNumber(globalCounter)); globalCounter += increment; } else { - String value = variables.get(getVarName()); - if (value == null) { - variables.put(getVarName(), Long.toString(start)); - } else { - try { - long current = Long.parseLong(value); - current += increment; - if (current > end) { - current = start; - } - variables.put(getVarName(), Long.toString(current)); - } catch (NumberFormatException e) { - log.info("Bad number in Counter config", e); - } - } + long current = ((Long) perTheadNumber.get()).longValue(); + variables.put(getVarName(), formatNumber(current)); + current += increment; + if (current > end) { + current = start; + } + perTheadNumber.set(new Long(current)); } } + // Use format to create number; if it fails, use the default + private String formatNumber(long value){ + String format = getFormat(); + if (format != null && format.length() > 0) { + try { + DecimalFormat myFormatter = new DecimalFormat(format); + return myFormatter.format(value); + } catch (NumberFormatException ignored) { + } catch (IllegalArgumentException ignored) { + } + } + return Long.toString(value); + } + public void setStart(long start) { setProperty(new LongProperty(START, start)); } @@ -131,4 +146,12 @@ public String getVarName() { return getPropertyAsString(VAR_NAME); } + + public void setFormat(String format) { + setProperty(FORMAT, format); + } + + public String getFormat() { + return getPropertyAsString(FORMAT); + } } Modified: jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/gui/CounterConfigGui.java URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/gui/CounterConfigGui.java?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== --- jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/gui/CounterConfigGui.java (original) +++ jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/modifiers/gui/CounterConfigGui.java Fri Apr 28 17:18:11 2006 @@ -1,6 +1,5 @@ -// $Header$ /* - * Copyright 2002-2004 The Apache Software Foundation. + * Copyright 2002-2004,2006 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +30,7 @@ * @version $Revision$ on $Date$ */ public class CounterConfigGui extends AbstractPreProcessorGui { - private JLabeledTextField startField, incrField, endField, varNameField; + private JLabeledTextField startField, incrField, endField, varNameField, formatField; private JCheckBox perUserField; @@ -68,6 +67,7 @@ } config.setIncrement(incrField.getText()); config.setVarName(varNameField.getText()); + config.setFormat(formatField.getText()); config.setIsPerUser(perUserField.isSelected()); } super.configureTestElement(c); @@ -79,6 +79,7 @@ startField.setText(config.getPropertyAsString(CounterConfig.START)); endField.setText(config.getPropertyAsString(CounterConfig.END)); incrField.setText(config.getPropertyAsString(CounterConfig.INCREMENT)); + formatField.setText(config.getFormat()); varNameField.setText(config.getVarName()); perUserField.setSelected(config.isPerUser()); } @@ -93,12 +94,14 @@ incrField = new JLabeledTextField(JMeterUtils.getResString("increment")); endField = new JLabeledTextField(JMeterUtils.getResString("max")); varNameField = new JLabeledTextField(JMeterUtils.getResString("var_name")); + formatField = new JLabeledTextField(JMeterUtils.getResString("format")); perUserField = new JCheckBox(JMeterUtils.getResString("counter_per_user")); add(makeTitlePanel()); add(startField); add(incrField); add(endField); + add(formatField); add(varNameField); add(perUserField); } Modified: jakarta/jmeter/branches/rel-2-1/src/core/org/apache/jmeter/resources/messages.properties URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/src/core/org/apache/jmeter/resources/messages.properties?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== --- jakarta/jmeter/branches/rel-2-1/src/core/org/apache/jmeter/resources/messages.properties (original) +++ jakarta/jmeter/branches/rel-2-1/src/core/org/apache/jmeter/resources/messages.properties Fri Apr 28 17:18:11 2006 @@ -188,6 +188,7 @@ foreach_input=Input variable prefix foreach_output=Output variable name foreach_use_separator=Add "_" before number ? +format=Number format fr=French ftp_sample_title=FTP Request Defaults ftp_testing_title=FTP Request Modified: jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== --- jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml (original) +++ jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml Fri Apr 28 17:18:11 2006 @@ -84,6 +84,7 @@ <li>Bug 26136 - allow configuration of local address</li> <li>Expand tree by default when loading a test plan - can be disabled by setting property onload.expandtree=false</li> <li>Bug 11843 - URL Rewriter can now cache the session id</li> +<li>Counter Pre-Processor now supports formatted numbers</li> </ul> <h4>Bug fixes:</h4> Modified: jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/counter.png URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/counter.png?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== Binary files - no diff available. Modified: jakarta/jmeter/branches/rel-2-1/xdocs/usermanual/component_reference.xml URL: http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/xdocs/usermanual/component_reference.xml?rev=398043&r1=398042&r2=398043&view=diff ============================================================================== --- jakarta/jmeter/branches/rel-2-1/xdocs/usermanual/component_reference.xml (original) +++ jakarta/jmeter/branches/rel-2-1/xdocs/usermanual/component_reference.xml Fri Apr 28 17:18:11 2006 @@ -2657,6 +2657,11 @@ <property name="Increment" required="Yes">How much to increment the counter by after each iteration.</property> <property name="Maximum" required="Yes">If the counter exceeds the maximum, then it is reset to the Start value.</property> + <property name="Format" required="No">Optional format, e.g. 000 will format as 001, 002 etc. + This is passed to DecimalFormat, so any valid formats can be used. + If there is a problem interpreting the format, then it is ignored. + [The default format is generated using Long.toString()] + </property> <property name="Reference Name" required="Yes">This controls how you refer to this value in other elements. Syntax is as in <a href="functions.html">user-defined values</a>: <code>$(reference_name}</code>.</property> <property name="Track Counter Independently for each User" required="No">In other words, is this a global counter, or does each user get their --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]