package br.com.centralit.citcorpore.metainfo.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import br.com.centralit.citajax.reflexao.CitAjaxReflexao;
import br.com.citframework.util.UtilStrings;
public class ServletDinamic extends HttpServlet {
private static final long serialVersionUID = -8097455253987831315L;
private static final Logger LOGGER = Logger.getLogger(ServletDinamic.class);
/**
* Processa as requisicoes.
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void processRequest(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
final String pathInfo = request.getRequestURI();
String ext = "";
try {
if (pathInfo != null) {
// Executa um acao
ext = this.getObjectExt(pathInfo);
ext = ext.replaceAll("#", ""); // Evita problemas com href="#"
// Operacoes de CRUD - Manipulacao de dados
if ("extern".equalsIgnoreCase(ext)) {
final String className = request.getParameter("className").replaceAll(".class", "");
final Class<?> classe = Class.forName(className);
final Object objeto = classe.newInstance();
final Method mtd = CitAjaxReflexao.findMethod("execute", objeto);
final Object parmReals[] = new Object[2];
parmReals[0] = request;
parmReals[1] = response;
final Map<String, Object> map = this.getValuesFromRequest(request);
this.debugValuesFromRequest(map);
mtd.invoke(objeto, parmReals);
return;
}
}
} catch (final Exception e) {
try {
final PrintWriter out = response.getWriter();
e.printStackTrace(out);
} catch (final Exception eX) {
LOGGER.warn(eX.getMessage(), eX);
}
LOGGER.error(e.getMessage(), e);
response.setContentType("text/html; charset=UTF-8");
}
}
@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
this.processRequest(request, response);
}
@Override
protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
this.processRequest(request, response);
}
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;
}
public Map<String, Object> getValuesFromRequest(final HttpServletRequest req) {
final Enumeration<String> en = req.getParameterNames();
String[] strValores;
final Map<String, Object> formFields = new HashMap<>();
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;
}
private void debugValuesFromRequest(final Map<String, Object> hashValores) {
final Set<Entry<String, Object>> set = hashValores.entrySet();
final Iterator<Entry<String, Object>> i = set.iterator();
LOGGER.debug("------- ServletDinamic ------ VALORES DO REQUEST: -------");
while (i.hasNext()) {
final Entry<String, Object> me = i.next();
LOGGER.debug("-------------> [" + me.getKey() + "]: [" + me.getValue() + "]");
}
}
}