sebb        2004/02/21 17:50:33

  Modified:    src/core/org/apache/jmeter/reporters ResultCollector.java
  Log:
  Don't trim file when using CSV output; use RandomAccessFile to speed up finding XML 
end Marker
  
  Revision  Changes    Path
  1.33      +65 -29    
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.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- ResultCollector.java      21 Feb 2004 22:09:15 -0000      1.32
  +++ ResultCollector.java      22 Feb 2004 01:50:32 -0000      1.33
  @@ -29,6 +29,7 @@
   import java.io.IOException;
   import java.io.OutputStreamWriter;
   import java.io.PrintWriter;
  +import java.io.RandomAccessFile;
   import java.io.Serializable;
   import java.util.HashMap;
   import java.util.HashSet;
  @@ -70,12 +71,17 @@
           Remoteable,
           NoThreadClone
   {
  -    transient private static Logger log = LoggingManager.getLoggerForClass();
  +    private static final String TESTRESULTS_START = "<testResults>";
  +    private static final String TESTRESULTS_END = "</testResults>";
  +     private static final String XML_HEADER = "<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>";
  +     private static final int MIN_XML_FILE_LEN = 
  +                     XML_HEADER.length() + TESTRESULTS_START.length() + 
TESTRESULTS_END.length();
  +     transient private static Logger log = LoggingManager.getLoggerForClass();
       public final static String FILENAME = "filename";
       private static boolean functionalMode = false;
       public static final String ERROR_LOGGING = "ResultCollector.error_logging";
       // protected List results = Collections.synchronizedList(new ArrayList());
  -    private int current;
  +    //private int current;
       transient private DefaultConfigurationSerializer serializer;
       //private boolean inLoading = false;
       transient private PrintWriter out;
  @@ -88,7 +94,7 @@
        */
       public ResultCollector()
       {
  -        current = -1;
  +        //current = -1;
           serializer = new DefaultConfigurationSerializer();
           setErrorLogging(false);
       }
  @@ -194,8 +200,8 @@
       {
           if (SaveService.getOutputFormat() == SaveService.SAVE_AS_XML)
           {
  -            writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
  -            writer.println("<testResults>");
  +            writer.println(XML_HEADER);
  +            writer.println(TESTRESULTS_START);
           }
           else if (SaveService.getOutputFormat() == SaveService.SAVE_AS_CSV)
           {
  @@ -207,11 +213,12 @@
       }
   
   
  -    private void writeFileEnd()
  +    private static void writeFileEnd(PrintWriter pw)
       {
           if (SaveService.getOutputFormat() == SaveService.SAVE_AS_XML)
           {
  -            out.print("\n</testResults>");
  +            pw.print("\n");
  +            pw.print(TESTRESULTS_END);
           }
       }
   
  @@ -227,7 +234,10 @@
   
           if (writer == null)
           {
  -            trimmed = trimLastLine(filename);
  +              if (SaveService.getOutputFormat() == SaveService.SAVE_AS_XML)
  +              {
  +                     trimmed = trimLastLine(filename);       
  +              }
               writer =
                   new PrintWriter(
                       new OutputStreamWriter(
  @@ -244,26 +254,50 @@
           return writer;
       }
   
  +    // returns false if the file did not contain the terminator
       private static boolean trimLastLine(String filename)
       {
  -        // TODO: there must be more memory-efficient ways to do this!
  +     RandomAccessFile raf = null;
           try
           {
  -            TextFile text = new TextFile(filename, "UTF-8");
  -
  -            if (!text.exists())
  -            {
  -                return false;
  -            }
  -            String xml = text.getText();
  -
  -            xml = xml.substring(0, xml.indexOf("</testResults>"));
  -            text.setText(xml);
  +             raf = new RandomAccessFile(filename,"rw");
  +             long len = raf.length();
  +             if (len < MIN_XML_FILE_LEN)
  +             {
  +                     return false;
  +             }
  +             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
  +             {
  +             end = line.indexOf(TESTRESULTS_END);
  +             if (end >= 0) // found the string
  +             {
  +                     break;
  +             }
  +             pos = raf.getFilePointer();
  +             }
  +             if (line == null)
  +             {
  +                     log.warn("Unexpected EOF trying to find XML end marker in 
"+filename);
  +                     raf.close();
  +                     return false;
  +             }
  +             raf.setLength(pos+end);// Truncate the file
  +             raf.close();
           }
  -        catch (Exception e)
  +        catch (FileNotFoundException e)
           {
               return false;
  -        }
  +        } catch (IOException e) {
  +             log.warn("Error trying to find XML terminator "+e.toString());
  +             try {
  +                             raf.close();
  +                     } catch (IOException e1) {}
  +                     return false;
  +             }
           return true;
       }
   
  @@ -326,7 +360,7 @@
   
       public void clearVisualizer()
       {
  -        current = -1;
  +        //current = -1;
           if (getVisualizer() != null && getVisualizer() instanceof Clearable)
           {
               ((Clearable) getVisualizer()).clear();
  @@ -405,11 +439,12 @@
   
       private synchronized boolean isResultMarked(SampleResult res)
       {
  -        boolean marked = res.isMarked(getFilename());
  +        String filename = getFilename();
  +             boolean marked = res.isMarked(filename);
   
           if (!marked)
           {
  -            res.setMarked(getFilename());
  +            res.setMarked(filename);
           }
           return marked;
       }
  @@ -418,13 +453,14 @@
           throws IOException, ConfigurationException, SAXException
       {
   
  -        if (out == null && getFilename() != null)
  +        String filename = getFilename();
  +             if (out == null && filename != null)
           {
               if (out == null)
               {
                   try
                   {
  -                    out = getFileWriter(getFilename());
  +                    out = getFileWriter(filename);
                   }
                   catch (FileNotFoundException e)
                   {
  @@ -438,7 +474,7 @@
       {
           if (out != null)
           {
  -            writeFileEnd();
  +            writeFileEnd(out);
               out.close();
               files.remove(getFilename());
               out = null;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to