Author: sebb
Date: Thu Oct  2 12:49:11 2008
New Revision: 701225

URL: http://svn.apache.org/viewvc?rev=701225&view=rev
Log:
Bug 45479 - Support for multiple HTTP Header Manager nodes

Modified:
    
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
    
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java?rev=701225&r1=701224&r2=701225&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
 (original)
+++ 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
 Thu Oct  2 12:49:11 2008
@@ -31,6 +31,7 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.jmeter.config.ConfigTestElement;
+import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.util.JOrphanUtils;
@@ -255,4 +256,55 @@
     public void setSOAPHeader(Object header) {
         this.SOAPHeader = header;
     }
+
+       /**
+        * Merge the attributes with a another HeaderManager's attributes.
+        * @param element The object to be merged with
+        * @param preferLocalValues When both objects have a value for the 
+        *        same attribute, this flag determines which value is 
preferresd. 
+        */
+       public HeaderManager merge(TestElement element, boolean 
preferLocalValues) {
+               if (!(element instanceof HeaderManager)) {
+                       throw new IllegalArgumentException("Cannot merge type:" 
+ this.getClass().getName() + " with type:" + element.getClass().getName());
+               }
+               
+               // start off with a merged object as a copy of the local object
+               HeaderManager merged = (HeaderManager)this.clone();
+               
+               HeaderManager other = (HeaderManager)element;
+               // iterate thru each of the other headers
+               for (int i = 0; i < other.getHeaders().size(); i++) {
+                       Header otherHeader = other.get(i);
+                       boolean found = false;
+                       // find the same property in the local headers
+                       for (int j = 0; j < merged.getHeaders().size(); j++) {
+                               Header mergedHeader = merged.get(j);
+                               if 
(mergedHeader.getName().equalsIgnoreCase(otherHeader.getName())) {
+                                       // we have a match
+                                       found = true;
+                                       if (!preferLocalValues) {
+                                               // prefer values from the other 
object
+                                               if ( (otherHeader.getValue() == 
null) || (otherHeader.getValue().length() == 0) ) {
+                                                       // the other object has 
an empty value, so remove this value from the merged object
+                                                       merged.remove(j);
+                                               } else {
+                                                       // use the other 
object's value
+                                                       
mergedHeader.setValue(otherHeader.getValue());
+                                               }
+                                       }
+                                       // break out of the inner loop
+                                       break;
+                               }
+                       }
+                       if (!found) {
+                               // the other object has a new value to be added 
to the merged
+                               merged.add(otherHeader);
+                       }
+               }
+               
+               // finally, merge the names so it's clear they've been merged
+               merged.setName(merged.getName() + ":" + other.getName());
+               
+               return merged;
+       }
 }

Modified: 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=701225&r1=701224&r2=701225&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 (original)
+++ 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 Thu Oct  2 12:49:11 2008
@@ -715,7 +715,14 @@
     public void setHeaderManager(HeaderManager value) {
         HeaderManager mgr = getHeaderManager();
         if (mgr != null) {
-            log.warn("Existing HeaderManager " + mgr.getName() + " superseded 
by " + value.getName());
+            log.warn("Existing HeaderManager '" + mgr.getName() + "' merged 
with '" + value.getName() + "'");
+            value = mgr.merge(value, true);
+            if (log.isDebugEnabled()) {
+               log.debug("HeaderManager merged: " + value.getName());
+               for (int i=0; i < value.getHeaders().size(); i++) {
+                       log.debug("    " + value.getHeader(i).getName() + "=" + 
value.getHeader(i).getValue());
+               }
+            }
         }
         setProperty(new TestElementProperty(HEADER_MANAGER, value));
     }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=701225&r1=701224&r2=701225&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Thu Oct  2 12:49:11 2008
@@ -129,6 +129,7 @@
 <li>Random Variable - new configuration element to create random numeric 
variables</li>
 <li>Bug 45929 - improved French translations</li>
 <li>Bug 45571 - JMS Sampler correlation enhancement</li>
+<li>Bug 45479 - Support for multiple HTTP Header Manager nodes</li>
 </ul>
 
 <h3>Non-functional changes</h3>



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

Reply via email to