mstover1 2003/02/21 08:33:39
Modified: src/core/org/apache/jmeter/save SaveService.java
src/core/org/apache/jmeter/testelement
AbstractTestElement.java TestElement.java
src/protocol/http/org/apache/jmeter/protocol/http/modifier
URLRewritingModifier.java
src/protocol/http/org/apache/jmeter/protocol/http/util
HTTPArgument.java
Added: src/core/org/apache/jmeter/save TestElementSaver.java
src/core/org/apache/jmeter/testelement
TestElementCloner.java TestElementProperty.java
TestElementTraverser.java
src/protocol/http/org/apache/jmeter/protocol/http/util
EncoderCache.java
Log:
New TestElementTraverser interface - traversing test elements shouldn't have to be
rewritten every time
updated the SaveService to use the traverser, updated cloning of test elements too
HTTPArgument is simplified, using now a cache, similar to PatternCacheLRU for
encoded values.
Revision Changes Path
1.16 +45 -4 jakarta-jmeter/src/core/org/apache/jmeter/save/SaveService.java
Index: SaveService.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/save/SaveService.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- SaveService.java 6 Feb 2003 14:24:31 -0000 1.15
+++ SaveService.java 21 Feb 2003 16:33:39 -0000 1.16
@@ -68,6 +68,7 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import junit.framework.TestCase;
@@ -722,7 +723,10 @@
public static Configuration getConfigForTestElement(String named, TestElement
item)
{
- DefaultConfiguration config = new DefaultConfiguration("testelement",
"testelement");
+ TestElementSaver saver = new TestElementSaver(named);
+ item.traverse(saver);
+ Configuration config = saver.getConfiguration();
+ /* DefaultConfiguration config = new DefaultConfiguration("testelement",
"testelement");
if (named != null)
{
@@ -755,7 +759,7 @@
{
config.addChild(createConfigForString(name, value.toString()));
}
- }
+ }*/
return config;
}
@@ -865,6 +869,11 @@
element.setProperty(children[i].getAttribute("name"),
createCollection(children[i]));
}
+ else if(children[i].getName().equals("map"))
+ {
+ element.setProperty(children[i].getAttribute("name"),
+ createMap(children[i]));
+ }
}
return element;
}
@@ -894,8 +903,40 @@
{
coll.add(items[i].getValue(""));
}
+ else if (items[i].getName().equals("map"))
+ {
+ coll.add(createMap(items[i]));
+ }
}
return coll;
+ }
+
+ private static Map createMap(Configuration config) throws
ConfigurationException, ClassNotFoundException,
+ IllegalAccessException, InstantiationException
+ {
+ Map map = (Map) Class.forName((String)
config.getAttribute("class")).newInstance();
+ Configuration[] items = config.getChildren();
+
+ for (int i = 0; i < items.length; i++)
+ {
+ if (items[i].getName().equals("property"))
+ {
+
map.put(items[i].getAttribute("name"),items[i].getValue(""));
+ }
+ else if (items[i].getName().equals("testelement"))
+ {
+
map.put(items[i].getAttribute("name"),createTestElement(items[i]));
+ }
+ else if (items[i].getName().equals("collection"))
+ {
+
map.put(items[i].getAttribute("name"),createCollection(items[i]));
+ }
+ else if (items[i].getName().equals("map"))
+ {
+ map.put(items[i].getAttribute("name"),createMap(items[i]));
+ }
+ }
+ return map;
}
private static HashTree generateNode(Configuration config)
1.1
jakarta-jmeter/src/core/org/apache/jmeter/save/TestElementSaver.java
Index: TestElementSaver.java
===================================================================
package org.apache.jmeter.save;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
import java.util.NoSuchElementException;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestElementTraverser;
/**
* @author Administrator
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
*/
public class TestElementSaver implements TestElementTraverser, SaveServiceConstants
{
String name;
LinkedList stack = new LinkedList();
DefaultConfiguration rootConfig = null;
public TestElementSaver(String name)
{
this.name = name;
}
public Configuration getConfiguration()
{
return rootConfig;
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startTestElement(org.apache.jmeter.testelement.TestElement)
*/
public void startTestElement(TestElement el)
{
DefaultConfiguration config = new DefaultConfiguration("testelement",
"testelement");
config.setAttribute("class", el.getClass().getName());
if (rootConfig == null)
{
rootConfig = config;
if(name != null && name.length() > 0)
{
rootConfig.setAttribute("name", name);
}
}
else
{
setConfigName(config);
}
stack.add(config);
}
public void setConfigName(DefaultConfiguration config)
{
if (!(stack.getLast() instanceof Configuration))
{
Object key = stack.removeLast();
config.setAttribute("name", key.toString());
}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endTestElement(org.apache.jmeter.testelement.TestElement)
*/
public void endTestElement(TestElement el)
{
simplePropertyValue(stack.removeLast());
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startProperty(java.lang.Object)
*/
public void startProperty(Object key)
{
stack.add(key);
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endProperty(java.lang.Object)
*/
public void endProperty(Object key)
{
DefaultConfiguration config = (DefaultConfiguration) stack.getLast();
if(config.getName().equals("property"))
{
stack.removeLast();
((DefaultConfiguration) stack.getLast()).addChild(config);
}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#simplePropertyValue(java.lang.Object)
*/
public void simplePropertyValue(Object value)
{
try
{
Object parent = stack.getLast();
if (!(parent instanceof Configuration))
{
DefaultConfiguration config = new DefaultConfiguration("property",
"property");
config.setValue(value != null ? value.toString() : "");
config.setAttribute("name", parent.toString());
config.setAttribute(XML_SPACE, PRESERVE);
stack.removeLast();
stack.add(config);
}
if (parent instanceof DefaultConfiguration && value instanceof
Configuration)
{
((DefaultConfiguration) parent).addChild((Configuration) value);
}
else if (parent instanceof DefaultConfiguration && !(value instanceof
Configuration))
{
DefaultConfiguration config = new DefaultConfiguration("string",
"string");
config.setValue(value.toString());
config.setAttribute(XML_SPACE, PRESERVE);
((DefaultConfiguration) parent).addChild(config);
}
}
catch (NoSuchElementException e)
{}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startMap(java.util.Map)
*/
public void startMap(Map map)
{
DefaultConfiguration config = new DefaultConfiguration("map", "map");
config.setAttribute("class", map.getClass().getName());
setConfigName(config);
stack.add(config);
}
/**
* @see org.apache.jmeter.testelement.TestElementTraverser#endMap(java.util.Map)
*/
public void endMap(Map map)
{
simplePropertyValue(stack.removeLast());
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startCollection(java.util.Collection)
*/
public void startCollection(Collection col)
{
DefaultConfiguration config = new DefaultConfiguration("collection",
"collection");
config.setAttribute("class", col.getClass().getName());
setConfigName(config);
stack.add(config);
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endCollection(java.util.Collection)
*/
public void endCollection(Collection col)
{
simplePropertyValue(stack.removeLast());
}
}
1.9 +68 -12
jakarta-jmeter/src/core/org/apache/jmeter/testelement/AbstractTestElement.java
Index: AbstractTestElement.java
===================================================================
RCS file:
/home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testelement/AbstractTestElement.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AbstractTestElement.java 20 Feb 2003 02:59:15 -0000 1.8
+++ AbstractTestElement.java 21 Feb 2003 16:33:39 -0000 1.9
@@ -33,17 +33,9 @@
***************************************/
public Object clone()
{
- try
- {
- TestElement newObject = (TestElement)this.getClass().newInstance();
- configureClone(newObject);
- return newObject;
- }
- catch(Exception e)
- {
- log.error("",e);
- }
- return null;
+ TestElementCloner cloner = new TestElementCloner();
+ this.traverse(cloner);
+ return cloner.getClonedElement();
}
public void removeProperty(String key)
@@ -126,6 +118,70 @@
public Collection getPropertyNames()
{
return testInfo.keySet();
+ }
+
+ public void traverse(TestElementTraverser traverser)
+ {
+ Iterator iter = getPropertyNames().iterator();
+ traverser.startTestElement(this);
+ while (iter.hasNext())
+ {
+ String key = (String)iter.next();
+ Object value = getProperty(key);
+ traverseObject(traverser, key,value);
+ }
+ traverser.endTestElement(this);
+ }
+
+ protected void traverseObject(TestElementTraverser traverser, Object key,Object
value)
+ {
+ traverser.startProperty(key);
+ traverseObject(traverser, value);
+ traverser.endProperty(key);
+ }
+
+ protected void traverseObject(TestElementTraverser traverser, Object value)
+ {
+ if(value instanceof TestElement)
+ {
+ ((TestElement)value).traverse(traverser);
+ }
+ else if(value instanceof Collection)
+ {
+ traverseCollection((Collection)value,traverser);
+ }
+ else if(value instanceof Map)
+ {
+ traverseMap((Map)value,traverser);
+ }
+ else
+ {
+ traverser.simplePropertyValue(value);
+ }
+ }
+
+ protected void traverseMap(Map map,TestElementTraverser traverser)
+ {
+ traverser.startMap(map);
+ Iterator iter = map.keySet().iterator();
+ while (iter.hasNext())
+ {
+ Object key = iter.next();
+ Object value = map.get(key);
+ traverseObject(traverser,key,value);
+ }
+ traverser.endMap(map);
+ }
+
+ protected void traverseCollection(Collection col,TestElementTraverser traverser)
+ {
+ traverser.startCollection(col);
+ Iterator iter = col.iterator();
+ while (iter.hasNext())
+ {
+ traverseObject(traverser,iter.next());
+ }
+ traverser.endCollection(col);
}
/****************************************
1.3 +7 -1
jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestElement.java
Index: TestElement.java
===================================================================
RCS file:
/home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestElement.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestElement.java 5 Feb 2003 05:12:09 -0000 1.2
+++ TestElement.java 21 Feb 2003 16:33:39 -0000 1.3
@@ -75,4 +75,10 @@
*@return !ToDo (Return description)
***************************************/
public Object clone();
+
+ /**
+ * Convenient way to traverse a test element
+ * @param traverser
+ */
+ public void traverse(TestElementTraverser traverser);
}
1.1
jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestElementCloner.java
Index: TestElementCloner.java
===================================================================
package org.apache.jmeter.testelement;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
import java.util.NoSuchElementException;
/**
* @author Administrator
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
*/
public class TestElementCloner implements TestElementTraverser
{
LinkedList stack = new LinkedList();
Object currentProperty;
TestElement clonedRoot = null;
public TestElement getClonedElement()
{
return clonedRoot;
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startTestElement(org.apache.jmeter.testelement.TestElement)
*/
public void startTestElement(TestElement el)
{
try
{
if (clonedRoot == null)
{
clonedRoot = (TestElement) el.getClass().newInstance();
stack.add(clonedRoot);
}
else
{
stack.add(el.getClass().newInstance());
}
}
catch (InstantiationException e)
{}
catch (IllegalAccessException e)
{}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endTestElement(org.apache.jmeter.testelement.TestElement)
*/
public void endTestElement(TestElement el)
{
simplePropertyValue(stack.removeLast());
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startProperty(java.lang.Object)
*/
public void startProperty(Object key)
{
stack.add(new TestElementProperty(key));
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endProperty(java.lang.Object)
*/
public void endProperty(Object key)
{
TestElementProperty prop = (TestElementProperty)stack.removeLast();
addProperty(prop,stack.getLast());
}
private void addProperty(TestElementProperty prop,Object parent)
{
if(parent instanceof TestElement)
{
((TestElement)parent).setProperty(prop.getKey().toString(),prop.getValue());
}
else if(parent instanceof Map)
{
((Map)parent).put(prop.getKey(),prop.getValue());
}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#simplePropertyValue(java.lang.Object)
*/
public void simplePropertyValue(Object value)
{
try
{
Object parent = stack.getLast();
if(parent instanceof TestElementProperty)
{
((TestElementProperty)parent).setValue(value);
}
else if(parent instanceof Collection)
{
((Collection)parent).add(value);
}
}
catch (NoSuchElementException e)
{}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startMap(java.util.Map)
*/
public void startMap(Map map)
{
try
{
stack.add(map.getClass().newInstance());
}
catch (InstantiationException e)
{}
catch (IllegalAccessException e)
{}
}
/**
* @see org.apache.jmeter.testelement.TestElementTraverser#endMap(java.util.Map)
*/
public void endMap(Map map)
{
Map cloned = (Map)stack.removeLast();
simplePropertyValue(cloned);
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#startCollection(java.util.Collection)
*/
public void startCollection(Collection col)
{
try
{
stack.add(col.getClass().newInstance());
}
catch (InstantiationException e)
{}
catch (IllegalAccessException e)
{}
}
/**
* @see
org.apache.jmeter.testelement.TestElementTraverser#endCollection(java.util.Collection)
*/
public void endCollection(Collection col)
{
Collection cloned = (Collection)stack.removeLast();
simplePropertyValue(cloned);
}
}
1.1
jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestElementProperty.java
Index: TestElementProperty.java
===================================================================
package org.apache.jmeter.testelement;
/**
* @author Administrator
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
*/
public class TestElementProperty
{
Object key;
Object value;
public TestElementProperty()
{
}
public TestElementProperty(Object key, Object value)
{
setKey(key);
setValue(value);
}
public TestElementProperty(Object key)
{
setKey(key);
}
/**
* Returns the key.
* @return Object
*/
public Object getKey()
{
return key;
}
/**
* Returns the value.
* @return Object
*/
public Object getValue()
{
return value;
}
/**
* Sets the key.
* @param key The key to set
*/
public void setKey(Object key)
{
this.key = key;
}
/**
* Sets the value.
* @param value The value to set
*/
public void setValue(Object value)
{
this.value = value;
}
}
1.1
jakarta-jmeter/src/core/org/apache/jmeter/testelement/TestElementTraverser.java
Index: TestElementTraverser.java
===================================================================
package org.apache.jmeter.testelement;
import java.util.Collection;
import java.util.Map;
/**
* For traversing Test Elements, which contain property that can be other test
* elements, strings, collections, maps, objects
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
*/
public interface TestElementTraverser
{
/**
* Notification that a new test element is about to be traversed.
* @param el
*/
public void startTestElement(TestElement el);
/**
* Notification that the test element is now done.
* @param el
*/
public void endTestElement(TestElement el);
/**
* Notification that a property is starting. This could be a test element
* property or a Map property - depends on the context.
* @param key
* @param value
*/
public void startProperty(Object key);
/**
* Notification that a property is ending. Again, this could be a test
* element or a Map property, dependig on the context.
* @param key
*/
public void endProperty(Object key);
/**
* Notification of the occurence of a property value that is a simple
* object, such as a String, or Integer, etc. Which property it relates to
* is dependent on the context.
* @param value
*/
public void simplePropertyValue(Object value);
/**
* Notification that a Map object is starting.
* @param map
*/
public void startMap(Map map);
/**
* Notification that a Map object is ending.
* @param map
*/
public void endMap(Map map);
/**
* Notification that a collection object is starting.
*/
public void startCollection(Collection col);
/**
* Notification that a collection object is ending.
* @param col
*/
public void endCollection(Collection col);
}
1.7 +3 -3
jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/modifier/URLRewritingModifier.java
Index: URLRewritingModifier.java
===================================================================
RCS file:
/home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/modifier/URLRewritingModifier.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- URLRewritingModifier.java 16 Oct 2002 00:38:41 -0000 1.6
+++ URLRewritingModifier.java 21 Feb 2003 16:33:39 -0000 1.7
@@ -131,7 +131,7 @@
public void testGrabSessionId() throws Exception
{
String html =
- "location:
http://server.com/index.html?session_id=jfdkjdkf%jddkfdfjkdjfdf";
+ "location:
http://server.com/index.html?session_id=jfdkjdkf%20jddkfdfjkdjfdf%22";
response = new SampleResult();
response.setResponseData(html.getBytes());
URLRewritingModifier mod = new URLRewritingModifier();
@@ -145,10 +145,10 @@
mod.modifyEntry(sampler, response);
Arguments args = sampler.getArguments();
assertEquals(
- "jfdkjdkf%jddkfdfjkdjfdf",
+ "jfdkjdkf jddkfdfjkdjfdf\"",
((Argument) args.getArguments().get(0)).getValue());
assertEquals(
-
"http://server.com:80/index.html?session_id=jfdkjdkf%jddkfdfjkdjfdf",
+
"http://server.com:80/index.html?session_id=jfdkjdkf+jddkfdfjkdjfdf%22",
sampler.toString());
}
public void testGrabSessionId2() throws Exception
1.6 +17 -93
jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java
Index: HTTPArgument.java
===================================================================
RCS file:
/home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/HTTPArgument.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- HTTPArgument.java 17 Oct 2002 19:47:20 -0000 1.5
+++ HTTPArgument.java 21 Feb 2003 16:33:39 -0000 1.6
@@ -54,14 +54,13 @@
*/
package org.apache.jmeter.protocol.http.util;
-import junit.framework.TestCase;
-import java.net.URLEncoder;
+import java.io.Serializable;
import java.net.URLDecoder;
-
-import java.util.List;
-import java.util.LinkedList;
import java.util.Iterator;
-import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.TestCase;
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
@@ -74,9 +73,9 @@
*/
public class HTTPArgument extends Argument implements Serializable {
- private static final String ENCODED_NAME = "HTTPArgument.encoded_name";
- private static final String ENCODED_VALUE = "HTTPArgument.encoded_value";
private static final String ALWAYS_ENCODE = "HTTPArgument.always_encode";
+
+ private static EncoderCache cache = new EncoderCache(1000);
/****************************************
@@ -92,15 +91,6 @@
this.setMetaData(metadata);
}
- private void encodeName(String name)
- {
- if(getAlwaysEncode())
- {
- name = URLEncoder.encode(name);
- }
- setProperty(ENCODED_NAME,name);
- }
-
public void setAlwaysEncode(boolean ae)
{
setProperty(ALWAYS_ENCODE,new Boolean(ae));
@@ -110,18 +100,7 @@
{
return getPropertyAsBoolean(ALWAYS_ENCODE);
}
-
- private void encodeValue(Object value)
- {
- if(value != null)
- {
- if(getAlwaysEncode())
- {
- value = URLEncoder.encode(value.toString());
- }
- setProperty(ENCODED_VALUE,value.toString());
- }
- }
+
/****************************************
* Constructor for the Argument object
*
@@ -136,55 +115,13 @@
public HTTPArgument(String name, Object value, boolean alreadyEncoded)
{
setAlwaysEncode(true);
- if(alreadyEncoded)
- {
- try
- {
- setName(URLDecoder.decode(name));
- }
- catch(IllegalArgumentException e)
- {
- setName(name);
- }
- try
- {
- setValue(URLDecoder.decode(value.toString()));
- }
- catch(IllegalArgumentException e)
- {
- setValue(value.toString());
- }
- setProperty(ENCODED_NAME,name);
- setProperty(ENCODED_VALUE,value.toString());
- }
- else
- {
- setName(name);
- setValue(value);
- }
- }
-
- public void setProperty(String key,Object value)
- {
- if(value == null || !value.equals(getProperty(key)))
- {
- if(Argument.NAME.equals(key))
- {
- if(value == null)
- {
- encodeName("");
- }
- else
- {
- encodeName(value.toString());
- }
- }
- else if(Argument.VALUE.equals(key))
- {
- encodeValue(value);
- }
- super.setProperty(key,value);
- }
+ if(alreadyEncoded)
+ {
+ name = URLDecoder.decode(name);
+ value = URLDecoder.decode(value.toString());
+ }
+ setName(name);
+ setValue(value);
}
public HTTPArgument(String name,Object value,Object metaData,boolean
alreadyEncoded)
@@ -218,25 +155,12 @@
public String getEncodedValue()
{
- return getPropertyAsString(ENCODED_VALUE);
+ return cache.getEncoded(getValue().toString());
}
public String getEncodedName()
{
- return getPropertyAsString(ENCODED_NAME);
- }
-
- /****************************************
- * Sets the Value attribute of the Argument object
- *
- *@param newValue The new Value value
- ***************************************/
- public void setValue(Object newValue)
- {
- if(newValue == null || !newValue.equals(getValue()))
- {
- super.setValue(newValue);
- }
+ return cache.getEncoded(getName());
}
public static void convertArgumentsToHTTP(Arguments args)
1.1
jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/util/EncoderCache.java
Index: EncoderCache.java
===================================================================
package org.apache.jmeter.protocol.http.util;
import java.net.URLEncoder;
import org.apache.oro.util.Cache;
import org.apache.oro.util.CacheLRU;
/**
* @author Administrator
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
*/
public class EncoderCache
{
Cache cache;
public EncoderCache(int cacheSize)
{
cache = new CacheLRU(cacheSize);
}
public String getEncoded(String k)
{
Object encodedValue = cache.getElement(k);
if(encodedValue != null)
{
return (String)encodedValue;
}
encodedValue = URLEncoder.encode(k);
cache.addElement(k,encodedValue);
return (String)encodedValue;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]