diff --git a/remocra/src/main/java/fr/sdis83/remocra/data/CleValeurClasseData.java b/remocra/src/main/java/fr/sdis83/remocra/data/CleValeurClasseData.java new file mode 100644 index 000000000..2508d0ea0 --- /dev/null +++ b/remocra/src/main/java/fr/sdis83/remocra/data/CleValeurClasseData.java @@ -0,0 +1,34 @@ +package fr.sdis83.remocra.data; + +public class CleValeurClasseData { + private final String cle; + private final Object valeur; + private Class clazz = null; + + public String getCle() { + return cle; + } + + public Object getValeur() { + return valeur; + } + + public Class getClazz() { + return clazz; + } + + public CleValeurClasseData(String cle, Object valeur, Class clazz) { + this.cle = cle; + this.valeur = valeur; + this.clazz = clazz; + } + + public CleValeurClasseData(String cle, Object valeur) { + this.cle = cle; + this.valeur = valeur; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } +} diff --git a/remocra/src/main/java/fr/sdis83/remocra/data/ParametreData.java b/remocra/src/main/java/fr/sdis83/remocra/data/ParametreData.java new file mode 100644 index 000000000..3348b9be7 --- /dev/null +++ b/remocra/src/main/java/fr/sdis83/remocra/data/ParametreData.java @@ -0,0 +1,71 @@ +package fr.sdis83.remocra.data; + +import fr.sdis83.remocra.db.model.remocra.enums.TypeParametre; +import fr.sdis83.remocra.db.model.remocra.tables.pojos.Parametre; +import fr.sdis83.remocra.domain.remocra.ParamConf; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class ParametreData { + private final Map mapValueByKey = new HashMap<>(); + + public ParametreData( + Collection listParamConfData, Collection listParametreData) { + for (CleValeurClasseData CleValeurClasseData : listParamConfData) { + mapValueByKey.put( + CleValeurClasseData.getCle(), + new CleValeurClasseData( + CleValeurClasseData.getCle(), + CleValeurClasseData.getValeur(), + ParamConf.ParamConfParam.getClassFromCle(CleValeurClasseData.getCle()))); + } + for (Parametre parametre : listParametreData) { + mapValueByKey.put( + parametre.getCleParametre(), + new CleValeurClasseData( + parametre.getCleParametre(), + parametre.getValeurParametre(), + getClassFromTypeParametre(parametre.getTypeParametre()))); + } + } + + /** + * Retourne la classe attendue pour un type de paramètre donné + * + * @param typeParametre {@link TypeParametre} + * @return Class + */ + private static Class getClassFromTypeParametre(TypeParametre typeParametre) { + switch (typeParametre) { + case INTEGER: + return Integer.class; + case DOUBLE: + return Double.class; + case GEOMETRY: + case BINARY: + case STRING: + default: + return String.class; + } + } + + public String getValeurString(String cle) { + if (!mapValueByKey.containsKey(cle)) { + return null; + } + return mapValueByKey.get(cle).getValeur().toString(); + } + + public Object getValeur(String cle) { + if (!mapValueByKey.containsKey(cle)) { + return null; + } + if (mapValueByKey.get(cle).getClazz().equals(Integer.class)) { + return Integer.valueOf((String) mapValueByKey.get(cle).getValeur()); + } + + // TODO pour chaque type concret, transtyper proprement + return mapValueByKey.get(cle).getValeur().toString(); + } +} diff --git a/remocra/src/main/java/fr/sdis83/remocra/repository/ParamConfRepository.java b/remocra/src/main/java/fr/sdis83/remocra/repository/ParamConfRepository.java index dc38579ce..7828b80fc 100644 --- a/remocra/src/main/java/fr/sdis83/remocra/repository/ParamConfRepository.java +++ b/remocra/src/main/java/fr/sdis83/remocra/repository/ParamConfRepository.java @@ -2,13 +2,17 @@ import static fr.sdis83.remocra.db.model.remocra.Tables.PARAM_CONF; +import fr.sdis83.remocra.data.CleValeurClasseData; import fr.sdis83.remocra.db.model.remocra.tables.pojos.ParamConf; +import java.util.Collection; +import javax.inject.Singleton; import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration +@Singleton public class ParamConfRepository { @Autowired DSLContext context; @@ -34,4 +38,19 @@ public ParamConf getByCle(String cle) { .where(PARAM_CONF.CLE.eq(cle)) .fetchOneInto(ParamConf.class); } + + public Collection getParametres() { + return context + .select(PARAM_CONF.CLE, PARAM_CONF.VALEUR) + .from(PARAM_CONF) + .fetchInto(CleValeurClasseData.class); + } + + public void updateParamConf(String cle, String valeur) { + context + .update(PARAM_CONF) + .set(PARAM_CONF.VALEUR, valeur) + .where(PARAM_CONF.CLE.eq(cle)) + .execute(); + } } diff --git a/remocra/src/main/java/fr/sdis83/remocra/repository/ParametreRepository.java b/remocra/src/main/java/fr/sdis83/remocra/repository/ParametreRepository.java index d0ee6fae1..de1015cb5 100644 --- a/remocra/src/main/java/fr/sdis83/remocra/repository/ParametreRepository.java +++ b/remocra/src/main/java/fr/sdis83/remocra/repository/ParametreRepository.java @@ -3,6 +3,7 @@ import static fr.sdis83.remocra.db.model.remocra.tables.Parametre.PARAMETRE; import fr.sdis83.remocra.db.model.remocra.tables.pojos.Parametre; +import java.util.Collection; import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -24,6 +25,11 @@ public ParametreRepository parametreRepository(DSLContext context) { this.context = context; } + /** + * @deprecated ne plus utiliser, le ParametreProvider arrive ! + * @param cle + * @return + */ public Parametre getByCle(String cle) { return context .selectFrom(PARAMETRE) @@ -38,4 +44,14 @@ public void updateByKey(String key, String valeur) { .where(PARAMETRE.CLE_PARAMETRE.eq(key)) .execute(); } + + /** + * Retourne la liste de *tous* les paramètres.
+ * Ne pas utiliser en dehors du provider de paramètres + * + * @return Collection + */ + public Collection getParametres() { + return context.selectFrom(PARAMETRE).fetchInto(Parametre.class); + } } diff --git a/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/ParametreDataProvider.java b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/ParametreDataProvider.java new file mode 100644 index 000000000..9ba2a023e --- /dev/null +++ b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/ParametreDataProvider.java @@ -0,0 +1,45 @@ +package fr.sdis83.remocra.usecase.parametre; + +import fr.sdis83.remocra.data.CleValeurClasseData; +import fr.sdis83.remocra.data.ParametreData; +import fr.sdis83.remocra.db.model.remocra.tables.pojos.Parametre; +import fr.sdis83.remocra.repository.ParamConfRepository; +import fr.sdis83.remocra.repository.ParametreRepository; +import java.util.Collection; +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; +import org.apache.log4j.Logger; +import org.springframework.context.annotation.Configuration; + +@Singleton +@Configuration +public class ParametreDataProvider implements Provider { + private ParametreData parametreData = null; + + private final Logger logger = Logger.getLogger(getClass()); + + @Inject private ParamConfRepository paramConfRepository; + + @Inject private ParametreRepository parametreRepository; + + public void reloadParametres() { + parametreData = getParametreData(); + } + + private ParametreData getParametreData() { + Collection listParamConf = paramConfRepository.getParametres(); + Collection listParametres = parametreRepository.getParametres(); + + return new ParametreData(listParamConf, listParametres); + } + + @Override + public ParametreData get() { + if (parametreData == null) { + logger.info("Mise en cache des paramètres"); + parametreData = getParametreData(); + } + return parametreData; + } +} diff --git a/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/UpdateParametreUseCase.java b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/UpdateParametreUseCase.java new file mode 100644 index 000000000..206c6a687 --- /dev/null +++ b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/UpdateParametreUseCase.java @@ -0,0 +1,44 @@ +package fr.sdis83.remocra.usecase.parametre; + +import fr.sdis83.remocra.repository.ParamConfRepository; +import fr.sdis83.remocra.repository.ParametreRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class UpdateParametreUseCase { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired ParametreDataProvider parametreDataProvider; + + @Autowired ParametreRepository parametreRepository; + + @Autowired ParamConfRepository paramConfRepository; + + /** + * Met à jour un paramètre en BDD, et invalide le cache. + * + * @param cle Clé du paramètre + * @param valeur Valeur stringifiée du paramètre pour stockage dans une colonne TEXT + */ + public void updateParamConf(String cle, String valeur) { + paramConfRepository.updateParamConf(cle, valeur); + logger.info("Invalidation des paramètres : enregistrement de ParamConf " + cle); + parametreDataProvider.reloadParametres(); + } + + /** + * Met à jour un paramètre en BDD, et invalide le cache.
+ * La valeur sera stringifiée proprement par l'appelant pour garantir son stockage + * + * @param cle Clé du paramètre + * @param valeur Valeur stringifiée du paramètre pour stockage dans une colonne TEXT + */ + public void updateParametre(String cle, String valeur) { + parametreRepository.updateByKey(cle, valeur); + logger.info("Invalidation des paramètres : enregistrement de Parametre " + cle); + parametreDataProvider.reloadParametres(); + } +} diff --git a/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/agents/AgentsUseCase.java b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/agents/AgentsUseCase.java index 847524420..738ca6031 100644 --- a/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/agents/AgentsUseCase.java +++ b/remocra/src/main/java/fr/sdis83/remocra/usecase/parametre/agents/AgentsUseCase.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import fr.sdis83.remocra.GlobalConstants; import fr.sdis83.remocra.db.model.remocra.enums.TypeGestionAgent; -import fr.sdis83.remocra.repository.ParametreRepository; +import fr.sdis83.remocra.usecase.parametre.ParametreDataProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @Configuration public class AgentsUseCase { - @Autowired ParametreRepository parametreRepository; + @Autowired ParametreDataProvider parametreDataProvider; /** * Renvoie le type d'agent sélectionné en fonction des paramètres de l'application. @@ -19,8 +19,7 @@ public class AgentsUseCase { * @return Une chaîne de caractères représentant le type d'agent sélectionné. */ public String getTypeAgentsSelected() { - - return parametreRepository.getByCle(GlobalConstants.PARAMETRE_AGENTS).getValeurParametre(); + return parametreDataProvider.get().getValeurString(GlobalConstants.PARAMETRE_AGENTS); } /**