package ilarkesto.webapp;
import ilarkesto.base.Net;
import ilarkesto.base.Str;
import ilarkesto.core.logging.Log;
import ilarkesto.io.IO;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class Servlet {
private static final Log LOG = Log.get(Servlet.class);
public static final String ENCODING = IO.UTF_8;
private Servlet() {}
public static String getWebappUrl(ServletConfig servletConfig, boolean ssl) {
String protocol = ssl ? "https" : "http";
String host = IO.getHostName();
String context = servletConfig.getServletContext().getServletContextName();
return protocol + "://" + host + "/" + context;
}
public static void preventCaching(HttpServletResponse httpResponse) {
// prevent caching HTTP 1.1
httpResponse.setHeader("Cache-Control", "no-cache");
// prevent caching HTTP 1.0
httpResponse.setHeader("Pragma", "no-cache");
// prevent caching at the proxy server
httpResponse.setDateHeader("Expires", 0);
}
public static void serveFile(File file, HttpServletResponse httpResponse) throws IOException {
httpResponse.setContentType("application/octet-stream");
httpResponse.setContentLength((int) file.length());
Servlet.setFilename(file.getName(), httpResponse);
IO.copyFile(file, httpResponse.getOutputStream());
}
public static void setFilename(String fileName, HttpServletResponse httpResponse) {
httpResponse.setHeader("Content-Disposition", "inline; filename=" + fileName + ";");
}
public static final String getContextPath(ServletConfig servletConfig) {
return getContextPath(servletConfig.getServletContext());
}
public static final String getContextPath(ServletContext servletContext) {
String realPath = servletContext.getRealPath("dummy");
LOG.info("servletContextName:", servletContext.getServletContextName());
LOG.info("!!! dummy real path:", realPath);
File file = new File(realPath);
String path = file.getParentFile().getName();
// TODO String path = servletContext.getContextPaht() when servlet-2.5
if (path == null) return null;
path = path.trim();
if (path.startsWith("/")) path = path.substring(1);
if (path.endsWith("/")) path = path.substring(0, path.length() - 1);
path = path.trim();
if (path.length() == 0) return null;
if (path.equals("ROOT")) return null;
return path;
}
public static final String getUriWithoutContextWithParameters(HttpServletRequest httpRequest) {
StringBuilder sb = new StringBuilder();
sb.append(getUriWithoutContext(httpRequest));
sb.append("?");
Enumeration e = httpRequest.getParameterNames();
while (e.hasMoreElements()) {
String parameter = (String) e.nextElement();
sb.append(parameter);
sb.append('=');
sb.append(httpRequest.getParameter(parameter));
sb.append("&");
}
return sb.toString();
}
public static final String getUriWithoutContext(HttpServletRequest httpRequest) {
String uri = httpRequest.getRequestURI();
String context = httpRequest.getContextPath();
if (uri.length() <= context.length() + 1) return "";
return uri.substring(context.length() + 1);
}
public static String getRemoteHost(HttpServletRequest r) {
return Net.getHostnameOrIp(r.getRemoteAddr());
}
public static String getUserAgent(HttpServletRequest r) {
return r.getHeader("User-Agent");
}
public static String toString(HttpServletRequest r, String indent) {
StringBuilder sb = new StringBuilder();
sb.append(indent).append("requestedURL: ").append(r.getRequestURL()).append("\n");
sb.append(indent).append("requestedURI: ").append(r.getRequestURI()).append("\n");
sb.append(indent).append("queryString: ").append(r.getQueryString()).append("\n");
sb.append(indent).append("contextPath: ").append(r.getContextPath()).append("\n");
sb.append(indent).append("pathInfo: ").append(r.getPathInfo()).append("\n");
sb.append(indent).append("pathTranslated: ").append(r.getPathTranslated()).append("\n");
sb.append(indent).append("parameters: ").append(Str.format(r.getParameterMap())).append("\n");
sb.append(indent).append("headers: ").append(Str.format(getHeaders(r))).append("\n");
sb.append(indent).append("attributes: ").append(Str.format(getAttributes(r))).append("\n");
sb.append(indent).append("cookies: ").append(Str.format(r.getCookies())).append("\n");
sb.append(indent).append("protocol: ").append(r.getProtocol()).append("\n");
sb.append(indent).append("method: ").append(r.getMethod()).append("\n");
sb.append(indent).append("scheme: ").append(r.getScheme()).append("\n");
sb.append(indent).append("contentType: ").append(r.getContentType()).append("\n");
sb.append(indent).append("contentLenght: ").append(r.getContentLength()).append("\n");
sb.append(indent).append("characterEncoding: ").append(r.getCharacterEncoding()).append("\n");
sb.append(indent).append("authType: ").append(r.getAuthType()).append("\n");
sb.append(indent).append("CLIENT_CERT_AUTH: ").append(r.getHeader(HttpServletRequest.CLIENT_CERT_AUTH))
.append("\n");
sb.append(indent).append("DIGEST_AUTH: ").append(r.getHeader(HttpServletRequest.DIGEST_AUTH))
.append("\n");
sb.append(indent).append("remoteUser: ").append(r.getRemoteUser()).append("\n");
sb.append(indent).append("remoteAddr: ").append(r.getRemoteAddr()).append("\n");
sb.append(indent).append("remoteHost: ").append(r.getRemoteHost()).append("\n");
sb.append(indent).append("remotePort: ").append(r.getRemotePort()).append("\n");
sb.append(indent).append("requestedSessionId: ").append(r.getRequestedSessionId()).append("\n");
sb.append(indent).append("secure: ").append(r.isSecure()).append("\n");
sb.append(indent).append("locale: ").append(r.getLocale()).append("\n");
sb.append(indent).append("locales: ").append(Str.format(r.getLocales())).append("\n");
sb.append(indent).append("localName: ").append(r.getLocalName()).append("\n");
sb.append(indent).append("localPort: ").append(r.getLocalPort()).append("\n");
sb.append(indent).append("localAddr: ").append(r.getLocalAddr()).append("\n");
sb.append(indent).append("serverName: ").append(r.getServerName()).append("\n");
sb.append(indent).append("serverPort: ").append(r.getServerPort()).append("\n");
sb.append(indent).append("servletPath: ").append(r.getServletPath()).append("\n");
return sb.toString();
}
public static Map<String, String> getHeaders(HttpServletRequest r) {
Map<String, String> result = new HashMap<String, String>();
Enumeration names = r.getHeaderNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
String value = r.getHeader(name);
result.put(name, value);
}
return result;
}
public static Map<String, Object> getAttributes(HttpServletRequest r) {
Map<String, Object> result = new HashMap<String, Object>();
Enumeration names = r.getAttributeNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
Object value = r.getAttribute(name);
result.put(name, value);
}
return result;
}
public static void removeCookie(HttpServletResponse response, String cookieName) {
Cookie cookie = new Cookie(cookieName, "");
cookie.setMaxAge(1);
response.addCookie(cookie);
}
public static void setCookie(HttpServletResponse response, String cookieName, String cookieValue,
int maxAgeInSeconds) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setMaxAge(maxAgeInSeconds);
response.addCookie(cookie);
}
public static String getCookieValue(HttpServletRequest request, String cookieName) {
Cookie cookie = getCookie(request, cookieName);
if (cookie == null) return null;
return cookie.getValue();
}
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies == null) return null;
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(name)) return cookies[i];
}
return null;
}
}