package com.ejie.x38.reports;
import java.io.BufferedWriter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.web.servlet.view.AbstractView;
import com.ejie.x38.dto.JerarquiaDto;
public class CSVReportView extends AbstractView{
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
//Tipo y Nombre Fichero
response.setHeader("Content-type", "application/octet-stream; charset=ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=\"" + model.get("fileName") + ".csv\"");
//Gestión de cookie (determina el final de la generación del fichero)
Cookie cookie = new Cookie("fileDownload", "true");
cookie.setPath("/");
response.addCookie(cookie);
//Token
String token = model.get("separator")!=null?(String)model.get("separator"):";";
//Datos a procesar
ReportData reportData = (ReportData) model.get("reportData");
boolean isJerarquia = reportData.isJerarquia();
boolean isGrouping = reportData.isGrouping();
//Metadatos jerarquia
JerarquiaMetadata jmd = reportData.getJerarquiaMetadada();
//Salida
BufferedWriter writer = new BufferedWriter(response.getWriter());
//Columnas
LinkedHashMap<String, String> dataHeader = (LinkedHashMap<String, String>) reportData.getHeaderNames();
if (reportData.isShowHeaders()){
//Columna para la agrupacion
if (isGrouping){
writer.write(token);
}
//Columna para marcar los elementos que cumplen filtro en Jerarquia
if (isJerarquia && jmd.isShowFiltered()){
if (!"".equals(jmd.getFilterHeaderName())){
writer.write(jmd.getFilterHeaderName());
}
writer.write(token);
}
for (Map.Entry<String, String> entry : dataHeader.entrySet()) {
//Si tiene agrupacion, no debe mostrarse la columna del grupo y es la columna del grupo comprobar => pasar al siguiente
if (isGrouping && !reportData.isShowGroupColumng() && entry.getKey().equals(reportData.getGroupColumnName())){
continue;
}
writer.write(parseValue(entry.getValue(), token));
writer.write(token);
}
writer.newLine();
}
//Datos
List<Object> modelData;
if (!isJerarquia){
modelData = reportData.getModelData();
} else {
modelData = reportData.getModelDataJerarquia();
}
String prevGroupValue="", groupValue = "";
for (Object object : modelData) {
int level = 0;
boolean hasChildren = false;
//Si tiene agrupación => comprobar el cambio de grupo
if (isGrouping){
groupValue = parseValue(BeanUtils.getProperty(((JerarquiaDto)object).getModel(), reportData.getGroupColumnName()), token);
if (!groupValue.equals(prevGroupValue)){
prevGroupValue = groupValue;
writer.write(groupValue);
writer.newLine();
}
writer.write(token); //Espacio para evitar columna agrupación
}
//Si es jerarquia => comprobar si debe mostrar filtro y obtener atributo + parsear objeto de iteracion
if (isJerarquia){
if (jmd.isShowFiltered()){//Mostrar si cumple filtro
if (((JerarquiaDto) object).isFilter()){ //Cumple filtro
writer.write(jmd.getFilterToken());
}
writer.write(token);
}
level = ((JerarquiaDto) object).getLevel();
hasChildren = ((JerarquiaDto) object).isHasChildren();
object = ((JerarquiaDto)object).getModel(); //Obtener objeto de negocio
}
for (Map.Entry<String, String> entry : dataHeader.entrySet()) {
//Si tiene agrupacion, no debe mostrarse la columna del grupo y es la columna del grupo comprobar => pasar al siguiente
if (isGrouping && !reportData.isShowGroupColumng() && entry.getKey().equals(reportData.getGroupColumnName())){
continue;
}
String columnValue = parseValue(BeanUtils.getProperty(object, entry.getKey()), token);
//Si es Jerarquia...
if (isJerarquia){
//Si está activados los iconos y la columna es la indicada => aplicar iconos
if (jmd.isShowIcon() && entry.getKey().equals(jmd.getIconColumnName())){
if (jmd.getIconCollapsedList().contains(BeanUtils.getProperty(object, jmd.getIconBeanAtribute()))){
columnValue = jmd.getIconUnexpanded() + columnValue;
} else {
if (hasChildren){
columnValue = jmd.getIconExpanded() + columnValue;
} else {
columnValue = jmd.getIconNoChild() + columnValue;
}
}
}
//Si está activada la tabulación y la columna es la indicada => aplicar tabulación
if (jmd.isShowTabbed() && entry.getKey().equals(jmd.getTabColumnName())){
columnValue = jmd.getTab(level) + columnValue;
}
}
writer.write(columnValue);
writer.write(token);
}
writer.newLine();
}
//Escribir/cerrar salida
writer.flush();
writer.close();
}
private String parseValue (String value, String token){
//Forzar nulos a vacíos
value = value!=null?value:"";
//Escapar valor que contiene token
if (value.indexOf(token)!=-1){
value = "\"" + value + "\"";
}
return value;
}
}