blob: 71984b810a5993775df098fe52dfcedb01fff5f0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.components.url;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.batik.ext.awt.image.GraphicsUtil;
import org.apache.batik.ext.awt.image.renderable.Filter;
import org.apache.batik.ext.awt.image.renderable.RedRable;
import org.apache.batik.ext.awt.image.spi.AbstractRegistryEntry;
import org.apache.batik.ext.awt.image.spi.MagicNumberRegistryEntry;
import org.apache.batik.ext.awt.image.spi.URLRegistryEntry;
import org.apache.batik.util.ParsedURL;
/**
* This Image tag registy entry is setup to wrap the core JDK Image stream tools.
*
* @version CVS $Id$
*/
public class StreamJDKRegistryEntry extends AbstractRegistryEntry
implements URLRegistryEntry {
/**
* The priority of this entry.
* This entry should in most cases be the last entry.
* but if one wishes one could set a priority higher and be called
* afterwords
*/
public final static float PRIORITY =
1000*MagicNumberRegistryEntry.PRIORITY;
public StreamJDKRegistryEntry() {
super ("Stream-JDK", PRIORITY, new String[0], new String [] {"image/gif"});
}
/**
* Check if the Stream references an image that can be handled by
* this format handler. The input stream passed in should be
* assumed to support mark and reset.
*
* If this method throws a StreamCorruptedException then the
* InputStream will be closed and a new one opened (if possible).
*
* This method should only throw a StreamCorruptedException if it
* is unable to restore the state of the InputStream
* (i.e. mark/reset fails basically).
*/
public boolean isCompatibleURL(ParsedURL purl) {
String contentType = purl.getContentType();
if (contentType == null) {
return false;
}
Iterator iter = this.getMimeTypes().iterator();
while (iter.hasNext()) {
if (contentType.equals(iter.next())) {
return true;
}
}
return false;
}
/**
* Decode the URL into a RenderableImage
*
* @param purl The URLto decode
* @param needRawData If true the image returned should not have
* any default color correction the file may
* specify applied.
*/
public Filter handleURL(ParsedURL purl, boolean needRawData) {
// Read all bytes from the ParsedURL (too bad, there's no Toolkit.createImage(InputStream))
InputStream is = null;
byte[] buffer = new byte[1024];
int len;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
is = purl.openStream();
while((len = is.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} catch(IOException ioe) {
return null;
} finally {
try {
if (is != null) is.close();
} catch (Exception e) {}
}
buffer = bos.toByteArray();
Toolkit tk = Toolkit.getDefaultToolkit();
final Image img = tk.createImage(buffer);
if (img == null) {
return null;
}
RenderedImage ri = loadImage(img);
if (ri == null) {
return null;
}
return new RedRable(GraphicsUtil.wrap(ri));
}
// Stuff for Image Loading.
static Component mediaComponent = new Label();
static MediaTracker mediaTracker = new MediaTracker(mediaComponent);
static int id = 0;
public RenderedImage loadImage(Image img) {
// In some cases the image will be a
// BufferedImage (subclass of RenderedImage).
if (img instanceof RenderedImage) {
return (RenderedImage)img;
}
// Setup the mediaTracker.
int myID;
synchronized (mediaTracker) {
myID = id++;
}
// Add our image to the media tracker and wait....
mediaTracker.addImage(img, myID);
while (true) {
try {
mediaTracker.waitForID(myID);
} catch(InterruptedException ie) {
// Something woke us up but the image
// isn't done yet, so try again.
continue;
}
// All done!
break;
}
// Clean up our registraction
mediaTracker.removeImage(img, myID);
if ((img.getWidth(null) == -1)||
(img.getHeight(null) == -1)) {
return null;
}
// Build the image to .
BufferedImage bi = new BufferedImage(img.getWidth(null),
img.getHeight(null),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.drawImage(img, 0, 0, null);
g2d.dispose();
return bi;
}
}