/**
*
*/
package net.conselldemallorca.helium.core.helper;
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 javax.annotation.Resource;
import net.conselldemallorca.helium.core.common.JbpmVars;
import net.conselldemallorca.helium.core.extern.domini.FilaResultat;
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.Expedient;
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.conselldemallorca.helium.jbpm3.integracio.JbpmTask;
import net.conselldemallorca.helium.v3.core.api.dto.ArxiuDto;
import net.conselldemallorca.helium.v3.core.api.dto.DocumentDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDadaDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTascaDto;
import net.conselldemallorca.helium.v3.core.api.dto.PersonaDto;
import net.conselldemallorca.helium.v3.core.api.dto.PersonaDto.Sexe;
import net.conselldemallorca.helium.v3.core.api.dto.TascaDadaDto;
import net.conselldemallorca.helium.v3.core.api.exception.SistemaExternException;
import net.conselldemallorca.helium.v3.core.repository.AreaJbpmIdRepository;
import net.conselldemallorca.helium.v3.core.repository.AreaRepository;
import net.conselldemallorca.helium.v3.core.repository.CarrecJbpmIdRepository;
import net.conselldemallorca.helium.v3.core.repository.CarrecRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentRepository;
import net.conselldemallorca.helium.v3.core.repository.DocumentStoreRepository;
import net.conselldemallorca.helium.v3.core.repository.DominiRepository;
import net.conselldemallorca.helium.v3.core.repository.EntornRepository;
import net.sf.jooreports.templates.DocumentTemplate;
import net.sf.jooreports.templates.DocumentTemplateException;
import net.sf.jooreports.templates.DocumentTemplateFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
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;
/**
* Helper per a generar documents mitjançant plantilles fetes amb ODT
* i Freemarker.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component("PlantillaHelperV3")
public class PlantillaHelper {
@Resource
private PluginHelper pluginHelper;
@Resource
private DocumentRepository documentRepository;
@Resource
private DocumentStoreRepository documentStoreRepository;
@Resource
private DominiHelper dominiHelper;
@Resource
private EntornRepository entornRepository;
@Resource
private ExpedientHelper expedientHelper;
@Resource
private AreaRepository areaRepository;
@Resource
private AreaJbpmIdRepository areaJbpmIdRepository;
@Resource
private CarrecRepository carrecRepository;
@Resource
private CarrecJbpmIdRepository carrecJbpmIdRepository;
@Resource
private DominiRepository dominiRepository;
@Resource(name="documentHelperV3")
private DocumentHelperV3 documentHelper;
@Resource
private JbpmHelper jbpmhelper;
@Resource
private VariableHelper variableHelper;
@Resource
private TascaHelper tascaHelper;
public ArxiuDto generarDocumentPlantilla(
Expedient expedient,
Document document,
String taskInstanceId,
String processInstanceId,
Date dataDocument) {
try {
deshabilitarLogging();
byte[] contingut = null;
if (document.isPlantilla()) {
// Obtenir tasca, expedient, responsable i omplir el model
ExpedientDto expedientDto;
ExpedientTascaDto tasca = null;
String responsableCodi;
Map<String, Object> model = new HashMap<String, Object>();
afegirDadesProcesAlModel(processInstanceId, model);
if (taskInstanceId != null) {
JbpmTask task = jbpmhelper.getTaskById(taskInstanceId);
expedientDto = expedientHelper.toExpedientDto(expedient);
tasca = tascaHelper.toExpedientTascaDto(
task,
expedient,
true,
false);
afegirDadesTascaAlModel(task, model);
responsableCodi = task.getAssignee();
} else {
expedientDto = expedientHelper.toExpedientDto(expedient);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
responsableCodi = auth.getName();
}
afegirContextAlModel(
responsableCodi,
expedientDto,
tasca,
dataDocument,
model);
afegirFuncionsAlModel(
expedient.getEntorn(),
taskInstanceId,
processInstanceId,
model);
contingut = generarAmbJooReports(
document.getArxiuContingut(),
model);
} else {
contingut = document.getArxiuContingut();
}
return new ArxiuDto(
getArxiuNomPerDocumentGenerat(
expedient,
document),
contingut);
} catch (Exception ex) {
throw SistemaExternException.tractarSistemaExternException(
expedient.getEntorn().getId(),
expedient.getEntorn().getCodi(),
expedient.getEntorn().getNom(),
expedient.getId(),
expedient.getTitol(),
expedient.getNumero(),
expedient.getTipus().getId(),
expedient.getTipus().getCodi(),
expedient.getTipus().getNom(),
"(DOCUMENT PLANTILLA. Error al generar el document)",
ex);
}
}
private void afegirDadesProcesAlModel(
String processInstanceId,
Map<String, Object> model) {
List<ExpedientDadaDto> dades = variableHelper.findDadesPerInstanciaProces(processInstanceId);
for (ExpedientDadaDto dada: dades) {
if (dada.isCampMultiple()) {
if (dada.isCampTipusRegistre()) {
Object[] multipleTexts = new Object[dada.getMultipleDades().size()];
int index = 0;
for (ExpedientDadaDto multipleDada: dada.getMultipleDades()) {
String[] registreTexts = new String[multipleDada.getRegistreDades().size()];
int indexreg = 0;
for (ExpedientDadaDto registreDada: multipleDada.getRegistreDades()) {
registreTexts[indexreg++] = registreDada.getPlantillaText();
}
multipleTexts[index++] = registreTexts;
}
model.put(
dada.getVarCodi(),
multipleTexts);
} else {
String[] multipleTexts = new String[dada.getMultipleDades().size()];
int index = 0;
for (ExpedientDadaDto multipleDada: dada.getMultipleDades()) {
multipleTexts[index++] = multipleDada.getPlantillaText();
}
model.put(
dada.getVarCodi(),
multipleTexts);
}
} else if (dada.isCampTipusRegistre()) {
String[] registreTexts = new String[dada.getRegistreDades().size()];
int index = 0;
for (ExpedientDadaDto registreDada: dada.getRegistreDades()) {
registreTexts[index++] = registreDada.getPlantillaText();
}
model.put(
dada.getVarCodi(),
new Object[] {registreTexts});
} else {
model.put(
dada.getVarCodi(),
dada.getPlantillaText());
}
}
}
private void afegirDadesTascaAlModel(
JbpmTask task,
Map<String, Object> model) {
List<TascaDadaDto> dades = variableHelper.findDadesPerInstanciaTasca(task);
for (TascaDadaDto dada: dades) {
if (dada.isCampMultiple()) {
if (dada.isCampTipusRegistre()) {
Object[] multipleTexts = new Object[dada.getMultipleDades().size()];
int index = 0;
for (TascaDadaDto multipleDada: dada.getMultipleDades()) {
String[] registreTexts = new String[multipleDada.getRegistreDades().size()];
int indexreg = 0;
for (TascaDadaDto registreDada: multipleDada.getRegistreDades()) {
registreTexts[indexreg++] = registreDada.getPlantillaText();
}
multipleTexts[index++] = registreTexts;
}
model.put(
dada.getVarCodi(),
multipleTexts);
} else {
String[] multipleTexts = new String[dada.getMultipleDades().size()];
int index = 0;
for (TascaDadaDto multipleDada: dada.getMultipleDades()) {
multipleTexts[index++] = multipleDada.getPlantillaText();
}
model.put(
dada.getVarCodi(),
multipleTexts);
}
} else if (dada.isCampTipusRegistre()) {
String[] registreTexts = new String[dada.getRegistreDades().size()];
int index = 0;
for (TascaDadaDto registreDada: dada.getRegistreDades()) {
registreTexts[index++] = registreDada.getPlantillaText();
}
model.put(
dada.getVarCodi(),
new Object[] {registreTexts});
} else {
model.put(
dada.getVarCodi(),
dada.getPlantillaText());
}
}
}
private void afegirContextAlModel(
String responsableCodi,
ExpedientDto expedient,
ExpedientTascaDto tasca,
Date dataDocument,
Map<String, Object> model) {
Map<String, Object> context = new HashMap<String, Object>();
context.put("responsable", pluginHelper.personaFindAmbCodi(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 Entorn entorn,
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 = pluginHelper.personaFindAmbCodi(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 = areaRepository.findByEntornAndCodi(entorn, codi);
if (area == null)
area = new Area("???", "???", new Entorn());
return new BeanModel(
area,
new DefaultObjectWrapper());
} else {
AreaJbpmId area = areaJbpmIdRepository.findByCodi(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 = carrecRepository.findByEntornAndCodi(entorn, carrecCodi);
if (carrec == null)
carrec = new Carrec("???", "???", "???", "???", "???", new Entorn());
return new BeanModel(
carrec,
new DefaultObjectWrapper());
}
} else {
CarrecJbpmId carrec = null;
if (args.size() == 1) {
carrec = carrecJbpmIdRepository.findByCodi(carrecCodi);
} else {
Object arg1 = args.get(1);
String areaCodi = (String)arg1;
carrec = carrecJbpmIdRepository.findByCodiAndGrup(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 = carrecRepository.findByEntornAndAreaAndCodi(
entorn,
areaRepository.findByEntornAndCodi(entorn, codiArea),
codiCarrec);
if (carrec != null) {
if (carrec.getPersonaCodi() != null) {
PersonaDto persona = pluginHelper.personaFindAmbCodi(carrec.getPersonaCodi());
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
} else {
List<String> personaCodi = carrecJbpmIdRepository.findPersonaCodiByGrupCodiAndCarrecCodi(
codiArea,
codiCarrec);
if (personaCodi != null && !personaCodi.isEmpty()) {
PersonaDto persona = pluginHelper.personaFindAmbCodi(personaCodi.get(0));
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 = areaRepository.findByEntornAndCodi(entorn, 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 = carrecJbpmIdRepository.findCarrecsCodiByPersonaCodiAndGrupCodi(
codiPersona,
codiArea);
if (carrecCodis != null && carrecCodis.size() > 0) {
CarrecJbpmId[] array = new CarrecJbpmId[carrecCodis.size()];
for (int i = 0; i < carrecCodis.size(); i++) {
CarrecJbpmId carrec = carrecJbpmIdRepository.findByCodiAndGrup(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 = carrecRepository.findByEntornAndCodi(entorn, codi);
if (carrec != null) {
if (carrec.getPersonaCodi() != null) {
PersonaDto persona = pluginHelper.personaFindAmbCodi(carrec.getPersonaCodi());
return new BeanModel(
persona,
new DefaultObjectWrapper());
}
}
} else {
CarrecJbpmId carrec = carrecJbpmIdRepository.findByCodi(codi);
if (carrec != null) {
List<String> persones = carrecJbpmIdRepository.findPersonesCodiByCarrecCodi(codi);
if (persones != null && persones.size() > 0) {
PersonaDto persona = pluginHelper.personaFindAmbCodi(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 = dominiRepository.findByEntornAndCodi(
entorn,
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 = documentStoreRepository.findByProcessInstanceId(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 = documentStoreRepository.findByProcessInstanceId(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 byte[] generarAmbJooReports(
byte[] plantillaContingut,
Map<String, Object> model) throws IOException, DocumentTemplateException {
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(plantillaContingut));
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();
}
private void deshabilitarLogging() throws ClassNotFoundException {
Logger.selectLoggerLibrary(Logger.LIBRARY_NONE);
}
private boolean esIdentitySourceHelium() {
String identitySource = GlobalProperties.getInstance().getProperty("app.jbpm.identity.source");
return (identitySource.equalsIgnoreCase("helium"));
}
private String getArxiuNomPerDocumentGenerat(
Expedient expedient,
Document document) {
String numExpedient = "";
if (expedient.getNumero() != null) {
numExpedient = expedient.getNumero() + "_";
}
String titol = numExpedient + document.getNom() + ".odt";
String carRemp = "\\/:*?\"<>|";
titol.replaceAll(carRemp, "_");
return titol;
}
}