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]

Reply via email to