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

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


The following commit(s) were added to refs/heads/master by this push:
     new a00669a  org.apache.juneau.http improvements.
a00669a is described below

commit a00669a3e519bb0ea2e3890ae41e7b4eb1e8fde8
Author: JamesBognar <[email protected]>
AuthorDate: Tue Jul 14 17:03:53 2020 -0400

    org.apache.juneau.http improvements.
---
 .../java/org/apache/juneau/http/Constants.java     |   3 -
 .../java/org/apache/juneau/http/MediaRange.java    |  34 +-----
 .../java/org/apache/juneau/http/MediaRanges.java   |  30 +-----
 .../java/org/apache/juneau/http/MediaType.java     |  18 +---
 .../java/org/apache/juneau/http/StringRange.java   |  18 +---
 .../org/apache/juneau/http/Constants_Test.java     |  22 ++--
 ...ptTest.java => MediaRanges_FindMatch_Test.java} |   8 +-
 .../org/apache/juneau/http/MediaRanges_Test.java   | 117 +++++++++++++++++++++
 .../http/annotation/AnnotationUtilsTest.java       |   0
 .../juneau/http/header/AcceptExtensionsTest.java   | 112 --------------------
 .../java/org/apache/juneau/rest/RestRequest.java   |  15 ++-
 11 files changed, 155 insertions(+), 222 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
index 42e8019..ae31e09 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
-import org.apache.juneau.http.annotation.*;
-
 /**
  * Constants used by classes in this package.
  *
@@ -21,7 +19,6 @@ import org.apache.juneau.http.annotation.*;
  *     <li class='extlink'>{@doc RFC2616}
  * </ul>
  */
