mailman.cloud.codelutin.com
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

T3-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
t3-commits@list.forge.codelutin.com

  • 424 discussions
[Git][ultreiaio/ird-t3][develop] [N1][N2][N3] Permettre la sélection mutliple d'océans (See #260) N1 done
by Tony CHEMIT 21 Feb '18

21 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 676b259b by Tony CHEMIT at 2018-02-21T09:17:30+01:00 [N1][N2][N3] Permettre la sélection mutliple d&#39;océans (See #260) N1 done - - - - - 29 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java - t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml - t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml - t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp - t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java @@ -59,9 +59,9 @@ public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0A @InjectDAO(entityType = SetDuration.class) private SetDurationTopiaDao setDurationDAO; /** Count of treated activities. */ - private int nbActivities; + int nbActivities; /** Count of positive activities found. */ - private int nbPositiveActivities; + int nbPositiveActivities; /** Count of set (sum(a.setCount) on each activity trip). */ private int nbSet; /** ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java @@ -28,20 +28,17 @@ import fr.ird.t3.entities.data.N1ResultState; import fr.ird.t3.entities.data.Sample; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.TripTopiaDao; -import fr.ird.t3.entities.reference.Ocean; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; -import fr.ird.t3.services.ioc.InjectEntityById; +import org.apache.commons.collections.CollectionUtils; +import org.nuiton.topia.persistence.TopiaException; + import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.apache.commons.collections.CollectionUtils; -import org.nuiton.topia.persistence.TopiaException; - - import static org.nuiton.i18n.I18n.l; /** @@ -56,15 +53,12 @@ public abstract class AbstractLevel1Action extends T3Action<Level1Configuration> .<Trip, Integer>comparing(t -> t.getVessel().getCode()) .thenComparing(Comparator.comparing(Trip::getLandingDate)); - protected final Level1Step step; - - protected final Set<Level1Step> higherSteps; - @InjectDAO(entityType = Trip.class) protected TripTopiaDao tripDAO; - @InjectEntityById(entityType = Ocean.class) - protected Ocean ocean; + protected final Level1Step step; + + protected final Set<Level1Step> higherSteps; /** For a trip, selected samples to treat. */ protected Multimap<Trip, Sample> samplesByTrip; @@ -77,10 +71,6 @@ public abstract class AbstractLevel1Action extends T3Action<Level1Configuration> higherSteps = Level1Step.allAfter(step); } - public Ocean getOcean() { - return ocean; - } - public Multimap<Trip, Sample> getSamplesByTrip() { return samplesByTrip; } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java @@ -27,9 +27,9 @@ import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.WellSetAllSpecies; import fr.ird.t3.entities.data.WellSetAllSpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; import org.nuiton.topia.persistence.TopiaException; +import java.util.Collection; import static org.nuiton.i18n.I18n.l; @@ -127,9 +127,7 @@ public class ComputeWeightOfCategoriesForSetAction extends AbstractLevel1Action // can not compute propMinus10Weight and propPlus10Weight - String message = - l(locale, "t3.level1.computeWeightOfCategoriesForSet.sample.noComputePropWeight" - ); + String message = l(locale, "t3.level1.computeWeightOfCategoriesForSet.sample.noComputePropWeight"); addInfoMessage(message); } else { ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java @@ -21,12 +21,10 @@ package fr.ird.t3.actions.data.level1; * #L% */ -import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ird.t3.T3IOUtil; import fr.ird.t3.entities.CountAndWeight; import fr.ird.t3.entities.T3Suppliers; @@ -51,16 +49,17 @@ import fr.ird.t3.entities.reference.WeightCategorySample; import fr.ird.t3.entities.reference.WeightCategorySampleTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.util.TimeLog; + import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.TimeLog; - import static org.nuiton.i18n.I18n.l; @@ -72,38 +71,27 @@ import static org.nuiton.i18n.I18n.l; */ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLevel1Action { + private final Map<String, List<WeightCategorySample>> weightCategoryCache; @InjectDAO(entityType = LengthWeightConversion.class) - protected LengthWeightConversionTopiaDao lengthWeightConversionDAO; - + private LengthWeightConversionTopiaDao lengthWeightConversionDAO; @InjectDAO(entityType = SampleSetSpeciesCatWeight.class) - protected SampleSetSpeciesCatWeightTopiaDao sampleSetSpeciesCatWeightDAO; - + private SampleSetSpeciesCatWeightTopiaDao sampleSetSpeciesCatWeightDAO; @InjectDAO(entityType = WeightCategorySample.class) - protected WeightCategorySampleTopiaDao weightCategorySampleDAO; - - protected LengthWeightConversionHelper conversionHelper; - - protected final Map<String, List<WeightCategorySample>> weightCategoryCache; + private WeightCategorySampleTopiaDao weightCategorySampleDAO; + private LengthWeightConversionHelper conversionHelper; protected List<WeightCategorySample> getWeightCategories(SampleSet sampleSet) throws TopiaException { - Activity activity = sampleSet.getActivity(); - Ocean ocean1 = activity.getOcean(); + Ocean ocean = activity.getOcean(); SchoolType schoolType = activity.getSchoolType(); - String key = ocean1.getTopiaId() + "-" + schoolType.getTopiaId(); + String key = ocean.getTopiaId() + "-" + schoolType.getTopiaId(); List<WeightCategorySample> result = weightCategoryCache.get(key); - if (result == null) { - - result = weightCategorySampleDAO.forOceanEquals(ocean1).findAll(); + result = weightCategorySampleDAO.forOceanEquals(ocean).findAll(); WeightCategories.sort(result); weightCategoryCache.put(key, result); } - - Preconditions.checkNotNull( - result, - "Could not find any weight categories for ocean " + ocean.getLabel1() ); - return result; + return Objects.requireNonNull(result, "Could not find any weight categories for ocean " + ocean.getLabel1()); } public ConvertSampleSetSpeciesFrequencyToWeightAction() { @@ -141,21 +129,18 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve String tripStr = decorate(trip, DecoratorService.WITH_ID); - getTimeLog().log(s0, "treat trip " + tripStr); + getTimeLog().log(s0, String.format("treat trip %s", tripStr)); // flush transaction otherwise too much data in memory - flushTransaction("Flush transaction for " + tripStr); + flushTransaction(String.format("Flush transaction for %s", tripStr)); } return true; } - protected void doExecuteTrip(Trip trip, - Collection<Sample> samples) throws TopiaException { + protected void doExecuteTrip(Trip trip, Collection<Sample> samples) throws TopiaException { incrementsProgression(); - Set<Activity> tripActivities = Sets.newHashSet(); - // extrapolate for each sample set number to set for (Sample sample : samples) { @@ -173,16 +158,14 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve // found a new activity to convert convertFrequenciesToCatWeight(sampleSet); - getTimeLog().log(s1, - "convertSampleSetSpeciesFrequencyToWeight for " + - tripActivities.size() + " sets."); + getTimeLog().log(s1, String.format("convertSampleSetSpeciesFrequencyToWeight for %d sets.", sample.sizeSampleSet())); } // mark sample as treated for this step of level 1 treatment markAsTreated(sample); - getTimeLog().log(s0, "treat sample " + sampleStr); + getTimeLog().log(s0, String.format("treat sample %s", sampleStr)); } // mar trip as treated for this level 1 step @@ -191,8 +174,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve protected void convertFrequenciesToCatWeight(SampleSet sampleSet) throws TopiaException { - Collection<SampleSetSpeciesFrequency> frequencies = - sampleSet.getSampleSetSpeciesFrequency(); + Collection<SampleSetSpeciesFrequency> frequencies = sampleSet.getSampleSetSpeciesFrequency(); Activity activity = sampleSet.getActivity(); @@ -200,15 +182,12 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve Ocean activityOcean = activity.getOcean(); // group frequencies by species - Multimap<Species, SampleSetSpeciesFrequency> frequenciesBySpecies = - SpeciesTopiaDao.groupBySpecies(frequencies); + Multimap<Species, SampleSetSpeciesFrequency> frequenciesBySpecies = SpeciesTopiaDao.groupBySpecies(frequencies); - Multimap<Species, Integer> lengthClassesBySpecies = - ArrayListMultimap.create(); + Multimap<Species, Integer> lengthClassesBySpecies = ArrayListMultimap.create(); // collect all length classes by species - SampleSetSpeciesFrequencyTopiaDao.collectLengthClasses( - frequenciesBySpecies, lengthClassesBySpecies); + SampleSetSpeciesFrequencyTopiaDao.collectLengthClasses(frequenciesBySpecies, lengthClassesBySpecies); // get all available weight categories List<WeightCategorySample> weightCategories = getWeightCategories(sampleSet); @@ -216,19 +195,11 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve for (Species species : frequenciesBySpecies.keySet()) { // get conversion for species - LengthWeightConversion conversion = - conversionHelper.getConversions( - species, - activityOcean, - 0, - date - ); - - Collection<SampleSetSpeciesFrequency> frequenciesForSpecies = - frequenciesBySpecies.get(species); - - List<Integer> lengthClasses = - Lists.newArrayList(lengthClassesBySpecies.get(species)); + LengthWeightConversion conversion = conversionHelper.getConversions(species, activityOcean, 0, date); + + Collection<SampleSetSpeciesFrequency> frequenciesForSpecies = frequenciesBySpecies.get(species); + + List<Integer> lengthClasses = Lists.newArrayList(lengthClassesBySpecies.get(species)); Collections.sort(lengthClasses); Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories = @@ -238,9 +209,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve frequenciesForSpecies, lengthClasses); - // now we can build for the given activity and species the entries - // in SetWeight - + // now we can build for the given activity and species the entries in SetWeight fill(sampleSet, species, countAndWeightsByCategories); } } @@ -250,17 +219,12 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve Collection<SampleSetSpeciesFrequency> frequencies, List<Integer> lengthClasses) throws TopiaException { - Map<Integer, WeightCategorySample> weightCategorie = - conversionHelper.getWeightCategoriesDistribution( - conversion, - weightCategories, - lengthClasses); + Map<Integer, WeightCategorySample> weightCategoryMap = + conversionHelper.getWeightCategoriesDistribution(conversion, weightCategories, lengthClasses); Map<WeightCategorySample, CountAndWeight> result = new HashMap<>(); - T3IOUtil.fillMapWithDefaultValue(result, - weightCategorie.values(), - T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); + T3IOUtil.fillMapWithDefaultValue(result, weightCategoryMap.values(), T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); for (SampleSetSpeciesFrequency setSize : frequencies) { @@ -268,7 +232,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve int lfLengthClass = setSize.getLfLengthClass(); // find the correct category for this length class - WeightCategorySample weightCategory = weightCategorie.get(lfLengthClass); + WeightCategorySample weightCategory = weightCategoryMap.get(lfLengthClass); CountAndWeight countAndWeight = result.get(weightCategory); @@ -276,8 +240,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve countAndWeight.addCount(number); // convert to weight from lf length class - countAndWeight.addWeight(number * - conversion.computeWeightFromLFLengthClass(lfLengthClass)); + countAndWeight.addWeight(number * conversion.computeWeightFromLFLengthClass(lfLengthClass)); } @@ -295,7 +258,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve CountAndWeight countAndWeight = e2.getValue(); float count = countAndWeight.getCount(); - // weight must be stored in tons but are in kilogramms + // weight must be stored in tons but are in kilograms Float weight = countAndWeight.getWeight() / 1000; SampleSetSpeciesCatWeight setSpeciesCatWeight = sampleSetSpeciesCatWeightDAO.create( ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java @@ -8,19 +8,18 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ package fr.ird.t3.actions.data.level1; -import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -49,16 +48,17 @@ import fr.ird.t3.entities.reference.WeightCategorySample; import fr.ird.t3.entities.reference.WeightCategorySampleTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.util.TimeLog; + import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.TimeLog; - import static org.nuiton.i18n.I18n.l; @@ -70,48 +70,34 @@ import static org.nuiton.i18n.I18n.l; */ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Action { + protected final Map<String, List<WeightCategorySample>> weightCategoryCache; @InjectDAO(entityType = LengthWeightConversion.class) protected LengthWeightConversionTopiaDao lengthWeightConversionDAO; - @InjectDAO(entityType = SetSpeciesCatWeight.class) protected SetSpeciesCatWeightTopiaDao setSpeciesCatWeightDAO; - @InjectDAO(entityType = WeightCategorySample.class) protected WeightCategorySampleTopiaDao weightCategorySampleDAO; - protected int nbTreatedSets; - protected float nbTreatedFishesInSamples; - protected float nbCreatedFishesInSetSpeciesFrequency; - protected LengthWeightConversionHelper conversionHelper; - protected final Map<String, List<WeightCategorySample>> weightCategoryCache; + public ConvertSetSpeciesFrequencyToWeightAction() { + super(Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); + weightCategoryCache = Maps.newTreeMap(); + } protected List<WeightCategorySample> getWeightCategories(Activity activity) throws TopiaException { - - Ocean ocean1 = activity.getOcean(); + Ocean ocean = activity.getOcean(); SchoolType schoolType = activity.getSchoolType(); - String key = ocean1.getTopiaId() + "-" + schoolType.getTopiaId(); + String key = ocean.getTopiaId() + "-" + schoolType.getTopiaId(); List<WeightCategorySample> result = weightCategoryCache.get(key); - if (result == null) { - - result = weightCategorySampleDAO.findAllByOcean(ocean1); + result = weightCategorySampleDAO.forOceanEquals(ocean).findAll(); WeightCategories.sort(result); weightCategoryCache.put(key, result); } - - Preconditions.checkNotNull( - result, - "Could not find any weight categories for ocean " + ocean.getLabel1()); - return result; - } - - public ConvertSetSpeciesFrequencyToWeightAction() { - super(Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); - weightCategoryCache = Maps.newTreeMap(); + return Objects.requireNonNull(result, "Could not find any weight categories for ocean " + ocean.getLabel1()); } public int getNbTreatedSets() { @@ -140,7 +126,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Set<Trip> trips = samplesByTrip.keySet(); setNbSteps(samplesByTrip.size() + trips.size()); @@ -164,8 +150,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti return true; } - protected void doExecuteTrip(Trip trip, - Collection<Sample> samples) throws TopiaException { + protected void doExecuteTrip(Trip trip, Collection<Sample> samples) throws TopiaException { incrementsProgression(); @@ -184,8 +169,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti float nb = sample.getTotalStandardiseSampleSpeciesFrequencyNumber(); addInfoMessage( - l(locale, "t3.level1.convertSetSpeciesFrequencyToWeight.sample.nbFishes", - sampleStr, nb)); + l(locale, "t3.level1.convertSetSpeciesFrequencyToWeight.sample.nbFishes", sampleStr, nb)); nbTreatedFishesInSamples += nb; for (SampleSet sampleSet : sample.getSampleSet()) { @@ -200,17 +184,14 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti // found a new activity to convert convertFrequenciesToCatWeight(activity); - getTimeLog().log( - s1, - "convertSetSpeciesFrequencyToWeight for " + - tripActivities.size() + " sets."); + getTimeLog().log(s1, String.format("convertSetSpeciesFrequencyToWeight for %d sets.", tripActivities.size())); } } // mark sample as treated for this step of level 1 treatment markAsTreated(sample); - getTimeLog().log(s0, "treat sample " + sampleStr); + getTimeLog().log(s0, String.format("treat sample %s", sampleStr)); } nbTreatedSets += tripActivities.size(); @@ -226,50 +207,32 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Date date = activity.getDate(); Ocean activityOcean = activity.getOcean(); - // group frequencies by species Multimap<Species, SetSpeciesFrequency> setSpeciesFrequencyBySpecies = SpeciesTopiaDao.groupBySpecies(frequencies); - Multimap<Species, Integer> lengthClassesBySpecies = - ArrayListMultimap.create(); + Multimap<Species, Integer> lengthClassesBySpecies = ArrayListMultimap.create(); // collect all length classes by species - SetSpeciesFrequencyTopiaDao.collectLengthClasses( - setSpeciesFrequencyBySpecies, lengthClassesBySpecies); + SetSpeciesFrequencyTopiaDao.collectLengthClasses(setSpeciesFrequencyBySpecies, lengthClassesBySpecies); // get all available weight categories - List<WeightCategorySample> weightCategories = - getWeightCategories(activity); + List<WeightCategorySample> weightCategories = getWeightCategories(activity); for (Species species : setSpeciesFrequencyBySpecies.keySet()) { // get conversion for species - LengthWeightConversion conversion = - conversionHelper.getConversions( - species, - activityOcean, - 0, - date - ); - - Collection<SetSpeciesFrequency> setSizes = - setSpeciesFrequencyBySpecies.get(species); - - List<Integer> lengthClasses = - Lists.newArrayList(lengthClassesBySpecies.get(species)); + LengthWeightConversion conversion = conversionHelper.getConversions(species, activityOcean, 0, date); + + Collection<SetSpeciesFrequency> setSizes = setSpeciesFrequencyBySpecies.get(species); + + List<Integer> lengthClasses = Lists.newArrayList(lengthClassesBySpecies.get(species)); Collections.sort(lengthClasses); Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories = - convertForSpecies( - weightCategories, - conversion, - setSizes, - lengthClasses); - - // now we can build for the given activity and species the entries - // in SetWeight + convertForSpecies(weightCategories, conversion, setSizes, lengthClasses); + // now we can build for the given activity and species the entries in SetWeight fill(activity, species, countAndWeightsByCategories); } } @@ -279,7 +242,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Collection<SetSpeciesFrequency> setSizes, List<Integer> lengthClasses) throws TopiaException { - Map<Integer, WeightCategorySample> weightCategorie = conversionHelper.getWeightCategoriesDistribution( + Map<Integer, WeightCategorySample> weightCategoryMap = conversionHelper.getWeightCategoriesDistribution( conversion, weightCategories, lengthClasses @@ -287,9 +250,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Map<WeightCategorySample, CountAndWeight> result = new HashMap<>(); - T3IOUtil.fillMapWithDefaultValue(result, - weightCategorie.values(), - T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); + T3IOUtil.fillMapWithDefaultValue(result, weightCategoryMap.values(), T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); for (SetSpeciesFrequency setSize : setSizes) { @@ -297,8 +258,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti int lfLengthClass = setSize.getLfLengthClass(); // find the correct category for this length class - WeightCategorySample weightCategory = - weightCategorie.get(lfLengthClass); + WeightCategorySample weightCategory = weightCategoryMap.get(lfLengthClass); CountAndWeight countAndWeight = result.get(weightCategory); @@ -313,12 +273,9 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti return result; } - private void fill(Activity activity, - Species species, - Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories) throws TopiaException { + private void fill(Activity activity, Species species, Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories) throws TopiaException { - for (Map.Entry<WeightCategorySample, CountAndWeight> e2 : - countAndWeightsByCategories.entrySet()) { + for (Map.Entry<WeightCategorySample, CountAndWeight> e2 : countAndWeightsByCategories.entrySet()) { WeightCategorySample categorySample = e2.getKey(); CountAndWeight countAndWeight = e2.getValue(); ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java @@ -28,11 +28,11 @@ import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.SpeciesTopiaDao; + import java.util.Collection; import java.util.List; import java.util.Map; - import static org.nuiton.i18n.I18n.l; /** @@ -50,9 +50,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act } public List<SpeciesCountAndMeasuredModel> getResultSpeciesModel() { - List<SpeciesCountAndMeasuredModel> result = - getResultAsList(RESULT_SPECIES_MODEL, SpeciesCountAndMeasuredModel.class); - return result; + return getResultAsList(RESULT_SPECIES_MODEL, SpeciesCountAndMeasuredModel.class); } public SpeciesCountAndMeasuredModel getTotalSpeciesModel() { @@ -81,7 +79,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Map<Species, SpeciesCountAndMeasuredModel> model = Maps.newHashMap(); @@ -110,8 +108,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act return true; } - protected void doExecuteSample(Sample sample, - Map<Species, SpeciesCountAndMeasuredModel> model) { + protected void doExecuteSample(Sample sample, Map<Species, SpeciesCountAndMeasuredModel> model) { incrementsProgression(); @@ -120,7 +117,6 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act sample.getSampleNumber())); if (sample.isSampleSpeciesEmpty()) { - // no sample species, nothing to do... return; } @@ -145,9 +141,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act float measuredCount = 0; for (SampleSpecies aSampleSpecies : sampleSpecies) { totalCount += aSampleSpecies.getTotalCount(); - - measuredCount += - aSampleSpecies.getTotalSampleSpeciesFrequencyNumber(); + measuredCount += aSampleSpecies.getTotalSampleSpeciesFrequencyNumber(); } float rf0 = totalCount / measuredCount; @@ -161,7 +155,6 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act // apply rf0 on each sample for (SampleSpecies sampleSpecie : sampleSpecies) { - sampleSpecie.applyRf0(rf0); } } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java @@ -20,9 +20,7 @@ */ package fr.ird.t3.actions.data.level1; -import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.RfUsageStatus; import fr.ird.t3.entities.data.Sample; @@ -45,14 +43,16 @@ import fr.ird.t3.entities.reference.WeightCategoryWellPlan; import fr.ird.t3.entities.reference.WeightCategoryWellPlanTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; -import java.util.Map; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.util.TimeLog; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.l; @@ -125,7 +125,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Set<Trip> trips = samplesByTrip.keySet(); setNbSteps(samplesByTrip.size() + trips.size()); @@ -153,11 +153,11 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { incrementsProgression(); + //FIXME I replace ocean by trip.departureHarbour.ocean, check this is ok (See #260) // get the length class +10kg limit - Map<Species, Integer> limitLengthClassBySpecie = - getThredHoldPlus10ForSpecies(trip, samples, ocean); + Map<Species, Integer> limitLengthClassBySpecie = getThredHoldPlus10ForSpecies(trip, samples, trip.getDepartureHarbour().getOcean()); - Set<Activity> tripActivities = Sets.newHashSet(); + Set<Activity> tripActivities = new HashSet<>(); // extrapolate for each sample set number to set for (Sample sample : samples) { @@ -187,11 +187,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { activity.clearSetSpeciesCatWeight(); } - doExecuteSampleWell( - activity, - sampleSet, - sampleStr, - limitLengthClassBySpecie); + doExecuteSampleWell(activity, sampleSet, sampleStr, limitLengthClassBySpecie); } @@ -244,11 +240,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { sampleSet.setRfTot(rfContext.getRfTot()); // fill the SetSpecieFrequency table - fillSetSpeciesFrequency( - activity, - limitLengthClassBySpecie, - sampleSet, - rfContext); + fillSetSpeciesFrequency(activity, limitLengthClassBySpecie, sampleSet, rfContext); } @@ -330,9 +322,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { * @throws TopiaException if any pb while finding convertors * @see SampleWellSampleWeight */ - protected SampleWellSetWeight computeSampleWellSetWeight( - String sampleWellStr, - SampleSet sampleSet) throws TopiaException { + protected SampleWellSetWeight computeSampleWellSetWeight(String sampleWellStr, SampleSet sampleSet) throws TopiaException { float pondt = sampleSet.getWeightedWeight(); Float pondm = sampleSet.getWeightedWeightMinus10(); @@ -489,11 +479,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { return rfContext; } - public void fillSetSpeciesFrequency( - Activity activity, - Map<Species, Integer> limitLengthClassBySpecies, - SampleSet sampleSet, - RFContext rfContext) throws TopiaException { + public void fillSetSpeciesFrequency(Activity activity, Map<Species, Integer> limitLengthClassBySpecies, SampleSet sampleSet, RFContext rfContext) throws TopiaException { // group sample set frequencies by species Multimap<Species, SampleSetSpeciesFrequency> sampleSetSpeciesFrequencyBySpecies = @@ -542,18 +528,15 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { * @param trip the trip where samples are done * @param samples the sample to scan * @param ocean ocean where trip happens - * @return the universe of legnth class limits computed indexed by species + * @return the universe of length class limits computed indexed by species * @throws TopiaException if any db problems while requesting */ - public Map<Species, Integer> getThredHoldPlus10ForSpecies(Trip trip, - Collection<Sample> samples, - Ocean ocean) throws TopiaException { + public Map<Species, Integer> getThredHoldPlus10ForSpecies(Trip trip, Collection<Sample> samples, Ocean ocean) throws TopiaException { Set<Species> species = SpeciesTopiaDao.getAllSpeciesFromSampleSpecies(samples); - // for each of those species, found the length class wich matches a - // weight > 10Kg - Map<Species, Integer> result = Maps.newHashMap(); + // for each of those species, found the length class which matches a weight > 10Kg + Map<Species, Integer> result = new HashMap<>(); for (Species specie : species) { LengthWeightConversion conversion = conversionHelper.getConversions( @@ -577,8 +560,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { if (log.isDebugEnabled()) { for (Map.Entry<Species, Integer> entry : result.entrySet()) { - log.debug("Species " + entry.getKey().getCode() + - " - limit 10Kg length class : " + entry.getValue()); + log.debug(String.format("Species %d - limit 10Kg length class : %d", entry.getKey().getCode(), entry.getValue())); } } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java @@ -20,9 +20,7 @@ */ package fr.ird.t3.actions.data.level1; -import com.google.common.base.Preconditions; import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -44,13 +42,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.l; @@ -84,11 +82,12 @@ public class Level1Configuration implements T3ActionConfiguration { /** Ids of fleet countries to use. */ protected List<String> fleetIds; + /** Ids of ocean to use. */ + protected List<String> oceanIds; + /** Ids of trips to use. */ protected Multimap<String, String> sampleIdsByTripId; - /** Id of selected ocean. */ - protected String oceanId; /** begin date to use. */ protected T3Date beginDate; @@ -150,12 +149,12 @@ public class Level1Configuration implements T3ActionConfiguration { getExecutedSteps().add(step); } - public String getOceanId() { - return oceanId; + public List<String> getOceanIds() { + return oceanIds; } - public void setOceanId(String oceanId) { - this.oceanId = oceanId; + public void setOceanIds(List<String> oceanIds) { + this.oceanIds = oceanIds; } public Multimap<String, String> getSampleIdsByTripId() { @@ -306,32 +305,23 @@ public class Level1Configuration implements T3ActionConfiguration { Multimap<String, String> result = TreeMultimap.create(); - if (oceanId == null) { + if (oceanIds == null) { // no matching trips (so no matching trip return result; } - Preconditions.checkNotNull(oceanId); - - Ocean ocean = - Iterables.find(oceans, T3Predicates.equalsTopiaEntity(oceanId)); - Preconditions.checkNotNull(ocean); + Set<Ocean> usableOceans = oceans.stream().filter(o -> oceanIds.contains(o.getTopiaId())).collect(Collectors.toSet()); - Predicate<Trip> tripPredicate = - T3Predicates.tripUsingOcean(Arrays.asList(ocean)); + Predicate<Trip> tripPredicate = T3Predicates.tripUsingOcean(usableOceans); - Decorator<Trip> tripDecorator = - decoratorService.getDecorator(locale, Trip.class, DecoratorService.WITH_ID); + Decorator<Trip> tripDecorator = decoratorService.getDecorator(locale, Trip.class, DecoratorService.WITH_ID); - Decorator<Sample> sampleDecorator = - decoratorService.getDecorator(locale, Sample.class, DecoratorService.WITH_ID); + Decorator<Sample> sampleDecorator = decoratorService.getDecorator(locale, Sample.class, DecoratorService.WITH_ID); - String sampleWellEmptyReason = - l(locale, "t3.level1.notSelectedSample.sampleWellEmpty"); + String sampleWellEmptyReason = l(locale, "t3.level1.notSelectedSample.sampleWellEmpty"); - String sampleNoMatchingActivityReason = - l(locale, "t3.level1.notSelectedSample.sampleNoMatchingActivity"); + String sampleNoMatchingActivityReason = l(locale, "t3.level1.notSelectedSample.sampleNoMatchingActivity"); Decorator<SampleQuality> sampleQualityDecorator = decoratorService.getDecorator(locale, SampleQuality.class, null); Decorator<SampleType> sampleTypeDecorator = decoratorService.getDecorator(locale, SampleType.class, null); ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java @@ -31,11 +31,11 @@ import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.SpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; + import java.util.Collection; import java.util.Map; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; - import static org.nuiton.i18n.I18n.l; @@ -55,9 +55,7 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } public Set<Species> getSpeciesOfSample(Sample sample) { - Set<Species> result = SpeciesTopiaDao.getAllSpecies( - sample.getStandardiseSampleSpecies()); - return result; + return SpeciesTopiaDao.getAllSpecies(sample.getStandardiseSampleSpecies()); } public SpeciesModel getResultSpeciesModel(Sample sample, Species species) { @@ -88,7 +86,7 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { setNbSteps(2 * samplesByTrip.size()); @@ -125,8 +123,8 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } incrementsProgression(); - long sampleTotalNumber = 0l; - long sampleWellTotalNumber = 0l; + long sampleTotalNumber = 0L; + long sampleWellTotalNumber = 0L; for (StandardiseSampleSpecies sampleSpecies : sample.getStandardiseSampleSpecies()) { ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java @@ -8,12 +8,12 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% @@ -36,14 +36,15 @@ import fr.ird.t3.entities.reference.SpeciesLengthStep; import fr.ird.t3.entities.reference.SpeciesLengthStepTopiaDao; import fr.ird.t3.entities.reference.SpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; -import java.util.List; -import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; import static org.nuiton.i18n.I18n.l; @@ -61,29 +62,22 @@ import static org.nuiton.i18n.I18n.l; */ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { + public static final String RESULT_SPECIES_MODEL = "speciesModel"; /** Logger. */ - private static final Log log = - LogFactory.getLog(StandardizeSampleMeasuresAction.class); - + private static final Log log = LogFactory.getLog(StandardizeSampleMeasuresAction.class); @InjectDAO(entityType = StandardiseSampleSpecies.class) - protected StandardiseSampleSpeciesTopiaDao standardiseSampleSpeciesDAO; - + private StandardiseSampleSpeciesTopiaDao standardiseSampleSpeciesDAO; @InjectDAO(entityType = StandardiseSampleSpeciesFrequency.class) - protected StandardiseSampleSpeciesFrequencyTopiaDao standardiseSampleSpeciesFrequencyDAO; - + private StandardiseSampleSpeciesFrequencyTopiaDao standardiseSampleSpeciesFrequencyDAO; @InjectDAO(entityType = SpeciesLengthStep.class) - protected SpeciesLengthStepTopiaDao speciesLengthStepDAO; - - public static final String RESULT_SPECIES_MODEL = "speciesModel"; + private SpeciesLengthStepTopiaDao speciesLengthStepDAO; public StandardizeSampleMeasuresAction() { super(Level1Step.STANDARDIZE_SAMPLE_MEASURE); } public List<StandardizeSpeciesCountModel> getResultSpeciesModel() { - List<StandardizeSpeciesCountModel> result = - getResultAsList(RESULT_SPECIES_MODEL, StandardizeSpeciesCountModel.class); - return result; + return getResultAsList(RESULT_SPECIES_MODEL, StandardizeSpeciesCountModel.class); } public StandardizeSpeciesCountModel getTotalSpeciesModel() { @@ -101,7 +95,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Map<Species, StandardizeSpeciesCountModel> model = Maps.newHashMap(); @@ -114,11 +108,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { for (Sample sample : samples) { - doExecuteSample( - trip, - sample, - model - ); + doExecuteSample(trip, sample, model); // mark sample as treated for this step of level 1 treatment markAsTreated(sample); @@ -135,23 +125,20 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { return true; } - protected void doExecuteSample(Trip trip, - Sample sample, - Map<Species, StandardizeSpeciesCountModel> model) throws TopiaException { + private void doExecuteSample(Trip trip, Sample sample, Map<Species, StandardizeSpeciesCountModel> model) throws TopiaException { incrementsProgression(); String tripStr = decorate(trip); - addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.sample", - tripStr, sample.getSampleNumber())); + addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.sample", tripStr, sample.getSampleNumber())); if (!sample.isStandardiseSampleSpeciesEmpty()) { // was already computed, remove previous data addInfoMessage( l(locale, "t3.level1.standardizeSampleMeasures.treat.remove.previously.treated.data", - sample.sizeStandardiseSampleSpecies())); + sample.sizeStandardiseSampleSpecies())); sample.clearStandardiseSampleSpecies(); } @@ -162,8 +149,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } // split sample species by species - Multimap<Species, SampleSpecies> sampleSpeciesBySpecies = - SpeciesTopiaDao.groupBySpecies(sample.getSampleSpecies()); + Multimap<Species, SampleSpecies> sampleSpeciesBySpecies = SpeciesTopiaDao.groupBySpecies(sample.getSampleSpecies()); for (Species species : sampleSpeciesBySpecies.keySet()) { @@ -175,22 +161,14 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } // get sample species for this species - Collection<SampleSpecies> sampleSpecies = - sampleSpeciesBySpecies.get(species); + Collection<SampleSpecies> sampleSpecies = sampleSpeciesBySpecies.get(species); - // obtain once for all the length classes for this species on - // this ocean + //FIXME I replace ocean by trip.departureHarbour.ocean, check this is ok (See #260) + // obtain once for all the length classes for this species on this ocean Multimap<Integer, SpeciesLengthStep> proportionsForSpecies = - speciesLengthStepDAO.findAllByOceanAndSpeciesGroupByLd1Class( - ocean, - species); - - doExecuteSampleSpecies(species, - sampleSpecies, - sample, - speciesCountModel, - proportionsForSpecies - ); + speciesLengthStepDAO.findAllByOceanAndSpeciesGroupByLd1Class(trip.getDepartureHarbour().getOcean(), species); + + doExecuteSampleSpecies(species, sampleSpecies, sample, speciesCountModel, proportionsForSpecies); } } @@ -204,23 +182,16 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // each species will give exactly one entry in StandardiseSampleSpecies table StandardiseSampleSpecies standardiseSampleSpecies = - standardiseSampleSpeciesDAO.create( - StandardiseSampleSpecies.PROPERTY_SPECIES, species - ); + standardiseSampleSpeciesDAO.create(StandardiseSampleSpecies.PROPERTY_SPECIES, species); - // contains for each lflengthclass, the number of fishes + // contains for each lfLengthClass, the number of fishes Map<Integer, Float> frequencies = Maps.newTreeMap(); float measuredCount = 0; float totalCount = 0; for (SampleSpecies sampleSpecie : sampleSpecies) { measuredCount += sampleSpecie.getMeasuredCount(); totalCount += sampleSpecie.getTotalCount(); - - collectSampleSpeciesFrequencies( - proportionsForSpecies, - sampleSpecie, - frequencies - ); + collectSampleSpeciesFrequencies(proportionsForSpecies, sampleSpecie, frequencies); } // set the total measured count computed @@ -238,13 +209,12 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // must recode length classes - finalFrequencies = Maps.newTreeMap(); + finalFrequencies = new TreeMap<>(); for (Map.Entry<Integer, Float> ee : frequencies.entrySet()) { Integer lfLengthClass = ee.getKey(); Float numberExtrapolated = ee.getValue(); - int finalLengthClass = lfLengthClass - - lfLengthClass % lfLengthClassStep; + int finalLengthClass = lfLengthClass - lfLengthClass % lfLengthClassStep; Float finalNumber = finalFrequencies.get(finalLengthClass); if (finalNumber == null) { @@ -277,10 +247,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // attach to sample new data sample.addStandardiseSampleSpecies(standardiseSampleSpecies); addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.resume.for.species", - decorate(species), - oldCOunt, - newCount - )); + decorate(species), oldCOunt, newCount)); } protected void collectSampleSpeciesFrequencies(Multimap<Integer, SpeciesLengthStep> proportionsForSpecies, @@ -304,16 +271,14 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // ld1 length class is in cm in sample, but in milimeter in SpeciesLengthStep table int ld1LengthClass = sampleSpeciesFrequency.getLengthClass() * 10; - Collection<SpeciesLengthStep> proportions = - proportionsForSpecies.get(ld1LengthClass); + Collection<SpeciesLengthStep> proportions = proportionsForSpecies.get(ld1LengthClass); if (CollectionUtils.isEmpty(proportions)) { //TODO This should be an error ? String message = l(locale, "t3.level1.standardizeSampleMeasures.warning.lfConversion.not.found", - decorate(ocean), - decorate(species), - ld1LengthClass); + decorate(species), + ld1LengthClass); if (log.isWarnEnabled()) { log.warn(message); } @@ -336,14 +301,8 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // just add lf frequencies - for (SampleSpeciesFrequency sampleSpecyFrequency : - sampleSpecies.getSampleSpeciesFrequency()) { - - addLFFrequency( - sampleSpecyFrequency.getLengthClass(), - sampleSpecyFrequency.getNumberExtrapolated(), - frequencies - ); + for (SampleSpeciesFrequency sampleSpecyFrequency : sampleSpecies.getSampleSpeciesFrequency()) { + addLFFrequency(sampleSpecyFrequency.getLengthClass(), sampleSpecyFrequency.getNumberExtrapolated(), frequencies); } } } @@ -352,12 +311,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { float number, Map<Integer, Float> frequencies) throws TopiaException { - Float standardiseSampleSpecieFrequency = frequencies.get(lengthClass); - if (standardiseSampleSpecieFrequency == null) { - - standardiseSampleSpecieFrequency = 0.f; - frequencies.put(lengthClass, standardiseSampleSpecieFrequency); - } + Float standardiseSampleSpecieFrequency = frequencies.computeIfAbsent(lengthClass, k -> 0.f); standardiseSampleSpecieFrequency += number; ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java @@ -60,13 +60,11 @@ public class ComputeSetDurationAndPositiveSetCountActionResumeTest extends Abstr Map<String, Object> parameters = super.createTemplateParameters(); - Map<String, String> vesselSimpleTypes = new TreeMap<String, String>(); - putInMap(vesselSimpleTypes, - fixtures.vesselSimpleTypeCanneur(), - fixtures.vesselSimpleTypeSenneur()); + Map<String, String> vesselSimpleTypes = new TreeMap<>(); + putInMap(vesselSimpleTypes, fixtures.vesselSimpleTypeCanneur(), fixtures.vesselSimpleTypeSenneur()); parameters.put("vesselSimpleTypes", vesselSimpleTypes); - Map<String, String> fleets = new TreeMap<String, String>(); + Map<String, String> fleets = new TreeMap<>(); putInMap(fleets, fixtures.frenchCountry()); parameters.put("fleets", fleets); ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * To test the resume generation of action @@ -44,13 +43,13 @@ public class ComputeWeightOfCategoriesForSetActionResumeTest extends AbstractLev action.nbSampleWithoutWell = 1; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java @@ -24,7 +24,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * Tests the {@link ConvertSampleSetSpeciesFrequencyToWeightAction}. @@ -43,13 +42,13 @@ public class ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest extends Ab super.prepareAction(action, locale); } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * Tests the {@link ConvertSetSpeciesFrequencyToWeightAction}. @@ -45,13 +44,13 @@ public class ConvertSetSpeciesFrequencyToWeightActionResumeTest extends Abstract action.nbCreatedFishesInSetSpeciesFrequency = 102; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * To test the resume generation of action @@ -46,13 +45,13 @@ public class ExtrapolateSampleWeightToSetActionResumeTest extends AbstractLevel1 action.nbCreatedFishesInSetSpeciesFrequency = 102; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java @@ -33,15 +33,16 @@ import fr.ird.t3.entities.reference.SampleType; import fr.ird.t3.services.ioc.InjectDAO; import fr.ird.t3.services.ioc.InjectDecoratedBeans; import fr.ird.t3.web.actions.AbstractConfigureAction; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.Iterator; import java.util.Map; import java.util.Set; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Abstract run action for all level1 actions. @@ -57,26 +58,26 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level private static final long serialVersionUID = 1L; - protected final Level1Step[] requiredSteps; + private final Level1Step[] requiredSteps; - protected final Level1Step currentStep; + private final Level1Step currentStep; @InjectDAO(entityType = Sample.class) - protected transient SampleTopiaDao sampleDAO; + private transient SampleTopiaDao sampleDAO; @InjectDecoratedBeans(beanType = SampleQuality.class, filterById = true, pathIds = "sampleQualityIds") - protected Map<String, String> sampleQualities; + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class, filterById = true) - protected Map<String, String> sampleTypes; + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class) - protected Map<String, String> fleets; + private Map<String, String> fleets; - @InjectDecoratedBeans(beanType = Ocean.class) - protected Map<String, String> oceans; + @InjectDecoratedBeans(beanType = Ocean.class, filterById = true) + private Map<String, String> oceans; - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; public AbstractLevel1ConfigureAction(Level1Step currentStep) { super(Level1Configuration.class); @@ -110,7 +111,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level log.info("Selected fleet countries : " + configuration.getFleetIds()); log.info("Selected sample qualities : " + configuration.getSampleQualityIds()); log.info("Selected sample types : " + configuration.getSampleTypeIds()); - log.info("Selected ocean : " + configuration.getOceanId()); + log.info("Selected oceans : " + configuration.getOceanIds()); log.info("Selected begin date : " + configuration.getBeginDate()); log.info("Selected end date : " + configuration.getEndDate()); log.info("Executed steps : " + configuration.getExecutedSteps()); @@ -118,12 +119,12 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level } @Override - public String input() throws Exception { + public String input() { return INPUT; } @Override - public String execute() throws Exception { + public String execute() { prepareActionContext(); return SUCCESS; @@ -136,14 +137,12 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level // all required step already executed with this configuration if (log.isInfoEnabled()) { - log.info("Current configuration already treats all required step " + - Arrays.toString(requiredSteps)); + log.info(String.format("Current configuration already treats all required step %s", Arrays.toString(requiredSteps))); } } else { - // check on each selected sample of the configuration which steps - // are missing + // check on each selected sample of the configuration which steps are missing Multimap<Level1Step, Sample> missingSteps = getMissingRequiredStepsExecutedOnSample(); @@ -152,10 +151,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level // ok every steps were previously executed on selected sample if (log.isInfoEnabled()) { - log.info("All required steps " + - Arrays.toString(requiredSteps) + - "were already executed on selected samples " + - "of current configuration."); + log.info(String.format("All required steps %s were already executed on selected samples of current configuration.", Arrays.toString(requiredSteps))); } } else { @@ -209,8 +205,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level } public Multimap<String, String> getTripIds() { - Multimap<String, String> ids = getConfiguration().getSampleIdsByTripId(); - return ids; + return getConfiguration().getSampleIdsByTripId(); } /** @@ -228,7 +223,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level if (!executedSteps.contains(requiredStep)) { if (log.isWarnEnabled()) { - log.warn("A required step [" + requiredStep + "] was still not executed with this configuration "); + log.warn(String.format("A required step [%s] was still not executed with this configuration ", requiredStep)); } return false; } @@ -249,19 +244,17 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level Collection<String> sampleIds = getTripIds().values(); - Multimap<Level1Step, Sample> missingStates = - HashMultimap.create(); + Multimap<Level1Step, Sample> missingStates = HashMultimap.create(); for (String sampleId : sampleIds) { - Sample sample = sampleDAO.findByTopiaId(sampleId); + Sample sample = sampleDAO.forTopiaIdEquals(sampleId).findUnique(); for (Level1Step requiredStep : requiredSteps) { boolean sampleState = requiredStep.getState(sample); if (!sampleState) { if (log.isWarnEnabled()) { - log.warn("Required step " + requiredStep + - " is missing for sample " + sampleId); + log.warn(String.format("Required step %s is missing for sample %s", requiredStep, sampleId)); } missingStates.put(requiredStep, sample); } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java @@ -34,7 +34,6 @@ import org.apache.commons.collections.MapUtils; import java.util.Collection; import java.util.Date; -import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -48,24 +47,18 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex private static final long serialVersionUID = 1L; - protected final Level1Step currentStep; - + private final Level1Step currentStep; @InjectDecoratedBeans(beanType = SampleQuality.class, filterById = true, pathIds = "sampleQualityIds") - protected Map<String, String> sampleQualities; - + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class, filterById = true) - protected Map<String, String> sampleTypes; - + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class, filterById = true) - protected Map<String, String> fleets; + private Map<String, String> fleets; + @InjectDecoratedBeans(beanType = Ocean.class, filterById = true) + private Map<String, String> oceans; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; - @InjectDecoratedBeans(beanType = Ocean.class, filterById = true, filterBySingleId = true) - protected Map<String, String> oceans; - - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; - - protected AbstractLevel1RunAction(Class<A> actionType, - Level1Step currentStep) { + AbstractLevel1RunAction(Class<A> actionType, Level1Step currentStep) { super(actionType); this.currentStep = currentStep; } @@ -73,21 +66,13 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex @Override protected void executeAction(A action) throws Exception { - // when beginning a step, remove from executed one all the step with - // higher ranks... + // when beginning a step, remove from executed one all the step with higher ranks... Level1Configuration configuration = getConfiguration(); - Set<Level1Step> executedSteps = - configuration.getExecutedSteps(); + Set<Level1Step> executedSteps = configuration.getExecutedSteps(); int ordinal = currentStep.ordinal(); - Iterator<Level1Step> itr = executedSteps.iterator(); - while (itr.hasNext()) { - Level1Step step = itr.next(); - if (step.ordinal() >= ordinal) { - itr.remove(); - } - } + executedSteps.removeIf(step -> step.ordinal() >= ordinal); super.executeAction(action); @@ -134,8 +119,7 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex } public Multimap<String, String> getTripIds() { - Multimap<String, String> ids = getConfiguration().getSampleIdsByTripId(); - return ids; + return getConfiguration().getSampleIdsByTripId(); } public Map<String, String> getUseRfMinus10AndRfPlus10OrNot() { @@ -143,14 +127,8 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex } @Override - protected Map<String, Object> prepareResumeParameters(A action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> map = super.prepareResumeParameters(action, - error, - startDate, - endDate); + protected Map<String, Object> prepareResumeParameters(A action, Exception error, Date startDate, Date endDate) { + Map<String, Object> map = super.prepareResumeParameters(action, error, startDate, endDate); map.put("oceans", oceans); map.put("sampleQualities", sampleQualities); map.put("sampleTypes", sampleTypes); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java @@ -34,7 +34,6 @@ public class ComputeWeightOfCategoriesForSetRunAction extends AbstractLevel1RunA private static final long serialVersionUID = 1L; public ComputeWeightOfCategoriesForSetRunAction() { - super(ComputeWeightOfCategoriesForSetAction.class, - Level1Step.COMPUTE_WEIGHT_OF_CATEGORIES_FOR_SET); + super(ComputeWeightOfCategoriesForSetAction.class, Level1Step.COMPUTE_WEIGHT_OF_CATEGORIES_FOR_SET); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java @@ -35,7 +35,6 @@ public class ConvertSampleSetSpeciesFrequencyToWeightRunAction extends AbstractL private static final long serialVersionUID = 1L; public ConvertSampleSetSpeciesFrequencyToWeightRunAction() { - super(ConvertSampleSetSpeciesFrequencyToWeightAction.class, - Level1Step.CONVERT_SAMPLE_SET_SPECIES_FREQUENCY_TO_WEIGHT); + super(ConvertSampleSetSpeciesFrequencyToWeightAction.class, Level1Step.CONVERT_SAMPLE_SET_SPECIES_FREQUENCY_TO_WEIGHT); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java @@ -34,7 +34,6 @@ public class ConvertSetSpeciesFrequencyToWeightRunAction extends AbstractLevel1R private static final long serialVersionUID = 1L; public ConvertSetSpeciesFrequencyToWeightRunAction() { - super(ConvertSetSpeciesFrequencyToWeightAction.class, - Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); + super(ConvertSetSpeciesFrequencyToWeightAction.class, Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java @@ -38,24 +38,13 @@ public class ExtrapolateSampleCountedAndMeasuredRunAction extends AbstractLevel1 private static final long serialVersionUID = 1L; public ExtrapolateSampleCountedAndMeasuredRunAction() { - super(ExtrapolateSampleCountedAndMeasuredAction.class, - Level1Step.EXTRAPOLATE_SAMPLE_COUNTED_AND_MEASURED); + super(ExtrapolateSampleCountedAndMeasuredAction.class, Level1Step.EXTRAPOLATE_SAMPLE_COUNTED_AND_MEASURED); } @Override - protected Map<String, Object> prepareResumeParameters( - ExtrapolateSampleCountedAndMeasuredAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = - super.prepareResumeParameters(action, - error, - startDate, - endDate - ); + protected Map<String, Object> prepareResumeParameters(ExtrapolateSampleCountedAndMeasuredAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); - return parameters; } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java @@ -34,7 +34,6 @@ public class ExtrapolateSampleWeightToSetRunAction extends AbstractLevel1RunActi private static final long serialVersionUID = 1L; public ExtrapolateSampleWeightToSetRunAction() { - super(ExtrapolateSampleWeightToSetAction.class, - Level1Step.EXTRAPOLATE_SAMPLE_WEIGHT_TO_SET); + super(ExtrapolateSampleWeightToSetAction.class, Level1Step.EXTRAPOLATE_SAMPLE_WEIGHT_TO_SET); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java @@ -35,22 +35,21 @@ import fr.ird.t3.entities.reference.SampleType; import fr.ird.t3.entities.reference.SampleTypeTopiaDao; import fr.ird.t3.entities.type.T3Date; import fr.ird.t3.services.DecoratorService; -import fr.ird.t3.services.ioc.InjectDAO; import fr.ird.t3.services.ioc.InjectDecoratedBeans; import fr.ird.t3.services.ioc.InjectFromDAO; import fr.ird.t3.web.actions.AbstractConfigureAction; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.struts2.interceptor.validation.SkipValidation; import org.nuiton.decorator.Decorator; import org.nuiton.topia.persistence.util.TopiaEntityHelper; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + /** * Action to manage the configuration of level 1. * @@ -62,26 +61,23 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev private static final long serialVersionUID = 1L; @InjectDecoratedBeans(beanType = SampleQuality.class) - protected Map<String, String> sampleQualities; + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class) - protected Map<String, String> sampleTypes; + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class) - protected Map<String, String> fleets; + private Map<String, String> fleets; @InjectDecoratedBeans(beanType = Ocean.class) - protected Map<String, String> oceans; + private Map<String, String> oceans; @InjectFromDAO(entityType = Trip.class, method = "findAllForLevel1") - protected Collection<Trip> trips; + private Collection<Trip> trips; - @InjectDAO(entityType = Ocean.class) - protected transient OceanTopiaDao oceanDAO; + private Map<String, Trip> tripByTopiaIds; - protected Map<String, Trip> tripByTopiaIds; - - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; public ManageLevel1ConfigurationAction() { super(Level1Configuration.class); @@ -124,18 +120,17 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev conf.setSampleTypes(sortToList(SampleTypeTopiaDao.getAllSampleTypes(trips))); conf.setFleets(sortToList(CountryTopiaDao.getAllFleetCountries(trips))); conf.setOceans(sortToList(OceanTopiaDao.getAllOcean(trips))); - if (StringUtils.isEmpty(conf.getOceanId()) && - CollectionUtils.isNotEmpty(conf.getOceans())) { - conf.setOceanId(conf.getOceans().get(0).getTopiaId()); - } +// if (StringUtils.isEmpty(conf.getOceanId()) && +// CollectionUtils.isNotEmpty(conf.getOceans())) { +// conf.setOceanId(conf.getOceans().get(0).getTopiaId()); +// } // set ids list to empty lists List<String> ids; // use default sample qualities ids = T3EntityHelper.selectIdsByCodes(conf.getSampleQualities(), 1, 2, 3, 9); - conf.setSampleQualityIds( - ids); + conf.setSampleQualityIds(ids); // use default sample types ids = T3EntityHelper.selectIdsByCodes(conf.getSampleTypes(), 1, 2, 3, 9); @@ -165,8 +160,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev injectOnly(InjectDecoratedBeans.class); DecoratorService decoratorService = newService(DecoratorService.class); - Multimap<String, String> matchingTrips = conf.getMatchingTrips( - trips, getLocale(), decoratorService); + Multimap<String, String> matchingTrips = conf.getMatchingTrips(trips, getLocale(), decoratorService); conf.setSampleIdsByTripId(matchingTrips); } @@ -179,7 +173,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } } - public final String prepareConfiguration() throws Exception { + public final String prepareConfiguration() { if (!isConfigurationInSession() && !hasFieldErrors()) { @@ -189,7 +183,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev return INPUT; } - public String saveConfiguration() throws Exception { + public String saveConfiguration() { Level1Configuration config = getConfiguration(); // each time configuration is modified, reset executed steps for @@ -205,7 +199,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } @SkipValidation - public String removeConfiguration() throws Exception { + public String removeConfiguration() { boolean saved = isConfigurationInSession(); if (saved) { @@ -238,9 +232,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } public Map<String, Collection<String>> getTripIds() { - Map<String, Collection<String>> ids = - getConfiguration().getSampleIdsByTripId().asMap(); - return ids; + return getConfiguration().getSampleIdsByTripId().asMap(); } public Map<String, String> getSampleQualities() { ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java @@ -41,23 +41,12 @@ public class RedistributeSampleNumberToSetRunAction extends AbstractLevel1RunAct private static final long serialVersionUID = 1L; public RedistributeSampleNumberToSetRunAction() { - super(RedistributeSampleNumberToSetAction.class, - Level1Step.REDISTRIBUTE_SAMPLE_SET_TO_SET); + super(RedistributeSampleNumberToSetAction.class, Level1Step.REDISTRIBUTE_SAMPLE_SET_TO_SET); } @Override - protected Map<String, Object> prepareResumeParameters( - RedistributeSampleNumberToSetAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = super.prepareResumeParameters( - action, - error, - startDate, - endDate - ); - + protected Map<String, Object> prepareResumeParameters(RedistributeSampleNumberToSetAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); parameters.put("tripDecorator", getDecorator(Trip.class, DecoratorService.WITH_ID)); parameters.put("activityDecorator", getDecorator(Activity.class)); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java @@ -38,24 +38,13 @@ public class StandardizeSampleMeasuresRunAction extends AbstractLevel1RunAction< private static final long serialVersionUID = 1L; public StandardizeSampleMeasuresRunAction() { - super(StandardizeSampleMeasuresAction.class, - Level1Step.STANDARDIZE_SAMPLE_MEASURE); + super(StandardizeSampleMeasuresAction.class, Level1Step.STANDARDIZE_SAMPLE_MEASURE); } @Override - protected Map<String, Object> prepareResumeParameters( - StandardizeSampleMeasuresAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = - super.prepareResumeParameters(action, - error, - startDate, - endDate - ); + protected Map<String, Object> prepareResumeParameters(StandardizeSampleMeasuresAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); - return parameters; } } ===================================== t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml ===================================== --- a/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml +++ b/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml @@ -48,9 +48,10 @@ </field> - <field name="configuration.oceanId"> + <field name="configuration.oceanIds"> - <field-validator type="requiredstring"> + <field-validator type="fieldexpression"> + <param name="expression">!configuration.oceanIds.empty</param> <message key="t3.error.no.ocean.selected"/> </field-validator> ===================================== t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml ===================================== --- a/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml +++ b/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml @@ -48,7 +48,7 @@ </field> - <field name="configuration.oceanId"> + <field name="configuration.oceanIds"> <field-validator type="fieldexpression"> <param name="expression">!configuration.oceans.empty</param> ===================================== t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp ===================================== --- a/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp +++ b/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp @@ -56,8 +56,9 @@ list="fleets" template="mycheckboxlist"/> <%-- selected ocean --%> - <s:select key="configuration.oceanId" list="oceans" requiredLabel="true" - label='%{getText("t3.common.ocean")}'/> + <s:checkboxlist key="configuration.oceanIds" requiredLabel="true" + label='%{getText("t3.common.ocean")}' + list="oceans" template="mycheckboxlist"/> <%-- selected begin date --%> <sj:datepicker key="configuration.beginDate" requiredLabel="true" ===================================== t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp ===================================== --- a/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp +++ b/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp @@ -45,8 +45,9 @@ label='%{getText("t3.common.fleetCountry")}'/> <%-- selected ocean --%> - <s:select key="configuration.oceanId" disabled="true" list="oceans" - label='%{getText("t3.common.ocean")}'/> + <s:checkboxlist key="configuration.oceanIds" disabled="true" + list="oceans" template="mycheckboxlist" + label='%{getText("t3.common.ocean")}'/> <%-- selected begin date --%> <s:textfield key="configuration.beginDate" disabled="true" View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/676b259b7752246d14e8951bff15b48a… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/676b259b7752246d14e8951bff15b48a… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N1][N2][N3] Permettre la sélection mutliple d'océans (See #260) N1 done
by Tony CHEMIT 21 Feb '18

