mstover1 2005/08/17 08:02:26 Modified: src/protocol/http/org/apache/jmeter/protocol/http/sampler Tag: rel-2-1 AccessLogSampler.java src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog Tag: rel-2-1 LogFilter.java SharedTCLogParser.java SessionFilter.java Filter.java TCLogParser.java src/components/org/apache/jmeter/config Tag: rel-2-1 CSVDataSet.java src/core/org/apache/jmeter/engine Tag: rel-2-1 StandardJMeterEngine.java src/core/org/apache/jmeter/services Tag: rel-2-1 FileServer.java src/jorphan/org/apache/jorphan/util Tag: rel-2-1 JOrphanUtils.java Added: src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog Tag: rel-2-1 OrderPreservingLogParser.java test/src/org/apache/jorphan/util Tag: rel-2-1 TestJorphanUtils.java Log: CSVDataSet handles blank columns in csv file New log parsers - shared log parser (multiple threads take turns on the same access log), order preserving parser (multiple threads take turns on the same access log AND the ordering in the log is preserved) Improvements to session filter Revision Changes Path No revision No revision 1.21.2.3 +19 -3 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java Index: AccessLogSampler.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java,v retrieving revision 1.21.2.2 retrieving revision 1.21.2.3 diff -u -r1.21.2.2 -r1.21.2.3 --- AccessLogSampler.java 16 Aug 2005 17:48:15 -0000 1.21.2.2 +++ AccessLogSampler.java 17 Aug 2005 15:02:25 -0000 1.21.2.3 @@ -25,6 +25,7 @@ import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testbeans.TestBean; import org.apache.jmeter.testelement.TestCloneable; +import org.apache.jmeter.testelement.ThreadListener; import org.apache.jmeter.threads.JMeterContextService; import org.apache.jorphan.logging.LoggingManager; import org.apache.jorphan.util.JMeterException; @@ -65,7 +66,7 @@ * @author Peter Lin * @version $Revision$ last updated $Date$ */ -public class AccessLogSampler extends HTTPSampler implements TestBean { +public class AccessLogSampler extends HTTPSampler implements TestBean,ThreadListener { private static Logger log = LoggingManager.getLoggerForClass(); public static final String DEFAULT_CLASS = "org.apache.jmeter.protocol.http.util.accesslog.TCLogParser"; @@ -300,6 +301,10 @@ { instantiateParser(); s.PARSER = (LogParser)((TestCloneable)PARSER).clone(); + if(filter != null) + { + s.PARSER.setFilter(s.filter); + } } } catch (Exception e) { log.warn("Could not clone cloneable filter", e); @@ -318,6 +323,7 @@ if (PARSER != null) { PARSER.close(); } + filter = null; started = false; super.testEnded(); } @@ -331,4 +337,14 @@ started = true; super.testStarted(); } + + /* (non-Javadoc) + * @see org.apache.jmeter.testelement.AbstractTestElement#threadFinished() + */ + public void threadFinished() { + if(PARSER instanceof ThreadListener) + ((ThreadListener)PARSER).threadFinished(); + if(filter instanceof ThreadListener) + ((ThreadListener)filter).threadFinished(); + } } No revision No revision 1.13.2.1 +9 -8 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java Index: LogFilter.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java,v retrieving revision 1.13 retrieving revision 1.13.2.1 diff -u -r1.13 -r1.13.2.1 --- LogFilter.java 12 Jul 2005 20:50:58 -0000 1.13 +++ LogFilter.java 17 Aug 2005 15:02:26 -0000 1.13.2.1 @@ -22,6 +22,7 @@ import java.util.ArrayList; import org.apache.jmeter.junit.JMeterTestCase; +import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.util.JMeterUtils; import org.apache.oro.text.regex.Pattern; import org.apache.oro.text.regex.Perl5Compiler; @@ -207,7 +208,7 @@ * @param path * @return boolean */ - public boolean isFiltered(String path) { + public boolean isFiltered(String path,TestElement el) { // we do a quick check to see if any // filters are set. If not we just // return false to be efficient. @@ -474,7 +475,7 @@ public void testReplaceExtension() { testf.setReplaceExtension("html", "jsp"); - testf.isFiltered(TESTSTR);// set the required variables + testf.isFiltered(TESTSTR,null);// set the required variables assertEquals(TESTSTROUT, testf.filter(TESTSTR)); } @@ -485,7 +486,7 @@ String theFile = td.file; boolean expect = td.exclfile; - testf.isFiltered(theFile); + testf.isFiltered(theFile,null); String line = testf.filter(theFile); if (line != null) { assertTrue("Expect to accept " + theFile, expect); @@ -502,7 +503,7 @@ String theFile = td.file; boolean expect = td.inclfile; - testf.isFiltered(theFile); + testf.isFiltered(theFile,null); String line = testf.filter(theFile); if (line != null) { assertTrue("Expect to accept " + theFile, expect); @@ -520,7 +521,7 @@ String theFile = td.file; boolean expect = td.exclpatt; - assertEquals(!expect, testf.isFiltered(theFile)); + assertEquals(!expect, testf.isFiltered(theFile,null)); String line = testf.filter(theFile); if (line != null) { assertTrue("Expect to accept " + theFile, expect); @@ -537,7 +538,7 @@ String theFile = td.file; boolean expect = td.inclpatt; - assertEquals(!expect, testf.isFiltered(theFile)); + assertEquals(!expect, testf.isFiltered(theFile,null)); String line = testf.filter(theFile); if (line != null) { assertTrue("Expect to accept " + theFile, expect); 1.1.2.2 +1 -0 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Attic/SharedTCLogParser.java Index: SharedTCLogParser.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Attic/SharedTCLogParser.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- SharedTCLogParser.java 16 Aug 2005 17:48:15 -0000 1.1.2.1 +++ SharedTCLogParser.java 17 Aug 2005 15:02:26 -0000 1.1.2.2 @@ -5,6 +5,7 @@ import org.apache.jmeter.services.FileServer; import org.apache.jmeter.testelement.TestCloneable; import org.apache.jmeter.testelement.TestElement; +import org.apache.jmeter.testelement.ThreadListener; public class SharedTCLogParser extends TCLogParser implements TestCloneable { 1.3.2.1 +97 -33 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java Index: SessionFilter.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -u -r1.3 -r1.3.2.1 --- SessionFilter.java 12 Jul 2005 20:50:58 -0000 1.3 +++ SessionFilter.java 17 Aug 2005 15:02:26 -0000 1.3.2.1 @@ -21,11 +21,17 @@ package org.apache.jmeter.protocol.http.util.accesslog; import java.io.Serializable; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.jmeter.protocol.http.control.CookieManager; +import org.apache.jmeter.protocol.http.sampler.HTTPSampler; import org.apache.jmeter.testelement.TestCloneable; +import org.apache.jmeter.testelement.TestElement; +import org.apache.jmeter.testelement.ThreadListener; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; @@ -37,37 +43,26 @@ * @author mstover * */ -public class SessionFilter implements Filter, Serializable, TestCloneable { +public class SessionFilter implements Filter, Serializable, TestCloneable,ThreadListener { + private static final long serialVersionUID = 1; static Logger log = LoggingManager.getLoggerForClass(); /** - * This object is static across multiple threads in a test, via clone() + * These objects are static across multiple threads in a test, via clone() * method. */ - protected List excludedIps; + protected Map cookieManagers; + protected Set managersInUse; + + protected CookieManager lastUsed; - String ipAddress; - - /* + /* * (non-Javadoc) * * @see org.apache.jmeter.protocol.http.util.accesslog.LogFilter#excPattern(java.lang.String) */ protected boolean hasExcPattern(String text) { - synchronized (excludedIps) { - boolean exclude = false; - for (Iterator x = excludedIps.iterator(); x.hasNext();) { - if (text.indexOf((String) x.next()) > -1) { - exclude = true; - break; - } - } - if (!exclude) { - ipAddress = getIpAddress(text); - excludedIps.add(ipAddress); - } - return exclude; - } + return false; } protected String getIpAddress(String logLine) { @@ -84,12 +79,21 @@ * @see org.apache.jmeter.protocol.http.util.accesslog.Filter#reset() */ public void reset() { - ipAddress = null; + cookieManagers.clear(); } public Object clone() { + if(cookieManagers == null) + { + cookieManagers = Collections.synchronizedMap(new HashMap()); + } + if(managersInUse == null) + { + managersInUse = Collections.synchronizedSet(new HashSet()); + } SessionFilter f = new SessionFilter(); - f.excludedIps = excludedIps; + f.cookieManagers = cookieManagers; + f.managersInUse = managersInUse; return f; } @@ -97,7 +101,6 @@ * */ public SessionFilter() { - excludedIps = new LinkedList(); } /* @@ -146,13 +149,55 @@ * * @see org.apache.jmeter.protocol.http.util.accesslog.Filter#isFiltered(java.lang.String) */ - public boolean isFiltered(String path) { - if (ipAddress != null) { - log.debug("looking for ip address: " + ipAddress + " in line: " + path); - return !(path.indexOf(ipAddress) > -1); - } else - return hasExcPattern(path); - } + public boolean isFiltered(String path,TestElement sampler) { + String ipAddr = getIpAddress(path); + CookieManager cm = getCookieManager(ipAddr); + ((HTTPSampler)sampler).setCookieManager(cm); + return false; + } + + protected CookieManager getCookieManager(String ipAddr) + { + CookieManager cm = null; + // First have to release the cookie we were using so other + // threads stuck in wait can move on + synchronized(managersInUse) + { + if(lastUsed != null) + { + managersInUse.remove(lastUsed); + managersInUse.notify(); + } + } + // let notified threads move on and get lock on managersInUse + if(lastUsed != null) + { + Thread.yield(); + } + // here is the core routine to find appropriate cookie manager and + // check it's not being used. If used, wait until whoever's using it gives + // it up + synchronized(managersInUse) + { + cm = (CookieManager)cookieManagers.get(ipAddr); + if(cm == null) + { + cm = new CookieManager(); + cookieManagers.put(ipAddr,cm); + } + while(managersInUse.contains(cm)) + { + try { + managersInUse.wait(); + } catch (InterruptedException e) { + log.info("SessionFilter wait interrupted"); + } + } + managersInUse.add(cm); + lastUsed = cm; + } + return cm; + } /* * (non-Javadoc) @@ -162,4 +207,23 @@ */ public void setReplaceExtension(String oldextension, String newextension) { } + + /* (non-Javadoc) + * @see org.apache.jmeter.testelement.ThreadListener#threadFinished() + */ + public void threadFinished() { + synchronized(managersInUse) + { + managersInUse.remove(lastUsed); + managersInUse.notify(); + } + } + + /* (non-Javadoc) + * @see org.apache.jmeter.testelement.ThreadListener#threadStarted() + */ + public void threadStarted() { + // TODO Auto-generated method stub + + } } 1.7.2.1 +5 -3 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java Index: Filter.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- Filter.java 12 Jul 2005 20:50:58 -0000 1.7 +++ Filter.java 17 Aug 2005 15:02:26 -0000 1.7.2.1 @@ -18,6 +18,8 @@ package org.apache.jmeter.protocol.http.util.accesslog; +import org.apache.jmeter.testelement.TestElement; + /** * Description:<br> * <br> @@ -82,7 +84,7 @@ * @param path * @return boolean */ - public boolean isFiltered(String path); + public boolean isFiltered(String path,TestElement sampler); /** * In case the user wants to replace the file extension, log parsers should 1.20.2.1 +3 -3 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java Index: TCLogParser.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java,v retrieving revision 1.20 retrieving revision 1.20.2.1 diff -u -r1.20 -r1.20.2.1 --- TCLogParser.java 12 Jul 2005 20:50:58 -0000 1.20 +++ TCLogParser.java 17 Aug 2005 15:02:26 -0000 1.20.2.1 @@ -244,7 +244,7 @@ el.setProperty(HTTPSamplerBase.METHOD, RMETHOD); if (FILTER != null) { log.debug("filter is not null"); - if (!FILTER.isFiltered(line)) { + if (!FILTER.isFiltered(line,el)) { log.debug("line was not filtered"); // increment the current count count++; No revision Index: TCLogParser.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java,v retrieving revision 1.20 retrieving revision 1.20.2.1 diff -u -r1.20 -r1.20.2.1 --- TCLogParser.java 12 Jul 2005 20:50:58 -0000 1.20 +++ TCLogParser.java 17 Aug 2005 15:02:26 -0000 1.20.2.1 @@ -244,7 +244,7 @@ el.setProperty(HTTPSamplerBase.METHOD, RMETHOD); if (FILTER != null) { log.debug("filter is not null"); - if (!FILTER.isFiltered(line)) { + if (!FILTER.isFiltered(line,el)) { log.debug("line was not filtered"); // increment the current count count++; No revision Index: TCLogParser.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java,v retrieving revision 1.20 retrieving revision 1.20.2.1 diff -u -r1.20 -r1.20.2.1 --- TCLogParser.java 12 Jul 2005 20:50:58 -0000 1.20 +++ TCLogParser.java 17 Aug 2005 15:02:26 -0000 1.20.2.1 @@ -244,7 +244,7 @@ el.setProperty(HTTPSamplerBase.METHOD, RMETHOD); if (FILTER != null) { log.debug("filter is not null"); - if (!FILTER.isFiltered(line)) { + if (!FILTER.isFiltered(line,el)) { log.debug("line was not filtered"); // increment the current count count++; 1.1.2.1 +27 -0 jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Attic/OrderPreservingLogParser.java No revision No revision 1.4.2.1 +1 -1 jakarta-jmeter/src/components/org/apache/jmeter/config/CSVDataSet.java Index: CSVDataSet.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/config/CSVDataSet.java,v retrieving revision 1.4 retrieving revision 1.4.2.1 diff -u -r1.4 -r1.4.2.1 --- CSVDataSet.java 12 Jul 2005 20:51:06 -0000 1.4 +++ CSVDataSet.java 17 Aug 2005 15:02:26 -0000 1.4.2.1 @@ -62,7 +62,7 @@ String delim = getDelimiter(); if (delim.equals("\\t")) delim = "\t";// Make it easier to enter a Tab - String[] lineValues = JOrphanUtils.split(server.readLine(getFilename()), delim); + String[] lineValues = JOrphanUtils.split(server.readLine(getFilename()), delim,false); for (int a = 0; a < vars.length && a < lineValues.length; a++) { this.getThreadContext().getVariables().put(vars[a], lineValues[a]); } No revision No revision 1.60.2.1 +11 -6 jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java Index: StandardJMeterEngine.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java,v retrieving revision 1.60 retrieving revision 1.60.2.1 diff -u -r1.60 -r1.60.2.1 --- StandardJMeterEngine.java 12 Jul 2005 20:50:36 -0000 1.60 +++ StandardJMeterEngine.java 17 Aug 2005 15:02:26 -0000 1.60.2.1 @@ -204,6 +204,7 @@ } protected void notifyTestListenersOfEnd() { + log.info("Notifying test listeners of end of test"); Iterator iter = testListeners.getSearchResults().iterator(); while (iter.hasNext()) { TestListener tl = (TestListener) iter.next(); @@ -231,12 +232,16 @@ } public synchronized void threadFinished(JMeterThread thread) { - allThreads.remove(thread); - log.info("Ending thread " + thread.getThreadNum()); - if (!serialized && allThreads.size() == 0 && !schcdule_run) { - log.info("Stopping test"); - stopTest(); - } + try { + allThreads.remove(thread); + log.info("Ending thread " + thread.getThreadNum()); + if (!serialized && allThreads.size() == 0 && !schcdule_run) { + log.info("Stopping test"); + stopTest(); + } + } catch (Throwable e) { + log.fatalError("Call to threadFinished should never throw an exception - this can deadlock JMeter",e); + } } public synchronized void stopTest() { No revision No revision 1.9.2.1 +3 -3 jakarta-jmeter/src/core/org/apache/jmeter/services/FileServer.java Index: FileServer.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/services/FileServer.java,v retrieving revision 1.9 retrieving revision 1.9.2.1 diff -u -r1.9 -r1.9.2.1 --- FileServer.java 12 Jul 2005 20:51:08 -0000 1.9 +++ FileServer.java 17 Aug 2005 15:02:26 -0000 1.9.2.1 @@ -72,7 +72,6 @@ } public void setBasedir(String basedir) throws IOException { - log.info("Setting basedir to: " + basedir); if (filesOpen()) { throw new IOException("Files are still open, cannot change base directory"); } @@ -90,7 +89,6 @@ } public synchronized void reserveFile(String filename) { - log.info("filename = " + filename + " base = " + base); if (!files.containsKey(filename)) { Object[] file = new Object[] { new File(base, filename), null }; files.put(filename, file); @@ -151,7 +149,7 @@ */ public synchronized void closeFile(String name) throws IOException { Object[] file = (Object[]) files.get(name); - if (file[1] != null) { + if (file != null && file.length == 2 && file[1] != null) { ((Reader) file[1]).close(); file[1] = null; } @@ -171,6 +169,8 @@ /** * Method will get a random file in a base directory + * TODO hey, not sure this method belongs here. FileServer is for threadsafe + * File access relative to current test's base directory. * * @param basedir * @return No revision No revision 1.15.2.1 +19 -59 jakarta-jmeter/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java Index: JOrphanUtils.java =================================================================== RCS file: /home/cvs/jakarta-jmeter/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java,v retrieving revision 1.15 retrieving revision 1.15.2.1 diff -u -r1.15 -r1.15.2.1 --- JOrphanUtils.java 12 Jul 2005 20:51:04 -0000 1.15 +++ JOrphanUtils.java 17 Aug 2005 15:02:26 -0000 1.15.2.1 @@ -61,15 +61,18 @@ * Character to split the string on * @return Array of all the tokens. */ - public static String[] split(String splittee, String splitChar) { + public static String[] split(String splittee, String splitChar,boolean truncate) { if (splittee == null || splitChar == null) { return new String[0]; } int spot; - while ((spot = splittee.indexOf(splitChar + splitChar)) != -1) { - splittee = splittee.substring(0, spot + splitChar.length()) - + splittee.substring(spot + 2 * splitChar.length(), splittee.length()); - } + if(truncate) { + while ((spot = splittee.indexOf(splitChar + splitChar)) != -1) { + splittee = splittee.substring(0, spot + splitChar.length()) + + splittee.substring(spot + 2 * splitChar.length(), splittee.length()); + } + if(splittee.startsWith(splitChar)) splittee = splittee.substring(splitChar.length()); + } Vector returns = new Vector(); int start = 0; int length = splittee.length(); @@ -78,6 +81,10 @@ if (spot > 0) { returns.addElement(splittee.substring(start, spot)); } + else + { + returns.addElement(""); + } start = spot + splitChar.length(); } if (start < length) { @@ -87,6 +94,11 @@ returns.copyInto(values); return values; } + + public static String[] split(String splittee,String splitChar) + { + return split(splittee,splitChar,true); + } private static final String SPACES = " "; @@ -280,56 +292,4 @@ return slice; } - - public static class Test extends TestCase { - public void testReplace1() { - assertEquals("xyzdef", replaceFirst("abcdef", "abc", "xyz")); - } - - public void testReplace2() { - assertEquals("axyzdef", replaceFirst("abcdef", "bc", "xyz")); - } - - public void testReplace3() { - assertEquals("abcxyz", replaceFirst("abcdef", "def", "xyz")); - } - - public void testReplace4() { - assertEquals("abcdef", replaceFirst("abcdef", "bce", "xyz")); - } - - public void testReplace5() { - assertEquals("abcdef", replaceFirst("abcdef", "alt=\"\" ", "")); - } - - public void testReplace6() { - assertEquals("abcdef", replaceFirst("abcdef", "alt=\"\" ", "")); - } - - public void testReplace7() { - assertEquals("alt=\"\"", replaceFirst("alt=\"\"", "alt=\"\" ", "")); - } - - public void testReplace8() { - assertEquals("img src=xyz ", replaceFirst("img src=xyz alt=\"\" ", "alt=\"\" ", "")); - } - - public void testSplit1() { - String in = "a,bc,,"; // Test ignore trailing split characters - String out[] = split(in, ","); - assertEquals(2, out.length); - assertEquals("a", out[0]); - assertEquals("bc", out[1]); - } - - public void testSplit2() { - String in = ",,a,bc"; // Test leading split characters - String out[] = split(in, ","); - assertEquals("Should detect the leading split chars; ", 2, out.length - 2); - assertEquals("", out[0]); - assertEquals("", out[1]); - assertEquals("a", out[2]); - assertEquals("bc", out[3]); - } - } } No revision No revision 1.1.2.1 +81 -0 jakarta-jmeter/test/src/org/apache/jorphan/util/Attic/TestJorphanUtils.java
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]