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