/**
*
*/
package net.conselldemallorca.helium.core.model.dao;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Writer;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import freemarker.core.Environment;
import freemarker.core.NonStringException;
import freemarker.ext.beans.ArrayModel;
import freemarker.ext.beans.BeanModel;
import freemarker.ext.beans.BooleanModel;
import freemarker.ext.beans.DateModel;
import freemarker.ext.beans.NumberModel;
import freemarker.log.Logger;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import net.conselldemallorca.helium.core.common.JbpmVars;
import net.conselldemallorca.helium.core.extern.domini.FilaResultat;
import net.conselldemallorca.helium.core.helper.DominiHelper;
import net.conselldemallorca.helium.core.helperv26.DocumentHelper;
import net.conselldemallorca.helium.core.model.dto.DocumentDto;
import net.conselldemallorca.helium.core.model.dto.ExpedientDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto.Sexe;
import net.conselldemallorca.helium.core.model.dto.TascaDto;
import net.conselldemallorca.helium.core.model.hibernate.Area;
import net.conselldemallorca.helium.core.model.hibernate.AreaJbpmId;
import net.conselldemallorca.helium.core.model.hibernate.Carrec;
import net.conselldemallorca.helium.core.model.hibernate.CarrecJbpmId;
import net.conselldemallorca.helium.core.model.hibernate.Document;
import net.conselldemallorca.helium.core.model.hibernate.DocumentStore;
import net.conselldemallorca.helium.core.model.hibernate.Domini;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.Persona;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.core.util.NombreEnCastella;
import net.conselldemallorca.helium.core.util.NombreEnCatala;
import net.conselldemallorca.helium.jbpm3.integracio.DominiCodiDescripcio;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.sf.jooreports.templates.DocumentTemplate;
import net.sf.jooreports.templates.DocumentTemplateFactory;
/**
* Dao per a la generació de plantilles
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component
public class PlantillaDocumentDao {
private PluginPersonaDao pluginPersonaDao;
private CarrecDao carrecDao;
private CarrecJbpmIdDao carrecJbpmIdDao;
private AreaDao areaDao;
private AreaJbpmIdDao areaJbpmIdDao;
private JbpmHelper jbpmHelper;
private DominiDao dominiDao;
private DominiHelper dominiHelper;
private DocumentStoreDao documentStoreDao;
private DocumentHelper documentHelper;
public byte[] generarDocumentAmbPlantilla(
Long entornId,
Document document,
String responsableCodi,
ExpedientDto expedient,
String processInstanceId,
TascaDto tasca,
Date dataDocument,
Map<String, Object> model) throws Exception {
deshabilitarLogging();
afegirContextAlModel(
responsableCodi,
expedient,
tasca,
dataDocument,
model);
afegirFuncionsAlModel(
entornId,
(tasca != null) ? tasca.getId() : null,
processInstanceId,
model);
DocumentTemplateFactory documentTemplateFactory = new DocumentTemplateFactory();
documentTemplateFactory.getFreemarkerConfiguration().setTemplateExceptionHandler(new TemplateExceptionHandler() {
public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
try {
if (te instanceof TemplateModelException || te instanceof NonStringException) {
out.write("[exception]");
} else {
out.write("[???]");
}
out.write("<office:annotation><dc:creator>Helium</dc:creator><dc:date>" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()) + "</dc:date><text:p><![CDATA[" + te.getFTLInstructionStack() + "\n" + te.getMessage() + "]]></text:p></office:annotation>");
} catch (IOException e) {
throw new TemplateException("Failed to print error message. Cause: " + e, env);
}
}
});
documentTemplateFactory.getFreemarkerConfiguration().setLocale(new Locale("ca", "ES"));
DocumentTemplate template = documentTemplateFactory.getTemplate(
new ByteArrayInputStream(document.getArxiuContingut()));
ByteArrayOutputStream resultat = new ByteArrayOutputStream();
template.setContentWrapper(new DocumentTemplate.ContentWrapper() {
public String wrapContent(String content) {
return "[#ftl]\n"
+ "[#escape any as any?xml?replace(\"[\\n|\\r|\\r\\n|\\n\\r]\",\"</text:p> <text:p>\")]\n"
+ content
+ "[/#escape]";
}
});
template.createDocument(model, resultat);
return resultat.toByteArray();
}
@Autowired
public void setPluginPersonaDao(PluginPersonaDao pluginPersonaDao) {
this.pluginPersonaDao = pluginPersonaDao;
}
@Autowired
public void setCarrecDao(CarrecDao carrecDao) {
this.carrecDao = carrecDao;
}
@Autowired
public void setCarrecJbpmIdDao(CarrecJbpmIdDao carrecJbpmIdDao) {
this.carrecJbpmIdDao = carrecJbpmIdDao;
}
@Autowired
public void setAreaDao(AreaDao areaDao) {
this.areaDao = areaDao;
}
@Autowired
public void setAreaJbpmIdDao(AreaJbpmIdDao areaJbpmIdDao) {
this.areaJbpmIdDao = areaJbpmIdDao;
}
@Autowired
public void setjbpmHelper(JbpmHelper jbpmHelper) {
this.jbpmHelper = jbpmHelper;
}
@Autowired
public void setDominiDao(DominiDao dominiDao) {
this.dominiDao = dominiDao;
}
@Autowired
public void setDominiHelper(DominiHelper dominiHelper) {
this.dominiHelper = dominiHelper;
}
@Autowired
public void setDocumentStoreDao(DocumentStoreDao documentStoreDao) {
this.documentStoreDao = documentStoreDao;
}
@Autowired
public void setDocumentHelper(DocumentHelper documentHelper) {
this.documentHelper = documentHelper;
}
private void afegirContextAlModel(
String responsableCodi,
ExpedientDto expedient,
TascaDto tasca,
Date dataDocument,
Map<String, Object> model) {
Map<String, Object> context = new HashMap<String, Object>();
context.put("responsable", pluginPersonaDao.findAmbCodiPlugin(responsableCodi));
context.put("expedient", expedient);
context.put("tasca", tasca);
context.put("dataActual", new Date());
context.put("dataDocument", dataDocument);
model.put("context", context);
}
@SuppressWarnings("rawtypes")
private void afegirFuncionsAlModel(
final Long entornId,
final String taskId,
final String processInstanceId,
Map<String, Object> model) {
model.put(
"valor",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 1) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String) {
String codi = (String)arg0;
Object valor = null;
if (taskId != null)
valor = jbpmHelper.getTaskInstanceVariable(taskId, codi);
if (valor == null)
valor = jbpmHelper.getProcessInstanceVariable(processInstanceId, codi);
if (valor == null)
return new SimpleScalar(null);
if (valor instanceof Object[])
return new ArrayModel(valor, new DefaultObjectWrapper());
else if (valor instanceof String)
return new SimpleScalar((String)valor);
else if (valor instanceof Boolean)
return new BooleanModel((Boolean)valor, new DefaultObjectWrapper());
else if (valor instanceof Date)
return new DateModel((Date)valor, new DefaultObjectWrapper());
else if (valor instanceof BigDecimal)
return new NumberModel((BigDecimal)valor, new DefaultObjectWrapper());
else if (valor instanceof DominiCodiDescripcio)
return new SimpleScalar(((DominiCodiDescripcio)valor).getCodi());
else
return new BeanModel(valor, new DefaultObjectWrapper());
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"persona",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 1) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String) {
String codi = (String)arg0;
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(codi);
if (persona == null)
return new BeanModel(
new PersonaDto("???", "???", "???", Sexe.SEXE_HOME),
new DefaultObjectWrapper());
else
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"area",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 1) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String) {
String codi = (String)arg0;
if (esIdentitySourceHelium()) {
Area area = areaDao.findAmbEntornICodi(entornId, codi);
if (area == null)
area = new Area("???", "???", new Entorn());
return new BeanModel(
area,
new DefaultObjectWrapper());
} else {
AreaJbpmId area = areaJbpmIdDao.findAmbCodi(codi);
if (area == null)
area = new AreaJbpmId("???", "???");
return new BeanModel(
area,
new DefaultObjectWrapper());
}
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"carrec",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 1 || args.size() == 2 ) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String) {
String carrecCodi = (String)arg0;
if (esIdentitySourceHelium()) {
if (args.size() == 1) {
Carrec carrec = carrecDao.findAmbEntornICodi(entornId, carrecCodi);
if (carrec == null)
carrec = new Carrec("???", "???", "???", "???", "???", new Entorn());
return new BeanModel(
carrec,
new DefaultObjectWrapper());
}
} else {
CarrecJbpmId carrec = null;
if (args.size() == 1) {
carrec = carrecJbpmIdDao.findAmbCodi(carrecCodi);
} else {
Object arg1 = args.get(1);
String areaCodi = (String)arg1;
carrec = carrecJbpmIdDao.findAmbCodiGrup(carrecCodi, areaCodi);
}
if (carrec == null)
carrec = new CarrecJbpmId("???", "???", "???", "???", "???", Persona.Sexe.SEXE_HOME);
return new BeanModel(
carrec,
new DefaultObjectWrapper());
}
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"personaAmbCarrecArea",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 2) {
Object arg0 = args.get(0);
Object arg1 = args.get(1);
if (arg0 != null && arg0 instanceof String && arg1 != null && arg1 instanceof String) {
String codiCarrec = (String)arg0;
String codiArea = (String)arg1;
if (esIdentitySourceHelium()) {
Carrec carrec = carrecDao.findAmbEntornAreaICodi(
entornId,
codiArea,
codiCarrec);
if (carrec != null) {
if (carrec.getPersonaCodi() != null) {
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(carrec.getPersonaCodi());
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
} else {
String personaCodi = carrecJbpmIdDao.findPersonaAmbGrupICarrec(
codiArea,
codiCarrec);
if (personaCodi != null) {
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(personaCodi);
if (persona != null)
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
return new BeanModel(
new PersonaDto("???", "???", "???", Sexe.SEXE_HOME),
new DefaultObjectWrapper());
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"carrecsAmbPersonaArea",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 2) {
Object arg0 = args.get(0);
Object arg1 = args.get(1);
if (arg0 != null && arg0 instanceof String && arg1 != null && arg1 instanceof String) {
String codiPersona = (String)arg0;
String codiArea = (String)arg1;
if (esIdentitySourceHelium()) {
Area area = areaDao.findAmbEntornICodi(entornId, codiArea);
List<Carrec> carrecs = new ArrayList<Carrec>();
for (Carrec car: area.getCarrecs()) {
if (codiPersona.equals(car.getPersonaCodi()))
carrecs.add(car);
}
if (carrecs.size() > 0) {
Carrec[] array = new Carrec[carrecs.size()];
for (int i = 0; i < carrecs.size(); i++)
array[i] = carrecs.get(i);
return new ArrayModel(
array,
new DefaultObjectWrapper());
} else {
return new ArrayModel(
new Carrec[0],
new DefaultObjectWrapper());
}
} else {
List<String> carrecCodis = carrecJbpmIdDao.findCarrecsCodiAmbPersonaGrup(
codiPersona,
codiArea);
if (carrecCodis != null && carrecCodis.size() > 0) {
CarrecJbpmId[] array = new CarrecJbpmId[carrecCodis.size()];
for (int i = 0; i < carrecCodis.size(); i++) {
CarrecJbpmId carrec = carrecJbpmIdDao.findAmbCodiGrup(carrecCodis.get(i), codiArea);
if (carrec == null)
carrec = new CarrecJbpmId("???", "???", "???", "???", "???", Persona.Sexe.SEXE_HOME);
array[i] = carrec;
}
return new ArrayModel(
array,
new DefaultObjectWrapper());
} else {
return new ArrayModel(
new CarrecJbpmId[0],
new DefaultObjectWrapper());
}
}
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
/* Per suprimir */
model.put(
"personaAmbCarrec",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 1) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String) {
String codi = (String)arg0;
if (esIdentitySourceHelium()) {
Carrec carrec = carrecDao.findAmbEntornICodi(entornId, codi);
if (carrec != null) {
if (carrec.getPersonaCodi() != null) {
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(carrec.getPersonaCodi());
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
} else {
CarrecJbpmId carrec = carrecJbpmIdDao.findAmbCodi(codi);
if (carrec != null) {
List<String> persones = carrecJbpmIdDao.findPersonesAmbCarrecCodi(codi);
if (persones != null && persones.size() > 0) {
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(persones.get(0));
if (persona == null)
persona = new PersonaDto("???", "???", "???", Sexe.SEXE_HOME);
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
}
return new BeanModel(
new PersonaDto("???", "???", "???", Sexe.SEXE_HOME),
new DefaultObjectWrapper());
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"importEnLletres",
new TemplateMethodModelEx() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() == 3) {
Object arg0 = args.get(0); // quantitat
Object arg1 = args.get(1); // moneda
Object arg2 = args.get(2); // idioma
BigDecimal numbd;
if (arg0 instanceof SimpleScalar) {
String strnum = ((SimpleScalar)arg0).getAsString();
BigDecimal b = new BigDecimal(strnum);
numbd = b;
} else {
Number num = ((SimpleNumber)args.get(0)).getAsNumber();
numbd = (BigDecimal)num;
}
String idioma = arg2.toString();
if ("ca".equals(idioma)) {
String moneda = arg1.toString();
int valorMoneda;
if ("EUR".equals(moneda)) {
valorMoneda = NombreEnCatala.MONEDA_EURO;
} else if ("ESP".equals(moneda)) {
valorMoneda = NombreEnCatala.MONEDA_PESETA;
} else if ("USD".equals(moneda)) {
valorMoneda = NombreEnCatala.MONEDA_DOLAR;
} else {
return new SimpleScalar("[Moneda no suportada]");
}
String text = NombreEnCatala.escriurePreu(
numbd,
2,
valorMoneda);
return new SimpleScalar(text);
} else if ("es".equals(idioma)) {
String moneda = arg1.toString();
int valorMoneda;
if ("EUR".equals(moneda)) {
valorMoneda = NombreEnCastella.MONEDA_EURO;
} else if ("ESP".equals(moneda)) {
valorMoneda = NombreEnCastella.MONEDA_PESETA;
} else if ("USD".equals(moneda)) {
valorMoneda = NombreEnCastella.MONEDA_DOLAR;
} else {
return new SimpleScalar("[Moneda no suportada]");
}
String text = NombreEnCastella.escriurePreu(
numbd,
2,
valorMoneda);
return new SimpleScalar(text);
} else {
return new SimpleScalar("[Idioma no suportat]");
}
}
return new SimpleScalar("[Nombre d'arguments incorrecte]");
}
});
model.put(
"consultaDomini",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() >= 1) {
Object arg0 = args.get(0);
String arg1 = "";
if ((arg0 != null) && (arg0 instanceof String)) {
String codi = (String)arg0;
Domini domini = dominiDao.findAmbEntornICodi(entornId, codi);
if (domini != null) {
try {
Map<String, Object> parametres = new HashMap<String, Object>();
if (args.size() > 1) {
arg1 = args.get(1).toString();
if (args.size() > 2) {
int i = 2;
for (int n = 0; n < ((args.size()-2)/2); n++) {
String cod = args.get(i++).toString();
Object val = args.get(i++);
parametres.put(cod, val);
}
}
}
List<FilaResultat> files = dominiHelper.consultar(
domini,
arg1,
parametres);
Object[] resultat = new Object[files.size()];
for (int i = 0; i < resultat.length; i++) {
Object[] columnes = new Object[files.get(i).getColumnes().size()];
for (int j = 0; j < columnes.length; j++) {
Object[] parella = new Object[2];
parella[0] = files.get(i).getColumnes().get(j).getCodi();
parella[1] = files.get(i).getColumnes().get(j).getValor();
columnes[j] = parella;
}
resultat[i] = columnes;
}
return new ArrayModel(
resultat,
new DefaultObjectWrapper());
} catch (Exception e) {
throw new TemplateModelException(e);
}
}
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"documentInfo",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() >= 1) {
Object arg0 = args.get(0);
if ((arg0 != null) && (arg0 instanceof String)) {
String codi = (String)arg0;
List<DocumentStore> documents = documentStoreDao.findAmbProcessInstanceId(processInstanceId);
DocumentDto resposta = null;
for (int i = 0; i < documents.size(); i++) {
if (documents.get(i).getJbpmVariable().equals(JbpmVars.PREFIX_DOCUMENT + codi))
resposta = documentHelper.getDocumentSenseContingut(documents.get(i).getId());
}
return new BeanModel(
resposta,
new DefaultObjectWrapper());
}
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
model.put(
"documentsProces",
new TemplateMethodModel() {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() <= 1) {
String pid = processInstanceId;
if (args.size() == 1) {
Object arg0 = args.get(0);
if (arg0 != null && arg0 instanceof String)
pid = (String)arg0;
}
List<DocumentStore> documents = documentStoreDao.findAmbProcessInstanceId(pid);
DocumentDto[] resposta = new DocumentDto[documents.size()];
for (int i = 0; i < resposta.length; i++) {
resposta[i] = documentHelper.getDocumentSenseContingut(documents.get(i).getId());
}
return new ArrayModel(
resposta,
new DefaultObjectWrapper());
}
return new SimpleScalar("[Arguments incorrectes]");
}
});
}
private void deshabilitarLogging() throws Exception {
Logger.selectLoggerLibrary(Logger.LIBRARY_NONE);
}
private boolean esIdentitySourceHelium() {
String identitySource = GlobalProperties.getInstance().getProperty("app.jbpm.identity.source");
return (identitySource.equalsIgnoreCase("helium"));
}
}