You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2006/09/13 22:44:32 UTC
svn commit: r443116 - in /incubator/abdera/java/trunk:
core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java
parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java
Author: jmsnell
Date: Wed Sep 13 13:44:31 2006
New Revision: 443116
URL: http://svn.apache.org/viewvc?view=rev&rev=443116
Log:
Per APP Draft -10,
The "app:accept" element value specifies a comma-separated list of
media-ranges (see [RFC2616]) identifying the types of representations
that can be POSTed to the URI of a Collection. Whitespace separation
of the media-range values is considered insignificant and MUST be
ignored.
The app:accept element is similar to the HTTP Accept request-header
[RFC2616] with the exception that app:accept has no notion of
preference. As a result, the value syntax of app:accept does not use
"accept-params" or "q" arguments as specified in [RFC2616], section
14.1.
The order of media-ranges is not significant. The following lists
are all equivalent:
<app:accept>image/png, image/*</app:accept>
<app:accept>image/*, image/png</app:accept>
<app:accept>image/*</app:accept>
A value of "entry" may appear in any list of media-ranges in an
accept element and indicates that Atom Entry Documents can be posted
to the Collection. If the accept element is omitted or empty,
clients SHOULD assume that only Atom Entry documents will be accepted
by the Collection.
The MimeTypeHelper.condense(...) method will condense an array of media types into the most generic
form. e.g., [image/png, image/*] condenses to [image/*], [image/png, image/*, application/atom+xml, entry]
condenses to [image/*, application/atom+xml, entry], etc.
Have Collection.getAccept() always return the condensed form.
Fix Collection.accepts(...) so that it properly understands the "entry" token.
Modified:
incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java
incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java
Modified: incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java?view=diff&rev=443116&r1=443115&r2=443116
==============================================================================
--- incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java (original)
+++ incubator/abdera/java/trunk/core/src/main/java/org/apache/abdera/util/MimeTypeHelper.java Wed Sep 13 13:44:31 2006
@@ -17,6 +17,12 @@
*/
package org.apache.abdera.util;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
import javax.activation.MimeType;
import javax.activation.MimeTypeParseException;
@@ -134,5 +140,69 @@
}
return (type != null) ? type : Constants.XML_MEDIA_TYPE;
}
+
+ /**
+ * This will take an array of media types and will condense them based
+ * on wildcards, etc. For instance,
+ *
+ * condense("image/png", "image/jpg", "image/*")
+ *
+ * condenses to [image/*]
+ *
+ * condense("application/atom", "application/*", "image/png", "image/*")
+ *
+ * condenses to [application/*, image/*]
+ *
+ */
+ public static String[] condense(String... types) {
+ if (types.length <= 1) return types;
+ List<String> list = new ArrayList<String>(Arrays.asList(types));
+ List<String> res = new ArrayList<String>();
+ Collections.sort(list, getComparator());
+ for (String t:list) {
+ if (!contains(t,res) && !res.contains(t)) res.add(t);
+ }
+ for (int n = 0; n < res.size(); n++) {
+ String t = res.get(n).intern();
+ if (contains(t, res)) res.remove(t);
+ }
+ return res.toArray(new String[res.size()]);
+ }
+
+ private static boolean contains(String t1, List<String> t) {
+ for (String t2 : t) {
+ int c = compare(t1,t2);
+ if (c == 1) return true;
+ }
+ return false;
+ }
+
+ public static Comparator<String> getComparator() {
+ return new Comparator<String>() {
+ public int compare(String o1, String o2) {
+ return MimeTypeHelper.compare(o1,o2);
+ }
+ };
+ }
+
+ public static int compare(MimeType mt1, MimeType mt2) {
+ String st1 = mt1.getSubType();
+ String st2 = mt2.getSubType();
+ if (MimeTypeHelper.isMatch(mt1, mt2)) {
+ if (st1.equals("*")) return -1;
+ if (st2.equals("*")) return 1;
+ }
+ return 0;
+ }
+
+ public static int compare(String t1, String t2) {
+ try {
+ MimeType mt1 = new MimeType(t1);
+ MimeType mt2 = new MimeType(t2);
+ return compare(mt1,mt2);
+ } catch (Exception e) {}
+ return 0;
+ }
+
}
Modified: incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java?view=diff&rev=443116&r1=443115&r2=443116
==============================================================================
--- incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java (original)
+++ incubator/abdera/java/trunk/parser/src/main/java/org/apache/abdera/parser/stax/FOMCollection.java Wed Sep 13 13:44:31 2006
@@ -150,7 +150,7 @@
for (int n = 0; n < list.length; n++) {
list[n] = list[n].trim();
}
- return list;
+ return MimeTypeHelper.condense(list);
}
public void setAccept(String... mediaRanges) {
@@ -170,6 +170,8 @@
public boolean accepts(String mediaType) {
String[] accept = getAccept();
for (String a : accept) {
+ if (mediaType.equalsIgnoreCase("entry") &&
+ a.equalsIgnoreCase("entry")) return true;
if (MimeTypeHelper.isMatch(a, mediaType)) return true;
}
return false;