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 2013/04/16 15:04:42 UTC
svn commit: r1468402 - in /cxf/branches/2.7.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
Author: sergeyb
Date: Tue Apr 16 13:04:42 2013
New Revision: 1468402
URL: http://svn.apache.org/r1468402
Log:
Merged revisions 1468231 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1468231 | sergeyb | 2013-04-15 22:29:26 +0100 (Mon, 15 Apr 2013) | 1 line
[CXF-4959] Optional support for the partial comparison of subtypes when checking the compatibility of media types
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1468231
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1468402&r1=1468401&r2=1468402&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Tue Apr 16 13:04:42 2013
@@ -142,6 +142,7 @@ import org.apache.cxf.jaxrs.utils.multip
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public final class JAXRSUtils {
@@ -151,6 +152,8 @@ public final class JAXRSUtils {
public static final String IGNORE_MESSAGE_WRITERS = "ignore.message.writers";
public static final String ROOT_INSTANCE = "service.root.instance";
public static final String ROOT_PROVIDER = "service.root.provider";
+ public static final String PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK =
+ "partial.hierarchical.media.subtype.check";
public static final String DOC_LOCATION = "wadl.location";
public static final String DEFAULT_PROVIDERS_FOR_SIMPLE_TYPES = "defaultProviders.for.simpleTypes";
public static final String MEDIA_TYPE_Q_PARAM = "q";
@@ -1441,16 +1444,54 @@ public final class JAXRSUtils {
private static boolean isMediaTypeCompatible(MediaType requiredType, MediaType userType) {
boolean isCompatible = requiredType.isCompatible(userType);
- if (!isCompatible && requiredType.getType().equalsIgnoreCase(userType.getType())) {
- // check if we have composite subtypes
- String subType1 = requiredType.getSubtype();
- String subType2 = userType.getSubtype();
-
- String subTypeAfterPlus1 = splitMediaSubType(subType1, true);
- String subTypeAfterPlus2 = splitMediaSubType(subType2, true);
-
+ if (!requiredType.isCompatible(userType) && requiredType.getType().equalsIgnoreCase(userType.getType())) {
+ isCompatible = compareCompositeSubtypes(requiredType, userType,
+ PhaseInterceptorChain.getCurrentMessage());
+ }
+ return isCompatible;
+ }
+
+ static boolean compareCompositeSubtypes(String requiredType, String userType,
+ Message message) {
+ return compareCompositeSubtypes(toMediaType(requiredType), toMediaType(userType), message);
+ }
+
+ private static boolean compareCompositeSubtypes(MediaType requiredType, MediaType userType,
+ Message message) {
+ boolean isCompatible = false;
+ // check if we have composite subtypes
+ String subType1 = requiredType.getSubtype();
+ String subType2 = userType.getSubtype();
+
+ String subTypeAfterPlus1 = splitMediaSubType(subType1, true);
+ String subTypeAfterPlus2 = splitMediaSubType(subType2, true);
+ if (message != null && MessageUtils.isTrue(
+ message.getContextualProperty(PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK))) {
+ if (subTypeAfterPlus1 != null || subTypeAfterPlus2 != null) {
+ boolean nullPossible = subTypeAfterPlus1 == null || subTypeAfterPlus2 == null;
+ isCompatible = subTypeAfterPlus1 == null && subTypeAfterPlus2.equals(subType1)
+ || subTypeAfterPlus2 == null && subTypeAfterPlus1.equals(subType2);
+ if (!isCompatible && !nullPossible) {
+ isCompatible = subTypeAfterPlus1.equalsIgnoreCase(subTypeAfterPlus2)
+ && (subType1.charAt(0) == '*' || subType2.charAt(0) == '*');
+ }
+
+ if (!isCompatible) {
+ String subTypeBeforePlus1 = splitMediaSubType(subType1, false);
+ String subTypeBeforePlus2 = splitMediaSubType(subType2, false);
+ nullPossible = subTypeBeforePlus1 == null || subTypeBeforePlus2 == null;
+ isCompatible = subTypeBeforePlus1 == null && subTypeBeforePlus2.equals(subType1)
+ || subTypeBeforePlus2 == null && subTypeBeforePlus1.equals(subType2);
+ if (!isCompatible && !nullPossible) {
+ isCompatible = subTypeBeforePlus1.equalsIgnoreCase(subTypeBeforePlus2)
+ && (subType1.charAt(subType1.length() - 1) == '*'
+ || subType2.charAt(subType2.length() - 1) == '*');
+ }
+ }
+ }
+ } else {
if (subTypeAfterPlus1 != null && subTypeAfterPlus2 != null) {
-
+
isCompatible = subTypeAfterPlus1.equalsIgnoreCase(subTypeAfterPlus2)
&& (subType1.charAt(0) == '*' || subType2.charAt(0) == '*');
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=1468402&r1=1468401&r2=1468402&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Tue Apr 16 13:04:42 2013
@@ -514,6 +514,48 @@ public class JAXRSUtilsTest extends Asse
}
@Test
+ public void testIntersectMimeTypesCompositeSubtype6() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertTrue(JAXRSUtils.compareCompositeSubtypes("application/bar+xml", "application/xml", m));
+ }
+
+ @Test
+ public void testIntersectMimeTypesCompositeSubtype7() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertTrue(JAXRSUtils.compareCompositeSubtypes("application/xml", "application/bar+xml", m));
+ }
+
+ @Test
+ public void testIntersectMimeTypesCompositeSubtype8() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertTrue(JAXRSUtils.compareCompositeSubtypes("application/xml+bar", "application/xml", m));
+ }
+
+ @Test
+ public void testIntersectMimeTypesCompositeSubtype9() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertTrue(JAXRSUtils.compareCompositeSubtypes("application/xml", "application/xml+bar", m));
+ }
+
+ @Test
+ public void testIntersectMimeTypesCompositeSubtype10() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertFalse(JAXRSUtils.compareCompositeSubtypes("application/v1+xml", "application/v2+xml", m));
+ }
+
+ @Test
+ public void testIntersectMimeTypesCompositeSubtype11() throws Exception {
+ Message m = new MessageImpl();
+ m.put(JAXRSUtils.PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK, true);
+ assertFalse(JAXRSUtils.compareCompositeSubtypes("application/v1+xml", "application/json", m));
+ }
+
+ @Test
public void testIntersectMimeTypes() throws Exception {
//test basic
List<MediaType> methodMimeTypes = new ArrayList<MediaType>(