package railo.commons.pdf;
import java.awt.Dimension;
import java.awt.Insets;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.URL;
import java.net.URLClassLoader;
import railo.Version;
import railo.commons.io.IOUtil;
import railo.commons.io.res.Resource;
import railo.commons.io.res.filter.ExtensionResourceFilter;
import railo.commons.io.res.util.FileWrapper;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.ClassUtil;
import railo.commons.lang.Md5;
import railo.runtime.Info;
import railo.runtime.config.Config;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
public class PDF {
private final Object pd4ml;
private static Class pd4mlClass;
private static ClassLoader classLoader;
private static Class pd4mlMarkClass;
//private final boolean isEvaluation;
public PDF(Config config) throws PageException {
//this.isEvaluation=isEvaluation;
try {
//classLoader=new URLClassLoader(new URL[]{new File("/Users/mic/Downloads/java/pd4ml/fullversion/pd4ml.volume.310/lib/pd4ml.jar").toURL()},this.getClass().getClassLoader());
if(classLoader==null) {
Resource temp = config.getConfigDir().getRealResource("temp");
Resource file=temp.getRealResource(Md5.getDigestAsString(Info.getVersionAsString())+".lmdp");
if(!file.exists()){
ResourceUtil.removeChildrenEL(temp, new ExtensionResourceFilter(".lmdp"));
file.createFile(true);
//print.out(new Info().getClass().getResource("/resource/lib/pd4ml.jar"));
InputStream jar = new Info().getClass().getResourceAsStream("/resource/lib/pd4ml.jar");
IOUtil.copy(jar, file,true);
}
ClassLoader parent = Version.class.getClassLoader();
classLoader=new URLClassLoader(new URL[]{FileWrapper.toFile(file).toURL()},parent);
//classLoader=new URLClassLoader(new URL[]{new Info().getClass().getResource("/resource/lib/pd4ml.jar")},this.getClass().getClassLoader());
}
if(pd4mlClass==null)pd4mlClass=ClassUtil.loadClass(classLoader,"org.zefer.pd4ml.PD4ML");
pd4ml=ClassUtil.loadInstance(pd4mlClass);
} catch (Exception e) {
throw Caster.toPageException(e);
}
pd4mlClass=pd4ml.getClass();
}
public void enableTableBreaks(boolean b) throws PageException {
invoke(pd4ml,"enableTableBreaks",b);
}
public void interpolateImages(boolean b) throws PageException {
invoke(pd4ml,"interpolateImages",b);
}
public void adjustHtmlWidth() throws PageException {
invoke(pd4ml,"adjustHtmlWidth");
}
public void setPageInsets(Insets insets) throws PageException {
invoke(pd4ml,"setPageInsets",insets);
}
public void setPageSize(Dimension dimension) throws PageException {
invoke(pd4ml,"setPageSize",dimension);
}
public void setPageHeader(PDFPageMark header) throws PageException {
invoke(pd4ml,"setPageHeader",toPD4PageMark(header));
}
public void generateOutlines(boolean flag) throws PageException {
invoke(pd4ml,"generateOutlines",
new Object[]{Caster.toBoolean(flag)},new Class[]{boolean.class});
}
public void useTTF(String pathToFontDirs,boolean embed ) throws PageException {
invoke(pd4ml,"useTTF",
new Object[]{pathToFontDirs,Caster.toBoolean(embed)},
new Class[]{String.class,boolean.class});
}
public void setDefaultTTFs(String string, String string2, String string3) throws PageException {
invoke(pd4ml,"setDefaultTTFs",
new Object[]{string,string2,string3},
new Class[]{String.class,String.class,String.class});
}
public void setPageFooter(PDFPageMark footer) throws PageException {
//if(isEvaluation) return;
invoke(pd4ml,"setPageFooter",toPD4PageMark(footer));
}
public void render(InputStreamReader reader, OutputStream os) throws PageException {
//setEvaluationFooter();
invoke(pd4ml, "render",
new Object[]{reader,os},
new Class[]{reader.getClass(),OutputStream.class});
//invoke(pd4ml,"render",reader,os,OutputStream.class);
}
public void render(String str, OutputStream os,URL base) throws PageException {
//setEvaluationFooter();
StringReader sr = new StringReader(str);
if(base==null) {
invoke(pd4ml, "render",
new Object[]{sr,os},
new Class[]{sr.getClass(),OutputStream.class});
}
else {
invoke(pd4ml, "render",
new Object[]{sr,os,base},
new Class[]{sr.getClass(),OutputStream.class,URL.class});
}
//invoke(pd4ml,"render",new StringReader(str),os,OutputStream.class);
}
/*private void setEvaluationFooterX() throws PageException {
if(isEvaluation) invoke(pd4ml,"setPageFooter",toPD4PageMark(new PDFPageMark(-1,EVAL_TEXT)));
}*/
private Object toPD4PageMark(PDFPageMark mark) throws PageException {
Object pd4mlMark=null;
try {
if(pd4mlMarkClass==null)pd4mlMarkClass=ClassUtil.loadClass(classLoader,"org.zefer.pd4ml.PD4PageMark");
pd4mlMark=ClassUtil.loadInstance(pd4mlMarkClass);
} catch (Exception e) {
}
invoke(pd4mlMark,"setAreaHeight",mark.getAreaHeight());
invoke(pd4mlMark,"setHtmlTemplate",mark.getHtmlTemplate());
return pd4mlMark;
}
private void invoke(Object o,String methodName, Object[] args, Class[] argClasses) throws PageException {
try {
o.getClass().getMethod(methodName, argClasses).invoke(o, args);
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
/*private void invoke(Object o,String methodName, Object argument1, Object argument2,Class clazz) throws PageException {
try {
o.getClass().getMethod(methodName, new Class[]{argument1.getClass(),clazz}).invoke(o, new Object[]{argument1,argument2});
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}*/
private void invoke(Object o,String methodName, Object argument) throws PageException {
try {
o.getClass().getMethod(methodName, new Class[]{argument.getClass()}).invoke(o, new Object[]{argument});
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
private void invoke(Object o,String methodName, boolean argument) throws PageException {
try {
o.getClass().getMethod(methodName, new Class[]{boolean.class}).invoke(o, new Object[]{Caster.toRef(argument)});
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
private void invoke(Object o,String methodName, int argument) throws PageException {
try {
o.getClass().getMethod(methodName, new Class[]{int.class}).invoke(o, new Object[]{Caster.toRef(argument)});
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
private void invoke(Object o,String methodName) throws PageException {
try {
o.getClass().getMethod(methodName, new Class[]{}).invoke(o, new Object[]{});
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
}