package br.com.centralit.citajax.framework; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.com.centralit.citajax.autocomplete.AutoCompleteReturn; import br.com.centralit.citajax.reflexao.CitAjaxReflexao; import br.com.citframework.util.Constantes; import br.com.citframework.util.UtilStrings; public class CITAutoCompleteProcess { /** * Processa o objeto passado como parametro e retorna uma string javascript * * @param path * @return * @throws Exception */ public String process(final String path, final ServletContext ctx, final HttpServletRequest request, final HttpServletResponse response) throws Exception { String facadeName = this.getObjectName(path); facadeName = UtilStrings.convertePrimeiraLetra(facadeName, "U"); final String ext = this.getObjectExt(path); if (facadeName == null) { return null; } String metodo = null; Class<?> classe = null; if ("complete".equalsIgnoreCase(ext)) { classe = Class.forName(Constantes.getValue("FRAMEWORK_LOCATION_AUTOCOMPLETE") + "." + facadeName); metodo = "process"; } if (classe != null) { final Object objeto = classe.newInstance(); final int iParmCount = 1; Object parmReals[] = null; final Method mtd = CitAjaxReflexao.findMethod(metodo, objeto); final String parms[] = new String[iParmCount]; parms[0] = UtilStrings.decodeCaracteresEspeciais(request.getParameter("parm1")); if (parms[0] == null) { parms[0] = UtilStrings.decodeCaracteresEspeciais((String) request.getAttribute("parm1")); } parmReals = new Object[iParmCount]; final Class<?>[] parmTypes = mtd.getParameterTypes(); for (int i = 0; i < parmTypes.length; i++) { parmReals[i] = CitAjaxReflexao.converteTipo(parms[i], parmTypes[i]); } final Method mtdRequest = CitAjaxReflexao.findMethod("setRequest", objeto); final Method mtdResponse = CitAjaxReflexao.findMethod("setResponse", objeto); mtdRequest.invoke(objeto, new Object[] {request}); mtdResponse.invoke(objeto, new Object[] {response}); final Object retorno = mtd.invoke(objeto, parmReals); String mensagem = request.getParameter("parm2"); if (mensagem == null) { mensagem = (String) request.getAttribute("parm2"); } mensagem = UtilStrings.decodeCaracteresEspeciais(mensagem); String classTextoautocomplete = request.getParameter("parm3"); if (classTextoautocomplete == null) { classTextoautocomplete = (String) request.getAttribute("parm3"); } String funcaoTratarSelecaoDoAutoComplete = request.getParameter("parm4"); if (classTextoautocomplete == null) { funcaoTratarSelecaoDoAutoComplete = (String) request.getAttribute("parm4"); } if (funcaoTratarSelecaoDoAutoComplete == null || funcaoTratarSelecaoDoAutoComplete.trim().equalsIgnoreCase("")) { funcaoTratarSelecaoDoAutoComplete = "selecionaAutoComplete"; } classTextoautocomplete = UtilStrings.decodeCaracteresEspeciais(classTextoautocomplete); return this.trataRespostaAutoComplete(retorno, facadeName, mensagem, classTextoautocomplete, funcaoTratarSelecaoDoAutoComplete); } return null; } public String trataRespostaAutoComplete(final Object retorno, final String facadeName, final String mensagem, final String classTextoautocomplete, final String funcaoTratarSelecaoDoAutoComplete) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { if (retorno == null) { return ""; } final AutoCompleteReturn ret = (AutoCompleteReturn) retorno; final List<?> lst = ret.getLstRetorno(); if (lst == null || lst.size() == 0) { return ""; } if (ret.getColumnsReturn() == null || ret.getColumnsReturn().length == 0) { return ""; } String strRetorno = ""; for (int i = 0; i < lst.size(); i++) { final Object obj = lst.get(i); final Method mtdId = CitAjaxReflexao.findMethod(ret.getColumnId(), obj); final Object retornoId = mtdId.invoke(obj); final Method mtdDesc = CitAjaxReflexao.findMethod(ret.getColumnDescription(), obj); Object retornoDesc = mtdDesc.invoke(obj); if (retornoDesc instanceof String) { retornoDesc = ((String) retornoDesc).replaceAll("\"", """).replaceAll("'", "´"); } strRetorno += "<tr class='" + classTextoautocomplete + "' style='cursor:pointer' onclick='" + funcaoTratarSelecaoDoAutoComplete + "(\"" + facadeName + "\", " + retornoId + ", \"" + retornoDesc + "\")'>"; for (int j = 0; j < ret.getColumnsReturn().length; j++) { final Method mtd = CitAjaxReflexao.findMethod(ret.getColumnsReturn()[j], obj); if (mtd != null) { strRetorno += "<td>"; final Object retornoProp = mtd.invoke(obj); strRetorno += (String) retornoProp; strRetorno += "</td>"; } } strRetorno += "</tr>"; } String trMsg = ""; if (mensagem != null && !mensagem.trim().equalsIgnoreCase("")) { trMsg = "<tr><td colspan='20'>" + mensagem + "</td></tr>"; } return "<table>" + trMsg + strRetorno + "</table>"; } public String getObjectName(final String path) { String strResult = ""; boolean b = false; for (int i = path.length() - 1; i >= 0; i--) { if (b) { if (path.charAt(i) == '/') { return strResult; } else { strResult = path.charAt(i) + strResult; } } else { if (path.charAt(i) == '.') { b = true; } } } return strResult; } public String getObjectExt(final String path) { String strResult = ""; for (int i = path.length() - 1; i >= 0; i--) { if (path.charAt(i) == '.') { return strResult; } else { strResult = path.charAt(i) + strResult; } } return strResult; } }