package br.com.citframework.util;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import br.com.centralit.citcorpore.util.Enumerados.TipoDate;
import br.com.citframework.dto.Usuario;
public class WebUtil {
private static final Logger LOGGER = Logger.getLogger(WebUtil.class);
public static void setUsuario(final Usuario usuario, final HttpServletRequest req) {
req.getSession().setAttribute(Constantes.getValue("USUARIO_SESSAO"), usuario);
}
/**
* Obtem o valor do identificador que est� na requisi��o.
*
* @param request
* -> Objeto HttpServletRequest
* @param identificador
* -> nome do indentificador a ser recuperado
* @return
*/
public static String getStringRequest(final HttpServletRequest request, final String identificador) {
String aux = (String) request.getAttribute(identificador);
if (aux == null) { // Se getParameter for nulo, tenta pegar em getAttribute.
aux = request.getParameter(identificador);
}
if (aux == null) {
aux = "";
}
return aux;
}
/**
* Obtem o valor do identificador que est� na requisi��o para o Indice informado
*
* @param request
* -> Objeto HttpServletRequest
* @param identificador
* -> nome do indentificador a ser recuperado
* @param i
* -> indice a ser retornado o valor.
* @param caracterSeparador
* -> caracter separador de separa��o do atributo que est� na requisi��o.
* @return
*/
public static String getStringRequest(final HttpServletRequest request, final String identificador, final int i, final String caracterSeparador) {
String aux = (String) request.getAttribute(identificador);
if (aux == null) { // Se getParameter for nulo, tenta pegar em getAttribute.
aux = request.getParameter(identificador);
}
if (aux == null) {
aux = "";
}
final String[] arrayReq = aux.split(caracterSeparador);
if (arrayReq != null) {
if (arrayReq.length > i) {
return arrayReq[i];
}
}
return null;
}
public static String getInfoIfChecked(final HttpServletRequest request, final String identificador, final String value) {
String aux = (String) request.getAttribute(identificador);
if (aux == null) { // Se getParameter for nulo, tenta pegar em getAttribute.
aux = request.getParameter(identificador);
}
if (aux == null) {
aux = "";
}
if (aux.equalsIgnoreCase(value)) {
return " checked ";
}
return "";
}
public static Usuario getUsuario(final HttpServletRequest req) {
final Usuario user = (Usuario) req.getSession().getAttribute(Constantes.getValue("USUARIO_SESSAO"));
if (user == null) {
req.getSession().invalidate();
}
return user;
}
/**
* Deserializa um objeto obtendo os valores do request
*
* @param classe
* @param name
* @param req
* @return
* @throws Exception
*/
public static Collection deserializeCollectionFromRequest(final Class<?> classe, final String name, final HttpServletRequest request) throws Exception {
final String strParser = request.getParameter(name);
if (strParser == null) {
return null;
}
/** Alterado por valdoilo.damasceno para chamar m�todo em que eu passe o request. */
return deserializeCollectionFromString(classe, strParser, WebUtil.getLanguage(request));
}
/**
* Deserializa uma cole��o de objetos serializados em uma String. Para os campos do tipo Data � considerado a linguagem do usu�rio informada via par�metro.
*
* @param classe
* @param valor
* @return Collection de objetos deserializado.
* @throws Exception
* @author valdoilo.damasceno
* @since 22.02.2014
*/
public static Collection deserializeCollectionFromString(final Class<?> classe, final String valor, final String language) throws Exception {
final Collection col = new ArrayList<>();
final String[] strArray = separaObjetos(valor, '\3'); // Esta string representa a colecao de objetos serializados
if (strArray == null) {
return null;
}
for (final String element : strArray) {
final Object obj = deserializeObject(classe, element, language);
if (obj != null) {
col.add(obj);
}
}
return col;
}
/**
* Deserializa uma colecao de objetos atraves do valor passado como parametro.
*
* @param classe
* @param valor
* @return
* @throws Exception
*/
public static Collection deserializeCollectionFromString(final Class<?> classe, final String valor) throws Exception {
final Collection col = new ArrayList<>();
final String[] strArray = separaObjetos(valor, '\3'); // Esta string representa a colecao de objetos serializados
if (strArray == null) {
return null;
}
for (final String element : strArray) {
final Object obj = deserializeObject(classe, element);
if (obj != null) {
col.add(obj);
}
}
return col;
}
/**
* Recebe a classe que deve ser deserializada e a string contendo o objeto serializado
* Exemplo: deserializeObject(Lotacao.class, "idFuncao\47\6idCargo\49\6....");
* Onde isso representa: idFuncao=7;idCargo=9;
*
* @param classe
* @param value
* @return
* @throws Exception
*/
public static Object deserializeObject(final Class<?> classe, final String value) throws Exception {
if (value == null) {
return null;
}
final String[] str = separaObjetos(value, '\6'); // Quebra os atributos
Object obj = null;
try {
obj = classe.newInstance();
} catch (final Exception e) {
LOGGER.error("Erro ao criar instancia do tipo: " + classe);
throw e;
}
// Faz o tratamento dos pares propriedade=valor
String[] propriedadesValores;
String aux;
if (str != null) {
for (final String element : str) {
propriedadesValores = separaByToken(element, '\4');
try {
aux = UtilStrings.decodeCaracteresEspeciais(decodificaEnter(propriedadesValores[1]));
if (UtilStrings.nullToVazio(aux).equalsIgnoreCase("null")) {
aux = null;
}
Reflexao.setPropertyValueFromString(obj, aux, propriedadesValores[0].trim());
} catch (final Exception e) {
try {
System.out.println("Falha ao definir atributo: " + propriedadesValores[0] + " " + e.getMessage());
} catch (final Exception ex) {}
}
}
}
return obj;
}
/**
* Recebe a classe que deve ser deserializada e a string contendo o objeto serializado Exemplo: deserializeObject(Lotacao.class, "idFuncao\47\6idCargo\49\6...."); Onde isso
* representa:
* idFuncao=7;idCargo=9; Para os campos Data � considerado a linguagem do usu�rio logado passada por par�metro.
*
* @param classe
* @param value
* @return Object - Objeto deserializado.
* @throws Exception
* @author valdoilo.damasceno
* @since 11.02.2014
*/
public static Object deserializeObject(final Class<?> classe, final String value, final String language) throws Exception {
if (value == null) {
return null;
}
final String[] str = separaObjetos(value, '\6'); // Quebra os atributos
Object obj = null;
try {
obj = classe.newInstance();
} catch (final Exception e) {
LOGGER.error("Erro ao criar instancia do tipo: " + classe);
throw e;
}
// Faz o tratamento dos pares propriedade=valor
String[] propriedadesValores;
String aux;
if (str != null) {
for (final String element : str) {
propriedadesValores = separaByToken(element, '\4');
try {
aux = UtilStrings.decodeCaracteresEspeciais(decodificaEnter(propriedadesValores[1]));
if (UtilStrings.nullToVazio(aux).equalsIgnoreCase("null")) {
aux = null;
}
Reflexao.setPropertyValueFromString(obj, aux, propriedadesValores[0].trim(), language);
} catch (final Exception e) {
try {
System.out.println("Falha ao definir atributo: " + propriedadesValores[0] + " " + e.getMessage());
} catch (final Exception ex) {}
}
}
}
return obj;
}
public static String[] separaObjetos(final String str, final char token) {
final Collection col = new ArrayList<>();
String obj = null;
boolean bIniciou = false;
int qtdeChaveAberta = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == token && qtdeChaveAberta == 0) {
if (obj != null) {
col.add(obj);
}
obj = new String("");
} else {
if (str.charAt(i) == '\5') {
qtdeChaveAberta--;
}
if (bIniciou) {
if (obj != null && qtdeChaveAberta > 0) {
obj += str.charAt(i);
}
}
if (str.charAt(i) == '\2') {
bIniciou = true;
qtdeChaveAberta++;
}
}
}
if (obj != null) {
col.add(obj);
}
String[] ret = null;
if (col.size() > 0) {
ret = new String[col.size()];
}
int i = 0;
for (final Iterator it = col.iterator(); it.hasNext(); i++) {
ret[i] = (String) it.next();
}
return ret;
}
/**
* Esta funcao quebra os tokens de objetos.
* Ele deve ser usada no lugar do Split pois podem existir objetos dentro de objetos.
*
* @param str
* @param token
* @return
*/
public static String[] separaByToken(final String str, final char token) {
String propriedade = "";
String valor = "";
boolean bProp = true;
boolean bIniciou = false;
int qtdeChaveAberta = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == token) {
bProp = false;
}
if (bProp) {
propriedade += str.charAt(i);
} else {
if (str.charAt(i) == '\5') {
qtdeChaveAberta--;
if (qtdeChaveAberta == 0) {
break;
}
}
if (bIniciou && qtdeChaveAberta > 0) {
valor += str.charAt(i);
}
if (str.charAt(i) == '\2') {
bIniciou = true;
qtdeChaveAberta++;
}
}
}
final String[] strRetorno = new String[] {propriedade, valor};
return strRetorno;
}
/**
* Este metodo foi mantido para suportar utilizacoes anteriores.
* Recebe valores separados por = e propriedades separadas por ;
*
* @param classe
* @param name
* @param req
* @return
* @throws Exception
*/
public static Collection getValuesCollectionRequest(final Class<?> classe, final String name, final HttpServletRequest req) throws Exception {
final Collection col = new ArrayList<>();
final String[] strParser = req.getParameterValues(name);
if (strParser == null) {
return null;
}
for (final String element : strParser) {
final String[] str = element.split(";");
String[] propriedadesValores;
Object obj;
try {
obj = classe.newInstance();
} catch (final InstantiationException e1) {
throw new Exception("Erro ao instanciar a classe (1)!");
} catch (final IllegalAccessException e1) {
throw new Exception("Erro ao instanciar a classe (2)!");
}
// Faz o tratamento dos pares propriedade=valor
for (final String element2 : str) {
propriedadesValores = element2.split("=");
try {
Reflexao.setPropertyValueFromString(obj, propriedadesValores[1], propriedadesValores[0]);
} catch (final Exception e) {
e.printStackTrace();
// Deixa passar... fica sem setar este valor
}
}
col.add(obj);
}
return col;
}
/**
* Serializa uma cole��o de objetos tratando os campos de Data de acordo coma linguagem do usu�rio passado por par�metro. Este m�todo tamb�m est� em String
* br.com.citframework.util.WebUtil.serializeObjects(Collection col, String language) throws Exception
*
* @param language
* - String com a linguagem do usu�rio.
* @throws Exception
* @author valdoilo.damasceno
* @since 17.02.2014
*/
public static String serializeObjects(final Collection col, final String language) throws Exception {
if (col == null) {
return "";
}
String result = "";
Object obj;
for (final Iterator it = col.iterator(); it.hasNext();) {
obj = it.next();
result = result + "\3\2";
result = result + serializeObject(obj, language);
result = result + "\5";
}
return result;
}
/**
* Serializa um objeto em String. Os campos do tipo data s�o tratados de acordo com a linguagem passada por par�metro. Este m�todo tamb�m est� em String
* br.com.centralit.citajax.util.CitAjaxWebUtil.serializeObject(Object objeto, boolean naoCodificaApostrofeAspas, String language) throws Exception
*
* @param objeto
* - Objeto a ser serializado.
* @param naoCodificaApostrofeAspas
* @param language
* - String coma linguagem do usu�rio.
* @return String do objeto serializado.
* @throws Exception
* @author valdoilo.damasceno
* @since 17.02.2014
*/
public static String serializeObject(final Object objeto, final String language) throws Exception {
if (objeto == null) {
return "";
}
String strResult = "";
String propriedade;
Object value;
String valueStr;
final List lstGets = Reflexao.findGets(objeto);
for (int i = 0; i < lstGets.size(); i++) {
propriedade = (String) lstGets.get(i);
if (!propriedade.equalsIgnoreCase("class")) {
value = Reflexao.getPropertyValue(objeto, propriedade);
if (value != null) {
valueStr = "";
if (Date.class.isInstance(value)) {
valueStr = UtilDatas.convertDateToString(TipoDate.DATE_DEFAULT, (Date) value, language);
} else if (java.util.Date.class.isInstance(value)) {
valueStr = UtilDatas.convertDateToString(TipoDate.DATE_DEFAULT, (java.util.Date) value, language);
} else if (Double.class.isInstance(value)) {
Integer qtdeCasasDec = new Integer(2);
final Method m = Reflexao.findMethod("get" + propriedade + "_casasDecimais", objeto);
if (m != null) {
qtdeCasasDec = (Integer) Reflexao.getPropertyValue(objeto, propriedade + "_casasDecimais");
}
valueStr = UtilFormatacao.formatDouble((Double) value, qtdeCasasDec.intValue());
} else if (BigDecimal.class.isInstance(value)) {
Integer qtdeCasasDec = new Integer(2);
final Method m = Reflexao.findMethod("get" + propriedade + "_casasDecimais", objeto);
if (m != null) {
qtdeCasasDec = (Integer) Reflexao.getPropertyValue(objeto, propriedade + "_casasDecimais");
}
valueStr = UtilFormatacao.formatBigDecimal((BigDecimal) value, qtdeCasasDec.intValue());
} else {
valueStr = value.toString();
}
strResult = strResult + "\6\2";
strResult = strResult + UtilStrings.convertePrimeiraLetra(propriedade, "L") + "\4\2" + codificaEnter(valueStr) + "\5";
strResult = strResult + "\5";
} else {
strResult = strResult + "\6\2";
strResult = strResult + UtilStrings.convertePrimeiraLetra(propriedade, "L") + "\4\2" + "\5";
strResult = strResult + "\5";
}
}
}
return strResult;
}
/**
* Serializa um objeto.
*
* @throws Exception
*/
public static String serializeObjects(final Collection col) throws Exception {
if (col == null) {
return "";
}
String result = "";
Object obj;
for (final Iterator it = col.iterator(); it.hasNext();) {
obj = it.next();
result = result + "\3\2";
result = result + serializeObject(obj);
result = result + "\5";
}
return result;
}
/*
* Serializa um objeto em string para envio ao servidor.
*/
public static String serializeObject(final Object objeto) throws Exception {
if (objeto == null) {
return "";
}
String strResult = "";
String propriedade;
Object value;
String valueStr;
final List lstGets = Reflexao.findGets(objeto);
for (int i = 0; i < lstGets.size(); i++) {
propriedade = (String) lstGets.get(i);
if (!propriedade.equalsIgnoreCase("class")) {
value = Reflexao.getPropertyValue(objeto, propriedade);
if (value != null) {
valueStr = "";
if (Date.class.isInstance(value)) {
valueStr = UtilDatas.dateToSTR((Date) value);
} else if (java.util.Date.class.isInstance(value)) {
valueStr = UtilDatas.dateToSTR((java.util.Date) value);
} else if (Double.class.isInstance(value)) {
Integer qtdeCasasDec = new Integer(2);
final Method m = Reflexao.findMethod("get" + propriedade + "_casasDecimais", objeto);
if (m != null) {
qtdeCasasDec = (Integer) Reflexao.getPropertyValue(objeto, propriedade + "_casasDecimais");
}
valueStr = UtilFormatacao.formatDouble((Double) value, qtdeCasasDec.intValue());
} else if (BigDecimal.class.isInstance(value)) {
Integer qtdeCasasDec = new Integer(2);
final Method m = Reflexao.findMethod("get" + propriedade + "_casasDecimais", objeto);
if (m != null) {
qtdeCasasDec = (Integer) Reflexao.getPropertyValue(objeto, propriedade + "_casasDecimais");
}
valueStr = UtilFormatacao.formatBigDecimal((BigDecimal) value, qtdeCasasDec.intValue());
} else {
valueStr = value.toString();
}
strResult = strResult + "\6\2";
strResult = strResult + UtilStrings.convertePrimeiraLetra(propriedade, "L") + "\4\2" + codificaEnter(valueStr) + "\5";
strResult = strResult + "\5";
} else {
strResult = strResult + "\6\2";
strResult = strResult + UtilStrings.convertePrimeiraLetra(propriedade, "L") + "\4\2" + "\5";
strResult = strResult + "\5";
}
}
}
return strResult;
}
public static String codificaEnter(final String str) {
final String x = str.replaceAll("\r", "#10#");
return x.replaceAll("\n", "#13#");
}
public static String decodificaEnter(final String str) {
final String x = str.replaceAll("#10#", "\r");
return x.replaceAll("#13#", "\n");
}
/**
* Retorna Linguagem do session do request.
*
* @param request
* @return String - language
* @author valdoilo.damasceno
* @since 04.02.2014
*/
public static String getLanguage(final HttpServletRequest request) {
String language = UtilI18N.PORTUGUESE_SIGLA;
if (request != null && request.getSession() != null && request.getSession().getAttribute("locale") != null) {
language = (String) request.getSession().getAttribute("locale");
}
return language.trim();
}
/**
* Recupera da request a URL de chamada. Por exemplo, {@code "http://localhost:8080/path1/path2"} ir� retornar {@code "http://localhost:8080"}
*
* @param request
* {@link HttpServletRequest} de onde ser� recuperada a URL
* @return URL recuperada
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @date 20/11/2014
*/
public static String getURLFromRequest(final HttpServletRequest request) {
Assert.notNull(request, "Request must not be null");
final String requestURL = request.getRequestURL().toString();
Assert.notNullAndNotEmpty(requestURL, "Request URL must not be null or empty");
final int index = requestURL.indexOf("/", 8);
return requestURL.substring(0, index);
}
}