package railo.runtime.img;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import railo.commons.io.IOUtil;
import railo.commons.io.SystemUtil;
import railo.commons.io.res.Resource;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.ClassUtil;
import railo.commons.lang.IDGenerator;
import railo.commons.lang.StringUtil;
public class JAIUtil {
private static Class _RenderedOp;
private static Method getAsBufferedImage;
private static Class _JAI;
private static Method create1;
private static Method create3;
private static Boolean supported=null;
private static String[] readFormats=new String[]{"tiff","pnm","fpx"};
private static String[] writeFormats=new String[]{"tiff","pnm"};
public static boolean isSupportedWriteFormat(String format) {
return "tiff".equalsIgnoreCase(format) || "pnm".equalsIgnoreCase(format);
}
public static boolean isSupportedReadFormat(String format) {
return "tiff".equalsIgnoreCase(format) || "pnm".equalsIgnoreCase(format) || "fpx".equalsIgnoreCase(format);
}
public static String[] getSupportedReadFormat() {
return readFormats;
}
public static String[] getSupportedWriteFormat() {
return writeFormats;
}
public static boolean isJAISupported() {
if(supported==null) {
supported=ClassUtil.loadClass("javax.media.jai.JAI",null)!=null?Boolean.TRUE:Boolean.FALSE;
}
return supported.booleanValue();
}
public static BufferedImage read(Resource res) throws IOException {
Resource tmp=null;
try{
if(!(res instanceof File)) {
tmp=SystemUtil.getTempDirectory().getRealResource(IDGenerator.intId()+"-"+res.getName());
IOUtil.copy(res, tmp);
res=tmp;
}
//Object im = JAI.create("fileload", res.getAbsolutePath());
return getAsBufferedImage(create("fileload", res.getAbsolutePath()));
}
finally {
if(tmp!=null) ResourceUtil.removeEL(tmp, false);
}
}
public static BufferedImage read(InputStream is,String format) throws IOException {
Resource tmp=null;
try{
tmp=SystemUtil.getTempDirectory().getRealResource(IDGenerator.intId()+(StringUtil.isEmpty(format)?"":"."+format));
IOUtil.copy(is, tmp,false);
//Object im = JAI.create("fileload", tmp.getAbsolutePath());
return getAsBufferedImage(create("fileload", tmp.getAbsolutePath()));
}
finally {
if(tmp!=null) ResourceUtil.removeEL(tmp, false);
}
}
public static void write(BufferedImage img, Resource res,String format) throws IOException {
Resource tmp=res;
try{
if(!(res instanceof File)) {
tmp=SystemUtil.getTempDirectory().getRealResource(IDGenerator.intId()+"-"+res.getName());
}
//JAI.create("filestore", img, tmp.getAbsolutePath(),format);
create("filestore", img, tmp.getAbsolutePath(),format);
}
finally {
if(tmp!=res) {
IOUtil.copy(tmp, res);
ResourceUtil.removeEL(tmp, false);
}
}
}
public static void write(BufferedImage img, OutputStream os,String format) throws IOException {
Resource tmp=null;
try{
tmp=SystemUtil.getTempDirectory().getRealResource(IDGenerator.intId()+"."+format);
create("filestore", img, tmp.getAbsolutePath(),format);
IOUtil.copy(tmp, os,false);
}
finally {
if(tmp!=null) ResourceUtil.removeEL(tmp, false);
}
}
////////////////////////////////////////////////////////////////////
private static Object create(String name, Object param) throws IOException {
try {
return create1().invoke(null, new Object[]{name,param});
} catch (Exception e) {
throw toIOException(e);
}
}
private static Object create(String name, Object img, Object param1, Object param2) throws IOException {
try {
return create3().invoke(null, new Object[]{name,img,param1,param2});
}
catch (Exception e) {
throw toIOException(e);
}
}
private static BufferedImage getAsBufferedImage(Object im) throws IOException {
//RenderedOp.getAsBufferedImage();
try {
return (BufferedImage) getAsBufferedImage().invoke(im, new Object[0]);
}
catch (Exception e) {
throw toIOException(e);
}
}
private static Method getAsBufferedImage() throws IOException {
if(getAsBufferedImage==null) {
try {
getAsBufferedImage = getRenderedOp().getMethod("getAsBufferedImage", new Class[0]);
}
catch (Exception e) {
throw toIOException(e);
}
}
return getAsBufferedImage;
}
private static Method create1() throws IOException {
if(create1==null) {
try {
create1 = getJAI().getMethod("create", new Class[]{String.class,Object.class});
}
catch (Exception e) {
throw toIOException(e);
}
}
return create1;
}
private static Method create3() throws IOException {
if(create3==null) {
try {
create3 = getJAI().getMethod("create", new Class[]{String.class,RenderedImage.class,Object.class,Object.class});
} catch (Exception e) {
throw toIOException(e);
}
}
return create3;
}
private static Class getRenderedOp() throws IOException {
if(_RenderedOp==null) {
_RenderedOp = ClassUtil.loadClass("javax.media.jai.RenderedOp",null);
if(_RenderedOp==null)
throw new IOException("JAI is not installed on the system but needed for this extension");
}
return _RenderedOp;
}
private static Class getJAI() throws IOException {
if(_JAI==null) {
_JAI = ClassUtil.loadClass("javax.media.jai.JAI",null);
if(_JAI==null)
throw new IOException("JAI is not installed on the system but needed for this extension");
}
return _JAI;
}
private static IOException toIOException(Throwable e) {
if(e instanceof InvocationTargetException)
e=((InvocationTargetException)e).getTargetException();
if(e instanceof IOException) return (IOException) e;
IOException ioe = new IOException(e.getMessage());
ioe.setStackTrace(e.getStackTrace());
return ioe;
}
}