This is an automated email from the git hooks/post-receive script. New commit to branch feature/7488 in repository observe. See http://git.codelutin.com/observe.git commit 35d2b0d35315751140f28d775131cd0b08de0165 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Aug 28 12:27:27 2015 +0200 Ajout de méthodes utiles sur certaines entités + amélioration du code de recherche des RTP (See #7488) --- .../DuplicateLengthWeightParameterException.java | 52 +++++ ...eterHelper.java => LengthWeightParameters.java} | 229 +++++++++++++++------ .../referentiel/LengthWeightParemeterHelper.java | 23 +-- .../observe/entities/seine/NonTargetCatches.java | 16 ++ .../fr/ird/observe/entities/seine/SetSeines.java | 33 +++ 5 files changed, 272 insertions(+), 81 deletions(-) diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/DuplicateLengthWeightParameterException.java b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/DuplicateLengthWeightParameterException.java new file mode 100644 index 0000000..5e3d987 --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/DuplicateLengthWeightParameterException.java @@ -0,0 +1,52 @@ +package fr.ird.observe.entities.referentiel; + +import java.util.Date; +import java.util.List; + +/** + * Created on 28/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DuplicateLengthWeightParameterException extends RuntimeException { + + private static final long serialVersionUID = 203463423006930783L; + + protected final Species species; + + protected final Ocean ocean; + + protected final Sex sex; + + protected final Date date; + + protected final List<LengthWeightParameter> foundLengthWeightParameters; + + public DuplicateLengthWeightParameterException(Species species, Ocean ocean, Sex sex, Date date, List<LengthWeightParameter> foundLengthWeightParameters) { + this.species = species; + this.ocean = ocean; + this.sex = sex; + this.date = date; + this.foundLengthWeightParameters = foundLengthWeightParameters; + } + + public Species getSpecies() { + return species; + } + + public Ocean getOcean() { + return ocean; + } + + public Sex getSex() { + return sex; + } + + public Date getDate() { + return date; + } + + public List<LengthWeightParameter> getFoundLengthWeightParameters() { + return foundLengthWeightParameters; + } +} diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParameters.java similarity index 58% copy from observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java copy to observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParameters.java index e0e9c44..6466934 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParameters.java @@ -1,32 +1,11 @@ -/* - * #%L - * ObServe :: Entities - * %% - * Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ package fr.ird.observe.entities.referentiel; -import fr.ird.observe.ObserveTopiaPersistenceContext; +import fr.ird.observe.ObserveTopiaDaoSupplier; import fr.ird.observe.util.Numbers; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaDao; import javax.script.Bindings; import javax.script.ScriptContext; @@ -43,20 +22,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /** - * Classe utilitaire pour les traitements communs des implantations de - * {@link LengthWeightParameter}. + * Created on 28/08/15. * * @author Tony Chemit - chemit@codelutin.com - * @since 1.5 */ -public class LengthWeightParemeterHelper { +public class LengthWeightParameters { - private static final Pattern COEFFICIENTS_PATTERN = - Pattern.compile("(.+)=(.+)"); + /** Logger. */ + private static final Log log = LogFactory.getLog(LengthWeightParameters.class); - /** Logger */ - private static final Log log = - LogFactory.getLog(LengthWeightParemeterHelper.class); + private static final Pattern COEFFICIENTS_PATTERN = Pattern.compile("(.+)=(.+)"); /** moteur d'évaluation d'expression */ protected static ScriptEngine scriptEngine; @@ -80,6 +55,139 @@ public class LengthWeightParemeterHelper { return scriptEngine; } + /** + * Recherche d'un {@link LengthWeightParameter} à partir des paramètres donnés. + * + * La recherche peut ne peut être aussi exacte que les paramètres donnés : + * + * Dans le cas d'une espèce faune, si non trouvé alors on recherche sur son + * speciesGroup d'espèce. + * + * Si non trouvé pour l'océan donné (et que celui-ci est non null), alors on + * recherche avec un ocean vide. + * + * Si non trouvé sur le gender (et que le sexe n'est pas indéterminé) , alors + * on recherche avec le gender indéterminé (sexe=0). + * + * @param daoSupplier la transaction en cours d'utilisation + * @param species l'espèce sur lequel on recherche le paramétrage + * @param ocean l'ocean recherché (peut être null) + * @param sex le sexe recherché (on essayera sans sexe (sexe.code=0) si non trouvé) + * @param date le jour recherché + * @return le paramétrage adéquate + * @since 1.5 + */ + public static LengthWeightParameter findLengthWeightParameter(ObserveTopiaDaoSupplier daoSupplier, + Species species, + Ocean ocean, + Sex sex, + Date date) { + + List<LengthWeightParameter> list = findBySpecies(daoSupplier, species); + + if (CollectionUtils.isEmpty(list)) { + + // aucun parametrage pour le type donne + return null; + } + + // filtrage par ocean + List<LengthWeightParameter> filterByOcean = filterByOcean(list, ocean); + + if (CollectionUtils.isEmpty(filterByOcean) && ocean != null) { + + // filtre par ocean null + filterByOcean = filterByOcean(list, null); + } + list = filterByOcean; + + if (CollectionUtils.isEmpty(list)) { + + // pas d'ocean adequate + return null; + } + + // filtrage par sexe + List<LengthWeightParameter> filterBySexe = filterBySexe(list, sex); + + if (CollectionUtils.isEmpty(filterBySexe)) { + + Sex unkwonSex = getUnknownSex(daoSupplier); + + if (sex == null || unkwonSex.equals(sex)) { + + // filtrage par sexe indetermine + filterBySexe = filterBySexe(list, unkwonSex); + } + + list = filterBySexe; + + } + + if (CollectionUtils.isEmpty(list)) { + + // pas de sexe adequate + return null; + } + + // filtrage par startDate de validite + list = filterByDateDebutValidite(list, date); + + if (CollectionUtils.isEmpty(list)) { + + // pas de date de debut adequate + return null; + } + + // filtrage par endDate de validite + list = filterByDateFinValidite(list, date); + + if (CollectionUtils.isEmpty(list)) { + + // pas de date de fin adequate + return null; + } + + // au final il ne devrait en rester qu'un + + if (list.size() > 1) { +// StringBuilder sb = new StringBuilder("Il existe plusieurs paramétrages possibles pour les données suivantes :"); +// sb.append("\nEspece : "); +// sb.append(getDecoratorService().decorate(species)); +// sb.append("\nOcean : "); +// sb.append(getDecoratorService().decorate(ocean)); +// sb.append("\nSex : "); +// sb.append(getDecoratorService().decorate(sex)); +// sb.append("\nDate : ").append(date); +// sb.append("\nParamétrages trouvés : "); +// for (P p : list) { +// sb.append("\n - ").append(getDecoratorService().decorate(p)); +// } + throw new DuplicateLengthWeightParameterException(species, ocean, sex, date, list); + } + + LengthWeightParameter result = list.get(0); +// if (log.isDebugEnabled()) { +// StringBuilder sb = new StringBuilder("Paramétrage trouvé pour les données suivantes :"); +// sb.append("\nEspece : "); +// sb.append(getDecoratorService().decorate(species)); +// sb.append("\nOcean : "); +// sb.append(getDecoratorService().decorate(ocean)); +// sb.append("\nSex : "); +// sb.append(getDecoratorService().decorate(sex)); +// sb.append("\nDate : ").append(date); +// sb.append("\nParamétrage: ").append(getDecoratorService().decorate(result)); +// log.debug(sb.toString()); +// } + return result; + + + } + + protected static Sex getUnknownSex(ObserveTopiaDaoSupplier daoSupplier) { + return daoSupplier.getSexDao().forCodeEquals("0").findUnique(); + } + public static Map<String, Double> getCoefficientValues(LengthWeightParameter parametrage) { Map<String, Double> result = new TreeMap<String, Double>(); @@ -164,20 +272,17 @@ public class LengthWeightParemeterHelper { } @SuppressWarnings({"unchecked"}) - public static <P extends LengthWeightParameter> List<P> findBySpecies(ObserveTopiaPersistenceContext tx, - Species taillePoidsAble) { + public static List<LengthWeightParameter> findBySpecies(ObserveTopiaDaoSupplier daoSupplier, + Species species) { - // le type de resultat recherche - Class<P> entityClass = (Class<P>) LengthWeightParameter.class; + LengthWeightParameterTopiaDao dao = daoSupplier.getLengthWeightParameterDao(); - TopiaDao<P> dao = tx.getDao(entityClass); - - List<P> list = dao.forProperties(LengthWeightParameter.PROPERTY_SPECIES, taillePoidsAble).findAll(); + List<LengthWeightParameter> list = dao.forSpeciesEquals(species).findAll(); // on supprime les paramétrages qui ont a=0 ou a=null ou b=0 ou b = null - Iterator<P> itr = list.iterator(); + Iterator<LengthWeightParameter> itr = list.iterator(); while (itr.hasNext()) { - P p = itr.next(); + LengthWeightParameter p = itr.next(); Double a = p.getCoefficientValue(COEFFICIENT_A); if (a == null || a == 0) { itr.remove(); @@ -195,19 +300,18 @@ public class LengthWeightParemeterHelper { } - public static <P extends LengthWeightParameter> List<P> filterByOcean(List<P> list, - Ocean ocean) { - List<P> result = new ArrayList<P>(); + public static List<LengthWeightParameter> filterByOcean(List<LengthWeightParameter> list, Ocean ocean) { + List<LengthWeightParameter> result = new ArrayList<>(); if (ocean == null) { // on n'accepte que les parametrage sans ocean - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { if (parametrageLengthWeight.getOcean() == null) { result.add(parametrageLengthWeight); } } } else { - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { if (ocean.equals(parametrageLengthWeight.getOcean())) { result.add(parametrageLengthWeight); } @@ -216,11 +320,10 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterBySexe(List<P> list, - Sex sex) { - List<P> result = new ArrayList<P>(); + public static List<LengthWeightParameter> filterBySexe(List<LengthWeightParameter> list, Sex sex) { + List<LengthWeightParameter> result = new ArrayList<>(); - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { if (parametrageLengthWeight.getSex() == sex) { result.add(parametrageLengthWeight); } @@ -228,11 +331,10 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterByDateDebutValidite(List<P> list, - Date startDate) { - List<P> result = new ArrayList<P>(); + public static List<LengthWeightParameter> filterByDateDebutValidite(List<LengthWeightParameter> list, Date startDate) { + List<LengthWeightParameter> result = new ArrayList<>(); - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { if (parametrageLengthWeight.getStartDate().before(startDate) || parametrageLengthWeight.getStartDate().equals(startDate)) { @@ -242,14 +344,13 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterByDateFinValidite(List<P> list, - Date endDate) { - List<P> result = new ArrayList<P>(); + public static List<LengthWeightParameter> filterByDateFinValidite(List<LengthWeightParameter> list, Date endDate) { + List<LengthWeightParameter> result = new ArrayList<>(); if (endDate == null) { // on n'accepte que les parametrages selon les critères suivants : // - sans date de fin (i.e en cours de validite) - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { Date date = parametrageLengthWeight.getEndDate(); if (date == null) { @@ -260,7 +361,7 @@ public class LengthWeightParemeterHelper { // on n'accepte que les parametrages selon les critères suivants : // - sans date de fin (i.e en cours de validite) // - ceux dont la date de fin est avant la date de fin donnée - for (P parametrageLengthWeight : list) { + for (LengthWeightParameter parametrageLengthWeight : list) { Date date = parametrageLengthWeight.getEndDate(); if (date == null || @@ -273,9 +374,7 @@ public class LengthWeightParemeterHelper { return result; } - protected static boolean validateRelation(LengthWeightParameter parametrage, - String relation, - String variable) { + protected static boolean validateRelation(LengthWeightParameter parametrage, String relation, String variable) { boolean result = false; if (!StringUtils.isEmpty(relation)) { @@ -310,10 +409,7 @@ public class LengthWeightParemeterHelper { return result; } - public static Float computeValue(LengthWeightParameter parametrage, - String relation, - String variable, - float taille) { + public static Float computeValue(LengthWeightParameter parametrage, String relation, String variable, float taille) { Map<String, Double> coeffs = parametrage.getCoefficientValues(); ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); @@ -338,4 +434,5 @@ public class LengthWeightParemeterHelper { } return o == null ? null : o.floatValue(); } + } diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java index e0e9c44..2680601 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/referentiel/LengthWeightParemeterHelper.java @@ -48,7 +48,9 @@ import java.util.regex.Pattern; * * @author Tony Chemit - chemit@codelutin.com * @since 1.5 + * @deprecated Utiliser à la place LengthWeightParemeters */ +@Deprecated public class LengthWeightParemeterHelper { private static final Pattern COEFFICIENTS_PATTERN = @@ -195,8 +197,7 @@ public class LengthWeightParemeterHelper { } - public static <P extends LengthWeightParameter> List<P> filterByOcean(List<P> list, - Ocean ocean) { + public static <P extends LengthWeightParameter> List<P> filterByOcean(List<P> list, Ocean ocean) { List<P> result = new ArrayList<P>(); if (ocean == null) { @@ -216,8 +217,7 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterBySexe(List<P> list, - Sex sex) { + public static <P extends LengthWeightParameter> List<P> filterBySexe(List<P> list, Sex sex) { List<P> result = new ArrayList<P>(); for (P parametrageLengthWeight : list) { @@ -228,8 +228,7 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterByDateDebutValidite(List<P> list, - Date startDate) { + public static <P extends LengthWeightParameter> List<P> filterByDateDebutValidite(List<P> list, Date startDate) { List<P> result = new ArrayList<P>(); for (P parametrageLengthWeight : list) { @@ -242,8 +241,7 @@ public class LengthWeightParemeterHelper { return result; } - public static <P extends LengthWeightParameter> List<P> filterByDateFinValidite(List<P> list, - Date endDate) { + public static <P extends LengthWeightParameter> List<P> filterByDateFinValidite(List<P> list, Date endDate) { List<P> result = new ArrayList<P>(); if (endDate == null) { @@ -273,9 +271,7 @@ public class LengthWeightParemeterHelper { return result; } - protected static boolean validateRelation(LengthWeightParameter parametrage, - String relation, - String variable) { + protected static boolean validateRelation(LengthWeightParameter parametrage, String relation, String variable) { boolean result = false; if (!StringUtils.isEmpty(relation)) { @@ -310,10 +306,7 @@ public class LengthWeightParemeterHelper { return result; } - public static Float computeValue(LengthWeightParameter parametrage, - String relation, - String variable, - float taille) { + public static Float computeValue(LengthWeightParameter parametrage, String relation, String variable, float taille) { Map<String, Double> coeffs = parametrage.getCoefficientValues(); ScriptEngine engine = getScriptEngine(); Bindings bindings = engine.createBindings(); diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/NonTargetCatches.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/NonTargetCatches.java new file mode 100644 index 0000000..f03c3fd --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/NonTargetCatches.java @@ -0,0 +1,16 @@ +package fr.ird.observe.entities.seine; + +/** + * Created on 28/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class NonTargetCatches { + + public static boolean allNonTargetCatchDataFilled(NonTargetCatch nonTargetCatch) { + return !(nonTargetCatch.getCatchWeight() == null + || nonTargetCatch.getTotalCount() == null + || nonTargetCatch.getMeanWeight() == null + || nonTargetCatch.getMeanLength() == null); + } +} diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/SetSeines.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/SetSeines.java new file mode 100644 index 0000000..4ddfded --- /dev/null +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/SetSeines.java @@ -0,0 +1,33 @@ +package fr.ird.observe.entities.seine; + +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import fr.ird.observe.entities.referentiel.Species; + +import java.util.Collection; + +/** + * Created on 28/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class SetSeines { + + public static Collection<NonTargetLength> getNonTargetLengths(SetSeine setSeine, final Species species) { + + Collection<NonTargetLength> nonTargetLengths = null; + + if (!setSeine.isNonTargetSampleEmpty()) { + nonTargetLengths = Collections2.filter(setSeine.getNonTargetSample().iterator().next().getNonTargetLength(), new Predicate<NonTargetLength>() { + + @Override + public boolean apply(NonTargetLength input) { + return species.equals(input.getSpecies()); + } + }); + } + + return nonTargetLengths; + + } +} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.