You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2012/04/23 13:07:10 UTC
svn commit: r1329178 - in /cxf/trunk/rt/frontend/jaxrs/src:
main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java
test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java
Author: sergeyb
Date: Mon Apr 23 11:07:09 2012
New Revision: 1329178
URL: http://svn.apache.org/viewvc?rev=1329178&view=rev
Log:
[CXF-4243] Fixing Request.selectVariant implementation
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java?rev=1329178&r1=1329177&r2=1329178&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestImpl.java Mon Apr 23 11:07:09 2012
@@ -36,6 +36,7 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Variant;
+import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.jaxrs.utils.HttpUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Message;
@@ -61,22 +62,25 @@ public class RequestImpl implements Requ
if (vars == null || vars.isEmpty()) {
throw new IllegalArgumentException("List of Variants is either null or empty");
}
- MediaType inMediaType = headers.getMediaType();
- Locale inLang = headers.getLanguage();
- String inEnc = headers.getRequestHeaders().getFirst(HttpHeaders.CONTENT_ENCODING);
+ List<MediaType> acceptMediaTypes = headers.getAcceptableMediaTypes();
+ List<Locale> acceptLangs = headers.getAcceptableLanguages();
+ List<String> acceptEncs = parseAcceptEnc(
+ headers.getRequestHeaders().getFirst(HttpHeaders.ACCEPT_ENCODING));
List<Variant> matchingVars = new LinkedList<Variant>();
for (Variant var : vars) {
MediaType mt = var.getMediaType();
Locale lang = var.getLanguage();
String enc = var.getEncoding();
+
+ boolean mtMatched = mt == null || acceptMediaTypes.isEmpty()
+ || JAXRSUtils.intersectMimeTypes(acceptMediaTypes, mt).size() != 0;
- boolean mtMatched = mt == null || inMediaType == null
- || JAXRSUtils.intersectMimeTypes(Collections.singletonList(inMediaType), mt).size() != 0;
+ boolean encMatched = acceptEncs.isEmpty() || enc == null
+ || acceptEncs.contains(enc);
- boolean encMatched = inEnc == null || enc == null || inEnc.equalsIgnoreCase(enc);
-
- boolean langMatched = inLang == null || lang == null || inLang.equals(lang);
+ boolean langMatched = lang == null || acceptLangs.isEmpty()
+ || isLanguageMatched(acceptLangs, lang);
if (mtMatched && encMatched && langMatched) {
matchingVars.add(var);
@@ -88,8 +92,29 @@ public class RequestImpl implements Requ
return matchingVars.isEmpty() ? null : matchingVars.get(0);
}
+ private static boolean isLanguageMatched(List<Locale> locales, Locale l) {
+ for (Locale locale : locales) {
+ if (locale.getLanguage().equalsIgnoreCase(l.getLanguage())) {
+ return true;
+ }
+ }
+ return false;
+ }
-
+ private static List<String> parseAcceptEnc(String acceptEnc) {
+ if (StringUtils.isEmpty(acceptEnc)) {
+ return Collections.emptyList();
+ }
+ List<String> list = new LinkedList<String>();
+ String[] values = acceptEnc.split(",");
+ for (String value : values) {
+ String[] pair = value.trim().split(";");
+ // ignore encoding qualifiers if any for now
+ list.add(pair[0]);
+ }
+ return list;
+ }
+
public ResponseBuilder evaluatePreconditions(EntityTag eTag) {
ResponseBuilder rb = evaluateIfMatch(eTag);
if (rb == null) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java?rev=1329178&r1=1329177&r2=1329178&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestImplTest.java Mon Apr 23 11:07:09 2012
@@ -86,9 +86,9 @@ public class RequestImplTest extends Ass
@Test
public void testSingleNonMatchingVariant() {
- metadata.putSingle(HttpHeaders.CONTENT_TYPE, "application/xml");
- metadata.putSingle(HttpHeaders.CONTENT_LANGUAGE, "en");
- metadata.putSingle(HttpHeaders.CONTENT_ENCODING, "utf-8");
+ metadata.putSingle(HttpHeaders.ACCEPT, "application/xml");
+ metadata.putSingle(HttpHeaders.ACCEPT_LANGUAGE, "en");
+ metadata.putSingle(HttpHeaders.ACCEPT_ENCODING, "utf-8");
List<Variant> list = new ArrayList<Variant>();
list.add(new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en"), "utf-8"));
@@ -98,9 +98,9 @@ public class RequestImplTest extends Ass
@Test
public void testMultipleNonMatchingVariants() {
- metadata.putSingle(HttpHeaders.CONTENT_TYPE, "application/xml");
- metadata.putSingle(HttpHeaders.CONTENT_LANGUAGE, "en");
- metadata.putSingle(HttpHeaders.CONTENT_ENCODING, "utf-8");
+ metadata.putSingle(HttpHeaders.ACCEPT, "application/xml");
+ metadata.putSingle(HttpHeaders.ACCEPT_LANGUAGE, "en");
+ metadata.putSingle(HttpHeaders.ACCEPT_ENCODING, "utf-8");
List<Variant> list = new ArrayList<Variant>();
list.add(new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en"), "utf-8"));
@@ -112,15 +112,15 @@ public class RequestImplTest extends Ass
@Test
public void testMultipleVariantsSingleMatch() {
- metadata.putSingle(HttpHeaders.CONTENT_TYPE, "application/xml");
- metadata.putSingle(HttpHeaders.CONTENT_LANGUAGE, "en");
- metadata.putSingle(HttpHeaders.CONTENT_ENCODING, "utf-8");
+ metadata.putSingle(HttpHeaders.ACCEPT, "application/xml");
+ metadata.putSingle(HttpHeaders.ACCEPT_LANGUAGE, "en");
+ metadata.putSingle(HttpHeaders.ACCEPT_ENCODING, "gzip");
List<Variant> list = new ArrayList<Variant>();
list.add(new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en"), "utf-8"));
list.add(new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("es"), "utf-8"));
- Variant var3 = new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("en"), "utf-8");
+ Variant var3 = new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("en"), "gzip");
list.add(var3);
assertSame(var3, new RequestImpl(m).selectVariant(list));
@@ -128,13 +128,13 @@ public class RequestImplTest extends Ass
@Test
public void testMultipleVariantsBestMatch() {
- metadata.putSingle(HttpHeaders.CONTENT_TYPE, "application/xml");
- metadata.putSingle(HttpHeaders.CONTENT_LANGUAGE, "en");
- metadata.putSingle(HttpHeaders.CONTENT_ENCODING, "utf-8");
+ metadata.putSingle(HttpHeaders.ACCEPT, "application/xml");
+ metadata.putSingle(HttpHeaders.ACCEPT_LANGUAGE, "en-us");
+ metadata.putSingle(HttpHeaders.ACCEPT_ENCODING, "gzip;q=1.0, compress");
List<Variant> list = new ArrayList<Variant>();
- list.add(new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en"), "utf-8"));
- Variant var2 = new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("en"), "utf-8");
+ list.add(new Variant(MediaType.APPLICATION_JSON_TYPE, new Locale("en"), "gzip"));
+ Variant var2 = new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("en"), "gzip");
list.add(var2);
Variant var3 = new Variant(MediaType.APPLICATION_XML_TYPE, new Locale("en"), null);
list.add(var3);
@@ -142,7 +142,6 @@ public class RequestImplTest extends Ass
list.clear();
list.add(var3);
assertSame(var3, new RequestImpl(m).selectVariant(list));
-
}
private void assertSameVariant(MediaType mt, Locale lang, String enc) {