Author: fdesbois Date: 2010-01-11 15:18:44 +0000 (Mon, 11 Jan 2010) New Revision: 182 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ImportResultsImpl.java Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.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/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java Log: - Ano #1973 : Problem on SamplingPlan import - Create ImportResults to simplify results managment in UI Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java 2010-01-11 15:18:44 UTC (rev 182) @@ -33,6 +33,7 @@ import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DurationFormatUtils; +import org.nuiton.util.PeriodDates; import org.slf4j.Logger; /** @@ -53,6 +54,13 @@ int forContactCsv(); String name(); + + /** + * Pattern for Date parsing. This pattern can be null, if no format date is necessary. + * + * @return a String corresponding to the date pattern + */ + String datePattern(); } /** @@ -88,6 +96,11 @@ public int forContactCsv() { return contactHeader; } + + @Override + public String datePattern() { + return null; + } } /** @@ -133,6 +146,15 @@ public int forContactCsv() { return contactHeader; } + + @Override + public String datePattern() { + return defaultDatePattern(); + } + + public static String defaultDatePattern() { + return "MM/yyyy"; + } } /** @@ -156,6 +178,11 @@ public int forContactCsv() { return contactHeader; } + + @Override + public String datePattern() { + return null; + } } /** @@ -205,6 +232,11 @@ public int forContactCsv() { return contactHeader; } + + @Override + public String datePattern() { + return "dd/MM/yyyy"; + } } public static int CONTACT_NB_HEADERS = 33; @@ -323,4 +355,19 @@ return Integer.parseInt(str); } + public static PeriodDates readPeriod(CsvReader reader, ImportHeader headerBegin, ImportHeader headerEnd) + throws IOException, ParseException, IllegalArgumentException { + Date end = readDate(reader, headerEnd); + Date begin = readDate(reader, headerBegin); + PeriodDates period = new PeriodDates(begin, end); + period.initDayOfMonthExtremities(); + return period; + } + + public static Date readDate(CsvReader reader, ImportHeader header) + throws IOException, ParseException { + DateFormat dateFormat = new SimpleDateFormat(header.datePattern()); + return dateFormat.parse(read(reader, header)); + } + } Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ImportResultsImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ImportResultsImpl.java (rev 0) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ImportResultsImpl.java 2010-01-11 15:18:44 UTC (rev 182) @@ -0,0 +1,44 @@ + +package fr.ifremer.suiviobsmer.bean; + +import java.util.ArrayList; +import java.util.List; + +/** + * ImportResultsImpl + * + * Created: 11 janv. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ImportResultsImpl extends ImportResults { + + @Override + public void addError(int rowNum, String msg) { + String str = "Ligne " + rowNum + " : " + msg; + getErrors().add(str); + } + + @Override + public List<String> getErrors() { + if (errors == null) { + errors = new ArrayList<String>(); + } + return errors; + } + + @Override + public void incNbRefused() { + nbRowsRefused++; + } + + @Override + public void incNbImported() { + nbRowsImported++; + } + +} Property changes on: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ImportResultsImpl.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" 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 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProgramImpl.java 2010-01-11 15:18:44 UTC (rev 182) @@ -53,6 +53,7 @@ private static final long serialVersionUID = 1L; @Override + @Deprecated public boolean isMonthAndYearIncluded(int month, int year) { Calendar currentCal = new GregorianCalendar(year, month-1, 15, 0, 0, 0); @@ -73,12 +74,14 @@ } @Override + @Deprecated public void setPeriodBegin(int month, int year) { Calendar calendar = new GregorianCalendar(year, month-1, 1, 0, 0, 0); setPeriodBegin(calendar.getTime()); } @Override + @Deprecated public void setPeriodEnd(int month, int year) { Calendar calendar = new GregorianCalendar(year, month-1, 1, 0, 0, 0); int max = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 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 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2010-01-11 15:18:44 UTC (rev 182) @@ -54,8 +54,10 @@ * @param month the month of the SampleMonth to get * @param year the year of the SampleMonth to get * @return the SampleMonth if it exists in the SampleMonth list or null either + * @deprecated since 0.0.4, use {@link #getSampleMonth(java.util.Date) } instead */ @Override + @Deprecated public SampleMonth getSampleMonth(int month, int year) { if (getSampleMonth() == null) { return null; @@ -80,9 +82,9 @@ } Calendar ref = new GregorianCalendar(); ref.setTime(date); - log.info("Ref : " + date); + //log.info("Ref : " + date); for (SampleMonth curr : getSampleMonth()) { - log.info("Curr month : " + curr.getPeriodDate() + " : " + curr.getPeriodMonth() + " / " + curr.getPeriodYear()); + //log.info("Curr month : " + curr.getPeriodDate() + " : " + curr.getPeriodMonth() + " / " + curr.getPeriodYear()); if (ref.get(Calendar.MONTH) == (curr.getPeriodMonth()-1) && ref.get(Calendar.YEAR) == curr.getPeriodYear()) { return curr; } 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 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2010-01-11 15:18:44 UTC (rev 182) @@ -22,6 +22,7 @@ package fr.ifremer.suiviobsmer.impl; import com.csvreader.CsvReader; +import fr.ifremer.suiviobsmer.ImportHelper; import fr.ifremer.suiviobsmer.ImportHelper.FISHING_ZONE; import fr.ifremer.suiviobsmer.ImportHelper.SAMPLING; import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; @@ -29,6 +30,8 @@ import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.bean.ImportResults; +import fr.ifremer.suiviobsmer.bean.ImportResultsImpl; import fr.ifremer.suiviobsmer.dto.SamplingHistoricRow; import fr.ifremer.suiviobsmer.entity.*; import fr.ifremer.suiviobsmer.entity.SampleRow; @@ -192,7 +195,7 @@ } // Prepare period dates - period.setDayOfMonthExtremities(); + period.initDayOfMonthExtremities(); query.add("S.program.periodBegin", Op.LT, period.getThruDate()). add("S.program.periodEnd", Op.GT, period.getFromDate()); @@ -335,11 +338,11 @@ return newProfession; } - @Override - public int[] importSamplingPlanCsv(InputStream input) throws SuiviObsmerException { + public ImportResults importSamplingPlanCsv(InputStream input) throws SuiviObsmerException { TopiaContext transaction = null; - int[] result = new int[3]; + ImportResults result = new ImportResultsImpl(); + //int[] result = new int[3]; int currRow = 0; SampleRow row = null; try { @@ -350,8 +353,8 @@ SampleRowDAO dao = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - int nbImported = 0; - int nbRefused = 0; + //int nbImported = 0; + //int nbRefused = 0; while(reader.readRecord()) { currRow++; @@ -369,30 +372,33 @@ code = code.replaceFirst("_(\\d)$", "_0$1"); String programName = reader.get(SAMPLING.PROGRAMME_CODE.name()).trim(); - int[] programBegin = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_DEBUT.name()).trim()); - int[] programEnd = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_FIN.name()).trim()); +// int[] programBegin = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_DEBUT.name()).trim()); +// int[] programEnd = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_FIN.name()).trim()); + PeriodDates period = ImportHelper.readPeriod(reader, SAMPLING.PROGRAMME_DEBUT, SAMPLING.PROGRAMME_FIN); String districts = reader.get(FISHING_ZONE.PECHE_DIVISION.name()); row = dao.findByCode(code); // Refuse existing SampleRow if (row != null) { - if (log.isInfoEnabled()) { - log.info("Ligne " + currRow + " refusé [CODE = " + code + "] Code déjà existant : " + - Arrays.asList(reader.getValues())); - } - nbRefused++; - // Refuse Fishing zones empty +// if (log.isInfoEnabled()) { +// log.info("Ligne " + currRow + " refusé [CODE = " + code + "] Code déjà existant : " + +// Arrays.asList(reader.getValues())); +// } + result.addError(currRow, "[CODE = " + code + "] refusé : Code déjà existant"); + result.incNbRefused(); //nbRefused++; + } else if (StringUtils.isEmpty(programName)) { throw new SuiviObsmerBusinessException(Type.IMPORT_ERROR, this.getClass(), "Erreur à la ligne " + currRow + " [CODE = " + code + "] : " + "Cette ligne n'est lié à aucun programme !"); - //nbRefused++; + // Refuse Fishing zones empty } else if (StringUtils.isEmpty(districts)) { - if (log.isInfoEnabled()) { - log.info("Ligne " + currRow + " refusé [CODE = " + code + "] Zone de pêche non renseigné : " + - Arrays.asList(reader.getValues())); - } - nbRefused++; +// if (log.isInfoEnabled()) { +// log.info("Ligne " + currRow + " refusé [CODE = " + code + "] Zone de pêche non renseigné : " + +// Arrays.asList(reader.getValues())); +// } + result.addError(currRow, "[CODE = " + code + "] refusé : Zone de pêche non renseigné"); + result.incNbRefused(); //nbRefused++; } else { row = dao.create(SampleRow.CODE, code); @@ -406,12 +412,15 @@ throw new SuiviObsmerBusinessException(Type.IMPORT_ERROR, this.getClass(), "Erreur à la ligne " + currRow + " [CODE = " + code + "] : " + "La société portant le nom '" + companyName + "' n'existe pas dans l'application"); +// result.addError(currRow, "[CODE = " + code + "] refusé : La société '" + companyName + "' n'existe pas dans l'application"); +// result.incNbRefused(); +// continue; } row.setCompany(company); } // Import program. Creation if not exist - Program program = importProgram(transaction, programName, programBegin, programEnd); + Program program = importProgram(transaction, programName, period); row.setProgram(program); // Import profession. Creation if not exist @@ -423,7 +432,7 @@ importFishingZones(transaction, districts, currRow, row); updateRow(transaction, row, reader); - nbImported++; + result.incNbImported(); //nbImported++; } // Commit row by row transaction.commitTransaction(); @@ -431,8 +440,8 @@ transaction.closeContext(); - result[0] = nbImported; - result[1] = nbRefused; +// result[0] = nbImported; +// result[1] = nbRefused; } catch (NumberFormatException eee) { SuiviObsmerContext.serviceException(transaction, @@ -444,8 +453,7 @@ "Le format des dates est incorrect, il doit être de la forme : MM/AAAA", eee); } catch (Exception eee) { SuiviObsmerContext.serviceException(transaction, - "Problème d'import du fichier CSV. Voir documentation pour plus de détails sur " + - "les en-têtes autorisés et le format des données.", + "Erreur à la ligne " + currRow + " [CODE = " + row.getCode() + "]", eee); } return result; @@ -457,26 +465,34 @@ * Key value for the program : programName. If program already exists, update dates. * @param transaction Topia transaction for using ProgramDAO * @param programName the program name (key) - * @param begin the program begin month and year - * @param end the program end month and year + * @param period the program period * @return an existing Program or a new one * @throws TopiaException for dao errors */ - protected Program importProgram(TopiaContext transaction, String programName, - int[] begin, int[] end) throws TopiaException { + protected Program importProgram(TopiaContext transaction, String programName, PeriodDates period) throws TopiaException { ProgramDAO dao = SuiviObsmerModelDAOHelper.getProgramDAO(transaction); Program program = dao.findByName(programName); + Date periodBegin = null, periodEnd = null; if (program == null) { if (log.isInfoEnabled()) { - log.info("Ajout d'un nouveau programme : " + programName + - "[ " + begin[0] + "/" + begin[1] + " , " + end[0] + "/" + end[1] + " ]"); + log.info("Ajout d'un nouveau programme : " + programName + " - " + period); } program = dao.create(Program.NAME, programName); + } else { + periodBegin = program.getPeriodBegin(); + periodEnd = program.getPeriodEnd(); } - program.setPeriodBegin(begin[TAB_MONTH], begin[TAB_YEAR]); - program.setPeriodEnd(end[TAB_MONTH], end[TAB_YEAR]); + if (periodBegin == null || periodBegin.after(period.getFromDate())) { + program.setPeriodBegin(period.getFromDate()); + } + if (periodEnd == null || periodEnd.before(period.getThruDate())) { + program.setPeriodEnd(period.getThruDate()); + } + +// program.setPeriodBegin(begin[TAB_MONTH], begin[TAB_YEAR]); +// program.setPeriodEnd(end[TAB_MONTH], end[TAB_YEAR]); return program; } @@ -578,6 +594,7 @@ averageStr = averageStr.replaceAll(",", "."); double averageTideTime = Double.parseDouble(averageStr); + // Problem : not imported yet ?? sampleRow.setFishingZonesInfos(fishingZoneInfos); sampleRow.setNbObservants(nbObservants); sampleRow.setAverageTideTime(averageTideTime); @@ -590,49 +607,56 @@ // Note : nbTotalColumns must be > nbFixedColumns int lastMonthColumnId = firstMonthColumnId + nbTotalColumns - nbFixedColumns; + DateFormat dateFormat = new SimpleDateFormat(SAMPLING.defaultDatePattern()); + for (int i = firstMonthColumnId; i < lastMonthColumnId; i++) { - int[] monthAndYear = getMonthAndYear(reader.getHeader(i)); + //int[] monthAndYear = getMonthAndYear(); + Date monthDate = dateFormat.parse(reader.getHeader(i)); Integer monthValue = StringUtils.isEmpty(reader.get(i)) ? null : Integer.parseInt(reader.get(i)); + Program program = sampleRow.getProgram(); - if (sampleRow.getProgram().isMonthAndYearIncluded(monthAndYear[TAB_MONTH], monthAndYear[TAB_YEAR])) { - + //if (sampleRow.getProgram().isMonthAndYearIncluded(monthAndYear[TAB_MONTH], monthAndYear[TAB_YEAR])) { + if (DateUtils.between(monthDate, program.getPeriodBegin(), program.getPeriodEnd())) { SampleMonthDAO dao = SuiviObsmerModelDAOHelper.getSampleMonthDAO(transaction); - SampleMonth month = sampleRow.getSampleMonth(monthAndYear[TAB_MONTH], monthAndYear[TAB_YEAR]); + SampleMonth month = sampleRow.getSampleMonth(monthDate); if (month == null) { month = dao.create( SampleMonth.SAMPLE_ROW, sampleRow, - SampleMonth.PERIOD_MONTH, monthAndYear[TAB_MONTH], - SampleMonth.PERIOD_YEAR, monthAndYear[TAB_YEAR]); + SampleMonth.PERIOD_DATE, monthDate); sampleRow.addSampleMonth(month); } + if (monthValue == null) { + monthValue = 0; + } month.setExpectedTidesValue(monthValue); } else if (monthValue != null) { // exception, outOfBounds month if (log.isErrorEnabled()) { - log.error("Month out of bounds : value=" + monthValue + " _ monthAndYear=" + monthAndYear + + log.error("Month out of bounds : value=" + monthValue + " _ monthDate=" + monthDate + " _ program=" + sampleRow.getProgram()); } } } } - protected static final int TAB_MONTH = 0; - protected static final int TAB_YEAR = 1; +// protected static final int TAB_MONTH = 0; +// protected static final int TAB_YEAR = 1; - protected int[] getMonthAndYear(String str) throws ParseException { - DateFormat dateFormat = new SimpleDateFormat("MM/yyyy"); - int[] result = new int[2]; +// @Deprecated +// protected int[] getMonthAndYear(String str) throws ParseException { +// DateFormat dateFormat = new SimpleDateFormat("MM/yyyy"); +// int[] result = new int[2]; +// +// Date date = dateFormat.parse(str); +// Calendar calendar = new GregorianCalendar(); +// calendar.setTime(date); +// +// result[TAB_MONTH] = calendar.get(Calendar.MONTH) + 1; +// result[TAB_YEAR] = calendar.get(Calendar.YEAR); +// return result; +// } - Date date = dateFormat.parse(str); - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); - - result[TAB_MONTH] = calendar.get(Calendar.MONTH) + 1; - result[TAB_YEAR] = calendar.get(Calendar.YEAR); - return result; - } - } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceSamplingMock.java 2010-01-11 15:18:44 UTC (rev 182) @@ -22,6 +22,8 @@ package fr.ifremer.suiviobsmer.mock; import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.bean.ImportResults; +import fr.ifremer.suiviobsmer.bean.ImportResultsImpl; import fr.ifremer.suiviobsmer.dto.SamplingHistoricRow; import fr.ifremer.suiviobsmer.dto.SampleRowDTO; import fr.ifremer.suiviobsmer.entity.Boat; @@ -230,8 +232,8 @@ } @Override - public int[] importSamplingPlanCsv(InputStream input) throws SuiviObsmerException { - return new int[]{0, 0, 0}; + public ImportResults importSamplingPlanCsv(InputStream input) throws SuiviObsmerException { + return new ImportResultsImpl(); } @Override Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) 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 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java 2010-01-11 15:18:44 UTC (rev 182) @@ -25,6 +25,7 @@ import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerRunner; import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.bean.ImportResults; import fr.ifremer.suiviobsmer.business.SuiviObsmerRunnerTest; import fr.ifremer.suiviobsmer.entity.Boat; import fr.ifremer.suiviobsmer.entity.Company; @@ -459,12 +460,12 @@ /** EXEC METHOD **/ InputStream input = getClass().getResourceAsStream("/import/echantillonnage.csv"); - int[] result = service.importSamplingPlanCsv(input); + ImportResults result = service.importSamplingPlanCsv(input); // total imported - assertEquals(10, result[0]); + assertEquals(10, result.getNbRowsImported()); // total refused - assertEquals(1, result[1]); + assertEquals(1, result.getNbRowsRefused()); /** CHECK VALUES **/ transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java 2010-01-08 19:06:06 UTC (rev 181) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java 2010-01-11 15:18:44 UTC (rev 182) @@ -24,6 +24,7 @@ import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.bean.ImportResults; import fr.ifremer.suiviobsmer.entity.Company; import fr.ifremer.suiviobsmer.entity.FishingZone; import fr.ifremer.suiviobsmer.entity.SampleMonth; @@ -107,9 +108,12 @@ @Log void onSuccessFromImportSamplingPlan() throws SuiviObsmerException { try { - int[] result = serviceSampling.importSamplingPlanCsv(samplingPlanCsvFile.getStream()); - layout.getFeedBack().addInfo(result[0] + " lignes du plan importés, " + - result[1] + " refusés (voir documentation)"); + ImportResults result = serviceSampling.importSamplingPlanCsv(samplingPlanCsvFile.getStream()); + layout.getFeedBack().addInfo(result.getNbRowsImported() + " lignes du plan importés, " + + result.getNbRowsRefused() + " refusés."); + for (String error : result.getErrors()) { + layout.getFeedBack().addInfo(error); + } } catch (SuiviObsmerBusinessException eee) { layout.getFeedBack().addError(eee.getMessage()); }