Author: fdesbois Date: 2009-12-22 11:58:16 +0000 (Tue, 22 Dec 2009) New Revision: 147 Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/TopiaQuery.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProgramImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/ProgramImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java trunk/suiviobsmer-business/src/test/resources/import/echantillonnage.csv Log: Add method to get next sampleRowCode iteration from a program begin year Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java 2009-12-22 11:58:16 UTC (rev 147) @@ -26,6 +26,7 @@ import java.util.Date; import java.util.Properties; import java.util.Random; +import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.exception.SQLGrammarException; import org.nuiton.topia.TopiaContext; @@ -129,12 +130,13 @@ * @return a String of "length" character */ public static String createRandomString(int length) { - Random random = new Random(); - StringBuilder sb = new StringBuilder(); - while (sb.length() < length) { - sb.append(Integer.toHexString(random.nextInt())); - } - return sb.toString(); +// Random random = new Random(); +// StringBuilder sb = new StringBuilder(); +// while (sb.length() < length) { +// sb.append(Integer.toHexString(random.nextInt())); +// } +// return sb.toString(); + return RandomStringUtils.randomAlphanumeric(length); } public static String encodeString(String string) { Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/TopiaQuery.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/TopiaQuery.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/TopiaQuery.java 2009-12-22 11:58:16 UTC (rev 147) @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaEntity; @@ -303,12 +304,12 @@ */ public <T extends TopiaEntity> List<T> executeToEntityList(TopiaContext transaction, Class<T> entityClass) throws TopiaException { List res = execute(transaction); - List<T> results = new ArrayList<T>(); - for (Object o : res) { - T entity = (T)o; - results.add(entity); - } - return results; +// List<T> results = new ArrayList<T>(); +// for (Object o : res) { +// T entity = (T)o; +// results.add(entity); +// } + return (List<T>)res; } /** @@ -326,22 +327,51 @@ } /** - * Execute the query and get an Integer for result. Used for query with COUNT or MAX, ... + * Execute the query and get an Integer for result. Used for query with COUNT or SUM, ... * The select is overriden to get only the right value for return. * * @param transaction the TopiaContext to use for execution - * @param select the Select overriden (ex : MAX(myParam)) + * @param select the Select overriden (ex : SUM(myParam)) * @return an Integer * @throws TopiaException */ public int executeToInteger(TopiaContext transaction, String select) throws TopiaException { + Long res = (Long)executeToObject(transaction, select); + return res != null ? res.intValue() : 0; + } + + /** + * Execute the query and get a String for result. Used for query with MAX, ... + * The select is overriden to get only the right value for return. + * + * @param transaction the TopiaContext to use for execution + * @param select the Select overriden (ex : MAX(myParam)) + * @return a String + * @throws TopiaException + */ + public String executeToString(TopiaContext transaction, String select) throws TopiaException { + Object res = executeToObject(transaction, select); + return res != null ? (String)res : ""; + } + + /** + * Execute the query and get an Object for result. + * The select is overriden to get only the right value for return. + * + * @param transaction the TopiaContext to use for execution + * @param select the Select overriden + * @return an Object + * @throws TopiaException + */ + public Object executeToObject(TopiaContext transaction, String select) throws TopiaException { String oldValue = this.select; - this.select = "SELECT " + select; - int result = 0; + if (!StringUtils.isEmpty(select)) { + this.select = "SELECT " + select; + } + Object result = null; List results = execute(transaction); if (!results.isEmpty()) { - Long tmp = (Long)results.get(0); - result = tmp.intValue(); + result = results.get(0); } this.select = oldValue; return result; Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProgramImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProgramImpl.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProgramImpl.java 2009-12-22 11:58:16 UTC (rev 147) @@ -22,10 +22,16 @@ package fr.ifremer.suiviobsmer.entity; import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.TopiaQuery; +import fr.ifremer.suiviobsmer.TopiaQuery.Op; import java.io.Serializable; +import java.text.NumberFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import org.apache.commons.lang.StringUtils; +import org.nuiton.topia.TopiaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -113,4 +119,40 @@ endCal.setTime(getPeriodEnd()); return endCal; } + + @Override + public String getNewSampleRowCode() throws SuiviObsmerException { + TopiaContext transaction = null; + String result = null; + if (getPeriodBegin() == null) { + return result; + } + try { + transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + Calendar begin = getCalendarBegin(); + int year = begin.get(Calendar.YEAR); + + TopiaQuery query = new TopiaQuery(SampleRow.class). + add(SampleRow.CODE, Op.LIKE, year + "_%"); + + String maxCode = query.executeToString(transaction, "MAX(" + SampleRow.CODE + ")"); + + if (log.isDebugEnabled()) { + log.debug("Max code found : " + maxCode); + } + + String[] part = maxCode.split("_"); + int inc = Integer.parseInt(part[1]) + 1; + String str = StringUtils.leftPad("" + inc, 2, "0"); + result = year + "_" + str; + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible de récupérer un nouveau code pour une ligne d'échantillonnage", + eee); + } + return result; + } } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-22 11:58:16 UTC (rev 147) @@ -165,7 +165,11 @@ */ @Override public boolean hasSampleMonthRealTideTime() { - for (SampleMonth month : getSampleMonth()) { + List<SampleMonth> months = getSampleMonth(); + if (months == null) { + return false; + } + for (SampleMonth month : months) { if (month.getRealTidesValue() != 0) { return true; } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2009-12-22 11:58:16 UTC (rev 147) @@ -25,7 +25,6 @@ import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; -import fr.ifremer.suiviobsmer.TopiaQuery; import fr.ifremer.suiviobsmer.dto.SamplingHistoricRow; import fr.ifremer.suiviobsmer.entity.*; import fr.ifremer.suiviobsmer.entity.SampleRow; @@ -45,10 +44,11 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; -import org.nuiton.util.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -367,6 +367,9 @@ continue; } + // Replace single number after year by a double one : 2010_1 -> 2010_01 + code = code.replaceFirst("_(\\d)$", "_0$1"); + String programName = reader.get("PROGRAMME_CODE").trim(); int[] programBegin = getMonthAndYear(reader.get("PROGRAMME_DEBUT").trim()); int[] programEnd = getMonthAndYear(reader.get("PROGRAMME_FIN").trim()); Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2009-12-22 11:58:16 UTC (rev 147) @@ -103,7 +103,7 @@ serviceSampling.importSamplingPlanCsv(input); SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - SampleRow row = rowDAO.findByCode("2010_1"); + SampleRow row = rowDAO.findByCode("2010_01"); row.getCompany(); row.getProgram(); row.getProfession(); Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/ProgramImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/ProgramImplTest.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/ProgramImplTest.java 2009-12-22 11:58:16 UTC (rev 147) @@ -21,8 +21,13 @@ package fr.ifremer.suiviobsmer.entity; +import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerRunner; import fr.ifremer.suiviobsmer.business.SuiviObsmerRunnerTest; +import fr.ifremer.suiviobsmer.impl.ServiceSamplingImpl; +import fr.ifremer.suiviobsmer.services.ServiceSampling; +import java.io.InputStream; import java.util.Calendar; import java.util.GregorianCalendar; import org.junit.After; @@ -31,6 +36,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.nuiton.topia.TopiaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -162,4 +168,42 @@ } + + @Test + public void testGetNewSampleRowCode() throws Exception { + log.info("getNewSampleRowCode"); + + /** PREPARE DATA **/ + TopiaContext transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + FishingZoneDAO zoneDAO = SuiviObsmerModelDAOHelper.getFishingZoneDAO(transaction); + FishingZone zoneIId = zoneDAO.create(FishingZone.DISTRICT_CODE, "IId"); + FishingZone zoneIV = zoneDAO.create(FishingZone.DISTRICT_CODE, "IV"); + FishingZone zoneI = zoneDAO.create(FishingZone.DISTRICT_CODE, "I"); + transaction.commitTransaction(); + + ServiceSampling serviceSampling = new ServiceSamplingImpl(); + InputStream input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + serviceSampling.importSamplingPlanCsv(input); + + ProgramDAO programDAO = SuiviObsmerModelDAOHelper.getProgramDAO(transaction); + Program program = programDAO.findByName("PPP2010"); + transaction.closeContext(); + + /** EXEC METHOD **/ + + String result = program.getNewSampleRowCode(); + Assert.assertEquals("2009_07", result); + + // Test regex for replacment in importSamplingPlanCsv + String code = "2010_1"; + code = code.replaceFirst("_(\\d)$", "_0$1"); + Assert.assertEquals("2010_01", code); + + code = "2010_04"; + code = code.replaceFirst("_(\\d)$", "_0$1"); + Assert.assertEquals("2010_04", code); + } + + } \ No newline at end of file Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2009-12-22 11:58:16 UTC (rev 147) @@ -150,7 +150,7 @@ // Exec with filter on SampleRowCode and company filter = new BoatFilterImpl(); - filter.setSampleRowCode("2009_3"); + filter.setSampleRowCode("2009_03"); filter.setCompany(company); boats = service.getBoatsByFilter(filter); assertEquals(2, boats.size()); @@ -222,10 +222,10 @@ // Get two SampleRows : 2009_3 & 2010_4 SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - SampleRow row1 = rowDAO.findByCode("2009_3"); + SampleRow row1 = rowDAO.findByCode("2009_03"); row1.getProgram(); row1.getProfession(); - SampleRow row2 = rowDAO.findByCode("2010_4"); + SampleRow row2 = rowDAO.findByCode("2010_04"); row2.getProgram(); row2.getProfession(); @@ -269,7 +269,7 @@ TopiaContext transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - SampleRow row = rowDAO.findByCode("2010_1"); + SampleRow row = rowDAO.findByCode("2010_01"); row.getCompany(); row.getProgram(); row.getProfession(); @@ -293,7 +293,7 @@ // ajout d'une nouvelle ligne "2010_4" non mise en elligible auparavent companyBoatInfos.setNewElligibleBoat(rows.get(1)); // ligne deja elligible mise en inactive - companyBoatInfos.removeElligibleBoat("2009_3"); + companyBoatInfos.removeElligibleBoat("2009_03"); service.createUpdateCompanyBoatInfos(companyBoatInfos); @@ -302,18 +302,18 @@ Map<String, ElligibleBoat> results = companyBoatInfos.getElligibleBoats(); assertEquals(2, results.size()); - ElligibleBoat elligible = companyBoatInfos.getElligibleBoat("2009_3"); + ElligibleBoat elligible = companyBoatInfos.getElligibleBoat("2009_03"); assertNotNull(elligible.getCompanyActive()); assertFalse(elligible.getCompanyActive()); - elligible = companyBoatInfos.getElligibleBoat("2010_4"); + elligible = companyBoatInfos.getElligibleBoat("2010_04"); assertTrue(elligible.getCompanyActive()); /** TEST2 **/ // Suppression ligne lié elligible pour la société - companyBoatInfos.removeElligibleBoat("2010_4"); + companyBoatInfos.removeElligibleBoat("2010_04"); // Reactivation ligne mise en inactive juste avant - companyBoatInfos.activeElligibleBoat("2009_3"); + companyBoatInfos.activeElligibleBoat("2009_03"); service.createUpdateCompanyBoatInfos(companyBoatInfos); @@ -322,7 +322,7 @@ results = companyBoatInfos.getElligibleBoats(); assertEquals(1, results.size()); - elligible = companyBoatInfos.getElligibleBoat("2009_3"); + elligible = companyBoatInfos.getElligibleBoat("2009_03"); assertNull(elligible.getCompanyActive()); assertTrue(elligible.getGlobalActive()); Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java 2009-12-22 11:58:16 UTC (rev 147) @@ -149,7 +149,7 @@ } SampleRow row = service.getNewSampleRow(); - row.setCode("2010_3"); + row.setCode("2010_03"); row.setNbObservants(3); row.setAverageTideTime(2.5); row.setProgram(program1); @@ -205,24 +205,24 @@ SampleRowDAO dao = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); SampleRow row1 = dao.create(); - row1.setCode("2010_1"); + row1.setCode("2010_01"); row1.addFishingZone(zones.get(2)); row1.setProgram(program1); SampleRow row2 = dao.create(); - row2.setCode("2010_2"); + row2.setCode("2010_02"); row2.addFishingZone(zones.get(0)); row2.setProgram(program1); SampleRow row3 = dao.create(); - row3.setCode("2010_3"); + row3.setCode("2010_03"); row3.addFishingZone(zones.get(1)); row3.addFishingZone(zones.get(2)); row3.addFishingZone(zones.get(0)); row3.setProgram(program2); SampleRow row4 = dao.create(); - row4.setCode("2010_4"); + row4.setCode("2010_04"); row4.addFishingZone(zones.get(0)); row4.setProgram(program1); @@ -239,9 +239,9 @@ List<SampleRow> rows = service.getSampleRowsOrderedByFishingZone(begin.getTime(), end.getTime(), null); assertEquals(4, rows.size()); SampleRow resultRow0 = rows.get(0); - assertEquals("2010_2", resultRow0.getCode()); + assertEquals("2010_02", resultRow0.getCode()); SampleRow resultRow1 = rows.get(1); - assertEquals("2010_3", resultRow1.getCode()); + assertEquals("2010_03", resultRow1.getCode()); List<FishingZone> zoneRow1 = resultRow1.getFishingZone(); assertEquals(3, zoneRow1.size()); @@ -253,9 +253,9 @@ assertEquals("V", resultZone2.getDistrictCode()); SampleRow resultRow2 = rows.get(2); - assertEquals("2010_4", resultRow2.getCode()); + assertEquals("2010_04", resultRow2.getCode()); SampleRow resultRow3 = rows.get(3); - assertEquals("2010_1", resultRow3.getCode()); + assertEquals("2010_01", resultRow3.getCode()); // SECOND TEST : // ORDER by FishingZone (facadeName, sectorName, districtCode) @@ -266,11 +266,11 @@ rows = service.getSampleRowsOrderedByFishingZone(begin.getTime(), end.getTime(), null); assertEquals(3, rows.size()); resultRow0 = rows.get(0); - assertEquals("2010_2", resultRow0.getCode()); + assertEquals("2010_02", resultRow0.getCode()); resultRow1 = rows.get(1); - assertEquals("2010_4", resultRow1.getCode()); + assertEquals("2010_04", resultRow1.getCode()); resultRow2 = rows.get(2); - assertEquals("2010_1", resultRow2.getCode()); + assertEquals("2010_01", resultRow2.getCode()); } @@ -377,7 +377,7 @@ service.importSamplingPlanCsv(input); SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - SampleRow row = rowDAO.findByCode("2010_1"); + SampleRow row = rowDAO.findByCode("2010_01"); row.getProfession(); row.getProgram(); row.getCompany(); @@ -394,7 +394,7 @@ service.deleteSampleRow(row); transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - row = rowDAO.findByCode("2010_1"); + row = rowDAO.findByCode("2010_01"); assertNull(row); ElligibleBoatDAO elligibleDAO = SuiviObsmerModelDAOHelper.getElligibleBoatDAO(transaction); @@ -442,7 +442,7 @@ SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - SampleRow row1 = rowDAO.findByCode("2010_1"); + SampleRow row1 = rowDAO.findByCode("2010_01"); assertNotNull(row1); assertEquals(1, row1.getNbObservants()); assertEquals(1.5, row1.getAverageTideTime(), 0.1); Modified: trunk/suiviobsmer-business/src/test/resources/import/echantillonnage.csv =================================================================== --- trunk/suiviobsmer-business/src/test/resources/import/echantillonnage.csv 2009-12-22 09:52:22 UTC (rev 146) +++ trunk/suiviobsmer-business/src/test/resources/import/echantillonnage.csv 2009-12-22 11:58:16 UTC (rev 147) @@ -1,7 +1,7 @@ "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" "2010_1",TARTANPION,"IId / I",,"DB_MOL",,,,,,"MA-2009",03/2010,01/2011,,,,0,0,0,0,0,0,0,2,0,0,4,,,"1,5",1, "2010_2",,"IId",,"GTR_DEAEF et ANS_DEF",,,,"Fileyage","poissons tubes","MANY",01/2008,12/2008,,20,0,0,21,0,0,21,0,0,21,0,0,,,,1,1, -"2010_3",,"IId / IV",,"ORM",,,,"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, +"2010_03",,"IId / IV",,"ORM",,,,"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, "2009_1",,"IId / IV",,"GTR_DEF et 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, "2009_2",,"IId",,"GTR_DEF et 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, "2009_3",TARTANPION,"IV",,"GTR_DF et GNS_DP",,,,"Fileyages à baleines à bosse","chameaux","PPP2010",12/2009,10/2010,2,2,2,2,2,2,2,2,2,2,4,,,,,,1,1,