MediaTypeHelper { public static boolean isCompatible(MediaType mediaTypeOne, MediaType mediaTypeTwo) { if (mediaTypeOne == null || mediaTypeTwo == null) { throw new IllegalArgumentException("Null arguments are not allowed"); } if (mediaTypeOne.isWildcardType() || mediaTypeTwo.isWildcardType()) { return true; } if (mediaTypeOne.getType().equalsIgnoreCase(mediaTypeTwo.getType())) { if (mediaTypeOne.isWildcardSubtype() || mediaTypeTwo.isWildcardSubtype() || mediaTypeOne.getSubtype().equalsIgnoreCase(mediaTypeTwo.getSubtype())) { return true; } Matcher extSubtypeMatcherOne = EXT_SUBTYPE_PATTERN.matcher(mediaTypeOne.getSubtype()); Matcher extSubtypeMatcherTwo = EXT_SUBTYPE_PATTERN.matcher(mediaTypeTwo.getSubtype()); boolean extSubtypeMatcherOneMatches = extSubtypeMatcherOne.matches(); boolean extSubtypeMatcherTwoMatches = extSubtypeMatcherTwo.matches(); if (!extSubtypeMatcherOneMatches && extSubtypeMatcherTwoMatches) { return mediaTypeOne.getSubtype().equalsIgnoreCase(extSubtypeMatcherTwo.group(1)) || mediaTypeOne.getSubtype().equalsIgnoreCase(extSubtypeMatcherTwo.group(2)); } else if (extSubtypeMatcherOneMatches && !extSubtypeMatcherTwoMatches) { return mediaTypeTwo.getSubtype().equalsIgnoreCase(extSubtypeMatcherOne.group(1)) || mediaTypeTwo.getSubtype().equalsIgnoreCase(extSubtypeMatcherOne.group(2)); } else if (extSubtypeMatcherOneMatches && extSubtypeMatcherTwoMatches) { String subtypePrefixOne = extSubtypeMatcherOne.group(1); String subTypeSuffixOne = extSubtypeMatcherOne.group(2); String subTypePrefixTwo = extSubtypeMatcherTwo.group(1); String subtypeSuffixTwo = extSubtypeMatcherTwo.group(2); if (subtypePrefixOne.equalsIgnoreCase(subTypePrefixTwo) && (MEDIA_TYPE_WILDCARD.equals(subTypeSuffixOne) || MEDIA_TYPE_WILDCARD.equals(subtypeSuffixTwo))) { return true; } if (subTypeSuffixOne.equalsIgnoreCase(subtypeSuffixTwo) && (MEDIA_TYPE_WILDCARD.equals(subtypePrefixOne) || MEDIA_TYPE_WILDCARD.equals(subTypePrefixTwo))) { return true; } } } return false; } private  MediaTypeHelper(); static Iterator<MediaType> createDescendingMediaTypeIterator(MediaType type); static List<MediaType> createConsumesList(Consumes mime); static List<MediaType> createProducesList(Produces mime); static boolean isConsume(List<MediaType> consumes, MediaType contentType); static AcceptMediaType findFistCompatibleAcceptMediaType(List<AcceptMediaType> acceptMediaTypes,
                                                                    List<MediaType> producedByResource); static boolean isCompatible(MediaType mediaTypeOne, MediaType mediaTypeTwo); static boolean isMatched(MediaType pattern, MediaType checkMe); static final MediaType WADL_TYPE; static final String EXT_PREFIX_SUBTYPE; static final Pattern EXT_SUBTYPE_PATTERN; static final Pattern EXT_SUFFIX_SUBTYPE_PATTERN; static final Pattern EXT_PREFIX_SUBTYPE_PATTERN; }
@UseDataProvider("forCompatibilityOfMediaTypes") @Test public void compatibilityOfMediaTypes(MediaType mediaTypeOne, MediaType mediaTypeTwo, boolean oneCompatibleToTwo, boolean twoCompatibleToOne) { assertEquals(oneCompatibleToTwo, MediaTypeHelper.isCompatible(mediaTypeOne, mediaTypeTwo)); assertEquals(twoCompatibleToOne, MediaTypeHelper.isCompatible(mediaTypeTwo, mediaTypeOne)); }
@Test(expected = IllegalArgumentException.class) public void throwsExceptionWhenFirstMediaTypeForCheckingCompatibilityIsNull() { MediaTypeHelper.isCompatible(null, new MediaType()); }
@Test(expected = IllegalArgumentException.class) public void throwsExceptionWhenSecondMediaTypeForCheckingCompatibilityIsNull() { MediaTypeHelper.isCompatible(new MediaType(), null); }