[Suiviobsmer-commits] r1264 - in trunk: wao-business/src/main/java/fr/ifremer/wao/io wao-business/src/main/java/fr/ifremer/wao/io/csv2 wao-business/src/main/java/fr/ifremer/wao/io/csv2/models wao-business/src/main/java/fr/ifremer/wao/service wao-business/src/main/resources/i18n wao-business/src/main/xmi wao-business/src/test/java/fr/ifremer/wao/service wao-business/src/test/resources/import wao-ui/src/main/java/fr/ifremer/wao/ui/pages
Author: bleny Date: 2011-05-09 10:33:08 +0000 (Mon, 09 May 2011) New Revision: 1264 Log: switch boat import-export to using new import-export engine Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportExportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/BoatImportExportModel.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/ImportResultsImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceBoatImplTest.java trunk/wao-business/src/test/resources/import/navires.csv trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/ImportResultsImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/ImportResultsImpl.java 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/ImportResultsImpl.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -44,6 +44,7 @@ @Override public List<String> getErrors() { + List<String> errors = super.getErrors(); if (errors == null) { errors = new ArrayList<String>(); } @@ -52,12 +53,22 @@ @Override public void incNbRefused() { - nbRowsRefused++; + int nbRowsRefused = getNbRowsRefused(); + nbRowsRefused += 1; + setNbRowsRefused(nbRowsRefused); } @Override public void incNbImported() { - nbRowsImported++; + int nbRowsImported = getNbRowsImported(); + nbRowsImported += 1; + setNbRowsImported(nbRowsImported); } + @Override + public void incNbImportedNew() { + int nbRowsImportedNew = getNbRowsImportedNew(); + nbRowsImportedNew += 1; + setNbRowsImportedNew(nbRowsImportedNew); + } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -211,4 +211,25 @@ } } + public static class IntegerParserFormatter implements ValueParserFormatter<Integer> { + @Override + public String format(Integer value) { + String str = ""; + if (value != null) { + str = String.valueOf(value); + } + return str; + } + + @Override + public Integer parse(String value) throws ParseException { + Integer integer = null; + if (StringUtils.isNotBlank(value)) { + integer = Integer.valueOf(value); + } + return integer; + } + } + + public static ValueParserFormatter<Integer> INTEGER = new IntegerParserFormatter(); } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportExportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportExportModel.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/ImportExportModel.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -0,0 +1,6 @@ +package fr.ifremer.wao.io.csv2; + +/** + * + */ +public interface ImportExportModel<E> extends ImportModel<E>, ExportModel<E> {} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/BoatImportExportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/BoatImportExportModel.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/BoatImportExportModel.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -0,0 +1,131 @@ +package fr.ifremer.wao.io.csv2.models; + +import fr.ifremer.wao.WaoUtils; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.BoatDistrictImpl; +import fr.ifremer.wao.entity.BoatImpl; +import fr.ifremer.wao.entity.ShipOwnerImpl; +import fr.ifremer.wao.io.csv2.Common; +import fr.ifremer.wao.io.csv2.ExportableColumn; +import fr.ifremer.wao.io.csv2.ImportExportModel; +import fr.ifremer.wao.io.csv2.ImportableColumn; +import fr.ifremer.wao.io.csv2.ModelBuilder; +import fr.ifremer.wao.io.csv2.ValueGetterSetter; +import fr.ifremer.wao.io.csv2.ValueParserFormatter; + +import java.text.ParseException; +import java.util.Collection; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * + * + */ +public class BoatImportExportModel implements ImportExportModel<Boat> { + + protected ModelBuilder<Boat> modelBuilder; + + public BoatImportExportModel() { + modelBuilder = new ModelBuilder<Boat>(); + modelBuilder.newColumnForImportExport("NAVIRE_IMMATRICULATION", Boat.PROPERTY_IMMATRICULATION, new ValueParserFormatter<Integer>() { + Pattern pattern = Pattern.compile("\\d{6}"); + + @Override + public String format(Integer immatriculation) { + return String.valueOf(immatriculation); + } + + @Override + public Integer parse(String imma) throws ParseException { + Matcher matcher = pattern.matcher(imma); + if ( ! matcher.find()) { + throw new IllegalArgumentException(WaoUtils._("wao.business.boat.validation.immatriculation.wrongFormat")); + } + Integer immatriculation = Integer.parseInt(imma); + return immatriculation; + } + }); + modelBuilder.newColumnForImportExport("NAVIRE_NOM", Boat.PROPERTY_NAME); + modelBuilder.newColumnForImportExport("NAVIRE_LONGUEUR", Boat.PROPERTY_BOAT_LENGTH, Common.INTEGER); + modelBuilder.newColumnForImportExport("NAVIRE_ANNEE", Boat.PROPERTY_BUILD_YEAR, Common.INTEGER); + modelBuilder.newColumnForImportExport("NAVIRE_ACTIF", Boat.PROPERTY_ACTIVE, Common.BOOLEAN); + + // ship owner + modelBuilder.newColumnForImportExport("ARMATEUR_CODE", new ValueGetterSetter<Boat, String>() { + @Override + public String get(Boat boat) throws Exception { + return boat.getShipOwner().getCode(); + } + + @Override + public void set(Boat boat, String code) throws Exception { + boat.getShipOwner().setCode(code); + } + }); + modelBuilder.newColumnForImportExport("ARMATEUR_NOM", new ValueGetterSetter<Boat, String>() { + @Override + public String get(Boat boat) throws Exception { + return boat.getShipOwner().getLastName(); + } + + @Override + public void set(Boat boat, String lastName) throws Exception { + boat.getShipOwner().setLastName(lastName); + } + }); + modelBuilder.newColumnForImportExport("ARMATEUR_PRENOM", new ValueGetterSetter<Boat, String>() { + @Override + public String get(Boat boat) throws Exception { + return boat.getShipOwner().getFirstName(); + } + + @Override + public void set(Boat boat, String firstName) throws Exception { + boat.getShipOwner().setFirstName(firstName); + } + }); + + // boat district + modelBuilder.newColumnForImportExport("QUARTIER_CODE", new ValueGetterSetter<Boat, String>() { + @Override + public String get(Boat boat) throws Exception { + return boat.getBoatDistrict().getCode(); + } + + @Override + public void set(Boat boat, String districtCode) throws Exception { + boat.getBoatDistrict().setCode(districtCode); + } + }); + } + + @Override + public char getSeparator() { + return ';'; + } + + @Override + public void pushCsvHeaderNames(List<String> headerNames) { + // nothing to do + } + + @Override + public Boat newEmptyInstance() { + Boat emptyInstance = new BoatImpl(); + emptyInstance.setShipOwner(new ShipOwnerImpl()); + emptyInstance.setBoatDistrict(new BoatDistrictImpl()); + return emptyInstance; + } + + @Override + public Collection<ImportableColumn> getColumnsForImport() { + return modelBuilder.getColumnsForImport(); + } + + @Override + public Collection<ExportableColumn> getColumnsForExport() { + return modelBuilder.getColumnsForExport(); + } +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceBoatImpl.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -62,10 +62,15 @@ import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.ShipOwner; import fr.ifremer.wao.entity.ShipOwnerDAO; +import fr.ifremer.wao.io.ImportResults; +import fr.ifremer.wao.io.ImportResultsImpl; import fr.ifremer.wao.io.csv.ExportHelper; import fr.ifremer.wao.io.csv.ImportHelper; import fr.ifremer.wao.io.csv.WaoCsvHeader; import fr.ifremer.wao.io.csv.WaoCsvHeader.BOAT; +import fr.ifremer.wao.io.csv2.Export; +import fr.ifremer.wao.io.csv2.Import; +import fr.ifremer.wao.io.csv2.models.BoatImportExportModel; import org.apache.commons.lang.StringUtils; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; @@ -83,6 +88,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -374,6 +380,7 @@ * QUARTIER_IMMA, PER_COD, PER_NOM,PER_PRENOM. * Existing boats (with same immatriculation) are updated. * + * * @param transaction current transaction * @param input Stream corresponding to Csv file * @return an array with two int : the first corresponding to total number @@ -384,224 +391,82 @@ * @see com.csvreader.CsvReader */ @Override - public int[] executeImportBoatCsv(TopiaContext transaction, - InputStream input) + public ImportResults executeImportBoatCsv(TopiaContext transaction, + InputStream input) throws TopiaException, IOException, WaoBusinessException { - int[] result = new int[]{0,0}; - CsvReader reader = new CsvReader(input, context.getCsvCharset()); - reader.readHeaders(); - - ImportHelper.checkKeyHeader(reader, BOAT.NAVS_COD); - - long tic; - + BoatImportExportModel model = new BoatImportExportModel(); + Import<Boat> boatImport = new Import<Boat>(model, input); BoatDAO boatDAO = WaoDAOHelper.getBoatDAO(transaction); ShipOwnerDAO shipOwnerDAO = WaoDAOHelper.getShipOwnerDAO(transaction); - BoatDistrictDAO districtDAO = WaoDAOHelper.getBoatDistrictDAO(transaction); + BoatDistrictDAO boatDistrictDAO = WaoDAOHelper.getBoatDistrictDAO(transaction); - Map<String, ShipOwner> availableShipOwners = new HashMap<String, ShipOwner>(); + ImportResults importResults = new ImportResultsImpl(); + Iterator<Boat> it = boatImport.startImport(); + while (it.hasNext()) { + Boat boat = it.next(); - Map<String, BoatDistrict> availableDistricts = new HashMap<String, BoatDistrict>(); - - tic = System.currentTimeMillis(); - Pattern pattern = Pattern.compile("\\d{6}"); - while(reader.readRecord()) { - result[0]++; - - if (logger.isTraceEnabled()) { - logger.trace(" " + Arrays.asList(reader.getValues())); + // first, find and reuse existing ship owner + ShipOwner shipOwner = shipOwnerDAO.findByCode(boat.getShipOwner().getCode()); + if (shipOwner == null) { + shipOwner = shipOwnerDAO.create(boat.getShipOwner()); } + boat.setShipOwner(shipOwner); - String imma = ImportHelper.read(reader, BOAT.NAVS_COD); - Matcher matcher = pattern.matcher(imma); - if (!matcher.find()) { - throw new WaoBusinessException(Type.SYNTAX, - ServiceBoat.class, - "L'immatriculation ne comporte pas 6 chiffres"); - } - - int immatriculation = Integer.parseInt(imma); - - String boatName = - ImportHelper.read(reader, BOAT.CARN_NOM); - int boatLength = - ImportHelper.readInt(reader, BOAT.CARN_LONGUEUR_HT); - int buildYear = - ImportHelper.readInt(reader, BOAT.CARN_ANNEE); - String districtCode = - ImportHelper.read(reader, BOAT.QUARTIER_IMMA); - String shipOwnerCode = - ImportHelper.read(reader, BOAT.PER_COD); - String shipOwnerLastName = - ImportHelper.read(reader, BOAT.PER_NOM); - String shipOwnerFirstName = - ImportHelper.read(reader, BOAT.PER_PRENOM); - - String activeStr = ImportHelper.read(reader, BOAT.NAVS_ACTIVE); - boolean active = !activeStr.equals(BOAT.getBoatInactiveCode()); - - if (logger.isTraceEnabled()) { - logger.trace("Active : " + active + " (" + activeStr + ")"); - } - - // Find existing boat with immatriculation - Boat boat = boatDAO.findByImmatriculation(immatriculation); - - if (boat == null) { - boat = boatDAO.create( - Boat.PROPERTY_IMMATRICULATION, immatriculation); - result[1]++; - } - boat.setName(boatName); - boat.setBuildYear(buildYear); - boat.setBoatLength(boatLength); - boat.setActive(active); - - BoatDistrict district = availableDistricts.get(districtCode); - - if (logger.isDebugEnabled()) { - logger.debug("District code : " + districtCode + - " _ district found : " + district); - } - + // secondly, find and reuse boat district + BoatDistrict district = boatDistrictDAO.findByCode(boat.getBoatDistrict().getCode()); if (district == null) { - district = districtDAO.findByCode(districtCode); - if (district == null) { - district = districtDAO.create(BoatDistrict.PROPERTY_CODE, districtCode); - } - availableDistricts.put(districtCode, district); + district = boatDistrictDAO.create(BoatDistrict.PROPERTY_CODE, boat.getBoatDistrict().getCode()); } - boat.setBoatDistrict(district); - // Find existing shipOwner with code - ShipOwner shipOwner = availableShipOwners.get(shipOwnerCode); - - // If not available, select it from database - if (shipOwner == null) { - shipOwner = shipOwnerDAO.findByCode(shipOwnerCode); - // If not exist yet, create it - if (shipOwner == null) { - shipOwner = shipOwnerDAO.create(ShipOwner.PROPERTY_CODE, shipOwnerCode); - } - availableShipOwners.put(shipOwnerCode, shipOwner); + // now boat object is ready + Boat existingBoat = boatDAO.findByImmatriculation(boat.getImmatriculation()); + if (existingBoat == null) { + existingBoat = boatDAO.create(boat); + importResults.incNbImportedNew(); + } else { + // copy new values in found entity and save changes + existingBoat.setName(boat.getName()); + existingBoat.setBoatLength(boat.getBoatLength()); + existingBoat.setBuildYear(boat.getBuildYear()); + existingBoat.setActive(boat.getActive()); + existingBoat.setShipOwner(boat.getShipOwner()); + existingBoat.setBoatDistrict(boat.getBoatDistrict()); + boatDAO.update(existingBoat); } - shipOwner.setFirstName(shipOwnerFirstName); - shipOwner.setLastName(shipOwnerLastName); - boat.setShipOwner(shipOwner); - - if (result[0] % 1000 == 0) { - availableShipOwners.clear(); - - transaction.commitTransaction(); - tic = ImportHelper.logTimeAndMemory( - logger, tic, "navires ligne " + result[0]); - } + importResults.incNbImported(); } - // For the last rows transaction.commitTransaction(); - - return result; + return importResults; } @Override public InputStream executeExportBoatCsv(TopiaContext transaction, BoatFilter filter) throws Exception { - InputStream result = null; - CsvWriter writer = null; - try { - File file = File.createTempFile("wao-boats-", ".csv"); - file.deleteOnExit(); - FileOutputStream output = new FileOutputStream(file); - writer = new CsvWriter(output, ',', context.getCsvCharset()); + // Get boats from database filtered by filter in argument + BoatDAO dao = WaoDAOHelper.getBoatDAO(transaction); - ExportHelper<BOAT> export = - new ExportHelper<BOAT>(writer, BOAT.getTotalHeaders()) { - @Override - public String getHeaderValue(int index) throws IOException { - return WaoCsvHeader.getHeaderForBoatCsv(index); - } + WaoQueryBuilder builder = context.newQueryBuilder(); + builder.initializeForBoat(); - @Override - public void record(BOAT header, String value) { - record(header.forBoatCsv(), value); - } - }; + TopiaQuery query = builder.applyBoatFilter(filter); - export.writeHeaders(); + // Reset limit : no pagination needed for results + query.resetLimit(); - // Get boats from database filterd by filter in argument - BoatDAO dao = WaoDAOHelper.getBoatDAO(transaction); - - WaoQueryBuilder builder = context.newQueryBuilder(); - builder.initializeForBoat(); - - TopiaQuery query = builder.applyBoatFilter(filter); - - // Reset limit : no pagination needed for results - query.resetLimit(); - - if (logger.isDebugEnabled()) { - logger.debug("Exec query : " + query); - } - List<Boat> boats = dao.findAllByQuery(query); - - for (Boat boat : boats) { - export.newRecord(); - - if (logger.isTraceEnabled()) { - logger.trace("add boat : " + boat.getName() + " (" + - boat.getImmatriculation() + ")"); - } - - export.record(BOAT.NAVS_COD, - String.valueOf(boat.getImmatriculation())); - export.record(BOAT.CARN_NOM, boat.getName()); - export.record(BOAT.CARN_LONGUEUR_HT, - String.valueOf(boat.getBoatLength())); - export.record(BOAT.CARN_ANNEE, - String.valueOf(boat.getBuildYear())); - export.record(BOAT.QUARTIER_IMMA, boat.getDistrictCode()); - export.record(BOAT.NAVS_ACTIVE, - (!boat.getActive() ? BOAT.getBoatInactiveCode() : "")); - - - if (filter.getCompany() != null) { - BoatInfos boatInfos = - boat.getCompanyBoatInfos(filter.getCompany()); - - if (boatInfos != null) { - export.record(BOAT.CONT_PRENOM, - boatInfos.getContactFirstName()); - export.record(BOAT.CONT_NOM, - boatInfos.getContactLastName()); - export.record(BOAT.CONT_EMAIL, - boatInfos.getContactEmail()); - export.record(BOAT.CONT_TEL, - boatInfos.getContactPhoneNumber()); - export.record(BOAT.NAVS_DUP, - String.valueOf(boatInfos.getDup())); - export.record(BOAT.NAVS_COMMENT, - boatInfos.getComment()); - } - } - - export.writeRecord(); - } - result = new FileInputStream(file); - - } catch (Exception eee) { - throw eee; - } finally { - if (writer != null) { - writer.close(); - } + if (logger.isDebugEnabled()) { + logger.debug("Exec query : " + query); } - return result; + List<Boat> boats = dao.findAllByQuery(query); + + BoatImportExportModel model = new BoatImportExportModel(); + Export<Boat> export = new Export<Boat>(model, boats); + InputStream inputStream = export.startExport(); + return inputStream; } @Override Modified: trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-05-09 10:33:08 UTC (rev 1264) @@ -124,6 +124,7 @@ fr.ifremer.wao.entity.TargetSpeciesDCF.LPF=Tall pelagic fr.ifremer.wao.entity.TargetSpeciesDCF.MOL=Molluscs fr.ifremer.wao.entity.TargetSpeciesDCF.SPF=Small pelagic +wao.business.boat.validation.immatriculation.wrongFormat=The boat registry number must be composed of 6 digits wao.business.contact.validation.commentAdminNecessaryForDataReliability=You must precise in admin comment why data reliability is '%s' wao.business.contact.validation.dataReliabilityMissingForValidation=You must provide data reliability before validating wao.business.entity.UserProfile.description=%s on %s%s Modified: trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-05-09 10:33:08 UTC (rev 1264) @@ -1,174 +1,175 @@ ContactPieChartConstant.OTHER=Autres -ContactPieChartConstant.REALIZED=R\u00E9alis\u00E9s -ContactPieChartConstant.REFUSED=Refus\u00E9s -ContactState.CONTACT_DEFINITELY_REFUSED=Refus d\u00E9finitif +ContactPieChartConstant.REALIZED=R\u00e9alis\u00e9s +ContactPieChartConstant.REFUSED=Refus\u00e9s +ContactState.CONTACT_DEFINITELY_REFUSED=Refus d\u00e9finitif ContactState.CONTACT_REFUSED=Refus ContactState.CONTACT_START=Contact pris -ContactState.OBSERVATION_CANCELLED=Annul\u00E9e -ContactState.OBSERVATION_DONE=Observation r\u00E9alis\u00E9e -ContactState.OBSERVATION_EXPECTED=Observation programm\u00E9e -ContactState.OBSERVATION_NOT_DONE=Non observ\u00E9 -DataReliability.CORRECTION_ASKED=Correction demand\u00E9e +ContactState.OBSERVATION_CANCELLED=Annul\u00e9e +ContactState.OBSERVATION_DONE=Observation r\u00e9alis\u00e9e +ContactState.OBSERVATION_EXPECTED=Observation programm\u00e9e +ContactState.OBSERVATION_NOT_DONE=Non observ\u00e9 +DataReliability.CORRECTION_ASKED=Correction demand\u00e9e DataReliability.DOUBTFUL=Douteuse -DataReliability.NOT_PROVIDED=Non contr\u00F4l\u00E9e +DataReliability.NOT_PROVIDED=Non contr\u00f4l\u00e9e DataReliability.NOT_RELIABLE=Non exploitable DataReliability.RELIABLE=Exploitable DataReliability.UNKNOWN=Inconnue -GlobalIndicatorValue.BAD=P\u00E9nalit\u00E9 de niveau 1 +GlobalIndicatorValue.BAD=P\u00e9nalit\u00e9 de niveau 1 GlobalIndicatorValue.GOOD=Bonus de niveau 1 GlobalIndicatorValue.NEUTRAL=Conforme au cahier des charges -GlobalIndicatorValue.VERY_BAD=P\u00E9nalit\u00E9 de niveau 2 +GlobalIndicatorValue.VERY_BAD=P\u00e9nalit\u00e9 de niveau 2 GlobalIndicatorValue.VERY_GOOD=Bonus de niveau 2 -LocationType.AUCTION=Cri\u00E9e +LocationType.AUCTION=Cri\u00e9e LocationType.PORT=Port ObsProgram.OBSDEB=ObsDeb ObsProgram.OBSMER=ObsMer ObsProgram.OBSVENTE=ObsVente ObservationType.FIELD_WORK_OBSERVATION=Observation de terrain -ObservationType.FIELD_WORK_SURVEY=Enqu\u00EAte de terrain -SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultan\u00E9 \: Toutes esp\u00E8ces commerciales -SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultan\u00E9 \: esp\u00E8ces G1+G2 -SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultan\u00E9 \: esp\u00E8ces G1 -SamplingStrategy.SPECIFIC_STOCK=Stock sp\u00E9cifique -SynthesisId.DISTINCT_BOATS_COUNTS=Nombres de navires distincts observ\u00E9s -SynthesisId.GRAPH_BOARDING=Taux d'embarquement sur un m\u00EAme navire conforme aux exigences -SynthesisId.GRAPH_SAMPLING=Taux de r\u00E9alisation du plan d'\u00E9chantillonage -SynthesisId.IND_ALLEGRO_REACTIVITY=D\u00E9lais de transmission des donn\u00E9es -SynthesisId.IND_COMPLIANCE_BOARDING=Respect du nombre d'observateurs embarqu\u00E9s -SynthesisId.IND_CONTACT_STATE=\u00C9tats des contacts -SynthesisId.IND_DATA_RELIABILITY=Qualit\u00E9 de la donn\u00E9e -SynthesisId.OBSERVATION_HOUR=Heures d'observation dans la journ\u00E9e +ObservationType.FIELD_WORK_SURVEY=Enqu\u00eate de terrain +SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultan\u00e9 \: Toutes esp\u00e8ces commerciales +SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultan\u00e9 \: esp\u00e8ces G1+G2 +SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultan\u00e9 \: esp\u00e8ces G1 +SamplingStrategy.SPECIFIC_STOCK=Stock sp\u00e9cifique +SynthesisId.DISTINCT_BOATS_COUNTS=Nombres de navires distincts observ\u00e9s +SynthesisId.GRAPH_BOARDING=Taux d'embarquement sur un m\u00eame navire conforme aux exigences +SynthesisId.GRAPH_SAMPLING=Taux de r\u00e9alisation du plan d'\u00e9chantillonage +SynthesisId.IND_ALLEGRO_REACTIVITY=D\u00e9lais de transmission des donn\u00e9es +SynthesisId.IND_COMPLIANCE_BOARDING=Respect du nombre d'observateurs embarqu\u00e9s +SynthesisId.IND_CONTACT_STATE=\u00c9tats des contacts +SynthesisId.IND_DATA_RELIABILITY=Qualit\u00e9 de la donn\u00e9e +SynthesisId.OBSERVATION_HOUR=Heures d'observation dans la journ\u00e9e UserRole.ADMIN=Administrateur UserRole.COORDINATOR=Coordinateur -UserRole.GUEST=Invit\u00E9 +UserRole.GUEST=Invit\u00e9 UserRole.OBSERVER=Observateur UserRole.PROFESSIONAL=Professionnel csv.import.error.missingMandatoryHeaders=Les champs obligatoires %s sont manquants -csv.import.error.unableToParseValue=Erreur lors de l'interpr\u00E9tation de la valeur '%s' (colonne '%s', ligne %s) -csv.import.error.unableToReadField=Impossible de lire la colonne '%s' \u00E0 la ligne %s +csv.import.error.unableToParseValue=Erreur lors de l'interpr\u00e9tation de la valeur '%s' (colonne '%s', ligne %s) +csv.import.error.unableToReadField=Impossible de lire la colonne '%s' \u00e0 la ligne %s csv.import.error.unableToReadLine=Impossible de lire la ligne %s -csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entit\u00E9 '%s', ligne %s) +csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entit\u00e9 '%s', ligne %s) csv.import.error.unrecognizedHeaders=Les champs %s ne sont pas reconnus. Les champs possibles sont %s. csv.import.logComment=Modification depuis import -fr.ifremer.wao.entity.FishingGearDCF.=Non sp\u00E9cifi\u00E9 -fr.ifremer.wao.entity.FishingGearDCF.DRB=Dragues remorqu\u00E9es par bateau -fr.ifremer.wao.entity.FishingGearDCF.DRH=Dragues \u00E0 main -fr.ifremer.wao.entity.FishingGearDCF.FAR=Pi\u00E8ges a\u00E9riens -fr.ifremer.wao.entity.FishingGearDCF.FCN=\u00C9perviers -fr.ifremer.wao.entity.FishingGearDCF.FG=Autres engins retombants (non-sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.FIX=Pi\u00E8ges (non-sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.FPN=Filets-pi\u00E8ges fixes non couverts +fr.ifremer.wao.entity.FishingGearDCF.=Non sp\u00e9cifi\u00e9 +fr.ifremer.wao.entity.FishingGearDCF.DRB=Dragues remorqu\u00e9es par bateau +fr.ifremer.wao.entity.FishingGearDCF.DRH=Dragues \u00e0 main +fr.ifremer.wao.entity.FishingGearDCF.FAR=Pi\u00e8ges a\u00e9riens +fr.ifremer.wao.entity.FishingGearDCF.FCN=\u00c9perviers +fr.ifremer.wao.entity.FishingGearDCF.FG=Autres engins retombants (non-sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.FIX=Pi\u00e8ges (non-sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.FPN=Filets-pi\u00e8ges fixes non couverts fr.ifremer.wao.entity.FishingGearDCF.FPO=Nasses (casiers) -fr.ifremer.wao.entity.FishingGearDCF.FSN=Filets \u00E0 l'\u00E9talage (diables) +fr.ifremer.wao.entity.FishingGearDCF.FSN=Filets \u00e0 l'\u00e9talage (diables) fr.ifremer.wao.entity.FishingGearDCF.FWR=Barrages, parcs, bordigues, etc. fr.ifremer.wao.entity.FishingGearDCF.FYK=Verveux -fr.ifremer.wao.entity.FishingGearDCF.GEN=Filets maillants et filets emm\u00E9lants (non sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.GES=Tamis \u00E0 civelles -fr.ifremer.wao.entity.FishingGearDCF.GN=Filets maillants (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.GEN=Filets maillants et filets emm\u00e9lants (non sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.GES=Tamis \u00e0 civelles +fr.ifremer.wao.entity.FishingGearDCF.GN=Filets maillants (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.GNC=Filets maillants encerclants -fr.ifremer.wao.entity.FishingGearDCF.GND=Filets maillants d\u00E9rivants (filets d\u00E9rivants) +fr.ifremer.wao.entity.FishingGearDCF.GND=Filets maillants d\u00e9rivants (filets d\u00e9rivants) fr.ifremer.wao.entity.FishingGearDCF.GNF=Filets maillants fixes (sur perches) -fr.ifremer.wao.entity.FishingGearDCF.GNS=Filets maillants cal\u00E9s (ancr\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.GT=Tr\u00E9mailleurs -fr.ifremer.wao.entity.FishingGearDCF.GTN=Tr\u00E9mails et filets maillants combin\u00E9s -fr.ifremer.wao.entity.FishingGearDCF.GTR=Tr\u00E9mails +fr.ifremer.wao.entity.FishingGearDCF.GNS=Filets maillants cal\u00e9s (ancr\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.GT=Tr\u00e9mailleurs +fr.ifremer.wao.entity.FishingGearDCF.GTN=Tr\u00e9mails et filets maillants combin\u00e9s +fr.ifremer.wao.entity.FishingGearDCF.GTR=Tr\u00e9mails fr.ifremer.wao.entity.FishingGearDCF.HAR=Harpons -fr.ifremer.wao.entity.FishingGearDCF.HMD=Dragues m\u00E9canis\u00E9es +fr.ifremer.wao.entity.FishingGearDCF.HMD=Dragues m\u00e9canis\u00e9es fr.ifremer.wao.entity.FishingGearDCF.HMP=Pompes -fr.ifremer.wao.entity.FishingGearDCF.HMX=Engins de r\u00E9colte (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.HMX=Engins de r\u00e9colte (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.LA=Filets tournants sans coulisse (filet lamparo) -fr.ifremer.wao.entity.FishingGearDCF.LHM=Lignes \u00E0 main et lignes avec cannes -fr.ifremer.wao.entity.FishingGearDCF.LHP=Lignes \u00E0 main et lignes \u00E0 cannes -fr.ifremer.wao.entity.FishingGearDCF.LL=Palangres (non sp\u00E9cifi\u00E9es) -fr.ifremer.wao.entity.FishingGearDCF.LLD=Palangres d\u00E9rivantes -fr.ifremer.wao.entity.FishingGearDCF.LLS=Palangres cal\u00E9es ou semi-flottantes -fr.ifremer.wao.entity.FishingGearDCF.LN=Filets soulev\u00E9s (non sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.LNB=Filets soulev\u00E9s man\u0153uvr\u00E9es du bateau -fr.ifremer.wao.entity.FishingGearDCF.LNP=Filets soulev\u00E9s portatifs -fr.ifremer.wao.entity.FishingGearDCF.LNS=Filets soulev\u00E9s fixes man\u0153uvr\u00E9es du rivage -fr.ifremer.wao.entity.FishingGearDCF.LTL=lignes de tra\u00EEne -fr.ifremer.wao.entity.FishingGearDCF.LX=Hame\u00E7ons et lignes (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.LHM=Lignes \u00e0 main et lignes avec cannes +fr.ifremer.wao.entity.FishingGearDCF.LHP=Lignes \u00e0 main et lignes \u00e0 cannes +fr.ifremer.wao.entity.FishingGearDCF.LL=Palangres (non sp\u00e9cifi\u00e9es) +fr.ifremer.wao.entity.FishingGearDCF.LLD=Palangres d\u00e9rivantes +fr.ifremer.wao.entity.FishingGearDCF.LLS=Palangres cal\u00e9es ou semi-flottantes +fr.ifremer.wao.entity.FishingGearDCF.LN=Filets soulev\u00e9s (non sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.LNB=Filets soulev\u00e9s man\u0153uvr\u00e9es du bateau +fr.ifremer.wao.entity.FishingGearDCF.LNP=Filets soulev\u00e9s portatifs +fr.ifremer.wao.entity.FishingGearDCF.LNS=Filets soulev\u00e9s fixes man\u0153uvr\u00e9es du rivage +fr.ifremer.wao.entity.FishingGearDCF.LTL=lignes de tra\u00eene +fr.ifremer.wao.entity.FishingGearDCF.LX=Hame\u00e7ons et lignes (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.MIS=Divers -fr.ifremer.wao.entity.FishingGearDCF.NK=Engins inconnus ou non sp\u00E9cifi\u00E9s -fr.ifremer.wao.entity.FishingGearDCF.OT=Chaluts \u00E0 panneaux (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.OTB=Chalut de fond \u00E0 panneaux -fr.ifremer.wao.entity.FishingGearDCF.OTM=Chaluts p\u00E9lagiques \u00E0 panneaux -fr.ifremer.wao.entity.FishingGearDCF.OTT=Chaluts jumeaux \u00E0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.NK=Engins inconnus ou non sp\u00e9cifi\u00e9s +fr.ifremer.wao.entity.FishingGearDCF.OT=Chaluts \u00e0 panneaux (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.OTB=Chalut de fond \u00e0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.OTM=Chaluts p\u00e9lagiques \u00e0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.OTT=Chaluts jumeaux \u00e0 panneaux fr.ifremer.wao.entity.FishingGearDCF.PS=Filets tournants avec coulisse (sennes coulissantes) -fr.ifremer.wao.entity.FishingGearDCF.PS1=Filets tournants, sennes coulissantes man\u0153uvr\u00E9es par un bateau -fr.ifremer.wao.entity.FishingGearDCF.PS2=Filets tournants, sennes coulissantes man\u0153uvr\u00E9es par deux bateaux -fr.ifremer.wao.entity.FishingGearDCF.PT=Chalut-b\u0153ufs (non sp\u00E9cifi\u00E9) +fr.ifremer.wao.entity.FishingGearDCF.PS1=Filets tournants, sennes coulissantes man\u0153uvr\u00e9es par un bateau +fr.ifremer.wao.entity.FishingGearDCF.PS2=Filets tournants, sennes coulissantes man\u0153uvr\u00e9es par deux bateaux +fr.ifremer.wao.entity.FishingGearDCF.PT=Chalut-b\u0153ufs (non sp\u00e9cifi\u00e9) fr.ifremer.wao.entity.FishingGearDCF.PTB=Chalut-b\u0153ufs de fond -fr.ifremer.wao.entity.FishingGearDCF.PTM=Chalut-b\u0153ufs p\u00E9lagiques -fr.ifremer.wao.entity.FishingGearDCF.RG=Engins de p\u00EAche r\u00E9vr\u00E9ative +fr.ifremer.wao.entity.FishingGearDCF.PTM=Chalut-b\u0153ufs p\u00e9lagiques +fr.ifremer.wao.entity.FishingGearDCF.RG=Engins de p\u00eache r\u00e9vr\u00e9ative fr.ifremer.wao.entity.FishingGearDCF.SB=Sennes de plages fr.ifremer.wao.entity.FishingGearDCF.SDN=Sennes danoises -fr.ifremer.wao.entity.FishingGearDCF.SPR=Sennes man\u0153uvr\u00E9es par deux bateaux -fr.ifremer.wao.entity.FishingGearDCF.SSC=Sennes \u00E9cossaises -fr.ifremer.wao.entity.FishingGearDCF.SV=Sennes hal\u00E9es \u00E0 bord -fr.ifremer.wao.entity.FishingGearDCF.SW=Sennes (non sp\u00E9cifi\u00E9es) -fr.ifremer.wao.entity.FishingGearDCF.TB=Chalut de fond (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.TBB=Chaluts \u00E0 perche -fr.ifremer.wao.entity.FishingGearDCF.TBN=Chalut \u00E0 langoustines -fr.ifremer.wao.entity.FishingGearDCF.TBS=Chalut \u00E0 crevettes -fr.ifremer.wao.entity.FishingGearDCF.TM=Chalut p\u00E9lagique (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.TMS=Chalut \u00E0 crevettes -fr.ifremer.wao.entity.FishingGearDCF.TX=Autre chalut (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.TargetSpeciesDCF.=Non sp\u00E9cifi\u00E9 +fr.ifremer.wao.entity.FishingGearDCF.SPR=Sennes man\u0153uvr\u00e9es par deux bateaux +fr.ifremer.wao.entity.FishingGearDCF.SSC=Sennes \u00e9cossaises +fr.ifremer.wao.entity.FishingGearDCF.SV=Sennes hal\u00e9es \u00e0 bord +fr.ifremer.wao.entity.FishingGearDCF.SW=Sennes (non sp\u00e9cifi\u00e9es) +fr.ifremer.wao.entity.FishingGearDCF.TB=Chalut de fond (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.TBB=Chaluts \u00e0 perche +fr.ifremer.wao.entity.FishingGearDCF.TBN=Chalut \u00e0 langoustines +fr.ifremer.wao.entity.FishingGearDCF.TBS=Chalut \u00e0 crevettes +fr.ifremer.wao.entity.FishingGearDCF.TM=Chalut p\u00e9lagique (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.TMS=Chalut \u00e0 crevettes +fr.ifremer.wao.entity.FishingGearDCF.TX=Autre chalut (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.TargetSpeciesDCF.=Non sp\u00e9cifi\u00e9 fr.ifremer.wao.entity.TargetSpeciesDCF.ALG=Algues -fr.ifremer.wao.entity.TargetSpeciesDCF.CAT=Esp\u00E8ces catadromes -fr.ifremer.wao.entity.TargetSpeciesDCF.CRU=Crustac\u00E9s +fr.ifremer.wao.entity.TargetSpeciesDCF.CAT=Esp\u00e8ces catadromes +fr.ifremer.wao.entity.TargetSpeciesDCF.CRU=Crustac\u00e9s fr.ifremer.wao.entity.TargetSpeciesDCF.CSJ=Coquilles Saint-Jacques -fr.ifremer.wao.entity.TargetSpeciesDCF.DEF=Esp\u00E8ces d\u00E9mersales -fr.ifremer.wao.entity.TargetSpeciesDCF.DWS=Esp\u00E8ces d'eaux profondes +fr.ifremer.wao.entity.TargetSpeciesDCF.DEF=Esp\u00e8ces d\u00e9mersales +fr.ifremer.wao.entity.TargetSpeciesDCF.DWS=Esp\u00e8ces d'eaux profondes fr.ifremer.wao.entity.TargetSpeciesDCF.FIN=Poisson plats -fr.ifremer.wao.entity.TargetSpeciesDCF.LPF=Grands p\u00E9lagiques +fr.ifremer.wao.entity.TargetSpeciesDCF.LPF=Grands p\u00e9lagiques fr.ifremer.wao.entity.TargetSpeciesDCF.MOL=Mollusques -fr.ifremer.wao.entity.TargetSpeciesDCF.SPF=Petits p\u00E9lagiques -wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut pr\u00E9ciser dans le commentaire administrateur pourquoi la donn\u00E9e est '%s' -wao.business.contact.validation.dataReliabilityMissingForValidation=Il faut pr\u00E9ciser la qualit\u00E9 de la donn\u00E9e avant de valider +fr.ifremer.wao.entity.TargetSpeciesDCF.SPF=Petits p\u00e9lagiques +wao.business.boat.validation.immatriculation.wrongFormat=L'immatriculation du navire doit \u00eatre form\u00e9e de 6 chiffres +wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut pr\u00e9ciser dans le commentaire administrateur pourquoi la donn\u00e9e est '%s' +wao.business.contact.validation.dataReliabilityMissingForValidation=Il faut pr\u00e9ciser la qualit\u00e9 de la donn\u00e9e avant de valider wao.business.entity.UserProfile.description=%s sur %s%s -wao.business.mammalsCapture.mail.message=Bonjour,\n\nUn observateur du programme Obsmer a renseign\u00E9 dans WAO l'information suivante \:\n\nMar\u00E9e \: %s\nM\u00E9tier \: %s\n\nCapture accidentelle \:\n%s\n\nCordialement,\n\nLe programme Obsmer\nhttp\://www.ifremer.fr/wao +wao.business.mammalsCapture.mail.message=Bonjour,\n\nUn observateur du programme Obsmer a renseign\u00e9 dans WAO l'information suivante \:\n\nMar\u00e9e \: %s\nM\u00e9tier \: %s\n\nCapture accidentelle \:\n%s\n\nCordialement,\n\nLe programme Obsmer\nhttp\://www.ifremer.fr/wao wao.business.mammalsCapture.mail.subject=Obsmer WAO\: Information sur capture accidentelle wao.business.other=Autre wao.business.readOnly=(lecture seule) -wao.error.boat.canCreateContact=Impossible de cr\u00E9er un nouveau contact pour la soci\u00E9t\u00E9 %1$s et le navire %2$s (%3$d) -wao.error.boat.getNbBoarding=Impossible de r\u00E9cup\u00E9rer le nombre d'embarquements r\u00E9els depuis le %1$s -wao.error.boatInfos.getNbBoardingForCompany=Impossible de r\u00E9cup\u00E9rer le nombre d'embarquements r\u00E9els depuis le %1$s pour la soci\u00E9t\u00E9 %2$s +wao.error.boat.canCreateContact=Impossible de cr\u00e9er un nouveau contact pour la soci\u00e9t\u00e9 %1$s et le navire %2$s (%3$d) +wao.error.boat.getNbBoarding=Impossible de r\u00e9cup\u00e9rer le nombre d'embarquements r\u00e9els depuis le %1$s +wao.error.boatInfos.getNbBoardingForCompany=Impossible de r\u00e9cup\u00e9rer le nombre d'embarquements r\u00e9els depuis le %1$s pour la soci\u00e9t\u00e9 %2$s wao.error.context.close=Une erreur est survenue pendant la fermeture du contexte principale de ToPIA wao.error.context.encodeString= -wao.error.context.getRootContext=Une erreur est survenue pour la r\u00E9cup\u00E9ration du contexte principale de ToPIA +wao.error.context.getRootContext=Une erreur est survenue pour la r\u00e9cup\u00e9ration du contexte principale de ToPIA wao.error.context.parse=Une erreur est survenue pendant le chargement de la configuration du fichier %1$s wao.error.context.rollback=Une erreur est survenue pendant l'annulation de la transaction courante -wao.error.context.start=Une erreur est survenue pendant le d\u00E9marrage de l'application +wao.error.context.start=Une erreur est survenue pendant le d\u00e9marrage de l'application wao.error.context.stop=Une erreur est survenue pendant la fermeture de l'application -wao.error.sampleMonth.addRealTideTime=Impossible d'enregistrer le nombre de mar\u00E9es r\u00E9els pour le mois de %1$s [ligne \: %2$s] -wao.error.sampleRow.saveSampleRowLog=Impossible d'enregistrer le commentaire \u00E9crit par %1$s -wao.error.serviceBoat.createUpdateCompanyBoatInfos=Impossible de cr\u00E9er ou modifier les informations li\u00E9s au navire %1$d pour la soci\u00E9t\u00E9 %2$s -wao.error.serviceBoat.exportBoatCsv=Impossible d'exporter les navires s\u00E9lectionn\u00E9s +wao.error.sampleMonth.addRealTideTime=Impossible d'enregistrer le nombre de mar\u00e9es r\u00e9els pour le mois de %1$s [ligne \: %2$s] +wao.error.sampleRow.saveSampleRowLog=Impossible d'enregistrer le commentaire \u00e9crit par %1$s +wao.error.serviceBoat.createUpdateCompanyBoatInfos=Impossible de cr\u00e9er ou modifier les informations li\u00e9s au navire %1$d pour la soci\u00e9t\u00e9 %2$s +wao.error.serviceBoat.exportBoatCsv=Impossible d'exporter les navires s\u00e9lectionn\u00e9s wao.error.serviceBoat.getActivityCalendarLogAccessFile= wao.error.serviceBoat.getActivityCalendarLogFile= wao.error.serviceBoat.getBoat=Impossible de charger le navire -wao.error.serviceBoat.getBoatNamesStartWith=Impossible de r\u00E9cup\u00E9rer les navires avec un nom commencant par '%1$s' +wao.error.serviceBoat.getBoatNamesStartWith=Impossible de r\u00e9cup\u00e9rer les navires avec un nom commencant par '%1$s' wao.error.serviceBoat.getBoatsByFilter=Impossible de filtrer la liste des navires -wao.error.serviceBoat.getBoatsByImmatriculations=La cha\u00EEne d'immatriculations est incorrect \! Chaque immatriculation doit poss\u00E9der 6 chiffres -wao.error.serviceBoat.getCompanyBoatInfos=Impossible de r\u00E9cup\u00E9rer les informations du navire immatricul\u00E9 %1$d pour la soci\u00E9t\u00E9 %2$s -wao.error.serviceBoat.getLastActivityCalendar=Impossible de charger le dernier calendrier d'activit\u00E9 du navire %1$s (%2$d) +wao.error.serviceBoat.getBoatsByImmatriculations=La cha\u00eene d'immatriculations est incorrect \! Chaque immatriculation doit poss\u00e9der 6 chiffres +wao.error.serviceBoat.getCompanyBoatInfos=Impossible de r\u00e9cup\u00e9rer les informations du navire immatricul\u00e9 %1$d pour la soci\u00e9t\u00e9 %2$s +wao.error.serviceBoat.getLastActivityCalendar=Impossible de charger le dernier calendrier d'activit\u00e9 du navire %1$s (%2$d) wao.error.serviceBoat.getNbBoatsByFilter=Impossible de filtrer la liste des navires wao.error.serviceBoat.getPossibleValuesForFilter= wao.error.serviceBoat.getShipOwnerNamesContains= -wao.error.serviceBoat.importActivityCalendarCsv=Probl\u00E8me d'import du fichier CSV des calendriers d'activit\u00E9 -wao.error.serviceBoat.importBoatCsv=Probl\u00E8me d'import du fichier CSV. V\u00E9rifiez l'en-t\u00EAte du fichier \: [ NAVS_COD,CARN_NOM,CARN_LONGUEUR_HT,CARN_ANNEE,QUARTIER_IMMA,PER_COD,PER_NOM,PER_PRENOM,NAVS_ACTIVE ]. Voir documentation pour plus de d\u00E9tails. +wao.error.serviceBoat.importActivityCalendarCsv=Probl\u00e8me d'import du fichier CSV des calendriers d'activit\u00e9 +wao.error.serviceBoat.importBoatCsv=Probl\u00e8me d'import du fichier CSV. V\u00e9rifiez l'en-t\u00eate du fichier \: [ NAVS_COD,CARN_NOM,CARN_LONGUEUR_HT,CARN_ANNEE,QUARTIER_IMMA,PER_COD,PER_NOM,PER_PRENOM,NAVS_ACTIVE ]. Voir documentation pour plus de d\u00e9tails. wao.error.serviceBoat.newBoatFilter= wao.error.serviceCartography.exportContactMotifsStatisticsKml= wao.error.serviceCartography.exportContactStatisticsKml= -wao.error.serviceCartography.importBoatDistrictKml=Impossible d'importer les coordonn\u00E9es des quartiers des navires. V\u00E9rifiez la documentation pour le bon format du fichier Kml. +wao.error.serviceCartography.importBoatDistrictKml=Impossible d'importer les coordonn\u00e9es des quartiers des navires. V\u00e9rifiez la documentation pour le bon format du fichier Kml. wao.error.serviceChart.getContactPieChartData= wao.error.serviceChart.getContactPieChartUrl= wao.error.serviceContact.exportContactCsv=Impossible d'exporter les contacts wao.error.serviceContact.getContact=Impossible de trouver le contact wao.error.serviceContact.getContacts=Impossible de filtrer la liste des contacts -wao.error.serviceContact.getNbContacts=Impossible de compter le nombre de contacts filtr\u00E9s +wao.error.serviceContact.getNbContacts=Impossible de compter le nombre de contacts filtr\u00e9s wao.error.serviceContact.getNewContact=Impossible d'instancier un nouveau contact wao.error.serviceContact.getPossibleValuesForFilter= wao.error.serviceContact.importContactCsv=Impossible d'importer les contacts @@ -179,7 +180,7 @@ wao.error.serviceContact.updateSampleMonthTidesValue= wao.error.serviceContact.validateContact= wao.error.serviceNews.getNewNews= -wao.error.serviceNews.getNews=Impossible de r\u00E9cup\u00E9rer l'ensemble des news +wao.error.serviceNews.getNews=Impossible de r\u00e9cup\u00e9rer l'ensemble des news wao.error.serviceNews.saveNews=Impossible d'enregistrer la news ayant pour titre '%1$s' wao.error.serviceReferential.getAllContactStateMotifs= wao.error.serviceReferential.getAllObservationUnits= @@ -188,83 +189,83 @@ wao.error.serviceReferential.getAllTerrestrialLocations= wao.error.serviceReferential.getCodesDCF5Contains= wao.error.serviceReferential.getFacades=Impossible de charger la liste des facades -wao.error.serviceReferential.getFishingZones=Impossible de charger la liste des secteurs de p\u00EAche -wao.error.serviceReferential.getProfessions=Impossible de charger la liste des m\u00E9tiers -wao.error.serviceReferential.getSectors=Impossible de charger la liste des zones de p\u00EAche +wao.error.serviceReferential.getFishingZones=Impossible de charger la liste des secteurs de p\u00eache +wao.error.serviceReferential.getProfessions=Impossible de charger la liste des m\u00e9tiers +wao.error.serviceReferential.getSectors=Impossible de charger la liste des zones de p\u00eache wao.error.serviceReferential.getTerrestrialDistrict= wao.error.serviceReferential.importContactStateMotifs= -wao.error.serviceReferential.importDCFcodes=Impossible de cr\u00E9er le r\u00E9f\u00E9rentiel des codes DCF -wao.error.serviceReferential.importFishingZoneCsv=Probl\u00E8me d'import du fichier CSV. V\u00E9rifiez l'en-t\u00EAte du fichier \: [ PECHE_DIVISION,PECHE_ZONE,PECHE_FACADE ]. Voir documentation pour plus de d\u00E9tails. +wao.error.serviceReferential.importDCFcodes=Impossible de cr\u00e9er le r\u00e9f\u00e9rentiel des codes DCF +wao.error.serviceReferential.importFishingZoneCsv=Probl\u00e8me d'import du fichier CSV. V\u00e9rifiez l'en-t\u00eate du fichier \: [ PECHE_DIVISION,PECHE_ZONE,PECHE_FACADE ]. Voir documentation pour plus de d\u00e9tails. wao.error.serviceReferential.importInitialContactStateMotifs= wao.error.serviceReferential.importTerrestrialDivisions= wao.error.serviceReferential.importTerrestrialLocations= wao.error.serviceReferential.updateAllContactStatesMotifs= wao.error.serviceSampling.countSampleRows= wao.error.serviceSampling.createSampleRowLog= -wao.error.serviceSampling.createUpdateSampleRow=Impossible de sauvegarder la ligne d'\u00E9chantillon -wao.error.serviceSampling.deleteSampleRow=Impossible de supprimer la ligne d'\u00E9chantillon \: %1$s -wao.error.serviceSampling.exportSamplingPlanCsv=Impossible d'exporter le plan d'\u00E9chantillonnage sur la p\u00E9riode du %1$s au %2$s +wao.error.serviceSampling.createUpdateSampleRow=Impossible de sauvegarder la ligne d'\u00e9chantillon +wao.error.serviceSampling.deleteSampleRow=Impossible de supprimer la ligne d'\u00e9chantillon \: %1$s +wao.error.serviceSampling.exportSamplingPlanCsv=Impossible d'exporter le plan d'\u00e9chantillonnage sur la p\u00e9riode du %1$s au %2$s wao.error.serviceSampling.exportSamplingPlanICalendar= wao.error.serviceSampling.getDCFGears= wao.error.serviceSampling.getDCFSpecies= wao.error.serviceSampling.getNewProfession= wao.error.serviceSampling.getNewSampleMonth= wao.error.serviceSampling.getNewSampleRow= -wao.error.serviceSampling.getNewSampleRowCode=Impossible de r\u00E9cup\u00E9rer un nouveau code pour une ligne d'\u00E9chantillonnage +wao.error.serviceSampling.getNewSampleRowCode=Impossible de r\u00e9cup\u00e9rer un nouveau code pour une ligne d'\u00e9chantillonnage wao.error.serviceSampling.getNewSampleRowLog= wao.error.serviceSampling.getPossibleValuesForFilter= wao.error.serviceSampling.getPrograms=Impossible de charger la liste des programmes -wao.error.serviceSampling.getSampleRow=Impossible de charger la ligne d'\u00E9chantillon ayant pour identifiant \: %1$s -wao.error.serviceSampling.getSampleRowByCode=Impossible de charger la ligne d'\u00E9chantillon ayant pour code %1$s -wao.error.serviceSampling.getSampleRowsByFilter=Impossible de r\u00E9cup\u00E9rer la liste des lignes du plan d'\u00E9chantillonnage +wao.error.serviceSampling.getSampleRow=Impossible de charger la ligne d'\u00e9chantillon ayant pour identifiant \: %1$s +wao.error.serviceSampling.getSampleRowByCode=Impossible de charger la ligne d'\u00e9chantillon ayant pour code %1$s +wao.error.serviceSampling.getSampleRowsByFilter=Impossible de r\u00e9cup\u00e9rer la liste des lignes du plan d'\u00e9chantillonnage wao.error.serviceSampling.getSampleRowsForEligibility= -wao.error.serviceSampling.getSampleRowsOrderedByFishingZone=Impossible de r\u00E9cup\u00E9rer la liste des lignes du plan d'\u00E9chantillonnage +wao.error.serviceSampling.getSampleRowsOrderedByFishingZone=Impossible de r\u00e9cup\u00e9rer la liste des lignes du plan d'\u00e9chantillonnage wao.error.serviceSampling.importSamplingPlanCsv=Erreur lors de l'import du plan wao.error.serviceSampling.newSampleRow= wao.error.serviceSampling.newSamplingFilter= wao.error.serviceSampling.validateSampleRow= wao.error.serviceSynthesis.getAllIndicatorLogs= -wao.error.serviceSynthesis.getBoardingBoats=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es du graphique concernant les embarquements sur les navires +wao.error.serviceSynthesis.getBoardingBoats=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es du graphique concernant les embarquements sur les navires wao.error.serviceSynthesis.getBoatsCount= wao.error.serviceSynthesis.getComplianceBoardingIndicator= -wao.error.serviceSynthesis.getContactDataInputDateReactivity=Impossible de r\u00E9cup\u00E9rer l'indicateur de r\u00E9activit\u00E9 sur les dates de saisies dans Allegro +wao.error.serviceSynthesis.getContactDataInputDateReactivity=Impossible de r\u00e9cup\u00e9rer l'indicateur de r\u00e9activit\u00e9 sur les dates de saisies dans Allegro wao.error.serviceSynthesis.getContactPieChartData= wao.error.serviceSynthesis.getContactPieChartDataByBoatDistrict= wao.error.serviceSynthesis.getContactStateMotifsPieChartDataByBoatDistrict= -wao.error.serviceSynthesis.getContactStateStatistics=Impossible de r\u00E9cup\u00E9rer les statistiques sur les \u00E9tats des contacts +wao.error.serviceSynthesis.getContactStateStatistics=Impossible de r\u00e9cup\u00e9rer les statistiques sur les \u00e9tats des contacts wao.error.serviceSynthesis.getDataReliability= -wao.error.serviceSynthesis.getDataSampling=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es pour le graphique dynamique des efforts de mar\u00E9es +wao.error.serviceSynthesis.getDataSampling=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es pour le graphique dynamique des efforts de mar\u00e9es wao.error.serviceSynthesis.getDistinctBoatsCounts= -wao.error.serviceSynthesis.getGlobalSynthesisParameters=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es concernant les indicateurs pour la synth\u00E8se globale +wao.error.serviceSynthesis.getGlobalSynthesisParameters=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es concernant les indicateurs pour la synth\u00e8se globale wao.error.serviceSynthesis.getGlobalSynthesisResult= -wao.error.serviceSynthesis.getNonComplianceBoardingIndicator=Impossible de r\u00E9cup\u00E9rer l'indicateur de non respect du nombre d'observateurs embarqu\u00E9s +wao.error.serviceSynthesis.getNonComplianceBoardingIndicator=Impossible de r\u00e9cup\u00e9rer l'indicateur de non respect du nombre d'observateurs embarqu\u00e9s wao.error.serviceSynthesis.getObservationHours= -wao.error.serviceSynthesis.updateGlobalSynthesisParameters=Impossible de mettre \u00E0 jour les param\u00E8tres de la synth\u00E8se globale +wao.error.serviceSynthesis.updateGlobalSynthesisParameters=Impossible de mettre \u00e0 jour les param\u00e8tres de la synth\u00e8se globale wao.error.serviceUser.addTokensToAllProfiles= wao.error.serviceUser.connect=Une erreur est survenue lors de la demande de connexion -wao.error.serviceUser.createDefaultAdmin=Impossible de cr\u00E9er l'administrateur par d\u00E9faut -wao.error.serviceUser.createUpdateCompany=Impossible de cr\u00E9er ou de mettre \u00E0 jour la soci\u00E9t\u00E9 -wao.error.serviceUser.createUpdateUser=Impossible de cr\u00E9er ou de mettre \u00E0 jour l'utilisateur -wao.error.serviceUser.deleteCompany=Impossible de supprimer la soci\u00E9t\u00E9 ou de v\u00E9rifier les contraintes de suppression +wao.error.serviceUser.createDefaultAdmin=Impossible de cr\u00e9er l'administrateur par d\u00e9faut +wao.error.serviceUser.createUpdateCompany=Impossible de cr\u00e9er ou de mettre \u00e0 jour la soci\u00e9t\u00e9 +wao.error.serviceUser.createUpdateUser=Impossible de cr\u00e9er ou de mettre \u00e0 jour l'utilisateur +wao.error.serviceUser.deleteCompany=Impossible de supprimer la soci\u00e9t\u00e9 ou de v\u00e9rifier les contraintes de suppression wao.error.serviceUser.deleteUser=Impossible de supprimer l'utilisateur wao.error.serviceUser.existLogin= wao.error.serviceUser.forgetPassword=Impossible d'envoyer le mail d'oubli de mot de passe -wao.error.serviceUser.getCompanies=Impossible de r\u00E9cup\u00E9rer la liste des soci\u00E9t\u00E9s +wao.error.serviceUser.getCompanies=Impossible de r\u00e9cup\u00e9rer la liste des soci\u00e9t\u00e9s wao.error.serviceUser.getCompany= wao.error.serviceUser.getConnectedUserByToken= wao.error.serviceUser.getNewUser=Impossible d'instancier un nouvel utilisateur -wao.error.serviceUser.getObservers=Impossible de r\u00E9cup\u00E9rer la liste des observateurs +wao.error.serviceUser.getObservers=Impossible de r\u00e9cup\u00e9rer la liste des observateurs wao.error.serviceUser.getUserByToken= wao.error.serviceUser.getUserRolesByLogin= -wao.error.serviceUser.getUsersByCompany=Impossible de r\u00E9cup\u00E9rer la liste des utilisateurs de la soci\u00E9t\u00E9 %1$s +wao.error.serviceUser.getUsersByCompany=Impossible de r\u00e9cup\u00e9rer la liste des utilisateurs de la soci\u00e9t\u00e9 %1$s wao.export.ical.desc=avec %s wao.export.ical.title=Observation ObsDeb -wao.import.contact.failure.boatMissing=Il faut pr\u00E9ciser l'immatriculation du navire associ\u00E9 au contact -wao.import.contact.failure.locationTypeMissing=Le type du lieu doit \u00EAtre renseign\u00E9 -wao.import.contact.failure.sampleRowCodeMissing=Il manque le code de la ligne de plan associ\u00E9e +wao.import.contact.failure.boatMissing=Il faut pr\u00e9ciser l'immatriculation du navire associ\u00e9 au contact +wao.import.contact.failure.locationTypeMissing=Le type du lieu doit \u00eatre renseign\u00e9 +wao.import.contact.failure.sampleRowCodeMissing=Il manque le code de la ligne de plan associ\u00e9e wao.import.contact.failure.terrestrialLocationMissing=Il manque le code du lieu wao.import.contact.failure.wrongBoat=Il n'y a pas de navire avec l'immatriculation '%s' wao.import.contact.failure.wrongSampleRowCode=Il n'y a pas de ligne du plan avec le code '%s' wao.import.contact.failure.wrongTerrestrialLocation=Il n'y a pas de lieu de type '%s' ayant pour code '%s' wao.import.failure.wrongUser=Il n'y a pas d'utilisateur ayant pour identifiant '%s' -wao.validation.sampleRow.conflictOnObserver=L'observateur %s ne peut \u00EAtre associ\u00E9 \u00E0 la ligne %s car il doit observer, le m\u00EAme jour, pour la ligne %s +wao.validation.sampleRow.conflictOnObserver=L'observateur %s ne peut \u00eatre associ\u00e9 \u00e0 la ligne %s car il doit observer, le m\u00eame jour, pour la ligne %s Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceBoatImplTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceBoatImplTest.java 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ServiceBoatImplTest.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -54,8 +54,8 @@ import fr.ifremer.wao.entity.UserProfileImpl; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.entity.WaoUserImpl; +import fr.ifremer.wao.io.ImportResults; import org.junit.After; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -86,18 +86,11 @@ private ServiceBoat service; - public ServiceBoatImplTest() { - } - @BeforeClass public static void setUpClass() throws Exception { manager = new TestManager(); } - @AfterClass - public static void tearDownClass() throws Exception { - } - @Before public void setUp() throws Exception { manager.start(); @@ -358,10 +351,10 @@ log.info("importBoatCsv"); InputStream input = getClass().getResourceAsStream("/import/navires.csv"); - int[] nbBoats = service.importBoatCsv(input); - Assert.assertEquals(6, nbBoats[0]); + ImportResults importResults = service.importBoatCsv(input); + Assert.assertEquals(6, importResults.getNbRowsImported()); // new boats added - Assert.assertEquals(6, nbBoats[1]); + Assert.assertEquals(6, importResults.getNbRowsImportedNew()); // Check boat 174592 is active &nd boat 177474 is inactive List<Boat> results = service.getBoatsByImmatriculations("174592 177474"); Modified: trunk/wao-business/src/test/resources/import/navires.csv =================================================================== --- trunk/wao-business/src/test/resources/import/navires.csv 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-business/src/test/resources/import/navires.csv 2011-05-09 10:33:08 UTC (rev 1264) @@ -1,7 +1,7 @@ -NAVS_COD,CARN_NOM,CARN_LONGUEUR_HT,CARN_ANNEE,QUARTIER_IMMA,PER_COD,PER_NOM,PER_PRENOM,NAVS_ACTIVE -273129,MOISE,7,1992,UX,19771564,BEURRE ,JEAN CLAUDE,A -174258,SAMOURAI KING,9,1982,UN,19744130,MARIE ,JEAN PHILIPPE,A -177474,MAYFLOWERS,10,1983,UN,19784252,MOSELLE ,ALAIN RENE,I -174592,FIFITOU,8,1975,UN,18854131,POUTRE ,JEAN PIERRE,A -284595,A MA LOUTRE,8,1973,UN, SPR3965,BECANAUD, NA,A -978419,BISOUNOURS,11,2002,CI,18854131,POUTRE ,JEAN PIERRE,A +NAVIRE_IMMATRICULATION;NAVIRE_NOM;NAVIRE_LONGUEUR;NAVIRE_ANNEE;QUARTIER_CODE;ARMATEUR_CODE;ARMATEUR_NOM;ARMATEUR_PRENOM;NAVIRE_ACTIF +273129;MOISE;7;1992;UX;19771564;BEURRE ;JEAN CLAUDE;Y +174258;SAMOURAI KING;9;1982;UN;19744130;MARIE ;JEAN PHILIPPE;Y +177474;MAYFLOWERS;10;1983;UN;19784252;MOSELLE ;ALAIN RENE;N +174592;FIFITOU;8;1975;UN;18854131;POUTRE ;JEAN PIERRE;Y +284595;A MA LOUTRE;8;1973;UN; SPR3965;BECANAUD; NA;Y +978419;BISOUNOURS;11;2002;CI;18854131;POUTRE ;JEAN PIERRE;Y Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2011-05-06 13:38:07 UTC (rev 1263) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Administration.java 2011-05-09 10:33:08 UTC (rev 1264) @@ -222,10 +222,7 @@ @Override public ImportResults execute(InputStream input) throws WaoException, WaoBusinessException { - int[] result = serviceBoat.importBoatCsv(input); - ImportResults results = new ImportResultsImpl(); - results.setNbRowsImported(result[0]); - results.setNbRowsImportedNew(result[1]); + ImportResults results = serviceBoat.importBoatCsv(input); return results; } };
participants (1)
-
bleny@users.labs.libre-entreprise.org