tcurdt 2003/01/02 12:47:29 Modified: src/java/org/apache/cocoon/generation ImageDirectoryGenerator.java Log: factored out the image stuff Revision Changes Path 1.8 +9 -216 xml-cocoon2/src/java/org/apache/cocoon/generation/ImageDirectoryGenerator.java Index: ImageDirectoryGenerator.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/generation/ImageDirectoryGenerator.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- ImageDirectoryGenerator.java 31 Dec 2002 16:25:44 -0000 1.7 +++ ImageDirectoryGenerator.java 2 Jan 2003 20:47:29 -0000 1.8 @@ -52,6 +52,9 @@ import org.apache.avalon.framework.CascadingRuntimeException; import org.apache.log.Hierarchy; +import org.apache.cocoon.util.ImageProperties; +import org.apache.cocoon.util.ImageUtils; +import org.apache.cocoon.util.FileFormatException; import org.xml.sax.SAXException; import java.io.*; @@ -71,33 +74,8 @@ protected static String IMAGE_COMMENT_ATTR_NAME = "comment"; /** - * TODO: as long as the generator is pooled we could use a single instance to reduce object creations - * TODO: don't open the file twice - */ - final private class ImageProperties { - int width; - int height; - char[] comment; - - public ImageProperties(int width, int height, char[] comment) { - this.width = width; - this.height = height; - this.comment = comment; - } - - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append(width).append("x").append(height); - if (comment != null) { - sb.append(" (").append(comment).append(")"); - } - return (sb.toString()); - } - } - - /** * Extends the <code>setNodeAttributes</code> method from the - * <code>DirectoryGenerator</code> by adding width and height attributes + * <code>DirectoryGenerator</code> by adding width, height and comment attributes * if the path is a GIF or a JPEG file. */ protected void setNodeAttributes(File path) throws SAXException { @@ -106,7 +84,7 @@ return; } try { - ImageProperties p = getImageProperties(path); + ImageProperties p = ImageUtils.getImageProperties(path); if (p != null) { if (getLogger().isDebugEnabled()) { getLogger().debug(String.valueOf(path) + " = " + String.valueOf(p)); @@ -116,6 +94,9 @@ if (p.comment != null) attributes.addAttribute("", IMAGE_COMMENT_ATTR_NAME, IMAGE_COMMENT_ATTR_NAME, "CDATA", String.valueOf(p.comment)); } } + catch (FileFormatException e) { + throw new SAXException(e); + } catch (FileNotFoundException e) { throw new SAXException(e); } @@ -124,192 +105,4 @@ } } - private ImageProperties getImageProperties(File file) throws FileNotFoundException, IOException { - String type = getFileType(file); - if ("gif".equals(type)) { - return (getGifProperties(file)); - } - else if ("jpeg".equals(type)) { - return (getJpegProperties(file)); - } - else { - if (getLogger().isDebugEnabled()) { - getLogger().debug("cannot handle type " + type + ". not a known image"); - } - return (null); - } - } - - private ImageProperties getJpegProperties(File file) throws FileNotFoundException, IOException { - BufferedInputStream in = null; - try { - in = new BufferedInputStream(new FileInputStream(file)); - // check for "magic" header - byte[] buf = new byte[2]; - int count = in.read(buf, 0, 2); - if (count < 2) { - if (getLogger().isErrorEnabled()) { - getLogger().error("Not a valid Jpeg file!"); - } - return (null); - } - if ((buf[0]) != (byte) 0xFF || (buf[1]) != (byte) 0xD8) { - if (getLogger().isErrorEnabled()) { - getLogger().error("Not a valid Jpeg file!"); - } - return (null); - } - - int width = 0; - int height = 0; - char[] comment = null; - - boolean hasDims = false; - boolean hasComment = false; - int ch = 0; - - while (ch != 0xDA && !(hasDims && hasComment)) { - /* Find next marker (JPEG markers begin with 0xFF) */ - while (ch != 0xFF) { - ch = in.read(); - } - /* JPEG markers can be padded with unlimited 0xFF's */ - while (ch == 0xFF) { - ch = in.read(); - } - /* Now, ch contains the value of the marker. */ - - int length = 256 * in.read(); - length += in.read(); - if (length < 2) { - if (getLogger().isErrorEnabled()) { - getLogger().error("Not a valid Jpeg file!"); - } - return (null); - } - /* Now, length contains the length of the marker. */ - - /* - if (getLogger().isDebugEnabled()) { - getLogger().debug("marker 0x" + Integer.toHexString(ch) + " len=" + length); - } - */ - - if (ch >= 0xC0 && ch <= 0xC3) { - in.read(); - height = 256 * in.read(); - height += in.read(); - width = 256 * in.read(); - width += in.read(); - for (int foo = 0; foo < length - 2 - 5; foo++) { - int i = in.read(); - } - hasDims = true; - } - else if (ch == 0xFE) { - // that's the comment marker - comment = new char[length-2]; - for (int foo = 0; foo < length - 2; foo++) - comment[foo] = (char) in.read(); - hasComment = true; - } - else { - // just skip marker - for (int foo = 0; foo < length - 2; foo++) { - int i = in.read(); - } - } - } - return (new ImageProperties(width, height, comment)); - - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - if (getLogger().isErrorEnabled()) { - getLogger().error("close stream", e); - } - } - } - } - } - - private ImageProperties getGifProperties(File file) throws FileNotFoundException, IOException { - BufferedInputStream in = null; - try { - in = new BufferedInputStream(new FileInputStream(file)); - byte[] buf = new byte[10]; - int count = in.read(buf, 0, 10); - if (count < 10) { - if (getLogger().isErrorEnabled()) { - getLogger().error("Not a valid GIF file!"); - } - return (null); - } - if ((buf[0]) != (byte) 'G' || (buf[1]) != (byte) 'I' || (buf[2]) != (byte) 'F') { - if (getLogger().isErrorEnabled()) { - getLogger().error("Not a valid GIF file!"); - } - return (null); - } - - int w1 = ((int) buf[6] & 0xff) | (buf[6] & 0x80); - int w2 = ((int) buf[7] & 0xff) | (buf[7] & 0x80); - int h1 = ((int) buf[8] & 0xff) | (buf[8] & 0x80); - int h2 = ((int) buf[9] & 0xff) | (buf[9] & 0x80); - - int width = w1 + (w2 << 8); - int height = h1 + (h2 << 8); - - return (new ImageProperties(width, height, null)); - - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - if (getLogger().isErrorEnabled()) { - getLogger().error("close stream", e); - } - } - } - } - } - - private String getFileType(File file) throws FileNotFoundException, IOException { - BufferedInputStream in = null; - try { - in = new BufferedInputStream(new FileInputStream(file)); - byte[] buf = new byte[3]; - int count = in.read(buf, 0, 3); - - if (count < 3) - return (null); - - if ((buf[0]) == (byte) 'G' && (buf[1]) == (byte) 'I' && (buf[2]) == (byte) 'F') - return ("gif"); - - if ((buf[0]) == (byte) 0xFF && (buf[1]) == (byte) 0xD8) - return ("jpeg"); - - return (null); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - if (getLogger().isErrorEnabled()) { - getLogger().error("close stream", e); - } - } - } - } - } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]