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 se...@apache.org on 2007/10/10 19:40:09 UTC
svn commit: r583553 - in /jakarta/jmeter/trunk:
src/core/org/apache/jmeter/reporters/ResultCollector.java
src/core/org/apache/jmeter/save/OldSaveService.java xdocs/changes.xml
Author: sebb
Date: Wed Oct 10 10:40:07 2007
New Revision: 583553
URL: http://svn.apache.org/viewvc?rev=583553&view=rev
Log:
If the default delimiter does not work when loading a CSV file, guess the delimiter by analysing the header line.
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
jakarta/jmeter/trunk/xdocs/changes.xml
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java?rev=583553&r1=583552&r2=583553&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java Wed Oct 10 10:40:07 2007
@@ -198,7 +198,7 @@
} else {
if (!line.startsWith("<?xml ")){// No, must be CSV //$NON-NLS-1$
long lineNumber=1;
- SampleSaveConfiguration saveConfig = OldSaveService.getSampleSaveConfiguration(line);
+ SampleSaveConfiguration saveConfig = OldSaveService.getSampleSaveConfiguration(line,filename);
if (saveConfig == null) {// not a valid header
saveConfig = (SampleSaveConfiguration) getSaveConfig().clone(); // OldSaveService may change the format
} else { // header line has been processed, so read the next
@@ -218,7 +218,7 @@
readSamples(SaveService.loadTestResults(bufferedInputStream));
parsedOK = true;
} catch (Exception e) {
- log.info("File load failure, trying old XML format. "+e.getLocalizedMessage());
+ log.info("Failed to load "+filename+" using XStream, trying old XML format. Error was: "+e);
try {
Configuration savedSamples = getConfiguration(filename);
Configuration[] samples = savedSamples.getChildren();
@@ -316,13 +316,11 @@
if (len < MIN_XML_FILE_LEN) {
return false;
}
- raf.seek(len - TESTRESULTS_END.length() - 10);// TODO: may not
- // work on all OSes?
+ raf.seek(len - TESTRESULTS_END.length() - 10);// TODO: may not work on all OSes?
String line;
long pos = raf.getFilePointer();
int end = 0;
- while ((line = raf.readLine()) != null)// reads to end of line OR
- // file
+ while ((line = raf.readLine()) != null)// reads to end of line OR end of file
{
end = line.indexOf(TESTRESULTS_END);
if (end >= 0) // found the string
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java?rev=583553&r1=583552&r2=583553&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java Wed Oct 10 10:40:07 2007
@@ -50,6 +50,7 @@
import org.apache.jmeter.testelement.property.MapProperty;
import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.testelement.property.TestElementProperty;
+import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.util.NameUpdater;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.ListedHashTree;
@@ -57,6 +58,10 @@
import org.apache.jorphan.reflect.Functor;
import org.apache.jorphan.util.JMeterError;
import org.apache.log.Logger;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternMatcherInput;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
import org.xml.sax.SAXException;
/**
@@ -151,7 +156,7 @@
* former does not return empty tokens.
*/
// The \Q prefix is needed to ensure that meta-characters (e.g. ".") work.
- String parts[]=inputLine.split("\\Q"+_saveConfig.getDelimiter());// $NON-NLS-1$
+ String parts[]=inputLine.split("\\Q"+saveConfig.getDelimiter());// $NON-NLS-1$
String text = null;
String field = null; // Save the name for error reporting
int i=0;
@@ -437,18 +442,34 @@
/**
* Parse a CSV header line
* @param headerLine from CSV file
+ * @param filename name of file (for log message only)
* @return config corresponding to the header items found or null if not a header line
*/
- public static SampleSaveConfiguration getSampleSaveConfiguration(String headerLine){
- String parts[]=headerLine.split("\\Q"+_saveConfig.getDelimiter());// $NON-NLS-1$
+ public static SampleSaveConfiguration getSampleSaveConfiguration(String headerLine, String filename){
+ String[] parts = splitHeader(headerLine,_saveConfig.getDelimiter()); // Try default delimiter
- // Check if the line is a header
- for(int i=0;i<parts.length;i++){
- if (!headerLabelMethods.containsKey(parts[i])){
- return null; // unknown column name
+ String delim = null;
+
+ if (parts == null){
+ Perl5Matcher matcher = JMeterUtils.getMatcher();
+ PatternMatcherInput input = new PatternMatcherInput(headerLine);
+ Pattern pattern = JMeterUtils.getPatternCache()
+ // This assumes the header names are all single words with no spaces
+ // word followed by 0 or more repeats of (non-word char + word)
+ // where the non-word char (\2) is the same
+ // e.g. abc|def|ghi but not abd|def~ghi
+ .getPattern("\\w+((\\W)\\w+)?(\\2\\w+)*", // $NON-NLS-1$
+ Perl5Compiler.READ_ONLY_MASK);
+ if (matcher.matches(input, pattern)) {
+ delim = matcher.getMatch().group(2);
+ parts = splitHeader(headerLine,delim);// now validate the result
}
}
-
+
+ if (parts == null) {
+ return null; // failed to recognise the header
+ }
+
// We know the column names all exist, so create the config
SampleSaveConfiguration saveConfig=new SampleSaveConfiguration(false);
@@ -456,7 +477,23 @@
Functor set = (Functor) headerLabelMethods.get(parts[i]);
set.invoke(saveConfig,new Boolean[]{Boolean.TRUE});
}
+
+ if (delim != null){
+ log.warn("Default delimiter '"+_saveConfig.getDelimiter()+"' did not work; using alternate '"+delim+"' for reading "+filename);
+ saveConfig.setDelimiter(delim);
+ }
return saveConfig;
+ }
+
+ private static String[] splitHeader(String headerLine, String delim) {
+ String parts[]=headerLine.split("\\Q"+delim);// $NON-NLS-1$
+ // Check if the line is a header
+ for(int i=0;i<parts.length;i++){
+ if (!headerLabelMethods.containsKey(parts[i])){
+ return null; // unknown column name
+ }
+ }
+ return parts;
}
/**
Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=583553&r1=583552&r2=583553&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Wed Oct 10 10:40:07 2007
@@ -55,6 +55,7 @@
<li>HTTP Parameters without names are ignored (except for POST requests with no file)</li>
<li>"Save Selection As" added to main menu; now checks only item is selected</li>
<li>Test Plan now has Paste menu item (paste was already supported via ^V)</li>
+<li>If the default delimiter does not work when loading a CSV file, guess the delimiter by analysing the header line.</li>
</ul>
<h4>Non-functional Improvements</h4>
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org