-@Header("Constants")
 public class Constants {
 
        /** Use caching of HTTP artifacts. */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
index 812fdb3..aa13a85 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRange.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
-import static org.apache.juneau.internal.ObjectUtils.*;
-
 import java.util.*;
 
 import org.apache.http.*;
@@ -24,7 +22,7 @@ import org.apache.juneau.collections.*;
 /**
  * Describes a single type used in content negotiation between an HTTP client 
and server, as described in
  * Section 14.1 and 14.7 of RFC2616 (the HTTP/1.1 specification).
- * 
+ *
  * <ul class='seealso'>
  *     <li class='extlink'>{@doc RFC2616}
  * </ul>
@@ -39,15 +37,6 @@ public class MediaRange extends MediaType {
        /**
         * Constructor.
         *
-        * @param value The raw media range string.
-        */
-       public MediaRange(String value) {
-               this(parse(value));
-       }
-
-       /**
-        * Constructor.
-        *
         * @param e The parsed media range element.
         */
        public MediaRange(HeaderElement e) {
@@ -116,27 +105,6 @@ public class MediaRange extends MediaType {
                return Collections.unmodifiableList(Arrays.asList(extensions));
        }
 
-       /**
-        * Returns <jk>true</jk> if the specified object is also a 
<c>MediaType</c>, and has the same qValue, type,
-        * parameters, and extensions.
-        *
-        * @return <jk>true</jk> if object is equivalent.
-        */
-       @Override /* Object */
-       public boolean equals(Object o) {
-               return (o instanceof MediaRange) && eq(this, (MediaRange)o, 
(x,y)->eq(x.string, y.string));
-       }
-
-       /**
-        * Returns a hash based on this instance's <c>media-type</c>.
-        *
-        * @return A hash based on this instance's <c>media-type</c>.
-        */
-       @Override /* Object */
-       public int hashCode() {
-               return string.hashCode();
-       }
-
        @Override /* Object */
        public String toString() {
                return string;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
index 1cc6c44..6258827 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaRanges.java
@@ -169,22 +169,6 @@ public class MediaRanges {
        }
 
        /**
-        * Same as {@link #findMatch(List)} but matching against media type 
ranges.
-        *
-        * <p>
-        * Note that the q-types on both the <c>mediaTypeRanges</c> parameter 
and this header
-        * are taken into account when trying to find the best match.
-        * <br>When both this header and the matching range have q-values, the 
q-value for the match is the result of multiplying them.
-        * <br>(e.g. Accept=<js>"text/html;q=0.9"</js> and 
mediaTypeRange=<js>"text/html;q=0.9"</js> ==>, q-value=<c>0.81</c>).
-        *
-        * @param mediaRanges The media type ranges to match against.
-        * @return The index into the array of the best match, or <c>-1</c> if 
no suitable matches could be found.
-        */
-       public int findMatch(MediaRanges mediaRanges) {
-               return findMatch(mediaRanges.getRanges());
-       }
-
-       /**
         * Returns the {@link MediaRange} at the specified index.
         *
         * @param index The index position of the media range.
@@ -217,16 +201,6 @@ public class MediaRanges {
        }
 
        /**
-        * Parses the specified header element part.
-        *
-        * @param value The header element part.
-        * @return Thew parsed header element part.  Never <jk>null</jk>.
-        */
-       protected static HeaderElement[] parse(String value) {
-               return 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
-       }
-
-       /**
         * Returns the media ranges that make up this object.
         *
         * @return The media ranges that make up this object.
@@ -235,6 +209,10 @@ public class MediaRanges {
                return Collections.unmodifiableList(Arrays.asList(ranges));
        }
 
+       private static HeaderElement[] parse(String value) {
+               return 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+       }
+
        @Override /* Object */
        public String toString() {
                return string;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
index c08d11a..78bf361 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/MediaType.java
@@ -39,8 +39,6 @@ public class MediaType implements Comparable<MediaType>  {
 
        private static final Cache<String,MediaType> CACHE = new 
Cache<>(NOCACHE, CACHE_MAX_SIZE);
 
-       private static final HeaderElement DEFAULT_ELEMENT = new 
BasicHeaderElement("", "");
-
        /** Reusable predefined media type */
        @SuppressWarnings("javadoc")
        public static final MediaType
@@ -161,17 +159,6 @@ public class MediaType implements Comparable<MediaType>  {
        }
 
        /**
-        * Parses the specified header element part.
-        *
-        * @param value The header element part.
-        * @return Thew parsed header element part.  Never <jk>null</jk>.
-        */
-       protected static HeaderElement parse(String value) {
-               HeaderElement[] elements = 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
-               return (elements.length > 0 ? elements[0] : DEFAULT_ELEMENT);
-       }
-
-       /**
         * Returns the <js>'type'</js> fragment of the <js>'type/subType'</js> 
string.
         *
         * @return The media type.
@@ -327,6 +314,11 @@ public class MediaType implements Comparable<MediaType>  {
                return Collections.unmodifiableList(Arrays.asList(parameters));
        }
 
+       private static HeaderElement parse(String value) {
+               HeaderElement[] elements = 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+               return (elements.length > 0 ? elements[0] : new 
BasicHeaderElement("", ""));
+       }
+
        @Override /* Object */
        public String toString() {
                return string;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
index 5605340..24f6b78 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StringRange.java
@@ -40,8 +40,6 @@ import org.apache.juneau.collections.*;
 @BeanIgnore
 public class StringRange {
 
-       private static final HeaderElement DEFAULT_ELEMENT = new 
BasicHeaderElement("", "");
-
        private final NameValuePair[] extensions;
        private final Float qValue;
        private final String name;
@@ -97,17 +95,6 @@ public class StringRange {
        }
 
        /**
-        * Parses the specified header element part.
-        *
-        * @param value The header element part.
-        * @return Thew parsed header element part.  Never <jk>null</jk>.
-        */
-       protected static HeaderElement parse(String value) {
-               HeaderElement[] elements = 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
-               return (elements.length > 0 ? elements[0] : DEFAULT_ELEMENT);
-       }
-
-       /**
         * Returns the name of this string range.
         *
         * <p>
@@ -185,6 +172,11 @@ public class StringRange {
                return 0;
        }
 
+       private static HeaderElement parse(String value) {
+               HeaderElement[] elements = 
BasicHeaderValueParser.parseElements(emptyIfNull(trim(value)), null);
+               return (elements.length > 0 ? elements[0] : new 
BasicHeaderElement("", ""));
+       }
+
        @Override /* Object */
        public String toString() {
                return string;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
similarity index 76%
copy from 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
copy to 
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
index 42e8019..5f5b6a8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/Constants.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/Constants_Test.java
@@ -12,21 +12,15 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
-import org.apache.juneau.http.annotation.*;
+import static org.junit.runners.MethodSorters.*;
 
-/**
- * Constants used by classes in this package.
- *
- * <ul class='seealso'>
- *     <li class='extlink'>{@doc RFC2616}
- * </ul>
- */
-@Header("Constants")
-public class Constants {
+import org.junit.*;
 
-       /** Use caching of HTTP artifacts. */
-       public static boolean NOCACHE = 
Boolean.getBoolean("juneau.http.cache.disable");
+@FixMethodOrder(NAME_ASCENDING)
+public class Constants_Test {
 
-       /** Maximum cache size of HTTP artifacts. */
-       public static int CACHE_MAX_SIZE = 
Integer.getInteger("juneau.http.cache.maxSize", 1000);
+       @Test
+       public void a01_basic() {
+               new Constants();
+       }
 }
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
similarity index 97%
rename from 
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
rename to 
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
index fa20da2..dccaa39 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptTest.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_FindMatch_Test.java
@@ -10,7 +10,7 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the 
License.                                              *
 // 
***************************************************************************************************************************
-package org.apache.juneau.http.header;
+package org.apache.juneau.http;
 
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
@@ -18,7 +18,7 @@ import static org.junit.runners.MethodSorters.*;
 import java.util.*;
 
 import org.apache.juneau.collections.*;
-import org.apache.juneau.http.*;
+import org.apache.juneau.http.header.*;
 import org.apache.juneau.json.*;
 import org.junit.*;
 import org.junit.runner.*;
@@ -29,7 +29,7 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @FixMethodOrder(NAME_ASCENDING)
-public class AcceptTest {
+public class MediaRanges_FindMatch_Test {
        @Parameterized.Parameters
        public static Collection<Object[]> getParameters() {
                return Arrays.asList(new Object[][] {
@@ -154,7 +154,7 @@ public class AcceptTest {
        private String label, accept, mediaTypes;
        private int expected, expectedReverse;
 
-       public AcceptTest(String label, String accept, String mediaTypes, int 
expected, int expectedReverse) {
+       public MediaRanges_FindMatch_Test(String label, String accept, String 
mediaTypes, int expected, int expectedReverse) {
                this.label = label;
                this.accept = accept;
                this.mediaTypes = mediaTypes;
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
new file mode 100644
index 0000000..9512b7a
--- /dev/null
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/MediaRanges_Test.java
@@ -0,0 +1,117 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.http;
+
+import static org.apache.juneau.assertions.Assertions.*;
+import static org.junit.Assert.*;
+import static org.junit.runners.MethodSorters.*;
+
+import org.junit.*;
+
+@FixMethodOrder(NAME_ASCENDING)
+public class MediaRanges_Test {
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Verifies that media type parameters are distinguished from media 
range extensions.
+       
//-----------------------------------------------------------------------------------------------------------------
+       @Test
+       public void testExtensions() throws Exception {
+               MediaRanges x1;
+               MediaRange x2;
+
+               x1 = MediaRanges.of("text/json");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json");
+               assertObject(x2.getParameters()).json().is("[]");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               assertNull(x1.getRange(-1));
+               assertNull(x1.getRange(1));
+
+               x1 = MediaRanges.of("foo,bar");
+               x2 = x1.getRange(0);
+               assertString(x2).is("foo");
+               assertObject(x2.getParameters()).json().is("[]");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               x1 = MediaRanges.of(" foo , bar ");
+               x2 = x1.getRange(0);
+               assertString(x2).is("foo");
+               assertObject(x2.getParameters()).json().is("[]");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               x1 = MediaRanges.of("text/json;a=1;q=0.9;b=2");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;a=1;q=0.9;b=2");
+               assertObject(x2.getParameters()).json().is("['a=1']");
+               assertString(x2.getQValue()).is("0.9");
+               assertObject(x2.getExtensions()).json().is("['b=2']");
+
+               x1 = MediaRanges.of("text/json;a=1;a=2;q=0.9;b=3;b=4");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;a=1;a=2;q=0.9;b=3;b=4");
+               assertObject(x2.getParameters()).json().is("['a=1','a=2']");
+               assertString(x2.getQValue()).is("0.9");
+               assertObject(x2.getExtensions()).json().is("['b=3','b=4']");
+
+               x1 = MediaRanges.of("text/json;a=1;a=2;q=1.0;b=3;b=4");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;a=1;a=2;q=1.0;b=3;b=4");
+               assertObject(x2.getParameters()).json().is("['a=1','a=2']");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("['b=3','b=4']");
+
+               x1 = MediaRanges.of("text/json;a=1");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;a=1");
+               assertObject(x2.getParameters()).json().is("['a=1']");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               x1 = MediaRanges.of("text/json;a=1;");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;a=1");
+               assertObject(x2.getParameters()).json().is("['a=1']");
+               assertString(x2.getQValue()).is("1.0");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               x1 = MediaRanges.of("text/json;q=0.9");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;q=0.9");
+               assertObject(x2.getParameters()).json().is("[]");
+               assertString(x2.getQValue()).is("0.9");
+               assertObject(x2.getExtensions()).json().is("[]");
+
+               x1 = MediaRanges.of("text/json;q=0.9;");
+               x2 = x1.getRange(0);
+               assertString(x2).is("text/json;q=0.9");
+               assertObject(x2.getParameters()).json().is("[]");
+               assertString(x2.getQValue()).is("0.9");
+               assertObject(x2.getExtensions()).json().is("[]");
+       }
+
+       
//-----------------------------------------------------------------------------------------------------------------
+       // Tests the Accept.hasSubtypePart() method.
+       
//-----------------------------------------------------------------------------------------------------------------
+       @Test
+       public void testHasSubtypePart() {
+               MediaRanges mr = MediaRanges.of("text/json+x,text/foo+y;q=0.0");
+               assertTrue(mr.hasSubtypePart("json"));
+               assertTrue(mr.hasSubtypePart("x"));
+               assertFalse(mr.hasSubtypePart("foo"));
+               assertFalse(mr.hasSubtypePart("y"));
+       }
+}
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
similarity index 100%
rename from 
juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
rename to 
juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/annotation/AnnotationUtilsTest.java
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
deleted file mode 100644
index 98e26c4..0000000
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/http/header/AcceptExtensionsTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.http.header;
-
-import static org.apache.juneau.assertions.Assertions.*;
-import static org.junit.Assert.*;
-import static org.junit.runners.MethodSorters.*;
-
-import org.apache.juneau.http.*;
-import org.junit.*;
-
-/**
- * Verifies that the Accept class handles parameters and extensions correctly.
- */
-@FixMethodOrder(NAME_ASCENDING)
-public class AcceptExtensionsTest {
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Verifies that media type parameters are distinguished from media 
range extensions.
-       
//-----------------------------------------------------------------------------------------------------------------
-       @Test
-       public void testExtensions() throws Exception {
-               Accept accept;
-               MediaRange mr;
-
-               accept = Accept.of("text/json");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json");
-               assertObject(mr.getParameters()).json().is("[]");
-               assertString(mr.getQValue()).is("1.0");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of("foo,bar");
-               mr = accept.getRange(0);
-               assertString(mr).is("foo");
-               assertObject(mr.getParameters()).json().is("[]");
-               assertString(mr.getQValue()).is("1.0");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of(" foo , bar ");
-               mr = accept.getRange(0);
-               assertString(mr).is("foo");
-               assertObject(mr.getParameters()).json().is("[]");
-               assertString(mr.getQValue()).is("1.0");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of("text/json;a=1;q=0.9;b=2");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;a=1;q=0.9;b=2");
-               assertObject(mr.getParameters()).json().is("['a=1']");
-               assertString(mr.getQValue()).is("0.9");
-               assertObject(mr.getExtensions()).json().is("['b=2']");
-
-               accept = Accept.of("text/json;a=1;a=2;q=0.9;b=3;b=4");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;a=1;a=2;q=0.9;b=3;b=4");
-               assertObject(mr.getParameters()).json().is("['a=1','a=2']");
-               assertString(mr.getQValue()).is("0.9");
-               assertObject(mr.getExtensions()).json().is("['b=3','b=4']");
-
-               accept = Accept.of("text/json;a=1");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;a=1");
-               assertObject(mr.getParameters()).json().is("['a=1']");
-               assertString(mr.getQValue()).is("1.0");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of("text/json;a=1;");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;a=1");
-               assertObject(mr.getParameters()).json().is("['a=1']");
-               assertString(mr.getQValue()).is("1.0");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of("text/json;q=0.9");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;q=0.9");
-               assertObject(mr.getParameters()).json().is("[]");
-               assertString(mr.getQValue()).is("0.9");
-               assertObject(mr.getExtensions()).json().is("[]");
-
-               accept = Accept.of("text/json;q=0.9;");
-               mr = accept.getRange(0);
-               assertString(mr).is("text/json;q=0.9");
-               assertObject(mr.getParameters()).json().is("[]");
-               assertString(mr.getQValue()).is("0.9");
-               assertObject(mr.getExtensions()).json().is("[]");
-       }
-
-       
//-----------------------------------------------------------------------------------------------------------------
-       // Tests the Accept.hasSubtypePart() method.
-       
//-----------------------------------------------------------------------------------------------------------------
-       @Test
-       public void testHasSubtypePart() {
-               Accept accept = Accept.of("text/json+x,text/foo+y;q=0.0");
-               MediaRanges mr = accept.asRanges();
-               assertTrue(mr.hasSubtypePart("json"));
-               assertTrue(mr.hasSubtypePart("x"));
-               assertFalse(mr.hasSubtypePart("foo"));
-               assertFalse(mr.hasSubtypePart("y"));
-       }
-}
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 7398fb3..5925ab6 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -452,13 +452,19 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
 
        @Override /* ServletRequest */
        public Locale getLocale() {
+               Locale best = super.getLocale();
                String h = headers.getString("Accept-Language");
                if (h != null) {
                        StringRanges sr = StringRanges.of(h);
-                       if (! sr.getRanges().isEmpty())
-                               return toLocale(sr.getRange(0).getName());
+                       float qValue = 0;
+                       for (StringRange r : sr.getRanges()) {
+                               if (r.getQValue() > qValue) {
+                                       best = toLocale(r.getName());
+                                       qValue = r.getQValue();
+                               }
+                       }
                }
-               return super.getLocale();
+               return best;
        }
 
        @Override /* ServletRequest */
@@ -469,7 +475,8 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
                        if (! mr.getRanges().isEmpty()) {
                                List<Locale> l = new 
ArrayList<>(mr.getRanges().size());
                                for (StringRange r : mr.getRanges())
-                                       l.add(toLocale(r.getName()));
+                                       if (r.getQValue() > 0)
+                                               l.add(toLocale(r.getName()));
                                return enumeration(l);
                        }
                }

Reply via email to