This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 5f644aced15eaa3bf6196d3fb3f14bfb584198a5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Jan 17 17:02:51 2016 +0100 Permettre de récupérer des référentiels obsolètes (See #7909) --- .../referential/GearPersistenceServiceImpl.java | 4 +- .../referential/PersonPersistenceServiceImpl.java | 18 ++-- .../ReferentialPersistenceServiceSupport.java | 11 ++ .../referential/VesselPersistenceServiceImpl.java | 117 +++++++++------------ .../src/main/resources/queries-failsafe.hbm.xml | 20 ++-- 5 files changed, 83 insertions(+), 87 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/GearPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/GearPersistenceServiceImpl.java index 72d4b81..137cd42 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/GearPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/GearPersistenceServiceImpl.java @@ -100,7 +100,7 @@ public class GearPersistenceServiceImpl extends ReferentialPersistenceServiceSup @Override public Gear getGear(Integer gearId) { - Object[] source = queryUniqueWithStatus( + Object[] source = queryUniqueWithStatus2( "gearById", "gearId", IntegerType.INSTANCE, gearId); @@ -287,7 +287,7 @@ public class GearPersistenceServiceImpl extends ReferentialPersistenceServiceSup Preconditions.checkNotNull(source.getName()); Preconditions.checkArgument(Gears.isTemporaryId(source.getIdAsInt())); - Object[] row = queryUniqueWithStatus( + Object[] row = queryUniqueWithStatus2( "gearByName", "gearName", StringType.INSTANCE, source.getName()); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/PersonPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/PersonPersistenceServiceImpl.java index 1be9acd..b4faad7 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/PersonPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/PersonPersistenceServiceImpl.java @@ -90,18 +90,10 @@ public class PersonPersistenceServiceImpl extends ReferentialPersistenceServiceS return Collections.unmodifiableList(result); } - protected void loadPersons(Iterator<Object[]> list, List<Person> result) { - while (list.hasNext()) { - Object[] source = list.next(); - Person target = loadPerson(source); - result.add(target); - } - } - @Override public Person getPerson(Integer personId) { - Object[] source = queryUniqueWithStatus( + Object[] source = queryUniqueWithStatus2( "personById", "personId", IntegerType.INSTANCE, personId); @@ -299,6 +291,14 @@ public class PersonPersistenceServiceImpl extends ReferentialPersistenceServiceS } + protected void loadPersons(Iterator<Object[]> list, List<Person> result) { + while (list.hasNext()) { + Object[] source = list.next(); + Person target = loadPerson(source); + result.add(target); + } + } + protected Person loadPerson(Object... source) { Person target = Persons.newPerson(); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/ReferentialPersistenceServiceSupport.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/ReferentialPersistenceServiceSupport.java index 5c613b6..68dc077 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/ReferentialPersistenceServiceSupport.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/ReferentialPersistenceServiceSupport.java @@ -79,6 +79,17 @@ public abstract class ReferentialPersistenceServiceSupport extends AbstractPersi return (Object[]) result; } + protected Object[] queryUniqueWithStatus2(String queryName, Object... params) { + + Query query = createQuery(queryName, params); + query.setString("statusValidCode", StatusCode.ENABLE.getValue()); + query.setString("statusTemporaryCode", StatusCode.TEMPORARY.getValue()); + query.setString("statusDisableCode", StatusCode.DISABLE.getValue()); + + Object result = query.uniqueResult(); + return (Object[]) result; + } + protected <E extends TuttiReferentialEntity> void setStatus(String statusCode, E entity) { Status newStatus = Statuss.newStatus(); fr.ifremer.adagio.core.dao.referential.Status status = statusDao.load(statusCode); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/VesselPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/VesselPersistenceServiceImpl.java index ad0295c..29e11ff 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/VesselPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/referential/VesselPersistenceServiceImpl.java @@ -25,9 +25,7 @@ package fr.ifremer.tutti.persistence.service.referential; */ import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import fr.ifremer.adagio.core.dao.data.vessel.VesselExtendDao; import fr.ifremer.adagio.core.dao.referential.StatusCode; import fr.ifremer.adagio.core.dao.referential.VesselTypeId; @@ -35,7 +33,6 @@ import fr.ifremer.adagio.core.dao.referential.location.LocationExtendDao; import fr.ifremer.adagio.core.dao.referential.location.LocationLabel; import fr.ifremer.adagio.core.dao.referential.location.LocationLevelId; import fr.ifremer.adagio.core.dao.technical.hibernate.TemporaryDataHelper; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.referential.Vessel; import fr.ifremer.tutti.persistence.entities.referential.Vessels; import org.apache.commons.lang3.StringUtils; @@ -45,6 +42,7 @@ import org.hibernate.type.DateType; import org.hibernate.type.IntegerType; import org.hibernate.type.StringType; import org.nuiton.jaxx.application.ApplicationBusinessException; +import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.springframework.cache.Cache; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; @@ -96,8 +94,7 @@ public class VesselPersistenceServiceImpl extends ReferentialPersistenceServiceS Iterator<Object[]> list = queryListWithStatus( "allVessels", "refDate", DateType.INSTANCE, new Date(), - "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.FISHING_VESSEL.getValue() - ); + "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.FISHING_VESSEL.getValue()); List<Vessel> result = Lists.newArrayList(); Cache vesselByCodeCache = cacheService.getCache("vesselByCode"); @@ -112,94 +109,50 @@ public class VesselPersistenceServiceImpl extends ReferentialPersistenceServiceS List<Vessel> result = Lists.newArrayList(); -// // Récupération des navires actifs -// result.addAll(getAllFishingVessel()); -// result.addAll(getAllScientificVessel()); - - Iterator<Object[]> fishingVesselList = queryListWithStatus2( "allVesselsWithObsoletes", "refDate", DateType.INSTANCE, new Date(), - "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.FISHING_VESSEL.getValue() - ); + "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.FISHING_VESSEL.getValue()); loadVesselsWithObsoletes(fishingVesselList, result, false); int fishingVesselCount = result.size(); - if (log.isInfoEnabled()) { - log.info("fishing vessels: " + fishingVesselCount); + if (log.isDebugEnabled()) { + log.debug("fishing vessels: " + fishingVesselCount); } Iterator<Object[]> scientificVesselList = queryListWithStatus2( "allVesselsWithObsoletes", "refDate", DateType.INSTANCE, new Date(), - "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.SCIENTIFIC_RESEARCH_VESSEL.getValue() - ); + "vesselTypeId", IntegerType.INSTANCE, VesselTypeId.SCIENTIFIC_RESEARCH_VESSEL.getValue()); loadVesselsWithObsoletes(scientificVesselList, result, true); - if (log.isInfoEnabled()) { - log.info("scientific vessels: " + (result.size() - fishingVesselCount)); - } - try { - ImmutableMap<String, Vessel> index = Maps.uniqueIndex(result, TuttiEntities.GET_ID); - if (log.isInfoEnabled()) { - log.info("Total count: "+index.size()); - } - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("...", e); - } + if (log.isDebugEnabled()) { + log.debug("scientific vessels: " + (result.size() - fishingVesselCount)); } return Collections.unmodifiableList(result); } - protected void loadVessels(Iterator<Object[]> list, List<Vessel> result, boolean scientificVessel, Cache vesselByCodeCache) { - while (list.hasNext()) { - Object[] source = list.next(); - Vessel target = loadVessel(source); - target.setScientificVessel(scientificVessel); - result.add(target); - // Add to cache - vesselByCodeCache.put(target.getId(), target); - } - } - - protected void loadVesselsWithObsoletes(Iterator<Object[]> list, List<Vessel> result, boolean scientificVessel) { - - Vessel lastTarget = null; - while (list.hasNext()) { - Object[] source = list.next(); - Vessel target = loadVessel(source); - target.setScientificVessel(scientificVessel); - if (lastTarget != null && !target.getId().equals(lastTarget.getId())) { - - // nouveau code à traiter, on doit enregister l'ancien navire - result.add(lastTarget); - } - lastTarget = target; - } - result.add(lastTarget); - - } - @Override public Vessel getVessel(String vesselCode) { if (log.isDebugEnabled()) { log.debug("get vessel: " + vesselCode); } - // Warning : return a list because more than one line could be found, - // but 'order by' assume that the first one in the good row - Iterator<Object[]> source = queryListWithStatus( + // On ne peut pas récupérer directement un unique objet à cause des période de validité d'immtriculation + // L'ordre induit par la requete nous donne cependant un match en dernière position + Iterator<Object[]> source = queryListWithStatus2( "vesselByCode", "vesselCode", StringType.INSTANCE, vesselCode, "refDate", DateType.INSTANCE, new Date() ); - Vessel result; - if (source.hasNext()) - result = loadVessel(source.next()); - else - result = null; - return result; + Object[] vesselSource = null; + while (source.hasNext()) { + vesselSource = source.next(); + } + if (vesselSource == null) { + throw new ApplicationTechnicalException("Could not find vessel with code: " + vesselCode); + } + return loadVessel(vesselSource); } @@ -474,8 +427,36 @@ public class VesselPersistenceServiceImpl extends ReferentialPersistenceServiceS "vesselInternationalRegistrationCode", StringType.INSTANCE, source.getInternationalRegistrationCode(), "refDate", DateType.INSTANCE, new Date() ); - Vessel result = row.hasNext() ? loadVessel(row.next()) : null; - return result; + return row.hasNext() ? loadVessel(row.next()) : null; + + } + + protected void loadVessels(Iterator<Object[]> list, List<Vessel> result, boolean scientificVessel, Cache vesselByCodeCache) { + while (list.hasNext()) { + Object[] source = list.next(); + Vessel target = loadVessel(source); + target.setScientificVessel(scientificVessel); + result.add(target); + // Add to cache + vesselByCodeCache.put(target.getId(), target); + } + } + + protected void loadVesselsWithObsoletes(Iterator<Object[]> list, List<Vessel> result, boolean scientificVessel) { + + Vessel lastTarget = null; + while (list.hasNext()) { + Object[] source = list.next(); + Vessel target = loadVessel(source); + target.setScientificVessel(scientificVessel); + if (lastTarget != null && !target.getId().equals(lastTarget.getId())) { + + // nouveau code à traiter, on doit enregister l'ancien navire + result.add(lastTarget); + } + lastTarget = target; + } + result.add(lastTarget); } diff --git a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml index a364d7e..e666615 100644 --- a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml +++ b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml @@ -1280,16 +1280,17 @@ LEFT OUTER JOIN v.vesselFeatures AS vf WHERE v.code = :vesselCode - AND v.status.code IN (:statusValidCode, :statusTemporaryCode) - AND NOT(coalesce(vrp.endDateTime, '2999-12-31 00:00:00') < coalesce(:refDate,sysdate) - OR vrp.vesselRegistrationPeriodPk.startDateTime > coalesce(:refDate,sysdate) - ) - ORDER BY vf.startDateTime DESC + AND v.status.code IN (:statusValidCode, :statusTemporaryCode, :statusDisableCode) + AND vrp.vesselRegistrationPeriodPk.startDateTime <= :refDate + AND vf.startDateTime <= :refDate + AND coalesce(vf.endDateTime, :refDate) >= :refDate + ORDER BY vf.startDateTime, vrp.vesselRegistrationPeriodPk.startDateTime ]]> <query-param name="vesselCode" type="java.lang.String"/> <query-param name="refDate" type="java.util.Date"/> <query-param name="statusValidCode" type="java.lang.String"/> <query-param name="statusTemporaryCode" type="java.lang.String"/> + <query-param name="statusDisableCode" type="java.lang.String"/> </query> <!-- [REF-02-2] Get a vessel by his internationalRegistrationCode --> @@ -1385,11 +1386,12 @@ FROM GearImpl g WHERE g.id = :gearId - AND g.status.code IN (:statusValidCode, :statusTemporaryCode) + AND g.status.code IN (:statusValidCode, :statusTemporaryCode, :statusDisableCode) ]]> <query-param name="gearId" type="java.lang.Integer"/> <query-param name="statusValidCode" type="java.lang.String"/> <query-param name="statusTemporaryCode" type="java.lang.String"/> + <query-param name="statusDisableCode" type="java.lang.String"/> </query> <!-- [REF-03-2] Get a gear by his name --> @@ -1404,11 +1406,12 @@ FROM GearImpl g WHERE g.name = :gearName - AND g.status.code IN (:statusValidCode, :statusTemporaryCode) + AND g.status.code IN (:statusValidCode, :statusTemporaryCode, :statusDisableCode) ]]> <query-param name="gearName" type="java.lang.String"/> <query-param name="statusValidCode" type="java.lang.String"/> <query-param name="statusTemporaryCode" type="java.lang.String"/> + <query-param name="statusDisableCode" type="java.lang.String"/> </query> <!-- [REF-03-3] Get all gears (with obsoletes) for a given gearType --> @@ -1472,11 +1475,12 @@ FROM PersonImpl p WHERE p.id = :personId - AND p.status.code IN (:statusValidCode, :statusTemporaryCode) + AND p.status.code IN (:statusValidCode, :statusTemporaryCode, :statusDisableCode) ]]> <query-param name="personId" type="java.lang.Integer"/> <query-param name="statusValidCode" type="java.lang.String"/> <query-param name="statusTemporaryCode" type="java.lang.String"/> + <query-param name="statusDisableCode" type="java.lang.String"/> </query> <!-- [REF-04-2] Get one person by his full name --> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.