package br.com.centralit.citajax.framework;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.citajax.reflexao.CitAjaxReflexao;
import br.com.centralit.citajax.util.CitAjaxUtil;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilStrings;
public class ParserRequest {
private static final Logger LOGGER = Logger.getLogger(ParserRequest.class.getName());
/**
* Processa todos os elementos do request e gera um HashMap
*
* @param req
* @return
*/
public Map<String, Object> getFormFields(final HttpServletRequest req) {
try {
req.setCharacterEncoding("UTF-8");
} catch (final UnsupportedEncodingException e) {
LOGGER.log(Level.WARNING, "PROBLEMA COM CODIFICACAO DE CARACTERES!!! [AjaxProcessEvent.getFormFields()]" + e.getMessage(), e);
}
final Map<String, Object> formFields = new HashMap<>();
final Enumeration<String> en = req.getParameterNames();
String[] strValores;
while (en.hasMoreElements()) {
final String nomeCampo = en.nextElement();
strValores = req.getParameterValues(nomeCampo);
if (strValores.length == 0) {
formFields.put(nomeCampo.toUpperCase(), UtilStrings.decodeCaracteresEspeciais(req.getParameter(nomeCampo)));
} else {
if (strValores.length == 1) {
formFields.put(nomeCampo.toUpperCase(), UtilStrings.decodeCaracteresEspeciais(strValores[0]));
} else {
formFields.put(nomeCampo.toUpperCase(), strValores);
}
}
}
return formFields;
}
/**
* Passa os valores do Hash para o Bean.
*
* @param valores
* - HashMap
* @param bean
* - Object (DTO)
* @throws Exception
* @author valdoilo.damasceno
* @since 03.02.2014
*/
public void converteValoresRequestToBean(final Map valores, final Object bean, final String language) throws Exception {
final List<String> metodos = CitAjaxReflexao.findSets(bean);
Object valorAtributo = null;
Class<?>[] classParametro;
Method mtd;
Object retorno;
for (int i = 0; i < metodos.size(); i++) {
valorAtributo = valores.get(metodos.get(i).toUpperCase());
if (valorAtributo == null) {
continue;
}
if (valorAtributo instanceof String && StringUtils.isNotBlank((String) valorAtributo)) {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
try {
if (Integer.class.isAssignableFrom(classParametro[0])) {
retorno = Integer.valueOf((String) valorAtributo);
} else if (Integer[].class.isAssignableFrom(classParametro[0])) {
retorno = new Integer[] {Integer.parseInt((String) valorAtributo)};
} else if (Long.class.isAssignableFrom(classParametro[0])) {
retorno = Long.valueOf((String) valorAtributo);
} else if (String.class.isAssignableFrom(classParametro[0])) {
retorno = UtilStrings.decodeCaracteresEspeciais((String) valorAtributo);
} else if (Short.class.isAssignableFrom(classParametro[0])) {
retorno = Short.valueOf((String) valorAtributo);
} else if (Double.class.isAssignableFrom(classParametro[0])) {
/** Alterado por thyen.chang: substitui os caracteres "," por "." para fazer o parsing */
String valor = ((String) valorAtributo).replaceAll("\\.", "");
valor = valor.replaceAll(",", ".");
retorno = Double.valueOf(valor);
} else if (BigDecimal.class.isAssignableFrom(classParametro[0])) {
/** Alterado por thyen.chang: substitui os caracteres "," por "." para fazer o parsing */
String valor = ((String) valorAtributo).replaceAll("\\.", "");
valor = valor.replaceAll(",", ".");
retorno = new BigDecimal(valor);
} else if (Date.class.isAssignableFrom(classParametro[0])) {
if (valorAtributo == null || ((String) valorAtributo).equalsIgnoreCase("")) {
retorno = null;
} else {
retorno = UtilDatas.strToSQLDate((String) valorAtributo);
}
} else if (Timestamp.class.isAssignableFrom(classParametro[0])) {
retorno = CitAjaxUtil.strToTimestampWithLanguage((String) valorAtributo, language);
} else if (Boolean.class.isAssignableFrom(classParametro[0])) {
retorno = new Boolean((String) valorAtributo);
} else {
/** Adicionado por valdoilo.damasceno */
if (classParametro[0] != null && classParametro[0] == java.sql.Date.class && valorAtributo != null && !((String) valorAtributo).trim().equalsIgnoreCase("")) {
retorno = CitAjaxUtil.strToSqlDateWithLanguage((String) valorAtributo, language);
} else if (classParametro[0] != null && classParametro[0] == java.sql.Timestamp.class && valorAtributo != null
&& !((String) valorAtributo).trim().equalsIgnoreCase("")) {
retorno = CitAjaxUtil.strToTimestampWithLanguage((String) valorAtributo, language);
} else {
retorno = CitAjaxReflexao.converteTipo((String) valorAtributo, classParametro[0]);
}
}
} catch (final Exception e) {
final String message = "Erro ao converter o valor '" + valorAtributo + "' do atributo " + metodos.get(i) + " para " + classParametro[0];
LOGGER.log(Level.SEVERE, message, e);
throw new Exception(message);
}
try {
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), retorno);
} catch (final Exception e) {
final String message = "Erro ao setar o valor '" + valorAtributo + "' no atributo " + metodos.get(i) + " do tipo " + classParametro[0];
LOGGER.log(Level.SEVERE, message, e);
throw new Exception(message);
}
// ELSE IF PARA ARRAY - O QUE VEIO NO REQUEST EH ARRAY!
} else if (valorAtributo instanceof String[]) {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
if (Integer[].class.isAssignableFrom(classParametro[0])) {
final Integer[] arrayInteiros = new Integer[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Integer inteiro = null;
try {
inteiro = new Integer(((String[]) valorAtributo)[j]);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
inteiro = null;
}
arrayInteiros[j] = inteiro;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayInteiros);
} else if (Long[].class.isAssignableFrom(classParametro[0])) {
final Long[] arrayLongos = new Long[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Long longo = null;
try {
longo = new Long(((String[]) valorAtributo)[j]);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
longo = null;
}
arrayLongos[j] = longo;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayLongos);
} else if (String[].class.isAssignableFrom(classParametro[0])) {
final String[] strAux = (String[]) valorAtributo;
if (strAux != null) {
for (int iAux = 0; iAux < strAux.length; iAux++) {
strAux[iAux] = UtilStrings.decodeCaracteresEspeciais(strAux[iAux]);
}
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), strAux);
} else if (Short[].class.isAssignableFrom(classParametro[0])) {
final Short[] arrayShorts = new Short[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Short curto;
curto = new Short(((String[]) valorAtributo)[j]);
arrayShorts[j] = curto;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayShorts);
} else if (Double[].class.isAssignableFrom(classParametro[0])) {
final Double[] arrayDuplo = new Double[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Double duplo;
String aux = ((String[]) valorAtributo)[j];
aux = aux.replaceAll("\\.", "");
aux = aux.replaceAll("\\,", "\\.");
if (aux == null || aux.equalsIgnoreCase("")) {
duplo = null;
} else {
try {
duplo = new Double(Double.parseDouble(aux));
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
duplo = null;
}
}
arrayDuplo[j] = duplo;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayDuplo);
} else if (BigDecimal[].class.isAssignableFrom(classParametro[0])) {
final BigDecimal[] arrayBigDec = new BigDecimal[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
BigDecimal bigDec = null;
String aux = ((String[]) valorAtributo)[j];
aux = aux.replaceAll("\\.", "");
aux = aux.replaceAll("\\,", "\\.");
try {
bigDec = new BigDecimal(Double.parseDouble(aux));
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
bigDec = null;
}
arrayBigDec[j] = bigDec;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayBigDec);
} else if (Date[].class.isAssignableFrom(classParametro[0])) {
final Date[] arrayData = new Date[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Date data = null;
try {
data = new Date(UtilDatas.strToSQLDate(((String[]) valorAtributo)[j]).getTime());
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
data = null;
}
arrayData[j] = data;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayData);
} else if (Timestamp[].class.isAssignableFrom(classParametro[0])) {
final Timestamp[] arrayData = new Timestamp[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Timestamp data = null;
try {
data = new Timestamp(UtilDatas.strToSQLDate(((String[]) valorAtributo)[j]).getTime());
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
data = null;
}
arrayData[j] = data;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayData);
} else if (Boolean[].class.isAssignableFrom(classParametro[0])) {
final Boolean[] arrayBool = new Boolean[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Boolean bool;
bool = new Boolean(((String[]) valorAtributo)[j]);
arrayBool[j] = bool;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayBool);
}
// ELSE
} else {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
if (classParametro[0].isInstance(valorAtributo)) {
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), valorAtributo);
}
}
}
}
public Collection converteValoresRequestToInternalBean(final Map valores, final Class<?> classe, final String nomeInternalBean) throws Exception {
Object beanGetMethodList = null;
try {
beanGetMethodList = classe.newInstance();
} catch (final InstantiationException | IllegalAccessException e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
if (beanGetMethodList == null) {
return null;
}
final List<String> metodos = CitAjaxReflexao.findSets(beanGetMethodList);
Object valorAtributo = null;
Class<?>[] classParametro;
Method mtd;
Object retorno;
final Collection<Object> col = new ArrayList<>();
final String str = (String) valores.get(nomeInternalBean.toUpperCase() + "_ULTIMO_SEQUENCIAL_HIDDEN");
int iQtde = 0;
if (str != null && !str.equalsIgnoreCase("")) {
iQtde = Integer.parseInt(str);
}
for (int x = 0; x <= iQtde; x++) {
Object bean = null;
try {
bean = classe.newInstance();
} catch (final InstantiationException | IllegalAccessException e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
}
if (bean == null) {
continue;
}
boolean somenteNulos = true;
for (int i = 0; i < metodos.size(); i++) {
valorAtributo = valores.get(nomeInternalBean.toUpperCase() + "." + metodos.get(i).toUpperCase() + "." + x);
if (valorAtributo == null) {
continue;
}
somenteNulos = false;
if (valorAtributo instanceof String) {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
try {
if (Integer[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE INTEIROS
retorno = new Integer[] {new Integer((String) valorAtributo)};
} else if (Long[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE LONGOS
retorno = new Long[] {new Long((String) valorAtributo)};
} else if (String[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE STRINGS
retorno = new String[] {new String(UtilStrings.decodeCaracteresEspeciais((String) valorAtributo))};
} else if (Short[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE SHORTS
retorno = new Short[] {new Short((String) valorAtributo)};
} else if (Double[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE DOUBLES
String aux = (String) valorAtributo;
aux = aux.replaceAll("\\,", "\\.");
Double duplo = null;
try {
duplo = new Double(Double.parseDouble(aux));
retorno = new Double[] {new Double(duplo.doubleValue())};
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
duplo = null;
retorno = new Double[] {null};
}
} else if (BigDecimal[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE BIGDECIMAL
String aux = (String) valorAtributo;
aux = aux.replaceAll("\\,", "\\.");
BigDecimal big = null;
try {
big = new BigDecimal(Double.parseDouble(aux));
retorno = new BigDecimal[] {new BigDecimal(big.doubleValue())};
} catch (final Exception e) {
retorno = new BigDecimal[] {null};
}
} else if (Date[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE DATES
Date data = null;
if (valorAtributo == null || ((String) valorAtributo).equalsIgnoreCase("")) {
data = null;
retorno = new Date[] {null};
} else {
data = new Date(UtilDatas.strToSQLDate((String) valorAtributo).getTime());
retorno = new Date[] {new Date(data.getTime())};
}
} else if (Boolean[].class.isAssignableFrom(classParametro[0])) { // ARRAY DE BOOLEANS
retorno = new Boolean[] {new Boolean((String) valorAtributo)};
} else { // NAO EH ARRAY
retorno = CitAjaxReflexao.converteTipo((String) valorAtributo, classParametro[0]);
}
} catch (final Exception e) {
final String message = "Erro ao converter o valor '" + valorAtributo + "' do atributo " + metodos.get(i) + " para " + classParametro[0];
LOGGER.log(Level.SEVERE, message, e);
throw new Exception(message);
}
try {
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), retorno);
} catch (final Exception e) {
final String message = "Erro ao setar o valor '" + valorAtributo + "' no atributo " + metodos.get(i) + " do tipo " + classParametro[0];
LOGGER.log(Level.SEVERE, message, e);
throw new Exception(message);
}
} else if (valorAtributo instanceof String[]) {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
if (Integer[].class.isAssignableFrom(classParametro[0])) {
final Integer[] arrayInteiros = new Integer[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Integer inteiro = null;
try {
inteiro = Integer.valueOf(((String[]) valorAtributo)[j]);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
inteiro = null;
}
arrayInteiros[j] = inteiro;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayInteiros);
} else if (Long[].class.isAssignableFrom(classParametro[0])) {
final Long[] arrayLongos = new Long[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Long longo = null;
try {
longo = Long.valueOf(((String[]) valorAtributo)[j]);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
longo = null;
}
arrayLongos[j] = longo;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayLongos);
} else if (String[].class.isAssignableFrom(classParametro[0])) {
final String[] strAux = (String[]) valorAtributo;
if (strAux != null) {
for (int iAux = 0; iAux < strAux.length; iAux++) {
strAux[iAux] = UtilStrings.decodeCaracteresEspeciais(strAux[iAux]);
}
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), strAux);
} else if (Short[].class.isAssignableFrom(classParametro[0])) {
final Short[] arrayShorts = new Short[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Short curto;
curto = Short.valueOf(((String[]) valorAtributo)[j]);
arrayShorts[j] = curto;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayShorts);
} else if (Double[].class.isAssignableFrom(classParametro[0])) {
final Double[] arrayDuplo = new Double[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Double duplo;
String aux = ((String[]) valorAtributo)[j];
aux = aux.replaceAll("\\,", "\\.");
if (aux == null || aux.equalsIgnoreCase("")) {
duplo = null;
} else {
try {
duplo = Double.valueOf(aux);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
duplo = null;
}
}
arrayDuplo[j] = duplo;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayDuplo);
} else if (BigDecimal[].class.isAssignableFrom(classParametro[0])) {
final BigDecimal[] arrayBigDec = new BigDecimal[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
BigDecimal bigDec = null;
String aux = ((String[]) valorAtributo)[j];
aux = aux.replaceAll("\\,", "\\.");
try {
bigDec = new BigDecimal(aux);
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
bigDec = null;
}
arrayBigDec[j] = bigDec;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayBigDec);
} else if (Date[].class.isAssignableFrom(classParametro[0])) {
final Date[] arrayData = new Date[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Date data = null;
try {
data = new Date(UtilDatas.strToSQLDate(((String[]) valorAtributo)[j]).getTime());
} catch (final Exception e) {
LOGGER.log(Level.WARNING, e.getMessage(), e);
data = null;
}
arrayData[j] = data;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayData);
} else if (Boolean[].class.isAssignableFrom(classParametro[0])) {
final Boolean[] arrayBool = new Boolean[((String[]) valorAtributo).length];
for (int j = 0; j < ((String[]) valorAtributo).length; j++) {
Boolean bool;
bool = Boolean.valueOf(((String[]) valorAtributo)[j]);
arrayBool[j] = bool;
}
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), arrayBool);
}
} else {
mtd = CitAjaxReflexao.getSetter(bean, metodos.get(i));
classParametro = mtd.getParameterTypes();
if (classParametro[0].isInstance(valorAtributo)) {
CitAjaxReflexao.setPropertyValue(bean, mtd.getName().substring(3), valorAtributo);
}
}
}
if (!somenteNulos) {
col.add(bean);
}
}
return col;
}
}