Skip to content

Commit

Permalink
Make sure that MediaType comparators are transitive
Browse files Browse the repository at this point in the history
Previous to this commit, the specificity and quality comparators
(used by MediaType::sortByQualityValue and MediaType::sortBySpecificity)
could result in IllegalArgumentExceptions when used for sorting.
The underlying reason was that the comparators were not transitive, and
both media types with the same type, and types with the same amount of
parameters, would be considered identical by the comparator (result 0).

This commit ensures that the comparators are transitive.

Closes gh-27488
  • Loading branch information
poutsma committed Sep 30, 2021
1 parent 96e4d3a commit 388c8e4
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 12 deletions.
Expand Up @@ -637,19 +637,13 @@ public int compare(T mimeType1, T mimeType2) {
else if (mimeType2.isWildcardType() && !mimeType1.isWildcardType()) { // audio/* > */*
return -1;
}
else if (!mimeType1.getType().equals(mimeType2.getType())) { // audio/basic == text/html
return 0;
}
else { // mediaType1.getType().equals(mediaType2.getType())

This comment has been minimized.

Copy link
@samabcde

samabcde Sep 30, 2021

This comment is outdated.

This comment has been minimized.

Copy link
@poutsma

poutsma Sep 30, 2021

Author Contributor

Thanks for spotting this, fixed in a4b74a3

if (mimeType1.isWildcardSubtype() && !mimeType2.isWildcardSubtype()) { // audio/* < audio/basic
return 1;
}
else if (mimeType2.isWildcardSubtype() && !mimeType1.isWildcardSubtype()) { // audio/basic > audio/*
return -1;
}
else if (!mimeType1.getSubtype().equals(mimeType2.getSubtype())) { // audio/basic == audio/wave
return 0;
}
else { // mediaType2.getSubtype().equals(mediaType2.getSubtype())
return compareParameters(mimeType1, mimeType2);
}
Expand Down
Expand Up @@ -798,19 +798,13 @@ else if (mediaType1.isWildcardType() && !mediaType2.isWildcardType()) { // */*
else if (mediaType2.isWildcardType() && !mediaType1.isWildcardType()) { // audio/* > */*
return -1;
}
else if (!mediaType1.getType().equals(mediaType2.getType())) { // audio/basic == text/html
return 0;
}
else { // mediaType1.getType().equals(mediaType2.getType())

This comment has been minimized.

Copy link
@samabcde

samabcde Sep 30, 2021

This comment is outdated.

if (mediaType1.isWildcardSubtype() && !mediaType2.isWildcardSubtype()) { // audio/* < audio/basic
return 1;
}
else if (mediaType2.isWildcardSubtype() && !mediaType1.isWildcardSubtype()) { // audio/basic > audio/*
return -1;
}
else if (!mediaType1.getSubtype().equals(mediaType2.getSubtype())) { // audio/basic == audio/wave
return 0;
}
else {
int paramsSize1 = mediaType1.getParameters().size();
int paramsSize2 = mediaType2.getParameters().size();
Expand Down

0 comments on commit 388c8e4

Please sign in to comment.