/**
*
* Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
package lucee.runtime.thread;
import java.io.OutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import lucee.commons.io.DevNullOutputStream;
import lucee.commons.io.res.Resource;
import lucee.commons.lang.Pair;
import lucee.runtime.CFMLFactory;
import lucee.runtime.CFMLFactoryImpl;
import lucee.runtime.PageContext;
import lucee.runtime.PageContextImpl;
import lucee.runtime.config.Config;
import lucee.runtime.config.ConfigWeb;
import lucee.runtime.net.http.HTTPServletRequestWrap;
import lucee.runtime.net.http.HttpServletRequestDummy;
import lucee.runtime.net.http.HttpServletResponseDummy;
import lucee.runtime.type.Struct;
public class ThreadUtil {
public static PageContextImpl clonePageContext(PageContext pc, OutputStream os, boolean stateless,boolean register2Thread,boolean register2RunningThreads,boolean isChild) {
// TODO stateless
CFMLFactoryImpl factory = (CFMLFactoryImpl) pc.getConfig().getFactory();
HttpServletRequest req=new HTTPServletRequestWrap(cloneHttpServletRequest(pc));
HttpServletResponse rsp=createHttpServletResponse(os);
// copy state
PageContextImpl pci = (PageContextImpl) pc;
PageContextImpl dest = factory.getPageContextImpl(factory.getServlet(), req, rsp, null, false, -1, false,register2Thread, isChild,pc.getRequestTimeout(),register2RunningThreads,false);
pci.copyStateTo(dest);
return dest;
}
/**
*
* @param config
* @param os
* @param serverName
* @param requestURI
* @param queryString
* @param cookies
* @param headers
* @param parameters
* @param attributes
* @param register
* @param timeout timeout in ms, if the value is smaller than 1 it is ignored and the value comming from the context is used
* @return
*/
public static PageContextImpl createPageContext(ConfigWeb config,OutputStream os,String serverName,String requestURI,
String queryString,Cookie[] cookies,Pair[] headers,byte[] body,Pair[] parameters,Struct attributes,boolean register, long timeout) {
CFMLFactory factory = config.getFactory();
HttpServletRequest req = new HttpServletRequestDummy(
config.getRootDirectory(),
serverName,
requestURI,
queryString,
cookies,
headers,
parameters,
attributes,
null,body
);
req=new HTTPServletRequestWrap(req);
HttpServletResponse rsp=createHttpServletResponse(os);
return (PageContextImpl) factory.getLuceePageContext(
factory.getServlet(),
req, rsp, null, false, -1, false,register,timeout,false,false);
}
/**
*
* @param factory
* @param rootDirectory
* @param os
* @param serverName
* @param requestURI
* @param queryString
* @param cookies
* @param headers
* @param parameters
* @param attributes
* @param register
* @param timeout in ms, if the value is smaller than 1 it is ignored and the value comming from the context is used
* @return
*/
public static PageContextImpl createPageContext(CFMLFactory factory, Resource rootDirectory, OutputStream os,String serverName,
String requestURI,String queryString,Cookie[] cookies,Pair[] headers,Pair[] parameters,Struct attributes, boolean register, long timeout) {
HttpServletRequest req=createHttpServletRequest(rootDirectory,
serverName,
requestURI,
queryString,
cookies,
headers,
parameters,
attributes,
null);
HttpServletResponse rsp=createHttpServletResponse(os);
return (PageContextImpl) factory.getLuceePageContext(
factory.getServlet(),
req, rsp, null, false, -1, false,register,timeout,false,false);
}
public static HttpServletRequest createHttpServletRequest(Resource contextRoot,String serverName, String scriptName,String queryString,
Cookie[] cookies, Pair[] headers, Pair[] parameters, Struct attributes, HttpSession session) {
return new HTTPServletRequestWrap(new HttpServletRequestDummy(
contextRoot,
serverName,
scriptName,
queryString,
cookies,
headers,
parameters,
attributes,
null,null
));
}
public static HttpServletRequest cloneHttpServletRequest(PageContext pc) {
Config config = pc.getConfig();
HttpServletRequest req = pc.getHttpServletRequest();
HttpServletRequestDummy dest = HttpServletRequestDummy.clone(config,config.getRootDirectory(),req);
return dest;
}
public static HttpServletResponse createHttpServletResponse(OutputStream os) {
if(os==null) os = DevNullOutputStream.DEV_NULL_OUTPUT_STREAM;
HttpServletResponseDummy dest = new HttpServletResponseDummy(os);
return dest;
}
/**
* return priority as a String representation
* @param priority Thread priority
* @return String defintion of priority (null when input is invalid)
*/
public static String toStringPriority(int priority) {
if(priority==Thread.NORM_PRIORITY) return "NORMAL";
if(priority==Thread.MAX_PRIORITY) return "HIGH";
if(priority==Thread.MIN_PRIORITY) return "LOW";
return null;
}
/**
* return priority as a int representation
* @param priority Thread priority as String definition
* @return int defintion of priority (-1 when input is invalid)
*/
public static int toIntPriority(String strPriority) {
strPriority=strPriority.trim().toLowerCase();
if("low".equals(strPriority)) return Thread.MIN_PRIORITY;
if("min".equals(strPriority)) return Thread.MIN_PRIORITY;
if("high".equals(strPriority)) return Thread.MAX_PRIORITY;
if("max".equals(strPriority)) return Thread.MAX_PRIORITY;
if("normal".equals(strPriority)) return Thread.NORM_PRIORITY;
if("norm".equals(strPriority)) return Thread.NORM_PRIORITY;
return -1;
}
}