/**
* OpenKM, Open Document Management System (http://www.openkm.com)
* Copyright (c) 2006-2011 Paco Avila & Josep Llort
*
* No bytes were intentionally harmed during the development of this application.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.openkm.util;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author jllort
*
*/
public class WebUtils {
private static Logger log = LoggerFactory.getLogger(WebUtils.class);
public static final String EMPTY_STRING = "";
/**
* Extrae un parámetro de tipo String del request. Si el parámetro no existe devuelve
* un String vacio.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor String del parámetro o un String vacio si no existe.
*/
public static final String getString(HttpServletRequest request, String name) {
String value = request.getParameter(name);
String stringValue = EMPTY_STRING;
if (value != null) {
try {
return new String(value.getBytes("ISO-8859-1"), "UTF-8").trim();
} catch (UnsupportedEncodingException e) {
// Ignore
}
}
return stringValue;
}
/**
* Extrae un parámetro de tipo String del request. Si el parámetro no existe devuelve
* el valor por defecto especificado.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @param Valor per defecto del parámetro.
* @return El valor String del parámetro o el valor por defecto si no existe.
*/
public static final String getString(HttpServletRequest request, String name, String defaultValue) {
String value = request.getParameter(name);
String stringValue = defaultValue;
if (value != null) {
try {
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
// Ignore
}
}
return stringValue;
}
/**
* Extrae un parámetro de tipo String del request. Si el parámetro no existe devuelve
* un String vacio.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor String del parámetro o un String vacio si no existe.
*/
public static final List<String> getStringList(HttpServletRequest request, String name) {
String[] value = request.getParameterValues(name);
List<String> stringValue = new ArrayList<String>();
if (value != null) {
try {
for (int i=0; i<value.length; i++) {
stringValue.add(new String(value[i].getBytes("ISO-8859-1"), "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
// Ignore
}
}
return stringValue;
}
/**
* Extrae un parámetro de tipo entero del request.
* Si el parámetro no existe o no es valido devuelve 0.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor int del parámetro o 0 si no existe o no es valido.
*/
public static final int getInt(HttpServletRequest request, String name) {
String strValue = request.getParameter(name);
int intValue = 0;
if (strValue != null && !EMPTY_STRING.equals(strValue)) {
try {
intValue = Integer.parseInt(strValue);
} catch (Throwable t) {
// Ignore
}
}
return intValue;
}
/**
* Extrae un parámetro de tipo entero del request.
* Si el parámetro no existe o no es valido devuelve el valor por defecto especificado.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @param defaultValue Valor per defecto
* @return El valor int del parámetro o el valor por defecto especificado si no existe o no es valido.
*/
public static final int getInt(HttpServletRequest request, String name, int defaultValue) {
String strValue = request.getParameter(name);
int intValue = defaultValue;
if (strValue != null && !EMPTY_STRING.equals(strValue)) {
try {
intValue = Integer.parseInt(strValue);
} catch (Throwable t) {
// Ignore
}
}
return intValue;
}
/**
* Extrae un parámetro de tipo Integer del request. Si el parámetro no existe devuelve
* un Integer vacio.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor String del parámetro o un String vacio si no existe.
*/
public static final List<Integer> getIntList(HttpServletRequest request, String name) {
String[] value = request.getParameterValues(name);
List<Integer> intValue = new ArrayList<Integer>();
if (value != null) {
try {
for (int i=0; i<value.length; i++) {
intValue.add(Integer.parseInt(value[i]));
}
} catch (Throwable e) {
// Ignore
}
}
return intValue;
}
/**
* Extrae un parámetro de tipo long del request.
* Si el parámetro no existe o no es valido devuelve 0.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor int del parámetro o 0 si no existe o no es valido.
*/
public static final long getLong(HttpServletRequest request, String name) {
String strValue = request.getParameter(name);
long longValue = 0;
if (strValue != null && !EMPTY_STRING.equals(strValue)) {
try {
longValue = Long.parseLong(strValue);
} catch (Throwable t) {
// Ignore
}
}
return longValue;
}
/**
* Extrae un parámetro de tipo float del request.
* Si el parámetro no existe o no es valido devuelve 0.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return El valor float del parámetro o 0 si no existe o no es valido.
*/
public static final float getFloat(HttpServletRequest request, String name) {
String strValue = request.getParameter(name);
float floatValue = 0;
if (strValue != null && !EMPTY_STRING.equals(strValue)) {
try {
floatValue = Float.parseFloat(strValue);
} catch (Throwable t) {
// Ignore
}
}
return floatValue;
}
/**
* Extrae un parámetro de tipo booleano del request.
* Si el parámetro existe y no esta vacio devuelve true, en caso contrario devuelve false.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @return true si el parámetro existe y no esta vacio, false en caso contrario.
*/
public static final boolean getBoolean(HttpServletRequest request, String name) {
String strValue = request.getParameter(name);
return (strValue != null && !strValue.equals(EMPTY_STRING) && !strValue.equals("false"));
}
/**
* Extrae un parámetro de tipo booleano del request.
* Si el parámetro existe y es igual al valor especificado devuelve true, en caso
* contrario devuelve false.
* @param request Petición de la que extraer el parámetro.
* @param name Nombre del parámetro
* @param trueValue Valor considerado true.
* @return true si el parámetro existe y es igual a trueValue, false en caso contrario.
*/
public static final boolean getBoolean(HttpServletRequest request, String name, String trueValue) {
String strValue = request.getParameter(name);
return (strValue != null && strValue.equals(trueValue));
}
/**
* Send file to client browser.
*
* @throws IOException If there is a communication error.
*/
public static void sendFile(HttpServletRequest request, HttpServletResponse response,
String fileName, String mimeType, boolean inline, InputStream is) throws IOException {
log.debug("sendFile({}, {}, {}, {}, {}, {})", new Object[] {request, response, fileName, mimeType, inline, is});
prepareSendFile(request, response, fileName, mimeType, inline);
// Set length
response.setContentLength(is.available());
log.debug("File: {}, Length: {}", fileName, is.available());
ServletOutputStream sos = response.getOutputStream();
IOUtils.copy(is, sos);
sos.flush();
sos.close();
}
/**
* Send file to client browser.
*
* @throws IOException If there is a communication error.
*/
public static void sendFile(HttpServletRequest request, HttpServletResponse response,
String fileName, String mimeType, boolean inline, File input) throws IOException {
log.debug("sendFile({}, {}, {}, {}, {}, {})", new Object[] {request, response, fileName, mimeType, inline, input});
prepareSendFile(request, response, fileName, mimeType, inline);
// Set length
response.setContentLength((int) input.length());
log.debug("File: {}, Length: {}", fileName, input.length());
ServletOutputStream sos = response.getOutputStream();
FileUtils.copy(input, sos);
sos.flush();
sos.close();
}
/**
* Prepare to send the file.
*/
private static void prepareSendFile(HttpServletRequest request, HttpServletResponse response,
String fileName, String mimeType, boolean inline) throws UnsupportedEncodingException {
String agent = request.getHeader("USER-AGENT");
// Disable browser cache
//commented by vissu on 21nov
/* response.setHeader("Expires", "Sat, 6 May 1971 12:00:00 GMT");
response.setHeader("Cache-Control", "must-revalidate");
response.addHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache"); */
//added by vissu on 21nov
response.setHeader("Expires", "Sat, 6 May 1971 12:00:00 GMT");
response.setHeader("Cache-Control", "private, max-age=15");
// Set MIME type
response.setContentType(mimeType);
if (null != agent && -1 != agent.indexOf("MSIE")) {
log.debug("Agent: Explorer");
fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", " ");
//commented by vissu on 21nov
//if (request.getServerPort() == 443) {
System.out.println("Inside MSIE");
log.info("HTTPS detected! Apply IE workaround...");
//commented by vissu on 21nov
//response.setHeader("Pragma", "private");
response.setHeader("Pragma","");
//}
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {
log.debug("Agent: Mozilla");
fileName = MimeUtility.encodeText(fileName, "UTF-8", "B");
} else {
log.debug("Agent: Unknown");
}
if (inline) {
response.setHeader("Content-disposition", "inline; filename=\""+fileName+"\"");
} else {
response.setHeader("Content-disposition", "attachment; filename=\""+fileName+"\"");
}
}
}