r1725 - in trunk: wao-persistence/src/main/java/fr/ifremer/wao wao-persistence/src/main/java/fr/ifremer/wao/entity wao-services/src/main/java/fr/ifremer/wao/services wao-services/src/main/java/fr/ifremer/wao/services/service wao-services/src/main/java/fr/ifremer/wao/services/service/administration wao-services/src/main/java/fr/ifremer/wao/services/service/csv wao-services/src/main/java/fr/ifremer/wao/services/service/csv/operations wao-services/src/test/java/fr/ifremer/wao/services wao-service
Author: bleny Date: 2014-03-18 17:39:19 +0100 (Tue, 18 Mar 2014) New Revision: 1725 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1725 Log: refs #4483 add import service, enable validation for boats and DCF codes Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/ObsMerFixtures.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlan.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownBoatImmatriculationsException.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownFishingGearDcfCodeException.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownTargetSpeciesDcfCodeException.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanServiceTest.java Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ObservationType.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/ObsMerObsVenteSamplingPlanImportExportModel.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/operations/DCF5CodesParserFormatter.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/AbstractWaoServiceTest.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java trunk/wao-services/src/test/resources/import/echantillonnage.csv trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java (rev 0) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/SampleRowsFilter.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,202 @@ +package fr.ifremer.wao; + +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.ObservationType; +import fr.ifremer.wao.entity.SamplingStrategy; + +import java.util.Date; +import java.util.Set; + +public class SampleRowsFilter { + + protected ObsProgram obsProgram; + + protected ObservationType expectedObservationType; + + protected Date periodFrom; + + protected Date periodTo; + + protected Set<String> fishingZoneFacadeNames; + + protected Set<String> fishingZoneSectorNames; + + protected Set<String> sampleRowCodes; + + protected Set<String> programNames; + + protected Set<String> fishingGearDcfIds; + + protected Set<String> targetSpeciesDcfIds; + + protected Set<SamplingStrategy> samplingStrategies; + + protected Set<String> terrestrialDistrictIds; + + protected Set<String> observationUnitIds; + + protected Set<String> observerIds; + + protected Set<String> subPopulationCodes; + + protected Set<String> skillZoneCodes; + + protected Set<String> regionIfremerIds; + + protected Set<String> companyIds; + + protected Set<String> orderByArguments; + + public ObsProgram getObsProgram() { + return obsProgram; + } + + public void setObsProgram(ObsProgram obsProgram) { + this.obsProgram = obsProgram; + } + + public ObservationType getExpectedObservationType() { + return expectedObservationType; + } + + public void setExpectedObservationType(ObservationType expectedObservationType) { + this.expectedObservationType = expectedObservationType; + } + + public Date getPeriodFrom() { + return periodFrom; + } + + public void setPeriodFrom(Date periodFrom) { + this.periodFrom = periodFrom; + } + + public Date getPeriodTo() { + return periodTo; + } + + public void setPeriodTo(Date periodTo) { + this.periodTo = periodTo; + } + + public Set<String> getFishingZoneFacadeNames() { + return fishingZoneFacadeNames; + } + + public void setFishingZoneFacadeNames(Set<String> fishingZoneFacadeNames) { + this.fishingZoneFacadeNames = fishingZoneFacadeNames; + } + + public Set<String> getFishingZoneSectorNames() { + return fishingZoneSectorNames; + } + + public void setFishingZoneSectorNames(Set<String> fishingZoneSectorNames) { + this.fishingZoneSectorNames = fishingZoneSectorNames; + } + + public Set<String> getSampleRowCodes() { + return sampleRowCodes; + } + + public void setSampleRowCodes(Set<String> sampleRowCodes) { + this.sampleRowCodes = sampleRowCodes; + } + + public Set<String> getProgramNames() { + return programNames; + } + + public void setProgramNames(Set<String> programNames) { + this.programNames = programNames; + } + + public Set<String> getFishingGearDcfIds() { + return fishingGearDcfIds; + } + + public void setFishingGearDcfIds(Set<String> fishingGearDcfIds) { + this.fishingGearDcfIds = fishingGearDcfIds; + } + + public Set<String> getTargetSpeciesDcfIds() { + return targetSpeciesDcfIds; + } + + public void setTargetSpeciesDcfIds(Set<String> targetSpeciesDcfIds) { + this.targetSpeciesDcfIds = targetSpeciesDcfIds; + } + + public Set<SamplingStrategy> getSamplingStrategies() { + return samplingStrategies; + } + + public void setSamplingStrategies(Set<SamplingStrategy> samplingStrategies) { + this.samplingStrategies = samplingStrategies; + } + + public Set<String> getTerrestrialDistrictIds() { + return terrestrialDistrictIds; + } + + public void setTerrestrialDistrictIds(Set<String> terrestrialDistrictIds) { + this.terrestrialDistrictIds = terrestrialDistrictIds; + } + + public Set<String> getObservationUnitIds() { + return observationUnitIds; + } + + public void setObservationUnitIds(Set<String> observationUnitIds) { + this.observationUnitIds = observationUnitIds; + } + + public Set<String> getObserverIds() { + return observerIds; + } + + public void setObserverIds(Set<String> observerIds) { + this.observerIds = observerIds; + } + + public Set<String> getSubPopulationCodes() { + return subPopulationCodes; + } + + public void setSubPopulationCodes(Set<String> subPopulationCodes) { + this.subPopulationCodes = subPopulationCodes; + } + + public Set<String> getSkillZoneCodes() { + return skillZoneCodes; + } + + public void setSkillZoneCodes(Set<String> skillZoneCodes) { + this.skillZoneCodes = skillZoneCodes; + } + + public Set<String> getRegionIfremerIds() { + return regionIfremerIds; + } + + public void setRegionIfremerIds(Set<String> regionIfremerIds) { + this.regionIfremerIds = regionIfremerIds; + } + + public Set<String> getCompanyIds() { + return companyIds; + } + + public void setCompanyIds(Set<String> companyIds) { + this.companyIds = companyIds; + } + + public Set<String> getOrderByArguments() { + return orderByArguments; + } + + public void setOrderByArguments(Set<String> orderByArguments) { + this.orderByArguments = orderByArguments; + } + +} Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -5,7 +5,10 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Collection; import java.util.Date; +import java.util.LinkedList; +import java.util.List; import java.util.regex.Pattern; public class WaoUtils { @@ -48,4 +51,12 @@ return Pattern.compile("^(\\d{4})_" + obsProgram.getShortCode() + "(\\d{4})$"); } + public static <T extends Enum> Collection<Integer> toOrdinals(Collection<T> enums) { + List<Integer> ordinals = new LinkedList<>(); + for (Enum anEnum : enums) { + ordinals.add(anEnum.ordinal()); + } + return ordinals; + } + } Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ObservationType.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ObservationType.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ObservationType.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -56,4 +56,8 @@ } throw new IllegalArgumentException("ordinal " + observationTypeOrdinal); } + + public boolean isFieldWorkObservation() { + return this == ObservationType.FIELD_WORK_OBSERVATION; + } } Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -257,9 +257,11 @@ Preconditions.checkState( ! getObsProgram().equals(ObsProgram.OBSDEB), "opération non prévue pour ObsDeb"); - for (SampleMonth sampleMonth : getSampleMonth()) { - if (sampleMonth.isPeriodDatesContains(date)) { - return sampleMonth; + if (CollectionUtils.isNotEmpty(getSampleMonth())) { + for (SampleMonth sampleMonth : getSampleMonth()) { + if (sampleMonth.isPeriodDatesContains(date)) { + return sampleMonth; + } } } return null; Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -1,10 +1,24 @@ package fr.ifremer.wao.entity; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import fr.ifremer.wao.SampleRowsFilter; +import fr.ifremer.wao.WaoUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.HqlAndParametersBuilder; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + public class SampleRowTopiaDao extends AbstractSampleRowTopiaDao<SampleRow> { + private static final Log log = LogFactory.getLog(SampleRowTopiaDao.class); + public Optional<String> findMaxSampleRowCode(String sampleRowCodePrefix) { String hql = "select max(sr.code) " + newFromClause("sr") @@ -15,4 +29,147 @@ return optionalMaxSampleRowCode; } + public List<SampleRow> findAll(SampleRowsFilter filter) { + + HqlAndParametersBuilder<SampleRow> query = toSampleRowHqlAndParametersBuilder(filter); + + if (CollectionUtils.isNotEmpty(filter.getOrderByArguments())) { + query.setOrderByArguments(filter.getOrderByArguments()); + } + + List<SampleRow> all = findAll(query.getHql(), query.getHqlParameters()); + + return all; + + } + + protected HqlAndParametersBuilder<SampleRow> toSampleRowHqlAndParametersBuilder(SampleRowsFilter filter) { + + ObsProgram obsProgram = filter.getObsProgram(); + + Preconditions.checkNotNull(obsProgram, "ObsProgram cannot be null"); + + HqlAndParametersBuilder<SampleRow> query = newHqlAndParametersBuilder(); + + query.setAlias("sr"); + + query.addEquals(SampleRow.PROPERTY_OBS_PROGRAM_ORDINAL, obsProgram.ordinal()); + + if (filter.getExpectedObservationType() != null) { + query.addEquals(SampleRow.PROPERTY_OBSERVATION_TYPE_ORDINAL, filter.getExpectedObservationType().ordinal()); + } + + if (filter.getPeriodFrom() != null) { + if (obsProgram.isObsDeb()) { + query.addWhereClause("sr." + SampleRow.PROPERTY_EXPECTED_DATE + " >= :periodFrom", ImmutableMap.of("periodTo", (Object) filter.getPeriodFrom())); + } else { + Date periodFromMonth = DateUtils.truncate(filter.getPeriodFrom(), Calendar.MONTH); + query.addWhereClause("sr." + SampleRow.PROPERTY_PERIOD_END + " >= :periodFromMonth", ImmutableMap.of("periodFromMonth", (Object) periodFromMonth)); + } + } + + if (filter.getPeriodTo() != null) { + if (obsProgram.isObsDeb()) { + query.addWhereClause("sr." + SampleRow.PROPERTY_EXPECTED_DATE + " <= :periodTo", ImmutableMap.of("periodTo", (Object) filter.getPeriodTo())); + } else { + Date periodToMonth = DateUtils.truncate(filter.getPeriodTo(), Calendar.MONTH); + query.addWhereClause("sr." + SampleRow.PROPERTY_PERIOD_END + " <= :periodToMonth", ImmutableMap.of("periodToMonth", (Object) periodToMonth)); + } + } + + if (CollectionUtils.isNotEmpty(filter.getSampleRowCodes())) { + query.addIn(SampleRow.PROPERTY_CODE, filter.getSampleRowCodes()); + } + + if (CollectionUtils.isNotEmpty(filter.getProgramNames())) { + query.addIn(SampleRow.PROPERTY_PROGRAM_NAME, filter.getProgramNames()); + } + + if (CollectionUtils.isNotEmpty(filter.getCompanyIds())) { + query.addTopiaIdIn(SampleRow.PROPERTY_COMPANY, filter.getCompanyIds()); + } + + if (CollectionUtils.isNotEmpty(filter.getSamplingStrategies())) { + query.addIn(SampleRow.PROPERTY_SAMPLING_STRATEGY_ORDINAL, WaoUtils.toOrdinals(filter.getSamplingStrategies())); + } + + if (CollectionUtils.isNotEmpty(filter.getObservationUnitIds())) { + query.addTopiaIdIn(SampleRow.PROPERTY_OBSERVATION_UNIT, filter.getObservationUnitIds()); + } + + if (CollectionUtils.isNotEmpty(filter.getSubPopulationCodes())) { + query.addTopiaIdIn( + SampleRow.PROPERTY_OBSERVATION_UNIT + "." + TerrestrialDivision.PROPERTY_SUB_POPULATION_CODE, + filter.getSubPopulationCodes()); + } + + if (CollectionUtils.isNotEmpty(filter.getSkillZoneCodes())) { + query.addTopiaIdIn( + SampleRow.PROPERTY_OBSERVATION_UNIT + "." + TerrestrialDivision.PROPERTY_SKILL_ZONE_CODE, + filter.getSkillZoneCodes()); + } + + if (CollectionUtils.isNotEmpty(filter.getSkillZoneCodes())) { + query.addTopiaIdIn( + SampleRow.PROPERTY_OBSERVATION_UNIT + "." + TerrestrialDivision.PROPERTY_SKILL_ZONE_CODE, + filter.getSkillZoneCodes()); + } + + if (CollectionUtils.isNotEmpty(filter.getRegionIfremerIds())) { + Preconditions.checkNotNull(filter.getExpectedObservationType(), "expected observation type needed"); + if (filter.getExpectedObservationType().isFieldWorkObservation()) { + query.addTopiaIdIn( + SampleRow.PROPERTY_OBSERVATION_UNIT + "." + TerrestrialDivision.PROPERTY_REGION_IFREMER, + filter.getRegionIfremerIds()); + } else { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.terrestrialLocations as regionIfremer where regionIfremer.topiaId in (:regionIfremerIds))", + ImmutableMap.of("regionIfremerIds", (Object) filter.getRegionIfremerIds())); + } + } + + if (CollectionUtils.isNotEmpty(filter.getObserverIds())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.observers as observer where observer.topiaId in (:observerIds))", + ImmutableMap.<String, Object>of("observerIds", filter.getObserverIds())); + } + + if (CollectionUtils.isNotEmpty(filter.getTerrestrialDistrictIds())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.terrestrialLocations as terrestrialDistrict where terrestrialDistrict.topiaId in (:terrestrialDistrictIds))", + ImmutableMap.of("terrestrialDistrictIds", (Object) filter.getTerrestrialDistrictIds())); + } + + if (CollectionUtils.isNotEmpty(filter.getFishingZoneFacadeNames())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.fishingZone as fz where fz.facadeName in (:fishingZoneFacadeNames))", + ImmutableMap.of("fishingZoneFacadeNames", (Object) filter.getFishingZoneFacadeNames())); + } + + if (CollectionUtils.isNotEmpty(filter.getFishingZoneSectorNames())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.fishingZone as fz where fz.sectorName in (:fishingZoneSectorNames))", + ImmutableMap.of("fishingZoneSectorNames", (Object) filter.getFishingZoneSectorNames())); + } + + if (CollectionUtils.isNotEmpty(filter.getFishingGearDcfIds())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.dCF5Code as dcf where dcf.fishingGearDCF.topiaId in (:fishingGearDcfIds))", + ImmutableMap.of("fishingGearDcfIds", (Object) filter.getFishingGearDcfIds())); + } + + if (CollectionUtils.isNotEmpty(filter.getTargetSpeciesDcfIds())) { + query.addWhereClause( + "sr.topiaId in (select sr2.topiaId from fr.ifremer.wao.entity.SampleRowImpl as sr2 join sr2.dCF5Code as dcf where dcf.targetSpeciesDCF.topiaId in (:targetSpeciesDcfIds))", + ImmutableMap.of("targetSpeciesDcfIds", (Object) filter.getTargetSpeciesDcfIds())); + } + + if (log.isTraceEnabled()) { + log.trace("query to filter sample rows " + query.getHql() + " " + query.getHqlParameters()); + } + + return query; + + } + } Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/ObsMerFixtures.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/ObsMerFixtures.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/ObsMerFixtures.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,115 @@ +package fr.ifremer.wao.services; + +import fr.ifremer.wao.WaoTechnicalException; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.CompanyTopiaDao; +import fr.ifremer.wao.entity.FishingGearDCF; +import fr.ifremer.wao.entity.FishingGearDCFTopiaDao; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.TargetSpeciesDCF; +import fr.ifremer.wao.entity.TargetSpeciesDCFTopiaDao; +import fr.ifremer.wao.entity.UserProfile; +import fr.ifremer.wao.entity.UserProfileImpl; +import fr.ifremer.wao.entity.UserProfileTopiaDao; +import fr.ifremer.wao.entity.UserRole; +import fr.ifremer.wao.entity.WaoUser; +import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.entity.WaoUserTopiaDao; +import fr.ifremer.wao.services.service.ImportErrorException; +import fr.ifremer.wao.services.service.ObsMerSamplingPlanService; +import fr.ifremer.wao.services.service.administration.ReferentialService; +import org.apache.commons.io.IOUtils; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +public class ObsMerFixtures { + + protected WaoServiceContext serviceContext; + + protected Map<String, Company> companies = new HashMap<>(); + + public ObsMerFixtures(WaoServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + protected Company getCompany(String companyName) { + Company company = companies.get(companyName); + if (company == null) { + CompanyTopiaDao companyDao = serviceContext.getPersistenceContext().getCompanyDao(); + company = companyDao.create( + Company.PROPERTY_NAME, companyName, + Company.PROPERTY_ACTIVE, true); + companies.put(companyName, company); + serviceContext.getPersistenceContext().commit(); + } + return company; + } + + public Company ifremer() { + return getCompany("Ifremer"); + } + + public Company oceanet() { + return getCompany("OCEANET"); + } + + public AuthenticatedWaoUser admin() { + WaoUserTopiaDao waoUserDao = serviceContext.getPersistenceContext().getWaoUserDao(); + WaoUser admin = new WaoUserImpl(); + admin.setCompany(ifremer()); + admin.setLogin("admin"); + admin.setActive(true); + UserProfileTopiaDao userProfileDao = serviceContext.getPersistenceContext().getUserProfileDao(); + UserProfile userProfile = new UserProfileImpl(); + userProfile.setUserRole(UserRole.ADMIN); + userProfile.setObsProgram(ObsProgram.OBSMER); + userProfile.setCanWrite(true); + userProfileDao.create(userProfile); + admin.addUserProfile(userProfile); + waoUserDao.create(admin); + AuthenticatedWaoUser authenticatedWaoUser = new AuthenticatedWaoUser(admin, userProfile); + return authenticatedWaoUser; + } + + public void fishingZones() { + InputStream input = null; + try { + input = getClass().getResourceAsStream("/import/zonesPeche.csv"); + serviceContext.newService(ReferentialService.class).importFishingZones(input); + } catch (ImportErrorException e) { + throw new WaoTechnicalException(e); + } finally { + IOUtils.closeQuietly(input); + } + } + + public void samplingPlan() { + ifremer(); + oceanet(); + fishingZones(); + InputStream input = null; + try { + input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + serviceContext.newService(ObsMerSamplingPlanService.class).importSamplingPlan(admin(), input); + } catch (ImportErrorException e) { + throw new WaoTechnicalException(e); + } finally { + IOUtils.closeQuietly(input); + } + } + + public FishingGearDCF ptb() { + FishingGearDCFTopiaDao fishingGearDCFDao = serviceContext.getPersistenceContext().getFishingGearDCFDao(); + FishingGearDCF ptb = fishingGearDCFDao.forCodeEquals("PTB").findUnique(); + return ptb; + } + + public TargetSpeciesDCF def() { + TargetSpeciesDCFTopiaDao fishingGearDCFDao = serviceContext.getPersistenceContext().getTargetSpeciesDCFDao(); + TargetSpeciesDCF def = fishingGearDCFDao.forCodeEquals("DEF").findUnique(); + return def; + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlan.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlan.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlan.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,5 @@ +package fr.ifremer.wao.services.service; + +public class ObsMerSamplingPlan { + +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanService.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -4,14 +4,19 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import fr.ifremer.wao.SampleRowsFilter; import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.Boats; import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.entity.CompanyTopiaDao; import fr.ifremer.wao.entity.DCF5Code; import fr.ifremer.wao.entity.ElligibleBoat; import fr.ifremer.wao.entity.ElligibleBoatImpl; import fr.ifremer.wao.entity.ElligibleBoatTopiaDao; import fr.ifremer.wao.entity.FishingZone; +import fr.ifremer.wao.entity.FishingZoneTopiaDao; +import fr.ifremer.wao.entity.LocationType; import fr.ifremer.wao.entity.ObsProgram; import fr.ifremer.wao.entity.ProfessionImpl; import fr.ifremer.wao.entity.SampleMonth; @@ -23,13 +28,26 @@ import fr.ifremer.wao.entity.SampleRowLogImpl; import fr.ifremer.wao.entity.SampleRowTopiaDao; import fr.ifremer.wao.entity.SamplingStrategy; +import fr.ifremer.wao.entity.TerrestrialLocation; +import fr.ifremer.wao.entity.TerrestrialLocationTopiaDao; import fr.ifremer.wao.services.AuthenticatedWaoUser; +import fr.ifremer.wao.services.service.administration.ReferentialService; +import fr.ifremer.wao.services.service.administration.UnknownBoatImmatriculationsException; +import fr.ifremer.wao.services.service.administration.UnknownFishingGearDcfCodeException; +import fr.ifremer.wao.services.service.administration.UnknownTargetSpeciesDcfCodeException; +import fr.ifremer.wao.services.service.csv.ObsMerObsVenteSamplingPlanImportExportModel; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportModel; +import org.nuiton.csv.ImportRuntimeException; import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.util.DateUtil; +import java.io.InputStream; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; @@ -166,7 +184,8 @@ } - public void preValidate(AuthenticatedWaoUser authenticatedWaoUser, UpdateSampleRowCommand updateSampleRowCommand) { + public void preValidate(AuthenticatedWaoUser authenticatedWaoUser, UpdateSampleRowCommand updateSampleRowCommand) + throws UnknownBoatImmatriculationsException, UnknownFishingGearDcfCodeException, UnknownTargetSpeciesDcfCodeException { String elligibleBoatImmatriculations = updateSampleRowCommand.getElligibleBoatImmatriculations(); @@ -303,4 +322,156 @@ } + public List<SampleRow> getSamplingPlan(SampleRowsFilter sampleRowsFilter) { + + SampleRowTopiaDao dao = getSampleRowDao(); + + return dao.findAll(sampleRowsFilter); + + } + + public SampleRowsFilter newSampleRowsFilter(AuthenticatedWaoUser authenticatedWaoUser) { + + SampleRowsFilter newFilter = new SampleRowsFilter(); + + // all users can see only rows for the program they are logged for + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); + newFilter.setObsProgram(obsProgram); + + // We don't want to see all rows but the ones important for today + Date fromDate = serviceContext.getNow(); + Date toDate = fromDate; + + if (obsProgram.isObsDeb()) { + + if (authenticatedWaoUser.isObserver()) { + + // observer only need to see what he has to do in the next weeks + fromDate = DateUtils.addMonths(fromDate, -1); // needed for phone sampling plan + toDate = DateUtils.addMonths(toDate, 1); + + } else { + + // in the firsts months of a new year go from now to 6 months before + // in the rest of the year, just start at the beginning of the current year + if (DateUtil.getMonth(fromDate) < 3) { + fromDate = DateUtils.addMonths(fromDate, -6); + toDate = DateUtils.addMonths(toDate, 6); + } else { + fromDate = DateUtil.setFirstDayOfYear(fromDate); + toDate = DateUtil.setLastDayOfYear(toDate); + } + } + + fromDate = DateUtil.setMinTimeOfDay(fromDate); + toDate = DateUtil.setMaxTimeOfDay(toDate); + + } else { + + // Dans ObsMer et ObsVente, le plan est mensualisé + fromDate = DateUtils.truncate(fromDate, Calendar.MONTH); + + // la période initiale doit toujours aller d'avril à mars (contractuel). + // on prend la période dans laquelle on se trouve actuellement + + // si on est avant le premier avril de l'année courante + boolean beforePeriodChangeInCurrentYear = DateUtil.getMonth(fromDate) < 3; + + if (beforePeriodChangeInCurrentYear) { + // on prend la période qui a commencé l'année dernière et qui finit + // cette année + fromDate = DateUtils.setMonths(fromDate, 3); + fromDate = DateUtils.addYears(fromDate, -1); + } else { + // on prend la période qui commence cette année et se termine + // l'année prochaine + fromDate = DateUtils.setMonths(fromDate, 3); + } + + // on a fromDate sur le premier avril de la bonne année, on va + // jusqu'au mois de mars suivant + toDate = DateUtils.addMonths(fromDate, 11); + } + + newFilter.setPeriodFrom(fromDate); + newFilter.setPeriodTo(toDate); + + // Very very important to do that at beginning + // Evo #2227 : Guest user has no default company filter + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + newFilter.setCompanyIds(Sets.newHashSet(authenticatedWaoUser.getCompany().getTopiaId())); + } + + if (obsProgram.isObsDeb() && authenticatedWaoUser.isObserver()) { + // observer can only see the row he has been associated + newFilter.setObserverIds(Sets.newHashSet(authenticatedWaoUser.getWaoUser().getTopiaId())); + } + + return newFilter; + + } + + public void importSamplingPlan(AuthenticatedWaoUser authenticatedWaoUser, InputStream csv) throws ImportErrorException { + + ImportModel<SampleRow> samplingPlanImportModel = + newSamplingPlanImportModel(authenticatedWaoUser); + + Import<SampleRow> samplingPlanImport = + Import.newImport(samplingPlanImportModel, csv); + + SampleRowTopiaDao dao = getSampleRowDao(); + + try { + + for (SampleRow sampleRow : samplingPlanImport) { + + if (StringUtils.isBlank(sampleRow.getCode())) { + + String newSampleRowCode = getNewSampleRowCode(ObsProgram.OBSMER); + + sampleRow.setCode(newSampleRowCode); + + } else { + + // TODO brendan 18/03/14 + + } + + getProfessionDao().create(sampleRow.getProfession()); + + dao.create(sampleRow); + + } + + } catch (ImportRuntimeException e) { + throw new ImportErrorException(e); + } + + commit(); + + } + + protected ImportModel<SampleRow> newSamplingPlanImportModel(AuthenticatedWaoUser authenticatedWaoUser) { + + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); + + CompanyTopiaDao companyDao = getCompanyDao(); + List<Company> activeCompanies = companyDao.forActiveEquals(true).findAll(); + + TerrestrialLocationTopiaDao terrestrialLocationDao = getTerrestrialLocationDao(); + List<TerrestrialLocation> terrestrialDistricts = + terrestrialLocationDao.forLocationTypeEquals(LocationType.DISTRICT).findAll(); + + FishingZoneTopiaDao fishingZoneDao = getFishingZoneDao(); + List<FishingZone> fishingZones = fishingZoneDao.findAll(); + + ReferentialService referentialService = getReferentialService(); + + ImportModel<SampleRow> samplingPlanImportModel = + new ObsMerObsVenteSamplingPlanImportExportModel(obsProgram, + activeCompanies, fishingZones, terrestrialDistricts, referentialService); + + return samplingPlanImportModel; + + } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/ReferentialService.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -88,6 +88,7 @@ import org.nuiton.i18n.I18n; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaNoResultException; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -996,7 +997,7 @@ } - public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) { + public List<Boat> getBoatsFromImmatriculations(String joinedImmatriculations) throws UnknownBoatImmatriculationsException { Iterable<String> splitImmatriculations = BOAT_IMMATRICULATIONS_SPLITTER.split(joinedImmatriculations); @@ -1009,6 +1010,17 @@ List<Boat> boats = getBoatDao().forImmatriculationIn(immatriculations).findAll(); + if (boats.size() < immatriculations.size()) { + for (Boat boat : boats) { + immatriculations.remove(boat.getImmatriculation()); + } + Set<String> immatriculationStrings = new HashSet<>(); + for (Integer immatriculation : immatriculations) { + immatriculationStrings.add(String.valueOf(immatriculation)); + } + throw new UnknownBoatImmatriculationsException(immatriculationStrings); + } + return boats; } @@ -1018,7 +1030,7 @@ * les instances de {@link fr.ifremer.wao.entity.DCF5Code} correspondantes en ajoutant * les manquantes au référentiel au besoin. */ - public Collection<DCF5Code> getDcf5Codes(String joinedDcf5Codes) { + public Collection<DCF5Code> getDcf5Codes(String joinedDcf5Codes) throws UnknownFishingGearDcfCodeException, UnknownTargetSpeciesDcfCodeException { Collection<DCF5Code> dcf5Codes = new HashSet<>(); @@ -1026,16 +1038,26 @@ if (StringUtils.isNotBlank(joinedDcf5Codes)) { - Iterable<String> splitCodes = Splitter.onPattern("\\s+").split(joinedDcf5Codes); + Iterable<String> splitCodes = Splitter.onPattern("[,\\s]+").split(joinedDcf5Codes); for (String code : splitCodes) { String[] codeParts = code.split("_"); - FishingGearDCF fishingGearDCF = getFishingGearDCFDao().forCodeEquals(codeParts[0]).findUnique(); + FishingGearDCF fishingGearDCF; + try { + fishingGearDCF = getFishingGearDCFDao().forCodeEquals(codeParts[0]).findUnique(); + } catch (TopiaNoResultException e) { + throw new UnknownFishingGearDcfCodeException(codeParts[0]); + } + TargetSpeciesDCF targetSpeciesDCF = null; if (codeParts.length == 2) { - targetSpeciesDCF = getTargetSpeciesDCFDao().forCodeEquals(codeParts[1]).findUnique(); + try { + targetSpeciesDCF = getTargetSpeciesDCFDao().forCodeEquals(codeParts[1]).findUnique(); + } catch (TopiaNoResultException e) { + throw new UnknownTargetSpeciesDcfCodeException(codeParts[1]); + } } Map<String, Object> properties = new HashMap<>(); Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownBoatImmatriculationsException.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownBoatImmatriculationsException.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownBoatImmatriculationsException.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,19 @@ +package fr.ifremer.wao.services.service.administration; + +import fr.ifremer.wao.WaoException; + +import java.util.Set; + +public class UnknownBoatImmatriculationsException extends WaoException { + + protected Set<String> immatriculations; + + public UnknownBoatImmatriculationsException(Set<String> immatriculations) { + this.immatriculations = immatriculations; + } + + public Set<String> getImmatriculations() { + return immatriculations; + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownFishingGearDcfCodeException.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownFishingGearDcfCodeException.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownFishingGearDcfCodeException.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,17 @@ +package fr.ifremer.wao.services.service.administration; + +import fr.ifremer.wao.WaoException; + +public class UnknownFishingGearDcfCodeException extends WaoException { + + protected String code; + + public UnknownFishingGearDcfCodeException(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownTargetSpeciesDcfCodeException.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownTargetSpeciesDcfCodeException.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/UnknownTargetSpeciesDcfCodeException.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,17 @@ +package fr.ifremer.wao.services.service.administration; + +import fr.ifremer.wao.WaoException; + +public class UnknownTargetSpeciesDcfCodeException extends WaoException { + + protected String code; + + public UnknownTargetSpeciesDcfCodeException(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + +} Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/administration/WaoUsersService.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -105,7 +105,7 @@ } - public void save(UpdateWaoUserCommand updateWaoUserCommand) { + public void preValidate(UpdateWaoUserCommand updateWaoUserCommand) throws UnknownBoatImmatriculationsException { ObsProgram obsProgram = updateWaoUserCommand.getObsProgram(); WaoUser waoUser = updateWaoUserCommand.getWaoUser(); @@ -116,6 +116,12 @@ waoUser.setCanReadBoats(boatsFromImmatriculations); } + } + + public void save(UpdateWaoUserCommand updateWaoUserCommand) { + + WaoUser waoUser = updateWaoUserCommand.getWaoUser(); + String newPassword; switch (updateWaoUserCommand.getPasswordStrategy()) { case GENERATE_NEW_PASSWORD: Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/ObsMerObsVenteSamplingPlanImportExportModel.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/ObsMerObsVenteSamplingPlanImportExportModel.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/ObsMerObsVenteSamplingPlanImportExportModel.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -37,6 +37,7 @@ import fr.ifremer.wao.entity.SampleRowImpl; import fr.ifremer.wao.entity.SamplingStrategy; import fr.ifremer.wao.entity.TerrestrialLocation; +import fr.ifremer.wao.services.service.administration.ReferentialService; import fr.ifremer.wao.services.service.csv.operations.CompanyParserFormatter; import fr.ifremer.wao.services.service.csv.operations.DCF5CodesParserFormatter; import fr.ifremer.wao.services.service.csv.operations.DistrictNamesFormatter; @@ -116,6 +117,8 @@ protected List<TerrestrialLocation> terrestrialDistricts; + protected ReferentialService referentialService; + protected ModelBuilder<SampleRow> modelBuilder; protected PeriodDates periodDates; @@ -129,11 +132,13 @@ /** Pour l'import */ public ObsMerObsVenteSamplingPlanImportExportModel(ObsProgram obsProgram, List<Company> companies, List<FishingZone> fishingZones, - List<TerrestrialLocation> terrestrialDistricts) { + List<TerrestrialLocation> terrestrialDistricts, + ReferentialService referentialService) { this.obsProgram = obsProgram; this.companies = companies; this.fishingZones = fishingZones; this.terrestrialDistricts = terrestrialDistricts; + this.referentialService = referentialService; } @Override @@ -180,7 +185,7 @@ protected void buildModel() { - modelBuilder = new ModelBuilder<SampleRow>(); + modelBuilder = new ModelBuilder<>(); modelBuilder.newColumnForImportExport("PLAN_CODE", SampleRow.PROPERTY_CODE, new SampleRowCodeParserFormatter(obsProgram)); modelBuilder.newColumnForImportExport("SOCIETE_NOM", SampleRow.PROPERTY_COMPANY, new CompanyParserFormatter(companies)); @@ -193,7 +198,7 @@ modelBuilder.newColumnForImportExport("PECHE_DIVISION", SampleRow.PROPERTY_FISHING_ZONE, new FishingZonesParserFormatter(fishingZones)); modelBuilder.newColumnForImportExport("PECHE_AUTRE", SampleRow.PROPERTY_FISHING_ZONES_INFOS); - modelBuilder.newColumnForImportExport("METIER_CODE_DCF5", SampleRow.PROPERTY_D_CF5_CODE, new DCF5CodesParserFormatter()); + modelBuilder.newColumnForImportExport("METIER_CODE_DCF5", SampleRow.PROPERTY_D_CF5_CODE, new DCF5CodesParserFormatter(referentialService)); modelBuilder.newColumnForImportExport("METIER_MAILLAGE", SampleRow.PROPERTY_PROFESSION + "." + Profession.PROPERTY_MESH_SIZE); modelBuilder.newColumnForImportExport("METIER_TAILLE", SampleRow.PROPERTY_PROFESSION + "." + Profession.PROPERTY_SIZE); modelBuilder.newColumnForImportExport("METIER_AUTRE", SampleRow.PROPERTY_PROFESSION + "." + Profession.PROPERTY_OTHER); @@ -217,7 +222,7 @@ } if (obsProgram == ObsProgram.OBSVENTE) { - modelBuilder.newColumnForImportExport("PLAN_STRATEGIE", "samplingStrategy", new Common.ToStringParserFormatter<SamplingStrategy>(SamplingStrategy.values())); + modelBuilder.newColumnForImportExport("PLAN_STRATEGIE", "samplingStrategy", new Common.ToStringParserFormatter<>(SamplingStrategy.values())); modelBuilder.newColumnForImportExport("PLAN_LIEU_CODE", SampleRow.PROPERTY_TERRESTRIAL_LOCATIONS, new DistrictsParserFormatter(terrestrialDistricts)); modelBuilder.newColumnForExport("PLAN_LIEU_NOM", SampleRow.PROPERTY_TERRESTRIAL_LOCATIONS, new DistrictNamesFormatter()); modelBuilder.newIgnoredColumn("PLAN_LIEU_NOM"); Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/operations/DCF5CodesParserFormatter.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/operations/DCF5CodesParserFormatter.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/csv/operations/DCF5CodesParserFormatter.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -24,43 +24,44 @@ package fr.ifremer.wao.services.service.csv.operations; import fr.ifremer.wao.entity.DCF5Code; -import fr.ifremer.wao.entity.DCF5CodeImpl; -import fr.ifremer.wao.entity.FishingGearDCFImpl; -import fr.ifremer.wao.entity.TargetSpeciesDCFImpl; -import org.apache.commons.lang3.StringUtils; +import fr.ifremer.wao.services.service.administration.ReferentialService; +import fr.ifremer.wao.services.service.administration.UnknownFishingGearDcfCodeException; +import fr.ifremer.wao.services.service.administration.UnknownTargetSpeciesDcfCodeException; +import org.nuiton.csv.ImportRuntimeException; import org.nuiton.csv.ValueParserFormatter; import org.nuiton.util.StringUtil; -import java.text.ParseException; -import java.util.LinkedList; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class DCF5CodesParserFormatter implements ValueParserFormatter<List<DCF5Code>> { protected static final String DCF5_CODES_SEPARATOR = ","; + protected ReferentialService referentialService; + + public DCF5CodesParserFormatter() {} + + public DCF5CodesParserFormatter(ReferentialService referentialService) { + this.referentialService = referentialService; + } + @Override public String format(List<DCF5Code> dcf5Codes) { return StringUtil.join(dcf5Codes, DCF5_CODES_SEPARATOR, true); } @Override - public List<DCF5Code> parse(String codes) throws ParseException { - List<DCF5Code> dcfFives = new LinkedList<DCF5Code>(); - if (StringUtils.isNotBlank(codes)) { - String[] splitCodes = codes.split(DCF5_CODES_SEPARATOR); - for (String code : splitCodes) { - String[] codeParts = code.split("_"); - DCF5Code dcfFive = new DCF5CodeImpl(); - - dcfFive.setFishingGearDCF(new FishingGearDCFImpl(codeParts[0])); - if (codeParts.length == 2) { - dcfFive.setTargetSpeciesDCF(new TargetSpeciesDCFImpl(codeParts[1])); - } - - dcfFives.add(dcfFive); - } + public List<DCF5Code> parse(String codes) { + try { + Collection<DCF5Code> dcf5Codes = referentialService.getDcf5Codes(codes); + List<DCF5Code> value = new ArrayList<>(dcf5Codes); + return value; + } catch (UnknownFishingGearDcfCodeException unknownFishingGearDcfCode) { + throw new ImportRuntimeException(unknownFishingGearDcfCode); + } catch (UnknownTargetSpeciesDcfCodeException unknownTargetSpeciesDcfCode) { + throw new ImportRuntimeException(unknownTargetSpeciesDcfCode); } - return dcfFives; } } Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/AbstractWaoServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/AbstractWaoServiceTest.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/AbstractWaoServiceTest.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -10,6 +10,7 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.cfg.Environment; import org.junit.After; +import org.nuiton.util.DateUtil; import org.nuiton.util.FileUtil; import java.io.File; @@ -78,7 +79,7 @@ return false; } - protected WaoTopiaApplicationContext getApplicationContext () { + protected WaoTopiaApplicationContext getApplicationContext() { String databaseName = UUID.randomUUID().toString(); @@ -106,6 +107,8 @@ FakeWaoServiceContext serviceContext = new FakeWaoServiceContext(); + serviceContext.setDate(DateUtil.createDate(1, 11, 2009)); + serviceContext.setApplicationConfig(getApplicationConfig()); serviceContext.setPersistenceContext(persistenceContext); @@ -220,30 +223,32 @@ } - protected FakeWaoServiceContext getServiceContext() { + protected FakeWaoServiceContext newServiceContext() { - if (serviceContext == null) { + FakeWaoServiceContext serviceContext = new FakeWaoServiceContext(); - FakeWaoServiceContext serviceContext = new FakeWaoServiceContext(); + serviceContext.setApplicationConfig(getApplicationConfig()); - serviceContext.setApplicationConfig(getApplicationConfig()); + WaoTopiaPersistenceContext persistenceContext = newPersistenceContext(); - WaoTopiaPersistenceContext persistenceContext = newPersistenceContext(); + serviceContext.setPersistenceContext(persistenceContext); - serviceContext.setPersistenceContext(persistenceContext); + serviceContext.setDate(DateUtil.createDate(2, 11, 2009)); - this.serviceContext = serviceContext; - - } - return serviceContext; } protected <E extends WaoService> E newService(Class<E> serviceClass) { - return getServiceContext().newService(serviceClass); + if (serviceContext == null) { + serviceContext = newServiceContext(); + + } + + return serviceContext.newService(serviceClass); + } } Added: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanServiceTest.java (rev 0) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerSamplingPlanServiceTest.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -0,0 +1,85 @@ +package fr.ifremer.wao.services.service; + +import com.google.common.collect.ImmutableSet; +import fr.ifremer.wao.SampleRowsFilter; +import fr.ifremer.wao.entity.SampleRow; +import fr.ifremer.wao.services.AbstractWaoServiceTest; +import fr.ifremer.wao.services.ObsMerFixtures; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.util.DateUtil; + +import java.io.InputStream; +import java.util.List; + +public class ObsMerSamplingPlanServiceTest extends AbstractWaoServiceTest { + + private static final Log log = LogFactory.getLog(ObsMerSamplingPlanServiceTest.class); + + protected ObsMerSamplingPlanService service; + + protected ObsMerFixtures fixtures; + + protected boolean isDatabaseWithReferential() { + return true; + } + + @Before + public void setUp() { + service = newService(ObsMerSamplingPlanService.class); + fixtures = new ObsMerFixtures(newServiceContext()); + } + + @Test + public void testImportSamplingPlan() { + fixtures.ifremer(); + fixtures.oceanet(); + fixtures.fishingZones(); + InputStream input = null; + try { + input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + service.importSamplingPlan(fixtures.admin(), input); + } catch (ImportErrorException e) { + if (log.isDebugEnabled()) { + log.debug("unexpected exception raised", e); + } + Assert.fail("exception should not be raised"); + } finally { + IOUtils.closeQuietly(input); + } + } + + @Test + public void testGetSamplingPlan() { + + fixtures.samplingPlan(); + + serviceContext.setDate(DateUtil.createDate(15, 5, 2010)); + + SampleRowsFilter filter = service.newSampleRowsFilter(fixtures.admin()); + List<SampleRow> samplingPlan = service.getSamplingPlan(filter); + Assert.assertEquals(12, samplingPlan.size()); + + filter = service.newSampleRowsFilter(fixtures.admin()); + filter.setFishingGearDcfIds(ImmutableSet.of(fixtures.ptb().getTopiaId())); + samplingPlan = service.getSamplingPlan(filter); + Assert.assertEquals(3, samplingPlan.size()); + + filter = service.newSampleRowsFilter(fixtures.admin()); + filter.setTargetSpeciesDcfIds(ImmutableSet.of(fixtures.def().getTopiaId())); + samplingPlan = service.getSamplingPlan(filter); + Assert.assertEquals(4, samplingPlan.size()); + + filter = service.newSampleRowsFilter(fixtures.admin()); + filter.setFishingGearDcfIds(ImmutableSet.of(fixtures.ptb().getTopiaId())); + filter.setTargetSpeciesDcfIds(ImmutableSet.of(fixtures.def().getTopiaId())); + samplingPlan = service.getSamplingPlan(filter); + Assert.assertEquals(1, samplingPlan.size()); + + } + +} Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/administration/ReferentialServiceTest.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -13,7 +13,6 @@ import java.io.InputStream; import java.util.Collection; -import java.util.Date; public class ReferentialServiceTest extends AbstractWaoServiceTest { @@ -23,7 +22,6 @@ @Before public void setUp() { - getServiceContext().setDate(new Date(1393607049651l)); service = newService(ReferentialService.class); } @@ -147,10 +145,17 @@ @Test public void testGetBoatsByImmatriculations() { testImportBoats(); - Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419"); - Assert.assertEquals(3, boats.size()); - boats = service.getBoatsFromImmatriculations(" "); - Assert.assertTrue(boats.isEmpty()); + try { + Collection<Boat> boats = service.getBoatsFromImmatriculations("174258, 284595 978419"); + Assert.assertEquals(3, boats.size()); + boats = service.getBoatsFromImmatriculations(" "); + Assert.assertTrue(boats.isEmpty()); + } catch (UnknownBoatImmatriculationsException e) { + if (log.isDebugEnabled()) { + log.debug("unexpected exception raised", e); + } + Assert.fail("exception should not be raised"); + } } @Test @@ -158,12 +163,28 @@ service.initialDCF5CodesImport(); - Collection<DCF5Code> dcf5Codes = service.getDcf5Codes("OTT_DWS OTB_DEF OTB OTT_DEF"); + try { + Collection<DCF5Code> dcf5Codes = service.getDcf5Codes("OTT_DWS OTB_DEF OTB OTT_DEF"); - Assert.assertEquals(4, dcf5Codes.size()); + Assert.assertEquals(4, dcf5Codes.size()); - for (DCF5Code dcf5Code : dcf5Codes) { - Assert.assertTrue(dcf5Code.isPersisted()); + for (DCF5Code dcf5Code : dcf5Codes) { + Assert.assertTrue(dcf5Code.isPersisted()); + } + + dcf5Codes = service.getDcf5Codes("OTT_DWS, OTB"); + + Assert.assertEquals(2, dcf5Codes.size()); + } catch (UnknownFishingGearDcfCodeException e) { + if (log.isDebugEnabled()) { + log.debug("unexpected exception raised", e); + } + Assert.fail("exception should not be raised"); + } catch (UnknownTargetSpeciesDcfCodeException e) { + if (log.isDebugEnabled()) { + log.debug("unexpected exception raised", e); + } + Assert.fail("exception should not be raised"); } } Modified: trunk/wao-services/src/test/resources/import/echantillonnage.csv =================================================================== --- trunk/wao-services/src/test/resources/import/echantillonnage.csv 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-services/src/test/resources/import/echantillonnage.csv 2014-03-18 16:39:19 UTC (rev 1725) @@ -1,14 +1,14 @@ "PLAN_CODE";"SOCIETE_NOM";"PECHE_DIVISION";"PECHE_AUTRE";"METIER_CODE_DCF5";"METIER_MAILLAGE";"METIER_TAILLE";"METIER_AUTRE";"METIER_LIBELLE";"METIER_ESPECES";"PROGRAMME_CODE";"PROGRAMME_DEBUT";"PROGRAMME_FIN";"12/2009";"01/2010";"02/2010";"03/2010";"04/2010";"05/2010";"06/2010";"07/2010";"08/2010";"09/2010";"10/2010";"11/2010";"12/2010";"01/2011";"02/2011";"03/2011";"PLAN_DUREE_MOY";"PLAN_NB_OBSERV";"PLAN_COMMENT";"TAUX_COUVERTURE_APPLIQUE" -"2010_M0001";"TARTANPION";"IId,I";;"DRB_ALG";;;;;;"MA-2009";"03/2010";"01/2011";;;;0;0;0;0;0;0;0;2;0;0;4;;;"1.5";1;"Un petit commentaire";5 -"2010_M0002";"TARTANPION";"IId";;"DRH_CAT,DRH_CRU";;;;"Fileyage";"poissons tubes";"MANY";"01/2008";"12/2008";;20;0;0;21;0;0;21;0;0;21;0;0;;;;1;1;;5 +"2010_M0001";"Ifremer";"IId,I";;"DRB_ALG";;;;;;"MA-2009";"03/2010";"01/2011";;;;0;0;0;0;0;0;0;2;0;0;4;;;"1.5";1;"Un petit commentaire";5 +"2010_M0002";"Ifremer";"IId";;"DRH_CAT,DRH_CRU";;;;"Fileyage";"poissons tubes";"MANY";"01/2008";"12/2008";;20;0;0;21;0;0;21;0;0;21;0;0;;;;1;1;;5 "2010_M0003";;"IId,IV";;"DRH";;;;"balottage en plein air";"divers choses visqueuses";"MA-2009";"03/2010";"01/2011";;;;0;22;0;0;25;0;0;21;0;0;25;;;2;1;;5 "2009_M0001";;"IId,IV";;"GTR_DEF,GNS_DEF";"110-119";;;"Fileyage à poissons tubes";"poissons plats";"PPP2010";"12/2009";"10/2010";0;1;1;1;2;1;1;1;1;1;2;;;;;;1;1;;5 "2009_M0002";;"IId";;"GTR_DEF,GNS_DEF";"9888-99";;;"Fileyage à sirènes ";"nymphes";"PPP2010";"12/2009";"10/2010";1;1;1;2;3;4;4;4;4;3;3;;;;;;1;1;;10 -"2009_M0003";"TARTANPION";"IV";;"GTR_MOL,GNS";;;;"Fileyages à baleines à bosse";"chameaux";"PPP2010";"12/2009";"10/2010";2;2;2;2;2;2;2;2;2;2;4;;;;;;1;1;;10 +"2009_M0003";"Ifremer";"IV";;"GTR_MOL,GNS";;;;"Fileyages à baleines à bosse";"chameaux";"PPP2010";"12/2009";"10/2010";2;2;2;2;2;2;2;2;2;2;4;;;;;;1;1;;10 "2009_M0004";;"IId";;"PTB_ALG";">=190";">18";;"Chalutage de fond machiavélique";"gadidés; divers";"PPP2010";"12/2009";"10/2010";1;1;1;1;1;1;1;1;1;1;2;;;;;;3;2;;10 "2009_M0005";;"IId";;"PTB_ALG";"70-1100";">1140";;"Plongeur de fond sous-marin";"gadidés; divers";"PPP2010";"12/2009";"10/2010";1;1;1;1;1;1;1;1;1;1;2;;;;;;3;2;;10 -"2009_M0006";"BIS";"I,IV";;"DRB_DEF";"70-1100";">1140";;"Leon";"poissons plats";"PPP2010";"12/2009";"10/2010";0;1;0;1;0;1;2;2;2;2;1;;;;;;3;2;; -"2010_M0004";"TARTANPION";"IId,IV";;"PTB_DEF,PTB_ALG,DRH";;;;"Chalutage de fond";"gadidés; poissons plats; divers";"BLOB";"01/2010";"12/2010";;3;0;0;3;0;0;3;0;0;3;0;0;;;;3;1;; +"2009_M0006";"OCEANET";"I,IV";;"DRB_DEF";"70-1100";">1140";;"Leon";"poissons plats";"PPP2010";"12/2009";"10/2010";0;1;0;1;0;1;2;2;2;2;1;;;;;;3;2;; +"2010_M0004";"Ifremer";"IId,IV";;"PTB_DEF,PTB_ALG,DRH";;;;"Chalutage de fond";"gadidés; poissons plats; divers";"BLOB";"01/2010";"12/2010";;3;0;0;3;0;0;3;0;0;3;0;0;;;;3;1;; "2010_M0005";;"IId";;"DRB";;;;"Kamoulox";"merlu; poissons cerises; divers";"MA-2009";"03/2010";"01/2011";;;;0;5;0;0;5;0;0;6;0;0;3;;;3;1;;15 "2010_M0010";;"I,IV";;"DRB";"70-1100";;;"Kamoulox";"merlu; poissons pommes; divers";"MA-2009";"03/2010";"01/2011";;;;0;5;0;0;5;0;0;6;0;0;3;;;3;1;;15 "2010_M0011";;"I,IV";;"DRB_ANA";"70-1100";;;"Troubidou";"merlu; poissons cerises";"MA-2009";"03/2010";"01/2011";;;;0;5;0;0;5;0;0;6;0;0;3;;;3;1;; Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/administration/EditWaoUserAction.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -1,9 +1,11 @@ package fr.ifremer.wao.web.action.administration; +import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.opensymphony.xwork2.Preparable; +import fr.ifremer.wao.services.service.administration.UnknownBoatImmatriculationsException; import fr.ifremer.wao.services.service.administration.UpdateWaoUserCommand; import fr.ifremer.wao.services.service.administration.UpdateWaoUserCommandPasswordStrategy; import fr.ifremer.wao.services.service.administration.WaoUsersService; @@ -52,6 +54,12 @@ @Override public void validate() { + try { + service.preValidate(updateWaoUserCommand); + } catch (UnknownBoatImmatriculationsException unknownBoatImmatriculations) { + addFieldError("updateWaoUserCommand.canReadBoats", t("wao.ui.unknownBoatImmatriculations", Joiner.on(", ").join(unknownBoatImmatriculations.getImmatriculations()))); + } + if (updateWaoUserCommand.getPasswordStrategy().isDefinePassword()) { if (StringUtils.isEmpty(updateWaoUserCommand.getClearPassword())) { addFieldError("updateWaoUserCommand.clearPassword", t("wao.ui.form.updateWaoUserCommand.missingPassword")); Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/EditSampleRowAction.java 2014-03-18 16:39:19 UTC (rev 1725) @@ -1,5 +1,6 @@ package fr.ifremer.wao.web.action.obsmer; +import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Strings; import com.opensymphony.xwork2.Preparable; @@ -7,6 +8,9 @@ import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.services.service.ObsMerSamplingPlanService; import fr.ifremer.wao.services.service.UpdateSampleRowCommand; +import fr.ifremer.wao.services.service.administration.UnknownBoatImmatriculationsException; +import fr.ifremer.wao.services.service.administration.UnknownFishingGearDcfCodeException; +import fr.ifremer.wao.services.service.administration.UnknownTargetSpeciesDcfCodeException; import fr.ifremer.wao.web.WaoJspActionSupport; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -52,10 +56,24 @@ @Override public void validate() { - service.preValidate(getAuthenticatedWaoUser(), updateSampleRowCommand); - SampleRow sampleRow = updateSampleRowCommand.getSampleRow(); + try { + + service.preValidate(getAuthenticatedWaoUser(), updateSampleRowCommand); + + if (CollectionUtils.isEmpty(sampleRow.getdCF5Code())) { + addFieldError("updateSampleRowCommand.dcf5Codes", t("wao.ui.form.SampleRow.error.missingDcf5Codes")); + } + + } catch (UnknownBoatImmatriculationsException e) { + addFieldError("updateSampleRowCommand.elligibleBoatImmatriculations", t("wao.ui.unknownBoatImmatriculations", Joiner.on(", ").join(e.getImmatriculations()))); + } catch (UnknownFishingGearDcfCodeException e) { + addFieldError("updateSampleRowCommand.dcf5Codes", t("wao.ui.form.SampleRow.error.unknownFishingGearDcfCode", e.getCode())); + } catch (UnknownTargetSpeciesDcfCodeException e) { + addFieldError("updateSampleRowCommand.dcf5Codes", t("wao.ui.form.SampleRow.error.unknownTargetSpeciesDcfCode", e.getCode())); + } + if (updateSampleRowCommand.isCreation()) { if ( ! WaoUtils.getSampleRowCodePattern(sampleRow.getObsProgram()).matcher(sampleRow.getCode()).matches()) { addFieldError("updateSampleRowCommand.code", t("wao.import.sampleRow.failure.wrongSampleRowCodeFormat", sampleRow.getCode())); @@ -78,10 +96,6 @@ addFieldError("updateSampleRowCommand.sampleRow.periodEnd", t("wao.ui.form.SampleRow.error.missingPeriodEnd")); } - if (CollectionUtils.isEmpty(sampleRow.getdCF5Code())) { - addFieldError("updateSampleRowCommand.dcf5Codes", t("wao.ui.form.SampleRow.error.missingDcf5Codes")); - } - if (CollectionUtils.isEmpty(sampleRow.getFishingZone())) { addFieldError("updateSampleRowCommand.fishingZones", t("wao.ui.form.SampleRow.error.missingFishingZones")); } Modified: trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-web/src/main/resources/i18n/wao-web_en_GB.properties 2014-03-18 16:39:19 UTC (rev 1725) @@ -211,6 +211,8 @@ wao.ui.form.SampleRow.error.missingPeriodEnd=You must define the month when the observations ends wao.ui.form.SampleRow.error.missingProfessionSpecies=You must define the target species wao.ui.form.SampleRow.error.missingProgramName=You must provide the program name +wao.ui.form.SampleRow.error.unknownFishingGearDcfCode=Unknown fishing gear code\: %s +wao.ui.form.SampleRow.error.unknownTargetSpeciesDcfCode=Unknown target species code\: %s wao.ui.form.SampleRow.missingBeginDate=Begin date missing to generate line code wao.ui.form.SampleRow.others=Others data of the sample row wao.ui.form.SampleRow.program=Associated program and observation effort by months @@ -413,6 +415,7 @@ wao.ui.unavailableOperation=Unavailable operation wao.ui.unit.days=day(s) wao.ui.unit.observers=observer(s) +wao.ui.unknownBoatImmatriculations=Unknown boats\: %s wao.ui.userList=Users list wao.ui.userMustAcceptCgu=You must accept the terms of use wao.ui.validLogin=Valid identifier Modified: trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties =================================================================== --- trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-17 09:58:05 UTC (rev 1724) +++ trunk/wao-web/src/main/resources/i18n/wao-web_fr_FR.properties 2014-03-18 16:39:19 UTC (rev 1725) @@ -211,6 +211,8 @@ wao.ui.form.SampleRow.error.missingPeriodEnd=Il faut préciser le mois auquel se termine la période d'observation wao.ui.form.SampleRow.error.missingProfessionSpecies=Il faut préciser les espèces cibles wao.ui.form.SampleRow.error.missingProgramName=Il faut préciser le nom du programme +wao.ui.form.SampleRow.error.unknownFishingGearDcfCode=Le code engin %s est inconnu du référentiel +wao.ui.form.SampleRow.error.unknownTargetSpeciesDcfCode=Le code espèce cible %s est inconnu du référentiel wao.ui.form.SampleRow.missingBeginDate=Date de début manquante pour générer le code de la ligne \! wao.ui.form.SampleRow.others=Autres données de la ligne d'échantillonnage wao.ui.form.SampleRow.program=Programme de rattachement et effort d'observation par mois @@ -413,6 +415,7 @@ wao.ui.unavailableOperation=Opération non-disponible wao.ui.unit.days=jour(s) wao.ui.unit.observers=observateur(s) +wao.ui.unknownBoatImmatriculations=Les navires ayant pour immatriculations %s sont inconnus du référentiel wao.ui.userList=Liste des utilisateurs wao.ui.userMustAcceptCgu=Vous devez accepter les conditions d'utilisation pour utiliser Wao wao.ui.validLogin=Identifiant valide
participants (1)
-
bleny@users.forge.codelutin.com