Author: blavenier Date: 2013-02-01 12:45:40 +0100 (Fri, 01 Feb 2013) New Revision: 288 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/288 Log: - CruisePersistenceService : Fix save : remove old gear if need - SpeciesBatchPersistenceService : Add impl on deleteSpeciesbatch() and deleteSpeciesSubBatch() + Unit test Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceImpl.java 2013-02-01 11:45:40 UTC (rev 288) @@ -27,10 +27,13 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import javax.annotation.Resource; @@ -47,6 +50,7 @@ import fr.ifremer.adagio.core.dao.administration.user.PersonDao; import fr.ifremer.adagio.core.dao.data.measure.GearPhysicalMeasurement; +import fr.ifremer.adagio.core.dao.data.measure.GearUseMeasurement; import fr.ifremer.adagio.core.dao.data.survey.fishingTrip.FishingTrip; import fr.ifremer.adagio.core.dao.data.survey.fishingTrip.ObservedFishingTrip; import fr.ifremer.adagio.core.dao.data.survey.scientificCruise.ScientificCruise; @@ -490,9 +494,18 @@ if (copyIfNull && source.isGearEmpty() && fishingTrip.getGearPhysicalFeatures() != null) { fishingTrip.getGearPhysicalFeatures().clear(); } else if (!source.isGearEmpty()) { + // Create a list to trace not updated items, to be able to remove them later + Set<GearPhysicalFeatures> notChangedGearPhysicalFeatures = new HashSet<GearPhysicalFeatures>(); + if (fishingTrip.getGearPhysicalFeatures() != null) { + notChangedGearPhysicalFeatures.addAll(fishingTrip.getGearPhysicalFeatures()); + } + + // Create or update a geaPhysicalFeatures for each gears in the cruise for (int i = 0; i < source.getGear().size(); i++) { Gear gear = source.getGear().get(i); GearPhysicalFeatures guf = measurementHelper.getGearPhysicalfeatures(fishingTrip, Integer.valueOf(gear.getId()), true); + notChangedGearPhysicalFeatures.remove(guf); + guf.setStartDate(fishingTrip.getDepartureDateTime()); guf.setEndDate(fishingTrip.getReturnDateTime()); guf.setVessel(fishingTrip.getVessel()); @@ -509,6 +522,16 @@ measurementHelper.setGearPhysicalMeasurement(target, guf, enumeration.PMFM_ID_MULTIRIG_NUMBER, Float.valueOf(source.getMultirigNumber()), null, null); } } + + // Remove deleted gear physical features + if (fishingTrip.getGearPhysicalFeatures() != null && notChangedGearPhysicalFeatures.size() > 0) { + for (GearPhysicalFeatures guf : notChangedGearPhysicalFeatures) { + if (guf.getGearPhysicalMeasurements() != null) { + guf.getGearPhysicalMeasurements().clear(); + } + fishingTrip.getGearPhysicalFeatures().remove(guf); + } + } } // Save miscDataBuffer into fishing trip comments, because it's not used in Allegro Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-01 11:45:40 UTC (rev 288) @@ -544,7 +544,7 @@ vesselUseFeatures = target.getVesselUseFeatures().iterator().next(); } - // Create a list to store all updates, then remove not updated items + // Create a list to trace not updated items, to be able to remove them later Set<VesselUseMeasurement> notChangedVesselUseMeasurements = new HashSet<VesselUseMeasurement>(); if (vesselUseFeatures.getVesselUseMeasurements() != null) { notChangedVesselUseMeasurements.addAll(vesselUseFeatures.getVesselUseMeasurements()); Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-01 11:45:40 UTC (rev 288) @@ -80,6 +80,7 @@ import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.service.measure.MeasurementPersistenceHelper; @@ -234,10 +235,19 @@ @Override public void deleteSpeciesBatch(String id) { + Preconditions.checkNotNull(id); + + getCurrentSession().setFlushMode(FlushMode.COMMIT); + + List<SortingBatch> allChildrenBatchs = Lists.newArrayList(); + removeAllChildrenBatchs(Integer.valueOf(id), allChildrenBatchs); + + getCurrentSession().flush(); } @Override public void deleteSpeciesSubBatch(String id) { + deleteSpeciesBatch(id); } @Override @@ -387,10 +397,10 @@ // Retrieve category type Integer pmfmId = measurementHelper.sampleCategory2PmfmId(source.getSampleCategoryType()); if (pmfmId == null || !pmfmId.equals(enumeration.PMFM_ID_SORTED_UNSORTED)) { - throw new DataIntegrityViolationException(MessageFormat.format("A species batch with no parent should have a sampleCategoryType with id={0}.", - new Object[]{enumeration.PMFM_ID_SORTED_UNSORTED})); + throw new DataIntegrityViolationException(MessageFormat.format("A species batch with no parent should have a sampleCategoryType {0} (PMFM.ID={1})", + new Object[]{SampleCategoryEnum.sortedUnsorted.name(), enumeration.PMFM_ID_SORTED_UNSORTED})); } - Integer qualitativeValueId = Integer.valueOf(source.getSampleCategoryValue().toString()); + Integer qualitativeValueId = convertSampleCategoryValueIntoQualitativeId(source.getSampleCategoryValue()); Object[] cols = queryUnique("parentBatch", "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(source.getFishingOperation().getId()), @@ -399,6 +409,9 @@ "pmfmIdSortingType", IntegerType.INSTANCE, enumeration.PMFM_ID_SORTING_TYPE, "qualitativeIdSortingType", IntegerType.INSTANCE, enumeration.QUALITATIVE_ID_SORTING_TYPE_SPECIES); + if (cols == null) { + throw new DataIntegrityViolationException("Catch batchs not presents, or invalid batch tree structure. Please make sure CatchBatch has been saved before to create a SpeciesBatch."); + } // Parent Batch Integer parentBatchId = (Integer)cols[0]; SortingBatch parentBatch = load(SortingBatchImpl.class, parentBatchId); @@ -522,6 +535,37 @@ applyInheritedProperties(speciesBatch.getChildBatchs(), (hasAppliedCategoryValue ? null : inheritedSampleCategoryValue), speciesBatch.getSpecies(), result); + } + } + Integer convertSampleCategoryValueIntoQualitativeId(Serializable value) { + if (value == null) return null; + Integer qualitativeValueId = null; + if (value instanceof CaracteristicQualitativeValue) { + CaracteristicQualitativeValue cqValue =(CaracteristicQualitativeValue)value; + qualitativeValueId = Integer.valueOf(cqValue.getId()); } + else if (value instanceof String){ + qualitativeValueId = Integer.valueOf((String)value); + } + return qualitativeValueId; } + + protected void removeAllChildrenBatchs(Integer batchId, List<SortingBatch> result) { + Iterator<Integer> list = queryListTyped("speciesBatchChildren", + "batchId", IntegerType.INSTANCE, batchId); + + // First, add childrens + while (list.hasNext()) { + + removeAllChildrenBatchs(list.next(), result); + } + + // Then add the given batch (after children, because of order need in "delete") + SortingBatch batch = sortingBatchDao.load(batchId); + //SortingBatch batch = (SortingBatch)getCurrentSession().get(SortingBatchImpl.class, batchId); + batch.getSortingMeasurements().clear(); + batch.getQuantificationMeasurements().clear(); + sortingBatchDao.remove(batch); + } + } Modified: trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml =================================================================== --- trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/main/resources/queries-override.hbm.xml 2013-02-01 11:45:40 UTC (rev 288) @@ -434,7 +434,19 @@ ]]> <query-param name="batchId" type="java.lang.Integer"/> </query> - + + <query name="speciesBatchChildren"> + <![CDATA[ + SELECT + cb.id + FROM + SortingBatchImpl b + INNER JOIN b.childBatchs cb + WHERE + b.id = :batchId + ]]> + <query-param name="batchId" type="java.lang.Integer"/> + </query> <!-- ===================================================================== --> <!-- === Requete techniques sur référentiels [REF-TXXX] === --> Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java =================================================================== --- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/CruisePersistenceServiceTest.java 2013-02-01 11:45:40 UTC (rev 288) @@ -41,6 +41,7 @@ import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.Iterator; import java.util.List; import static org.junit.Assert.assertEquals; @@ -198,19 +199,53 @@ @Test public void saveCruise(/*Cruise bean*/) { - Cruise cruise = service.getCruise(dbResource.getFixtures().cruiseId()); + // ----------------------------------------------------------------------------- + // 1. Init a cruise (by copy) + // ----------------------------------------------------------------------------- + Cruise cruise = service.getCruise(dbResource.getFixtures().cruiseId()); cruise.setId(null); + Calendar calendar = new GregorianCalendar(); + cruise.setBeginDate(calendar.getTime()); + + cruise.setYear(calendar.get(Calendar.YEAR)); + + calendar.add(Calendar.MONTH, 1); // add one month + cruise.setEndDate(calendar.getTime()); + cruise = service.createCruise(cruise); + + // ----------------------------------------------------------------------------- + // 2. Apply some changes + // ----------------------------------------------------------------------------- + // Name : cruise.setName("Unit-test-" + System.currentTimeMillis()); + + // Remove gear, then add another gear + Gear previousGear = cruise.getGear(0); + cruise.getGear().clear(); + List<Gear> gears = referentialService.getAllFishingGear(); + for (Iterator iterator = gears.iterator(); iterator.hasNext();) { + Gear gear = (Gear) iterator.next(); + + // Make sure the gear is different before to add it + if (gear.getId() != null && !gear.getId().equals(previousGear.getId())) { + cruise.addGear(gear); + break; + } + } + // Save changes, then check Cruise savedCruise = service.saveCruise(cruise); assertNotNull(savedCruise); - assertEquals(cruise.getId(), savedCruise.getId()); - assertEquals(cruise.getName(), savedCruise.getName()); - assertEquals(cruise.getComment(), savedCruise.getComment()); - assertNotNull(cruise.getGear()); - assertEquals(cruise.getGear().size(), savedCruise.getGear().size()); + Cruise reloadedCruise = service.getCruise(savedCruise.getId()); + + assertEquals(cruise.getId(), reloadedCruise.getId()); + assertEquals(cruise.getName(), reloadedCruise.getName()); + assertEquals(cruise.getComment(), reloadedCruise.getComment()); + assertNotNull(reloadedCruise.getGear()); + assertEquals(cruise.getGear().size(), reloadedCruise.getGear().size()); + assertEquals(cruise.getGear(0).getId(), reloadedCruise.getGear(0).getId()); } } Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java =================================================================== --- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-01 11:12:52 UTC (rev 287) +++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-01 11:45:40 UTC (rev 288) @@ -42,6 +42,8 @@ import org.junit.ClassRule; import org.junit.Ignore; import org.junit.Test; +import org.springframework.dao.DataRetrievalFailureException; + import static org.junit.Assert.*; /** @@ -64,6 +66,16 @@ protected FishingOperation fishingOperation; protected CatchBatch catchBacth; protected List<Species> species; + protected Caracteristic sortedUnsortedPMFM; + protected String horsVracQualitativeValueId; + protected String vracQualitativeValueId; + protected Caracteristic maturityPMFM; + protected String firstMaturityQualitativeValueId; + protected Caracteristic sexPMFM; + protected String maleQualitativeValueId; + protected String femaleQualitativeValueId; + protected String unkQualitativeValueId; + protected String speciesBacthId = null; @@ -109,24 +121,25 @@ species = referentialService.getAllSpecies(); assertNotNull(species); assertTrue(species.size() > 2); + + sortedUnsortedPMFM = referentialService.getSortedUnsortedCaracteristic(); + horsVracQualitativeValueId = sortedUnsortedPMFM.getQualitativeValue(0).getId(); + vracQualitativeValueId = sortedUnsortedPMFM.getQualitativeValue(1).getId(); + maturityPMFM = referentialService.getMaturityCaracteristic(); + firstMaturityQualitativeValueId = maturityPMFM.getQualitativeValue(0).getId(); + sexPMFM = referentialService.getSexCaracteristic(); + maleQualitativeValueId = sexPMFM.getQualitativeValue(1).getId(); + femaleQualitativeValueId = sexPMFM.getQualitativeValue(2).getId(); + unkQualitativeValueId = sexPMFM.getQualitativeValue(3).getId(); } @Test public void createSpeciesBatch(/*SpeciesBatch bean, String parentBatchId*/) { - Caracteristic sortedUnsortedPMFM = referentialService.getSortedUnsortedCaracteristic(); - String horsVracQualitativeValueId = sortedUnsortedPMFM.getQualitativeValue(0).getId(); - String vracQualitativeValueId = sortedUnsortedPMFM.getQualitativeValue(1).getId(); - Caracteristic maturityPMFM = referentialService.getMaturityCaracteristic(); - String firstMaturityQualitativeValueId = maturityPMFM.getQualitativeValue(0).getId(); - Species taxon1 = species.get(0); - Species taxon2 = species.get(1); - Caracteristic sexPMFM = referentialService.getSexCaracteristic(); - String maleQualitativeValueId = sexPMFM.getQualitativeValue(1).getId(); - String femaleQualitativeValueId = sexPMFM.getQualitativeValue(2).getId(); - String unkQualitativeValueId = sexPMFM.getQualitativeValue(3).getId(); SpeciesBatch esp1Batch = null; SpeciesBatch esp2Batch = null; SpeciesBatch batch = null; + Species taxon1 = species.get(0); + Species taxon2 = species.get(1); // ----------------------------------------------------------------------------- // 1. Test with only mandatory properties @@ -271,13 +284,53 @@ } @Test - @Ignore public void deleteSpeciesBatch(/*String id*/) { + SpeciesBatch esp1Batch = null; + SpeciesBatch childBatch = null; + SpeciesBatch batch = null; + Species taxon1 = species.get(0); + + // ----------------------------------------------------------------------------- + // 1. Create two batchs (parent + child), then remove the parent batch + // ----------------------------------------------------------------------------- + // batch : ESP1 Vrac/5 + batch = new SpeciesBatch(); + batch.setParentBatch(null); + batch.setFishingOperation(fishingOperation); + batch.setSpecies(taxon1); + batch.setSampleCategoryType(SampleCategoryEnum.sortedUnsorted); + batch.setSampleCategoryValue(vracQualitativeValueId); + batch.setWeight(5f); + assertCreateAndReloadSpeciesBatch(batch, null); + esp1Batch = batch; + + // batch : ESP1 Vrac/5 Male/2 + batch = new SpeciesBatch(); + batch.setParentBatch(esp1Batch); + batch.setFishingOperation(fishingOperation); + batch.setSpecies(taxon1); + batch.setSampleCategoryType(SampleCategoryEnum.sex); + batch.setSampleCategoryValue(maleQualitativeValueId); + batch.setWeight(2f); + assertCreateAndReloadSpeciesBatch(batch, esp1Batch.getId()); + + // Try to remove + service.deleteSpeciesBatch(esp1Batch.getId()); + + // Check if remove + try { + batch = service.getSpeciesBatch(esp1Batch.getId()); + assertNull(batch); + } + catch(DataRetrievalFailureException drfe) { + assertNotNull(drfe); + } } @Test @Ignore public void deleteSpeciesSubBatch(/*String id*/) { + // Idem deleteSpeciesBatch } @Test