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    }