This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch jbFixRestNpe
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/jbFixRestNpe by this push:
     new 0a701d574 HeaderList should extend from ArrayList.
0a701d574 is described below

commit 0a701d574313d15507f983fce6f948505e748169
Author: JamesBognar <[email protected]>
AuthorDate: Fri Aug 12 18:14:02 2022 -0400

    HeaderList should extend from ArrayList.
---
 .../org/apache/juneau/rest/client/RestRequest.java |   4 +-
 .../apache/juneau/rest/client/RestResponse.java    |   4 +-
 .../org/apache/juneau/http/header/HeaderList.java  | 265 ++++++---------------
 .../org/apache/juneau/http/part/PartIterator.java  |  11 +-
 .../java/org/apache/juneau/http/part/PartList.java |  27 +--
 .../juneau/http/response/BasicHttpException.java   |   4 +-
 .../juneau/http/response/BasicHttpResponse.java    |   4 +-
 .../apache/juneau/http/header/HeaderList_Test.java |  24 +-
 .../org/apache/juneau/http/part/PartList_Test.java |  26 +-
 .../org/apache/juneau/http/remote/Remote_Test.java |   3 +
 10 files changed, 114 insertions(+), 258 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
index 2d2e9e251..7aa2328e5 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
@@ -2486,7 +2486,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         */
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return getHeaderList().iterator();
+               return getHeaderList().headerIterator();
        }
 
        /**
@@ -2497,7 +2497,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         */
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return getHeaderList().iterator(name);
+               return getHeaderList().headerIterator(name);
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
index ee7e038ed..6ed543d01 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
@@ -797,7 +797,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return headers.iterator();
+               return headers.headerIterator();
        }
 
        /**
@@ -808,7 +808,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return headers.iterator(name);
+               return headers.headerIterator(name);
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
index b7d2eb098..c26f008b4 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -24,6 +24,7 @@ import java.util.stream.*;
 import org.apache.http.*;
 import org.apache.http.util.*;
 import org.apache.juneau.*;
+import org.apache.juneau.collections.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.http.HttpHeaders;
 import org.apache.juneau.internal.*;
@@ -90,7 +91,7 @@ import org.apache.juneau.svl.*;
  * Various methods are provided for iterating over the headers in this list to 
avoid array copies.
  * <ul class='javatree'>
  *     <li class='jm'>{@link #forEach(Consumer)} / {@link 
#forEach(String,Consumer)} / {@link #forEach(Predicate,Consumer)} - Use 
consumers to process headers.
- *     <li class='jm'>{@link #iterator()} / {@link #iterator(String)} - Use an 
{@link HeaderIterator} to process headers.
+ *     <li class='jm'>{@link #headerIterator()} / {@link 
#headerIterator(String)} - Use an {@link HeaderIterator} to process headers.
  *     <li class='jm'>{@link #stream()} / {@link #stream(String)} - Use a 
stream.
  * </ul>
  * <p>
@@ -168,21 +169,27 @@ import org.apache.juneau.svl.*;
  *     <li class='extlink'>{@source}
  * </ul>
  */
