Author: tchemit Date: 2013-05-06 21:33:55 +0200 (Mon, 06 May 2013) New Revision: 921 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/921 Log: refs #1975: [TRAIT] - Pouvoir supprimer un trait Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/DeleteFishingOperationAction.java Modified: trunk/pom.xml trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceService.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceWriteTest.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceWriteTest.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceWriteTest.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/pom.xml 2013-05-06 19:33:55 UTC (rev 921) @@ -136,9 +136,9 @@ <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.7</xworkVersion> - <slf4jVersion>1.7.2</slf4jVersion> + <slf4jVersion>1.7.5</slf4jVersion> - <adagioVersion>3.3.5</adagioVersion> + <adagioVersion>3.3.6-SNAPSHOT</adagioVersion> <msaccessImporterVersion>1.4.1</msaccessImporterVersion> Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-05-06 19:33:55 UTC (rev 921) @@ -24,7 +24,6 @@ * #L% */ -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -440,6 +439,9 @@ @Transactional(readOnly = false) FishingOperation saveFishingOperation(FishingOperation bean); + @Transactional(readOnly = false) + void deleteFishingOperation(String id); + //------------------------------------------------------------------------// //-- CatchBatch methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -26,7 +26,6 @@ import com.google.common.collect.Maps; import fr.ifremer.adagio.core.service.technical.CacheService; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -583,6 +582,11 @@ return fishingOperationService.saveFishingOperation(bean); } + @Override + public void deleteFishingOperation(String id) { + fishingOperationService.deleteFishingOperation(id); + } + //------------------------------------------------------------------------// //-- CatchBatch methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -24,7 +24,6 @@ * #L% */ -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -393,6 +392,11 @@ } @Override + public void deleteFishingOperation(String id) { + throw notImplemented(); + } + + @Override public CatchBatch getCatchBatchFromFishingOperation(String id) { throw notImplemented(); } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceService.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceService.java 2013-05-06 19:33:55 UTC (rev 921) @@ -49,4 +49,7 @@ @Transactional(readOnly = false) void deleteAccidentalBatch(String id); + + @Transactional(readOnly = false) + void deleteAccidentalBatchForFishingOperation(String fishingOperationId); } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -45,6 +45,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.type.IntegerType; @@ -164,11 +165,26 @@ log.info("Will delete accidental batch: " + batchId); } sampleDao.remove(batchId); + attachmentPersistenceService.deleteAllAttachment( AttachementObjectTypeEnum.SAMPLE, batchId); } + @Override + public void deleteAccidentalBatchForFishingOperation(String fishingOperationId) { + Preconditions.checkNotNull(fishingOperationId); + + List<AccidentalBatch> batches = + getAllAccidentalBatch(fishingOperationId); + + if (CollectionUtils.isNotEmpty(batches)) { + for (AccidentalBatch batch : batches) { + deleteAccidentalBatch(batch.getId()); + } + } + } + // ------------------------------------------------------------------------// // -- Internal methods --// // ------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceService.java 2013-05-06 19:33:55 UTC (rev 921) @@ -38,7 +38,7 @@ /** * Get the catchBatch from the fishing Operation id. * - * @param fishingOperationId id of the fihsing operation + * @param fishingOperationId id of the fishing operation * @return found catchBatch */ CatchBatch getCatchBatchFromFishingOperation(String fishingOperationId); @@ -61,4 +61,14 @@ @Transactional(readOnly = false) CatchBatch saveCatchBatch(CatchBatch bean); + /** + * Delete catch batch for the given fishing Operation id (will then delete + * in cascade all sorting batchs + individual observation batchs). + * + * @param fishingOperationId id of the fishing operation + * @since 2.2 + */ + @Transactional(readOnly = false) + void deleteCatchBatch(String fishingOperationId); + } \ No newline at end of file Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -261,6 +261,18 @@ return bean; } + @Override + public void deleteCatchBatch(String fishingOperationId) { + Preconditions.checkNotNull(fishingOperationId); + Integer catchBatchId = batchHelper.getCatchBatchIdByFishingOperationId(Integer.valueOf(fishingOperationId)); + + if (catchBatchId == null) { + throw new DataRetrievalFailureException("Could not retrieve catch batch for fishingOperation id=" + fishingOperationId); + } + + batchHelper.deleteCatchBatch(fishingOperationId, catchBatchId); + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -28,10 +28,11 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import fr.ifremer.adagio.core.dao.administration.user.PersonImpl; import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea; import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea2RegulationLocation; +import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea2RegulationLocationDao; import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea2RegulationLocationPK; +import fr.ifremer.adagio.core.dao.data.fishingArea.FishingAreaDao; 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.measure.VesselUseMeasurement; @@ -72,6 +73,7 @@ import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.FlushMode; @@ -85,7 +87,15 @@ import java.io.Serializable; import java.sql.Timestamp; import java.text.MessageFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * @author tchemit <chemit@codelutin.com> @@ -102,6 +112,12 @@ protected ReferentialPersistenceService referentialService; @Autowired + protected CatchBatchPersistenceService catchBatchService; + + @Autowired + protected AccidentalBatchPersistenceService accidentalBatchService; + + @Autowired protected AttachmentPersistenceService attachmentPersistenceService; @Autowired @@ -116,9 +132,15 @@ @Resource(name = "gearPhysicalFeaturesDao") protected GearPhysicalFeaturesExtendDao gearPhysicalFeaturesDao; + @Resource(name = "fishingArea2RegulationLocationDao") + protected FishingArea2RegulationLocationDao fishingArea2RegulationLocationDao; + @Resource(name = "fishingOperationDao") protected FishingOperationDao fishingOperationDao; + @Resource(name = "fishingAreaDao") + protected FishingAreaDao fishingAreaDao; + @Resource(name = "operationVesselAssociationDao") protected OperationVesselAssociationDao operationVesselAssociationDao; @@ -339,7 +361,6 @@ return result; } - @Override public FishingOperation createFishingOperation(FishingOperation bean) { Preconditions.checkNotNull(bean); @@ -410,8 +431,106 @@ if (fishingOperation == null) { throw new DataRetrievalFailureException("Could not retrieve fishing operation with id=" + fishingOperationId); } + + // delete accidental batchs + accidentalBatchService.deleteAccidentalBatchForFishingOperation(id); + getCurrentSession().flush(); + + // delete catch batch + catchBatchService.deleteCatchBatch(id); + getCurrentSession().flush(); + + Set<FishingArea> fishingAreas = Sets.newHashSet(); + + // remove gear use features + if (CollectionUtils.isNotEmpty(fishingOperation.getGearUseFeatures())) { + for (GearUseFeatures gearUseFeatures : fishingOperation.getGearUseFeatures()) { + + gearUseFeatures.setOperation(null); + gearUseFeatures.getGearUseMeasurements().clear(); + + if (CollectionUtils.isNotEmpty(gearUseFeatures.getFishingAreas())) { + for (FishingArea fishingArea : gearUseFeatures.getFishingAreas()) { + fishingArea.setGearUseFeatures(null); + } + fishingAreas.addAll(gearUseFeatures.getFishingAreas()); + } + } + // must remove all features content before removing them (data integrity will then failed otherwise) + getCurrentSession().flush(); + fishingOperation.getGearUseFeatures().clear(); + } + + // remove vessel use features + if (CollectionUtils.isNotEmpty(fishingOperation.getVesselUseFeatures())) { + for (VesselUseFeatures vesselUseFeatures : fishingOperation.getVesselUseFeatures()) { + + vesselUseFeatures.setOperation(null); + vesselUseFeatures.getVesselUseMeasurements().clear(); + + if (CollectionUtils.isNotEmpty(vesselUseFeatures.getFishingAreas())) { + for (FishingArea fishingArea : vesselUseFeatures.getFishingAreas()) { + fishingArea.setVesselUseFeatures(null); + } + fishingAreas.addAll(vesselUseFeatures.getFishingAreas()); + } + } + + // must remove all features content before removing them (data integrity will then failed otherwise) + getCurrentSession().flush(); + fishingOperation.getVesselUseFeatures().clear(); + } + + // remove vessel position + if (CollectionUtils.isNotEmpty(fishingOperation.getVesselPositions())) { + fishingOperation.getVesselPositions().clear(); + } + + // remove vessel person features + if (CollectionUtils.isNotEmpty(fishingOperation.getVesselPersonFeatures())) { + fishingOperation.getVesselPersonFeatures().clear(); + } + + // remove gear physical features + fishingOperation.setGearPhysicalFeatures(null); + + // remove catch batch + fishingOperation.setCatchBatch(null); + + // remove samples + if (CollectionUtils.isNotEmpty(fishingOperation.getSamples())) { + fishingOperation.getSamples().clear(); + } + + // remove operation vessel associations + if (CollectionUtils.isNotEmpty(fishingOperation.getOperationVesselAssociations())) { + fishingOperation.getOperationVesselAssociations().clear(); + } + + // remove fishing areas + if (CollectionUtils.isNotEmpty(fishingAreas)) { + for (FishingArea fishingArea : fishingAreas) { + fishingArea.setProduce(null); + fishingArea2RegulationLocationDao.remove(fishingArea.getRegulationLocation()); + fishingArea.getRegulationLocation().clear(); + } + getCurrentSession().flush(); + fishingAreaDao.remove(fishingAreas); + } + + getCurrentSession().flush(); + + // remove fishing operation produces + if (CollectionUtils.isNotEmpty(fishingOperation.getProduces())) { + fishingOperation.getProduces().clear(); + getCurrentSession().flush(); + } + + // remove fishing operations fishingOperationDao.remove(fishingOperation); + getCurrentSession().flush(); + attachmentPersistenceService.deleteAllAttachment( AttachementObjectTypeEnum.OPERATION, fishingOperationId); @@ -669,25 +788,19 @@ } // StationNumber - if (source.getStationNumber() == null) { - // Nothing to do : will be removed using the list notChangedVesselUseMeasurements - } else if (source.getStationNumber() != null) { + if (source.getStationNumber() != null) { VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_STATION_NUMBER, null, source.getStationNumber(), null); notChangedVesselUseMeasurements.remove(vum); } // OP N° - if (source.getFishingOperationNumber() == null) { - // Leave empty in the name buffer - } else if (source.getFishingOperationNumber() != null) { + if (source.getFishingOperationNumber() != null) { nameBuffer.append(source.getFishingOperationNumber()); } target.setName(nameBuffer.toString()); // Multirig Aggregation - if (source.getMultirigAggregation() == null) { - // Nothing to do : will be removed later, using notChangedGearUseMeasurements - } else if (source.getMultirigAggregation() != null) { + if (source.getMultirigAggregation() != null) { if (source.getMultirigAggregation().matches("\\d+")) { int mutlirigNumber = Integer.valueOf(source.getMultirigAggregation()); if (mutlirigNumber > cruiseMultirigCount) { @@ -726,9 +839,7 @@ } // Trawl distance - if (source.getTrawlDistance() == null) { - // Nothing to do : will be removed later, using notChangedVesselUseMeasurements - } else if (source.getTrawlDistance() != null) { + if (source.getTrawlDistance() != null) { VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_TRAWL_DISTANCE, source.getTrawlDistance(), null, null); notChangedVesselUseMeasurements.remove(vum); } @@ -740,9 +851,7 @@ } // Operation is valid ? - if (source.getFishingOperationValid() == null) { - // Nothing to do : will be removed later, using notChangedVesselUseMeasurements - } else if (source.getFishingOperationValid() != null) { + if (source.getFishingOperationValid() != null) { VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, enumeration.PMFM_ID_HAUL_VALID, null, null, source.getFishingOperationValid() ? enumeration.QUALITATIVE_HAUL_VALID_YES : enumeration.QUALITATIVE_HAUL_VALID_NO); notChangedVesselUseMeasurements.remove(vum); } @@ -875,9 +984,7 @@ // Vessel user features CaracteristicMap vesselUseCaracteristics = source.getVesselUseFeatures(); - if (vesselUseCaracteristics == null || vesselUseCaracteristics.size() == 0) { - // Nothing to do : will be removed later, using notChangedVesselUseMeasurements - } else if (vesselUseCaracteristics != null && vesselUseCaracteristics.size() > 0) { + if (MapUtils.isNotEmpty(vesselUseCaracteristics)) { for (Caracteristic caracteristic : vesselUseCaracteristics.keySet()) { VesselUseMeasurement vum = setVesselUseMeasurement(scientificCruise, vesselUseFeatures, caracteristic, vesselUseCaracteristics.get(caracteristic)); notChangedVesselUseMeasurements.remove(vum); @@ -894,9 +1001,9 @@ for (Person person : source.getRecorderPerson()) { Integer personId = person.getIdAsInt(); vesselPersonFeaturesPersistenceHelper.fillVesselPersonFeatures(vesselPersonFeaturesMap, - personId, - target, - recorderPersonRole); + personId, + target, + recorderPersonRole); } } if (fishingTrip.getVesselPersonFeatures() == null) { @@ -914,25 +1021,26 @@ // Gear use Caracteristics CaracteristicMap gearUseCaracteristics = source.getGearUseFeatures(); - if (gearUseCaracteristics == null || gearUseCaracteristics.size() == 0) { - // Nothing to do : will be removed later, using notChangedGearUseMeasurements - } else if (gearUseCaracteristics != null && gearUseCaracteristics.size() > 0) { + if (MapUtils.isNotEmpty(gearUseCaracteristics)) { for (Caracteristic caracteristic : gearUseCaracteristics.keySet()) { - GearUseMeasurement gum = setGearUseMeasurement(scientificCruise, gearUseFeatures, caracteristic, gearUseCaracteristics.get(caracteristic)); + GearUseMeasurement gum = setGearUseMeasurement( + scientificCruise, + gearUseFeatures, + caracteristic, + gearUseCaracteristics.get(caracteristic)); notChangedGearUseMeasurements.remove(gum); } } // Removed not changed measurements (in Vessel & Gear Use Measurement lists) - if (vesselUseFeatures.getVesselUseMeasurements() != null && notChangedVesselUseMeasurements.size() > 0) { - for (VesselUseMeasurement vum : notChangedVesselUseMeasurements) { - vesselUseFeatures.getVesselUseMeasurements().remove(vum); - } + if (vesselUseFeatures.getVesselUseMeasurements() != null && + notChangedVesselUseMeasurements.size() > 0) { + vesselUseFeatures.getVesselUseMeasurements().removeAll(notChangedVesselUseMeasurements); + } - if (gearUseFeatures.getGearUseMeasurements() != null && notChangedGearUseMeasurements.size() > 0) { - for (GearUseMeasurement gum : notChangedGearUseMeasurements) { - gearUseFeatures.getGearUseMeasurements().remove(gum); - } + if (gearUseFeatures.getGearUseMeasurements() != null && + notChangedGearUseMeasurements.size() > 0) { + gearUseFeatures.getGearUseMeasurements().removeAll(notChangedGearUseMeasurements); } // ---------------------------------------------------------------- @@ -949,11 +1057,7 @@ } // Strata : - if (source.getStrata() == null || source.getStrata().getId() == null) { - - // will be removed using notChangedRegulationLocation - - } else if (source.getStrata() != null && source.getStrata().getId() != null) { + if (source.getStrata() != null && source.getStrata().getId() != null) { FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance(); FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK(); fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK); @@ -972,11 +1076,7 @@ } // Sub-Strata : - if (source.getSubStrata() == null || source.getSubStrata().getId() == null) { - - // will be removed using notChangedRegulationLocation - - } else if (source.getSubStrata() != null && source.getSubStrata().getId() != null) { + if (source.getSubStrata() != null && source.getSubStrata().getId() != null) { FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance(); FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK(); fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK); @@ -996,11 +1096,7 @@ } // Localite : - if (source.getLocation() == null || source.getLocation().getId() == null) { - - // will be removed using notChangedRegulationLocation - - } else if (source.getLocation() != null && source.getLocation().getId() != null) { + if (source.getLocation() != null && source.getLocation().getId() != null) { FishingArea2RegulationLocation fa2rl = FishingArea2RegulationLocation.Factory.newInstance(); FishingArea2RegulationLocationPK fa2rlPK = new FishingArea2RegulationLocationPK(); fa2rl.setFishingArea2RegulationLocationPk(fa2rlPK); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java 2013-05-06 19:33:55 UTC (rev 921) @@ -49,4 +49,7 @@ @Transactional(readOnly = false) void deleteIndividualObservationBatch(String id); + + @Transactional(readOnly = false) + void deleteIndividualObservationBatchForFishingOperation(String fishingOperationId); } \ No newline at end of file Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java 2013-05-06 19:33:55 UTC (rev 921) @@ -48,6 +48,7 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.persistence.service.batch.BatchPersistenceHelper; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.type.IntegerType; @@ -202,6 +203,20 @@ } } + @Override + public void deleteIndividualObservationBatchForFishingOperation(String fishingOperationId) { + Preconditions.checkNotNull(fishingOperationId); + + List<IndividualObservationBatch> batches = + getAllIndividualObservationBatch(fishingOperationId); + + if (CollectionUtils.isNotEmpty(batches)) { + for (IndividualObservationBatch batch : batches) { + deleteIndividualObservationBatch(batch.getId()); + } + } + } + // ------------------------------------------------------------------------// // -- Internal methods --// // ------------------------------------------------------------------------// Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/batch/BatchPersistenceHelper.java 2013-05-06 19:33:55 UTC (rev 921) @@ -31,6 +31,7 @@ import fr.ifremer.adagio.core.dao.data.batch.CatchBatch; import fr.ifremer.adagio.core.dao.data.batch.CatchBatchExtendDao; import fr.ifremer.adagio.core.dao.data.batch.SortingBatch; +import fr.ifremer.adagio.core.dao.data.batch.SortingBatchDao; import fr.ifremer.adagio.core.dao.data.batch.validator.CatchBatchValidationException; import fr.ifremer.adagio.core.dao.data.batch.validator.CatchBatchValidator; import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement; @@ -39,17 +40,21 @@ import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; import fr.ifremer.tutti.persistence.InvalidBatchModelException; import fr.ifremer.tutti.persistence.entities.TuttiEntity; +import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; 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.service.AbstractPersistenceService; +import fr.ifremer.tutti.persistence.service.AttachmentPersistenceService; +import fr.ifremer.tutti.persistence.service.IndividualObservationBatchPersistenceService; import fr.ifremer.tutti.persistence.service.MeasurementPersistenceHelper; import fr.ifremer.tutti.persistence.service.ReferentialPersistenceService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.DataRetrievalFailureException; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -77,9 +82,18 @@ @Resource(name = "referentialPersistenceService") protected ReferentialPersistenceService referentialService; + @Resource(name = "attachmentPersistenceService") + protected AttachmentPersistenceService attachmentPersistenceService; + + @Resource(name = "individualObservationBatchPersistenceService") + protected IndividualObservationBatchPersistenceService individualObservationBatchPersistenceService; + @Resource(name = "catchBatchDao") protected CatchBatchExtendDao catchBatchDao; + @Resource(name = "sortingBatchDao") + protected SortingBatchDao sortingBatchDao; + @Resource(name = "scientificCruiseCatchBatchValidator") protected CatchBatchValidator catchBatchValidator; @@ -104,6 +118,27 @@ return bean; } + public void deleteCatchBatch(String fishingOperationId, Integer catchBatchId) { + + // delete individual observation batchs + individualObservationBatchPersistenceService.deleteIndividualObservationBatchForFishingOperation(fishingOperationId); + + getCurrentSession().flush(); + + // get all catch batch children ids (to delete attachments) + List<Integer> ids = catchBatchDao.getAllChildrenIds(catchBatchId); + + catchBatchDao.remove(catchBatchId); + + getCurrentSession().flush(); + + for (Integer id : ids) { + attachmentPersistenceService.deleteAllAttachment( + AttachementObjectTypeEnum.BATCH, + id); + } + } + public <D extends TuttiEntity> D createSortingBatch(D bean, CatchBatch catchBatch, SortingBatch batch) { batch = catchBatchDao.createSortingBatch(batch, catchBatch); bean.setId(batch.getId()); @@ -197,6 +232,10 @@ return result; } + public Integer getCatchBatchIdByFishingOperationId(Integer fishingOperationId) throws DataRetrievalFailureException { + return catchBatchDao.getIdByFishingOperationId(fishingOperationId); + } + public fr.ifremer.adagio.core.dao.data.batch.CatchBatch getRootCatchBatchByBatchId(Integer batchId) { Preconditions.checkNotNull(batchId); @@ -768,14 +807,9 @@ } parentBatch.getChildBatchs().add(result); -// Collection<QuantificationMeasurement> quantificationMeasurements = result.getQuantificationMeasurements(); Collection<SortingMeasurement> sortingMeasurements = result.getSortingMeasurements(); // Create lists to store all updates, then remove not updated items -// Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet(); -// if (quantificationMeasurements != null) { -// notChangedQuantificationMeasurements.addAll(quantificationMeasurements); -// } Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet(); if (sortingMeasurements != null) { notChangedSortingMeasurements.addAll(sortingMeasurements); Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java 2013-05-06 19:33:55 UTC (rev 921) @@ -282,16 +282,23 @@ List<Caracteristic> allEnvironmentCaracteristics = referentialService.getAllCaracteristic(); CaracteristicMap environmentCaracteristics = new CaracteristicMap(); CaracteristicMap environmentValuesOneEntry = new CaracteristicMap(); + int count=0; for (Caracteristic caracteristic : allEnvironmentCaracteristics) { + if (count==3) { + break; + } Serializable value = null; if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) { value = 1.0f; + count++; } else if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) { value = "some text"; + count++; } else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE && caracteristic.getQualitativeValue(0) != null) { // Choose the first qualitative value value = caracteristic.getQualitativeValue(0); + count++; } if (value != null) { environmentCaracteristics.put(caracteristic, value); @@ -305,16 +312,23 @@ List<Caracteristic> allGearShootingCaracteristics = referentialService.getAllCaracteristic(); CaracteristicMap gearShootingCaracteristics = new CaracteristicMap(); CaracteristicMap gearShootingCaracteristicsOneEntry = new CaracteristicMap(); + count=0; for (Caracteristic caracteristic : allGearShootingCaracteristics) { + if (count==3) { + break; + } Serializable value = null; if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) { value = 1.0f; + count++; } else if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) { value = "some text"; + count++; } else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE && caracteristic.getQualitativeValue(0) != null) { // Choose the first qualitative value value = caracteristic.getQualitativeValue(0); + count++; } if (value != null) { gearShootingCaracteristics.put(caracteristic, value); @@ -365,7 +379,7 @@ return result; } - public CatchBatch createCatchBatch(FishingOperation fishingOperation) { + public CatchBatch createMinimalCatchBatch(FishingOperation fishingOperation) { setUp(); Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceWriteTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceWriteTest.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceWriteTest.java 2013-05-06 19:33:55 UTC (rev 921) @@ -153,7 +153,7 @@ } @Test - public void deleteAccidentalBatch(/*String id*/) { + public void deleteAccidentalBatch(/*String fishingOperationId*/) { AccidentalBatch createdAccidentalBatch = dbResource.getFixtures().createMinimalAccidentalBatch( @@ -168,6 +168,24 @@ Assert.assertTrue(CollectionUtils.isEmpty(allAccidentalBatch2)); } + @Test + public void deleteAccidentalBatchForFishingOperation(/*String id*/) { + + dbResource.getFixtures().createMinimalAccidentalBatch( + fishingOperation); + + dbResource.getFixtures().createMinimalAccidentalBatch( + fishingOperation); + + List<AccidentalBatch> allAccidentalBatch = service.getAllAccidentalBatch(fishingOperation.getId()); + Assert.assertFalse(CollectionUtils.isEmpty(allAccidentalBatch)); + + service.deleteAccidentalBatchForFishingOperation(fishingOperation.getId()); + + List<AccidentalBatch> allAccidentalBatch2 = service.getAllAccidentalBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isEmpty(allAccidentalBatch2)); + } + protected void assertEqualsAccidentalBatch(AccidentalBatch expected, AccidentalBatch actual) { Assert.assertEquals(expected, actual); Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceWriteTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceWriteTest.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/CatchBatchPersistenceServiceWriteTest.java 2013-05-06 19:33:55 UTC (rev 921) @@ -30,21 +30,16 @@ import fr.ifremer.tutti.persistence.entities.data.CatchBatch; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import org.apache.commons.collections.CollectionUtils; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Test; +import org.springframework.dao.DataRetrievalFailureException; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; /** * To test {@link CatchBatchPersistenceService} for write operation. @@ -52,7 +47,6 @@ * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -@Ignore public class CatchBatchPersistenceServiceWriteTest { @ClassRule @@ -66,6 +60,8 @@ protected FishingOperationPersistenceService fishingOperationService; + protected IndividualObservationBatchPersistenceService individualObservationBatchPersistenceService; + protected ReferentialPersistenceService referentialService; /* @@ -73,7 +69,7 @@ * */ protected Cruise cruise; - protected FishingOperation fishingOperationNoCatchBatch; + protected FishingOperation fishingOperation; @Before public void setUp() throws Exception { @@ -81,39 +77,10 @@ cruiseService = TuttiPersistenceServiceLocator.getCruisePersistenceService(); fishingOperationService = TuttiPersistenceServiceLocator.getFishingOperationPersistenceService(); referentialService = TuttiPersistenceServiceLocator.getReferentialPersistenceService(); + individualObservationBatchPersistenceService = TuttiPersistenceServiceLocator.getIndividualObservationBatchPersistenceService(); cruise = dbResource.getFixtures().createCruise(); -// cruiseService.getCruise(dbResource.getFixtures().cruiseId()); -// cruise.setId((String) null); - Calendar calendar = new GregorianCalendar(); -// cruise.setBeginDate(calendar.getTime()); -// calendar.add(Calendar.MONTH, 1); // add one month -// cruise.setEndDate(calendar.getTime()); -// List<TuttiLocation> allHarbour = referentialService.getAllHarbour(); -// Assert.assertNotNull(allHarbour); -// Assert.assertTrue(allHarbour.size() > 1); -// cruise.setDepartureLocation(allHarbour.get(0)); -// cruise.setReturnLocation(allHarbour.get(1)); -// -// cruise = cruiseService.createCruise(cruise); - - // Create a first operation, with no cacth batch : to test CatchBatch insert/update : - List<FishingOperation> fishingOperations = fishingOperationService.getAllFishingOperation(dbResource.getFixtures().cruiseId()); - assertNotNull(fishingOperations); - assertTrue(fishingOperations.size() > 0); - fishingOperationNoCatchBatch = fishingOperations.get(0); - fishingOperationNoCatchBatch = fishingOperationService.getFishingOperation(fishingOperationNoCatchBatch.getId()); - fishingOperationNoCatchBatch.setId((String) null); - fishingOperationNoCatchBatch.setCruise(cruise); - calendar.setTime(new Date()); - calendar.set(Calendar.HOUR_OF_DAY, 1); - calendar.set(Calendar.MILLISECOND, 0); - fishingOperationNoCatchBatch.setGearShootingStartDate(calendar.getTime()); - calendar.setTime(new Date()); - calendar.set(Calendar.HOUR_OF_DAY, 10); - calendar.set(Calendar.MILLISECOND, 0); - fishingOperationNoCatchBatch.setGearShootingEndDate(calendar.getTime()); - fishingOperationNoCatchBatch = fishingOperationService.createFishingOperation(fishingOperationNoCatchBatch); + fishingOperation = dbResource.getFixtures().createFishingOperation(cruise); } @Test @@ -121,14 +88,14 @@ CatchBatch catchBatch; catchBatch = TuttiBeanFactory.newCatchBatch(); - catchBatch.setFishingOperation(fishingOperationNoCatchBatch); + catchBatch.setFishingOperation(fishingOperation); // ----------------------------------------------------------------------------- // 1. Test with only mandatory properties // ----------------------------------------------------------------------------- // Create and reload (test round trip) - assertCreateAndReloadCatchBatch(catchBatch, fishingOperationNoCatchBatch.getId()); + assertCreateAndReloadCatchBatch(catchBatch, fishingOperation.getId()); // ----------------------------------------------------------------------------- // 2. Test with all properties @@ -166,7 +133,7 @@ catchBatch.setCatchTotalRejectedWeight(15f); // Create and reload (test round trip) - assertCreateAndReloadCatchBatch(catchBatch, fishingOperationNoCatchBatch.getId()); + assertCreateAndReloadCatchBatch(catchBatch, fishingOperation.getId()); // ----------------------------------------------------------------------------- // 2. Test save after modification @@ -176,9 +143,65 @@ catchBatch.setSpeciesTotalSortedWeight(null); catchBatch.setBenthosTotalSortedWeight(null); - assertSaveAndReloadCatchBatch(catchBatch, fishingOperationNoCatchBatch.getId()); + assertSaveAndReloadCatchBatch(catchBatch, fishingOperation.getId()); } + @Test + public void deleteCatchBatch(/*String fishingOperationId*/) { + + CatchBatch catchBatch = dbResource.getFixtures().createMinimalCatchBatch(fishingOperation); + + // total weight : 100kg + catchBatch.setCatchTotalWeight(75f); + // Vrac : + // note : poids trie par la balance tremis (thalassa) (init par pupitri) + catchBatch.setCatchTotalSortedTremisWeight(50f); + // note : poids vrac caroussel (thalassa) (init par pupitri) (vrac trie) ou bien "poids trié fournie par la + // table de tri (Sum(Si)) + catchBatch.setCatchTotalSortedCarousselWeight(45f); + + // Species + catchBatch.setSpeciesTotalSortedWeight(12f); + catchBatch.setSpeciesTotalLivingNotItemizedWeight(0.2f); + catchBatch.setSpeciesTotalInertWeight(0.1f); + + // Benthos + catchBatch.setBenthosTotalSortedWeight(24f); + catchBatch.setBenthosTotalLivingNotItemizedWeight(0.4f); + catchBatch.setBenthosTotalInertWeight(0.2f); + + // Hors-Vrac : + // MarineLitter + catchBatch.setMarineLitterTotalWeight(100f); + + // Rejet : 15kg + catchBatch.setCatchTotalRejectedWeight(15f); + service.saveCatchBatch(catchBatch); + + dbResource.getFixtures().createMinimalIndividualObservationBatch(fishingOperation); + + String fishingOperationId = fishingOperation.getId(); + + Assert.assertNotNull(service.getCatchBatchFromFishingOperation(fishingOperationId)); + Assert.assertFalse(CollectionUtils.isEmpty(individualObservationBatchPersistenceService.getAllIndividualObservationBatch(fishingOperationId))); + service.deleteCatchBatch(fishingOperationId); + + try { + service.getCatchBatchFromFishingOperation(fishingOperationId); + Assert.fail(); + } catch (DataRetrievalFailureException e) { + // feel good, no catch batch associated with fishing operation + } + + try { + individualObservationBatchPersistenceService.getAllIndividualObservationBatch(fishingOperationId); + Assert.fail(); + } catch (DataRetrievalFailureException e) { + // feel good, no catch batch associated with fishing operation + } + + } + protected void assertCreateAndReloadCatchBatch(CatchBatch catchBatch, String fishingOperationId) { CatchBatch createdCatchBatch = service.createCatchBatch(catchBatch); assertNotNull(createdCatchBatch); Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceWriteTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceWriteTest.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceWriteTest.java 2013-05-06 19:33:55 UTC (rev 921) @@ -24,7 +24,6 @@ * #L% */ -import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.DatabaseResource; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; @@ -35,12 +34,16 @@ import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Ignore; import org.junit.Test; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.DataRetrievalFailureException; import java.io.Serializable; import java.util.Calendar; @@ -60,20 +63,25 @@ * @author tchemit <chemit@codelutin.com> * @since 1.0 */ -@Ignore public class FishingOperationPersistenceServiceWriteTest { @ClassRule public static final DatabaseResource dbResource = DatabaseResource.writeDb(); + /** Logger. */ + private static final Log log = + LogFactory.getLog(FishingOperationPersistenceServiceWriteTest.class); + protected FishingOperationPersistenceService service; - protected ReferentialPersistenceService referentialService; + protected CatchBatchPersistenceService catchBatchPersistenceService; - protected ProgramPersistenceService programService; + protected AccidentalBatchPersistenceService accidentalBatchPersistenceService; - protected CruisePersistenceService cruiseService; + protected IndividualObservationBatchPersistenceService individualObservationBatchPersistenceService; + protected ReferentialPersistenceService referentialService; + protected Cruise cruise = null; protected Gear cruiseGear = null; @@ -83,37 +91,15 @@ @Before public void setUp() throws Exception { service = TuttiPersistenceServiceLocator.getFishingOperationPersistenceService(); - cruiseService = TuttiPersistenceServiceLocator.getCruisePersistenceService(); referentialService = TuttiPersistenceServiceLocator.getReferentialPersistenceService(); - programService = TuttiPersistenceServiceLocator.getProgramPersistenceService(); + catchBatchPersistenceService = TuttiPersistenceServiceLocator.getCatchBatchPersistenceService(); + accidentalBatchPersistenceService = TuttiPersistenceServiceLocator.getAccidentalBatchPersistenceService(); + individualObservationBatchPersistenceService = TuttiPersistenceServiceLocator.getIndividualObservationBatchPersistenceService(); - // Duplicate an existing cruise, to attach new fishing operations - cruise = cruiseService.getCruise(dbResource.getFixtures().cruiseId()); - cruise.setId((String) null); - cruise.setName("Unit-test-" + System.currentTimeMillis()); - Calendar calendar = new GregorianCalendar(); - cruise.setBeginDate(calendar.getTime()); + cruise = dbResource.getFixtures().createCruise(); + Assert.assertFalse(cruise.getGear().isEmpty()); + cruiseGear = cruise.getGear().get(0); - calendar.add(Calendar.MONTH, 1); // add one month - cruise.setEndDate(calendar.getTime()); - cruise.setMultirigNumber(2); - List<TuttiLocation> allHarbour = referentialService.getAllHarbour(); - Assert.assertNotNull(allHarbour); - Assert.assertTrue(allHarbour.size() > 1); - cruise.setDepartureLocation(allHarbour.get(0)); - cruise.setReturnLocation(allHarbour.get(1)); - - // Keep only one gear in the cruise : (need for case n°4) - List<Gear> cruiseGears = cruise.getGear(); - assertNotNull(cruiseGears); - assertTrue(cruiseGears.size() > 0); - cruiseGear = cruiseGears.get(0); - assertNotNull(cruiseGear.getId()); - cruise.setGear(Lists.newArrayList(cruiseGear)); - - cruise = cruiseService.createCruise(cruise); - assertNotNull(cruise.getId()); - // Find a vessel, different from the cruise vessel notCruiseVessel = referentialService.getVessel(dbResource.getFixtures().fishingVesselCode()); assertNotNull(notCruiseVessel.getId()); @@ -174,7 +160,6 @@ } } - // Create new fishing operation : FishingOperation fishingOperation = TuttiBeanFactory.newFishingOperation(); @@ -324,7 +309,7 @@ fishingOperation.setId((String) null); // Find and set a gear not used in the cruise - List<Gear> gears = referentialService.getAllFishingGear(); + List<Gear> gears = referentialService.getAllScientificGear(); assertNotNull(gears); assertTrue(gears.size() > 0); for (Gear gear : gears) { @@ -395,5 +380,41 @@ } + @Test + public void deleteFishingOperation(/*String id*/) { + FishingOperation fishingOperation = dbResource.getFixtures().createFishingOperation(cruise); + + dbResource.getFixtures().createMinimalCatchBatch(fishingOperation); + dbResource.getFixtures().createMinimalAccidentalBatch(fishingOperation); + dbResource.getFixtures().createMinimalIndividualObservationBatch(fishingOperation); + + String fishingOperationId = fishingOperation.getId(); + Assert.assertFalse(CollectionUtils.isEmpty(service.getAllFishingOperation(cruise.getId()))); + Assert.assertNotNull(catchBatchPersistenceService.getCatchBatchFromFishingOperation(fishingOperationId)); + Assert.assertFalse(CollectionUtils.isEmpty(accidentalBatchPersistenceService.getAllAccidentalBatch(fishingOperationId))); + Assert.assertFalse(CollectionUtils.isEmpty(individualObservationBatchPersistenceService.getAllIndividualObservationBatch(fishingOperationId))); + + if (log.isInfoEnabled()) { + log.info("\n\n\nWill delete fishing operation: " + fishingOperationId); + } + + service.deleteFishingOperation(fishingOperationId); + + Assert.assertTrue(CollectionUtils.isEmpty(service.getAllFishingOperation(cruise.getId()))); + try { + catchBatchPersistenceService.getCatchBatchFromFishingOperation(fishingOperationId); + Assert.fail(); + } catch (DataRetrievalFailureException e) { + // feel good, no catch batch associated with fishing operation + } + try { + individualObservationBatchPersistenceService.getAllIndividualObservationBatch(fishingOperationId); + Assert.fail(); + } catch (DataRetrievalFailureException e) { + // feel good, no catch batch associated with fishing operation + } + Assert.assertTrue(CollectionUtils.isEmpty(accidentalBatchPersistenceService.getAllAccidentalBatch(fishingOperationId))); + } + } Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java 2013-05-06 19:33:55 UTC (rev 921) @@ -63,7 +63,7 @@ service = TuttiPersistenceServiceLocator.getIndividualObservationBatchPersistenceService(); Cruise cruise = dbResource.getFixtures().createCruise(); fishingOperation = dbResource.getFixtures().createFishingOperation(cruise); - dbResource.getFixtures().createCatchBatch(fishingOperation); + dbResource.getFixtures().createMinimalCatchBatch(fishingOperation); } @@ -170,6 +170,24 @@ Assert.assertTrue(CollectionUtils.isEmpty(allIndividualObservationBatch2)); } + @Test + public void deleteIndividualObservationBatchForFishingOperation(/*String fishingOperationId*/) { + + dbResource.getFixtures().createMinimalIndividualObservationBatch( + fishingOperation); + + dbResource.getFixtures().createMinimalIndividualObservationBatch( + fishingOperation); + + List<IndividualObservationBatch> allIndividualObservationBatch = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertFalse(CollectionUtils.isEmpty(allIndividualObservationBatch)); + + service.deleteIndividualObservationBatchForFishingOperation(fishingOperation.getId()); + + List<IndividualObservationBatch> allIndividualObservationBatch2 = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isEmpty(allIndividualObservationBatch2)); + } + protected void assertEqualsIndividualObservationBatch(IndividualObservationBatch expected, IndividualObservationBatch actual) { Assert.assertEquals(expected, actual); Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-05-06 19:33:55 UTC (rev 921) @@ -31,7 +31,6 @@ import fr.ifremer.tutti.persistence.TuttiPersistence; import fr.ifremer.tutti.persistence.TuttiPersistenceNoDbImpl; import fr.ifremer.tutti.persistence.config.TuttiPersistenceConfig; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -231,7 +230,7 @@ FileObject fileObject = TuttiIOUtil.resolveFile("zip:" + file.getAbsolutePath(), _("tutti.service.persistence.getArchive.error", file)); - FileObject[] children = TuttiIOUtil.getChildren(fileObject, _("tutti.service.persistence.openArchive.error", file)); + FileObject[] children = TuttiIOUtil.getChildren(fileObject, _("tutti.service.persistence.openArchive.error", file)); fileObject = children[0]; @@ -679,6 +678,11 @@ return driver.saveFishingOperation(bean); } + @Override + public void deleteFishingOperation(String id) { + driver.deleteFishingOperation(id); + } + //------------------------------------------------------------------------// //-- CatchBatch methods --// //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-05-06 19:33:55 UTC (rev 921) @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Tue Apr 30 17:57:05 CEST 2013 +#Mon May 06 16:32:40 CEST 2013 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=createAccidentalBatch.html\#actions tutti.createAccidentalBatch.action.save.help=createAccidentalBatch.html\#actions @@ -223,6 +223,7 @@ tutti.editSpeciesFrequencies.field.simpleCounting.help=editSpeciesFrequencies.html\#fields tutti.editSpeciesFrequencies.field.step.help=editSpeciesFrequencies.html\#fields tutti.editSpeciesFrequencies.help=editSpeciesFrequencies.html +tutti.fishingOperations.action.deleteFishingOperation.help= tutti.fishingOperations.action.newFishingOperation.help=fishingOperations.html\#actions tutti.fishingOperations.field.fishingOperation.help=fishingOperations.html\#fields tutti.fishingOperations.help=fishingOperations.html Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-05-06 19:33:55 UTC (rev 921) @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Tue Apr 30 17:57:05 CEST 2013 +#Mon May 06 16:32:40 CEST 2013 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=createAccidentalBatch.html\#actions tutti.createAccidentalBatch.action.save.help=createAccidentalBatch.html\#actions @@ -223,6 +223,7 @@ tutti.editSpeciesFrequencies.field.simpleCounting.help=editSpeciesFrequencies.html\#fields tutti.editSpeciesFrequencies.field.step.help=editSpeciesFrequencies.html\#fields tutti.editSpeciesFrequencies.help=editSpeciesFrequencies.html +tutti.fishingOperations.action.deleteFishingOperation.help= tutti.fishingOperations.action.newFishingOperation.help=fishingOperations.html\#actions tutti.fishingOperations.field.fishingOperation.help=fishingOperations.html\#fields tutti.fishingOperations.help=fishingOperations.html Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/DeleteFishingOperationAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/DeleteFishingOperationAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/DeleteFishingOperationAction.java 2013-05-06 19:33:55 UTC (rev 921) @@ -0,0 +1,74 @@ +package fr.ifremer.tutti.ui.swing.content.operation; + +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import static org.nuiton.i18n.I18n._; + +/** + * To delete a fishing operation. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.2 + */ +public class DeleteFishingOperationAction extends AbstractTuttiAction<FishingOperationsUIModel, FishingOperationsUI, FishingOperationsUIHandler> { + + /** Logger. */ + private static final Log log = + LogFactory.getLog(EditFishingOperationAction.class); + + /** + * Delegate edit action. + * + * @since 1.0 + */ + protected EditFishingOperationAction editAction; + + public DeleteFishingOperationAction(FishingOperationsUIHandler handler) { + super(handler, true); + setActionDescription(_("tutti.editFishingOperation.action.editFishingOperation.tip")); + } + + public EditFishingOperationAction getEditAction() { + if (editAction == null) { + editAction = TuttiActionHelper.createLogicAction( + getHandler(), + EditFishingOperationAction.class); + } + return editAction; + } + + @Override + protected boolean prepareAction() { + + FishingOperation fishingOperation = getModel().getSelectedFishingOperation(); + boolean canContinue = fishingOperation != null && + !TuttiEntities.isNew(fishingOperation); + return canContinue; + } + + @Override + protected void doAction() throws Exception { + + FishingOperation fishingOperation = + getModel().getSelectedFishingOperation(); + + if (log.isInfoEnabled()) { + log.info("Try to delete fishingOperation: " + fishingOperation); + } + + getContext().getPersistenceService().deleteFishingOperation(fishingOperation.getId()); + + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + getEditAction().setFishingOperation(null); + runAction(getEditAction()); + } +} \ No newline at end of file Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/DeleteFishingOperationAction.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.css 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.css 2013-05-06 19:33:55 UTC (rev 921) @@ -40,6 +40,15 @@ _help: {"tutti.fishingOperations.action.newFishingOperation.help"}; } +#deleteFishingOperationButton { + actionIcon: delete; + enabled:{model.getSelectedFishingOperation() != null}; + toolTipText: "tutti.fishingOperations.action.deleteFishingOperation.tip"; + i18nMnemonic: "tutti.fishingOperations.action.deleteFishingOperation.mnemonic"; + _tuttiAction: {DeleteFishingOperationAction.class}; + _help: {"tutti.fishingOperations.action.deleteFishingOperation.help"}; +} + #fishingOperationComboBox { property: selectedFishingOperation; selectedItem: {model.getSelectedFishingOperation()}; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx 2013-05-06 19:33:55 UTC (rev 921) @@ -35,6 +35,8 @@ jaxx.runtime.swing.editor.bean.BeanFilterableComboBox + java.awt.GridLayout + static org.nuiton.i18n.I18n._ </import> @@ -70,7 +72,10 @@ genericType='FishingOperation'/> </cell> <cell anchor='east'> - <JButton id='newFishingOperationButton'/> + <JPanel layout="{new GridLayout()}"> + <JButton id='newFishingOperationButton'/> + <JButton id='deleteFishingOperationButton'/> + </JPanel> </cell> </row> <row> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIModel.java 2013-05-06 19:33:55 UTC (rev 921) @@ -80,7 +80,7 @@ protected FishingOperation selectedFishingOperation; /** - * Current editied fishing operation. + * Current edited fishing operation. * * @since 1.0 */ Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-06 19:33:55 UTC (rev 921) @@ -863,6 +863,8 @@ tutti.exportDb.reloadApplication= tutti.exportProgram.action.success= tutti.exportProtocol.action.success= +tutti.fishingOperations.action.deleteFishingOperation.mnemonic= +tutti.fishingOperations.action.deleteFishingOperation.tip= tutti.fishingOperations.action.newFishingOperation.mnemonic= tutti.fishingOperations.action.newFishingOperation.tip= tutti.fishingOperations.info.no.fishingOperation.selected= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-06 13:01:52 UTC (rev 920) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-06 19:33:55 UTC (rev 921) @@ -832,6 +832,8 @@ tutti.exportDb.reloadApplication=Redémarrage de l'application tutti.exportProgram.action.success=La série de campagne <strong>%s</strong> a été exportée dans le fichier <strong>%s</strong>. tutti.exportProtocol.action.success=Protocole [%1s] exporté dans le fichier <strong>%2s</strong>. +tutti.fishingOperations.action.deleteFishingOperation.mnemonic=S +tutti.fishingOperations.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.fishingOperations.action.newFishingOperation.mnemonic=N tutti.fishingOperations.action.newFishingOperation.tip=Créer une nouvelle opération de pêche tutti.fishingOperations.info.no.fishingOperation.selected=< Aucun trait sélectionné >