001    package railo.runtime.thread;
002    
003    import java.io.OutputStream;
004    
005    import javax.servlet.http.Cookie;
006    import javax.servlet.http.HttpServletRequest;
007    import javax.servlet.http.HttpServletResponse;
008    
009    import railo.commons.io.DevNullOutputStream;
010    import railo.commons.lang.Pair;
011    import railo.runtime.CFMLFactory;
012    import railo.runtime.CFMLFactoryImpl;
013    import railo.runtime.PageContext;
014    import railo.runtime.PageContextImpl;
015    import railo.runtime.config.Config;
016    import railo.runtime.config.ConfigImpl;
017    import railo.runtime.config.ConfigWeb;
018    import railo.runtime.net.http.HTTPServletRequestWrap;
019    import railo.runtime.net.http.HttpServletRequestDummy;
020    import railo.runtime.net.http.HttpServletResponseDummy;
021    import railo.runtime.type.Struct;
022    
023    public class ThreadUtil {
024            
025    
026            public static  PageContextImpl clonePageContext(PageContext pc, OutputStream os, boolean stateless,boolean registerPC,boolean isChild)  {
027                    // TODO stateless
028                    CFMLFactoryImpl factory = (CFMLFactoryImpl) ((ConfigImpl)pc.getConfig()).getFactory();
029            HttpServletRequest      req=new HTTPServletRequestWrap(cloneHttpServletRequest(pc));
030            HttpServletResponse     rsp=createHttpServletResponse(os);
031            
032            // copy state
033            PageContextImpl pci = (PageContextImpl) pc;
034                    PageContextImpl dest = factory.getPageContextImpl(factory.getServlet(), req, rsp, null, false, -1, false,registerPC, isChild);
035                    pci.copyStateTo(dest);
036                    return dest;
037            }
038    
039            public static  PageContextImpl createPageContext(ConfigWeb config,OutputStream os,String serverName,String requestURI,String queryString,Cookie[] cookies,Pair[] headers,Pair[] parameters,Struct attributes)  {
040                    CFMLFactory factory = ((ConfigImpl)config).getFactory();
041            HttpServletRequest      req = new HttpServletRequestDummy(
042                                    config.getRootDirectory(),
043                                    serverName,
044                                    requestURI,
045                                    queryString,
046                                    cookies,
047                                    headers,
048                                    parameters,
049                                    attributes,
050                                    null
051                            );
052                    
053                    
054                    req=new HTTPServletRequestWrap(req);
055            HttpServletResponse     rsp=createHttpServletResponse(os);
056            
057            return (PageContextImpl) factory.getRailoPageContext(
058                            factory.getServlet(), 
059                            req, rsp, null, false, -1, false);
060                    
061            }
062            
063    
064            public static HttpServletRequest cloneHttpServletRequest(PageContext pc) {
065                    Config config = pc.getConfig();
066                    HttpServletRequest req = pc.getHttpServletRequest();
067                    HttpServletRequestDummy dest = HttpServletRequestDummy.clone(config,config.getRootDirectory(),req);
068                    return dest;
069            }
070            
071            public static HttpServletResponse createHttpServletResponse(OutputStream os) {
072                    if(os==null) os = DevNullOutputStream.DEV_NULL_OUTPUT_STREAM;
073                    
074                    HttpServletResponseDummy dest = new HttpServletResponseDummy(os);
075                    return dest;
076            }
077    
078            /**
079             * return priority as a String representation
080             * @param priority Thread priority
081             * @return String defintion of priority (null when input is invalid)
082             */
083            public static String toStringPriority(int priority) {
084                    if(priority==Thread.NORM_PRIORITY) return "NORMAL";
085                    if(priority==Thread.MAX_PRIORITY) return "HIGH";
086                    if(priority==Thread.MIN_PRIORITY) return "LOW";
087                    return null;
088            }
089            
090            /** 
091             * return priority as a int representation
092             * @param priority Thread priority as String definition
093             * @return int defintion of priority (-1 when input is invalid)
094             */
095            public static int toIntPriority(String strPriority) {
096                    strPriority=strPriority.trim().toLowerCase();
097                    
098                    if("low".equals(strPriority))           return Thread.MIN_PRIORITY;
099                    if("min".equals(strPriority))           return Thread.MIN_PRIORITY;
100                    if("high".equals(strPriority))          return Thread.MAX_PRIORITY;
101                    if("max".equals(strPriority))           return Thread.MAX_PRIORITY;
102                    if("normal".equals(strPriority))        return Thread.NORM_PRIORITY;
103                    if("norm".equals(strPriority))          return Thread.NORM_PRIORITY;
104                    return -1;
105            }
106    }