21 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 617f2075 by Tony CHEMIT at 2018-02-21T03:17:11+01:00 [N1][N2][N3] Permettre la sélection mutliple d&#39;océans (See #260) N1 done - - - - - 29 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java - t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml - t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml - t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp - t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java @@ -59,9 +59,9 @@ public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0A @InjectDAO(entityType = SetDuration.class) private SetDurationTopiaDao setDurationDAO; /** Count of treated activities. */ - private int nbActivities; + int nbActivities; /** Count of positive activities found. */ - private int nbPositiveActivities; + int nbPositiveActivities; /** Count of set (sum(a.setCount) on each activity trip). */ private int nbSet; /** ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java @@ -28,20 +28,17 @@ import fr.ird.t3.entities.data.N1ResultState; import fr.ird.t3.entities.data.Sample; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.TripTopiaDao; -import fr.ird.t3.entities.reference.Ocean; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; -import fr.ird.t3.services.ioc.InjectEntityById; +import org.apache.commons.collections.CollectionUtils; +import org.nuiton.topia.persistence.TopiaException; + import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.apache.commons.collections.CollectionUtils; -import org.nuiton.topia.persistence.TopiaException; - - import static org.nuiton.i18n.I18n.l; /** @@ -56,15 +53,12 @@ public abstract class AbstractLevel1Action extends T3Action<Level1Configuration> .<Trip, Integer>comparing(t -> t.getVessel().getCode()) .thenComparing(Comparator.comparing(Trip::getLandingDate)); - protected final Level1Step step; - - protected final Set<Level1Step> higherSteps; - @InjectDAO(entityType = Trip.class) protected TripTopiaDao tripDAO; - @InjectEntityById(entityType = Ocean.class) - protected Ocean ocean; + protected final Level1Step step; + + protected final Set<Level1Step> higherSteps; /** For a trip, selected samples to treat. */ protected Multimap<Trip, Sample> samplesByTrip; @@ -77,10 +71,6 @@ public abstract class AbstractLevel1Action extends T3Action<Level1Configuration> higherSteps = Level1Step.allAfter(step); } - public Ocean getOcean() { - return ocean; - } - public Multimap<Trip, Sample> getSamplesByTrip() { return samplesByTrip; } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetAction.java @@ -27,9 +27,9 @@ import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.WellSetAllSpecies; import fr.ird.t3.entities.data.WellSetAllSpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; import org.nuiton.topia.persistence.TopiaException; +import java.util.Collection; import static org.nuiton.i18n.I18n.l; @@ -127,9 +127,7 @@ public class ComputeWeightOfCategoriesForSetAction extends AbstractLevel1Action // can not compute propMinus10Weight and propPlus10Weight - String message = - l(locale, "t3.level1.computeWeightOfCategoriesForSet.sample.noComputePropWeight" - ); + String message = l(locale, "t3.level1.computeWeightOfCategoriesForSet.sample.noComputePropWeight"); addInfoMessage(message); } else { ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java @@ -21,12 +21,10 @@ package fr.ird.t3.actions.data.level1; * #L% */ -import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ird.t3.T3IOUtil; import fr.ird.t3.entities.CountAndWeight; import fr.ird.t3.entities.T3Suppliers; @@ -51,16 +49,17 @@ import fr.ird.t3.entities.reference.WeightCategorySample; import fr.ird.t3.entities.reference.WeightCategorySampleTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.util.TimeLog; + import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.TimeLog; - import static org.nuiton.i18n.I18n.l; @@ -72,38 +71,27 @@ import static org.nuiton.i18n.I18n.l; */ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLevel1Action { + private final Map<String, List<WeightCategorySample>> weightCategoryCache; @InjectDAO(entityType = LengthWeightConversion.class) - protected LengthWeightConversionTopiaDao lengthWeightConversionDAO; - + private LengthWeightConversionTopiaDao lengthWeightConversionDAO; @InjectDAO(entityType = SampleSetSpeciesCatWeight.class) - protected SampleSetSpeciesCatWeightTopiaDao sampleSetSpeciesCatWeightDAO; - + private SampleSetSpeciesCatWeightTopiaDao sampleSetSpeciesCatWeightDAO; @InjectDAO(entityType = WeightCategorySample.class) - protected WeightCategorySampleTopiaDao weightCategorySampleDAO; - - protected LengthWeightConversionHelper conversionHelper; - - protected final Map<String, List<WeightCategorySample>> weightCategoryCache; + private WeightCategorySampleTopiaDao weightCategorySampleDAO; + private LengthWeightConversionHelper conversionHelper; protected List<WeightCategorySample> getWeightCategories(SampleSet sampleSet) throws TopiaException { - Activity activity = sampleSet.getActivity(); - Ocean ocean1 = activity.getOcean(); + Ocean ocean = activity.getOcean(); SchoolType schoolType = activity.getSchoolType(); - String key = ocean1.getTopiaId() + "-" + schoolType.getTopiaId(); + String key = ocean.getTopiaId() + "-" + schoolType.getTopiaId(); List<WeightCategorySample> result = weightCategoryCache.get(key); - if (result == null) { - - result = weightCategorySampleDAO.forOceanEquals(ocean1).findAll(); + result = weightCategorySampleDAO.forOceanEquals(ocean).findAll(); WeightCategories.sort(result); weightCategoryCache.put(key, result); } - - Preconditions.checkNotNull( - result, - "Could not find any weight categories for ocean " + ocean.getLabel1() ); - return result; + return Objects.requireNonNull(result, "Could not find any weight categories for ocean " + ocean.getLabel1()); } public ConvertSampleSetSpeciesFrequencyToWeightAction() { @@ -141,21 +129,18 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve String tripStr = decorate(trip, DecoratorService.WITH_ID); - getTimeLog().log(s0, "treat trip " + tripStr); + getTimeLog().log(s0, String.format("treat trip %s", tripStr)); // flush transaction otherwise too much data in memory - flushTransaction("Flush transaction for " + tripStr); + flushTransaction(String.format("Flush transaction for %s", tripStr)); } return true; } - protected void doExecuteTrip(Trip trip, - Collection<Sample> samples) throws TopiaException { + protected void doExecuteTrip(Trip trip, Collection<Sample> samples) throws TopiaException { incrementsProgression(); - Set<Activity> tripActivities = Sets.newHashSet(); - // extrapolate for each sample set number to set for (Sample sample : samples) { @@ -173,16 +158,14 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve // found a new activity to convert convertFrequenciesToCatWeight(sampleSet); - getTimeLog().log(s1, - "convertSampleSetSpeciesFrequencyToWeight for " + - tripActivities.size() + " sets."); + getTimeLog().log(s1, String.format("convertSampleSetSpeciesFrequencyToWeight for %d sets.", sample.sizeSampleSet())); } // mark sample as treated for this step of level 1 treatment markAsTreated(sample); - getTimeLog().log(s0, "treat sample " + sampleStr); + getTimeLog().log(s0, String.format("treat sample %s", sampleStr)); } // mar trip as treated for this level 1 step @@ -191,8 +174,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve protected void convertFrequenciesToCatWeight(SampleSet sampleSet) throws TopiaException { - Collection<SampleSetSpeciesFrequency> frequencies = - sampleSet.getSampleSetSpeciesFrequency(); + Collection<SampleSetSpeciesFrequency> frequencies = sampleSet.getSampleSetSpeciesFrequency(); Activity activity = sampleSet.getActivity(); @@ -200,15 +182,12 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve Ocean activityOcean = activity.getOcean(); // group frequencies by species - Multimap<Species, SampleSetSpeciesFrequency> frequenciesBySpecies = - SpeciesTopiaDao.groupBySpecies(frequencies); + Multimap<Species, SampleSetSpeciesFrequency> frequenciesBySpecies = SpeciesTopiaDao.groupBySpecies(frequencies); - Multimap<Species, Integer> lengthClassesBySpecies = - ArrayListMultimap.create(); + Multimap<Species, Integer> lengthClassesBySpecies = ArrayListMultimap.create(); // collect all length classes by species - SampleSetSpeciesFrequencyTopiaDao.collectLengthClasses( - frequenciesBySpecies, lengthClassesBySpecies); + SampleSetSpeciesFrequencyTopiaDao.collectLengthClasses(frequenciesBySpecies, lengthClassesBySpecies); // get all available weight categories List<WeightCategorySample> weightCategories = getWeightCategories(sampleSet); @@ -216,19 +195,11 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve for (Species species : frequenciesBySpecies.keySet()) { // get conversion for species - LengthWeightConversion conversion = - conversionHelper.getConversions( - species, - activityOcean, - 0, - date - ); - - Collection<SampleSetSpeciesFrequency> frequenciesForSpecies = - frequenciesBySpecies.get(species); - - List<Integer> lengthClasses = - Lists.newArrayList(lengthClassesBySpecies.get(species)); + LengthWeightConversion conversion = conversionHelper.getConversions(species, activityOcean, 0, date); + + Collection<SampleSetSpeciesFrequency> frequenciesForSpecies = frequenciesBySpecies.get(species); + + List<Integer> lengthClasses = Lists.newArrayList(lengthClassesBySpecies.get(species)); Collections.sort(lengthClasses); Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories = @@ -238,9 +209,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve frequenciesForSpecies, lengthClasses); - // now we can build for the given activity and species the entries - // in SetWeight - + // now we can build for the given activity and species the entries in SetWeight fill(sampleSet, species, countAndWeightsByCategories); } } @@ -250,17 +219,12 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve Collection<SampleSetSpeciesFrequency> frequencies, List<Integer> lengthClasses) throws TopiaException { - Map<Integer, WeightCategorySample> weightCategorie = - conversionHelper.getWeightCategoriesDistribution( - conversion, - weightCategories, - lengthClasses); + Map<Integer, WeightCategorySample> weightCategoryMap = + conversionHelper.getWeightCategoriesDistribution(conversion, weightCategories, lengthClasses); Map<WeightCategorySample, CountAndWeight> result = new HashMap<>(); - T3IOUtil.fillMapWithDefaultValue(result, - weightCategorie.values(), - T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); + T3IOUtil.fillMapWithDefaultValue(result, weightCategoryMap.values(), T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); for (SampleSetSpeciesFrequency setSize : frequencies) { @@ -268,7 +232,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve int lfLengthClass = setSize.getLfLengthClass(); // find the correct category for this length class - WeightCategorySample weightCategory = weightCategorie.get(lfLengthClass); + WeightCategorySample weightCategory = weightCategoryMap.get(lfLengthClass); CountAndWeight countAndWeight = result.get(weightCategory); @@ -276,8 +240,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve countAndWeight.addCount(number); // convert to weight from lf length class - countAndWeight.addWeight(number * - conversion.computeWeightFromLFLengthClass(lfLengthClass)); + countAndWeight.addWeight(number * conversion.computeWeightFromLFLengthClass(lfLengthClass)); } @@ -295,7 +258,7 @@ public class ConvertSampleSetSpeciesFrequencyToWeightAction extends AbstractLeve CountAndWeight countAndWeight = e2.getValue(); float count = countAndWeight.getCount(); - // weight must be stored in tons but are in kilogramms + // weight must be stored in tons but are in kilograms Float weight = countAndWeight.getWeight() / 1000; SampleSetSpeciesCatWeight setSpeciesCatWeight = sampleSetSpeciesCatWeightDAO.create( ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java @@ -8,19 +8,18 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ package fr.ird.t3.actions.data.level1; -import com.google.common.base.Preconditions; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -49,16 +48,17 @@ import fr.ird.t3.entities.reference.WeightCategorySample; import fr.ird.t3.entities.reference.WeightCategorySampleTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.util.TimeLog; + import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.TimeLog; - import static org.nuiton.i18n.I18n.l; @@ -70,48 +70,34 @@ import static org.nuiton.i18n.I18n.l; */ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Action { + protected final Map<String, List<WeightCategorySample>> weightCategoryCache; @InjectDAO(entityType = LengthWeightConversion.class) protected LengthWeightConversionTopiaDao lengthWeightConversionDAO; - @InjectDAO(entityType = SetSpeciesCatWeight.class) protected SetSpeciesCatWeightTopiaDao setSpeciesCatWeightDAO; - @InjectDAO(entityType = WeightCategorySample.class) protected WeightCategorySampleTopiaDao weightCategorySampleDAO; - protected int nbTreatedSets; - protected float nbTreatedFishesInSamples; - protected float nbCreatedFishesInSetSpeciesFrequency; - protected LengthWeightConversionHelper conversionHelper; - protected final Map<String, List<WeightCategorySample>> weightCategoryCache; + public ConvertSetSpeciesFrequencyToWeightAction() { + super(Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); + weightCategoryCache = Maps.newTreeMap(); + } protected List<WeightCategorySample> getWeightCategories(Activity activity) throws TopiaException { - - Ocean ocean1 = activity.getOcean(); + Ocean ocean = activity.getOcean(); SchoolType schoolType = activity.getSchoolType(); - String key = ocean1.getTopiaId() + "-" + schoolType.getTopiaId(); + String key = ocean.getTopiaId() + "-" + schoolType.getTopiaId(); List<WeightCategorySample> result = weightCategoryCache.get(key); - if (result == null) { - - result = weightCategorySampleDAO.findAllByOcean(ocean1); + result = weightCategorySampleDAO.forOceanEquals(ocean).findAll(); WeightCategories.sort(result); weightCategoryCache.put(key, result); } - - Preconditions.checkNotNull( - result, - "Could not find any weight categories for ocean " + ocean.getLabel1()); - return result; - } - - public ConvertSetSpeciesFrequencyToWeightAction() { - super(Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); - weightCategoryCache = Maps.newTreeMap(); + return Objects.requireNonNull(result, "Could not find any weight categories for ocean " + ocean.getLabel1()); } public int getNbTreatedSets() { @@ -140,7 +126,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Set<Trip> trips = samplesByTrip.keySet(); setNbSteps(samplesByTrip.size() + trips.size()); @@ -164,8 +150,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti return true; } - protected void doExecuteTrip(Trip trip, - Collection<Sample> samples) throws TopiaException { + protected void doExecuteTrip(Trip trip, Collection<Sample> samples) throws TopiaException { incrementsProgression(); @@ -184,8 +169,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti float nb = sample.getTotalStandardiseSampleSpeciesFrequencyNumber(); addInfoMessage( - l(locale, "t3.level1.convertSetSpeciesFrequencyToWeight.sample.nbFishes", - sampleStr, nb)); + l(locale, "t3.level1.convertSetSpeciesFrequencyToWeight.sample.nbFishes", sampleStr, nb)); nbTreatedFishesInSamples += nb; for (SampleSet sampleSet : sample.getSampleSet()) { @@ -200,17 +184,14 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti // found a new activity to convert convertFrequenciesToCatWeight(activity); - getTimeLog().log( - s1, - "convertSetSpeciesFrequencyToWeight for " + - tripActivities.size() + " sets."); + getTimeLog().log(s1, String.format("convertSetSpeciesFrequencyToWeight for %d sets.", tripActivities.size())); } } // mark sample as treated for this step of level 1 treatment markAsTreated(sample); - getTimeLog().log(s0, "treat sample " + sampleStr); + getTimeLog().log(s0, String.format("treat sample %s", sampleStr)); } nbTreatedSets += tripActivities.size(); @@ -226,50 +207,32 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Date date = activity.getDate(); Ocean activityOcean = activity.getOcean(); - // group frequencies by species Multimap<Species, SetSpeciesFrequency> setSpeciesFrequencyBySpecies = SpeciesTopiaDao.groupBySpecies(frequencies); - Multimap<Species, Integer> lengthClassesBySpecies = - ArrayListMultimap.create(); + Multimap<Species, Integer> lengthClassesBySpecies = ArrayListMultimap.create(); // collect all length classes by species - SetSpeciesFrequencyTopiaDao.collectLengthClasses( - setSpeciesFrequencyBySpecies, lengthClassesBySpecies); + SetSpeciesFrequencyTopiaDao.collectLengthClasses(setSpeciesFrequencyBySpecies, lengthClassesBySpecies); // get all available weight categories - List<WeightCategorySample> weightCategories = - getWeightCategories(activity); + List<WeightCategorySample> weightCategories = getWeightCategories(activity); for (Species species : setSpeciesFrequencyBySpecies.keySet()) { // get conversion for species - LengthWeightConversion conversion = - conversionHelper.getConversions( - species, - activityOcean, - 0, - date - ); - - Collection<SetSpeciesFrequency> setSizes = - setSpeciesFrequencyBySpecies.get(species); - - List<Integer> lengthClasses = - Lists.newArrayList(lengthClassesBySpecies.get(species)); + LengthWeightConversion conversion = conversionHelper.getConversions(species, activityOcean, 0, date); + + Collection<SetSpeciesFrequency> setSizes = setSpeciesFrequencyBySpecies.get(species); + + List<Integer> lengthClasses = Lists.newArrayList(lengthClassesBySpecies.get(species)); Collections.sort(lengthClasses); Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories = - convertForSpecies( - weightCategories, - conversion, - setSizes, - lengthClasses); - - // now we can build for the given activity and species the entries - // in SetWeight + convertForSpecies(weightCategories, conversion, setSizes, lengthClasses); + // now we can build for the given activity and species the entries in SetWeight fill(activity, species, countAndWeightsByCategories); } } @@ -279,7 +242,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Collection<SetSpeciesFrequency> setSizes, List<Integer> lengthClasses) throws TopiaException { - Map<Integer, WeightCategorySample> weightCategorie = conversionHelper.getWeightCategoriesDistribution( + Map<Integer, WeightCategorySample> weightCategoryMap = conversionHelper.getWeightCategoriesDistribution( conversion, weightCategories, lengthClasses @@ -287,9 +250,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti Map<WeightCategorySample, CountAndWeight> result = new HashMap<>(); - T3IOUtil.fillMapWithDefaultValue(result, - weightCategorie.values(), - T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); + T3IOUtil.fillMapWithDefaultValue(result, weightCategoryMap.values(), T3Suppliers.COUNT_AND_WEIGHT_DEFAULT_VALUE); for (SetSpeciesFrequency setSize : setSizes) { @@ -297,8 +258,7 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti int lfLengthClass = setSize.getLfLengthClass(); // find the correct category for this length class - WeightCategorySample weightCategory = - weightCategorie.get(lfLengthClass); + WeightCategorySample weightCategory = weightCategoryMap.get(lfLengthClass); CountAndWeight countAndWeight = result.get(weightCategory); @@ -313,12 +273,9 @@ public class ConvertSetSpeciesFrequencyToWeightAction extends AbstractLevel1Acti return result; } - private void fill(Activity activity, - Species species, - Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories) throws TopiaException { + private void fill(Activity activity, Species species, Map<WeightCategorySample, CountAndWeight> countAndWeightsByCategories) throws TopiaException { - for (Map.Entry<WeightCategorySample, CountAndWeight> e2 : - countAndWeightsByCategories.entrySet()) { + for (Map.Entry<WeightCategorySample, CountAndWeight> e2 : countAndWeightsByCategories.entrySet()) { WeightCategorySample categorySample = e2.getKey(); CountAndWeight countAndWeight = e2.getValue(); ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java @@ -28,11 +28,11 @@ import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.SpeciesTopiaDao; + import java.util.Collection; import java.util.List; import java.util.Map; - import static org.nuiton.i18n.I18n.l; /** @@ -50,9 +50,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act } public List<SpeciesCountAndMeasuredModel> getResultSpeciesModel() { - List<SpeciesCountAndMeasuredModel> result = - getResultAsList(RESULT_SPECIES_MODEL, SpeciesCountAndMeasuredModel.class); - return result; + return getResultAsList(RESULT_SPECIES_MODEL, SpeciesCountAndMeasuredModel.class); } public SpeciesCountAndMeasuredModel getTotalSpeciesModel() { @@ -81,7 +79,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Map<Species, SpeciesCountAndMeasuredModel> model = Maps.newHashMap(); @@ -110,8 +108,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act return true; } - protected void doExecuteSample(Sample sample, - Map<Species, SpeciesCountAndMeasuredModel> model) { + protected void doExecuteSample(Sample sample, Map<Species, SpeciesCountAndMeasuredModel> model) { incrementsProgression(); @@ -120,7 +117,6 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act sample.getSampleNumber())); if (sample.isSampleSpeciesEmpty()) { - // no sample species, nothing to do... return; } @@ -145,9 +141,7 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act float measuredCount = 0; for (SampleSpecies aSampleSpecies : sampleSpecies) { totalCount += aSampleSpecies.getTotalCount(); - - measuredCount += - aSampleSpecies.getTotalSampleSpeciesFrequencyNumber(); + measuredCount += aSampleSpecies.getTotalSampleSpeciesFrequencyNumber(); } float rf0 = totalCount / measuredCount; @@ -161,7 +155,6 @@ public class ExtrapolateSampleCountedAndMeasuredAction extends AbstractLevel1Act // apply rf0 on each sample for (SampleSpecies sampleSpecie : sampleSpecies) { - sampleSpecie.applyRf0(rf0); } } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetAction.java @@ -20,9 +20,7 @@ */ package fr.ird.t3.actions.data.level1; -import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.RfUsageStatus; import fr.ird.t3.entities.data.Sample; @@ -45,14 +43,16 @@ import fr.ird.t3.entities.reference.WeightCategoryWellPlan; import fr.ird.t3.entities.reference.WeightCategoryWellPlanTopiaDao; import fr.ird.t3.services.DecoratorService; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; -import java.util.Map; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.util.TimeLog; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.l; @@ -125,7 +125,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Set<Trip> trips = samplesByTrip.keySet(); setNbSteps(samplesByTrip.size() + trips.size()); @@ -153,11 +153,11 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { incrementsProgression(); + //FIXME I replace ocean by trip.departureHarbour.ocean, check this is ok (See #260) // get the length class +10kg limit - Map<Species, Integer> limitLengthClassBySpecie = - getThredHoldPlus10ForSpecies(trip, samples, ocean); + Map<Species, Integer> limitLengthClassBySpecie = getThredHoldPlus10ForSpecies(trip, samples, trip.getDepartureHarbour().getOcean()); - Set<Activity> tripActivities = Sets.newHashSet(); + Set<Activity> tripActivities = new HashSet<>(); // extrapolate for each sample set number to set for (Sample sample : samples) { @@ -187,11 +187,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { activity.clearSetSpeciesCatWeight(); } - doExecuteSampleWell( - activity, - sampleSet, - sampleStr, - limitLengthClassBySpecie); + doExecuteSampleWell(activity, sampleSet, sampleStr, limitLengthClassBySpecie); } @@ -244,11 +240,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { sampleSet.setRfTot(rfContext.getRfTot()); // fill the SetSpecieFrequency table - fillSetSpeciesFrequency( - activity, - limitLengthClassBySpecie, - sampleSet, - rfContext); + fillSetSpeciesFrequency(activity, limitLengthClassBySpecie, sampleSet, rfContext); } @@ -330,9 +322,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { * @throws TopiaException if any pb while finding convertors * @see SampleWellSampleWeight */ - protected SampleWellSetWeight computeSampleWellSetWeight( - String sampleWellStr, - SampleSet sampleSet) throws TopiaException { + protected SampleWellSetWeight computeSampleWellSetWeight(String sampleWellStr, SampleSet sampleSet) throws TopiaException { float pondt = sampleSet.getWeightedWeight(); Float pondm = sampleSet.getWeightedWeightMinus10(); @@ -489,11 +479,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { return rfContext; } - public void fillSetSpeciesFrequency( - Activity activity, - Map<Species, Integer> limitLengthClassBySpecies, - SampleSet sampleSet, - RFContext rfContext) throws TopiaException { + public void fillSetSpeciesFrequency(Activity activity, Map<Species, Integer> limitLengthClassBySpecies, SampleSet sampleSet, RFContext rfContext) throws TopiaException { // group sample set frequencies by species Multimap<Species, SampleSetSpeciesFrequency> sampleSetSpeciesFrequencyBySpecies = @@ -542,18 +528,15 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { * @param trip the trip where samples are done * @param samples the sample to scan * @param ocean ocean where trip happens - * @return the universe of legnth class limits computed indexed by species + * @return the universe of length class limits computed indexed by species * @throws TopiaException if any db problems while requesting */ - public Map<Species, Integer> getThredHoldPlus10ForSpecies(Trip trip, - Collection<Sample> samples, - Ocean ocean) throws TopiaException { + public Map<Species, Integer> getThredHoldPlus10ForSpecies(Trip trip, Collection<Sample> samples, Ocean ocean) throws TopiaException { Set<Species> species = SpeciesTopiaDao.getAllSpeciesFromSampleSpecies(samples); - // for each of those species, found the length class wich matches a - // weight > 10Kg - Map<Species, Integer> result = Maps.newHashMap(); + // for each of those species, found the length class which matches a weight > 10Kg + Map<Species, Integer> result = new HashMap<>(); for (Species specie : species) { LengthWeightConversion conversion = conversionHelper.getConversions( @@ -577,8 +560,7 @@ public class ExtrapolateSampleWeightToSetAction extends AbstractLevel1Action { if (log.isDebugEnabled()) { for (Map.Entry<Species, Integer> entry : result.entrySet()) { - log.debug("Species " + entry.getKey().getCode() + - " - limit 10Kg length class : " + entry.getValue()); + log.debug(String.format("Species %d - limit 10Kg length class : %d", entry.getKey().getCode(), entry.getValue())); } } ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/Level1Configuration.java @@ -20,9 +20,7 @@ */ package fr.ird.t3.actions.data.level1; -import com.google.common.base.Preconditions; import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -44,13 +42,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.l; @@ -84,11 +82,12 @@ public class Level1Configuration implements T3ActionConfiguration { /** Ids of fleet countries to use. */ protected List<String> fleetIds; + /** Ids of ocean to use. */ + protected List<String> oceanIds; + /** Ids of trips to use. */ protected Multimap<String, String> sampleIdsByTripId; - /** Id of selected ocean. */ - protected String oceanId; /** begin date to use. */ protected T3Date beginDate; @@ -150,12 +149,12 @@ public class Level1Configuration implements T3ActionConfiguration { getExecutedSteps().add(step); } - public String getOceanId() { - return oceanId; + public List<String> getOceanIds() { + return oceanIds; } - public void setOceanId(String oceanId) { - this.oceanId = oceanId; + public void setOceanIds(List<String> oceanIds) { + this.oceanIds = oceanIds; } public Multimap<String, String> getSampleIdsByTripId() { @@ -306,32 +305,23 @@ public class Level1Configuration implements T3ActionConfiguration { Multimap<String, String> result = TreeMultimap.create(); - if (oceanId == null) { + if (oceanIds == null) { // no matching trips (so no matching trip return result; } - Preconditions.checkNotNull(oceanId); - - Ocean ocean = - Iterables.find(oceans, T3Predicates.equalsTopiaEntity(oceanId)); - Preconditions.checkNotNull(ocean); + Set<Ocean> usableOceans = oceans.stream().filter(o -> oceanIds.contains(o.getTopiaId())).collect(Collectors.toSet()); - Predicate<Trip> tripPredicate = - T3Predicates.tripUsingOcean(Arrays.asList(ocean)); + Predicate<Trip> tripPredicate = T3Predicates.tripUsingOcean(usableOceans); - Decorator<Trip> tripDecorator = - decoratorService.getDecorator(locale, Trip.class, DecoratorService.WITH_ID); + Decorator<Trip> tripDecorator = decoratorService.getDecorator(locale, Trip.class, DecoratorService.WITH_ID); - Decorator<Sample> sampleDecorator = - decoratorService.getDecorator(locale, Sample.class, DecoratorService.WITH_ID); + Decorator<Sample> sampleDecorator = decoratorService.getDecorator(locale, Sample.class, DecoratorService.WITH_ID); - String sampleWellEmptyReason = - l(locale, "t3.level1.notSelectedSample.sampleWellEmpty"); + String sampleWellEmptyReason = l(locale, "t3.level1.notSelectedSample.sampleWellEmpty"); - String sampleNoMatchingActivityReason = - l(locale, "t3.level1.notSelectedSample.sampleNoMatchingActivity"); + String sampleNoMatchingActivityReason = l(locale, "t3.level1.notSelectedSample.sampleNoMatchingActivity"); Decorator<SampleQuality> sampleQualityDecorator = decoratorService.getDecorator(locale, SampleQuality.class, null); Decorator<SampleType> sampleTypeDecorator = decoratorService.getDecorator(locale, SampleType.class, null); ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.java @@ -31,11 +31,11 @@ import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.SpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; +import org.nuiton.topia.persistence.TopiaException; + import java.util.Collection; import java.util.Map; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; - import static org.nuiton.i18n.I18n.l; @@ -55,9 +55,7 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } public Set<Species> getSpeciesOfSample(Sample sample) { - Set<Species> result = SpeciesTopiaDao.getAllSpecies( - sample.getStandardiseSampleSpecies()); - return result; + return SpeciesTopiaDao.getAllSpecies(sample.getStandardiseSampleSpecies()); } public SpeciesModel getResultSpeciesModel(Sample sample, Species species) { @@ -88,7 +86,7 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { setNbSteps(2 * samplesByTrip.size()); @@ -125,8 +123,8 @@ public class RedistributeSampleNumberToSetAction extends AbstractLevel1Action { } incrementsProgression(); - long sampleTotalNumber = 0l; - long sampleWellTotalNumber = 0l; + long sampleTotalNumber = 0L; + long sampleWellTotalNumber = 0L; for (StandardiseSampleSpecies sampleSpecies : sample.getStandardiseSampleSpecies()) { ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresAction.java @@ -8,12 +8,12 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% @@ -36,14 +36,15 @@ import fr.ird.t3.entities.reference.SpeciesLengthStep; import fr.ird.t3.entities.reference.SpeciesLengthStepTopiaDao; import fr.ird.t3.entities.reference.SpeciesTopiaDao; import fr.ird.t3.services.ioc.InjectDAO; -import java.util.Collection; -import java.util.List; -import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; import static org.nuiton.i18n.I18n.l; @@ -61,29 +62,22 @@ import static org.nuiton.i18n.I18n.l; */ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { + public static final String RESULT_SPECIES_MODEL = "speciesModel"; /** Logger. */ - private static final Log log = - LogFactory.getLog(StandardizeSampleMeasuresAction.class); - + private static final Log log = LogFactory.getLog(StandardizeSampleMeasuresAction.class); @InjectDAO(entityType = StandardiseSampleSpecies.class) - protected StandardiseSampleSpeciesTopiaDao standardiseSampleSpeciesDAO; - + private StandardiseSampleSpeciesTopiaDao standardiseSampleSpeciesDAO; @InjectDAO(entityType = StandardiseSampleSpeciesFrequency.class) - protected StandardiseSampleSpeciesFrequencyTopiaDao standardiseSampleSpeciesFrequencyDAO; - + private StandardiseSampleSpeciesFrequencyTopiaDao standardiseSampleSpeciesFrequencyDAO; @InjectDAO(entityType = SpeciesLengthStep.class) - protected SpeciesLengthStepTopiaDao speciesLengthStepDAO; - - public static final String RESULT_SPECIES_MODEL = "speciesModel"; + private SpeciesLengthStepTopiaDao speciesLengthStepDAO; public StandardizeSampleMeasuresAction() { super(Level1Step.STANDARDIZE_SAMPLE_MEASURE); } public List<StandardizeSpeciesCountModel> getResultSpeciesModel() { - List<StandardizeSpeciesCountModel> result = - getResultAsList(RESULT_SPECIES_MODEL, StandardizeSpeciesCountModel.class); - return result; + return getResultAsList(RESULT_SPECIES_MODEL, StandardizeSpeciesCountModel.class); } public StandardizeSpeciesCountModel getTotalSpeciesModel() { @@ -101,7 +95,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } @Override - protected boolean executeAction() throws Exception { + protected boolean executeAction() { Map<Species, StandardizeSpeciesCountModel> model = Maps.newHashMap(); @@ -114,11 +108,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { for (Sample sample : samples) { - doExecuteSample( - trip, - sample, - model - ); + doExecuteSample(trip, sample, model); // mark sample as treated for this step of level 1 treatment markAsTreated(sample); @@ -135,23 +125,20 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { return true; } - protected void doExecuteSample(Trip trip, - Sample sample, - Map<Species, StandardizeSpeciesCountModel> model) throws TopiaException { + private void doExecuteSample(Trip trip, Sample sample, Map<Species, StandardizeSpeciesCountModel> model) throws TopiaException { incrementsProgression(); String tripStr = decorate(trip); - addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.sample", - tripStr, sample.getSampleNumber())); + addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.sample", tripStr, sample.getSampleNumber())); if (!sample.isStandardiseSampleSpeciesEmpty()) { // was already computed, remove previous data addInfoMessage( l(locale, "t3.level1.standardizeSampleMeasures.treat.remove.previously.treated.data", - sample.sizeStandardiseSampleSpecies())); + sample.sizeStandardiseSampleSpecies())); sample.clearStandardiseSampleSpecies(); } @@ -162,8 +149,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } // split sample species by species - Multimap<Species, SampleSpecies> sampleSpeciesBySpecies = - SpeciesTopiaDao.groupBySpecies(sample.getSampleSpecies()); + Multimap<Species, SampleSpecies> sampleSpeciesBySpecies = SpeciesTopiaDao.groupBySpecies(sample.getSampleSpecies()); for (Species species : sampleSpeciesBySpecies.keySet()) { @@ -175,22 +161,14 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { } // get sample species for this species - Collection<SampleSpecies> sampleSpecies = - sampleSpeciesBySpecies.get(species); + Collection<SampleSpecies> sampleSpecies = sampleSpeciesBySpecies.get(species); - // obtain once for all the length classes for this species on - // this ocean + //FIXME I replace ocean by trip.departureHarbour.ocean, check this is ok (See #260) + // obtain once for all the length classes for this species on this ocean Multimap<Integer, SpeciesLengthStep> proportionsForSpecies = - speciesLengthStepDAO.findAllByOceanAndSpeciesGroupByLd1Class( - ocean, - species); - - doExecuteSampleSpecies(species, - sampleSpecies, - sample, - speciesCountModel, - proportionsForSpecies - ); + speciesLengthStepDAO.findAllByOceanAndSpeciesGroupByLd1Class(trip.getDepartureHarbour().getOcean(), species); + + doExecuteSampleSpecies(species, sampleSpecies, sample, speciesCountModel, proportionsForSpecies); } } @@ -204,23 +182,16 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // each species will give exactly one entry in StandardiseSampleSpecies table StandardiseSampleSpecies standardiseSampleSpecies = - standardiseSampleSpeciesDAO.create( - StandardiseSampleSpecies.PROPERTY_SPECIES, species - ); + standardiseSampleSpeciesDAO.create(StandardiseSampleSpecies.PROPERTY_SPECIES, species); - // contains for each lflengthclass, the number of fishes + // contains for each lfLengthClass, the number of fishes Map<Integer, Float> frequencies = Maps.newTreeMap(); float measuredCount = 0; float totalCount = 0; for (SampleSpecies sampleSpecie : sampleSpecies) { measuredCount += sampleSpecie.getMeasuredCount(); totalCount += sampleSpecie.getTotalCount(); - - collectSampleSpeciesFrequencies( - proportionsForSpecies, - sampleSpecie, - frequencies - ); + collectSampleSpeciesFrequencies(proportionsForSpecies, sampleSpecie, frequencies); } // set the total measured count computed @@ -238,13 +209,12 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // must recode length classes - finalFrequencies = Maps.newTreeMap(); + finalFrequencies = new TreeMap<>(); for (Map.Entry<Integer, Float> ee : frequencies.entrySet()) { Integer lfLengthClass = ee.getKey(); Float numberExtrapolated = ee.getValue(); - int finalLengthClass = lfLengthClass - - lfLengthClass % lfLengthClassStep; + int finalLengthClass = lfLengthClass - lfLengthClass % lfLengthClassStep; Float finalNumber = finalFrequencies.get(finalLengthClass); if (finalNumber == null) { @@ -277,10 +247,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // attach to sample new data sample.addStandardiseSampleSpecies(standardiseSampleSpecies); addInfoMessage(l(locale, "t3.level1.standardizeSampleMeasures.treat.resume.for.species", - decorate(species), - oldCOunt, - newCount - )); + decorate(species), oldCOunt, newCount)); } protected void collectSampleSpeciesFrequencies(Multimap<Integer, SpeciesLengthStep> proportionsForSpecies, @@ -304,16 +271,15 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // ld1 length class is in cm in sample, but in milimeter in SpeciesLengthStep table int ld1LengthClass = sampleSpeciesFrequency.getLengthClass() * 10; - Collection<SpeciesLengthStep> proportions = - proportionsForSpecies.get(ld1LengthClass); + Collection<SpeciesLengthStep> proportions = proportionsForSpecies.get(ld1LengthClass); if (CollectionUtils.isEmpty(proportions)) { //TODO This should be an error ? String message = l(locale, "t3.level1.standardizeSampleMeasures.warning.lfConversion.not.found", - decorate(ocean), - decorate(species), - ld1LengthClass); + decorate(getConfiguration().getOceans()), + decorate(species), + ld1LengthClass); if (log.isWarnEnabled()) { log.warn(message); } @@ -336,14 +302,8 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { // just add lf frequencies - for (SampleSpeciesFrequency sampleSpecyFrequency : - sampleSpecies.getSampleSpeciesFrequency()) { - - addLFFrequency( - sampleSpecyFrequency.getLengthClass(), - sampleSpecyFrequency.getNumberExtrapolated(), - frequencies - ); + for (SampleSpeciesFrequency sampleSpecyFrequency : sampleSpecies.getSampleSpeciesFrequency()) { + addLFFrequency(sampleSpecyFrequency.getLengthClass(), sampleSpecyFrequency.getNumberExtrapolated(), frequencies); } } } @@ -352,12 +312,7 @@ public class StandardizeSampleMeasuresAction extends AbstractLevel1Action { float number, Map<Integer, Float> frequencies) throws TopiaException { - Float standardiseSampleSpecieFrequency = frequencies.get(lengthClass); - if (standardiseSampleSpecieFrequency == null) { - - standardiseSampleSpecieFrequency = 0.f; - frequencies.put(lengthClass, standardiseSampleSpecieFrequency); - } + Float standardiseSampleSpecieFrequency = frequencies.computeIfAbsent(lengthClass, k -> 0.f); standardiseSampleSpecieFrequency += number; ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountActionResumeTest.java @@ -60,13 +60,11 @@ public class ComputeSetDurationAndPositiveSetCountActionResumeTest extends Abstr Map<String, Object> parameters = super.createTemplateParameters(); - Map<String, String> vesselSimpleTypes = new TreeMap<String, String>(); - putInMap(vesselSimpleTypes, - fixtures.vesselSimpleTypeCanneur(), - fixtures.vesselSimpleTypeSenneur()); + Map<String, String> vesselSimpleTypes = new TreeMap<>(); + putInMap(vesselSimpleTypes, fixtures.vesselSimpleTypeCanneur(), fixtures.vesselSimpleTypeSenneur()); parameters.put("vesselSimpleTypes", vesselSimpleTypes); - Map<String, String> fleets = new TreeMap<String, String>(); + Map<String, String> fleets = new TreeMap<>(); putInMap(fleets, fixtures.frenchCountry()); parameters.put("fleets", fleets); ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ComputeWeightOfCategoriesForSetActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * To test the resume generation of action @@ -44,13 +43,13 @@ public class ComputeWeightOfCategoriesForSetActionResumeTest extends AbstractLev action.nbSampleWithoutWell = 1; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest.java @@ -24,7 +24,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * Tests the {@link ConvertSampleSetSpeciesFrequencyToWeightAction}. @@ -43,13 +42,13 @@ public class ConvertSampleSetSpeciesFrequencyToWeightActionResumeTest extends Ab super.prepareAction(action, locale); } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * Tests the {@link ConvertSetSpeciesFrequencyToWeightAction}. @@ -45,13 +44,13 @@ public class ConvertSetSpeciesFrequencyToWeightActionResumeTest extends Abstract action.nbCreatedFishesInSetSpeciesFrequency = 102; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java ===================================== --- a/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java +++ b/t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleWeightToSetActionResumeTest.java @@ -23,7 +23,6 @@ package fr.ird.t3.actions.data.level1; import org.junit.Test; import java.util.Locale; -import java.util.Map; /** * To test the resume generation of action @@ -46,13 +45,13 @@ public class ExtrapolateSampleWeightToSetActionResumeTest extends AbstractLevel1 action.nbCreatedFishesInSetSpeciesFrequency = 102; } - @Override - protected Map<String, Object> createTemplateParameters() { - - Map<String, Object> parameters = super.createTemplateParameters(); - - return parameters; - } +// @Override +// protected Map<String, Object> createTemplateParameters() { +// +// Map<String, Object> parameters = super.createTemplateParameters(); +// +// return parameters; +// } @Test public void testRender() throws Exception { ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1ConfigureAction.java @@ -33,15 +33,16 @@ import fr.ird.t3.entities.reference.SampleType; import fr.ird.t3.services.ioc.InjectDAO; import fr.ird.t3.services.ioc.InjectDecoratedBeans; import fr.ird.t3.web.actions.AbstractConfigureAction; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; import java.util.Iterator; import java.util.Map; import java.util.Set; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Abstract run action for all level1 actions. @@ -57,26 +58,26 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level private static final long serialVersionUID = 1L; - protected final Level1Step[] requiredSteps; + private final Level1Step[] requiredSteps; - protected final Level1Step currentStep; + private final Level1Step currentStep; @InjectDAO(entityType = Sample.class) - protected transient SampleTopiaDao sampleDAO; + private transient SampleTopiaDao sampleDAO; @InjectDecoratedBeans(beanType = SampleQuality.class, filterById = true, pathIds = "sampleQualityIds") - protected Map<String, String> sampleQualities; + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class, filterById = true) - protected Map<String, String> sampleTypes; + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class) - protected Map<String, String> fleets; + private Map<String, String> fleets; - @InjectDecoratedBeans(beanType = Ocean.class) - protected Map<String, String> oceans; + @InjectDecoratedBeans(beanType = Ocean.class, filterById = true) + private Map<String, String> oceans; - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; public AbstractLevel1ConfigureAction(Level1Step currentStep) { super(Level1Configuration.class); @@ -110,7 +111,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level log.info("Selected fleet countries : " + configuration.getFleetIds()); log.info("Selected sample qualities : " + configuration.getSampleQualityIds()); log.info("Selected sample types : " + configuration.getSampleTypeIds()); - log.info("Selected ocean : " + configuration.getOceanId()); + log.info("Selected oceans : " + configuration.getOceanIds()); log.info("Selected begin date : " + configuration.getBeginDate()); log.info("Selected end date : " + configuration.getEndDate()); log.info("Executed steps : " + configuration.getExecutedSteps()); @@ -118,12 +119,12 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level } @Override - public String input() throws Exception { + public String input() { return INPUT; } @Override - public String execute() throws Exception { + public String execute() { prepareActionContext(); return SUCCESS; @@ -136,14 +137,12 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level // all required step already executed with this configuration if (log.isInfoEnabled()) { - log.info("Current configuration already treats all required step " + - Arrays.toString(requiredSteps)); + log.info(String.format("Current configuration already treats all required step %s", Arrays.toString(requiredSteps))); } } else { - // check on each selected sample of the configuration which steps - // are missing + // check on each selected sample of the configuration which steps are missing Multimap<Level1Step, Sample> missingSteps = getMissingRequiredStepsExecutedOnSample(); @@ -152,10 +151,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level // ok every steps were previously executed on selected sample if (log.isInfoEnabled()) { - log.info("All required steps " + - Arrays.toString(requiredSteps) + - "were already executed on selected samples " + - "of current configuration."); + log.info(String.format("All required steps %s were already executed on selected samples of current configuration.", Arrays.toString(requiredSteps))); } } else { @@ -209,8 +205,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level } public Multimap<String, String> getTripIds() { - Multimap<String, String> ids = getConfiguration().getSampleIdsByTripId(); - return ids; + return getConfiguration().getSampleIdsByTripId(); } /** @@ -228,7 +223,7 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level if (!executedSteps.contains(requiredStep)) { if (log.isWarnEnabled()) { - log.warn("A required step [" + requiredStep + "] was still not executed with this configuration "); + log.warn(String.format("A required step [%s] was still not executed with this configuration ", requiredStep)); } return false; } @@ -249,19 +244,17 @@ public class AbstractLevel1ConfigureAction extends AbstractConfigureAction<Level Collection<String> sampleIds = getTripIds().values(); - Multimap<Level1Step, Sample> missingStates = - HashMultimap.create(); + Multimap<Level1Step, Sample> missingStates = HashMultimap.create(); for (String sampleId : sampleIds) { - Sample sample = sampleDAO.findByTopiaId(sampleId); + Sample sample = sampleDAO.forTopiaIdEquals(sampleId).findUnique(); for (Level1Step requiredStep : requiredSteps) { boolean sampleState = requiredStep.getState(sample); if (!sampleState) { if (log.isWarnEnabled()) { - log.warn("Required step " + requiredStep + - " is missing for sample " + sampleId); + log.warn(String.format("Required step %s is missing for sample %s", requiredStep, sampleId)); } missingStates.put(requiredStep, sample); } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/AbstractLevel1RunAction.java @@ -34,7 +34,6 @@ import org.apache.commons.collections.MapUtils; import java.util.Collection; import java.util.Date; -import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -48,24 +47,18 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex private static final long serialVersionUID = 1L; - protected final Level1Step currentStep; - + private final Level1Step currentStep; @InjectDecoratedBeans(beanType = SampleQuality.class, filterById = true, pathIds = "sampleQualityIds") - protected Map<String, String> sampleQualities; - + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class, filterById = true) - protected Map<String, String> sampleTypes; - + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class, filterById = true) - protected Map<String, String> fleets; + private Map<String, String> fleets; + @InjectDecoratedBeans(beanType = Ocean.class, filterById = true) + private Map<String, String> oceans; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; - @InjectDecoratedBeans(beanType = Ocean.class, filterById = true, filterBySingleId = true) - protected Map<String, String> oceans; - - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; - - protected AbstractLevel1RunAction(Class<A> actionType, - Level1Step currentStep) { + AbstractLevel1RunAction(Class<A> actionType, Level1Step currentStep) { super(actionType); this.currentStep = currentStep; } @@ -73,21 +66,13 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex @Override protected void executeAction(A action) throws Exception { - // when beginning a step, remove from executed one all the step with - // higher ranks... + // when beginning a step, remove from executed one all the step with higher ranks... Level1Configuration configuration = getConfiguration(); - Set<Level1Step> executedSteps = - configuration.getExecutedSteps(); + Set<Level1Step> executedSteps = configuration.getExecutedSteps(); int ordinal = currentStep.ordinal(); - Iterator<Level1Step> itr = executedSteps.iterator(); - while (itr.hasNext()) { - Level1Step step = itr.next(); - if (step.ordinal() >= ordinal) { - itr.remove(); - } - } + executedSteps.removeIf(step -> step.ordinal() >= ordinal); super.executeAction(action); @@ -134,8 +119,7 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex } public Multimap<String, String> getTripIds() { - Multimap<String, String> ids = getConfiguration().getSampleIdsByTripId(); - return ids; + return getConfiguration().getSampleIdsByTripId(); } public Map<String, String> getUseRfMinus10AndRfPlus10OrNot() { @@ -143,14 +127,8 @@ public abstract class AbstractLevel1RunAction<A extends AbstractLevel1Action> ex } @Override - protected Map<String, Object> prepareResumeParameters(A action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> map = super.prepareResumeParameters(action, - error, - startDate, - endDate); + protected Map<String, Object> prepareResumeParameters(A action, Exception error, Date startDate, Date endDate) { + Map<String, Object> map = super.prepareResumeParameters(action, error, startDate, endDate); map.put("oceans", oceans); map.put("sampleQualities", sampleQualities); map.put("sampleTypes", sampleTypes); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ComputeWeightOfCategoriesForSetRunAction.java @@ -34,7 +34,6 @@ public class ComputeWeightOfCategoriesForSetRunAction extends AbstractLevel1RunA private static final long serialVersionUID = 1L; public ComputeWeightOfCategoriesForSetRunAction() { - super(ComputeWeightOfCategoriesForSetAction.class, - Level1Step.COMPUTE_WEIGHT_OF_CATEGORIES_FOR_SET); + super(ComputeWeightOfCategoriesForSetAction.class, Level1Step.COMPUTE_WEIGHT_OF_CATEGORIES_FOR_SET); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightRunAction.java @@ -35,7 +35,6 @@ public class ConvertSampleSetSpeciesFrequencyToWeightRunAction extends AbstractL private static final long serialVersionUID = 1L; public ConvertSampleSetSpeciesFrequencyToWeightRunAction() { - super(ConvertSampleSetSpeciesFrequencyToWeightAction.class, - Level1Step.CONVERT_SAMPLE_SET_SPECIES_FREQUENCY_TO_WEIGHT); + super(ConvertSampleSetSpeciesFrequencyToWeightAction.class, Level1Step.CONVERT_SAMPLE_SET_SPECIES_FREQUENCY_TO_WEIGHT); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ConvertSetSpeciesFrequencyToWeightRunAction.java @@ -34,7 +34,6 @@ public class ConvertSetSpeciesFrequencyToWeightRunAction extends AbstractLevel1R private static final long serialVersionUID = 1L; public ConvertSetSpeciesFrequencyToWeightRunAction() { - super(ConvertSetSpeciesFrequencyToWeightAction.class, - Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); + super(ConvertSetSpeciesFrequencyToWeightAction.class, Level1Step.CONVERT_SET_SPECIES_FREQUENCY_TO_WEIGHT); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleCountedAndMeasuredRunAction.java @@ -38,24 +38,13 @@ public class ExtrapolateSampleCountedAndMeasuredRunAction extends AbstractLevel1 private static final long serialVersionUID = 1L; public ExtrapolateSampleCountedAndMeasuredRunAction() { - super(ExtrapolateSampleCountedAndMeasuredAction.class, - Level1Step.EXTRAPOLATE_SAMPLE_COUNTED_AND_MEASURED); + super(ExtrapolateSampleCountedAndMeasuredAction.class, Level1Step.EXTRAPOLATE_SAMPLE_COUNTED_AND_MEASURED); } @Override - protected Map<String, Object> prepareResumeParameters( - ExtrapolateSampleCountedAndMeasuredAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = - super.prepareResumeParameters(action, - error, - startDate, - endDate - ); + protected Map<String, Object> prepareResumeParameters(ExtrapolateSampleCountedAndMeasuredAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); - return parameters; } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ExtrapolateSampleWeightToSetRunAction.java @@ -34,7 +34,6 @@ public class ExtrapolateSampleWeightToSetRunAction extends AbstractLevel1RunActi private static final long serialVersionUID = 1L; public ExtrapolateSampleWeightToSetRunAction() { - super(ExtrapolateSampleWeightToSetAction.class, - Level1Step.EXTRAPOLATE_SAMPLE_WEIGHT_TO_SET); + super(ExtrapolateSampleWeightToSetAction.class, Level1Step.EXTRAPOLATE_SAMPLE_WEIGHT_TO_SET); } } ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction.java @@ -35,22 +35,21 @@ import fr.ird.t3.entities.reference.SampleType; import fr.ird.t3.entities.reference.SampleTypeTopiaDao; import fr.ird.t3.entities.type.T3Date; import fr.ird.t3.services.DecoratorService; -import fr.ird.t3.services.ioc.InjectDAO; import fr.ird.t3.services.ioc.InjectDecoratedBeans; import fr.ird.t3.services.ioc.InjectFromDAO; import fr.ird.t3.web.actions.AbstractConfigureAction; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.struts2.interceptor.validation.SkipValidation; import org.nuiton.decorator.Decorator; import org.nuiton.topia.persistence.util.TopiaEntityHelper; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + /** * Action to manage the configuration of level 1. * @@ -62,26 +61,23 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev private static final long serialVersionUID = 1L; @InjectDecoratedBeans(beanType = SampleQuality.class) - protected Map<String, String> sampleQualities; + private Map<String, String> sampleQualities; @InjectDecoratedBeans(beanType = SampleType.class) - protected Map<String, String> sampleTypes; + private Map<String, String> sampleTypes; @InjectDecoratedBeans(beanType = Country.class) - protected Map<String, String> fleets; + private Map<String, String> fleets; @InjectDecoratedBeans(beanType = Ocean.class) - protected Map<String, String> oceans; + private Map<String, String> oceans; @InjectFromDAO(entityType = Trip.class, method = "findAllForLevel1") - protected Collection<Trip> trips; + private Collection<Trip> trips; - @InjectDAO(entityType = Ocean.class) - protected transient OceanTopiaDao oceanDAO; + private Map<String, Trip> tripByTopiaIds; - protected Map<String, Trip> tripByTopiaIds; - - protected Map<String, String> useRfMinus10AndRfPlus10OrNot; + private Map<String, String> useRfMinus10AndRfPlus10OrNot; public ManageLevel1ConfigurationAction() { super(Level1Configuration.class); @@ -124,18 +120,17 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev conf.setSampleTypes(sortToList(SampleTypeTopiaDao.getAllSampleTypes(trips))); conf.setFleets(sortToList(CountryTopiaDao.getAllFleetCountries(trips))); conf.setOceans(sortToList(OceanTopiaDao.getAllOcean(trips))); - if (StringUtils.isEmpty(conf.getOceanId()) && - CollectionUtils.isNotEmpty(conf.getOceans())) { - conf.setOceanId(conf.getOceans().get(0).getTopiaId()); - } +// if (StringUtils.isEmpty(conf.getOceanId()) && +// CollectionUtils.isNotEmpty(conf.getOceans())) { +// conf.setOceanId(conf.getOceans().get(0).getTopiaId()); +// } // set ids list to empty lists List<String> ids; // use default sample qualities ids = T3EntityHelper.selectIdsByCodes(conf.getSampleQualities(), 1, 2, 3, 9); - conf.setSampleQualityIds( - ids); + conf.setSampleQualityIds(ids); // use default sample types ids = T3EntityHelper.selectIdsByCodes(conf.getSampleTypes(), 1, 2, 3, 9); @@ -165,8 +160,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev injectOnly(InjectDecoratedBeans.class); DecoratorService decoratorService = newService(DecoratorService.class); - Multimap<String, String> matchingTrips = conf.getMatchingTrips( - trips, getLocale(), decoratorService); + Multimap<String, String> matchingTrips = conf.getMatchingTrips(trips, getLocale(), decoratorService); conf.setSampleIdsByTripId(matchingTrips); } @@ -179,7 +173,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } } - public final String prepareConfiguration() throws Exception { + public final String prepareConfiguration() { if (!isConfigurationInSession() && !hasFieldErrors()) { @@ -189,7 +183,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev return INPUT; } - public String saveConfiguration() throws Exception { + public String saveConfiguration() { Level1Configuration config = getConfiguration(); // each time configuration is modified, reset executed steps for @@ -205,7 +199,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } @SkipValidation - public String removeConfiguration() throws Exception { + public String removeConfiguration() { boolean saved = isConfigurationInSession(); if (saved) { @@ -238,9 +232,7 @@ public class ManageLevel1ConfigurationAction extends AbstractConfigureAction<Lev } public Map<String, Collection<String>> getTripIds() { - Map<String, Collection<String>> ids = - getConfiguration().getSampleIdsByTripId().asMap(); - return ids; + return getConfiguration().getSampleIdsByTripId().asMap(); } public Map<String, String> getSampleQualities() { ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/RedistributeSampleNumberToSetRunAction.java @@ -41,23 +41,12 @@ public class RedistributeSampleNumberToSetRunAction extends AbstractLevel1RunAct private static final long serialVersionUID = 1L; public RedistributeSampleNumberToSetRunAction() { - super(RedistributeSampleNumberToSetAction.class, - Level1Step.REDISTRIBUTE_SAMPLE_SET_TO_SET); + super(RedistributeSampleNumberToSetAction.class, Level1Step.REDISTRIBUTE_SAMPLE_SET_TO_SET); } @Override - protected Map<String, Object> prepareResumeParameters( - RedistributeSampleNumberToSetAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = super.prepareResumeParameters( - action, - error, - startDate, - endDate - ); - + protected Map<String, Object> prepareResumeParameters(RedistributeSampleNumberToSetAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); parameters.put("tripDecorator", getDecorator(Trip.class, DecoratorService.WITH_ID)); parameters.put("activityDecorator", getDecorator(Activity.class)); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level1/StandardizeSampleMeasuresRunAction.java @@ -38,24 +38,13 @@ public class StandardizeSampleMeasuresRunAction extends AbstractLevel1RunAction< private static final long serialVersionUID = 1L; public StandardizeSampleMeasuresRunAction() { - super(StandardizeSampleMeasuresAction.class, - Level1Step.STANDARDIZE_SAMPLE_MEASURE); + super(StandardizeSampleMeasuresAction.class, Level1Step.STANDARDIZE_SAMPLE_MEASURE); } @Override - protected Map<String, Object> prepareResumeParameters( - StandardizeSampleMeasuresAction action, - Exception error, - Date startDate, - Date endDate) { - Map<String, Object> parameters = - super.prepareResumeParameters(action, - error, - startDate, - endDate - ); + protected Map<String, Object> prepareResumeParameters(StandardizeSampleMeasuresAction action, Exception error, Date startDate, Date endDate) { + Map<String, Object> parameters = super.prepareResumeParameters(action, error, startDate, endDate); parameters.put("speciesDecorator", getDecorator(Species.class)); - return parameters; } } ===================================== t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml ===================================== --- a/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml +++ b/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validateLevel1Configuration-validation.xml @@ -48,9 +48,10 @@ </field> - <field name="configuration.oceanId"> + <field name="configuration.oceanIds"> - <field-validator type="requiredstring"> + <field-validator type="fieldexpression"> + <param name="expression">!configuration.oceanIds.empty</param> <message key="t3.error.no.ocean.selected"/> </field-validator> ===================================== t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml ===================================== --- a/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml +++ b/t3-web/src/main/resources/fr/ird/t3/web/actions/data/level1/ManageLevel1ConfigurationAction-validation.xml @@ -48,7 +48,7 @@ </field> - <field name="configuration.oceanId"> + <field name="configuration.oceanIds"> <field-validator type="fieldexpression"> <param name="expression">!configuration.oceans.empty</param> ===================================== t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp ===================================== --- a/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp +++ b/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1Configuration.jsp @@ -56,8 +56,9 @@ list="fleets" template="mycheckboxlist"/> <%-- selected ocean --%> - <s:select key="configuration.oceanId" list="oceans" requiredLabel="true" - label='%{getText("t3.common.ocean")}'/> + <s:checkboxlist key="configuration.oceanIds" requiredLabel="true" + label='%{getText("t3.common.ocean")}' + list="oceans" template="mycheckboxlist"/> <%-- selected begin date --%> <sj:datepicker key="configuration.beginDate" requiredLabel="true" ===================================== t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp ===================================== --- a/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp +++ b/t3-web/src/main/webapp/WEB-INF/jsp/data/level1/level1ConfigurationResume.jsp @@ -45,8 +45,9 @@ label='%{getText("t3.common.fleetCountry")}'/> <%-- selected ocean --%> - <s:select key="configuration.oceanId" disabled="true" list="oceans" - label='%{getText("t3.common.ocean")}'/> + <s:checkboxlist key="configuration.oceanIds" disabled="true" + list="fleets" template="mycheckboxlist" + label='%{getText("t3.common.ocean")}'/> <%-- selected begin date --%> <s:textfield key="configuration.beginDate" disabled="true" View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/617f20756a9d8882034db2ed98e28a51… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/617f20756a9d8882034db2ed98e28a51… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0.4] Calcul des durées de calées pour les activités avec setcount > 1 (Closes #241)
by Tony CHEMIT 21 Feb '18

