r825 - in trunk/tutti-persistence/src: main/java/fr/ifremer/tutti/persistence/entities main/java/fr/ifremer/tutti/persistence/service main/java/fr/ifremer/tutti/persistence/service/synchro main/resources test/java/fr/ifremer/tutti/persistence test/java/fr/ifremer/tutti/persistence/service
Author: tchemit Date: 2013-04-18 20:58:30 +0200 (Thu, 18 Apr 2013) New Revision: 825 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/825 Log: refs #1866: [CAPTURE] - Captures accidentelles refs #1867: [CAPTURE] - Observations individuelles Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SampleMeasurementPersistenceHelper.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.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/AttachmentPersistenceServiceImpl.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/MeasurementPersistenceHelper.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties 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/ProtocolPersistenceServiceReadTest.java trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceWriteTest.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/CaracteristicMap.java 2013-04-18 18:58:30 UTC (rev 825) @@ -37,4 +37,12 @@ */ public class CaracteristicMap extends LinkedHashMap<Caracteristic, Serializable> { private static final long serialVersionUID = 1L; + + public static CaracteristicMap copy(CaracteristicMap map) { + CaracteristicMap result = new CaracteristicMap(); + if (map != null) { + result.putAll(map); + } + return result; + } } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/entities/TuttiEntities.java 2013-04-18 18:58:30 UTC (rev 825) @@ -33,6 +33,7 @@ import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; 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.Gear; import fr.ifremer.tutti.persistence.entities.referential.Species; @@ -276,6 +277,17 @@ return "jdbc:hsqldb:file:" + directory.getAbsolutePath() + "/" + dbName; } + public static CaracteristicQualitativeValue getQualitativeValue(Caracteristic caracteristic, Integer qualitativeValueId) { + CaracteristicQualitativeValue value = null; + for (CaracteristicQualitativeValue qv : caracteristic.getQualitativeValue()) { + if (qualitativeValueId.equals(qv.getIdAsInt())) { + value = qv; + break; + } + } + return value; + } + protected static class IdPredicate<B extends TuttiEntity> implements Predicate<B> { private final String id; 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-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceImpl.java 2013-04-18 18:58:30 UTC (rev 825) @@ -26,11 +26,9 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.administration.programStrategy.Program; import fr.ifremer.adagio.core.dao.administration.user.DepartmentImpl; import fr.ifremer.adagio.core.dao.administration.user.PersonImpl; -import fr.ifremer.adagio.core.dao.data.measure.SampleMeasurement; import fr.ifremer.adagio.core.dao.data.operation.FishingOperationDao; import fr.ifremer.adagio.core.dao.data.operation.FishingOperationImpl; import fr.ifremer.adagio.core.dao.data.sample.Sample; @@ -38,11 +36,6 @@ import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; import fr.ifremer.adagio.core.dao.referential.pmfm.Matrix; import fr.ifremer.adagio.core.dao.referential.pmfm.MatrixImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm; -import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmDao; -import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.Unit; import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonImpl; import fr.ifremer.adagio.core.dao.technical.synchronization.SynchronizationStatus; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; @@ -51,11 +44,9 @@ import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.FlushMode; import org.hibernate.type.IntegerType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataRetrievalFailureException; @@ -66,8 +57,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Set; /** * @author tchemit <chemit@codelutin.com> @@ -87,7 +76,7 @@ protected AttachmentPersistenceService attachmentPersistenceService; @Autowired - protected MeasurementPersistenceHelper measurementPersistenceHelper; + protected SampleMeasurementPersistenceHelper sampleMeasurementPersistenceHelper; @Resource(name = "fishingOperationDao") protected FishingOperationDao fishingOperationDao; @@ -95,15 +84,12 @@ @Resource(name = "sampleDao") protected SampleDao sampleDao; - @Resource(name = "pmfmDao") - protected PmfmDao pmfmDao; - @Override public List<AccidentalBatch> getAllAccidentalBatch(String fishingOperationId) { Preconditions.checkNotNull(fishingOperationId); Iterator<Object[]> list = queryList( - "allFishingOperationSamples", + "allFishingOperationSamplesWithoutBatch", "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId) ); @@ -146,12 +132,10 @@ Preconditions.checkNotNull(bean.getFishingOperation()); Preconditions.checkState(!TuttiEntities.isNew(bean.getFishingOperation())); - getCurrentSession().setFlushMode(FlushMode.COMMIT); Sample sample = Sample.Factory.newInstance(); beanToEntity(bean, sample); sampleDao.create(sample); bean.setId(String.valueOf(sample.getId())); - getCurrentSession().flush(); return bean; } @@ -163,14 +147,13 @@ Preconditions.checkNotNull(bean.getFishingOperation()); Preconditions.checkState(!TuttiEntities.isNew(bean.getFishingOperation())); - getCurrentSession().setFlushMode(FlushMode.COMMIT); Sample sample = sampleDao.load(bean.getIdAsInt()); if (sample == null) { - throw new DataRetrievalFailureException("Could not retrieve sample id=" + bean.getId()); + throw new DataRetrievalFailureException( + "Could not retrieve sample id=" + bean.getId()); } beanToEntity(bean, sample); sampleDao.update(sample); - getCurrentSession().flush(); return bean; } @@ -178,17 +161,24 @@ public void deleteAccidentalBatch(String id) { Preconditions.checkNotNull(id); - Integer accidentalId = Integer.valueOf(id); - sampleDao.remove(accidentalId); - attachmentPersistenceService.deleteAllAttachment(accidentalId); + Integer batchId = Integer.valueOf(id); + + if (log.isInfoEnabled()) { + log.info("Will delete accidental batch: " + batchId); + } + sampleDao.remove(batchId); + attachmentPersistenceService.deleteAllAttachment(batchId); } + // ------------------------------------------------------------------------// + // -- Internal methods --// + // ------------------------------------------------------------------------// + protected void beanToEntity(AccidentalBatch source, Sample target) { if (TuttiEntities.isNew(source)) { // operation - fr.ifremer.adagio.core.dao.data.operation.FishingOperation fishingOperation; fishingOperation = load(FishingOperationImpl.class, source.getFishingOperation().getIdAsInt()); @@ -235,36 +225,9 @@ // Id target.setId(source.getIdAsInt()); + // Always use a null batch (to differ with other samples) + target.setBatch(null); - // Size - // Size Unit - if (source.getSize() == null) { - - // no size - target.setSize(null); - target.setSizeUnit(null); - } else { - - target.setSize(source.getSize()); - - Caracteristic lengthStepCaracteristic = - source.getLengthStepCaracteristic(); - - if (lengthStepCaracteristic != null) { - Pmfm pmfm = pmfmDao.load(lengthStepCaracteristic.getIdAsInt()); - - Unit unit = pmfm.getUnit(); - target.setSizeUnit(unit); - } else { - - if (log.isWarnEnabled()) { - log.warn("There is a size but no lengthStepCaracteristic, " + - "will nullify the unit."); - } - target.setSizeUnit(null); - } - } - // Synchronization Status target.setSynchronizationStatus(SynchronizationStatus.DIRTY.getValue()); @@ -280,251 +243,85 @@ // FishingAreas TODO - // SampleMeasurement + // Prepare sample measurements - Set<SampleMeasurement> notChangedSampleMeasurements = Sets.newHashSet(); - if (target.getSampleMeasurements() != null) { - notChangedSampleMeasurements.addAll(target.getSampleMeasurements()); - } + CaracteristicMap caracteristics = + CaracteristicMap.copy(source.getCaracteristics()); - CaracteristicMap caracteristics = source.getCaracteristics(); - if (caracteristics != null && caracteristics.size() > 0) { - for (Caracteristic caracteristic : caracteristics.keySet()) { - SampleMeasurement vum = setSampleMeasurement( - target, - caracteristic, - caracteristics.get(caracteristic)); - notChangedSampleMeasurements.remove(vum); - } - } - if (source.getDeadOrAlive() != null) { - // add it as a measurement - Caracteristic caracteristic = referentialService.getDeadOrAliveCaracteristic(); - - SampleMeasurement vum = setSampleMeasurement( - target, - caracteristic, - source.getDeadOrAlive()); - notChangedSampleMeasurements.remove(vum); + caracteristics.put(caracteristic, source.getDeadOrAlive()); } if (source.getGender() != null) { - // add it as a measurement - Caracteristic caracteristic = referentialService.getSexCaracteristic(); - - SampleMeasurement vum = setSampleMeasurement( - target, - caracteristic, - source.getGender()); - notChangedSampleMeasurements.remove(vum); + caracteristics.put(caracteristic, source.getGender()); } if (source.getWeight() != null) { - // add it as a measurement - - Caracteristic caracteristic = - referentialService.getCaracteristic(enumeration.PMFM_ID_WEIGHT_MEASURED); - - SampleMeasurement vum = setSampleMeasurement( - target, - caracteristic, - source.getWeight()); - notChangedSampleMeasurements.remove(vum); + Caracteristic caracteristic = referentialService.getCaracteristic( + enumeration.PMFM_ID_WEIGHT_MEASURED); + caracteristics.put(caracteristic, source.getWeight()); } if (source.getLengthStepCaracteristic() != null) { - // add it as a measurement + Caracteristic caracteristic = referentialService.getCaracteristic( + enumeration.PMFM_ID_ID_PSFM); + caracteristics.put(caracteristic, + source.getLengthStepCaracteristic().getId()); - Caracteristic caracteristic = - referentialService.getCaracteristic(enumeration.PMFM_ID_SAMPLE_LENGTH_STEP); - - SampleMeasurement vum = setSampleMeasurement( - target, - caracteristic, - source.getLengthStepCaracteristic().getId()); - notChangedSampleMeasurements.remove(vum); - - caracteristic = source.getLengthStepCaracteristic(); - vum = setSampleMeasurement( - target, - caracteristic, - source.getSize()); - notChangedSampleMeasurements.remove(vum); - + caracteristics.put(source.getLengthStepCaracteristic(), + source.getSize()); } - // ---------------------------------------------------------------- - // Removed unecessary *SampleMeasurement* --- - // ---------------------------------------------------------------- + sampleMeasurementPersistenceHelper.setSampleMeasurements(target, + caracteristics); - if (target.getSampleMeasurements() != null && - notChangedSampleMeasurements.size() > 0) { - target.getSampleMeasurements().removeAll(notChangedSampleMeasurements); - } } - protected void fillSampleMeasurements(AccidentalBatch accidentalBatch) { + protected void fillSampleMeasurements(AccidentalBatch batch) { Caracteristic deadOrAliveCaracteristic = referentialService.getDeadOrAliveCaracteristic(); - Map<String, CaracteristicQualitativeValue> deadOrAliveValues = TuttiEntities.splitById(deadOrAliveCaracteristic.getQualitativeValue()); Caracteristic genderCaracteristic = referentialService.getSexCaracteristic(); - Map<String, CaracteristicQualitativeValue> genderValues = TuttiEntities.splitById(genderCaracteristic.getQualitativeValue()); - Iterator<Object[]> list = queryList( - "sampleMeasurements", - "sampleId", IntegerType.INSTANCE, accidentalBatch.getIdAsInt()); + CaracteristicMap result = batch.getCaracteristics(); - CaracteristicMap result = accidentalBatch.getCaracteristics(); - while (list.hasNext()) { - int colIndex = 0; - Object[] source = list.next(); - Integer pmfmId = (Integer) source[colIndex++]; - Float numericalValue = (Float) source[colIndex++]; - String alphanumericalValue = (String) source[colIndex++]; - Integer qualitativeValueId = (Integer) source[colIndex]; + sampleMeasurementPersistenceHelper.fillSampleMeasurements( + result, batch.getIdAsInt()); - // dead or alive - if (enumeration.PMFM_ID_DEAD_OR_ALIVE.equals(pmfmId)) { - - CaracteristicQualitativeValue caracteristicQualitativeValue = deadOrAliveValues.get(qualitativeValueId.toString()); - accidentalBatch.setDeadOrAlive(caracteristicQualitativeValue); - - continue; - } - - // gender - if (enumeration.PMFM_ID_SEX.equals(pmfmId)) { - - CaracteristicQualitativeValue caracteristicQualitativeValue = genderValues.get(qualitativeValueId.toString()); - accidentalBatch.setGender(caracteristicQualitativeValue); - continue; - } - - // weight - if (enumeration.PMFM_ID_WEIGHT_MEASURED.equals(pmfmId)) { - - accidentalBatch.setWeight(numericalValue); - continue; - } - - // length step - if (enumeration.PMFM_ID_SAMPLE_LENGTH_STEP.equals(pmfmId)) { - - Caracteristic lengthStepCaracteristic = referentialService.getCaracteristic(Integer.valueOf(alphanumericalValue)); - accidentalBatch.setLengthStepCaracteristic(lengthStepCaracteristic); - continue; - } - - // other sample measurements - - Caracteristic caracteristic = referentialService.getCaracteristic(pmfmId); - Serializable value = null; - if (CaracteristicType.NUMBER == caracteristic.getCaracteristicType()) { - value = numericalValue; - } else if (CaracteristicType.TEXT == caracteristic.getCaracteristicType()) { - value = alphanumericalValue; - } else if (CaracteristicType.QUALITATIVE == caracteristic.getCaracteristicType()) { - for (CaracteristicQualitativeValue qv : caracteristic.getQualitativeValue()) { - if (qualitativeValueId.equals(qv.getIdAsInt())) { - value = qv; - break; - } - } - } - result.put(caracteristic, value); + CaracteristicQualitativeValue deadOrAliveValue = + (CaracteristicQualitativeValue) result.remove(deadOrAliveCaracteristic); + if (deadOrAliveValue != null) { + batch.setDeadOrAlive(deadOrAliveValue); } - Caracteristic lengthStepCaracteristic = accidentalBatch.getLengthStepCaracteristic(); - if (lengthStepCaracteristic != null) { - - // get size from result - Serializable length = result.remove(lengthStepCaracteristic); - accidentalBatch.setSize((Float) length); + CaracteristicQualitativeValue genderValue = + (CaracteristicQualitativeValue) result.remove(genderCaracteristic); + if (genderValue != null) { + batch.setGender(genderValue); } - } - protected SampleMeasurement getSampleMeasurement(Sample sample, - Integer pmfmId, - boolean createIfNotExists) { - SampleMeasurement result = null; - if (sample.getSampleMeasurements() != null) { - for (SampleMeasurement vum : sample.getSampleMeasurements()) { - if (pmfmId.equals(vum.getPmfm().getId())) { - result = vum; - break; - } - } + Float weight = (Float) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_WEIGHT_MEASURED)); + if (weight != null) { + batch.setWeight(weight); } - if (result == null) { - if (!createIfNotExists) { - return null; - } - result = SampleMeasurement.Factory.newInstance(); - result.setSample(sample); - if (sample.getSampleMeasurements() == null) { - sample.setSampleMeasurements(Sets.newHashSet(result)); - } else { - sample.getSampleMeasurements().add(result); - } - result.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED)); - result.setDepartment(sample.getRecorderDepartment()); - result.setPmfm(load(PmfmImpl.class, pmfmId)); - } + String lengthClassId = (String) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_ID_PSFM)); + if (lengthClassId != null) { + Caracteristic lengthStepCaracteristic = referentialService.getCaracteristic(Integer.valueOf(lengthClassId)); + batch.setLengthStepCaracteristic(lengthStepCaracteristic); - return result; - } - - protected SampleMeasurement setSampleMeasurement(Sample sample, - Integer pmfmId, - Float numericalValue, - String alphanumericalValue, - Integer qualitativevalueId) { - SampleMeasurement result = getSampleMeasurement(sample, pmfmId, true); - - if (alphanumericalValue != null) { - result.setAlphanumericalValue(alphanumericalValue); - } else if (numericalValue != null) { - result.setNumericalValue(numericalValue); - } else if (qualitativevalueId != null) { - result.setQualitativeValue(load(QualitativeValueImpl.class, qualitativevalueId)); + Serializable length = result.remove(lengthStepCaracteristic); + batch.setSize((Float) length); } - - return result; } - protected SampleMeasurement setSampleMeasurement(Sample sample, - Integer pmfmId, - Serializable value) { - SampleMeasurement result = getSampleMeasurement(sample, pmfmId, true); - if (value instanceof String) { - result.setAlphanumericalValue((String) value); - } else if (value instanceof Float) { - result.setNumericalValue((Float) value); - } else if (value instanceof Integer) { - result.setQualitativeValue(load(QualitativeValueImpl.class, value)); - } - - return result; - } - - protected SampleMeasurement setSampleMeasurement(Sample sample, - Caracteristic caracteristic, - Serializable value) { - SampleMeasurement result = getSampleMeasurement(sample, caracteristic.getIdAsInt(), true); - measurementPersistenceHelper.setMeasurement(result, caracteristic, value); - return result; - } - } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AttachmentPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AttachmentPersistenceServiceImpl.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/AttachmentPersistenceServiceImpl.java 2013-04-18 18:58:30 UTC (rev 825) @@ -30,7 +30,6 @@ import fr.ifremer.adagio.core.dao.data.measure.file.MeasurementFileDao; import fr.ifremer.adagio.core.dao.referential.ObjectTypeImpl; import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; -import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl; import fr.ifremer.tutti.TuttiIOUtil; import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; import fr.ifremer.tutti.persistence.entities.data.AttachementObjectTypeEnum; 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-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java 2013-04-18 18:58:30 UTC (rev 825) @@ -36,6 +36,7 @@ * @author tchemit <chemit@codelutin.com> * @since 1.4 */ +@Transactional(readOnly = true) public interface IndividualObservationBatchPersistenceService extends TuttiPersistenceServiceImplementor { List<IndividualObservationBatch> getAllIndividualObservationBatch(String fishingOperationId); 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-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java 2013-04-18 18:58:30 UTC (rev 825) @@ -26,15 +26,41 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import fr.ifremer.adagio.core.dao.administration.programStrategy.Program; +import fr.ifremer.adagio.core.dao.administration.user.DepartmentImpl; +import fr.ifremer.adagio.core.dao.administration.user.PersonImpl; +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.operation.FishingOperationDao; +import fr.ifremer.adagio.core.dao.data.operation.FishingOperationImpl; +import fr.ifremer.adagio.core.dao.data.sample.Sample; +import fr.ifremer.adagio.core.dao.data.sample.SampleDao; +import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; +import fr.ifremer.adagio.core.dao.referential.pmfm.Matrix; +import fr.ifremer.adagio.core.dao.referential.pmfm.MatrixImpl; +import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonImpl; +import fr.ifremer.adagio.core.dao.technical.synchronization.SynchronizationStatus; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +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.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.type.IntegerType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataRetrievalFailureException; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.Collections; +import java.util.Iterator; import java.util.List; -import java.util.UUID; /** * @author tchemit <chemit@codelutin.com> @@ -48,23 +74,90 @@ LogFactory.getLog(IndividualObservationBatchPersistenceServiceImpl.class); @Autowired + protected ReferentialPersistenceService referentialService; + + @Autowired protected AttachmentPersistenceService attachmentPersistenceService; + @Autowired + protected SampleMeasurementPersistenceHelper sampleMeasurementPersistenceHelper; + + @Resource(name = "fishingOperationDao") + protected FishingOperationDao fishingOperationDao; + + @Resource(name = "catchBatchDao") + protected CatchBatchExtendDao catchBatchDao; + + @Resource(name = "sampleDao") + protected SampleDao sampleDao; + @Override public List<IndividualObservationBatch> getAllIndividualObservationBatch(String fishingOperationId) { Preconditions.checkNotNull(fishingOperationId); + + Integer operationId = Integer.valueOf(fishingOperationId); + + // Get Vrac / Species Batch + SortingBatch vracSpeciesBatch = getBatch(operationId); + + Iterator<Object[]> list = queryList( + "allFishingOperationSamplesWithBatch", + "fishingOperationId", IntegerType.INSTANCE, operationId, + "batchId", IntegerType.INSTANCE, vracSpeciesBatch.getId() + ); + List<IndividualObservationBatch> result = Lists.newArrayList(); - // TODO - return result; + while (list.hasNext()) { + Object[] source = list.next(); + + IndividualObservationBatch batch = + TuttiBeanFactory.newIndividualObservationBatch(); + + int colIndex = 0; + + // Id + batch.setId((Integer) source[colIndex++]); + + // TaxonId + Integer taxonId = (Integer) source[colIndex++]; + Species species = referentialService.getSpeciesByReferenceTaxonId(taxonId); + batch.setSpecies(species); + + // Comment + batch.setComment((String) source[colIndex]); + + // Sample Measurements + batch.setCaracteristics(new CaracteristicMap()); + + // fill all measurements + fillSampleMeasurements(batch); + + result.add(batch); + } + return Collections.unmodifiableList(result); } @Override public IndividualObservationBatch createIndividualObservationBatch(IndividualObservationBatch bean) { Preconditions.checkNotNull(bean); Preconditions.checkState(TuttiEntities.isNew(bean)); - // TODO - bean.setId(UUID.randomUUID().toString()); + Preconditions.checkNotNull(bean.getSpecies()); + Preconditions.checkNotNull(bean.getSize()); + Preconditions.checkNotNull(bean.getLengthStepCaracteristic()); + + FishingOperation fishingOperation = bean.getFishingOperation(); + Preconditions.checkNotNull(fishingOperation); + Preconditions.checkState(!TuttiEntities.isNew(fishingOperation)); + + // Get Vrac / Species Batch + SortingBatch vracSpeciesBatch = getBatch( + fishingOperation.getIdAsInt()); + + Sample sample = Sample.Factory.newInstance(); + beanToEntity(bean, sample, vracSpeciesBatch); + sampleDao.create(sample); + bean.setId(String.valueOf(sample.getId())); return bean; } @@ -72,15 +165,213 @@ public IndividualObservationBatch saveIndividualObservationBatch(IndividualObservationBatch bean) { Preconditions.checkNotNull(bean); Preconditions.checkState(!TuttiEntities.isNew(bean)); - // TODO + Preconditions.checkNotNull(bean.getSpecies()); + Preconditions.checkNotNull(bean.getSize()); + Preconditions.checkNotNull(bean.getLengthStepCaracteristic()); + + FishingOperation fishingOperation = bean.getFishingOperation(); + Preconditions.checkNotNull(fishingOperation); + Preconditions.checkState(!TuttiEntities.isNew(fishingOperation)); + + // Get Vrac / Species Batch + SortingBatch vracSpeciesBatch = getBatch(fishingOperation.getIdAsInt()); + + Sample sample = sampleDao.load(bean.getIdAsInt()); + if (sample == null) { + throw new DataRetrievalFailureException( + "Could not retrieve sample id: " + bean.getId()); + } + beanToEntity(bean, sample, vracSpeciesBatch); + sampleDao.update(sample); return bean; } @Override public void deleteIndividualObservationBatch(String id) { Preconditions.checkNotNull(id); - // TODO - attachmentPersistenceService.deleteAllAttachment(Integer.valueOf(id)); + + Integer batchId = Integer.valueOf(id); + + if (log.isInfoEnabled()) { + log.info("Will delete individual observation batch: " + + batchId); + } + //FIXME See why this code does not work +// sampleDao.remove(batchId); + Sample sample = sampleDao.load(batchId); + if (sample != null) { + sample.getSampleMeasurements().clear(); + sampleDao.remove(sample); + attachmentPersistenceService.deleteAllAttachment(batchId); + } } + // ------------------------------------------------------------------------// + // -- Internal methods --// + // ------------------------------------------------------------------------// + + protected void beanToEntity(IndividualObservationBatch source, Sample target, SortingBatch vracSpeciesBatch) { + + if (TuttiEntities.isNew(source)) { + + // operation + fr.ifremer.adagio.core.dao.data.operation.FishingOperation fishingOperation; + + fishingOperation = load(FishingOperationImpl.class, source.getFishingOperation().getIdAsInt()); + fishingOperation.getSamples().add(target); // Inverse link + + // Link to parent operation + target.setFishingOperation(fishingOperation); + + // Label + String label = fishingOperation.getId() + "_" + source.getSpecies().getReferenceTaxonId(); + target.setLabel(label); + + // Matrix (product / batch) + Matrix matrix = load(MatrixImpl.class, enumeration.MATRIX_ID_PRODUCT_BATCH); + target.setMatrix(matrix); + + // IndividualCount + target.setIndividualCount((short) 1); + + // Quality Flag + target.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED)); + + // Sample Date + if (target.getSampleDate() == null) { + target.setSampleDate(fishingOperation.getFishingStartDateTime()); + } + + // Create Date + target.setCreationDate(fishingOperation.getFishingStartDateTime()); + + // Recorder Departement + target.setRecorderDepartment(load(DepartmentImpl.class, + enumeration.DEPARTMENT_ID_UNKNOWN_RECORDER_DEPARTMENT)); + + // Recorder Person + target.setRecorderPerson(load(PersonImpl.class, + enumeration.PERSON_ID_UNKNOWN_RECORDER_PERSON)); + + // Program + Program program = fishingOperation.getFishingTrip().getProgram(); + target.setProgram(program); + } + + // Id + target.setId(source.getIdAsInt()); + + // Always attach to given vracSpecies batch + target.setBatch(vracSpeciesBatch); + + // Synchronization Status + target.setSynchronizationStatus(SynchronizationStatus.DIRTY.getValue()); + + // Comment + target.setComments(source.getComment()); + + // ReferenceTaxon + Species species = source.getSpecies(); + Integer referenceTaxonId = species.getReferenceTaxonId(); + target.setReferenceTaxon(load(ReferenceTaxonImpl.class, referenceTaxonId)); + + // Taxongroup TODO + + // FishingAreas TODO + + // Prepare sample measurements + + CaracteristicMap caracteristics = + CaracteristicMap.copy(source.getCaracteristics()); + + if (source.getSamplingCode() != null) { + + Caracteristic caracteristic = + referentialService.getCaracteristic(enumeration.PMFM_ID_SAMPLE_ID); + caracteristics.put(caracteristic, source.getSamplingCode()); + } + + if (source.getCalcifiedPieceSamplingCode() != null) { + + Caracteristic caracteristic = + referentialService.getCaracteristic(enumeration.PMFM_ID_OTOLITHE_ID); + caracteristics.put(caracteristic, source.getCalcifiedPieceSamplingCode()); + } + + if (source.getWeight() != null) { + + Caracteristic caracteristic = referentialService.getCaracteristic( + enumeration.PMFM_ID_WEIGHT_MEASURED); + caracteristics.put(caracteristic, source.getWeight()); + } + + if (source.getLengthStepCaracteristic() != null) { + + Caracteristic caracteristic = referentialService.getCaracteristic( + enumeration.PMFM_ID_ID_PSFM); + caracteristics.put(caracteristic, + source.getLengthStepCaracteristic().getId()); + + caracteristics.put(source.getLengthStepCaracteristic(), + source.getSize()); + } + + sampleMeasurementPersistenceHelper.setSampleMeasurements(target, + caracteristics); + + + } + + protected SortingBatch getBatch(Integer operationId) { + + // Load batch tree + Integer catchBatchId = catchBatchDao.getIdByFishingOperationId(operationId); + Preconditions.checkNotNull(catchBatchId); + + CatchBatch catchBatch = catchBatchDao.loadFullTree(catchBatchId); + Preconditions.checkNotNull(catchBatch); + + // Vrac / Species + SortingBatch vracSpeciesBatch = catchBatchDao.getSortingBatch( + catchBatch.getChildBatchs(), + BatchPersistenceHelper.BATCH_PMFM_ID, enumeration.PMFM_ID_SORTED_UNSORTED, enumeration.QUALITATIVE_VRAC_ID, + BatchPersistenceHelper.BATCH_PMFM_ID, enumeration.PMFM_ID_SORTING_TYPE, enumeration.QUALITATIVE_ID_SORTING_TYPE_SPECIES, + BatchPersistenceHelper.BATCH_PMFM_ID, enumeration.PMFM_ID_SORTING_TYPE_2, enumeration.QUALITATIVE_ID_SORTING_TYPE_2_ALIVE_ITEMIZED + ); + Preconditions.checkNotNull(vracSpeciesBatch); + return vracSpeciesBatch; + } + + protected void fillSampleMeasurements(IndividualObservationBatch batch) { + + CaracteristicMap result = batch.getCaracteristics(); + + sampleMeasurementPersistenceHelper.fillSampleMeasurements( + result, batch.getIdAsInt()); + + String sampleCode = (String) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_SAMPLE_ID)); + if (sampleCode != null) { + batch.setSamplingCode(sampleCode); + } + + String calcifiedPieceSampleCode = (String) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_OTOLITHE_ID)); + if (sampleCode != null) { + batch.setCalcifiedPieceSamplingCode(calcifiedPieceSampleCode); + } + + Float weight = (Float) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_WEIGHT_MEASURED)); + if (weight != null) { + batch.setWeight(weight); + } + + String lengthClassId = (String) result.remove(referentialService.getCaracteristic(enumeration.PMFM_ID_ID_PSFM)); + if (lengthClassId != null) { + Caracteristic lengthStepCaracteristic = referentialService.getCaracteristic(Integer.valueOf(lengthClassId)); + batch.setLengthStepCaracteristic(lengthStepCaracteristic); + + Serializable length = result.remove(lengthStepCaracteristic); + batch.setSize((Float) length); + } + } + } Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MeasurementPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MeasurementPersistenceHelper.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/MeasurementPersistenceHelper.java 2013-04-18 18:58:30 UTC (rev 825) @@ -29,7 +29,6 @@ import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl; 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 org.springframework.stereotype.Component; import java.io.Serializable; @@ -49,19 +48,24 @@ if (value == null) { return; } - if (caracteristic.getCaracteristicType() == CaracteristicType.TEXT) { - measurement.setAlphanumericalValue((String) value); - } else if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER) { - measurement.setNumericalValue((Float) value); - } else if (caracteristic.getCaracteristicType() == CaracteristicType.QUALITATIVE) { - Integer qvId = null; - if (value instanceof CaracteristicQualitativeValue) { - qvId = Integer.valueOf(((CaracteristicQualitativeValue) value).getId()); - } else if (value instanceof Integer) { - qvId = (Integer) value; - } - QualitativeValue qv = load(QualitativeValueImpl.class, qvId); - measurement.setQualitativeValue(qv); + switch (caracteristic.getCaracteristicType()) { + + case NUMBER: + measurement.setNumericalValue((Float) value); + break; + case QUALITATIVE: + Integer qvId = null; + if (value instanceof CaracteristicQualitativeValue) { + qvId = Integer.valueOf(((CaracteristicQualitativeValue) value).getId()); + } else if (value instanceof Integer) { + qvId = (Integer) value; + } + QualitativeValue qv = load(QualitativeValueImpl.class, qvId); + measurement.setQualitativeValue(qv); + break; + case TEXT: + measurement.setAlphanumericalValue((String) value); + break; } } } Added: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SampleMeasurementPersistenceHelper.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SampleMeasurementPersistenceHelper.java (rev 0) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SampleMeasurementPersistenceHelper.java 2013-04-18 18:58:30 UTC (rev 825) @@ -0,0 +1,145 @@ +package fr.ifremer.tutti.persistence.service; + +/* + * #%L + * Tutti :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.Sets; +import fr.ifremer.adagio.core.dao.data.measure.SampleMeasurement; +import fr.ifremer.adagio.core.dao.data.sample.Sample; +import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl; +import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import org.hibernate.type.IntegerType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.Set; + +/** + * Helper around {@link SampleMeasurement}. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.6 + */ +@Component("sampleMeasurementPersistenceHelper") +public class SampleMeasurementPersistenceHelper extends AbstractPersistenceService { + + @Autowired + protected ReferentialPersistenceService referentialService; + + @Autowired + protected MeasurementPersistenceHelper measurementPersistenceHelper; + + public void setSampleMeasurements(Sample target, + CaracteristicMap caracteristics) { + + Set<SampleMeasurement> notChangedSampleMeasurements = Sets.newHashSet(); + if (target.getSampleMeasurements() != null) { + notChangedSampleMeasurements.addAll(target.getSampleMeasurements()); + } + + for (Caracteristic caracteristic : caracteristics.keySet()) { + SampleMeasurement vum = setSampleMeasurement( + target, + caracteristic, + caracteristics.get(caracteristic)); + notChangedSampleMeasurements.remove(vum); + } + + if (target.getSampleMeasurements() != null && + notChangedSampleMeasurements.size() > 0) { + target.getSampleMeasurements().removeAll(notChangedSampleMeasurements); + } + } + + public void fillSampleMeasurements(CaracteristicMap result, + Integer sampleId) { + Iterator<Object[]> list = queryList( + "sampleMeasurements", + "sampleId", IntegerType.INSTANCE, sampleId); + while (list.hasNext()) { + int colIndex = 0; + Object[] source = list.next(); + Integer pmfmId = (Integer) source[colIndex++]; + Float numericalValue = (Float) source[colIndex++]; + String alphanumericalValue = (String) source[colIndex++]; + Integer qualitativeValueId = (Integer) source[colIndex]; + + Caracteristic caracteristic = referentialService.getCaracteristic(pmfmId); + Serializable value = null; + switch (caracteristic.getCaracteristicType()) { + + case NUMBER: + value = numericalValue; + break; + case QUALITATIVE: + value = TuttiEntities.getQualitativeValue(caracteristic, + qualitativeValueId); + break; + case TEXT: + value = alphanumericalValue; + break; + } + result.put(caracteristic, value); + } + } + + protected SampleMeasurement setSampleMeasurement(Sample sample, + Caracteristic caracteristic, + Serializable value) { + + Integer pmfmId = caracteristic.getIdAsInt(); + + SampleMeasurement result = null; + if (sample.getSampleMeasurements() != null) { + for (SampleMeasurement vum : sample.getSampleMeasurements()) { + if (pmfmId.equals(vum.getPmfm().getId())) { + result = vum; + break; + } + } + } + if (result == null) { + + result = SampleMeasurement.Factory.newInstance(); + + result.setSample(sample); + if (sample.getSampleMeasurements() == null) { + sample.setSampleMeasurements(Sets.newHashSet(result)); + } else { + sample.getSampleMeasurements().add(result); + } + result.setQualityFlag(load(QualityFlagImpl.class, enumeration.QUALITY_FLAG_CODE_NOT_QUALIFIED)); + result.setDepartment(sample.getRecorderDepartment()); + result.setPmfm(load(PmfmImpl.class, pmfmId)); + } + measurementPersistenceHelper.setMeasurement(result, caracteristic, value); + return result; + } + +} Property changes on: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SampleMeasurementPersistenceHelper.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiEnumerationFile.java 2013-04-18 18:58:30 UTC (rev 825) @@ -279,11 +279,17 @@ public final Integer TRANSCRIBING_TYPE_ID_VERNACULAIRE = null; @Value("${MatrixId.PRODUCT_BATCH}") - public final Integer MATRIX_ID_PRODUCT_BATCH= null; + public final Integer MATRIX_ID_PRODUCT_BATCH = null; - @Value("${PmfmId.SAMPLE_LENGTH_STEP}") - public final Integer PMFM_ID_SAMPLE_LENGTH_STEP = null; + @Value("${PmfmId.ID_PSFM}") + public final Integer PMFM_ID_ID_PSFM = null; + @Value("${PmfmId.SAMPLE_ID}") + public final Integer PMFM_ID_SAMPLE_ID = null; + + @Value("${PmfmId.OTOLITHE_ID}") + public final Integer PMFM_ID_OTOLITHE_ID = null; + /** * Contract to place on enumeration that must be synched to field inside this class. * <p/> @@ -350,7 +356,8 @@ PMFM_ID_SIZE_CATEGORY, PMFM_ID_MATURITY, PMFM_ID_SEX, - PMFM_ID_AGE + PMFM_ID_AGE, + PMFM_ID_ID_PSFM ); pmfmIdToSampleCategory = Maps.newTreeMap(); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-04-18 18:58:30 UTC (rev 825) @@ -110,6 +110,11 @@ AccidentalBatchPersistenceService.class); } + public static IndividualObservationBatchPersistenceService getIndividualObservationBatchPersistenceService() { + return getPersistenceService("individualObservationBatchPersistenceService", + IndividualObservationBatchPersistenceService.class); + } + public static ProtocolPersistenceService getProtocolPersistenceService() { return getPersistenceService("protocolPersistenceService", ProtocolPersistenceService.class); Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/synchro/ReferentialSynchronizeServiceImpl.java 2013-04-18 18:58:30 UTC (rev 825) @@ -27,7 +27,6 @@ import com.google.common.base.Preconditions; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.service.AbstractPersistenceService; -import org.apache.commons.dbcp.BasicDataSource; import org.hibernate.dialect.Dialect; import org.hibernate.engine.SessionFactoryImplementor; import org.springframework.beans.factory.annotation.Autowired; Modified: trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml =================================================================== --- trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-04-18 18:58:30 UTC (rev 825) @@ -320,7 +320,7 @@ <query-param name="catchBatchId" type="java.lang.Integer"/> </query> - <query cacheable="true" name="allFishingOperationSamples"> + <query cacheable="true" name="allFishingOperationSamplesWithoutBatch"> <![CDATA[ SELECT s.id AS id, @@ -336,6 +336,24 @@ <query-param name="fishingOperationId" type="java.lang.Integer"/> </query> + <query cacheable="true" name="allFishingOperationSamplesWithBatch"> + <![CDATA[ + SELECT + s.id AS id, + s.referenceTaxon.id AS referenceTaxon, + s.comments AS comment + FROM + SampleImpl s + WHERE + s.fishingOperation.id= :fishingOperationId + AND s.batch.id = :batchId + ORDER BY + s.creationDate + ]]> + <query-param name="fishingOperationId" type="java.lang.Integer"/> + <query-param name="batchId" type="java.lang.Integer"/> + </query> + <query cacheable="true" name="sampleMeasurements"> <![CDATA[ SELECT Modified: trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties =================================================================== --- trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/main/resources/tutti-db-enumerations.properties 2013-04-18 18:58:30 UTC (rev 825) @@ -385,10 +385,16 @@ #PSFM "Remis à l'eau mort ou vivant" PmfmId.DEAD_OR_ALIVE=1393 -#TODO A creer (type alphanumeric) -# PSFM "Classe de Taille dans captures accidentelles / données individuelles" (écran capture accidentelle / observation individuelle) -PmfmId.SAMPLE_LENGTH_STEP=1432 +#TODO A creer (type alphanumeric) FIXME Change Id when in next db +# PSFM "Pour référencer un autre id de pmfm" +PmfmId.ID_PSFM=1243 +#TODO A creer (type alphanumeric) FIXME Change Id when in next db +PmfmId.SAMPLE_ID=1424 + +#TODO A creer (type alphanumeric) FIXME Change Id when in next db +PmfmId.OTOLITHE_ID=1432 + # (20=observateur volant, 95=Administrateur SIH) -> L'avantage du 20 est qu'il est inactif (=20), donc plus facilement detectable PersonId.UNKNOWN_RECORDER_PERSON=20 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-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/DatabaseFixtures.java 2013-04-18 18:58:30 UTC (rev 825) @@ -28,8 +28,10 @@ import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiBeanFactory; import fr.ifremer.tutti.persistence.entities.data.AccidentalBatch; +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 fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType; import fr.ifremer.tutti.persistence.entities.referential.Gear; @@ -37,8 +39,10 @@ import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.service.AccidentalBatchPersistenceService; +import fr.ifremer.tutti.persistence.service.CatchBatchPersistenceService; import fr.ifremer.tutti.persistence.service.CruisePersistenceService; import fr.ifremer.tutti.persistence.service.FishingOperationPersistenceService; +import fr.ifremer.tutti.persistence.service.IndividualObservationBatchPersistenceService; import fr.ifremer.tutti.persistence.service.ProgramPersistenceService; import fr.ifremer.tutti.persistence.service.ReferentialPersistenceService; import fr.ifremer.tutti.persistence.service.TuttiPersistenceServiceLocator; @@ -198,17 +202,23 @@ protected FishingOperationPersistenceService fishingOperationService; + protected CatchBatchPersistenceService catchBatchService; + protected ReferentialPersistenceService referentialService; protected AccidentalBatchPersistenceService accidentalBatchService; + protected IndividualObservationBatchPersistenceService individualObservationBatchService; + public void setUp() { if (referentialService == null) { referentialService = TuttiPersistenceServiceLocator.getReferentialPersistenceService(); programService = TuttiPersistenceServiceLocator.getProgramPersistenceService(); cruiseService = TuttiPersistenceServiceLocator.getCruisePersistenceService(); fishingOperationService = TuttiPersistenceServiceLocator.getFishingOperationPersistenceService(); + catchBatchService = TuttiPersistenceServiceLocator.getCatchBatchPersistenceService(); accidentalBatchService = TuttiPersistenceServiceLocator.getAccidentalBatchPersistenceService(); + individualObservationBatchService = TuttiPersistenceServiceLocator.getIndividualObservationBatchPersistenceService(); } } @@ -355,6 +365,16 @@ return result; } + public CatchBatch createCatchBatch(FishingOperation fishingOperation) { + + setUp(); + + CatchBatch catchBatch = TuttiBeanFactory.newCatchBatch(); + catchBatch.setFishingOperation(fishingOperation); + CatchBatch result = catchBatchService.createCatchBatch(catchBatch); + return result; + } + public AccidentalBatch createMinimalAccidentalBatch(FishingOperation fishingOperation) { setUp(); @@ -367,4 +387,21 @@ accidentalBatchService.createAccidentalBatch(minimalAccidentalBatch); return result; } + + public IndividualObservationBatch createMinimalIndividualObservationBatch(FishingOperation fishingOperation) { + + setUp(); + + IndividualObservationBatch minimalAccidentalBatch = TuttiBeanFactory.newIndividualObservationBatch(); + minimalAccidentalBatch.setFishingOperation(fishingOperation); + minimalAccidentalBatch.setSpecies(referentialService.getSpeciesByReferenceTaxonId(refSpeciesTaxonId())); + minimalAccidentalBatch.setCaracteristics(new CaracteristicMap()); + minimalAccidentalBatch.setLengthStepCaracteristic(referentialService.getCaracteristic(refNumericalPmfmId())); + minimalAccidentalBatch.setSize(10.0f); + minimalAccidentalBatch.setWeight(5.f); + + IndividualObservationBatch result = + individualObservationBatchService.createIndividualObservationBatch(minimalAccidentalBatch); + return result; + } } 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-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/AccidentalBatchPersistenceServiceWriteTest.java 2013-04-18 18:58:30 UTC (rev 825) @@ -105,12 +105,13 @@ Caracteristic stringCaracteristic = referentialService.getCaracteristic(dbResource.getFixtures().refAlphanumericPmfmId()); caracteristicMap.put(stringCaracteristic, "Un texte!"); - fullAccidentalBatch.setSize(10.0f); fullAccidentalBatch.setComment("AccidentalBatch-full"); fullAccidentalBatch.setDeadOrAlive(referentialService.getDeadOrAliveCaracteristic().getQualitativeValue(0)); fullAccidentalBatch.setGender(referentialService.getSexCaracteristic().getQualitativeValue(0)); fullAccidentalBatch.setLengthStepCaracteristic(referentialService.getCaracteristic(dbResource.getFixtures().refNumericalPmfmId())); + fullAccidentalBatch.setSize(10.0f); + fullAccidentalBatch.setWeight(5.f); AccidentalBatch createdAccidentalBatch2 = @@ -151,19 +152,6 @@ assertEqualsAccidentalBatch(savedAccidentalBatch, reloadedAccidentalBatch3); } - protected void assertEqualsAccidentalBatch(AccidentalBatch expected, - AccidentalBatch actual) { - Assert.assertEquals(expected, actual); - Assert.assertEquals(expected.getSize(), actual.getSize()); - Assert.assertEquals(expected.getComment(), actual.getComment()); - Assert.assertEquals(expected.getDeadOrAlive(), actual.getDeadOrAlive()); - Assert.assertEquals(expected.getGender(), actual.getGender()); - Assert.assertEquals(expected.getLengthStepCaracteristic(), actual.getLengthStepCaracteristic()); - Assert.assertEquals(expected.getWeight(), actual.getWeight()); - Assert.assertEquals(expected.getCaracteristics(), actual.getCaracteristics()); - Assert.assertEquals(expected.getFishingOperation(), actual.getFishingOperation()); - } - @Test public void deleteAccidentalBatch(/*String id*/) { @@ -179,4 +167,18 @@ List<AccidentalBatch> allAccidentalBatch2 = service.getAllAccidentalBatch(fishingOperation.getId()); Assert.assertTrue(CollectionUtils.isEmpty(allAccidentalBatch2)); } + + protected void assertEqualsAccidentalBatch(AccidentalBatch expected, + AccidentalBatch actual) { + Assert.assertEquals(expected, actual); + Assert.assertEquals(expected.getId(), actual.getId()); + Assert.assertEquals(expected.getSize(), actual.getSize()); + Assert.assertEquals(expected.getComment(), actual.getComment()); + Assert.assertEquals(expected.getDeadOrAlive(), actual.getDeadOrAlive()); + Assert.assertEquals(expected.getGender(), actual.getGender()); + Assert.assertEquals(expected.getLengthStepCaracteristic(), actual.getLengthStepCaracteristic()); + Assert.assertEquals(expected.getWeight(), actual.getWeight()); + Assert.assertEquals(expected.getCaracteristics(), actual.getCaracteristics()); + Assert.assertEquals(expected.getFishingOperation(), actual.getFishingOperation()); + } } Added: 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 (rev 0) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java 2013-04-18 18:58:30 UTC (rev 825) @@ -0,0 +1,187 @@ +package fr.ifremer.tutti.persistence.service; + +/* + * #%L + * Tutti :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 - 2013 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ifremer.tutti.persistence.DatabaseResource; +import fr.ifremer.tutti.persistence.entities.CaracteristicMap; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.Cruise; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import org.apache.commons.collections.CollectionUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; + +import java.util.List; + +/** + * To test {@link IndividualObservationBatchPersistenceService} for write + * operation. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.5 + */ +public class IndividualObservationBatchPersistenceServiceWriteTest { + + @ClassRule + public static final DatabaseResource dbResource = DatabaseResource.writeDb(); + + protected IndividualObservationBatchPersistenceService service; + + protected ReferentialPersistenceService referentialService; + + protected FishingOperation fishingOperation; + + @Before + public void setUp() throws Exception { + referentialService = TuttiPersistenceServiceLocator.getReferentialPersistenceService(); + service = TuttiPersistenceServiceLocator.getIndividualObservationBatchPersistenceService(); + Cruise cruise = dbResource.getFixtures().createCruise(); + fishingOperation = dbResource.getFixtures().createFishingOperation(cruise); + dbResource.getFixtures().createCatchBatch(fishingOperation); + } + + + @Test + public void createIndividualObservationBatch(/*IndividualObservationBatch bean*/) { + + // ----------------------------------------------------------------------------- + // 1. Create with only mandatory properties + // ----------------------------------------------------------------------------- + + IndividualObservationBatch createdIndividualObservationBatch = dbResource.getFixtures().createMinimalIndividualObservationBatch(fishingOperation); + + Assert.assertNotNull(createdIndividualObservationBatch); + Assert.assertNotNull(createdIndividualObservationBatch.getId()); + + // reload it + List<IndividualObservationBatch> allIndividualObservationBatch = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isNotEmpty(allIndividualObservationBatch)); + IndividualObservationBatch reloadedIndividualObservationBatch = allIndividualObservationBatch.get(0); + reloadedIndividualObservationBatch.setFishingOperation(fishingOperation); + assertEqualsIndividualObservationBatch(createdIndividualObservationBatch, reloadedIndividualObservationBatch); + + // ----------------------------------------------------------------------------- + // 2. Create a full with all properties + // ----------------------------------------------------------------------------- + + IndividualObservationBatch fullIndividualObservationBatch = createdIndividualObservationBatch; + fullIndividualObservationBatch.setId((String) null); + + CaracteristicMap caracteristicMap = new CaracteristicMap(); + fullIndividualObservationBatch.setCaracteristics(caracteristicMap); + + // add a qualitative caracteristic + Caracteristic maturityCaracteristic = referentialService.getMaturityCaracteristic(); + caracteristicMap.put(maturityCaracteristic, maturityCaracteristic.getQualitativeValue(0)); + + // add a numeric caracteristic + Caracteristic ageCaracteristic = referentialService.getAgeCaracteristic(); + caracteristicMap.put(ageCaracteristic, 10.f); + + // add a string caracteristic + //FIXME Can't add it until we have correct pmfm id (with no collision here) +// Caracteristic stringCaracteristic = referentialService.getCaracteristic(dbResource.getFixtures().refAlphanumericPmfmId()); +// caracteristicMap.put(stringCaracteristic, "Un texte!"); + + fullIndividualObservationBatch.setComment("IndividualObservationBatch-full"); + fullIndividualObservationBatch.setSamplingCode("SamplingCode"); + fullIndividualObservationBatch.setCalcifiedPieceSamplingCode("CalcifiedPieceSamplingCode"); + + fullIndividualObservationBatch.setLengthStepCaracteristic(referentialService.getCaracteristic(dbResource.getFixtures().refNumericalPmfmId())); + fullIndividualObservationBatch.setSize(10.0f); + fullIndividualObservationBatch.setWeight(5.f); + + IndividualObservationBatch createdIndividualObservationBatch2 = + service.createIndividualObservationBatch(fullIndividualObservationBatch); + + assertEqualsIndividualObservationBatch(fullIndividualObservationBatch, createdIndividualObservationBatch2); + + Assert.assertNotNull(createdIndividualObservationBatch2); + Assert.assertNotNull(createdIndividualObservationBatch2.getId()); + assertEqualsIndividualObservationBatch(fullIndividualObservationBatch, createdIndividualObservationBatch2); + + // reload it + allIndividualObservationBatch = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isNotEmpty(allIndividualObservationBatch)); + Assert.assertEquals(2, allIndividualObservationBatch.size()); + IndividualObservationBatch reloadedIndividualObservationBatch2 = TuttiEntities.splitById(allIndividualObservationBatch).get(createdIndividualObservationBatch2.getId()); + reloadedIndividualObservationBatch2.setFishingOperation(fishingOperation); + assertEqualsIndividualObservationBatch(createdIndividualObservationBatch2, reloadedIndividualObservationBatch2); + + // ----------------------------------------------------------------------------- + // 2. Modify some properties and save + // ----------------------------------------------------------------------------- + IndividualObservationBatch modifiedIndividualObservationBatch = reloadedIndividualObservationBatch2; + modifiedIndividualObservationBatch.setSize(15f); + modifiedIndividualObservationBatch.setWeight(35f); + fullIndividualObservationBatch.setComment("IndividualObservationBatch-modified"); + fullIndividualObservationBatch.setSamplingCode("SamplingCode"); + fullIndividualObservationBatch.setCalcifiedPieceSamplingCode("CalcifiedPieceSamplingCode"); + modifiedIndividualObservationBatch.getCaracteristics().clear(); + + IndividualObservationBatch savedIndividualObservationBatch = service.saveIndividualObservationBatch(modifiedIndividualObservationBatch); + assertEqualsIndividualObservationBatch(modifiedIndividualObservationBatch, savedIndividualObservationBatch); + + allIndividualObservationBatch = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isNotEmpty(allIndividualObservationBatch)); + IndividualObservationBatch reloadedIndividualObservationBatch3 = TuttiEntities.splitById(allIndividualObservationBatch).get(createdIndividualObservationBatch2.getId()); + reloadedIndividualObservationBatch3.setFishingOperation(fishingOperation); + assertEqualsIndividualObservationBatch(savedIndividualObservationBatch, reloadedIndividualObservationBatch3); + } + + @Test + public void deleteIndividualObservationBatch(/*String id*/) { + + IndividualObservationBatch createdIndividualObservationBatch = + dbResource.getFixtures().createMinimalIndividualObservationBatch( + fishingOperation); + + List<IndividualObservationBatch> allIndividualObservationBatch = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertFalse(CollectionUtils.isEmpty(allIndividualObservationBatch)); + + service.deleteIndividualObservationBatch(createdIndividualObservationBatch.getId()); + + List<IndividualObservationBatch> allIndividualObservationBatch2 = service.getAllIndividualObservationBatch(fishingOperation.getId()); + Assert.assertTrue(CollectionUtils.isEmpty(allIndividualObservationBatch2)); + } + + protected void assertEqualsIndividualObservationBatch(IndividualObservationBatch expected, + IndividualObservationBatch actual) { + Assert.assertEquals(expected, actual); + Assert.assertEquals(expected.getId(), actual.getId()); + Assert.assertEquals(expected.getSize(), actual.getSize()); + Assert.assertEquals(expected.getComment(), actual.getComment()); + Assert.assertEquals(expected.getSamplingCode(), actual.getSamplingCode()); + Assert.assertEquals(expected.getCalcifiedPieceSamplingCode(), actual.getCalcifiedPieceSamplingCode()); + Assert.assertEquals(expected.getLengthStepCaracteristic(), actual.getLengthStepCaracteristic()); + Assert.assertEquals(expected.getWeight(), actual.getWeight()); + Assert.assertEquals(expected.getCaracteristics(), actual.getCaracteristics()); + Assert.assertEquals(expected.getFishingOperation(), actual.getFishingOperation()); + } +} Property changes on: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceWriteTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceReadTest.java 2013-04-18 18:58:30 UTC (rev 825) @@ -32,7 +32,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Test; import java.util.List; Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceWriteTest.java =================================================================== --- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceWriteTest.java 2013-04-18 16:00:29 UTC (rev 824) +++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceWriteTest.java 2013-04-18 18:58:30 UTC (rev 825) @@ -32,7 +32,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Test; /** @@ -203,7 +202,7 @@ bp2.setSizeEnabled(true); bp2.setWeightEnabled(true); protocol.addBenthos(bp2); - + return protocol; } }
participants (1)
-
tchemit@users.forge.codelutin.com