package br.com.centralit.citajax.framework; import java.lang.reflect.Method; import java.util.Collection; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.com.centralit.citajax.reflexao.CitAjaxReflexao; import br.com.centralit.citajax.util.CitAjaxWebUtil; import br.com.citframework.util.Constantes; import br.com.citframework.util.UtilStrings; @SuppressWarnings({"rawtypes"}) public class CITFacadeProcess { public static final String CARACTER_SEPARADOR = "\5"; /** * 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; String parmCount = "0"; Class classe = null; if ("load".equalsIgnoreCase(ext)) { classe = AjaxProcessLoad.class; metodo = "execute"; parmCount = "1"; request.setAttribute("parm1", facadeName); } else if ("save".equalsIgnoreCase(ext)) { classe = AjaxProcessEvent.class; metodo = "execute"; parmCount = "3"; request.setAttribute("parm1", facadeName); request.setAttribute("parm2", facadeName); request.setAttribute("parm3", "save"); } else if ("restore".equalsIgnoreCase(ext)) { classe = AjaxProcessEvent.class; metodo = "execute"; parmCount = "3"; request.setAttribute("parm1", facadeName); request.setAttribute("parm2", facadeName); request.setAttribute("parm3", "restore"); } else if ("event".equalsIgnoreCase(ext)) { classe = AjaxProcessEvent.class; metodo = "execute"; parmCount = "3"; request.setAttribute("parm1", facadeName); request.setAttribute("parm2", facadeName); request.setAttribute("parm3", "event"); } else { boolean bTentarLocalizarForm = true; int iCodigoTentativa = 1; while (bTentarLocalizarForm) { try { if (iCodigoTentativa == 1) { classe = Class.forName(Constantes.getValue("FRAMEWORK_LOCATION_FACADE") + "." + facadeName); } else { if (Constantes.getValue("FRAMEWORK_LOCATION_FACADE" + iCodigoTentativa) == null) { classe = null; bTentarLocalizarForm = false; break; } classe = Class.forName(Constantes.getValue("FRAMEWORK_LOCATION_FACADE" + iCodigoTentativa) + "." + facadeName); } } catch (final ClassNotFoundException e) { iCodigoTentativa++; } } if (classe == null) { System.out.println("Classe: " + facadeName); return null; } metodo = request.getParameter("method"); parmCount = request.getParameter("parmCount"); } if (classe != null) { final Object objeto = classe.newInstance(); if (parmCount == null) { parmCount = "0"; } int iParmCount = 0; iParmCount = Integer.parseInt(parmCount); Object parmReals[] = null; final Method mtd = CitAjaxReflexao.findMethod(metodo, objeto); if (iParmCount > 0) { final String parms[] = new String[iParmCount]; for (int i = 1; i <= iParmCount; i++) { try { parms[i - 1] = null; parms[i - 1] = request.getParameter("parm" + i); } catch (final Exception e) { // TODO: handle exception // n�o � para printar pois este tratamento � para o jboss7 } if (parms[i - 1] == null) { parms[i - 1] = (String) request.getAttribute("parm" + i); } } 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); if (retorno instanceof Collection) { return CitAjaxWebUtil.serializeObjects((Collection) retorno, true, CitAjaxWebUtil.getLanguage(request)); } else if (retorno instanceof String) { return (String) retorno; } else if (retorno instanceof Integer) { final Integer retornoInteger = (Integer) retorno; return retornoInteger.toString(); } else if (retorno instanceof Long) { final Long retornoLong = (Long) retorno; return retornoLong.toString(); } else if (retorno instanceof Double) { final Double retornoDouble = (Double) retorno; return retornoDouble.toString(); } else if (retorno instanceof Float) { final Float retornoFloat = (Float) retorno; return retornoFloat.toString(); } return CitAjaxWebUtil.serializeObject(retorno, true, CitAjaxWebUtil.getLanguage(request)); } return null; } 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; } }