21 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 4072de7b by Tony CHEMIT at 2018-02-21T02:09:42+01:00 [N0.4] Calcul des durées de calées pour les activités avec setcount &gt; 1 (Closes #241) - - - - - 3 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java - t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties - t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java @@ -20,7 +20,6 @@ */ package fr.ird.t3.actions.data.level0; -import com.google.common.collect.Maps; import fr.ird.t3.entities.T3Functions; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.Trip; @@ -41,14 +40,14 @@ import org.nuiton.util.TimeLog; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import static org.nuiton.i18n.I18n.l; /** - * Compute for the all activities of selected trips, the set duration and the - * positive set count. + * Compute for the all activities of selected trips, the set duration and the positive set count. * <p/> - * <strong>Note:</strong> The rf2 msut have been computed on each trip. + * <strong>Note:</strong> The rf2 must have been computed on each trip. * * @author Tony Chemit - dev(a)tchemit.fr * @since 1.0 @@ -56,24 +55,21 @@ import static org.nuiton.i18n.I18n.l; public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0Action<ComputeSetDurationAndPositiveSetCountConfiguration> { /** Logger. */ - private static final Log log = LogFactory.getLog( - ComputeSetDurationAndPositiveSetCountAction.class); - + private static final Log log = LogFactory.getLog(ComputeSetDurationAndPositiveSetCountAction.class); @InjectDAO(entityType = SetDuration.class) - protected SetDurationTopiaDao setDurationDAO; - - /** Count of treated activites. */ - protected int nbActivities; + private SetDurationTopiaDao setDurationDAO; + /** Count of treated activities. */ + private int nbActivities; + /** Count of positive activities found. */ + private int nbPositiveActivities; /** Count of set (sum(a.setCount) on each activity trip). */ - protected int nbSet; - /** Count of positive activites found. */ - protected int nbPositiveActivities; + private int nbSet; /** * Cache of setDuration (improve a lot performance!). * * @since 1.3 */ - protected Map<String, SetDuration> setDurations; + private Map<String, SetDuration> setDurations; public ComputeSetDurationAndPositiveSetCountAction() { super(Level0Step.COMPUTE_SET_DURATION_AND_POSITIVE_SET_COUNT); @@ -98,8 +94,7 @@ public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0A for (Trip trip : tripList) { nbActivities += trip.sizeActivity(); } - - setDurations = Maps.newTreeMap(); + setDurations = new TreeMap<>(); } @Override @@ -108,177 +103,112 @@ public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0A } @Override - protected boolean executeAction() throws Exception { - + protected boolean executeAction() { boolean result = false; - if (CollectionUtils.isNotEmpty(trips)) { - setNbSteps(2 * nbActivities); - - // do action for each data using the prepared action context - for (Trip trip : trips) { - result |= executeForTrip(trip); } } - return result; } - protected boolean executeForTrip(Trip trip) throws TopiaException { - + private boolean executeForTrip(Trip trip) throws TopiaException { long s0 = TimeLog.getTime(); - String tripStr = decorate(trip, DecoratorService.WITH_ID); - - if (!trip.isActivityEmpty()) { - + if (trip.isActivityNotEmpty()) { int year = T3Functions.TRIP_TO_LANDING_YEAR.apply(trip); - Set<Species> species = trip.getElementaryCatchSpecies(); - for (Activity activity : trip.getActivity()) { + String activityStr = String.format("Activity %s - %s", tripStr, decorate(activity)); + int setCount = activity.getSetCount(); + nbSet += setCount; - String activityStr = "Activity " + tripStr + " - " + - decorate(activity); - - nbSet += activity.getSetCount(); - incrementsProgression(); - - float totalCatchesWeight = - activity.getElementaryCatchTotalWeightRf2(species); - + float totalCatchesWeight = activity.getElementaryCatchTotalWeightRf2(species); if (log.isDebugEnabled()) { - log.debug("Total catches " + totalCatchesWeight + - " for " + activityStr); + log.debug(String.format("Total catches %s for %s", totalCatchesWeight, activityStr)); } + int positiveSetCount = computePositiveSetCount(totalCatchesWeight > 0, activity); + activity.setPositiveSetCount(positiveSetCount); + if (positiveSetCount > 0) { + nbPositiveActivities++; + } + incrementsProgression(); - computePositiveSetCount(activityStr, totalCatchesWeight, activity); - + float subCatch = totalCatchesWeight; + if (positiveSetCount > 0) { + subCatch = subCatch / activity.getPositiveSetCount(); + } + int negativeSetCount = setCount - positiveSetCount; + Float setDuration = computeSetDuration(year, subCatch, activity, negativeSetCount); + activity.setSetDuration(setDuration); incrementsProgression(); - computeSetDuration(year, - totalCatchesWeight, activity); String message = l(locale, "t3.level0.computeActivitySetDurationAndPositiveSetCount", - activityStr, - activity.getSetDuration(), - activity.getPositiveSetCount() - ); + activityStr, setDuration, positiveSetCount, negativeSetCount); addInfoMessage(message); if (log.isDebugEnabled()) { log.debug(message); } } } - markTripAsTreated(trip); - getTimeLog().log(s0, "executeForTrip for " + tripStr); - // always commit since trip is always modified return true; } - protected void computePositiveSetCount(String activityStr, - float totalCatchesWeight, - Activity activity) { - - int positiveSetCount = 0; - - if (totalCatchesWeight > 0) { - - // ok some catches found on activity, it means - // positive set - - positiveSetCount = activity.getSetCount(); - - } else { - if (log.isDebugEnabled()) { - log.debug("Catches with no catches! for " + activityStr); - } - } - - if (log.isDebugEnabled()) { - String message = "Computed positive Set Count = " + - positiveSetCount + " for " + activityStr; - log.debug(message); - } - activity.setPositiveSetCount(positiveSetCount); - - if (positiveSetCount > 0) { - nbPositiveActivities++; + private int computePositiveSetCount(boolean withCatches, Activity activity) { + if (withCatches) { + // ok some catches found on activity, it means positive set + return activity.getSetCount(); } + return 0; } - protected void computeSetDuration(int year, - float totalCatchesWeight, - Activity activity) throws TopiaException { - + private Float computeSetDuration(int year, float subCatch, Activity activity, int negativeSetCount) throws TopiaException { // get the correct setDuration SetDuration setDuration = getSetDuration(activity, year); - if (setDuration == null) { - - activity.setSetDuration(0f); - - } else { - - Float setTime; - - if (activity.isSetNull()) { - - // use setDuration nullSetValue - setTime = setDuration.getNullSetValue(); - if (log.isDebugEnabled()) { - log.debug("Computed set duration (set is null) = " + - setTime); - } - } else if (activity.isWithSetDuration()) { - - // use setDuration computedValue - setTime = setDuration.getParameterB() + - setDuration.getParameterA() * totalCatchesWeight; - if (log.isDebugEnabled()) { - log.debug("Computed set duration = " + setTime); - } - } else { - - // no setDuration - setTime = null; - if (log.isDebugEnabled()) { - log.debug("Use null set duration (set is null) "); - } + if (log.isDebugEnabled()) { + log.debug("No setDuration found, use 0 value."); } - - activity.setSetDuration(setTime); + return 0f; + } + float nullSetDuration = negativeSetCount * setDuration.getNullSetValue(); + if (activity.isSetNull()) { + if (log.isDebugEnabled()) { + log.debug(String.format("Use nullValue of set duration = %s", nullSetDuration)); + } + return nullSetDuration; + } + if (activity.isWithSetDuration()) { + float subDuration = (setDuration.getParameterB() + setDuration.getParameterA() * subCatch); + float positiveSetDuration = activity.getPositiveSetCount() * subDuration; + if (log.isDebugEnabled()) { + log.debug(String.format("Computed positive set duration = %s", positiveSetDuration)); + } + return nullSetDuration + positiveSetDuration; + } + // no setDuration + if (log.isDebugEnabled()) { + log.debug("Use null set duration (set is null) "); } + return null; } - protected SetDuration getSetDuration(Activity activity, int year) throws TopiaException { + private SetDuration getSetDuration(Activity activity, int year) throws TopiaException { Ocean ocean = activity.getOcean(); Country fleetCountry = activity.getTrip().getVessel().getFleetCountry(); SchoolType schoolType = activity.getSchoolType(); - String key = ocean.getCode() + ":" + - fleetCountry.getCode() + ":" + - schoolType.getCode() + ":" + - year; - + String key = ocean.getCode() + ":" + fleetCountry.getCode() + ":" + schoolType.getCode() + ":" + year; SetDuration result = setDurations.get(key); if (result == null) { - // no result found in cache - if (!setDurations.containsKey(key)) { - // try to load it - - result = setDurationDAO.findByActivityAndYear( - activity, - year - ); - + result = setDurationDAO.findByActivityAndYear(activity, year); if (result == null) { addWarningMessage( l(getLocale(), "t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound", @@ -288,11 +218,9 @@ public class ComputeSetDurationAndPositiveSetCountAction extends AbstractLevel0A year)); } } - // store it once for all (even if result is null) setDurations.put(key, result); } - return result; } ===================================== t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties @@ -18,7 +18,7 @@ t3.import.warning.on.analyze=%s warnings detected on analyze import db t3.input.AnalyzeInputSource=Data Import\: Analyze t3.input.ImportInputSource=Input Data Import t3.level0.action=Level 0 Operation\: %s -t3.level0.computeActivitySetDurationAndPositiveSetCount=%s, set duration\: %s, positiveSetCount\: %s +t3.level0.computeActivitySetDurationAndPositiveSetCount=%s, set duration\: %s, positiveSetCount\: %s, negativeSetCount \: %s t3.level0.computeRF1.complete.trips.to.use.for.vessel=Found %s complete trip(s) for vessel %s t3.level0.computeRF1.resume.for.complete.trip=Total catches weight %s / Total landing weight %s / Total local market weight %s / Detailled total local market weight %s / RF1 \= %s t3.level0.computeRF1.resume.for.trip=Trip %s, Total catches weight %s / Total landing weight %s / Total local market weight %s / Detailled total local market weight %s ===================================== t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties @@ -18,7 +18,7 @@ t3.import.warning.on.analyze=%s avertissements détectées lors de l'analyse de t3.input.AnalyzeInputSource=Import de données \: Analyse des données t3.input.ImportInputSource=Import de données t3.level0.action=Opération du niveau 0 \: %s -t3.level0.computeActivitySetDurationAndPositiveSetCount=%s, durée de calée \: %s, positiveSetCount \: %s +t3.level0.computeActivitySetDurationAndPositiveSetCount=%s, durée de calée \: %s, positiveSetCount \: %s, negativeSetCount \: %s t3.level0.computeRF1.complete.trips.to.use.for.vessel=%s marée(s) complète(s) trouvées pour le navire %s t3.level0.computeRF1.resume.for.complete.trip=Poids total capturé %s / Poids total vendu %s / Poids marché local résumé %s / Poids marché local détaillé %s / RF1 \= %s t3.level0.computeRF1.resume.for.trip=Marée %s, Poids total capturé %s / Poids total vendu %s / Poids marché local résumé %s / Poids marché local détaillé %s View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/4072de7b084af636430951ea39172719… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/4072de7b084af636430951ea39172719… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] 26 commits: [REFERENTIEL] Rajouter des champs de traduction (See #245)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 7768109b by Tony CHEMIT at 2018-02-21T00:23:45+01:00 [REFERENTIEL] Rajouter des champs de traduction (See #245) - - - - - 739d78af by Tony CHEMIT at 2018-02-21T00:23:47+01:00 L&#39;importeur plante si les coordonnées d&#39;un port sont à NULL (See #258) - - - - - d85f0d93 by Tony CHEMIT at 2018-02-21T00:23:47+01:00 generate bundle for main application - - - - - 7d705348 by Tony CHEMIT at 2018-02-21T00:23:47+01:00 move some pom conf - - - - - ef991d25 by Tony CHEMIT at 2018-02-21T00:23:47+01:00 Améliorations dans la gestion des profils utilisateurs (See #251) - - - - - db020e61 by Tony CHEMIT at 2018-02-21T00:23:47+01:00 [LOGS] Erreur d&#39;affichage sur le log du RF1 (See #246) - - - - - 0d6eedfa by Tony CHEMIT at 2018-02-21T00:23:48+01:00 [N0.4][LOG] Calcul du nombre de calées et durée des calées - Petite erreur dans le log (See #160) - - - - - 87ba2424 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 [LOGS] Inversion de libellé dans le log d&#39;import AVDTH (See #247) - - - - - 98f0052d by Tony CHEMIT at 2018-02-21T00:23:48+01:00 Ordonnacement du traitement de marées au 1.4 (distribution des échantillons sur les calées de l&#39;échantillon) (See #259) - - - - - b1f3d41d by Tony CHEMIT at 2018-02-21T00:23:48+01:00 Erreur de libellé dans le log N0.1 (calcul des RF1) (See #270) - - - - - 389c4eb7 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 Amélioration du log du RF1 (N0.1) (See #2171) - - - - - 15bc0636 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 reformat code - - - - - 14ce5598 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 Probleme de calcul de rf1 (See #283) - - - - - 318b2b93 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 [WIN] Windows/Mauvais affichage des caractères accentués dans le navigateur (See #154) - - - - - 780318bf by Tony CHEMIT at 2018-02-21T00:23:48+01:00 use auto-service - - - - - aa86a809 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 Améliorations dans la gestion des profils utilisateurs (Pour la création on deamdne aussi une confirmation du mot de passe) (See #251) - - - - - 8c1d0a5e by Tony CHEMIT at 2018-02-21T00:23:48+01:00 improve configurations (for migration purpose) - - - - - 6f6dcf51 by Tony CHEMIT at 2018-02-21T00:23:48+01:00 fix migrations + add a test for migraiton - - - - - 6e537254 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 Let&#39;s go to version 2.1 - - - - - 893ac656 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 Use ird-t3-data 1.2 - - - - - 1266f890 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 [N0] Marée Echantillons seulement et gestion de l&#39;UI du N0 (Closes #85) - - - - - 8f5d5139 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 let&#39;s use a password, otherwise can&#39;t open test db in IDEA, what a shame... - - - - - cafd70e9 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 Improve persistences tests - - - - - 8cea3365 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 9a005089 by Tony CHEMIT at 2018-02-21T00:23:49+01:00 [N0] Marée Echantillons seulement et gestion de l&#39;UI du N0 (See #85) - - - - - e35842a5 by Tony CHEMIT at 2018-02-21T00:57:02+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 30 changed files: - CONTRIBUTING.md - pom.xml - t3-actions/pom.xml - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeRF1Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeRF2Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeWellPlanWeightCategoriesProportionsAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ConvertCatchesWeightCategoriesAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/AbstractLevel1Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSampleSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ConvertSetSpeciesFrequencyToWeightAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredAction.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level3/L3SampleStratumLoader.java - t3-actions/src/main/java/fr/ird/t3/actions/io/input/ImportInputSourceAction.java - t3-actions/src/main/resources/ftl/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction.ftl - t3-actions/src/main/resources/ftl/fr/ird/t3/actions/data/level0/ComputeSetDurationAndPositiveSetCountAction_en.ftl - t3-actions/src/main/resources/ftl/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction.ftl - t3-actions/src/main/resources/ftl/fr/ird/t3/actions/data/level1/RedistributeSampleNumberToSetAction_en.ftl - t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties - t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties - t3-actions/src/test/java/fr/ird/t3/actions/AbstractActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level0/ConvertCatchesWeightCategoriesActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/AbstractLevel1ActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/ExtrapolateSampleCountedAndMeasuredActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level1/StandardizeSampleMeasuresActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level2/Level2ActionResumeTest.java - t3-actions/src/test/java/fr/ird/t3/actions/data/level3/Level3ActionResumeTest.java - t3-domain/pom.xml The diff was not included because it is too large. View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/compare/0c634be4613a78a9b21ebc1b8b53e5b… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/compare/0c634be4613a78a9b21ebc1b8b53e5b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0] Calcul des temps de pêche (See #240)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 0c634be4 by Tony CHEMIT at 2018-02-21T00:11:54+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 7 changed files: - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_1.java - − t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql → t3-domain/src/main/resources/db/migration/V2_1_07_add-Route-table.sql - t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql → t3-domain/src/main/resources/db/migration/V2_1_08_remove-Trip-fields.sql - t3-domain/src/main/xmi/t3-persistence.properties - t3-domain/src/main/xmi/t3-persistence.zargo Changes: ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -59,6 +59,17 @@ public class ActivityImpl extends ActivityAbstract { ); protected Integer quadrant; + private transient Date date; + + @Override + public Date getDate() { + return date != null ? date : getRoute().getDate(); + } + + @Override + public void setDate(Date date) { + this.date = date; + } @Override public Trip getTrip() { ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_1.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_1.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_1.java @@ -22,12 +22,24 @@ package fr.ird.t3.services.migration; */ import com.google.auto.service.AutoService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG; import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; import org.nuiton.topia.persistence.support.TopiaSqlSupport; +import org.nuiton.util.DateUtil; import org.nuiton.version.Versions; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * Created by tchemit on 18/02/2018. @@ -37,6 +49,8 @@ import java.util.List; @AutoService(TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion.class) public class T3MigrationCallbackV2_1 extends T3MigrationCallbackSupport { + private static final Log log = LogFactory.getLog(T3MigrationCallbackV2_1.class); + public T3MigrationCallbackV2_1() { super(Versions.valueOf("2.1")); } @@ -49,6 +63,76 @@ public class T3MigrationCallbackV2_1 extends T3MigrationCallbackSupport { addScript("04", "rename-SampleWell-table", queries); addScript("05", "rename-SampleSpecies-fields", queries); addScript("06", "referential-i18n", queries); + addScript("07", "add-Route-table", queries); + + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<String> tripList = sqlSupport.findMultipleResult(new TopiaSqlQuery<String>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + return connection.prepareStatement("SELECT DISTINCT(a.trip) FROM activity a"); + } + + @Override + public String prepareResult(ResultSet set) throws SQLException { + return set.getString(1); + } + }); + + for (String tripId : tripList) { + + int i = tripId.indexOf('#'); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1).replace(".", "").replace("#", "") + "#"; + + log.info("Route prefix: " + routeIdPrefix); + List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ? ORDER BY date"); + preparedStatement.setString(1, tripId); + return preparedStatement; + } + + @Override + public TripActivity prepareResult(ResultSet set) throws SQLException { + return new TripActivity(set.getString(1), set.getDate(2)); + } + }); + + int activityIndex = 0; + Set<Date> days = new LinkedHashSet<>(); + for (TripActivity activity : activityList) { + + String dayDateStr = df.format(activity.date); + String routeId = routeIdPrefix + dayDateStr.replaceAll("-", ""); + + if (days.add(activity.date)) { + + log.info(String.format("[%s] new Route: %s", tripId, routeId)); + activityIndex = 0; + queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size() - 1, dayDateStr)); + } + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, activityIndex++, activity.activity)); + } + + if (!activityList.isEmpty()) { + queries.add(String.format("UPDATE Trip SET effortComputed = false, topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", tripId)); + } + } + + addScript("08", "remove-Trip-fields", queries); } + + private static class TripActivity { + + private final String activity; + private final Date date; + + private TripActivity(String activity, Date date) { + this.activity = activity; + this.date = DateUtil.getDay(date); + } + } } ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java deleted ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java +++ /dev/null @@ -1,133 +0,0 @@ -package fr.ird.t3.services.migration; - -/* - * #%L - * T3 :: Domain - * %% - * Copyright (C) 2010 - 2017 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.google.auto.service.AutoService; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; -import org.nuiton.topia.persistence.support.TopiaSqlSupport; -import org.nuiton.util.DateUtil; -import org.nuiton.version.Versions; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -/** - * Created by tchemit on 18/02/2018. - * - * @author Tony Chemit - dev(a)tchemit.fr - */ -@AutoService(TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion.class) -public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { - - private static final Log log = LogFactory.getLog(T3MigrationCallbackV2_2.class); - - public T3MigrationCallbackV2_2() { - super(Versions.valueOf("2.2")); - } - - @Override - protected void prepareMigrationScript(TopiaSqlSupport sqlSupport, List<String> queries, boolean showSql, boolean showProgression) throws TopiaException { - addScript("07", "add-Route-table", queries); - - - SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - - List<String> tripList = sqlSupport.findMultipleResult(new TopiaSqlQuery<String>() { - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - return connection.prepareStatement("SELECT DISTINCT(a.trip) FROM activity a"); - } - - @Override - public String prepareResult(ResultSet set) throws SQLException { - return set.getString(1); - } - }); - - for (String tripId : tripList) { - - int i = tripId.indexOf('#'); - String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); - - log.info("Route prefix: " + routeIdPrefix); - List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); - preparedStatement.setString(1, tripId); - return preparedStatement; - } - - @Override - public TripActivity prepareResult(ResultSet set) throws SQLException { - return new TripActivity(set.getString(1), set.getDate(2)); - } - }); - - - Set<Date> days = new LinkedHashSet<>(); - int activityIndex = 0; - for (TripActivity activity : activityList) { - - String dayDateStr = df.format(activity.date); - String routeId = routeIdPrefix + dayDateStr.replaceAll("-", ""); - - if (days.add(activity.date)) { - - log.info(String.format("[%s] new Route: %s", tripId, routeId)); - // create new route - queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size() - 1, dayDateStr)); - } - queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); - } - - if (!activityList.isEmpty()) { - queries.add(String.format("UPDATE Trip SET effortComputed = false, topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", tripId)); - } - } - - addScript("08", "remove-Trip-fields", queries); - } - - private static class TripActivity { - - private final String activity; - private final Date date; - - private TripActivity(String activity, Date date) { - this.activity = activity; - this.date = DateUtil.getDay(date); - } - } - -} ===================================== t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql → t3-domain/src/main/resources/db/migration/V2_1_07_add-Route-table.sql ===================================== ===================================== t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql → t3-domain/src/main/resources/db/migration/V2_1_08_remove-Trip-fields.sql ===================================== ===================================== t3-domain/src/main/xmi/t3-persistence.properties ===================================== --- a/t3-domain/src/main/xmi/t3-persistence.properties +++ b/t3-domain/src/main/xmi/t3-persistence.properties @@ -22,7 +22,7 @@ model.tagValue.notGenerateToString=true model.tagValue.generateOperatorForDAOHelper=true model.tagValue.constantPrefix=PROPERTY_ -model.tagValue.version=2.2 +model.tagValue.version=2.1 model.tagValue.indexForeignKeys=true fr.ird.t3.entities.data.Trip.attribute.route.stereotype=ordered ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/0c634be4613a78a9b21ebc1b8b53e5b5… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/0c634be4613a78a9b21ebc1b8b53e5b5… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0] Calcul des temps de pêche (See #240)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: ef5344b6 by Tony CHEMIT at 2018-02-21T00:05:08+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 3 changed files: - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - t3-domain/src/main/xmi/t3-persistence.zargo Changes: ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -59,6 +59,17 @@ public class ActivityImpl extends ActivityAbstract { ); protected Integer quadrant; + private transient Date date; + + @Override + public Date getDate() { + return date != null ? date : getRoute().getDate(); + } + + @Override + public void setDate(Date date) { + this.date = date; + } @Override public Trip getTrip() { ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java @@ -77,13 +77,13 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { for (String tripId : tripList) { int i = tripId.indexOf('#'); - String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1).replace(".", "").replace("#", "") + "#"; log.info("Route prefix: " + routeIdPrefix); List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { @Override public PreparedStatement prepareQuery(Connection connection) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ? ORDER BY date"); preparedStatement.setString(1, tripId); return preparedStatement; } @@ -94,9 +94,8 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { } }); - - Set<Date> days = new LinkedHashSet<>(); int activityIndex = 0; + Set<Date> days = new LinkedHashSet<>(); for (TripActivity activity : activityList) { String dayDateStr = df.format(activity.date); @@ -105,10 +104,10 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { if (days.add(activity.date)) { log.info(String.format("[%s] new Route: %s", tripId, routeId)); - // create new route + activityIndex = 0; queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size() - 1, dayDateStr)); } - queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, activityIndex++, activity.activity)); } if (!activityList.isEmpty()) { ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/ef5344b6cf1d59efc1ca7e6d4a748231… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/ef5344b6cf1d59efc1ca7e6d4a748231… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] 2 commits: [N0] Marée Echantillons seulement et gestion de l'UI du N0 (See #85)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 08a664fc by Tony CHEMIT at 2018-02-20T23:38:41+01:00 [N0] Marée Echantillons seulement et gestion de l&#39;UI du N0 (See #85) - - - - - 5b736ba8 by Tony CHEMIT at 2018-02-21T00:03:08+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 12 changed files: - t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/data/ComputedDataHelper.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - t3-domain/src/main/xmi/t3-persistence.zargo - t3-domain/src/test/java/fr/ird/t3/entities/data/TripTopiaDaoTest.java - t3-domain/src/test/java/fr/ird/t3/entities/reference/CountryTopiaDaoTest.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level0/AbstractLevel0ConfigureAction.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level2/ConfigureLevel2Step1Action.java - t3-web/src/main/java/fr/ird/t3/web/actions/data/level3/ConfigureLevel3Step1Action.java - t3-web/src/main/java/fr/ird/t3/web/actions/io/output/ExportConfigureAction.java Changes: ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java @@ -42,6 +42,13 @@ import fr.ird.t3.entities.reference.Vessel; import fr.ird.t3.entities.type.T3Date; import fr.ird.t3.entities.type.T3Point; import fr.ird.t3.entities.type.T3PointImpl; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; + import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; @@ -53,12 +60,6 @@ import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Set; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.tuple.MutablePair; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; /** * Client implementation of the Trip dao. @@ -214,8 +215,8 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< } public List<Integer> findAllYearsUsedInTrip() throws TopiaException { - T3Date minDate = getFirstLandingDate(); - T3Date maxDate = getLastLandingDate(); + T3Date minDate = getFirstLandingDate(null); + T3Date maxDate = getLastLandingDate(null); int minYear = minDate.getYear(); int maxYear = maxDate.getYear(); Set<Integer> years = Sets.newHashSet(); @@ -227,9 +228,10 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< return result; } - public T3Date getFirstLandingDate() throws TopiaException { + public T3Date getFirstLandingDate(Boolean samplesOnly) throws TopiaException { - String hql = " SELECT min(t.landingDate) FROM TripImpl t"; + String samplesOnlyFilter = samplesOnly == null ? "" : (" WHERE t.samplesOnly = " + samplesOnly); + String hql = " SELECT min(t.landingDate) FROM TripImpl t" + samplesOnlyFilter; Date date = findAnyOrNull(hql); // Date date = (Date) createQuery(). // executeToObject(getContext(), @@ -243,9 +245,10 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< return result; } - public T3Date getLastLandingDate() throws TopiaException { + public T3Date getLastLandingDate(Boolean samplesOnly) throws TopiaException { - String hql = " SELECT max(t.landingDate) FROM TripImpl t"; + String samplesOnlyFilter = samplesOnly == null ? "" : (" WHERE t.samplesOnly = " + samplesOnly); + String hql = " SELECT max(t.landingDate) FROM TripImpl t" + samplesOnlyFilter; Date date = findAnyOrNull(hql); // Date date = (Date) createQuery(). ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -59,6 +59,17 @@ public class ActivityImpl extends ActivityAbstract { ); protected Integer quadrant; + private transient Date date; + + @Override + public Date getDate() { + return date != null ? date : getRoute().getDate(); + } + + @Override + public void setDate(Date date) { + this.date = date; + } @Override public Trip getTrip() { ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ComputedDataHelper.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ComputedDataHelper.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ComputedDataHelper.java @@ -53,6 +53,9 @@ public class ComputedDataHelper { public static <E extends ComputedDataAware> void deleteComputedDataLevel0(Collection<E> entities) { if (CollectionUtils.isNotEmpty(entities)) { for (E entity : entities) { + if (entity==null) { + continue; + } entity.deleteComputedDataLevel0(); } } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java @@ -25,10 +25,11 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import fr.ird.t3.entities.T3Functions; import fr.ird.t3.entities.data.Trip; +import org.nuiton.topia.persistence.TopiaException; + import java.util.Collection; import java.util.HashSet; import java.util.Set; -import org.nuiton.topia.persistence.TopiaException; /** * {@link Country} user dao operations. @@ -41,14 +42,14 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry /** * Obtains all countries used as fleet for any trip in the database. * + * @param samplesOnly if null no filter else filter on value * @return the set of fleet countries used by any trip in the database * @throws TopiaException if any problem while querying the database */ - public Set<E> findAllFleetUsedInTrip() throws TopiaException { + public Set<E> findAllFleetUsedInTrip(Boolean samplesOnly) throws TopiaException { - String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t " + - "WHERE t.vessel.fleetCountry = c.id"; + String samplesOnlyFilter = samplesOnly == null ? "" : (" AND t.samplesOnly = " + samplesOnly); + String hql = "SELECT DISTINCT(c) FROM CountryImpl c, TripImpl t WHERE t.vessel.fleetCountry = c.id" + samplesOnlyFilter; // TopiaQuery query = createQuery("c") // .addFrom(Trip.class, "t") ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java @@ -77,13 +77,13 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { for (String tripId : tripList) { int i = tripId.indexOf('#'); - String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1).replace(".", "").replace("#", "") + "#"; log.info("Route prefix: " + routeIdPrefix); List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { @Override public PreparedStatement prepareQuery(Connection connection) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ? ORDER BY date"); preparedStatement.setString(1, tripId); return preparedStatement; } @@ -94,9 +94,8 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { } }); - - Set<Date> days = new LinkedHashSet<>(); int activityIndex = 0; + Set<Date> days = new LinkedHashSet<>(); for (TripActivity activity : activityList) { String dayDateStr = df.format(activity.date); @@ -105,10 +104,10 @@ public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { if (days.add(activity.date)) { log.info(String.format("[%s] new Route: %s", tripId, routeId)); - // create new route + activityIndex = 0; queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size() - 1, dayDateStr)); } - queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, activityIndex++, activity.activity)); } if (!activityList.isEmpty()) { ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ ===================================== t3-domain/src/test/java/fr/ird/t3/entities/data/TripTopiaDaoTest.java ===================================== --- a/t3-domain/src/test/java/fr/ird/t3/entities/data/TripTopiaDaoTest.java +++ b/t3-domain/src/test/java/fr/ird/t3/entities/data/TripTopiaDaoTest.java @@ -101,13 +101,13 @@ public class TripTopiaDaoTest extends AbstractDatabaseTest { T3PersistenceFixtures.newTrip(tx, 1, endDate.toBeginDate()); - result = dao.getFirstLandingDate(); + result = dao.getFirstLandingDate(null); Assert.assertNotNull(result); Assert.assertEquals(endDate, result); T3PersistenceFixtures.newTrip(tx, 0, startDate.toBeginDate()); - result = dao.getFirstLandingDate(); + result = dao.getFirstLandingDate(null); Assert.assertNotNull(result); Assert.assertEquals(startDate, result); } @@ -122,13 +122,13 @@ public class TripTopiaDaoTest extends AbstractDatabaseTest { T3PersistenceFixtures.newTrip(tx, 0, startDate.toBeginDate()); - result = dao.getLastLandingDate(); + result = dao.getLastLandingDate(null); Assert.assertNotNull(result); Assert.assertEquals(startDate, result); T3PersistenceFixtures.newTrip(tx, 1, endDate.toBeginDate()); - result = dao.getLastLandingDate(); + result = dao.getLastLandingDate(null); Assert.assertNotNull(result); Assert.assertEquals(endDate, result); } ===================================== t3-domain/src/test/java/fr/ird/t3/entities/reference/CountryTopiaDaoTest.java ===================================== --- a/t3-domain/src/test/java/fr/ird/t3/entities/reference/CountryTopiaDaoTest.java +++ b/t3-domain/src/test/java/fr/ird/t3/entities/reference/CountryTopiaDaoTest.java @@ -63,7 +63,7 @@ public class CountryTopiaDaoTest extends AbstractDatabaseTest { T3PersistenceFixtures.newTrip(tx, vessel); - Set<Country> result = tx.getCountryDao().findAllFleetUsedInTrip(); + Set<Country> result = tx.getCountryDao().findAllFleetUsedInTrip(null); Assert.assertNotNull(result); Assert.assertEquals(1, result.size()); Assert.assertEquals(country, result.iterator().next()); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level0/AbstractLevel0ConfigureAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level0/AbstractLevel0ConfigureAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level0/AbstractLevel0ConfigureAction.java @@ -67,7 +67,7 @@ public abstract class AbstractLevel0ConfigureAction<C extends AbstractLevel0Conf @InjectDecoratedBeans(beanType = VesselSimpleType.class) protected Map<String, String> vesselSimpleTypes; - @InjectDecoratedBeans(beanType = Country.class, pathIds = "configuration.") + @InjectDecoratedBeans(beanType = Country.class) protected Map<String, String> fleets; protected AbstractLevel0ConfigureAction(Class<C> configurationType) { @@ -99,7 +99,7 @@ public abstract class AbstractLevel0ConfigureAction<C extends AbstractLevel0Conf injectOnly(InjectDecoratedBeans.class); } - public final String prepareConfiguration() throws Exception { + public final String prepareConfiguration() { if (!isConfigurationInSession() && !hasFieldErrors()) { @@ -110,7 +110,7 @@ public abstract class AbstractLevel0ConfigureAction<C extends AbstractLevel0Conf } @Override - public final String execute() throws Exception { + public final String execute() { // init action context in session prepareActionContext(); @@ -136,14 +136,14 @@ public abstract class AbstractLevel0ConfigureAction<C extends AbstractLevel0Conf */ protected void loadDefaultConfiguration(C config) throws TopiaException { - T3Date minDate = tripDAO.getFirstLandingDate(); + T3Date minDate = tripDAO.getFirstLandingDate(false); config.setMinDate(minDate); config.setBeginDate(minDate); - T3Date maxDate = tripDAO.getLastLandingDate(); + T3Date maxDate = tripDAO.getLastLandingDate(false); config.setMaxDate(maxDate); config.setEndDate(maxDate); config.setVesselSimpleTypes(sortToList(vesselSimpleTypeDAO.findAllUsedInTrip(false))); - config.setFleets(sortToList(countryDAO.findAllFleetUsedInTrip())); + config.setFleets(sortToList(countryDAO.findAllFleetUsedInTrip(false))); if (log.isInfoEnabled()) { log.info("beginDate : " + config.getBeginDate()); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level2/ConfigureLevel2Step1Action.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level2/ConfigureLevel2Step1Action.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level2/ConfigureLevel2Step1Action.java @@ -201,8 +201,8 @@ public class ConfigureLevel2Step1Action extends AbstractConfigureAction<Level2Co conf.setTimeStep(3); // use first and last landing date - T3Date firstLandingDate = tripDAO.getFirstLandingDate(); - T3Date lastLandingDate = tripDAO.getLastLandingDate(); + T3Date firstLandingDate = tripDAO.getFirstLandingDate(null); + T3Date lastLandingDate = tripDAO.getLastLandingDate(null); conf.setMinDate(firstLandingDate); conf.setBeginDate(firstLandingDate); conf.setMaxDate(lastLandingDate); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/data/level3/ConfigureLevel3Step1Action.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/data/level3/ConfigureLevel3Step1Action.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/data/level3/ConfigureLevel3Step1Action.java @@ -196,8 +196,8 @@ public class ConfigureLevel3Step1Action extends AbstractConfigureAction<Level3Co conf.setTimeStep(3); // use first and last landing date - T3Date firstLandingDate = tripDAO.getFirstLandingDate(); - T3Date lastLandingDate = tripDAO.getLastLandingDate(); + T3Date firstLandingDate = tripDAO.getFirstLandingDate(null); + T3Date lastLandingDate = tripDAO.getLastLandingDate(null); conf.setMinDate(firstLandingDate); conf.setBeginDate(firstLandingDate); conf.setMaxDate(lastLandingDate); ===================================== t3-web/src/main/java/fr/ird/t3/web/actions/io/output/ExportConfigureAction.java ===================================== --- a/t3-web/src/main/java/fr/ird/t3/web/actions/io/output/ExportConfigureAction.java +++ b/t3-web/src/main/java/fr/ird/t3/web/actions/io/output/ExportConfigureAction.java @@ -135,15 +135,15 @@ public class ExportConfigureAction extends AbstractConfigureAction<ExportConfigu // grab data and store once for all in configuration - T3Date beginDate = tripDAO.getFirstLandingDate(); + T3Date beginDate = tripDAO.getFirstLandingDate(null); conf.setMinDate(beginDate); conf.setBeginDate(beginDate); - T3Date endDate = tripDAO.getLastLandingDate(); + T3Date endDate = tripDAO.getLastLandingDate(null); conf.setMaxDate(endDate); conf.setEndDate(endDate); - conf.setFleets(sortToList(countryDAO.findAllFleetUsedInTrip())); + conf.setFleets(sortToList(countryDAO.findAllFleetUsedInTrip(null))); conf.setOceans(sortToList(oceanDAO.findAllUsedInActivity())); View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/compare/26e69f3c92f5a91d63b77a44b57598b… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/compare/26e69f3c92f5a91d63b77a44b57598b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0] Calcul des temps de pêche (See #240)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 26e69f3c by Tony CHEMIT at 2018-02-20T22:56:38+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 27 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java - t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties - t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties - + t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - + t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java - + t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - + t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql - + t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql - t3-domain/src/main/xmi/t3-persistence.properties - t3-domain/src/main/xmi/t3-persistence.zargo - t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java - t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java - t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java - t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java @@ -21,6 +21,8 @@ package fr.ird.t3.actions.data.level0; import fr.ird.t3.actions.T3Action; +import fr.ird.t3.entities.data.Route; +import fr.ird.t3.entities.data.RouteTopiaDao; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.TripTopiaDao; import fr.ird.t3.entities.reference.Country; @@ -54,6 +56,9 @@ public abstract class AbstractLevel0Action<C extends AbstractLevel0Configuration @InjectDAO(entityType = Trip.class) protected TripTopiaDao tripDAO; + @InjectDAO(entityType = Route.class) + protected RouteTopiaDao routeDAO; + @InjectEntitiesById(entityType = Country.class) protected List<Country> fleets; ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java @@ -8,12 +8,12 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% @@ -22,26 +22,21 @@ package fr.ird.t3.actions.data.level0; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; import com.web_tomorrow.utils.suntimes.SunTimes; import fr.ird.t3.entities.data.Activity; -import fr.ird.t3.entities.data.ActivityTopiaDao; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.DateUtil; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Objects; import static org.nuiton.i18n.I18n.l; @@ -56,22 +51,20 @@ import static org.nuiton.i18n.I18n.l; */ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEffortsConfiguration> { - /** Logger. */ - private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); - /** * Les codes des activités surlequel on ne calcule pas d'effort de pêche. * * @since 2.0 */ - protected static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( + private static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( 4, // route sans veille 7, // avarie 8, // à la cape 10, // en attente 15 // au port ); - + /** Logger. */ + private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); protected float totalTimeAtSeaN0; protected float totalFishingTimeN0; @@ -127,146 +120,110 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf return result; } - protected boolean executeForTrip(Trip trip) throws TopiaException { + private boolean executeForTrip(Trip trip) throws TopiaException { // compute time at sea - float timeAtSea = computeTimeAtSea(trip); - totalTimeAtSeaN0 += timeAtSea; - - trip.setComputedTimeAtSeaN0(timeAtSea); - incrementsProgression(); - - // compute fishing time - float fishingTime = computeFishingTime(trip); - totalFishingTimeN0 += fishingTime; - trip.setComputedFishingTimeN0(fishingTime); - incrementsProgression(); - - // compute search time - float searchTime = computeTripSearchTime(trip, fishingTime); - totalSearchTimeN0 += searchTime; - trip.setComputedSearchTimeN0(searchTime); - - incrementsProgression(); - - String message = l(locale, "t3.level0.computeTripEffort", - decorate(trip), - trip.getComputedTimeAtSeaN0(), - trip.getComputedFishingTimeN0(), - trip.getComputedSearchTimeN0() - ); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } - markTripAsTreated(trip); - return true; - } - - protected float computeTimeAtSea(Trip trip) { - float setTimeAtSea; + Route firstRoute = Objects.requireNonNull(trip.getRoute().get(0)); + Route lastRoute = Objects.requireNonNull(Iterables.getLast(trip.getRoute())); - // date depart - date dpq = nb jours - // result = nb heures entre le départ et l'arrivée - Calendar calendarDep = DateUtils.toCalendar(trip.getDepartureDate()); - calendarDep.set(Calendar.MINUTE, 0); - calendarDep.set(Calendar.SECOND, 0); - calendarDep.set(Calendar.MILLISECOND, 0); - Calendar calendarLanding = DateUtils.toCalendar(trip.getLandingDate()); - calendarLanding.set(Calendar.MINUTE, 0); - calendarLanding.set(Calendar.SECOND, 0); - calendarLanding.set(Calendar.MILLISECOND, 0); + for (Route route : trip.getRoute()) { - int months = DateUtil.getDifferenceInHours(calendarDep.getTime(), calendarLanding.getTime()); - setTimeAtSea = months; +// float timeAtSea = computeTimeAtSea(route); +// totalTimeAtSeaN0 += timeAtSea; + totalTimeAtSeaN0 += 24; - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " : time at sea = " + setTimeAtSea); - } - return setTimeAtSea; - } - - protected float computeFishingTime(Trip trip) throws TopiaException { - - float setFishingTime = 0; +// route.setComputedTimeAtSeaN0(timeAtSea); +// incrementsProgression(); - if (!trip.isActivityEmpty()) { + // compute fishing time + Float fishingTime = computeFishingTime(firstRoute, lastRoute, route); + route.setComputedFishingTimeN0(fishingTime); + incrementsProgression(); - Multimap<Long, Activity> activitiesByDay = ActivityTopiaDao.groupActivitiesByDay(trip.getActivity()); + if (fishingTime == null) { - List<Long> daysIds = Lists.newArrayList(activitiesByDay.keySet()); - Collections.sort(daysIds); - - long firstDay = daysIds.get(0); - long lastDay = Iterables.getLast(daysIds); + route.setComputedSearchTimeN0(null); + incrementsProgression(); + continue; + } - for (Long dayId : daysIds) { + totalFishingTimeN0 += fishingTime; + // compute search time + float searchTime = computeTripSearchTime(route, fishingTime); + totalSearchTimeN0 += searchTime; + route.setComputedSearchTimeN0(searchTime); - Collection<Activity> activities = activitiesByDay.get(dayId); + incrementsProgression(); - if (dayId == firstDay || lastDay == dayId) { - float currentFishingTime = computeSetFishingTimeForFirstOrLayDay(activities); - setFishingTime += currentFishingTime; - continue; - } + String message = l(locale, "t3.level0.computeTripEffort", + decorate(route), + route.getComputedFishingTimeN0(), + route.getComputedSearchTimeN0() + ); - Date date = new Date(dayId); - if (!canComputeSetFishingTime(activities)) { + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + } + markTripAsTreated(trip); + return true; + } - String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(trip), date); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } + private Float computeFishingTime(Route firstRoute, Route lastRoute, Route route) throws TopiaException { - continue; - } + Collection<Activity> activities = route.getActivity(); + if (Objects.equals(firstRoute, route) || Objects.equals(lastRoute, route)) { + return computeSetFishingTimeForFirstOrLayDay(activities); + } - T3Point point; + Date date = route.getDate(); + if (!canComputeSetFishingTime(activities)) { - if (activities.size() == 1) { + String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(route)); + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + return null; + } - // only one activity for this day, - Activity activity = activities.iterator().next(); - point = activity.toPoint(); + T3Point point; - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] , single activity, point : " + point); - } - } else { + if (activities.size() == 1) { - // compute barycenter for all activities of the day - point = tripDAO.getBarycenterForActivitiesOfADay(trip, date); + // only one activity for this day, + Activity activity = activities.iterator().next(); + point = activity.toPoint(); - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] Computed barycenter point " + point); - } - } + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] , single activity, point : " + point); + } + } else { - // compute day duration for this point and day (in minutes) - double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); + // compute barycenter for all activities of the day + point = routeDAO.getBarycenterForActivitiesOfADay(route, date); - if (log.isInfoEnabled()) { - log.info("Day [" + date + "] duration = " + duration); - } - // add it to setTime - setFishingTime += duration; + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] Computed barycenter point " + point); } } - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - fishing time = " + setFishingTime); - } + // compute day duration for this point and day (in minutes) + double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); - return setFishingTime; + if (log.isInfoEnabled()) { + log.info("Day [" + date + "] duration = " + duration); + } + return (float) duration; } - protected float computeTripSearchTime(Trip trip, float fishingTime) { + private float computeTripSearchTime(Route route, float fishingTime) { // compute sum of catches time - float catchesTime = trip.getTotalSetsDuration(); + float catchesTime = route.getTotalSetsDuration(); if (log.isDebugEnabled()) { log.debug("Total catches time = " + catchesTime); @@ -274,12 +231,12 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf float result = fishingTime - catchesTime; if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - trip search time = " + result); + log.debug(decorate(route) + " - trip search time = " + result); } return result; } - protected float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { + private float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { float result = 0f; for (Activity activity : activities) { @@ -289,7 +246,7 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf } - protected boolean canComputeSetFishingTime(Collection<Activity> activities) { + private boolean canComputeSetFishingTime(Collection<Activity> activities) { boolean result = false; for (Activity activity : activities) { VesselActivity vesselActivity = activity.getVesselActivity(); ===================================== t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Trip %s total rf1 catches weight %s / t t3.level0.computeRF2.resume.skip.for.trip=Trip %s has not elementary landing (trip not used to compute rf2) t3.level0.computeRF2.resume.total.rf1=Sum total rf1 catches weight %s / Sum total landing weight %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=SetDuration data not found (ocean %s, fleet %s, school type %s, year %s) -t3.level0.computeTripEffort=Trip efforts %s (sea %s, fishing%s, search%s) -t3.level0.computeTripEffortSkipForDay=Trip %s, Day (%s) without fihsing time (only activities of type « at harbour » or « under way without prospection ») +t3.level0.computeTripEffort=Trip efforts %s (fishing %s, search %s) +t3.level0.computeTripEffortSkipForDay=Trip %s, day without fishing time (only activities of type « at harbour » or « under way without prospection ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Weight category %s, weight \= %s, propWeight \= %s (activity %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Well (%s) with well plan filled %s wellSetAllSpecies, total weight %s t3.level0.convertCatchesWeightCategories.resume.for.species=Species %s < logBook total weight \= %s , converted total weight \= %s> ===================================== t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Marée %s Poids total des captures rf1i t3.level0.computeRF2.resume.skip.for.trip=La marée %s ne possède pas de lots commerciaux (non prise en compte dans le calcul du rf2) t3.level0.computeRF2.resume.total.rf1=Poids cumulé des captures rf1isées %s / Poids cumulé des ventes %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=Donnée SetDuration non trouvée (ocean %s, flotte %s, type de banc %s, année %s) -t3.level0.computeTripEffort=Efforts de la marée %s (mer %s, pêche %s, recherche %s) -t3.level0.computeTripEffortSkipForDay=Marée %s, Journée (%s) sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») +t3.level0.computeTripEffort=Efforts de la marée %s (pêche %s, recherche %s) +t3.level0.computeTripEffortSkipForDay=Marée %s, jour sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Catégorie de poids %s, poids \= %s, poids pondéré\= %s (activité %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Cuve avec plan de cuve (%s) avec %s wellSetAllSpecies, poids total %s t3.level0.convertCatchesWeightCategories.resume.for.species=Espèce %s < poids total des captures du livre de bord \= %s , poids total converti \= %s> ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java @@ -0,0 +1,55 @@ +package fr.ird.t3.entities.data; + +import fr.ird.t3.entities.type.T3Point; +import fr.ird.t3.entities.type.T3PointImpl; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; + +public class AbstractRouteTopiaDao<E extends Route> extends GeneratedRouteTopiaDao<E> { + + public T3Point getBarycenterForActivitiesOfADay(E route, Date day) throws TopiaException { + + TopiaSqlQuery<T3Point> query = new GetT3PointQuery<E>(route, day); + return topiaSqlSupport.findSingleResult(query); + } + + private static class GetT3PointQuery<E extends Route> extends TopiaSqlQuery<T3Point> { + private final E route; + + private final Date day; + + public GetT3PointQuery(E route, Date day) { + this.route = route; + this.day = day; + } + + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement( + "SELECT ST_X(record.point), ST_Y(record.point) FROM " + + "(" + + " SELECT ST_Centroid(ST_Collect(a.the_geom)) AS point" + + " FROM activity a " + + " WHERE a.route = ? AND a.date::DATE = ?" + + ") AS record;"); + ps.setString(1, route.getTopiaId()); + ps.setDate(2, new java.sql.Date(day.getTime())); + return ps; + } + + @Override + public T3Point prepareResult(ResultSet set) throws SQLException { + float x = set.getFloat(1); + float y = set.getFloat(2); + return new T3PointImpl(x, y); + } + } + +} + ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java @@ -128,13 +128,13 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< // query = createQuery("t") // .setSelect("t.id") // .addWhere("size(t." + Trip.PROPERTY_ACTIVITY + ") = 0"); - hql = "SELECT t.id FROM TripImpl t WHERE size(t.activity) = 0"; + hql = "SELECT t.id FROM TripImpl as t WHERE size(t.route) = 0"; // params = Collections.emptyList(); } else { // query = new TopiaQuery(Activity.class, "a") // .setSelect("distinct(a.trip.id)") // .addWhere("a.ocean", TopiaQuery.Op.EQ, ocean); - hql = "SELECT DISTINCT(a.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; + hql = "SELECT DISTINCT(a.route.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; paramsBuilder.put("ocean", ocean); // params = Lists.<Object>newArrayList("ocean", ocean); } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -26,12 +26,13 @@ import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; import fr.ird.t3.entities.type.T3PointImpl; import fr.ird.type.CoordinateHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Implementation of {@link Activity} with manual quadrant @@ -60,6 +61,11 @@ public class ActivityImpl extends ActivityAbstract { protected Integer quadrant; @Override + public Trip getTrip() { + return getRoute().getTrip(); + } + + @Override public Integer getQuadrant() { if (quadrant == null) { ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java @@ -0,0 +1,49 @@ +package fr.ird.t3.entities.data; + +public class RouteImpl extends RouteAbstract { + + private static final long serialVersionUID = 1L; + + /** @return the sum of all activities set duration in hours. */ + @Override + public float getTotalSetsDuration() { + float result = 0; + if (!isActivityEmpty()) { + for (Activity activity : getActivity()) { + + // get the setDuration + Float setTime = activity.getSetDuration(); + + result += setTime == null ? 0f : setTime; + } + } + return result / 60; + } + + @Override + public void deleteComputedDataLevel0() { + setComputedFishingTimeN0(null); + setComputedSearchTimeN0(null); + ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + } + + @Override + public void deleteComputedData() { + ComputedDataHelper.deleteComputedDatas(this); + } + + @Override + public void deleteComputedDataLevel1() { + ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + } + + @Override + public void deleteComputedDataLevel2() { + ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + } + + @Override + public void deleteComputedDataLevel3() { + ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + } +} ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java @@ -30,9 +30,17 @@ import fr.ird.t3.entities.reference.Ocean; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.Vessel; import fr.ird.t3.entities.reference.VesselImpl; +import org.nuiton.util.DateUtil; import java.util.Collection; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.nuiton.i18n.I18n.n; @@ -119,21 +127,21 @@ public class TripImpl extends TripAbstract { return result; } - /** @return the sum of all activities set duration in hours. */ - @Override - public float getTotalSetsDuration() { - float result = 0; - if (!isActivityEmpty()) { - for (Activity activity : getActivity()) { - - // get the setDuration - Float setTime = activity.getSetDuration(); - - result += setTime == null ? 0f : setTime; - } - } - return result / 60; - } +// /** @return the sum of all activities set duration in hours. */ +// @Override +// public float getTotalSetsDuration() { +// float result = 0; +// if (!isActivityEmpty()) { +// for (Activity activity : getActivity()) { +// +// // get the setDuration +// Float setTime = activity.getSetDuration(); +// +// result += setTime == null ? 0f : setTime; +// } +// } +// return result / 60; +// } @Override public float getElementaryCatchTotalWeight(Collection<Species> species) { @@ -436,19 +444,17 @@ public class TripImpl extends TripAbstract { setCompletionStatus(null); setRf1(null); setRf2(null); - setComputedFishingTimeN0(null); - setComputedSearchTimeN0(null); - setComputedTimeAtSeaN0(null); +// setComputedFishingTimeN0(null); +// setComputedSearchTimeN0(null); +// setComputedTimeAtSeaN0(null); - ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + ComputedDataHelper.deleteComputedDataLevel0(getRoute()); ComputedDataHelper.deleteComputedDataLevel0(getSample()); ComputedDataHelper.deleteComputedDataLevel0(getWell()); } @Override public void deleteComputedDataLevel1() { - - // level 1 flags setExtrapolateSampleCountedAndMeasured(false); setStandardizeSampleMeasures(false); setComputeWeightOfCategoriesForSet(false); @@ -457,27 +463,97 @@ public class TripImpl extends TripAbstract { setConvertSetSpeciesFrequencyToWeight(false); setConvertSampleSetSpeciesFrequencyToWeight(false); - ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + ComputedDataHelper.deleteComputedDataLevel1(getRoute()); ComputedDataHelper.deleteComputedDataLevel1(getSample()); ComputedDataHelper.deleteComputedDataLevel1(getWell()); } @Override public void deleteComputedDataLevel2() { - // level 2 flags - - ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + ComputedDataHelper.deleteComputedDataLevel2(getRoute()); ComputedDataHelper.deleteComputedDataLevel2(getSample()); ComputedDataHelper.deleteComputedDataLevel2(getWell()); } @Override public void deleteComputedDataLevel3() { - // level 3 flags - - ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + ComputedDataHelper.deleteComputedDataLevel3(getRoute()); ComputedDataHelper.deleteComputedDataLevel3(getSample()); ComputedDataHelper.deleteComputedDataLevel3(getWell()); } + @Override + public int getComputedTimeAtSeaN0() { + return 24 * sizeRoute(); + } + + @Override + public int sizeActivity() { + return (int) activityStream().count(); + } + + @Override + public boolean isActivityEmpty() { + return isRouteEmpty() || activityStream().count() == 0; + } + + @Override + public boolean isActivityNotEmpty() { + return isRouteNotEmpty() && activityStream().count() > 0; + } + + @Override + public List<Activity> getActivity() { + return activityStream().collect(Collectors.toList()); + } + + @Override + public void setActivity(List<Activity> activities) { + clearRoute(); + for (Activity activity : activities) { + addActivity(activity); + } + } + + @Override + public Activity getActivityByTopiaId(String topiaId) { + return activityStream().filter(a -> topiaId.equals(a.getTopiaId())).findFirst().orElse(null); + } + + @Override + public Collection<String> getActivityTopiaIds() { + return activityStream().map(Activity::getTopiaId).collect(Collectors.toList()); + } + + @Override + public void addActivity(Activity activity) { + Date date = DateUtil.getDay(activity.getDate()); + Optional<Route> optionalRoute = routeStream().filter(r -> Objects.equals(r.getDate(), date)).findFirst(); + Route route; + if (optionalRoute.isPresent()) { + route = optionalRoute.get(); + } else { + route = new RouteImpl(); + route.setDate(date); + addRoute(route); + } + route.addActivity(activity); + } + + @Override + public List<Route> getRoute() { + List<Route> route = super.getRoute(); + if (route == null) { + setRoute(route = new LinkedList<>()); + } + return route; + } + + private Stream<Route> routeStream() { + return getRoute().stream(); + } + + private Stream<Activity> activityStream() { + return routeStream().flatMap(r -> r.getActivity().stream()); + } } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java @@ -126,7 +126,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.fleetCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) > 0") @@ -155,7 +155,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.flagCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) >0") ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java @@ -37,11 +37,11 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend /** * Obtains all vessel simple types used by all trips in the database. * - * @param sampleOnly if null no filter else filter on value + * @param samplesOnly if null no filter else filter on value * @return the set of used vessel simple types in trips in the database * @throws TopiaException if any problem while querying the database */ - public Set<E> findAllUsedInTrip(Boolean sampleOnly) throws TopiaException { + public Set<E> findAllUsedInTrip(Boolean samplesOnly) throws TopiaException { // TopiaQuery query = createQuery("vst") // .addFrom(Trip.class, "t") @@ -50,8 +50,8 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend // Vessel.PROPERTY_VESSEL_TYPE + "." + // VesselType.PROPERTY_VESSEL_SIMPLE_TYPE + " = vst.id"); - String sampleOnlyFilter = sampleOnly == null ? "" : (" AND t.sampleOnly = " + sampleOnly); - String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + sampleOnlyFilter; + String samplesOnlyFilter = samplesOnly == null ? "" : (" AND t.samplesOnly = " + samplesOnly); + String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + samplesOnlyFilter; return new HashSet<>(findAll(hql)); // return T3EntityHelper.querytoSet(hql, this); } ===================================== t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java @@ -25,6 +25,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.CompleteTrip; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Sample; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; @@ -167,6 +168,9 @@ public class DecoratorService extends T3ServiceSupport implements T3ServiceSingl // trip decorator registerJXPathDecorator(locale, Trip.class, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY"); + // route decorator + registerJXPathDecorator(locale, Route.class, "${trip.vesselLabel}$s - ${trip.landingDate}$td/%2$tm/%2$tY - ${date}$td/%3$tm/%3$tY"); + // trip (with topiaid) decorator registerJXPathDecorator(locale, Trip.class, WITH_ID, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY [${topiaId}$s]"); ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java @@ -0,0 +1,133 @@ +package fr.ird.t3.services.migration; + +/* + * #%L + * T3 :: Domain + * %% + * Copyright (C) 2010 - 2017 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.auto.service.AutoService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; +import org.nuiton.topia.persistence.support.TopiaSqlSupport; +import org.nuiton.util.DateUtil; +import org.nuiton.version.Versions; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Created by tchemit on 18/02/2018. + * + * @author Tony Chemit - dev(a)tchemit.fr + */ +@AutoService(TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion.class) +public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { + + private static final Log log = LogFactory.getLog(T3MigrationCallbackV2_2.class); + + public T3MigrationCallbackV2_2() { + super(Versions.valueOf("2.2")); + } + + @Override + protected void prepareMigrationScript(TopiaSqlSupport sqlSupport, List<String> queries, boolean showSql, boolean showProgression) throws TopiaException { + addScript("07", "add-Route-table", queries); + + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<String> tripList = sqlSupport.findMultipleResult(new TopiaSqlQuery<String>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + return connection.prepareStatement("SELECT DISTINCT(a.trip) FROM activity a"); + } + + @Override + public String prepareResult(ResultSet set) throws SQLException { + return set.getString(1); + } + }); + + for (String tripId : tripList) { + + int i = tripId.indexOf('#'); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); + + log.info("Route prefix: " + routeIdPrefix); + List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); + preparedStatement.setString(1, tripId); + return preparedStatement; + } + + @Override + public TripActivity prepareResult(ResultSet set) throws SQLException { + return new TripActivity(set.getString(1), set.getDate(2)); + } + }); + + + Set<Date> days = new LinkedHashSet<>(); + int activityIndex = 0; + for (TripActivity activity : activityList) { + + String dayDateStr = df.format(activity.date); + String routeId = routeIdPrefix + dayDateStr.replaceAll("-", ""); + + if (days.add(activity.date)) { + + log.info(String.format("[%s] new Route: %s", tripId, routeId)); + // create new route + queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size() - 1, dayDateStr)); + } + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); + } + + if (!activityList.isEmpty()) { + queries.add(String.format("UPDATE Trip SET effortComputed = false, topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", tripId)); + } + } + + addScript("08", "remove-Trip-fields", queries); + } + + private static class TripActivity { + + private final String activity; + private final Date date; + + private TripActivity(String activity, Date date) { + this.activity = activity; + this.date = DateUtil.getDay(date); + } + } + +} ===================================== t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql @@ -0,0 +1,29 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- +CREATE TABLE Route( topiaid VARCHAR(255) PRIMARY KEY NOT NULL, topiaversion BIGINT NOT NULL, topiacreatedate TIMESTAMP NOT NULL, trip VARCHAR(255) NOT NULL, trip_idx INTEGER NOT NULL, date DATE NOT NULL, computedFishingTimeN0 REAL, computedSearchTimeN0 REAL); +CREATE UNIQUE INDEX uk_route ON Route(trip, date); +ALTER TABLE Route ADD CONSTRAINT fk_route_trip FOREIGN KEY (trip) REFERENCES Trip(topiaid); +CREATE INDEX idx_route_trip ON Route(trip); + +ALTER TABLE Activity ADD COLUMN route VARCHAR(255); +ALTER TABLE Activity ADD COLUMN route_idx INTEGER; +ALTER TABLE Activity ADD CONSTRAINT fk_activity_route FOREIGN KEY (route) REFERENCES Route(topiaid); +CREATE INDEX idx_activity_route ON Activity(route); ===================================== t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql @@ -0,0 +1,28 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- + +ALTER TABLE Activity DROP COLUMN trip; +ALTER TABLE Activity DROP COLUMN trip_idx; +ALTER TABLE Activity DROP COLUMN date; +ALTER TABLE Trip DROP COLUMN computedfishingtimen0; +ALTER TABLE Trip DROP COLUMN computedsearchtimen0; +ALTER TABLE Trip DROP COLUMN computedtimeatsean0; +ALTER TABLE Activity ALTER COLUMN route_idx SET NOT NULL; \ No newline at end of file ===================================== t3-domain/src/main/xmi/t3-persistence.properties ===================================== --- a/t3-domain/src/main/xmi/t3-persistence.properties +++ b/t3-domain/src/main/xmi/t3-persistence.properties @@ -22,11 +22,17 @@ model.tagValue.notGenerateToString=true model.tagValue.generateOperatorForDAOHelper=true model.tagValue.constantPrefix=PROPERTY_ -model.tagValue.version=2.1 +model.tagValue.version=2.2 model.tagValue.indexForeignKeys=true -fr.ird.t3.entities.data.Trip.attribute.activity.stereotype=ordered -fr.ird.t3.entities.data.Trip.attribute.activity.tagvalue.orderBy=date +fr.ird.t3.entities.data.Trip.attribute.route.stereotype=ordered +fr.ird.t3.entities.data.Route.attribute.activity.stereotype=ordered + +fr.ird.t3.entities.data.Trip.attribute.route.tagvalue.orderBy=date +fr.ird.t3.entities.data.Route.attribute.activity.tagvalue.orderBy=date + +fr.ird.t3.entities.data.Route.attribute.date.tagvalue.hibernateAttributeType.java.util.Date=date +fr.ird.t3.entities.data.Activity.attribute.time.tagvalue.hibernateAttributeType.java.util.Date=time fr.ird.t3.entities.data.Activity.attribute.comment.tagvalue.sqlType=text fr.ird.t3.entities.data.LocalMarketBatch.attribute.origin.tagvalue.sqlType=text ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ ===================================== t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java ===================================== --- a/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java +++ b/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java @@ -56,8 +56,8 @@ public class T3PersistenceFixtures { return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date); } - public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean sampleOnly) { - return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, sampleOnly); + public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean samplesOnly) { + return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, samplesOnly); } public static Harbour newHarbour(T3TopiaPersistenceContext tx, int code) { ===================================== t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java ===================================== --- a/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java +++ b/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java @@ -55,11 +55,12 @@ import fr.ird.t3.io.input.access.T3AccessEntityMeta; import fr.ird.t3.io.input.access.T3AccessEntityMetaProvider; import fr.ird.t3.io.input.access.T3AccessReferentielEntityMeta; import fr.ird.t3.io.input.access.type.IntToBoolean; -import java.util.Date; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Date; +import java.util.Set; + /** * Provider of {@link T3AccessEntityMeta}. * @@ -86,9 +87,7 @@ public class T3AccessEntityMetaProviderAvdth33 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java @@ -163,7 +163,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -172,7 +172,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java @@ -115,14 +115,14 @@ public class ImportInputSourceActionIT implements T3AVDTHV33Test { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java ===================================== --- a/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java +++ b/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -98,9 +98,7 @@ public class T3AccessEntityMetaProviderAvdth35 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{/* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -165,7 +165,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -174,7 +174,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java ===================================== --- a/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java +++ b/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -100,9 +100,7 @@ public class T3AccessEntityMetaProviderAvdth36 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -168,7 +168,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -177,7 +177,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/26e69f3c92f5a91d63b77a44b57598b3… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/26e69f3c92f5a91d63b77a44b57598b3… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0] Calcul des temps de pêche (See #240)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: ef7c73b1 by Tony CHEMIT at 2018-02-20T22:41:48+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 27 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java - t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties - t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties - + t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - + t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java - + t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - + t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql - + t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql - t3-domain/src/main/xmi/t3-persistence.properties - t3-domain/src/main/xmi/t3-persistence.zargo - t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java - t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java - t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java - t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java @@ -21,6 +21,8 @@ package fr.ird.t3.actions.data.level0; import fr.ird.t3.actions.T3Action; +import fr.ird.t3.entities.data.Route; +import fr.ird.t3.entities.data.RouteTopiaDao; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.TripTopiaDao; import fr.ird.t3.entities.reference.Country; @@ -54,6 +56,9 @@ public abstract class AbstractLevel0Action<C extends AbstractLevel0Configuration @InjectDAO(entityType = Trip.class) protected TripTopiaDao tripDAO; + @InjectDAO(entityType = Route.class) + protected RouteTopiaDao routeDAO; + @InjectEntitiesById(entityType = Country.class) protected List<Country> fleets; ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java @@ -8,12 +8,12 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% @@ -22,26 +22,21 @@ package fr.ird.t3.actions.data.level0; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; import com.web_tomorrow.utils.suntimes.SunTimes; import fr.ird.t3.entities.data.Activity; -import fr.ird.t3.entities.data.ActivityTopiaDao; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.DateUtil; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Objects; import static org.nuiton.i18n.I18n.l; @@ -56,22 +51,20 @@ import static org.nuiton.i18n.I18n.l; */ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEffortsConfiguration> { - /** Logger. */ - private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); - /** * Les codes des activités surlequel on ne calcule pas d'effort de pêche. * * @since 2.0 */ - protected static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( + private static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( 4, // route sans veille 7, // avarie 8, // à la cape 10, // en attente 15 // au port ); - + /** Logger. */ + private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); protected float totalTimeAtSeaN0; protected float totalFishingTimeN0; @@ -127,146 +120,110 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf return result; } - protected boolean executeForTrip(Trip trip) throws TopiaException { + private boolean executeForTrip(Trip trip) throws TopiaException { // compute time at sea - float timeAtSea = computeTimeAtSea(trip); - totalTimeAtSeaN0 += timeAtSea; - - trip.setComputedTimeAtSeaN0(timeAtSea); - incrementsProgression(); - - // compute fishing time - float fishingTime = computeFishingTime(trip); - totalFishingTimeN0 += fishingTime; - trip.setComputedFishingTimeN0(fishingTime); - incrementsProgression(); - - // compute search time - float searchTime = computeTripSearchTime(trip, fishingTime); - totalSearchTimeN0 += searchTime; - trip.setComputedSearchTimeN0(searchTime); - - incrementsProgression(); - - String message = l(locale, "t3.level0.computeTripEffort", - decorate(trip), - trip.getComputedTimeAtSeaN0(), - trip.getComputedFishingTimeN0(), - trip.getComputedSearchTimeN0() - ); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } - markTripAsTreated(trip); - return true; - } - - protected float computeTimeAtSea(Trip trip) { - float setTimeAtSea; + Route firstRoute = Objects.requireNonNull(trip.getRoute().get(0)); + Route lastRoute = Objects.requireNonNull(Iterables.getLast(trip.getRoute())); - // date depart - date dpq = nb jours - // result = nb heures entre le départ et l'arrivée - Calendar calendarDep = DateUtils.toCalendar(trip.getDepartureDate()); - calendarDep.set(Calendar.MINUTE, 0); - calendarDep.set(Calendar.SECOND, 0); - calendarDep.set(Calendar.MILLISECOND, 0); - Calendar calendarLanding = DateUtils.toCalendar(trip.getLandingDate()); - calendarLanding.set(Calendar.MINUTE, 0); - calendarLanding.set(Calendar.SECOND, 0); - calendarLanding.set(Calendar.MILLISECOND, 0); + for (Route route : trip.getRoute()) { - int months = DateUtil.getDifferenceInHours(calendarDep.getTime(), calendarLanding.getTime()); - setTimeAtSea = months; +// float timeAtSea = computeTimeAtSea(route); +// totalTimeAtSeaN0 += timeAtSea; + totalTimeAtSeaN0 += 24; - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " : time at sea = " + setTimeAtSea); - } - return setTimeAtSea; - } - - protected float computeFishingTime(Trip trip) throws TopiaException { - - float setFishingTime = 0; +// route.setComputedTimeAtSeaN0(timeAtSea); +// incrementsProgression(); - if (!trip.isActivityEmpty()) { + // compute fishing time + Float fishingTime = computeFishingTime(firstRoute, lastRoute, route); + route.setComputedFishingTimeN0(fishingTime); + incrementsProgression(); - Multimap<Long, Activity> activitiesByDay = ActivityTopiaDao.groupActivitiesByDay(trip.getActivity()); + if (fishingTime == null) { - List<Long> daysIds = Lists.newArrayList(activitiesByDay.keySet()); - Collections.sort(daysIds); - - long firstDay = daysIds.get(0); - long lastDay = Iterables.getLast(daysIds); + route.setComputedSearchTimeN0(null); + incrementsProgression(); + continue; + } - for (Long dayId : daysIds) { + totalFishingTimeN0 += fishingTime; + // compute search time + float searchTime = computeTripSearchTime(route, fishingTime); + totalSearchTimeN0 += searchTime; + route.setComputedSearchTimeN0(searchTime); - Collection<Activity> activities = activitiesByDay.get(dayId); + incrementsProgression(); - if (dayId == firstDay || lastDay == dayId) { - float currentFishingTime = computeSetFishingTimeForFirstOrLayDay(activities); - setFishingTime += currentFishingTime; - continue; - } + String message = l(locale, "t3.level0.computeTripEffort", + decorate(route), + route.getComputedFishingTimeN0(), + route.getComputedSearchTimeN0() + ); - Date date = new Date(dayId); - if (!canComputeSetFishingTime(activities)) { + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + } + markTripAsTreated(trip); + return true; + } - String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(trip), date); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } + private Float computeFishingTime(Route firstRoute, Route lastRoute, Route route) throws TopiaException { - continue; - } + Collection<Activity> activities = route.getActivity(); + if (Objects.equals(firstRoute, route) || Objects.equals(lastRoute, route)) { + return computeSetFishingTimeForFirstOrLayDay(activities); + } - T3Point point; + Date date = route.getDate(); + if (!canComputeSetFishingTime(activities)) { - if (activities.size() == 1) { + String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(route)); + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + return null; + } - // only one activity for this day, - Activity activity = activities.iterator().next(); - point = activity.toPoint(); + T3Point point; - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] , single activity, point : " + point); - } - } else { + if (activities.size() == 1) { - // compute barycenter for all activities of the day - point = tripDAO.getBarycenterForActivitiesOfADay(trip, date); + // only one activity for this day, + Activity activity = activities.iterator().next(); + point = activity.toPoint(); - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] Computed barycenter point " + point); - } - } + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] , single activity, point : " + point); + } + } else { - // compute day duration for this point and day (in minutes) - double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); + // compute barycenter for all activities of the day + point = routeDAO.getBarycenterForActivitiesOfADay(route, date); - if (log.isInfoEnabled()) { - log.info("Day [" + date + "] duration = " + duration); - } - // add it to setTime - setFishingTime += duration; + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] Computed barycenter point " + point); } } - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - fishing time = " + setFishingTime); - } + // compute day duration for this point and day (in minutes) + double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); - return setFishingTime; + if (log.isInfoEnabled()) { + log.info("Day [" + date + "] duration = " + duration); + } + return (float) duration; } - protected float computeTripSearchTime(Trip trip, float fishingTime) { + private float computeTripSearchTime(Route route, float fishingTime) { // compute sum of catches time - float catchesTime = trip.getTotalSetsDuration(); + float catchesTime = route.getTotalSetsDuration(); if (log.isDebugEnabled()) { log.debug("Total catches time = " + catchesTime); @@ -274,12 +231,12 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf float result = fishingTime - catchesTime; if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - trip search time = " + result); + log.debug(decorate(route) + " - trip search time = " + result); } return result; } - protected float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { + private float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { float result = 0f; for (Activity activity : activities) { @@ -289,7 +246,7 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf } - protected boolean canComputeSetFishingTime(Collection<Activity> activities) { + private boolean canComputeSetFishingTime(Collection<Activity> activities) { boolean result = false; for (Activity activity : activities) { VesselActivity vesselActivity = activity.getVesselActivity(); ===================================== t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Trip %s total rf1 catches weight %s / t t3.level0.computeRF2.resume.skip.for.trip=Trip %s has not elementary landing (trip not used to compute rf2) t3.level0.computeRF2.resume.total.rf1=Sum total rf1 catches weight %s / Sum total landing weight %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=SetDuration data not found (ocean %s, fleet %s, school type %s, year %s) -t3.level0.computeTripEffort=Trip efforts %s (sea %s, fishing%s, search%s) -t3.level0.computeTripEffortSkipForDay=Trip %s, Day (%s) without fihsing time (only activities of type « at harbour » or « under way without prospection ») +t3.level0.computeTripEffort=Trip efforts %s (fishing %s, search %s) +t3.level0.computeTripEffortSkipForDay=Trip %s, day without fishing time (only activities of type « at harbour » or « under way without prospection ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Weight category %s, weight \= %s, propWeight \= %s (activity %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Well (%s) with well plan filled %s wellSetAllSpecies, total weight %s t3.level0.convertCatchesWeightCategories.resume.for.species=Species %s < logBook total weight \= %s , converted total weight \= %s> ===================================== t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Marée %s Poids total des captures rf1i t3.level0.computeRF2.resume.skip.for.trip=La marée %s ne possède pas de lots commerciaux (non prise en compte dans le calcul du rf2) t3.level0.computeRF2.resume.total.rf1=Poids cumulé des captures rf1isées %s / Poids cumulé des ventes %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=Donnée SetDuration non trouvée (ocean %s, flotte %s, type de banc %s, année %s) -t3.level0.computeTripEffort=Efforts de la marée %s (mer %s, pêche %s, recherche %s) -t3.level0.computeTripEffortSkipForDay=Marée %s, Journée (%s) sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») +t3.level0.computeTripEffort=Efforts de la marée %s (pêche %s, recherche %s) +t3.level0.computeTripEffortSkipForDay=Marée %s, jour sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Catégorie de poids %s, poids \= %s, poids pondéré\= %s (activité %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Cuve avec plan de cuve (%s) avec %s wellSetAllSpecies, poids total %s t3.level0.convertCatchesWeightCategories.resume.for.species=Espèce %s < poids total des captures du livre de bord \= %s , poids total converti \= %s> ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java @@ -0,0 +1,55 @@ +package fr.ird.t3.entities.data; + +import fr.ird.t3.entities.type.T3Point; +import fr.ird.t3.entities.type.T3PointImpl; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; + +public class AbstractRouteTopiaDao<E extends Route> extends GeneratedRouteTopiaDao<E> { + + public T3Point getBarycenterForActivitiesOfADay(E route, Date day) throws TopiaException { + + TopiaSqlQuery<T3Point> query = new GetT3PointQuery<E>(route, day); + return topiaSqlSupport.findSingleResult(query); + } + + private static class GetT3PointQuery<E extends Route> extends TopiaSqlQuery<T3Point> { + private final E route; + + private final Date day; + + public GetT3PointQuery(E route, Date day) { + this.route = route; + this.day = day; + } + + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement( + "SELECT ST_X(record.point), ST_Y(record.point) FROM " + + "(" + + " SELECT ST_Centroid(ST_Collect(a.the_geom)) AS point" + + " FROM activity a " + + " WHERE a.route = ? AND a.date::DATE = ?" + + ") AS record;"); + ps.setString(1, route.getTopiaId()); + ps.setDate(2, new java.sql.Date(day.getTime())); + return ps; + } + + @Override + public T3Point prepareResult(ResultSet set) throws SQLException { + float x = set.getFloat(1); + float y = set.getFloat(2); + return new T3PointImpl(x, y); + } + } + +} + ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java @@ -128,13 +128,13 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< // query = createQuery("t") // .setSelect("t.id") // .addWhere("size(t." + Trip.PROPERTY_ACTIVITY + ") = 0"); - hql = "SELECT t.id FROM TripImpl t WHERE size(t.activity) = 0"; + hql = "SELECT t.id FROM TripImpl as t WHERE size(t.route) = 0"; // params = Collections.emptyList(); } else { // query = new TopiaQuery(Activity.class, "a") // .setSelect("distinct(a.trip.id)") // .addWhere("a.ocean", TopiaQuery.Op.EQ, ocean); - hql = "SELECT DISTINCT(a.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; + hql = "SELECT DISTINCT(a.route.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; paramsBuilder.put("ocean", ocean); // params = Lists.<Object>newArrayList("ocean", ocean); } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -26,12 +26,13 @@ import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; import fr.ird.t3.entities.type.T3PointImpl; import fr.ird.type.CoordinateHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Implementation of {@link Activity} with manual quadrant @@ -60,6 +61,11 @@ public class ActivityImpl extends ActivityAbstract { protected Integer quadrant; @Override + public Trip getTrip() { + return getRoute().getTrip(); + } + + @Override public Integer getQuadrant() { if (quadrant == null) { ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java @@ -0,0 +1,49 @@ +package fr.ird.t3.entities.data; + +public class RouteImpl extends RouteAbstract { + + private static final long serialVersionUID = 1L; + + /** @return the sum of all activities set duration in hours. */ + @Override + public float getTotalSetsDuration() { + float result = 0; + if (!isActivityEmpty()) { + for (Activity activity : getActivity()) { + + // get the setDuration + Float setTime = activity.getSetDuration(); + + result += setTime == null ? 0f : setTime; + } + } + return result / 60; + } + + @Override + public void deleteComputedDataLevel0() { + setComputedFishingTimeN0(null); + setComputedSearchTimeN0(null); + ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + } + + @Override + public void deleteComputedData() { + ComputedDataHelper.deleteComputedDatas(this); + } + + @Override + public void deleteComputedDataLevel1() { + ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + } + + @Override + public void deleteComputedDataLevel2() { + ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + } + + @Override + public void deleteComputedDataLevel3() { + ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + } +} ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java @@ -30,9 +30,17 @@ import fr.ird.t3.entities.reference.Ocean; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.Vessel; import fr.ird.t3.entities.reference.VesselImpl; +import org.nuiton.util.DateUtil; import java.util.Collection; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.nuiton.i18n.I18n.n; @@ -119,21 +127,21 @@ public class TripImpl extends TripAbstract { return result; } - /** @return the sum of all activities set duration in hours. */ - @Override - public float getTotalSetsDuration() { - float result = 0; - if (!isActivityEmpty()) { - for (Activity activity : getActivity()) { - - // get the setDuration - Float setTime = activity.getSetDuration(); - - result += setTime == null ? 0f : setTime; - } - } - return result / 60; - } +// /** @return the sum of all activities set duration in hours. */ +// @Override +// public float getTotalSetsDuration() { +// float result = 0; +// if (!isActivityEmpty()) { +// for (Activity activity : getActivity()) { +// +// // get the setDuration +// Float setTime = activity.getSetDuration(); +// +// result += setTime == null ? 0f : setTime; +// } +// } +// return result / 60; +// } @Override public float getElementaryCatchTotalWeight(Collection<Species> species) { @@ -436,19 +444,17 @@ public class TripImpl extends TripAbstract { setCompletionStatus(null); setRf1(null); setRf2(null); - setComputedFishingTimeN0(null); - setComputedSearchTimeN0(null); - setComputedTimeAtSeaN0(null); +// setComputedFishingTimeN0(null); +// setComputedSearchTimeN0(null); +// setComputedTimeAtSeaN0(null); - ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + ComputedDataHelper.deleteComputedDataLevel0(getRoute()); ComputedDataHelper.deleteComputedDataLevel0(getSample()); ComputedDataHelper.deleteComputedDataLevel0(getWell()); } @Override public void deleteComputedDataLevel1() { - - // level 1 flags setExtrapolateSampleCountedAndMeasured(false); setStandardizeSampleMeasures(false); setComputeWeightOfCategoriesForSet(false); @@ -457,27 +463,97 @@ public class TripImpl extends TripAbstract { setConvertSetSpeciesFrequencyToWeight(false); setConvertSampleSetSpeciesFrequencyToWeight(false); - ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + ComputedDataHelper.deleteComputedDataLevel1(getRoute()); ComputedDataHelper.deleteComputedDataLevel1(getSample()); ComputedDataHelper.deleteComputedDataLevel1(getWell()); } @Override public void deleteComputedDataLevel2() { - // level 2 flags - - ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + ComputedDataHelper.deleteComputedDataLevel2(getRoute()); ComputedDataHelper.deleteComputedDataLevel2(getSample()); ComputedDataHelper.deleteComputedDataLevel2(getWell()); } @Override public void deleteComputedDataLevel3() { - // level 3 flags - - ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + ComputedDataHelper.deleteComputedDataLevel3(getRoute()); ComputedDataHelper.deleteComputedDataLevel3(getSample()); ComputedDataHelper.deleteComputedDataLevel3(getWell()); } + @Override + public int getComputedTimeAtSeaN0() { + return 24 * sizeRoute(); + } + + @Override + public int sizeActivity() { + return (int) activityStream().count(); + } + + @Override + public boolean isActivityEmpty() { + return isRouteEmpty() || activityStream().count() == 0; + } + + @Override + public boolean isActivityNotEmpty() { + return isRouteNotEmpty() && activityStream().count() > 0; + } + + @Override + public List<Activity> getActivity() { + return activityStream().collect(Collectors.toList()); + } + + @Override + public void setActivity(List<Activity> activities) { + clearRoute(); + for (Activity activity : activities) { + addActivity(activity); + } + } + + @Override + public Activity getActivityByTopiaId(String topiaId) { + return activityStream().filter(a -> topiaId.equals(a.getTopiaId())).findFirst().orElse(null); + } + + @Override + public Collection<String> getActivityTopiaIds() { + return activityStream().map(Activity::getTopiaId).collect(Collectors.toList()); + } + + @Override + public void addActivity(Activity activity) { + Date date = DateUtil.getDay(activity.getDate()); + Optional<Route> optionalRoute = routeStream().filter(r -> Objects.equals(r.getDate(), date)).findFirst(); + Route route; + if (optionalRoute.isPresent()) { + route = optionalRoute.get(); + } else { + route = new RouteImpl(); + route.setDate(date); + addRoute(route); + } + route.addActivity(activity); + } + + @Override + public List<Route> getRoute() { + List<Route> route = super.getRoute(); + if (route == null) { + setRoute(route = new LinkedList<>()); + } + return route; + } + + private Stream<Route> routeStream() { + return getRoute().stream(); + } + + private Stream<Activity> activityStream() { + return routeStream().flatMap(r -> r.getActivity().stream()); + } } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java @@ -126,7 +126,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.fleetCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) > 0") @@ -155,7 +155,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.flagCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) >0") ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java @@ -37,11 +37,11 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend /** * Obtains all vessel simple types used by all trips in the database. * - * @param sampleOnly if null no filter else filter on value + * @param samplesOnly if null no filter else filter on value * @return the set of used vessel simple types in trips in the database * @throws TopiaException if any problem while querying the database */ - public Set<E> findAllUsedInTrip(Boolean sampleOnly) throws TopiaException { + public Set<E> findAllUsedInTrip(Boolean samplesOnly) throws TopiaException { // TopiaQuery query = createQuery("vst") // .addFrom(Trip.class, "t") @@ -50,8 +50,8 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend // Vessel.PROPERTY_VESSEL_TYPE + "." + // VesselType.PROPERTY_VESSEL_SIMPLE_TYPE + " = vst.id"); - String sampleOnlyFilter = sampleOnly == null ? "" : (" AND t.sampleOnly = " + sampleOnly); - String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + sampleOnlyFilter; + String samplesOnlyFilter = samplesOnly == null ? "" : (" AND t.samplesOnly = " + samplesOnly); + String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + samplesOnlyFilter; return new HashSet<>(findAll(hql)); // return T3EntityHelper.querytoSet(hql, this); } ===================================== t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java @@ -25,6 +25,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.CompleteTrip; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Sample; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; @@ -167,6 +168,9 @@ public class DecoratorService extends T3ServiceSupport implements T3ServiceSingl // trip decorator registerJXPathDecorator(locale, Trip.class, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY"); + // route decorator + registerJXPathDecorator(locale, Route.class, "${trip.vesselLabel}$s - ${trip.landingDate}$td/%2$tm/%2$tY - ${date}$td/%3$tm/%3$tY"); + // trip (with topiaid) decorator registerJXPathDecorator(locale, Trip.class, WITH_ID, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY [${topiaId}$s]"); ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java @@ -0,0 +1,133 @@ +package fr.ird.t3.services.migration; + +/* + * #%L + * T3 :: Domain + * %% + * Copyright (C) 2010 - 2017 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.auto.service.AutoService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; +import org.nuiton.topia.persistence.support.TopiaSqlSupport; +import org.nuiton.util.DateUtil; +import org.nuiton.version.Versions; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Created by tchemit on 18/02/2018. + * + * @author Tony Chemit - dev(a)tchemit.fr + */ +@AutoService(TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion.class) +public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { + + private static final Log log = LogFactory.getLog(T3MigrationCallbackV2_2.class); + + public T3MigrationCallbackV2_2() { + super(Versions.valueOf("2.2")); + } + + @Override + protected void prepareMigrationScript(TopiaSqlSupport sqlSupport, List<String> queries, boolean showSql, boolean showProgression) throws TopiaException { + addScript("07", "add-Route-table", queries); + + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<String> tripList = sqlSupport.findMultipleResult(new TopiaSqlQuery<String>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + return connection.prepareStatement("SELECT DISTINCT(a.trip) FROM activity a"); + } + + @Override + public String prepareResult(ResultSet set) throws SQLException { + return set.getString(1); + } + }); + + for (String tripId : tripList) { + + int i = tripId.indexOf('#'); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); + + log.info("Route prefix: " + routeIdPrefix); + List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); + preparedStatement.setString(1, tripId); + return preparedStatement; + } + + @Override + public TripActivity prepareResult(ResultSet set) throws SQLException { + return new TripActivity(set.getString(1), set.getDate(2)); + } + }); + + + Set<Date> days = new LinkedHashSet<>(); + int activityIndex = 0; + for (TripActivity activity : activityList) { + + String dayDateStr = df.format(activity.date); + String routeId = routeIdPrefix + dayDateStr.replaceAll("-", ""); + + if (days.add(activity.date)) { + + log.info(String.format("[%s] new Route: %s", tripId, routeId)); + // create new route + queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, trip_idx, date) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', %d, to_date('%s', 'YYY-MM-DD'));", routeId, tripId, days.size(), dayDateStr)); + } + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); + } + + if (!activityList.isEmpty()) { + queries.add(String.format("UPDATE Trip SET effortComputed = false, topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", tripId)); + } + } + + addScript("08", "remove-Trip-fields", queries); + } + + private static class TripActivity { + + private final String activity; + private final Date date; + + private TripActivity(String activity, Date date) { + this.activity = activity; + this.date = DateUtil.getDay(date); + } + } + +} ===================================== t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql @@ -0,0 +1,29 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- +CREATE TABLE Route( topiaid VARCHAR(255) PRIMARY KEY NOT NULL, topiaversion BIGINT NOT NULL, topiacreatedate TIMESTAMP NOT NULL, trip VARCHAR(255) NOT NULL, trip_idx INTEGER NOT NULL, date DATE NOT NULL, computedFishingTimeN0 REAL, computedSearchTimeN0 REAL); +CREATE UNIQUE INDEX uk_route ON Route(trip, date); +ALTER TABLE Route ADD CONSTRAINT fk_route_trip FOREIGN KEY (trip) REFERENCES Trip(topiaid); +CREATE INDEX idx_route_trip ON Route(trip); + +ALTER TABLE Activity ADD COLUMN route VARCHAR(255); +ALTER TABLE Activity ADD COLUMN route_idx INTEGER; +ALTER TABLE Activity ADD CONSTRAINT fk_activity_route FOREIGN KEY (route) REFERENCES Route(topiaid); +CREATE INDEX idx_activity_route ON Activity(route); ===================================== t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql @@ -0,0 +1,28 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- + +ALTER TABLE Activity DROP COLUMN trip; +ALTER TABLE Activity DROP COLUMN trip_idx; +ALTER TABLE Activity DROP COLUMN date; +ALTER TABLE Trip DROP COLUMN computedfishingtimen0; +ALTER TABLE Trip DROP COLUMN computedsearchtimen0; +ALTER TABLE Trip DROP COLUMN computedtimeatsean0; +ALTER TABLE Activity ALTER COLUMN route_idx SET NOT NULL; \ No newline at end of file ===================================== t3-domain/src/main/xmi/t3-persistence.properties ===================================== --- a/t3-domain/src/main/xmi/t3-persistence.properties +++ b/t3-domain/src/main/xmi/t3-persistence.properties @@ -22,11 +22,17 @@ model.tagValue.notGenerateToString=true model.tagValue.generateOperatorForDAOHelper=true model.tagValue.constantPrefix=PROPERTY_ -model.tagValue.version=2.1 +model.tagValue.version=2.2 model.tagValue.indexForeignKeys=true -fr.ird.t3.entities.data.Trip.attribute.activity.stereotype=ordered -fr.ird.t3.entities.data.Trip.attribute.activity.tagvalue.orderBy=date +fr.ird.t3.entities.data.Trip.attribute.route.stereotype=ordered +fr.ird.t3.entities.data.Route.attribute.activity.stereotype=ordered + +fr.ird.t3.entities.data.Trip.attribute.route.tagvalue.orderBy=date +fr.ird.t3.entities.data.Route.attribute.activity.tagvalue.orderBy=date + +fr.ird.t3.entities.data.Route.attribute.date.tagvalue.hibernateAttributeType.java.util.Date=date +fr.ird.t3.entities.data.Activity.attribute.time.tagvalue.hibernateAttributeType.java.util.Date=time fr.ird.t3.entities.data.Activity.attribute.comment.tagvalue.sqlType=text fr.ird.t3.entities.data.LocalMarketBatch.attribute.origin.tagvalue.sqlType=text ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ ===================================== t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java ===================================== --- a/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java +++ b/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java @@ -56,8 +56,8 @@ public class T3PersistenceFixtures { return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date); } - public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean sampleOnly) { - return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, sampleOnly); + public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean samplesOnly) { + return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, samplesOnly); } public static Harbour newHarbour(T3TopiaPersistenceContext tx, int code) { ===================================== t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java ===================================== --- a/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java +++ b/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java @@ -55,11 +55,12 @@ import fr.ird.t3.io.input.access.T3AccessEntityMeta; import fr.ird.t3.io.input.access.T3AccessEntityMetaProvider; import fr.ird.t3.io.input.access.T3AccessReferentielEntityMeta; import fr.ird.t3.io.input.access.type.IntToBoolean; -import java.util.Date; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Date; +import java.util.Set; + /** * Provider of {@link T3AccessEntityMeta}. * @@ -86,9 +87,7 @@ public class T3AccessEntityMetaProviderAvdth33 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java @@ -163,7 +163,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -172,7 +172,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java @@ -115,14 +115,14 @@ public class ImportInputSourceActionIT implements T3AVDTHV33Test { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java ===================================== --- a/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java +++ b/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -98,9 +98,7 @@ public class T3AccessEntityMetaProviderAvdth35 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{/* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -165,7 +165,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -174,7 +174,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java ===================================== --- a/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java +++ b/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -100,9 +100,7 @@ public class T3AccessEntityMetaProviderAvdth36 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -168,7 +168,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -177,7 +177,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/ef7c73b147b73da7e7c2888852019d1b… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/ef7c73b147b73da7e7c2888852019d1b… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-t3][develop] [N0] Calcul des temps de pêche (See #240)
by Tony CHEMIT 20 Feb '18

20 Feb '18
Tony CHEMIT pushed to branch develop at ultreiaio / ird-t3 Commits: 774f886a by Tony CHEMIT at 2018-02-20T22:08:33+01:00 [N0] Calcul des temps de pêche (See #240) - - - - - 27 changed files: - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java - t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java - t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties - t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties - + t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java - + t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java - t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java - + t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java - + t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql - + t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql - t3-domain/src/main/xmi/t3-persistence.properties - t3-domain/src/main/xmi/t3-persistence.zargo - t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java - t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java - t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java - t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java - t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java - t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java Changes: ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/AbstractLevel0Action.java @@ -21,6 +21,8 @@ package fr.ird.t3.actions.data.level0; import fr.ird.t3.actions.T3Action; +import fr.ird.t3.entities.data.Route; +import fr.ird.t3.entities.data.RouteTopiaDao; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.TripTopiaDao; import fr.ird.t3.entities.reference.Country; @@ -54,6 +56,9 @@ public abstract class AbstractLevel0Action<C extends AbstractLevel0Configuration @InjectDAO(entityType = Trip.class) protected TripTopiaDao tripDAO; + @InjectDAO(entityType = Route.class) + protected RouteTopiaDao routeDAO; + @InjectEntitiesById(entityType = Country.class) protected List<Country> fleets; ===================================== t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java ===================================== --- a/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java +++ b/t3-actions/src/main/java/fr/ird/t3/actions/data/level0/ComputeTripEffortsAction.java @@ -8,12 +8,12 @@ * it under the terms of the GNU Affero 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 Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% @@ -22,26 +22,21 @@ package fr.ird.t3.actions.data.level0; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; import com.web_tomorrow.utils.suntimes.SunTimes; import fr.ird.t3.entities.data.Activity; -import fr.ird.t3.entities.data.ActivityTopiaDao; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.util.DateUtil; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Objects; import static org.nuiton.i18n.I18n.l; @@ -56,22 +51,20 @@ import static org.nuiton.i18n.I18n.l; */ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEffortsConfiguration> { - /** Logger. */ - private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); - /** * Les codes des activités surlequel on ne calcule pas d'effort de pêche. * * @since 2.0 */ - protected static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( + private static final ImmutableSet<Integer> VESSEL_ACTIVITY_CODES_TO_SKIP = ImmutableSet.of( 4, // route sans veille 7, // avarie 8, // à la cape 10, // en attente 15 // au port ); - + /** Logger. */ + private static final Log log = LogFactory.getLog(ComputeTripEffortsAction.class); protected float totalTimeAtSeaN0; protected float totalFishingTimeN0; @@ -127,146 +120,110 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf return result; } - protected boolean executeForTrip(Trip trip) throws TopiaException { + private boolean executeForTrip(Trip trip) throws TopiaException { // compute time at sea - float timeAtSea = computeTimeAtSea(trip); - totalTimeAtSeaN0 += timeAtSea; - - trip.setComputedTimeAtSeaN0(timeAtSea); - incrementsProgression(); - - // compute fishing time - float fishingTime = computeFishingTime(trip); - totalFishingTimeN0 += fishingTime; - trip.setComputedFishingTimeN0(fishingTime); - incrementsProgression(); - - // compute search time - float searchTime = computeTripSearchTime(trip, fishingTime); - totalSearchTimeN0 += searchTime; - trip.setComputedSearchTimeN0(searchTime); - - incrementsProgression(); - - String message = l(locale, "t3.level0.computeTripEffort", - decorate(trip), - trip.getComputedTimeAtSeaN0(), - trip.getComputedFishingTimeN0(), - trip.getComputedSearchTimeN0() - ); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } - markTripAsTreated(trip); - return true; - } - - protected float computeTimeAtSea(Trip trip) { - float setTimeAtSea; + Route firstRoute = Objects.requireNonNull(trip.getRoute().get(0)); + Route lastRoute = Objects.requireNonNull(Iterables.getLast(trip.getRoute())); - // date depart - date dpq = nb jours - // result = nb heures entre le départ et l'arrivée - Calendar calendarDep = DateUtils.toCalendar(trip.getDepartureDate()); - calendarDep.set(Calendar.MINUTE, 0); - calendarDep.set(Calendar.SECOND, 0); - calendarDep.set(Calendar.MILLISECOND, 0); - Calendar calendarLanding = DateUtils.toCalendar(trip.getLandingDate()); - calendarLanding.set(Calendar.MINUTE, 0); - calendarLanding.set(Calendar.SECOND, 0); - calendarLanding.set(Calendar.MILLISECOND, 0); + for (Route route : trip.getRoute()) { - int months = DateUtil.getDifferenceInHours(calendarDep.getTime(), calendarLanding.getTime()); - setTimeAtSea = months; +// float timeAtSea = computeTimeAtSea(route); +// totalTimeAtSeaN0 += timeAtSea; + totalTimeAtSeaN0 += 24; - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " : time at sea = " + setTimeAtSea); - } - return setTimeAtSea; - } - - protected float computeFishingTime(Trip trip) throws TopiaException { - - float setFishingTime = 0; +// route.setComputedTimeAtSeaN0(timeAtSea); +// incrementsProgression(); - if (!trip.isActivityEmpty()) { + // compute fishing time + Float fishingTime = computeFishingTime(firstRoute, lastRoute, route); + route.setComputedFishingTimeN0(fishingTime); + incrementsProgression(); - Multimap<Long, Activity> activitiesByDay = ActivityTopiaDao.groupActivitiesByDay(trip.getActivity()); + if (fishingTime == null) { - List<Long> daysIds = Lists.newArrayList(activitiesByDay.keySet()); - Collections.sort(daysIds); - - long firstDay = daysIds.get(0); - long lastDay = Iterables.getLast(daysIds); + route.setComputedSearchTimeN0(null); + incrementsProgression(); + continue; + } - for (Long dayId : daysIds) { + totalFishingTimeN0 += fishingTime; + // compute search time + float searchTime = computeTripSearchTime(route, fishingTime); + totalSearchTimeN0 += searchTime; + route.setComputedSearchTimeN0(searchTime); - Collection<Activity> activities = activitiesByDay.get(dayId); + incrementsProgression(); - if (dayId == firstDay || lastDay == dayId) { - float currentFishingTime = computeSetFishingTimeForFirstOrLayDay(activities); - setFishingTime += currentFishingTime; - continue; - } + String message = l(locale, "t3.level0.computeTripEffort", + decorate(route), + route.getComputedFishingTimeN0(), + route.getComputedSearchTimeN0() + ); - Date date = new Date(dayId); - if (!canComputeSetFishingTime(activities)) { + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + } + markTripAsTreated(trip); + return true; + } - String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(trip), date); - addInfoMessage(message); - if (log.isInfoEnabled()) { - log.info(message); - } + private Float computeFishingTime(Route firstRoute, Route lastRoute, Route route) throws TopiaException { - continue; - } + Collection<Activity> activities = route.getActivity(); + if (Objects.equals(firstRoute, route) || Objects.equals(lastRoute, route)) { + return computeSetFishingTimeForFirstOrLayDay(activities); + } - T3Point point; + Date date = route.getDate(); + if (!canComputeSetFishingTime(activities)) { - if (activities.size() == 1) { + String message = l(locale, "t3.level0.computeTripEffortSkipForDay", decorate(route)); + addInfoMessage(message); + if (log.isInfoEnabled()) { + log.info(message); + } + return null; + } - // only one activity for this day, - Activity activity = activities.iterator().next(); - point = activity.toPoint(); + T3Point point; - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] , single activity, point : " + point); - } - } else { + if (activities.size() == 1) { - // compute barycenter for all activities of the day - point = tripDAO.getBarycenterForActivitiesOfADay(trip, date); + // only one activity for this day, + Activity activity = activities.iterator().next(); + point = activity.toPoint(); - if (log.isDebugEnabled()) { - log.debug("Day [" + date + "] Computed barycenter point " + point); - } - } + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] , single activity, point : " + point); + } + } else { - // compute day duration for this point and day (in minutes) - double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); + // compute barycenter for all activities of the day + point = routeDAO.getBarycenterForActivitiesOfADay(route, date); - if (log.isInfoEnabled()) { - log.info("Day [" + date + "] duration = " + duration); - } - // add it to setTime - setFishingTime += duration; + if (log.isDebugEnabled()) { + log.debug("Day [" + date + "] Computed barycenter point " + point); } } - if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - fishing time = " + setFishingTime); - } + // compute day duration for this point and day (in minutes) + double duration = SunTimes.getDayDurationInMonths(date, point.getX(), point.getY()); - return setFishingTime; + if (log.isInfoEnabled()) { + log.info("Day [" + date + "] duration = " + duration); + } + return (float) duration; } - protected float computeTripSearchTime(Trip trip, float fishingTime) { + private float computeTripSearchTime(Route route, float fishingTime) { // compute sum of catches time - float catchesTime = trip.getTotalSetsDuration(); + float catchesTime = route.getTotalSetsDuration(); if (log.isDebugEnabled()) { log.debug("Total catches time = " + catchesTime); @@ -274,12 +231,12 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf float result = fishingTime - catchesTime; if (log.isDebugEnabled()) { - log.debug(decorate(trip) + " - trip search time = " + result); + log.debug(decorate(route) + " - trip search time = " + result); } return result; } - protected float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { + private float computeSetFishingTimeForFirstOrLayDay(Collection<Activity> activities) { float result = 0f; for (Activity activity : activities) { @@ -289,7 +246,7 @@ public class ComputeTripEffortsAction extends AbstractLevel0Action<ComputeTripEf } - protected boolean canComputeSetFishingTime(Collection<Activity> activities) { + private boolean canComputeSetFishingTime(Collection<Activity> activities) { boolean result = false; for (Activity activity : activities) { VesselActivity vesselActivity = activity.getVesselActivity(); ===================================== t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_en_GB.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Trip %s total rf1 catches weight %s / t t3.level0.computeRF2.resume.skip.for.trip=Trip %s has not elementary landing (trip not used to compute rf2) t3.level0.computeRF2.resume.total.rf1=Sum total rf1 catches weight %s / Sum total landing weight %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=SetDuration data not found (ocean %s, fleet %s, school type %s, year %s) -t3.level0.computeTripEffort=Trip efforts %s (sea %s, fishing%s, search%s) -t3.level0.computeTripEffortSkipForDay=Trip %s, Day (%s) without fihsing time (only activities of type « at harbour » or « under way without prospection ») +t3.level0.computeTripEffort=Trip efforts %s (fishing %s, search %s) +t3.level0.computeTripEffortSkipForDay=Trip %s, day without fishing time (only activities of type « at harbour » or « under way without prospection ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Weight category %s, weight \= %s, propWeight \= %s (activity %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Well (%s) with well plan filled %s wellSetAllSpecies, total weight %s t3.level0.convertCatchesWeightCategories.resume.for.species=Species %s < logBook total weight \= %s , converted total weight \= %s> ===================================== t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties ===================================== --- a/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties +++ b/t3-actions/src/main/resources/i18n/t3-actions_fr_FR.properties @@ -42,8 +42,8 @@ t3.level0.computeRF2.resume.rf1.for.trip=Marée %s Poids total des captures rf1i t3.level0.computeRF2.resume.skip.for.trip=La marée %s ne possède pas de lots commerciaux (non prise en compte dans le calcul du rf2) t3.level0.computeRF2.resume.total.rf1=Poids cumulé des captures rf1isées %s / Poids cumulé des ventes %s t3.level0.computeSetDurationAndPositiveSetCount.error.noSetDurationFound=Donnée SetDuration non trouvée (ocean %s, flotte %s, type de banc %s, année %s) -t3.level0.computeTripEffort=Efforts de la marée %s (mer %s, pêche %s, recherche %s) -t3.level0.computeTripEffortSkipForDay=Marée %s, Journée (%s) sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») +t3.level0.computeTripEffort=Efforts de la marée %s (pêche %s, recherche %s) +t3.level0.computeTripEffortSkipForDay=Marée %s, jour sans temps de pêche (uniquement des activités « au port » ou « route sans veille ») t3.level0.computeWellPlanWeightCategoriesProportions.resume.for.weightCategory=Catégorie de poids %s, poids \= %s, poids pondéré\= %s (activité %s) t3.level0.computeWellPlanWeightCategoriesProportions.well.withWellPlan=Cuve avec plan de cuve (%s) avec %s wellSetAllSpecies, poids total %s t3.level0.convertCatchesWeightCategories.resume.for.species=Espèce %s < poids total des captures du livre de bord \= %s , poids total converti \= %s> ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractRouteTopiaDao.java @@ -0,0 +1,55 @@ +package fr.ird.t3.entities.data; + +import fr.ird.t3.entities.type.T3Point; +import fr.ird.t3.entities.type.T3PointImpl; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; + +public class AbstractRouteTopiaDao<E extends Route> extends GeneratedRouteTopiaDao<E> { + + public T3Point getBarycenterForActivitiesOfADay(E route, Date day) throws TopiaException { + + TopiaSqlQuery<T3Point> query = new GetT3PointQuery<E>(route, day); + return topiaSqlSupport.findSingleResult(query); + } + + private static class GetT3PointQuery<E extends Route> extends TopiaSqlQuery<T3Point> { + private final E route; + + private final Date day; + + public GetT3PointQuery(E route, Date day) { + this.route = route; + this.day = day; + } + + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement ps = connection.prepareStatement( + "SELECT ST_X(record.point), ST_Y(record.point) FROM " + + "(" + + " SELECT ST_Centroid(ST_Collect(a.the_geom)) AS point" + + " FROM activity a " + + " WHERE a.route = ? AND a.date::DATE = ?" + + ") AS record;"); + ps.setString(1, route.getTopiaId()); + ps.setDate(2, new java.sql.Date(day.getTime())); + return ps; + } + + @Override + public T3Point prepareResult(ResultSet set) throws SQLException { + float x = set.getFloat(1); + float y = set.getFloat(2); + return new T3PointImpl(x, y); + } + } + +} + ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/AbstractTripTopiaDao.java @@ -128,13 +128,13 @@ public class AbstractTripTopiaDao<E extends Trip> extends GeneratedTripTopiaDao< // query = createQuery("t") // .setSelect("t.id") // .addWhere("size(t." + Trip.PROPERTY_ACTIVITY + ") = 0"); - hql = "SELECT t.id FROM TripImpl t WHERE size(t.activity) = 0"; + hql = "SELECT t.id FROM TripImpl as t WHERE size(t.route) = 0"; // params = Collections.emptyList(); } else { // query = new TopiaQuery(Activity.class, "a") // .setSelect("distinct(a.trip.id)") // .addWhere("a.ocean", TopiaQuery.Op.EQ, ocean); - hql = "SELECT DISTINCT(a.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; + hql = "SELECT DISTINCT(a.route.trip.id) FROM ActivityImpl a WHERE a.ocean = :ocean"; paramsBuilder.put("ocean", ocean); // params = Lists.<Object>newArrayList("ocean", ocean); } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/ActivityImpl.java @@ -26,12 +26,13 @@ import fr.ird.t3.entities.reference.VesselActivity; import fr.ird.t3.entities.type.T3Point; import fr.ird.t3.entities.type.T3PointImpl; import fr.ird.type.CoordinateHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Implementation of {@link Activity} with manual quadrant @@ -60,6 +61,11 @@ public class ActivityImpl extends ActivityAbstract { protected Integer quadrant; @Override + public Trip getTrip() { + return getRoute().getTrip(); + } + + @Override public Integer getQuadrant() { if (quadrant == null) { ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/RouteImpl.java @@ -0,0 +1,49 @@ +package fr.ird.t3.entities.data; + +public class RouteImpl extends RouteAbstract { + + private static final long serialVersionUID = 1L; + + /** @return the sum of all activities set duration in hours. */ + @Override + public float getTotalSetsDuration() { + float result = 0; + if (!isActivityEmpty()) { + for (Activity activity : getActivity()) { + + // get the setDuration + Float setTime = activity.getSetDuration(); + + result += setTime == null ? 0f : setTime; + } + } + return result / 60; + } + + @Override + public void deleteComputedDataLevel0() { + setComputedFishingTimeN0(null); + setComputedSearchTimeN0(null); + ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + } + + @Override + public void deleteComputedData() { + ComputedDataHelper.deleteComputedDatas(this); + } + + @Override + public void deleteComputedDataLevel1() { + ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + } + + @Override + public void deleteComputedDataLevel2() { + ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + } + + @Override + public void deleteComputedDataLevel3() { + ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + } +} ===================================== t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/data/TripImpl.java @@ -30,9 +30,17 @@ import fr.ird.t3.entities.reference.Ocean; import fr.ird.t3.entities.reference.Species; import fr.ird.t3.entities.reference.Vessel; import fr.ird.t3.entities.reference.VesselImpl; +import org.nuiton.util.DateUtil; import java.util.Collection; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.nuiton.i18n.I18n.n; @@ -119,21 +127,21 @@ public class TripImpl extends TripAbstract { return result; } - /** @return the sum of all activities set duration in hours. */ - @Override - public float getTotalSetsDuration() { - float result = 0; - if (!isActivityEmpty()) { - for (Activity activity : getActivity()) { - - // get the setDuration - Float setTime = activity.getSetDuration(); - - result += setTime == null ? 0f : setTime; - } - } - return result / 60; - } +// /** @return the sum of all activities set duration in hours. */ +// @Override +// public float getTotalSetsDuration() { +// float result = 0; +// if (!isActivityEmpty()) { +// for (Activity activity : getActivity()) { +// +// // get the setDuration +// Float setTime = activity.getSetDuration(); +// +// result += setTime == null ? 0f : setTime; +// } +// } +// return result / 60; +// } @Override public float getElementaryCatchTotalWeight(Collection<Species> species) { @@ -436,19 +444,17 @@ public class TripImpl extends TripAbstract { setCompletionStatus(null); setRf1(null); setRf2(null); - setComputedFishingTimeN0(null); - setComputedSearchTimeN0(null); - setComputedTimeAtSeaN0(null); +// setComputedFishingTimeN0(null); +// setComputedSearchTimeN0(null); +// setComputedTimeAtSeaN0(null); - ComputedDataHelper.deleteComputedDataLevel0(getActivity()); + ComputedDataHelper.deleteComputedDataLevel0(getRoute()); ComputedDataHelper.deleteComputedDataLevel0(getSample()); ComputedDataHelper.deleteComputedDataLevel0(getWell()); } @Override public void deleteComputedDataLevel1() { - - // level 1 flags setExtrapolateSampleCountedAndMeasured(false); setStandardizeSampleMeasures(false); setComputeWeightOfCategoriesForSet(false); @@ -457,27 +463,97 @@ public class TripImpl extends TripAbstract { setConvertSetSpeciesFrequencyToWeight(false); setConvertSampleSetSpeciesFrequencyToWeight(false); - ComputedDataHelper.deleteComputedDataLevel1(getActivity()); + ComputedDataHelper.deleteComputedDataLevel1(getRoute()); ComputedDataHelper.deleteComputedDataLevel1(getSample()); ComputedDataHelper.deleteComputedDataLevel1(getWell()); } @Override public void deleteComputedDataLevel2() { - // level 2 flags - - ComputedDataHelper.deleteComputedDataLevel2(getActivity()); + ComputedDataHelper.deleteComputedDataLevel2(getRoute()); ComputedDataHelper.deleteComputedDataLevel2(getSample()); ComputedDataHelper.deleteComputedDataLevel2(getWell()); } @Override public void deleteComputedDataLevel3() { - // level 3 flags - - ComputedDataHelper.deleteComputedDataLevel3(getActivity()); + ComputedDataHelper.deleteComputedDataLevel3(getRoute()); ComputedDataHelper.deleteComputedDataLevel3(getSample()); ComputedDataHelper.deleteComputedDataLevel3(getWell()); } + @Override + public int getComputedTimeAtSeaN0() { + return 24 * sizeRoute(); + } + + @Override + public int sizeActivity() { + return (int) activityStream().count(); + } + + @Override + public boolean isActivityEmpty() { + return isRouteEmpty() || activityStream().count() == 0; + } + + @Override + public boolean isActivityNotEmpty() { + return isRouteNotEmpty() && activityStream().count() > 0; + } + + @Override + public List<Activity> getActivity() { + return activityStream().collect(Collectors.toList()); + } + + @Override + public void setActivity(List<Activity> activities) { + clearRoute(); + for (Activity activity : activities) { + addActivity(activity); + } + } + + @Override + public Activity getActivityByTopiaId(String topiaId) { + return activityStream().filter(a -> topiaId.equals(a.getTopiaId())).findFirst().orElse(null); + } + + @Override + public Collection<String> getActivityTopiaIds() { + return activityStream().map(Activity::getTopiaId).collect(Collectors.toList()); + } + + @Override + public void addActivity(Activity activity) { + Date date = DateUtil.getDay(activity.getDate()); + Optional<Route> optionalRoute = routeStream().filter(r -> Objects.equals(r.getDate(), date)).findFirst(); + Route route; + if (optionalRoute.isPresent()) { + route = optionalRoute.get(); + } else { + route = new RouteImpl(); + route.setDate(date); + addRoute(route); + } + route.addActivity(activity); + } + + @Override + public List<Route> getRoute() { + List<Route> route = super.getRoute(); + if (route == null) { + setRoute(route = new LinkedList<>()); + } + return route; + } + + private Stream<Route> routeStream() { + return getRoute().stream(); + } + + private Stream<Activity> activityStream() { + return routeStream().flatMap(r -> r.getActivity().stream()); + } } ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractCountryTopiaDao.java @@ -126,7 +126,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.fleetCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) > 0") @@ -155,7 +155,7 @@ public class AbstractCountryTopiaDao<E extends Country> extends GeneratedCountry // .addParam("oceanId", oceanId); String hql = "SELECT DISTINCT(c) " + - "FROM CountryImpl c, TripImpl t LEFT JOIN t.activity as a " + + "FROM CountryImpl c, TripImpl t LEFT JOIN t.route as r LEFT JOIN r.activity as a " + "WHERE t.vessel.flagCountry = c.id AND a.ocean.id = :oceanId"; // FIXME : trouvé pk cela est aussi long... // .addWhere("(SELECT count(*) FROM " + SetSpeciesFrequencyImpl.class.getSimpleName() + " s WHERE s." + SetSpeciesFrequency.PROPERTY_ACTIVITY + " = a.id) >0") ===================================== t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java +++ b/t3-domain/src/main/java/fr/ird/t3/entities/reference/AbstractVesselSimpleTypeTopiaDao.java @@ -37,11 +37,11 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend /** * Obtains all vessel simple types used by all trips in the database. * - * @param sampleOnly if null no filter else filter on value + * @param samplesOnly if null no filter else filter on value * @return the set of used vessel simple types in trips in the database * @throws TopiaException if any problem while querying the database */ - public Set<E> findAllUsedInTrip(Boolean sampleOnly) throws TopiaException { + public Set<E> findAllUsedInTrip(Boolean samplesOnly) throws TopiaException { // TopiaQuery query = createQuery("vst") // .addFrom(Trip.class, "t") @@ -50,8 +50,8 @@ public class AbstractVesselSimpleTypeTopiaDao<E extends VesselSimpleType> extend // Vessel.PROPERTY_VESSEL_TYPE + "." + // VesselType.PROPERTY_VESSEL_SIMPLE_TYPE + " = vst.id"); - String sampleOnlyFilter = sampleOnly == null ? "" : (" AND t.sampleOnly = " + sampleOnly); - String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + sampleOnlyFilter; + String samplesOnlyFilter = samplesOnly == null ? "" : (" AND t.samplesOnly = " + samplesOnly); + String hql = "SELECT DISTINCT(vst) FROM VesselSimpleTypeImpl vst, TripImpl t WHERE t.vessel.vesselType.vesselSimpleType = vst.id" + samplesOnlyFilter; return new HashSet<>(findAll(hql)); // return T3EntityHelper.querytoSet(hql, this); } ===================================== t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java ===================================== --- a/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java +++ b/t3-domain/src/main/java/fr/ird/t3/services/DecoratorService.java @@ -25,6 +25,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ird.t3.entities.data.Activity; import fr.ird.t3.entities.data.CompleteTrip; +import fr.ird.t3.entities.data.Route; import fr.ird.t3.entities.data.Sample; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; @@ -167,6 +168,9 @@ public class DecoratorService extends T3ServiceSupport implements T3ServiceSingl // trip decorator registerJXPathDecorator(locale, Trip.class, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY"); + // route decorator + registerJXPathDecorator(locale, Route.class, "${trip.vesselLabel}$s - ${trip.landingDate}$td/%2$tm/%2$tY - ${date}$td/%3$tm/%3$tY"); + // trip (with topiaid) decorator registerJXPathDecorator(locale, Trip.class, WITH_ID, "${vesselLabel}$s - ${landingDate}$td/%2$tm/%2$tY [${topiaId}$s]"); ===================================== t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java ===================================== --- /dev/null +++ b/t3-domain/src/main/java/fr/ird/t3/services/migration/T3MigrationCallbackV2_2.java @@ -0,0 +1,133 @@ +package fr.ird.t3.services.migration; + +/* + * #%L + * T3 :: Domain + * %% + * Copyright (C) 2010 - 2017 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.auto.service.AutoService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.migration.TopiaMigrationCallbackByClassNG; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.support.TopiaSqlQuery; +import org.nuiton.topia.persistence.support.TopiaSqlSupport; +import org.nuiton.util.DateUtil; +import org.nuiton.version.Versions; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Created by tchemit on 18/02/2018. + * + * @author Tony Chemit - dev(a)tchemit.fr + */ +@AutoService(TopiaMigrationCallbackByClassNG.MigrationCallBackForVersion.class) +public class T3MigrationCallbackV2_2 extends T3MigrationCallbackSupport { + + private static final Log log = LogFactory.getLog(T3MigrationCallbackV2_2.class); + + public T3MigrationCallbackV2_2() { + super(Versions.valueOf("2.2")); + } + + @Override + protected void prepareMigrationScript(TopiaSqlSupport sqlSupport, List<String> queries, boolean showSql, boolean showProgression) throws TopiaException { + addScript("07", "add-Route-table", queries); + + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<String> tripList = sqlSupport.findMultipleResult(new TopiaSqlQuery<String>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + return connection.prepareStatement("SELECT DISTINCT(a.trip) FROM activity a"); + } + + @Override + public String prepareResult(ResultSet set) throws SQLException { + return set.getString(1); + } + }); + + for (String tripId : tripList) { + + int i = tripId.indexOf('#'); + String routeIdPrefix = "fr.ird.t3.entities.data.Route#" + tripId.substring(i + 1, tripId.lastIndexOf('#') + 1); + + log.info("Route prefix: " + routeIdPrefix); + List<TripActivity> activityList = sqlSupport.findMultipleResult(new TopiaSqlQuery<TripActivity>() { + @Override + public PreparedStatement prepareQuery(Connection connection) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT a.topiaId, a.date FROM activity a WHERE a.trip = ?"); + preparedStatement.setString(1, tripId); + return preparedStatement; + } + + @Override + public TripActivity prepareResult(ResultSet set) throws SQLException { + return new TripActivity(set.getString(1), set.getDate(2)); + } + }); + + + Set<Date> days = new LinkedHashSet<>(); + int activityIndex = 0; + for (TripActivity activity : activityList) { + + String dayDateStr = df.format(activity.date); + String routeId = routeIdPrefix + dayDateStr.replaceAll("-", ""); + + if (days.add(activity.date)) { + + log.info(String.format("[%s] new Route: %s", tripId, routeId)); + // create new route + queries.add(String.format("INSERT INTO Route(topiaId, topiaVersion, topiaCreateDate, trip, date, trip_idx) VALUES('%s', 0, CURRENT_TIMESTAMP, '%s', to_date('%s', 'YYY-MM-DD'), %d);", routeId, tripId, dayDateStr, days.size())); + } + queries.add(String.format("UPDATE Activity SET route = '%s', route_idx = %d , topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", routeId, (activityIndex++), activity.activity)); + } + + if (!activityList.isEmpty()) { + queries.add(String.format("UPDATE Trip SET effortComputed = false, topiaVersion = topiaVersion + 1 WHERE topiaId = '%s';", tripId)); + } + } + + addScript("08", "remove-trip-fields", queries); + } + + private static class TripActivity { + + private final String activity; + private final Date date; + + private TripActivity(String activity, Date date) { + this.activity = activity; + this.date = DateUtil.getDay(date); + } + } + +} ===================================== t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_07_add-Route-table.sql @@ -0,0 +1,29 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- +CREATE TABLE Route( topiaid VARCHAR(255) PRIMARY KEY NOT NULL, topiaversion BIGINT NOT NULL, topiacreatedate TIMESTAMP NOT NULL, trip VARCHAR(255) NOT NULL, date DATE NOT NULL, computedFishingTimeN0 REAL, computedSearchTimeN0 REAL, trip_id INTEGER); +CREATE UNIQUE INDEX uk_route ON Route(trip, date); +ALTER TABLE Route ADD CONSTRAINT fk_route_trip FOREIGN KEY (trip) REFERENCES Trip(topiaid); +CREATE INDEX idx_route_trip ON Route(trip); + +ALTER TABLE Activity ADD COLUMN route VARCHAR(255); +ALTER TABLE Activity ADD COLUMN route_idx INTEGER; +ALTER TABLE Activity ADD CONSTRAINT fk_activity_route FOREIGN KEY (route) REFERENCES Route(topiaid); +CREATE INDEX idx_activity_route ON Activity(route); ===================================== t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql ===================================== --- /dev/null +++ b/t3-domain/src/main/resources/db/migration/V2_2_08_remove-Trip-fields.sql @@ -0,0 +1,27 @@ +--- +-- #%L +-- T3 :: Domain +-- %% +-- Copyright (C) 2010 - 2018 IRD, Code Lutin, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU Affero 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 Affero General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- #L% +--- + +ALTER TABLE Activity DROP COLUMN trip; +ALTER TABLE Activity DROP COLUMN trip_idx; +ALTER TABLE Activity DROP COLUMN date; +ALTER TABLE Trip DROP COLUMN computedfishingtimen0; +ALTER TABLE Trip DROP COLUMN computedsearchtimen0; +ALTER TABLE Trip DROP COLUMN computedtimeatsean0; ===================================== t3-domain/src/main/xmi/t3-persistence.properties ===================================== --- a/t3-domain/src/main/xmi/t3-persistence.properties +++ b/t3-domain/src/main/xmi/t3-persistence.properties @@ -22,11 +22,17 @@ model.tagValue.notGenerateToString=true model.tagValue.generateOperatorForDAOHelper=true model.tagValue.constantPrefix=PROPERTY_ -model.tagValue.version=2.1 +model.tagValue.version=2.2 model.tagValue.indexForeignKeys=true -fr.ird.t3.entities.data.Trip.attribute.activity.stereotype=ordered -fr.ird.t3.entities.data.Trip.attribute.activity.tagvalue.orderBy=date +fr.ird.t3.entities.data.Trip.attribute.route.stereotype=ordered +fr.ird.t3.entities.data.Route.attribute.activity.stereotype=ordered + +fr.ird.t3.entities.data.Trip.attribute.route.tagvalue.orderBy=date +fr.ird.t3.entities.data.Route.attribute.activity.tagvalue.orderBy=date + +fr.ird.t3.entities.data.Route.attribute.date.tagvalue.hibernateAttributeType.java.util.Date=date +fr.ird.t3.entities.data.Activity.attribute.time.tagvalue.hibernateAttributeType.java.util.Date=time fr.ird.t3.entities.data.Activity.attribute.comment.tagvalue.sqlType=text fr.ird.t3.entities.data.LocalMarketBatch.attribute.origin.tagvalue.sqlType=text ===================================== t3-domain/src/main/xmi/t3-persistence.zargo ===================================== Binary files a/t3-domain/src/main/xmi/t3-persistence.zargo and b/t3-domain/src/main/xmi/t3-persistence.zargo differ ===================================== t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java ===================================== --- a/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java +++ b/t3-domain/src/test/java/fr/ird/t3/entities/T3PersistenceFixtures.java @@ -56,8 +56,8 @@ public class T3PersistenceFixtures { return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date); } - public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean sampleOnly) { - return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, sampleOnly); + public static Trip newTrip(T3TopiaPersistenceContext tx, int code, Date date, boolean samplesOnly) { + return tx.getTripDao().create(Trip.PROPERTY_CODE, code, Trip.PROPERTY_LANDING_DATE, date, Trip.PROPERTY_SAMPLES_ONLY, samplesOnly); } public static Harbour newHarbour(T3TopiaPersistenceContext tx, int code) { ===================================== t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java ===================================== --- a/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java +++ b/t3-input-avdthv33/src/main/java/fr/ird/t3/io/input/avdth/v33/T3AccessEntityMetaProviderAvdth33.java @@ -55,11 +55,12 @@ import fr.ird.t3.io.input.access.T3AccessEntityMeta; import fr.ird.t3.io.input.access.T3AccessEntityMetaProvider; import fr.ird.t3.io.input.access.T3AccessReferentielEntityMeta; import fr.ird.t3.io.input.access.type.IntToBoolean; -import java.util.Date; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Date; +import java.util.Set; + /** * Provider of {@link T3AccessEntityMeta}. * @@ -86,9 +87,7 @@ public class T3AccessEntityMetaProviderAvdth33 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionIT.java @@ -163,7 +163,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -172,7 +172,7 @@ public class AnalyzeInputSourceActionIT implements T3AVDTHV33Test { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java ===================================== --- a/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java +++ b/t3-input-avdthv33/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionIT.java @@ -115,14 +115,14 @@ public class ImportInputSourceActionIT implements T3AVDTHV33Test { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java ===================================== --- a/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java +++ b/t3-input-avdthv35/src/main/java/fr/ird/t3/io/input/avdth/v35/T3AccessEntityMetaProviderAvdth35.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -98,9 +98,7 @@ public class T3AccessEntityMetaProviderAvdth35 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{/* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -165,7 +165,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -174,7 +174,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv35/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); ===================================== t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java ===================================== --- a/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java +++ b/t3-input-avdthv36/src/main/java/fr/ird/t3/io/input/avdth/v36/T3AccessEntityMetaProviderAvdth36.java @@ -34,9 +34,9 @@ import fr.ird.t3.entities.data.LocalMarketSampleSpeciesFrequency; import fr.ird.t3.entities.data.LocalMarketSampleWell; import fr.ird.t3.entities.data.LocalMarketSurvey; import fr.ird.t3.entities.data.Sample; +import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.SampleSpecies; import fr.ird.t3.entities.data.SampleSpeciesFrequency; -import fr.ird.t3.entities.data.SampleSet; import fr.ird.t3.entities.data.Trip; import fr.ird.t3.entities.data.Well; import fr.ird.t3.entities.data.WellPlan; @@ -100,9 +100,7 @@ public class T3AccessEntityMetaProviderAvdth36 implements T3AccessEntityMetaProv Activity.PROPERTY_ACTIVITY_FISHING_CONTEXT, ActivityFishingContext.class, Activity.PROPERTY_ELEMENTARY_CATCH, ElementaryCatch.class }, - new Object[]{ - Activity.PROPERTY_TRIP, Trip.class - }, + new Object[]{ /* Nothing to do any longer */}, Activity.PROPERTY_DATE, Date.class, "D_ACT", Activity.PROPERTY_NUMBER, Integer.class, "N_ACT", Activity.PROPERTY_OCEAN, Ocean.class, "C_OCEA", ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/AnalyzeInputSourceActionITSupport.java @@ -168,7 +168,7 @@ public class AnalyzeInputSourceActionITSupport { int nbUnsafe, int nbSafeWithoutwell, int nbUnsafeWithoutWell, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { @@ -177,7 +177,7 @@ public class AnalyzeInputSourceActionITSupport { T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); AnalyzeInputSourceConfiguration actionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, useWells, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, useWells, samplesOnly, canCreateVessel, createVirtualVessel ); T3ActionContext<AnalyzeInputSourceConfiguration> context = serviceFactory.newT3ActionContext(actionConfiguration, serviceContext); ===================================== t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java ===================================== --- a/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java +++ b/t3-input-avdthv36/src/test/java/fr/ird/t3/actions/io/input/ImportInputSourceActionITSupport.java @@ -116,14 +116,14 @@ public abstract class ImportInputSourceActionITSupport { } public void testExecute(int nbSafe, int nbUnsafe, - boolean sampleOnly, + boolean samplesOnly, boolean canCreateVessel, boolean createVirtualVessel) throws Exception { if (msConfig.doTest(serviceContext.getTestName())) { AnalyzeInputSourceConfiguration analyzeActionConfiguration = AnalyzeInputSourceConfiguration.newConfiguration( - inputProvider, target, true, sampleOnly, canCreateVessel, createVirtualVessel + inputProvider, target, true, samplesOnly, canCreateVessel, createVirtualVessel ); T3ServiceFactory serviceFactory = serviceContext.getServiceFactory(); View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/774f886a4dea29332f9c4af01b2766c7… --- View it on GitLab: https://gitlab.com/ultreiaio/ird-t3/commit/774f886a4dea29332f9c4af01b2766c7… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • ...
  • 43
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.