001 package railo.runtime.concurrency; 002 003 import java.io.ByteArrayInputStream; 004 import java.io.ByteArrayOutputStream; 005 import java.util.concurrent.Callable; 006 007 import railo.commons.io.IOUtil; 008 import railo.runtime.PageContext; 009 import railo.runtime.PageContextImpl; 010 import railo.runtime.config.ConfigImpl; 011 import railo.runtime.engine.ThreadLocalPageContext; 012 import railo.runtime.exp.PageException; 013 import railo.runtime.net.http.HttpServletResponseDummy; 014 import railo.runtime.thread.ThreadUtil; 015 016 public abstract class Caller implements Callable<String> { 017 018 private PageContext parent; 019 private PageContextImpl pc; 020 private ByteArrayOutputStream baos; 021 022 public Caller(PageContext parent) { 023 this.parent = parent; 024 this.baos = new ByteArrayOutputStream(); 025 this.pc=ThreadUtil.clonePageContext(parent, baos, false, false, true); 026 } 027 028 public final String call() throws PageException { 029 ThreadLocalPageContext.register(pc); 030 pc.getRootOut().setAllowCompression(false); // make sure content is not compressed 031 String str=null; 032 try{ 033 _call(parent,pc); 034 } 035 finally{ 036 try { 037 HttpServletResponseDummy rsp=(HttpServletResponseDummy) pc.getHttpServletResponse(); 038 039 String enc = rsp.getCharacterEncoding(); 040 if(enc==null) enc="ISO-8859-1"; 041 042 pc.getOut().flush(); //make sure content is flushed 043 044 ((ConfigImpl)pc.getConfig()).getFactory().releasePageContext(pc); 045 str=IOUtil.toString((new ByteArrayInputStream(baos.toByteArray())), enc); // TODO add support for none string content 046 } 047 catch (Throwable e) { 048 // TODO Auto-generated catch block 049 e.printStackTrace(); 050 } 051 } 052 return str; 053 } 054 055 public abstract void _call(PageContext parent, PageContext pc) throws PageException; 056 //public abstract void afterCleanup(PageContext parent, ByteArrayOutputStream baos); 057 }