/**
*
*/
package net.conselldemallorca.helium.core.model.service;
import java.util.Date;
import java.util.List;
import net.conselldemallorca.helium.core.model.dao.EnumeracioDao;
import net.conselldemallorca.helium.core.model.dao.PermisDao;
import net.conselldemallorca.helium.core.model.dao.PersonaDao;
import net.conselldemallorca.helium.core.model.dao.UsuariDao;
import net.conselldemallorca.helium.core.model.dao.VersioDao;
import net.conselldemallorca.helium.core.model.hibernate.Enumeracio;
import net.conselldemallorca.helium.core.model.hibernate.EnumeracioValors;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
import net.conselldemallorca.helium.core.model.hibernate.MapeigSistra;
import net.conselldemallorca.helium.core.model.hibernate.Permis;
import net.conselldemallorca.helium.core.model.hibernate.Persona;
import net.conselldemallorca.helium.core.model.hibernate.Usuari;
import net.conselldemallorca.helium.core.model.update.Versio;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.stereotype.Service;
/**
* Servei per gestionar la inicialització del sistema i les
* actualitzacions automàtiques
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class UpdateService {
public static final String VERSIO_210_STR = "2.1.0";
public static final int VERSIO_210_ORDRE = 210;
public static final String VERSIO_220_STR = "2.2.0";
public static final int VERSIO_220_ORDRE = 220;
public static final String VERSIO_221_STR = "2.2.1";
public static final int VERSIO_221_ORDRE = 221;
public static final String VERSIO_230_STR = "2.3.0";
public static final int VERSIO_230_ORDRE = 230;
public static final String VERSIO_240_STR = "2.4.0";
public static final int VERSIO_240_ORDRE = 240;
public static final String VERSIO_250_STR = "2.5.0";
public static final int VERSIO_250_ORDRE = 250;
public static final String VERSIO_260_STR = "2.6.0";
public static final int VERSIO_260_ORDRE = 260;
public static final String VERSIO_300_STR = "3.0.0";
public static final int VERSIO_300_ORDRE = 300;
public static final String VERSIO_310_STR = "3.1.0";
public static final int VERSIO_310_ORDRE = 310;
public static final String VERSIO_ACTUAL_STR = "3.1.0";
public static final int VERSIO_ACTUAL_ORDRE = 310;
public static final int VERSIO_ACTUAL_RELEASE = 36;
private VersioDao versioDao;
private PersonaDao personaDao;
private UsuariDao usuariDao;
private PermisDao permisDao;
private EnumeracioDao enumeracioDao;
private DissenyService dissenyService;
private MessageSource messageSource;
private String errorUpdate;
public void updateToLastVersion() throws Exception {
List<Versio> versions = versioDao.findAllOrdered();
if (versions.size() == 0) {
logger.info("Actualitzant la base de dades a la versió inicial");
createInitialData();
}
for (Versio versio: versions) {
if (!versio.isProcesExecutat()) {
if (versio.getOrdre() == VERSIO_210_ORDRE) {
boolean actualitzat = actualitzarV210();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_220_ORDRE) {
boolean actualitzat = actualitzarV220();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_221_ORDRE) {
boolean actualitzat = actualitzarV221();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_230_ORDRE) {
boolean actualitzat = actualitzarV230();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_240_ORDRE) {
boolean actualitzat = actualitzarV240();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_250_ORDRE) {
boolean actualitzat = actualitzarV250();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_260_ORDRE) {
boolean actualitzat = actualitzarV260();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_300_ORDRE) {
boolean actualitzat = actualitzarV300();
if (!actualitzat) break;
}
if (versio.getOrdre() == VERSIO_310_ORDRE) {
boolean actualitzat = actualitzarV310();
if (!actualitzat) break;
}
}
}
Versio darrera = versioDao.findLast();
boolean actualitzat = true;
if (actualitzat && darrera.getOrdre() < 210) {
actualitzat = actualitzarV210();
}
if (actualitzat && darrera.getOrdre() < 220) {
actualitzat = actualitzarV220();
}
if (actualitzat && darrera.getOrdre() < 221) {
actualitzat = actualitzarV221();
}
if (actualitzat && darrera.getOrdre() < 230) {
actualitzarV230();
}
if (actualitzat && darrera.getOrdre() < 240) {
actualitzarV240();
}
if (actualitzat && darrera.getOrdre() < 250) {
actualitzarV250();
}
if (actualitzat && darrera.getOrdre() < 260) {
actualitzarV260();
}
if (actualitzat && darrera.getOrdre() < 300) {
actualitzarV300();
}
if (actualitzat && darrera.getOrdre() < 310) {
actualitzarV310();
}
}
public String getVersioActual() {
int numPunts = StringUtils.countMatches(VERSIO_ACTUAL_STR, ".");
if (numPunts > 1) {
String versioSenseRelease = VERSIO_ACTUAL_STR.substring(
0,
VERSIO_ACTUAL_STR.lastIndexOf("."));
return versioSenseRelease + "." + VERSIO_ACTUAL_RELEASE;
} else {
return VERSIO_ACTUAL_STR;
}
}
public String getErrorUpdate() {
return errorUpdate;
}
@Autowired
public void setVersioDao(VersioDao versioDao) {
this.versioDao = versioDao;
}
@Autowired
public void setPersonaDao(PersonaDao personaDao) {
this.personaDao = personaDao;
}
@Autowired
public void setUsuariDao(UsuariDao usuariDao) {
this.usuariDao = usuariDao;
}
@Autowired
public void setPermisDao(PermisDao permisDao) {
this.permisDao = permisDao;
}
@Autowired
public void setEnumeracioDao(EnumeracioDao enumeracioDao) {
this.enumeracioDao = enumeracioDao;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Autowired
public void setDissenyService(DissenyService dissenyService) {
this.dissenyService = dissenyService;
}
/*---------- ACTUALITZACIÓ INICIAL -----------------------------------------------*/
private void createInitialData() throws Exception {
Permis permisAdmin = new Permis(
"HEL_ADMIN",
"Administrador");
permisDao.saveOrUpdate(permisAdmin);
Permis permisUser = new Permis(
"HEL_USER",
"Usuari");
permisDao.saveOrUpdate(permisUser);
Usuari usuariAdmin = new Usuari(
"admin",
"admin",
true);
usuariAdmin.addPermis(permisAdmin);
usuariDao.saveOrUpdate(usuariAdmin);
usuariDao.canviContrasenya("admin", "admin");
Persona personaAdmin = new Persona(
"admin",
"Usuari",
"Administrador",
"admin@helium.org");
personaDao.saveOrUpdate(personaAdmin);
Versio versioInicial = new Versio(
"inicial",
0);
versioInicial.setProcesExecutat(true);
versioInicial.setDataExecucioProces(new Date());
versioInicial.setScriptExecutat(true);
versioInicial.setDataExecucioScript(new Date());
versioDao.saveOrUpdate(versioInicial);
}
/*---------- ACTUALITZACIÓ V. 2.1.0 -----------------------------------------------*/
private boolean actualitzarV210() {
boolean actualitzat = false;
Versio versio210 = obtenirOCrearVersio(VERSIO_210_STR, VERSIO_210_ORDRE);
if (!versio210.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_210_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio210.isProcesExecutat()) {
try {
canviarMapeigSistraV210();
canviarMapeigEnumeracionsV210();
versio210.setProcesExecutat(true);
versio210.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio210);
logger.info("Actualització a la versió " + VERSIO_210_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_210_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_210_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
private void canviarMapeigSistraV210() throws Exception {
if (dissenyService.findMapeigSistraTots().size() == 0) {
List<ExpedientTipus> expedientsTipus = dissenyService.findExpedientTipusTots();
for (ExpedientTipus expedientTipus : expedientsTipus) {
if (expedientTipus.getSistraTramitMapeigCamps() != null) {
String[] parts = expedientTipus.getSistraTramitMapeigCamps().split(";");
for (int i = 0; i < parts.length; i++) {
String[] parella = parts[i].split(":");
if (parella.length > 1) {
String varSistra = parella[0];
String varHelium = parella[1];
if (varHelium != null && (!"".equalsIgnoreCase(varHelium))) {
if (dissenyService.findMapeigSistraAmbExpedientTipusICodi(expedientTipus.getId(), varHelium) == null) {
dissenyService.createMapeigSistra(varHelium, varSistra, MapeigSistra.TipusMapeig.Variable, expedientTipus);
}
}
}
}
}
if (expedientTipus.getSistraTramitMapeigDocuments() != null) {
String[] parts = expedientTipus.getSistraTramitMapeigDocuments().split(";");
for (int i = 0; i < parts.length; i++) {
String[] parella = parts[i].split(":");
if (parella.length > 1) {
String varSistra = parella[0];
String varHelium = parella[1];
if (varHelium != null && (!"".equalsIgnoreCase(varHelium))) {
if (dissenyService.findMapeigSistraAmbExpedientTipusICodi(expedientTipus.getId(), varHelium) == null) {
dissenyService.createMapeigSistra(varHelium, varSistra, MapeigSistra.TipusMapeig.Document, expedientTipus);
}
}
}
}
}
if (expedientTipus.getSistraTramitMapeigAdjunts() != null) {
String[] parts = expedientTipus.getSistraTramitMapeigAdjunts().split(";");
for (int i = 0; i < parts.length; i++) {
String varSistra = parts[i];
if (varSistra != null && (!"".equalsIgnoreCase(varSistra))) {
if (dissenyService.findMapeigSistraAmbExpedientTipusICodi(expedientTipus.getId(), varSistra) == null) {
dissenyService.createMapeigSistra(varSistra, varSistra, MapeigSistra.TipusMapeig.Adjunt, expedientTipus);
}
}
}
}
}
}
}
private void canviarMapeigEnumeracionsV210() throws Exception {
List<Enumeracio> enumeracions = enumeracioDao.findAll();
if (enumeracions.size() > 0) {
for (Enumeracio enumeracio : enumeracions) {
if ((enumeracio.getValors() != null) && (!enumeracio.getValors().equals(""))) {
List<String[]> valors = enumeracio.getLlistaValors();
for (String[] parella : valors) {
EnumeracioValors enumeracioValors = new EnumeracioValors();
enumeracioValors.setCodi(parella[0]);
enumeracioValors.setNom((String)parella[0]);
enumeracioValors.setEnumeracio(enumeracio);
dissenyService.createEnumeracioValors(enumeracioValors);
}
}
}
}
}
/*---------- ACTUALITZACIÓ V. 2.2.0 -----------------------------------------------*/
private boolean actualitzarV220() {
boolean actualitzat = false;
Versio versio220 = obtenirOCrearVersio(VERSIO_220_STR, VERSIO_220_ORDRE);
if (!versio220.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_220_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio220.isProcesExecutat()) {
try {
versio220.setProcesExecutat(true);
versio220.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio220);
logger.info("Actualització a la versió " + VERSIO_220_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_220_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_220_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 2.2.1 -----------------------------------------------*/
private boolean actualitzarV221() {
boolean actualitzat = false;
Versio versio221 = obtenirOCrearVersio(VERSIO_221_STR, VERSIO_221_ORDRE);
if (!versio221.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_221_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio221.isProcesExecutat()) {
try {
actualitzarOrdreValorsEnumeracionsV221();
versio221.setProcesExecutat(true);
versio221.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio221);
logger.info("Actualització a la versió " + VERSIO_221_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_221_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_221_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
private void actualitzarOrdreValorsEnumeracionsV221() {
List<Enumeracio> enumeracions = enumeracioDao.findAll();
for (Enumeracio enumeracio: enumeracions) {
int i = 0;
for (EnumeracioValors valor: enumeracio.getEnumeracioValors()) {
valor.setOrdre(i++);
}
}
}
/*---------- ACTUALITZACIÓ V. 2.3.0 -----------------------------------------------*/
private boolean actualitzarV230() {
boolean actualitzat = false;
Versio versio230 = obtenirOCrearVersio(VERSIO_230_STR, VERSIO_230_ORDRE);
if (!versio230.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_230_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio230.isProcesExecutat()) {
try {
versio230.setProcesExecutat(true);
versio230.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio230);
logger.info("Actualització a la versió " + VERSIO_230_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_230_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_230_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 2.4.0 -----------------------------------------------*/
private boolean actualitzarV240() {
boolean actualitzat = false;
Versio versio240 = obtenirOCrearVersio(VERSIO_240_STR, VERSIO_240_ORDRE);
if (!versio240.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_240_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio240.isProcesExecutat()) {
try {
versio240.setProcesExecutat(true);
versio240.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio240);
logger.info("Actualització a la versió " + VERSIO_240_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_240_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_240_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 2.5.0 -----------------------------------------------*/
private boolean actualitzarV250() {
boolean actualitzat = false;
Versio versio250 = obtenirOCrearVersio(VERSIO_250_STR, VERSIO_250_ORDRE);
if (!versio250.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_250_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio250.isProcesExecutat()) {
try {
versio250.setProcesExecutat(true);
versio250.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio250);
logger.info("Actualització a la versió " + VERSIO_250_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_250_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_250_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 2.6.0 -----------------------------------------------*/
private boolean actualitzarV260() {
boolean actualitzat = false;
Versio versio260 = obtenirOCrearVersio(VERSIO_260_STR, VERSIO_260_ORDRE);
if (!versio260.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_260_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio260.isProcesExecutat()) {
try {
versio260.setProcesExecutat(true);
versio260.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio260);
logger.info("Actualització a la versió " + VERSIO_260_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_260_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_260_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 3.0.0 -----------------------------------------------*/
private boolean actualitzarV300() {
boolean actualitzat = false;
Versio versio300 = obtenirOCrearVersio(VERSIO_300_STR, VERSIO_300_ORDRE);
if (!versio300.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_300_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio300.isProcesExecutat()) {
try {
versio300.setProcesExecutat(true);
versio300.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio300);
logger.info("Actualització a la versió " + VERSIO_300_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_300_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_300_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
/*---------- ACTUALITZACIÓ V. 3.1.0 -----------------------------------------------*/
private boolean actualitzarV310() {
boolean actualitzat = false;
Versio versio310 = obtenirOCrearVersio(VERSIO_310_STR, VERSIO_310_ORDRE);
if (!versio310.isScriptExecutat()) {
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_310_STR + ": " + getMessage("error.update.script.ko");
} else if (!versio310.isProcesExecutat()) {
try {
versio310.setProcesExecutat(true);
versio310.setDataExecucioProces(new Date());
versioDao.saveOrUpdate(versio310);
logger.info("Actualització a la versió " + VERSIO_310_STR + " realitzada correctament");
actualitzat = true;
} catch (Exception ex) {
logger.error("Error al executar l'actualització a la versió " + VERSIO_310_STR, ex);
errorUpdate = getMessage("error.update.actualitzar.versio") + " " + VERSIO_310_STR + ": " + getMessage("error.update.proces.ko");
}
}
return actualitzat;
}
private String getMessage(String key, Object[] vars) {
try {
return messageSource.getMessage(
key,
vars,
null);
} catch (NoSuchMessageException ex) {
return "???" + key + "???";
}
}
private String getMessage(String key) {
return getMessage(key, null);
}
private Versio obtenirOCrearVersio(String codi, Integer ordre) {
Versio versio = versioDao.findAmbCodi(codi);
if (versio == null) {
versio = new Versio(codi, ordre);
versioDao.saveOrUpdate(versio);
}
return versio;
}
private static final Log logger = LogFactory.getLog(UpdateService.class);
}