Just to confirm that the patch has been applied -
URL: http://svn.apache.org/viewvc?rev=701225&view=rev
Log:
Bug 45479 - Support for multiple HTTP Header Manager nodes
On 24/07/2008, sebb <[EMAIL PROTECTED]> wrote:
> On 24/07/2008, Andrew Alsup <[EMAIL PROTECTED]> wrote:
> > Hi folks,
> >
> > This is my first post to the dev forum. I'm not sure of the preferred
> > mechanism for posting mods/diffs to the source, but here goes. I've added
> a
> > small bit of code to support multiple "HTTP Header Manager" nodes at
> > different scopes.
> >
>
>
> Thanks very much, looks useful.
>
> BTW, except for very small changes, the normal method is to create a
> Bugzilla issue, and attach the patch(es) there.
>
> This makes it easier to keep track of progress - and avoids mangling
> of code which sometimes happens with mailers.
>
>
> > PREVIOUS:
> > When HTTPSamplerBase.setHeaderManager(..) is called, it
> > was already checking if a more locally scoped HeaderManager had already
> been
> > assigned. If so, log a warning and overwrite with the new HeaderManager.
> >
> > NEW:
> > The HeaderManager object now supports a merge(..) operation, allowing it
> to
> > merge its values with another HeaderManager's. The result is a new
> > HeaderManager object with values from both -> with more local-scoped values
> > take precedence over more distant-scoped values. So, when
> > HTTPSamplerBase.setHeaderManager(..) detects a more locally
> > scoped HeaderManager already assigned, it stores the merged result.
> >
> > I created one new interface "TestMergeable", anticipating that this could
> > also be useful for other config elements, such as HTTP Cookie Manager.
> >
> > I'm attaching the .diff, based on current SVN trunk (as of 2008-07-23 @
> > 20:00:00 EDT).
> >
> > Thanks for a great project!
> >
> > -- Andy Alsup
> >
>
> > Index:
> > src/core/org/apache/jmeter/testelement/TestMergeable.java
> > ===================================================================
> > ---
> > src/core/org/apache/jmeter/testelement/TestMergeable.java
> > (revision 0)
> > +++
> > src/core/org/apache/jmeter/testelement/TestMergeable.java
> > (revision 0)
> > @@ -0,0 +1,12 @@
> > +package org.apache.jmeter.testelement;
> > +
> > +public interface TestMergeable {
> > +
> > + /**
> > + * Merge an object's attributes with a TestElement's attributes.
> > + * @param element The object to be merged with
> > + * @param preferLocalValue When both objects have a value for the
> > + * same attribute, this flag determines which value is
> > preferred.
> > + */
> > + public TestElement merge(TestElement element, boolean
> > preferLocalValues);
> > +}
> >
> > Property changes on:
> > src\core\org\apache\jmeter\testelement\TestMergeable.java
> > ___________________________________________________________________
> > Added: svn:keywords
> > + "Date Revision Author HeadURL Id"
> > Added: svn:eol-style
> > + native
> >
> > Index:
> >
> src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
> > ===================================================================
> > ---
> >
> src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
> > (revision 679216)
> > +++
> >
> src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java
> > (working copy)
> > @@ -30,6 +30,8 @@
> > import java.util.Vector;
> >
> > import org.apache.jmeter.config.ConfigTestElement;
> > +import org.apache.jmeter.testelement.TestElement;
> > +import org.apache.jmeter.testelement.TestMergeable;
> > import
> > org.apache.jmeter.testelement.property.CollectionProperty;
> > import org.apache.jmeter.util.JMeterUtils;
> > import org.apache.jorphan.util.JOrphanUtils;
> > @@ -40,7 +42,7 @@
> > *
> > * @version $Revision$
> > */
> > -public class HeaderManager extends ConfigTestElement implements
> > Serializable {
> > +public class HeaderManager extends ConfigTestElement implements
> > TestMergeable, Serializable {
> >
> > public static final String HEADERS = "HeaderManager.headers";//
> > $NON-NLS-1$
> >
> > @@ -252,4 +254,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 preferLocalValue When both objects have a value for the
> > + * same attribute, this flag determines which value is
> > preferred.
> > + */
> > + 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 its clear they've been
> > merged
> > + merged.setName(merged.getName() + ":" +
> > other.getName());
> > +
> > + return merged;
> > + }
> > }
> > Index:
> >
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
> > ===================================================================
> > ---
> >
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
> > (revision 679216)
> > +++
> >
> src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
> > (working copy)
> > @@ -727,7 +727,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));
> > }
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail:
> > [EMAIL PROTECTED]
> > For additional commands, e-mail:
> > [EMAIL PROTECTED]
> >
> >
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]