Author: reto
Date: Tue Mar 8 20:26:56 2011
New Revision: 1079516
URL: http://svn.apache.org/viewvc?rev=1079516&view=rev
Log:
CLEREZZA-325: hard-code prirority list in MediaTypeComparator
Modified:
incubator/clerezza/trunk/parent/triaxrs/triaxrs/src/main/java/org/apache/clerezza/triaxrs/util/MediaTypeComparator.java
Modified:
incubator/clerezza/trunk/parent/triaxrs/triaxrs/src/main/java/org/apache/clerezza/triaxrs/util/MediaTypeComparator.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/triaxrs/triaxrs/src/main/java/org/apache/clerezza/triaxrs/util/MediaTypeComparator.java?rev=1079516&r1=1079515&r2=1079516&view=diff
==============================================================================
---
incubator/clerezza/trunk/parent/triaxrs/triaxrs/src/main/java/org/apache/clerezza/triaxrs/util/MediaTypeComparator.java
(original)
+++
incubator/clerezza/trunk/parent/triaxrs/triaxrs/src/main/java/org/apache/clerezza/triaxrs/util/MediaTypeComparator.java
Tue Mar 8 20:26:56 2011
@@ -19,12 +19,14 @@
package org.apache.clerezza.triaxrs.util;
import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
import javax.ws.rs.core.MediaType;
/**
- * Sorts media types in accordance with an accept-header, falling back to
literal
- * sorting to guarantee constistency.
+ * Sorts media types in accordance with an accept-header, falling back to
+ * a built-in priority list and to literal sorting to guarantee constistency.
*
* Also provides static Utility methods for Media Type comparison.
*
@@ -32,6 +34,29 @@ import javax.ws.rs.core.MediaType;
*/
public class MediaTypeComparator implements Comparator<MediaType> {
+ /** if the media-types have equal priority in the accept header
+ * they are sorted according to the following q-values
+ */
+ private static final Map<MediaType, Float> fallBackQ = new
HashMap<MediaType, Float>();
+
+ static {
+ fallBackQ.put(MediaType.APPLICATION_XHTML_XML_TYPE, new
Float(1.0f));
+ fallBackQ.put(MediaType.valueOf("text/html"), new Float(0.9f));
+ fallBackQ.put(MediaType.valueOf("application/rdf+xml"), new
Float(0.8f));
+ }
+
+ private static int fallBackCompare(MediaType o1, MediaType o2) {
+ float q1 = getFallBackQ(o1);
+ float q2 = getFallBackQ(o2);
+ if (q1 == q2) {
+ return 0;
+ }
+ if (q1 > q2) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
private AcceptHeader acceptHeader;
public MediaTypeComparator() {
@@ -62,7 +87,7 @@ public class MediaTypeComparator impleme
float q1 = getQ(o1);
float q2 = getQ(o2);
if (q1 == q2) {
- return 0;
+ return fallBackCompare(o1, o2);
}
if (q1 > q2) {
return -1;
@@ -73,10 +98,12 @@ public class MediaTypeComparator impleme
return wilchCharComparison;
}
}
-
+
@Override
public int compare(MediaType o1, MediaType o2) {
- if (o1.equals(o2)) return 0;
+ if (o1.equals(o2)) {
+ return 0;
+ }
if (acceptHeader != null) {
if (acceptHeader.getAcceptedQuality(o1) >
acceptHeader.getAcceptedQuality(o2)) {
return -1;
@@ -91,7 +118,7 @@ public class MediaTypeComparator impleme
} else {
return inconsistentCompare;
}
-
+
}
/**
@@ -131,4 +158,12 @@ public class MediaTypeComparator impleme
return Float.parseFloat(qString);
}
}
+
+ private static float getFallBackQ(MediaType m) {
+ if (fallBackQ.containsKey(m)) {
+ return fallBackQ.get(m);
+ } else {
+ return 0f;
+ }
+ }
}