-public class HeaderList {
+public class HeaderList extends ControlledArrayList<Header>{
 
        
//-----------------------------------------------------------------------------------------------------------------
        // Static
        
//-----------------------------------------------------------------------------------------------------------------
 
+       private static final long serialVersionUID = 1L;
        private static final Header[] EMPTY_ARRAY = new Header[0];
        private static final String[] EMPTY_STRING_ARRAY = new String[0];
        private static final Predicate<Header> NOT_NULL = x -> x != null;
 
        /** Represents no header supplier in annotations. */
-       public static final class Void extends HeaderList {}
+       public static final class Void extends HeaderList {
+               Void() {
+                       super(false);
+               }
+               private static final long serialVersionUID = 1L;
+       }
 
        /** Predefined instance. */
-       public static final HeaderList EMPTY = new HeaderList();
+       public static final HeaderList EMPTY = new HeaderList(false);
 
        /**
         * Instantiates a new builder for this bean.
@@ -203,7 +210,7 @@ public class HeaderList {
         * @return A new unmodifiable instance, never <jk>null</jk>.
         */
        public static HeaderList of(List<Header> headers) {
-               return headers == null || headers.isEmpty() ? EMPTY : new 
HeaderList(headers);
+               return headers == null || headers.isEmpty() ? EMPTY : new 
HeaderList(true, headers);
        }
 
        /**
@@ -215,7 +222,7 @@ public class HeaderList {
         * @return A new unmodifiable instance, never <jk>null</jk>.
         */
        public static HeaderList of(Header...headers) {
-               return headers == null || headers.length == 0 ? EMPTY : new 
HeaderList(headers);
+               return headers == null || headers.length == 0 ? EMPTY : new 
HeaderList(true, headers);
        }
 
        /**
@@ -240,7 +247,7 @@ public class HeaderList {
                ArrayBuilder<Header> b = 
ArrayBuilder.of(Header.class).filter(NOT_NULL).size(pairs.length / 2);
                for (int i = 0; i < pairs.length; i+=2)
                        b.add(BasicHeader.of(pairs[i], pairs[i+1]));
-               return new HeaderList(b.orElse(EMPTY_ARRAY));
+               return new HeaderList(true, b.orElse(EMPTY_ARRAY));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -256,7 +263,7 @@ public class HeaderList {
                final List<Header> entries;
                List<Header> defaultEntries;
                private VarResolver varResolver;
-               boolean caseSensitive;
+               boolean caseSensitive = false, unmodifiable = false;
 
                /**
                 * Constructor.
@@ -273,8 +280,9 @@ public class HeaderList {
                 */
                protected Builder(HeaderList copyFrom) {
                        super(copyFrom.getClass(), BeanStore.INSTANCE);
-                       entries = list(copyFrom.entries);
+                       entries = copyOf(copyFrom);
                        caseSensitive = copyFrom.caseSensitive;
+                       unmodifiable = false;
                }
 
                /**
@@ -288,6 +296,7 @@ public class HeaderList {
                        defaultEntries = copyOf(copyFrom.defaultEntries);
                        varResolver = copyFrom.varResolver;
                        caseSensitive = copyFrom.caseSensitive;
+                       unmodifiable = copyFrom.unmodifiable;
                }
 
                @Override /* BeanBuilder */
@@ -371,27 +380,26 @@ public class HeaderList {
                }
 
                /**
-                * Removes any headers already in this builder.
+                * Specifies that the resulting list should be unmodifiable.
+                *
+                * <p>
+                * The default behavior is modifiable.
                 *
                 * @return This object.
                 */
-               @FluentSetter
-               public Builder clear() {
-                       entries.clear();
+               public Builder unmodifiable() {
+                       unmodifiable = true;
                        return this;
                }
 
                /**
-                * Adds the specified headers to the end of the headers in this 
builder.
+                * Removes any headers already in this builder.
                 *
-                * @param value The header to add.  <jk>null</jk> values are 
ignored.
                 * @return This object.
                 */
                @FluentSetter
-               public Builder append(HeaderList value) {
-                       if (value != null)
-                               for (Header x : value.entries)
-                                       append(x);
+               public Builder clear() {
+                       entries.clear();
                        return this;
                }
 
@@ -467,19 +475,6 @@ public class HeaderList {
                        return this;
                }
 
-               /**
-                * Adds the specified header to the beginning of the headers in 
this builder.
-                *
-                * @param value The header to add.  <jk>null</jk> values are 
ignored.
-                * @return This object.
-                */
-               @FluentSetter
-               public Builder prepend(HeaderList value) {
-                       if (value != null)
-                               prependAll(entries, value.entries);
-                       return this;
-               }
-
                /**
                 * Adds the specified header to the beginning of the headers in 
this builder.
                 *
@@ -550,20 +545,6 @@ public class HeaderList {
                        return this;
                }
 
-               /**
-                * Removes the specified header from this builder.
-                *
-                * @param value The header to remove.  <jk>null</jk> values are 
ignored.
-                * @return This object.
-                */
-               @FluentSetter
-               public Builder remove(HeaderList value) {
-                       if (value != null)
-                               for (int i = 0; i < value.entries.length; i++)
-                                       remove(value.entries[i]);
-                       return this;
-               }
-
                /**
                 * Removes the specified header from this builder.
                 *
@@ -598,8 +579,8 @@ public class HeaderList {
                 */
                @FluentSetter
                public Builder remove(List<Header> values) {
-                       for (int i = 0, j = values.size(); i < j; i++) /* See 
HTTPCORE-361 */
-                               remove(values.get(i));
+                       if (values != null)
+                               values.forEach(x -> remove(x));
                        return this;
                }
 
@@ -739,21 +720,6 @@ public class HeaderList {
                        return this;
                }
 
-               /**
-                * Replaces the first occurrence of the headers with the same 
name.
-                *
-                * <p>
-                * If no header with the same name is found the given header is 
added to the end of the list.
-                *
-                * @param values The headers to replace.  <jk>null</jk> values 
are ignored.
-                * @return This object.
-                */
-               public Builder set(HeaderList values) {
-                       if (values != null)
-                               set(values.entries);
-                       return this;
-               }
-
                /**
                 * Sets a default value for a header.
                 *
@@ -863,21 +829,6 @@ public class HeaderList {
                        return this;
                }
 
-               /**
-                * Replaces the first occurrence of the headers with the same 
name.
-                *
-                * <p>
-                * If no header with the same name is found the given header is 
added to the end of the list.
-                *
-                * @param values The default headers to set.  <jk>null</jk> 
values are ignored.
-                * @return This object.
-                */
-               public Builder setDefault(HeaderList values) {
-                       if (values != null)
-                               setDefault(values.entries);
-                       return this;
-               }
-
                /**
                 * Adds the specify header to this list.
                 *
@@ -1018,33 +969,6 @@ public class HeaderList {
                        throw new BasicRuntimeException("Invalid value 
specified for flag parameter on add(flag,values) method: {0}", flag);
                }
 
-               /**
-                * Adds the specified headers to this list.
-                *
-                * @param flag
-                *      What to do with the header.
-                *      <br>Possible values:
-                *      <ul>
-                *              <li>{@link ListOperation#APPEND APPEND} - Calls 
{@link #append(HeaderList)}.
-                *              <li>{@link ListOperation#PREPEND PREEND} - 
Calls {@link #prepend(HeaderList)}.
-                *              <li>{@link ListOperation#SET REPLACE} - Calls 
{@link #set(HeaderList)}.
-                *              <li>{@link ListOperation#DEFAULT DEFAULT} - 
Calls {@link #setDefault(HeaderList)}.
-                *      </ul>
-                * @param values The headers to add.
-                * @return This object.
-                */
-               public Builder add(ListOperation flag, HeaderList values) {
-                       if (flag == ListOperation.APPEND)
-                               return append(values);
-                       if (flag == ListOperation.PREPEND)
-                               return prepend(values);
-                       if (flag == ListOperation.SET)
-                               return set(values);
-                       if (flag == ListOperation.DEFAULT)
-                               return setDefault(values);
-                       throw new BasicRuntimeException("Invalid value 
specified for flag parameter on add(flag,values) method: {0}", flag);
-               }
-
                /**
                 * Performs an action on all headers in this list.
                 *
@@ -1102,7 +1026,7 @@ public class HeaderList {
                 * @param value The header value.
                 * @return A new header.
                 */
-               public Header createHeader(String name, Object value) {
+               protected Header createHeader(String name, Object value) {
                        if (value instanceof Supplier<?>) {
                                Supplier<?> value2 = (Supplier<?>)value;
                                return isResolving() ? new BasicHeader(name, 
resolver(value2)) : new BasicHeader(name, value2);
@@ -1194,7 +1118,6 @@ public class HeaderList {
        // Instance
        
//-----------------------------------------------------------------------------------------------------------------
 
-       final Header[] entries;
        final boolean caseSensitive;
 
        /**
@@ -1203,24 +1126,17 @@ public class HeaderList {
         * @param builder The builder containing the settings for this bean.
         */
        public HeaderList(Builder builder) {
-               if (builder.defaultEntries == null) {
-                       entries = builder.entries.toArray(new 
Header[builder.entries.size()]);
-               } else {
-                       ArrayBuilder<Header> l = 
ArrayBuilder.of(Header.class).filter(NOT_NULL).size(builder.entries.size() + 
builder.defaultEntries.size());
-
-                       for (int i = 0, j = builder.entries.size(); i < j; i++)
-                               l.add(builder.entries.get(i));
+               super(! builder.unmodifiable, builder.entries);
 
+               if (builder.defaultEntries != null) {
                        for (int i1 = 0, j1 = builder.defaultEntries.size(); i1 
< j1; i1++) {
                                Header x = builder.defaultEntries.get(i1);
                                boolean exists = false;
                                for (int i2 = 0, j2 = builder.entries.size(); 
i2 < j2 && ! exists; i2++)
                                        exists = 
eq(builder.entries.get(i2).getName(), x.getName());
                                if (! exists)
-                                       l.add(x);
+                                       overrideAdd(x);
                        }
-
-                       entries = l.orElse(EMPTY_ARRAY);
                }
                this.caseSensitive = builder.caseSensitive;
        }
@@ -1228,39 +1144,37 @@ public class HeaderList {
        /**
         * Constructor.
         *
+        * @param modifiable Whether this list should be modifiable.
         * @param headers
         *      The headers to add to the list.
         *      <br>Can be <jk>null</jk>.
         *      <br><jk>null</jk> entries are ignored.
         */
-       protected HeaderList(List<Header> headers) {
-               ArrayBuilder<Header> l = 
ArrayBuilder.of(Header.class).filter(NOT_NULL).size(headers.size());
-               for (int i = 0, j = headers.size(); i < j; i++)
-                       l.add(headers.get(i));
-               entries = l.orElse(EMPTY_ARRAY);
+       protected HeaderList(boolean modifiable, List<Header> headers) {
+               super(modifiable, headers);
                caseSensitive = false;
        }
 
        /**
         * Constructor.
         *
+        * @param modifiable Whether this list should be modifiable.
         * @param headers
         *      The headers to add to the list.
         *      <br><jk>null</jk> entries are ignored.
         */
-       protected HeaderList(Header...headers) {
-               ArrayBuilder<Header> l = 
ArrayBuilder.of(Header.class).filter(NOT_NULL).size(headers.length);
-               for (int i = 0; i < headers.length; i++)
-                       l.add(headers[i]);
-               entries = l.orElse(EMPTY_ARRAY);
+       protected HeaderList(boolean modifiable, Header...headers) {
+               super(modifiable, Arrays.asList(headers));
                caseSensitive = false;
        }
 
        /**
         * Default constructor.
+        *
+        * @param modifiable Whether this list should be modifiable.
         */
-       protected HeaderList() {
-               entries = EMPTY_ARRAY;
+       protected HeaderList(boolean modifiable) {
+               super(modifiable);
                caseSensitive = false;
        }
 
@@ -1287,8 +1201,7 @@ public class HeaderList {
 
                Header first = null;
                List<Header> rest = null;
-               for (int i = 0; i < entries.length; i++) {
-                       Header x = entries[i];
+               for (Header x : this) {
                        if (eq(x.getName(), name)) {
                                if (first == null)
                                        first = x;
@@ -1346,8 +1259,7 @@ public class HeaderList {
 
                Header first = null;
                List<Header> rest = null;
-               for (int i = 0; i < entries.length; i++) {
-                       Header x = entries[i];
+               for (Header x : this) {
                        if (eq(x.getName(), name)) {
                                if (first == null)
                                        first = x;
@@ -1401,11 +1313,10 @@ public class HeaderList {
        }
 
        /**
-        * Gets all of the headers with the given name.
+        * Gets all of the headers contained within this list.
         *
         * <p>
         * The returned array maintains the relative order in which the headers 
were added.
-        * Header name comparison is case insensitive.
         * Headers with null values are ignored.
         * Each call creates a new array not backed by this list.
         *
@@ -1413,23 +1324,18 @@ public class HeaderList {
         * As a general rule, it's more efficient to use the other methods with 
consumers to
         * get headers.
         *
-        * @param name The header name.
-        *
-        * @return An array containing all matching headers, never 
<jk>null</jk>.
+        * @return An array of all the headers in this list, never 
<jk>null</jk>.
         */
-       public Header[] getAll(String name) {
-               ArrayBuilder<Header> b = 
ArrayBuilder.of(Header.class).filter(NOT_NULL);
-               for (int i = 0; i < entries.length; i++)
-                       if (eq(entries[i].getName(), name))
-                               b.add(entries[i]);
-               return b.orElse(EMPTY_ARRAY);
+       public Header[] getAll() {
+               return size() == 0 ? EMPTY_ARRAY : toArray(new Header[size()]);
        }
 
        /**
-        * Gets all of the headers contained within this list.
+        * Gets all of the headers with the given name.
         *
         * <p>
         * The returned array maintains the relative order in which the headers 
were added.
+        * Header name comparison is case insensitive.
         * Headers with null values are ignored.
         * Each call creates a new array not backed by this list.
         *
@@ -1437,19 +1343,16 @@ public class HeaderList {
         * As a general rule, it's more efficient to use the other methods with 
consumers to
         * get headers.
         *
-        * @return An array of all the headers in this list, never 
<jk>null</jk>.
-        */
-       public Header[] getAll() {
-               return entries.length == 0 ? EMPTY_ARRAY : 
Arrays.copyOf(entries, entries.length);
-       }
-
-       /**
-        * Returns the number of headers in this list.
+        * @param name The header name.
         *
-        * @return The number of headers in this list.
+        * @return An array containing all matching headers, never 
<jk>null</jk>.
         */
-       public int size() {
-               return entries.length;
+       public Header[] getAll(String name) {
+               ArrayBuilder<Header> b = 
ArrayBuilder.of(Header.class).filter(NOT_NULL);
+               for (Header x : this)
+                       if (eq(x.getName(), name))
+                               b.add(x);
+               return b.orElse(EMPTY_ARRAY);
        }
 
        /**
@@ -1462,8 +1365,8 @@ public class HeaderList {
         * @return The first matching header, or <jk>null</jk> if not found.
         */
        public Optional<Header> getFirst(String name) {
-               for (int i = 0; i < entries.length; i++) {
-                       Header x = entries[i];
+               for (int i = 0; i < size(); i++) {
+                       Header x = get(i);
                        if (eq(x.getName(), name))
                                return optional(x);
                }
@@ -1480,8 +1383,8 @@ public class HeaderList {
         * @return The last matching header, or <jk>null</jk> if not found.
         */
        public Optional<Header> getLast(String name) {
-               for (int i = entries.length - 1; i >= 0; i--) {
-                       Header x = entries[i];
+               for (int i = size() - 1; i >= 0; i--) {
+                       Header x = get(i);
                        if (eq(x.getName(), name))
                                return optional(x);
                }
@@ -1532,8 +1435,7 @@ public class HeaderList {
         * @return <jk>true</jk> if at least one header with the name is 
present.
         */
        public boolean contains(String name) {
-               for (int i = 0; i < entries.length; i++) {
-                       Header x = entries[i];
+               for (Header x : this) {
                        if (eq(x.getName(), name))
                                return true;
                }
@@ -1545,8 +1447,8 @@ public class HeaderList {
         *
         * @return A new iterator over this list of headers.
         */
-       public HeaderIterator iterator() {
-               return new BasicHeaderIterator(entries, null, caseSensitive);
+       public HeaderIterator headerIterator() {
+               return new BasicHeaderIterator(getAll(), null, caseSensitive);
        }
 
        /**
@@ -1556,22 +1458,8 @@ public class HeaderList {
         *
         * @return A new iterator over the matching headers in this list.
         */
-       public HeaderIterator iterator(String name) {
-               return new BasicHeaderIterator(entries, name, caseSensitive);
-       }
-
-       /**
-        * Performs an action on all headers in this list.
-        *
-        * <p>
-        * This is the preferred method for iterating over headers as it does 
not involve
-        * creation or copy of lists/arrays.
-        *
-        * @param action An action to perform on each element.
-        * @return This object.
-        */
-       public HeaderList forEach(Consumer<Header> action) {
-               return forEach(x -> true, action);
+       public HeaderIterator headerIterator(String name) {
+               return new BasicHeaderIterator(getAll(name), name, 
caseSensitive);
        }
 
        /**
@@ -1601,23 +1489,10 @@ public class HeaderList {
         * @return This object.
         */
        public HeaderList forEach(Predicate<Header> filter, Consumer<Header> 
action) {
-               for (int i = 0; i < entries.length; i++)
-                       consume(filter, action, entries[i]);
+               forEach(x -> consume(filter, action, x));
                return this;
        }
 
-       /**
-        * Returns a stream of the headers in this list.
-        *
-        * <p>
-        * This does not involve a copy of the underlying array of 
<c>Header</c> objects so should perform well.
-        *
-        * @return This object.
-        */
-       public Stream<Header> stream() {
-               return Arrays.stream(entries);
-       }
-
        /**
         * Returns a stream of the headers in this list with the specified name.
         *
@@ -1637,6 +1512,6 @@ public class HeaderList {
 
        @Override /* Object */
        public String toString() {
-               return alist(entries).toString();
+               return super.toString();
        }
 }
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartIterator.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartIterator.java
index a93b8b540..d1445b3d7 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartIterator.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartIterator.java
@@ -24,13 +24,4 @@ import org.apache.http.*;
  *     <li class='extlink'>{@source}
  * </ul>
  */
-public interface PartIterator extends Iterator<NameValuePair> {
-
-       /**
-        * Indicates whether there is another part in this iteration.
-        *
-        * @return <jk>true</jk> if there is another part.
-        */
-       @Override /* Iterator */
-       boolean hasNext();
-}
+public interface PartIterator extends Iterator<NameValuePair> {}
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
index e57bc67c3..db0300d93 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
@@ -91,7 +91,7 @@ import org.apache.juneau.svl.*;
  * Various methods are provided for iterating over the parts in this list to 
avoid array copies.
  * <ul class='javatree'>
  *     <li class='jm'>{@link #forEach(Consumer)} / {@link 
#forEach(String,Consumer)} / {@link #forEach(Predicate,Consumer)} - Use 
consumers to process parts.
- *     <li class='jm'>{@link #iterator()} / {@link #iterator(String)} - Use an 
{@link PartIterator} to process parts.
+ *     <li class='jm'>{@link #partIterator()} / {@link #partIterator(String)} 
- Use an {@link PartIterator} to process parts.
  *     <li class='jm'>{@link #stream()} / {@link #stream(String)} - Use a 
stream.
  * </ul>
  * <p>
@@ -169,8 +169,8 @@ public class PartList extends 
ControlledArrayList<NameValuePair> {
        private static final Predicate<NameValuePair> NOT_NULL = x -> x != null;
 
        /** Represents no part supplier in annotations. */
-       public static final class Null extends PartList {
-               Null(boolean modifiable) {
+       public static final class Void extends PartList {
+               Void() {
                        super(false);
                }
                private static final long serialVersionUID = 1L;
@@ -462,19 +462,6 @@ public class PartList extends 
ControlledArrayList<NameValuePair> {
                        return this;
                }
 
-               /**
-                * Adds the specified part to the beginning of the parts in 
this builder.
-                *
-                * @param value The part to add.  <jk>null</jk> values are 
ignored.
-                * @return This object.
-                */
-               @FluentSetter
-               public Builder prepend(PartList value) {
-                       if (value != null)
-                               prependAll(entries, value.getAll());
-                       return this;
-               }
-
                /**
                 * Adds the specified part to the beginning of the parts in 
this builder.
                 *
@@ -1350,7 +1337,8 @@ public class PartList extends 
ControlledArrayList<NameValuePair> {
         * @return The first matching part, or <jk>null</jk> if not found.
         */
        public Optional<NameValuePair> getFirst(String name) {
-               for (NameValuePair x : this) {
+               for (int i = 0; i < size(); i++) {
+                       NameValuePair x = get(i);
                        if (eq(x.getName(), name))
                                return optional(x);
                }
@@ -1431,8 +1419,7 @@ public class PartList extends 
ControlledArrayList<NameValuePair> {
         *
         * @return A new iterator over this list of parts.
         */
-       @Override
-       public PartIterator iterator() {
+       public PartIterator partIterator() {
                return new BasicPartIterator(getAll(), null, caseInsensitive);
        }
 
@@ -1443,7 +1430,7 @@ public class PartList extends 
ControlledArrayList<NameValuePair> {
         *
         * @return A new iterator over the matching parts in this list.
         */
-       public PartIterator iterator(String name) {
+       public PartIterator partIterator(String name) {
                return new BasicPartIterator(getAll(), name, caseInsensitive);
        }
 
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
index 24f28c679..c7b2fb343 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
@@ -310,12 +310,12 @@ public class BasicHttpException extends 
BasicRuntimeException implements HttpRes
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return headers().iterator();
+               return headers().headerIterator();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return headers().iterator(name);
+               return headers().headerIterator(name);
        }
 
        @SuppressWarnings("deprecation")
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
index af0d0c64c..9cebf3c0b 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
@@ -185,12 +185,12 @@ public class BasicHttpResponse implements HttpResponse {
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return headers().iterator();
+               return headers().headerIterator();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return headers().iterator(name);
+               return headers().headerIterator(name);
        }
 
        @SuppressWarnings("deprecation")
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
index fbbdbc121..cad508411 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
@@ -74,10 +74,10 @@ public class HeaderList_Test {
                HeaderList x;
 
                x = headerList(FOO_1, FOO_2, null);
-               assertObject(x).isString("[Foo: 1, Foo: 2]");
+               assertObject(x).isString("[Foo: 1, Foo: 2, null]");
 
                x = headerList(alist(FOO_1, FOO_2, null));
-               assertObject(x).isString("[Foo: 1, Foo: 2]");
+               assertObject(x).isString("[Foo: 1, Foo: 2, null]");
 
                x = headerList("Foo","1","Foo","2");
                assertObject(x).isString("[Foo: 1, Foo: 2]");
@@ -219,18 +219,18 @@ public class HeaderList_Test {
        @Test
        public void a12_headerIterator_all() {
                HeaderList x = HeaderList.of();
-               assertBoolean(x.iterator().hasNext()).isFalse();
+               assertBoolean(x.headerIterator().hasNext()).isFalse();
                x = HeaderList.of(FOO_1);
-               assertBoolean(x.iterator().hasNext()).isTrue();
+               assertBoolean(x.headerIterator().hasNext()).isTrue();
        }
 
        @Test
        public void a13_headerIterator_single() {
                HeaderList x = HeaderList.of();
-               assertBoolean(x.iterator("Foo").hasNext()).isFalse();
+               assertBoolean(x.headerIterator("Foo").hasNext()).isFalse();
                x = HeaderList.of(FOO_1);
-               assertBoolean(x.iterator("Foo").hasNext()).isTrue();
-               assertBoolean(x.iterator("FOO").hasNext()).isTrue();
+               assertBoolean(x.headerIterator("Foo").hasNext()).isTrue();
+               assertBoolean(x.headerIterator("FOO").hasNext()).isTrue();
        }
 
        @Test
@@ -445,27 +445,27 @@ public class HeaderList_Test {
        public void c01_iterators() {
                HeaderList x = 
HeaderList.of(Accept.TEXT_XML,ContentType.TEXT_XML);
 
-               HeaderIterator i1 = x.iterator();
+               HeaderIterator i1 = x.headerIterator();
                assertObject(i1.nextHeader()).isString("Accept: text/xml");
                assertObject(i1.nextHeader()).isString("Content-Type: 
text/xml");
                assertThrown(()->i1.nextHeader()).asMessage().is("Iteration 
already finished.");
 
-               HeaderIterator i2 = x.iterator();
+               HeaderIterator i2 = x.headerIterator();
                assertObject(i2.next()).isString("Accept: text/xml");
                assertObject(i2.nextHeader()).isString("Content-Type: 
text/xml");
                assertThrown(()->i2.next()).asMessage().is("Iteration already 
finished.");
 
-               HeaderIterator i3 = x.iterator("accept");
+               HeaderIterator i3 = x.headerIterator("accept");
                assertObject(i3.nextHeader()).isString("Accept: text/xml");
                assertThrown(()->i3.nextHeader()).asMessage().is("Iteration 
already finished.");
 
                HeaderList x2 = 
HeaderList.create().append(Accept.TEXT_XML,ContentType.TEXT_XML).caseSensitive().build();
 
-               HeaderIterator i4 = x2.iterator("Accept");
+               HeaderIterator i4 = x2.headerIterator("Accept");
                assertObject(i4.nextHeader()).isString("Accept: text/xml");
                assertThrown(()->i4.nextHeader()).asMessage().is("Iteration 
already finished.");
 
-               HeaderIterator i5 = x2.iterator("accept");
+               HeaderIterator i5 = x2.headerIterator("accept");
                assertThrown(()->i5.nextHeader()).asMessage().is("Iteration 
already finished.");
 
                assertThrown(()->i5.remove()).asMessage().is("Not supported.");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
index bb2fe44f1..c359f78af 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
@@ -92,7 +92,7 @@ public class PartList_Test {
                x.append((List<NameValuePair>)null);
                
assertObject(x.build()).isString("Foo=1&Foo=2&Foo=3&Foo=4&Foo=5&Foo=6&Foo=7");
 
-               assertObject(new PartList.Null(false)).isString("");
+               assertObject(new PartList.Void()).isString("");
        }
 
        @Test
@@ -241,20 +241,20 @@ public class PartList_Test {
        }
 
        @Test
-       public void a12_headerIterator_all() {
+       public void a12_partIterator_all() {
                PartList x = PartList.of();
-               assertBoolean(x.iterator().hasNext()).isFalse();
+               assertBoolean(x.partIterator().hasNext()).isFalse();
                x = PartList.of(FOO_1);
-               assertBoolean(x.iterator().hasNext()).isTrue();
+               assertBoolean(x.partIterator().hasNext()).isTrue();
        }
 
        @Test
-       public void a13_headerIterator_single() {
+       public void a13_partIterator_single() {
                PartList x = PartList.of();
-               assertBoolean(x.iterator("Foo").hasNext()).isFalse();
+               assertBoolean(x.partIterator("Foo").hasNext()).isFalse();
                x = PartList.of(FOO_1);
-               assertBoolean(x.iterator("Foo").hasNext()).isTrue();
-               assertBoolean(x.iterator("FOO").hasNext()).isFalse();
+               assertBoolean(x.partIterator("Foo").hasNext()).isTrue();
+               assertBoolean(x.partIterator("FOO").hasNext()).isFalse();
        }
 
        @Test
@@ -473,26 +473,26 @@ public class PartList_Test {
        public void c01_iterators() {
                PartList x = PartList.of(APart.X, BPart.X);
 
-               PartIterator i1 = x.iterator();
+               PartIterator i1 = x.partIterator();
                assertObject(i1.next()).isString("a=x");
                assertObject(i1.next()).isString("b=x");
                assertThrown(()->i1.next()).asMessage().is("Iteration already 
finished.");
 
-               PartIterator i2 = x.iterator();
+               PartIterator i2 = x.partIterator();
                assertObject(i2.next()).isString("a=x");
                assertObject(i2.next()).isString("b=x");
                assertThrown(()->i2.next()).asMessage().is("Iteration already 
finished.");
 
-               PartIterator i3 = x.iterator("a");
+               PartIterator i3 = x.partIterator("a");
                assertObject(i3.next()).isString("a=x");
                assertThrown(()->i3.next()).asMessage().is("Iteration already 
finished.");
 
-               PartIterator i4 = x.iterator("A");
+               PartIterator i4 = x.partIterator("A");
                assertThrown(()->i4.next()).asMessage().is("Iteration already 
finished.");
 
                PartList x2 = 
PartList.create().append(APart.X,BPart.X).caseInsensitive().build();
 
-               PartIterator i5 = x2.iterator("A");
+               PartIterator i5 = x2.partIterator("A");
                assertObject(i5.next()).isString("a=x");
                assertThrown(()->i5.next()).asMessage().is("Iteration already 
finished.");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
index c05218f1d..7c8675711 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
@@ -567,6 +567,7 @@ public class Remote_Test {
                String[] getHeaders();
        }
 
+       @SuppressWarnings("serial")
        public static class F1b extends HeaderList {
                public F1b() {
                        super(
@@ -590,8 +591,10 @@ public class Remote_Test {
                String[] getHeaders();
        }
 
+       @SuppressWarnings("serial")
        public static class F2b extends HeaderList {
                public F2b() {
+                       super(true);
                        throw new NullPointerException("foo");
                }
        }

Reply via email to