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;
-
        }
 
        /**


Reply via email to