You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wookie.apache.org by sc...@apache.org on 2011/11/10 17:00:41 UTC

svn commit: r1200396 - in /incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c: impl/IconEntity.java util/ContentTypeUtils.java util/WidgetPackageUtils.java

Author: scottbw
Date: Thu Nov 10 16:00:40 2011
New Revision: 1200396

URL: http://svn.apache.org/viewvc?rev=1200396&view=rev
Log:
Added call to content-type sniffing method for icons where there is no file extension provided (see WOOKIE-260)

Modified:
    incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/impl/IconEntity.java
    incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/ContentTypeUtils.java
    incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/WidgetPackageUtils.java

Modified: incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/impl/IconEntity.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/impl/IconEntity.java?rev=1200396&r1=1200395&r2=1200396&view=diff
==============================================================================
--- incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/impl/IconEntity.java (original)
+++ incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/impl/IconEntity.java Thu Nov 10 16:00:40 2011
@@ -80,9 +80,13 @@ public class IconEntity extends Abstract
 			fSrc = null;
 		}
 		try {
-			if (!ContentTypeUtils.isSupportedImageType(fSrc)) fSrc = null;
+			if ( !ContentTypeUtils.isSupportedImageType(fSrc)){
+			  if (!ContentTypeUtils.isSupportedImageType(WidgetPackageUtils.getEntryStream (fSrc, zip)) ){
+		       fSrc = null;			    
+			  }
+			}  
 		} catch (Exception e1) {
-			// TODO Auto-generated catch block
+			fSrc = null;
 			e1.printStackTrace();
 		}
 

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=1200396&r1=1200395&r2=1200396&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 Thu Nov 10 16:00:40 2011
@@ -16,6 +16,7 @@ package org.apache.wookie.w3c.util;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -46,6 +47,17 @@ public class ContentTypeUtils {
 		String type = getContentType(file);
 		return isSupported(type, SUPPORTED_IMAGE_TYPES);
 	}	
+	
+	/**
+	 * Checks to see if an inputstream contains a supported image type
+	 * @param inputStream
+	 * @return true if the file is a supported image type 
+	 * @throws IOException
+	 */
+	public static boolean isSupportedImageType(InputStream inputStream) throws IOException{
+	  String type = sniffContentType(inputStream);
+	  return isSupported(type, SUPPORTED_IMAGE_TYPES);
+	}
 
 	/**
 	 * Gets the content type of a file
@@ -73,21 +85,32 @@ public class ContentTypeUtils {
 	 */
 	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;
+		return sniffContentType(stream);
+	}
+	
+	 /**
+   * Sniffs the content type for images and other common types
+   * @param inpuStream the inputStream to sniff
+   * @return the content type of the stream if it matches a known signature, otherwise Null
+   * @throws IOException 
+   */
+	protected static String sniffContentType(InputStream inputStream) throws IOException{
+	  if (inputStream == null) return null;
+	  byte[] bytes = new byte[8];
+    inputStream.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;
 	}
 	
 	/**

Modified: incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/WidgetPackageUtils.java
URL: http://svn.apache.org/viewvc/incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/WidgetPackageUtils.java?rev=1200396&r1=1200395&r2=1200396&view=diff
==============================================================================
--- incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/WidgetPackageUtils.java (original)
+++ incubator/wookie/trunk/parser/java/src/org/apache/wookie/w3c/util/WidgetPackageUtils.java Thu Nov 10 16:00:40 2011
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.zip.ZipException;
 
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
@@ -202,6 +203,21 @@ public class WidgetPackageUtils {
 	}
 
 	/**
+	 * Gets the input stream for an entry in the zip 
+	 * @param entry the name of the entry
+	 * @param zipFile
+	 * @return the input stream
+	 * @throws ZipException
+	 * @throws IOException
+	 */
+	public static InputStream getEntryStream(String entry, ZipFile zipFile) throws ZipException, IOException{
+	  ZipArchiveEntry zipEntry;
+	  zipEntry = zipFile.getEntry(entry);
+	  if (zipEntry == null) return null;
+	  return zipFile.getInputStream(zipEntry);
+	}
+	
+	/**
 	 * uses apache commons compress to unpack all the zip entries into a target folder
 	 * partly adapted from the examples on the apache commons compress site, and an
 	 * example of generic Zip unpacking. Note this iterates over the ZipArchiveEntry enumeration rather