Author: scottbw
Date: Sat Mar 5 18:35:50 2011
New Revision: 1078326
URL: http://svn.apache.org/viewvc?rev=1078326&view=rev
Log:
Added content-type sniffing for images used as icons - see WOOKIE-80 - this
involves reading the first few bytes of unidentified files to see if they match
the patterns for GIF, JPG, ICO, PNG, and BMP formats.
Added:
incubator/wookie/trunk/parser/java/src-test/icons/
incubator/wookie/trunk/parser/java/src-test/icons/icon_bmp (with props)
incubator/wookie/trunk/parser/java/src-test/icons/icon_exr (with props)
incubator/wookie/trunk/parser/java/src-test/icons/icon_gif (with props)
incubator/wookie/trunk/parser/java/src-test/icons/icon_ico (with props)
incubator/wookie/trunk/parser/java/src-test/icons/icon_jpg (with props)
incubator/wookie/trunk/parser/java/src-test/icons/icon_png (with props)
Modified:
incubator/wookie/trunk/parser/java/src-test/org/apache/wookie/w3c/test/ContentTypeUtilsTest.java
incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_bmp
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_bmp?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_bmp
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_exr
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_exr?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_exr
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_gif
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_gif?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_ico
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_ico?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_ico
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_jpg
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_jpg?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_jpg
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/wookie/trunk/parser/java/src-test/icons/icon_png
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/icons/icon_png?rev=1078326&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/wookie/trunk/parser/java/src-test/icons/icon_png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified:
incubator/wookie/trunk/parser/java/src-test/org/apache/wookie/w3c/test/ContentTypeUtilsTest.java
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src-test/org/apache/wookie/w3c/test/ContentTypeUtilsTest.java?rev=1078326&r1=1078325&r2=1078326&view=diff
==============================================================================
---
incubator/wookie/trunk/parser/java/src-test/org/apache/wookie/w3c/test/ContentTypeUtilsTest.java
(original)
+++
incubator/wookie/trunk/parser/java/src-test/org/apache/wookie/w3c/test/ContentTypeUtilsTest.java
Sat Mar 5 18:35:50 2011
@@ -13,15 +13,17 @@
*/
package org.apache.wookie.w3c.test;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
+import java.io.IOException;
import org.apache.wookie.w3c.util.ContentTypeUtils;
import org.junit.Test;
-public class ContentTypeUtilsTest {
+public class ContentTypeUtilsTest extends ContentTypeUtils {
@Test
public void classTest(){
@@ -97,4 +99,22 @@ public class ContentTypeUtilsTest {
assertFalse(ContentTypeUtils.isSupportedImageType("test.png0"));
assertFalse(ContentTypeUtils.isSupportedImageType("test.pñg"));
}
+
+ @Test
+ public void sniff() throws IOException{
+
+ assertEquals("image/bmp", ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_bmp")));
+ assertEquals("image/gif", ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_gif")));
+ assertEquals("image/jpeg",
ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_jpg")));
+ assertEquals("image/png", ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_png")));
+ assertEquals("image/vnd.microsoft.icon",
ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_ico")));
+ assertEquals(null, ContentTypeUtils.sniffContentType(new
File("parser/java/src-test/icons/icon_exr")));
+
+ assertFalse(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_bmp")));
+ assertTrue(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_ico")));
+ assertFalse(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_exr")));
+ assertTrue(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_gif")));
+ assertTrue(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_jpg")));
+ assertTrue(ContentTypeUtils.isSupportedImageType(new
File("parser/java/src-test/icons/icon_png")));
+ }
}
Modified:
incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java
URL:
http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java?rev=1078326&r1=1078325&r2=1078326&view=diff
==============================================================================
---
incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java
(original)
+++
incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java
Sat Mar 5 18:35:50 2011
@@ -14,6 +14,8 @@
package org.apache.wookie.w3c.util;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
import org.apache.commons.lang.StringUtils;
@@ -54,12 +56,54 @@ public class ContentTypeUtils {
private static String getContentType(File file){
String type = getContentType(file.getName());
if (type == null){
- //TODO implement the SNIFF spec for binary content-type
checking
+ try {
+ type = sniffContentType(file);
+ } catch (IOException e) {
+ type = null;
+ }
}
return type;
}
/**
+ * Sniffs the content type for images and other common types
+ * @param the file to sniff
+ * @return the content type of the file if it matches a known
signature, otherwise Null
+ * @throws IOException
+ */
+ protected static String sniffContentType(File file) throws IOException{
+ FileInputStream stream = new FileInputStream(file);
+ byte[] bytes = new byte[8];
+ stream.read(bytes);
+ String[] hex = new String[8];
+ String hexString = "";
+ for (int i=0;i<8;i++){
+ hex[i]= getHexValue(bytes[i]);
+ hexString += hex[i]+" ";
+ }
+ String prefix = new String(bytes);
+ if (prefix.startsWith("GIF87") || prefix.startsWith("GIF89"))
return "image/gif";
+ if (hex[0].equals("ff") && hex[1].equals("d8")) return
"image/jpeg";
+ if (hex[0].equals("42") && hex[1].equals("4d")) return
"image/bmp";
+ if (hex[0].equals("00") && hex[1].equals("00") &&
hex[2].equals("01") && hex[3].equals("00")) return "image/vnd.microsoft.icon";
+ if (hexString.trim().equals("89 50 4e 47 0d 0a 1a 0a")) return
"image/png";
+ return null;
+ }
+
+ /**
+ * Get a normalized two-character hex value for a byte
+ * @param b
+ * @return a two-character hex string
+ */
+ private static String getHexValue(byte b){
+ String hex;
+ hex =Integer.toHexString(0x00 | b);
+ if (hex.length()==1) hex = "0" + hex;
+ if (hex.length()>2) hex =hex.substring(hex.length()-2);
+ return hex;
+ }
+
+ /**
* Extracts the file extension from the given filename and looks up the
* content type
* @param filename
@@ -105,7 +149,6 @@ public class ContentTypeUtils {
if(ext.equals("svg")) return "image/svg+xml";
if(ext.equals("jpg")) return "image/jpeg";
return null;
-
}
/**