r352 - in trunk: echobase-services/src/main/java/fr/ifremer/echobase/services/configurations echobase-services/src/main/java/fr/ifremer/echobase/services/csv echobase-services/src/main/java/fr/ifremer/echobase/services/importdata echobase-services/src/main/resources/i18n echobase-services/src/test/java/fr/ifremer/echobase/services/importdata echobase-services/src/test/resources echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData echobase-ui/src/main/webapp/WEB-INF/jsp/impo
Author: tchemit Date: 2012-03-11 18:12:24 +0100 (Sun, 11 Mar 2012) New Revision: 352 Url: http://forge.codelutin.com/repositories/revision/echobase/352 Log: acoustic result import Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModel.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModelRow.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModel.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModelRow.java Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportConfiguration.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportMode.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseImport.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/AbstractImportDataService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/ResultsImportService.java trunk/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties trunk/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/importdata/AcousticDataImportServiceIT.java trunk/echobase-services/src/test/resources/log4j.properties trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureResults.java trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureResults.jsp Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportConfiguration.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportConfiguration.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportConfiguration.java 2012-03-11 17:12:24 UTC (rev 352) @@ -45,8 +45,17 @@ /** Selected vessel id to find out transect where to import datas. */ protected String vesselId; + /** resultLabel to store while importing acoustic result. */ + protected String resultLabel; + protected ResultsImportMode importMode; + /** Acoustic result by echotype import. */ + protected final InputFile acousticByEchotypeFile; + + /** Acoustic result by echotype and species import. */ + protected final InputFile acousticByEchotypeAnsSpeciesFile; + /** Region file to import. */ protected final InputFile regionsFile; @@ -69,11 +78,16 @@ l_(locale, "echobase.common.associationFile")); echotypeFile = InputFile.newFile( l_(locale, "echobase.common.echotypeFile")); - lengthAgeKeyFile = InputFile.newFile( l_(locale, "echobase.common.lengthAgeKeyFile")); lengthWeightKeyFile = InputFile.newFile( l_(locale, "echobase.common.lengthWeightKeyFile")); + acousticByEchotypeFile = InputFile.newFile( + l_(locale, "echobase.common.acousticByEchotypeFile")); + acousticByEchotypeAnsSpeciesFile = InputFile.newFile( + l_(locale, "echobase.common.acousticByEchotypeAnsSpeciesFile")); + + } public String getVoyageId() { @@ -100,6 +114,14 @@ this.importMode = importMode; } + public String getResultLabel() { + return resultLabel; + } + + public void setResultLabel(String resultLabel) { + this.resultLabel = resultLabel; + } + public InputFile getRegionsFile() { return regionsFile; } @@ -120,9 +142,19 @@ return lengthWeightKeyFile; } + public InputFile getAcousticByEchotypeFile() { + return acousticByEchotypeFile; + } + + public InputFile getAcousticByEchotypeAnsSpeciesFile() { + return acousticByEchotypeAnsSpeciesFile; + } + @Override public InputFile[] getInputFiles() { return new InputFile[]{regionsFile, associationFile, echotypeFile, - lengthAgeKeyFile, lengthWeightKeyFile}; + lengthAgeKeyFile, lengthWeightKeyFile, + acousticByEchotypeFile, + acousticByEchotypeAnsSpeciesFile}; } } Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportMode.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportMode.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/configurations/ResultsImportMode.java 2012-03-11 17:12:24 UTC (rev 352) @@ -41,6 +41,12 @@ /** Import Regions. */ REGION(n_("echobase.common.resultsImportMode.region")), + /** Import acoustic results by echotype. */ + ACOUSTIC_BY_ECHOTYPE(n_("echobase.common.resultsImportMode.acoustic.byEchotype")), + + /** Import acoustic results by echotype and species. */ + ACOUSTIC_BY_ECHOTYPE_AND_SPECIES(n_("echobase.common.resultsImportMode.acoustic.byEchotypeAndspecies")), + /** Import acoustic results. */ ACOUSTIC(n_("echobase.common.resultsImportMode.acoustic")); Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModel.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModel.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModel.java 2012-03-11 17:12:24 UTC (rev 352) @@ -0,0 +1,95 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services.csv; + +import com.google.common.collect.Lists; +import fr.ifremer.echobase.entities.data.CellDAO; +import fr.ifremer.echobase.entities.data.Echotype; +import fr.ifremer.echobase.entities.data.Result; +import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.entities.references.DataMetadata; +import fr.ifremer.echobase.entities.references.Species; +import org.nuiton.util.csv.ImportRuntimeException; + +import java.util.List; +import java.util.Map; + +/** + * Model to import {@link Result} for esdu cell and echotypes. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class AcousticResultByEchotypeAndSpeciesImportModel extends CsvModelUtil.AbstractImportModel<AcousticResultByEchotypeAndSpeciesImportModelRow> { + + public static List<DataMetadata> getMetas(Map<String, DataMetadata> dataMetadataMap, + String... headers) { + + List<String> metadataNames = Lists.newArrayList(headers); + metadataNames.remove(AcousticResultByEchotypeImportModelRow.PROPERTY_ECHOTYPE); + metadataNames.remove("name"); + + List<DataMetadata> result = Lists.newArrayList(); + + for (String header : headers) { + + DataMetadata dataMetadata = dataMetadataMap.get(header); + if (dataMetadata == null) { + throw new ImportRuntimeException( + "Could not find dataMetadata with name [" + header + "]"); + } + result.add(dataMetadata); + } + return result; + } + + public AcousticResultByEchotypeAndSpeciesImportModel( + char separator, + Map<String, Echotype> echotypeMap, + Map<String, Species> speciesMap, + Voyage voyage, + CellDAO cellDAO, + List<DataMetadata> dataMetadatas) { + super(separator); + + newForeignKeyColumn(AcousticResultByEchotypeAndSpeciesImportModelRow.PROPERTY_ECHOTYPE, Echotype.class, Echotype.PROPERTY_NAME, echotypeMap); + newForeignKeyColumn(AcousticResultByEchotypeAndSpeciesImportModelRow.PROPERTY_SPECIES, Species.class, Species.PROPERTY_BARACOUDA_CODE, speciesMap); + newMandatoryColumn("name", AcousticResultByEchotypeAndSpeciesImportModelRow.PROPERTY_CELL, CsvModelUtil.newCellValueParser(voyage, cellDAO)); + + + for (DataMetadata metadata : dataMetadatas) { + String name = metadata.getName(); + newMandatoryColumn( + name, + CsvModelUtil.newResultValueParser(metadata), + CsvModelUtil.<AcousticResultByEchotypeAndSpeciesImportModelRow>newResultValueSetter()); + } + } + + @Override + public AcousticResultByEchotypeAndSpeciesImportModelRow newEmptyInstance() { + return new AcousticResultByEchotypeAndSpeciesImportModelRow(); + } + +} \ No newline at end of file Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModelRow.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModelRow.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModelRow.java 2012-03-11 17:12:24 UTC (rev 352) @@ -0,0 +1,48 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services.csv; + +import fr.ifremer.echobase.entities.references.Species; + +/** + * Bean used as a row for import of {@link AcousticResultByEchotypeAndSpeciesImportModel}. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class AcousticResultByEchotypeAndSpeciesImportModelRow extends AcousticResultByEchotypeImportModelRow { + + public static final String PROPERTY_SPECIES = "species"; + + protected Species species; + + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + this.species = species; + } + +} Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeAndSpeciesImportModelRow.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModel.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModel.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModel.java 2012-03-11 17:12:24 UTC (rev 352) @@ -0,0 +1,92 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services.csv; + +import com.google.common.collect.Lists; +import fr.ifremer.echobase.entities.data.CellDAO; +import fr.ifremer.echobase.entities.data.Echotype; +import fr.ifremer.echobase.entities.data.Result; +import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.entities.references.DataMetadata; +import org.nuiton.util.csv.ImportRuntimeException; + +import java.util.List; +import java.util.Map; + +/** + * Model to import {@link Result} for esdu cell and echotypes. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class AcousticResultByEchotypeImportModel extends CsvModelUtil.AbstractImportModel<AcousticResultByEchotypeImportModelRow> { + + public static List<DataMetadata> getMetas(Map<String, DataMetadata> dataMetadataMap, + String... headers) { + + List<String> metadataNames = Lists.newArrayList(headers); + metadataNames.remove(AcousticResultByEchotypeImportModelRow.PROPERTY_ECHOTYPE); + metadataNames.remove("name"); + + List<DataMetadata> result = Lists.newArrayList(); + + for (String header : headers) { + + DataMetadata dataMetadata = dataMetadataMap.get(header); + if (dataMetadata == null) { + throw new ImportRuntimeException( + "Could not find dataMetadata with name [" + header + "]"); + } + result.add(dataMetadata); + } + return result; + } + + public AcousticResultByEchotypeImportModel( + char separator, + Map<String, Echotype> echotypeMap, + Voyage voyage, + CellDAO cellDAO, + List<DataMetadata> dataMetadatas) { + super(separator); + + newForeignKeyColumn(AcousticResultByEchotypeImportModelRow.PROPERTY_ECHOTYPE, Echotype.class, Echotype.PROPERTY_NAME, echotypeMap); + newMandatoryColumn("name", AcousticResultByEchotypeImportModelRow.PROPERTY_CELL, CsvModelUtil.newCellValueParser(voyage, cellDAO)); + + + for (DataMetadata metadata : dataMetadatas) { + String name = metadata.getName(); + newMandatoryColumn( + name, + CsvModelUtil.newResultValueParser(metadata), + CsvModelUtil.<AcousticResultByEchotypeImportModelRow>newResultValueSetter()); + } + } + + @Override + public AcousticResultByEchotypeImportModelRow newEmptyInstance() { + return new AcousticResultByEchotypeImportModelRow(); + } + +} \ No newline at end of file Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModelRow.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModelRow.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModelRow.java 2012-03-11 17:12:24 UTC (rev 352) @@ -0,0 +1,75 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services.csv; + +import com.google.common.collect.Lists; +import fr.ifremer.echobase.entities.data.Cell; +import fr.ifremer.echobase.entities.data.Echotype; +import fr.ifremer.echobase.entities.data.Result; + +import java.util.List; + +/** + * Bean used as a row for import of {@link AcousticResultByEchotypeImportModel}. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class AcousticResultByEchotypeImportModelRow implements CsvModelUtil.ResultAble { + + public static final String PROPERTY_ECHOTYPE = "echotype"; + + public static final String PROPERTY_CELL = "cell"; + + protected Echotype echotype; + + protected Cell cell; + + protected List<Result> result = Lists.newArrayList(); + + public Echotype getEchotype() { + return echotype; + } + + public void setEchotype(Echotype echotype) { + this.echotype = echotype; + } + + public Cell getCell() { + return cell; + } + + public void setCell(Cell cell) { + this.cell = cell; + } + + public List<Result> getResult() { + return result; + } + + @Override + public void addResult(Result result) { + this.result.add(result); + } +} Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/AcousticResultByEchotypeImportModelRow.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java 2012-03-11 17:12:24 UTC (rev 352) @@ -24,10 +24,18 @@ package fr.ifremer.echobase.services.csv; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.entities.data.Cell; +import fr.ifremer.echobase.entities.data.CellDAO; +import fr.ifremer.echobase.entities.data.Result; +import fr.ifremer.echobase.entities.data.ResultImpl; +import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.entities.references.DataMetadata; import fr.ifremer.echobase.services.DecoratorService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.StringUtil; import org.nuiton.util.csv.Common; @@ -35,6 +43,7 @@ import org.nuiton.util.csv.ExportableColumn; import org.nuiton.util.csv.ImportExportModel; import org.nuiton.util.csv.ImportModel; +import org.nuiton.util.csv.ImportRuntimeException; import org.nuiton.util.csv.ImportableColumn; import org.nuiton.util.csv.ImportableExportableColumn; import org.nuiton.util.csv.ModelBuilder; @@ -53,6 +62,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Usefull class to build csv import-export models. @@ -521,4 +532,130 @@ return modelBuilder.newColumnForExport(headerName, etValueGetter, valueFormatter); } } + + public static ValueParser<Cell> newCellValueParser(Voyage voyage, CellDAO cellDAO) { + return new CellValueParser(voyage, cellDAO); + } + + public static class CellValueParser implements ValueParser<Cell> { + + private final Voyage voyage; + + private final Pattern ID_PATTERN = Pattern.compile("(.+)[_(.+)]"); + + private final CellDAO cellDAO; + + private final Map<String, Cell> esduCells; + + private CellValueParser(Voyage voyage, CellDAO cellDAO) { + this.voyage = voyage; + this.cellDAO = cellDAO; + esduCells = Maps.newTreeMap(); + } + + @Override + public Cell parse(String value) throws ParseException { + + Cell result; + + // must find it + Matcher matcher = ID_PATTERN.matcher(value); + if (!matcher.find()) { + throw new ImportRuntimeException( + "Can not match cell id pattern with value " + value); + } + + Cell esduCell; + String esduCellId = matcher.group(1); + esduCell = getEsduCell(esduCellId); + + if (esduCell == null) { + throw new ImportRuntimeException( + "Can not found esdu cell [" + esduCellId + "]"); + } + + if (matcher.groupCount() == 1) { + + //using a simple esdu cell + result = esduCell; + } else { + + // using a elementary cell + String elementaryCellId = matcher.group(2); + + result = esduCell.getChildByName(elementaryCellId); + if (result == null) { + throw new ImportRuntimeException( + "Can not found elementary cell [" + + elementaryCellId + "] for esdu cell [" + + esduCellId + "]"); + } + } + return result; + } + + protected Cell getEsduCell(String esduCellId) { + + Cell result = esduCells.get(esduCellId); + + if (result == null) { + try { + List<Cell> cells = cellDAO.findAllByName(esduCellId); + + if (CollectionUtils.isEmpty(cells)) { + throw new ImportRuntimeException( + "Can not find esdu cell with name " + esduCellId); + } + + //TODO Should check this cell is in voyage ? + result = cells.get(0); + + // store it in cache + esduCells.put(esduCellId, result); + + } catch (TopiaException e) { + throw new ImportRuntimeException( + "Can not find esdu cell with name " + esduCellId); + } + } + return result; + } + } + + public static interface ResultAble { + void addResult(Result value); + } + + public static <B extends ResultAble> ValueSetter<B, Result> newResultValueSetter() { + return new ResultValueSetter<B>(); + } + + private static class ResultValueSetter<B extends ResultAble> implements ValueSetter<B, Result> { + + @Override + public void set(B object, Result value) throws Exception { + object.addResult(value); + } + } + + public static ValueParser<Result> newResultValueParser(DataMetadata metadata) { + return new ResultValueParser(metadata); + } + + private static class ResultValueParser implements ValueParser<Result> { + + final DataMetadata metadata; + + public ResultValueParser(DataMetadata metadata) { + this.metadata = metadata; + } + + @Override + public Result parse(String value) throws ParseException { + Result result = new ResultImpl(); + result.setDataMetadata(metadata); + result.setResultValue(value); + return result; + } + } } Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseImport.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseImport.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EchoBaseImport.java 2012-03-11 17:12:24 UTC (rev 352) @@ -23,13 +23,19 @@ */ package fr.ifremer.echobase.services.csv; +import com.google.common.base.Charsets; import org.nuiton.util.StringUtil; import org.nuiton.util.csv.Import; import org.nuiton.util.csv.ImportModel; import org.nuiton.util.csv.ImportRuntimeException; import org.nuiton.util.csv.ImportableColumn; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.LinkedList; @@ -45,6 +51,22 @@ */ public class EchoBaseImport<E> extends Import<E> { + public static String[] getHeader(File file, char charSeprator) { + + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charsets.UTF_8.name())); + try { + String header = reader.readLine(); + String[] result = header.split(charSeprator + ""); + return result; + } finally { + reader.close(); + } + } catch (IOException e) { + throw new ImportRuntimeException("Could not obtain header of file " + file, e); + } + } + public static <E> EchoBaseImport<E> newImport(ImportModel<E> model, InputStream inputStream) { return new EchoBaseImport<E>(model, inputStream); Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/AbstractImportDataService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/AbstractImportDataService.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/AbstractImportDataService.java 2012-03-11 17:12:24 UTC (rev 352) @@ -31,6 +31,11 @@ import fr.ifremer.echobase.entities.EchoBaseEntityEnum; import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.EntityModificationLog; +import fr.ifremer.echobase.entities.data.Category; +import fr.ifremer.echobase.entities.data.CategoryDAO; +import fr.ifremer.echobase.entities.data.Echotype; +import fr.ifremer.echobase.entities.references.ProcessedAge; +import fr.ifremer.echobase.entities.references.ProcessedLength; import fr.ifremer.echobase.entities.references.SexCategory; import fr.ifremer.echobase.entities.references.SizeCategory; import fr.ifremer.echobase.entities.references.Species; @@ -225,4 +230,30 @@ return category; } + + protected Category getResultCategory(CategoryDAO speciesCategoryDAO, + Echotype echotype, + Species species, + ProcessedLength processedLength, + ProcessedAge processedAge) { + Category category = findByProperties( + speciesCategoryDAO, + Category.PROPERTY_ECHOTYPE, echotype, + Category.PROPERTY_SPECIES, species, + Category.PROPERTY_PROCESSED_LENGTH, processedLength, + Category.PROPERTY_PROCESSED_AGE, processedAge + ); + + if (category == null) { + + // create it + category = create(speciesCategoryDAO); + category.setEchotype(echotype); + category.setSpecies(species); + category.setProcessedLength(processedLength); + category.setProcessedAge(processedAge); + } + + return category; + } } Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/ResultsImportService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/ResultsImportService.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/importdata/ResultsImportService.java 2012-03-11 17:12:24 UTC (rev 352) @@ -32,14 +32,18 @@ import fr.ifremer.echobase.InputFile; import fr.ifremer.echobase.entities.EchoBaseEntityEnum; import fr.ifremer.echobase.entities.EchoBaseUser; +import fr.ifremer.echobase.entities.data.Category; +import fr.ifremer.echobase.entities.data.CategoryDAO; import fr.ifremer.echobase.entities.data.Cell; import fr.ifremer.echobase.entities.data.CellDAO; -import fr.ifremer.echobase.entities.data.Voyage; -import fr.ifremer.echobase.entities.references.DepthStratum; import fr.ifremer.echobase.entities.data.Echotype; import fr.ifremer.echobase.entities.data.LengthAgeKey; import fr.ifremer.echobase.entities.data.LengthWeightKey; import fr.ifremer.echobase.entities.data.LengthWeightKeyDAO; +import fr.ifremer.echobase.entities.data.Result; +import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.entities.references.DataMetadata; +import fr.ifremer.echobase.entities.references.DepthStratum; import fr.ifremer.echobase.entities.references.SizeCategory; import fr.ifremer.echobase.entities.references.Species; import fr.ifremer.echobase.entities.references.SpeciesCategory; @@ -48,6 +52,10 @@ import fr.ifremer.echobase.services.ImportException; import fr.ifremer.echobase.services.configurations.ResultsImportConfiguration; import fr.ifremer.echobase.services.configurations.ResultsImportMode; +import fr.ifremer.echobase.services.csv.AcousticResultByEchotypeAndSpeciesImportModel; +import fr.ifremer.echobase.services.csv.AcousticResultByEchotypeAndSpeciesImportModelRow; +import fr.ifremer.echobase.services.csv.AcousticResultByEchotypeImportModel; +import fr.ifremer.echobase.services.csv.AcousticResultByEchotypeImportModelRow; import fr.ifremer.echobase.services.csv.CsvFileImportResult; import fr.ifremer.echobase.services.csv.EchoBaseImport; import fr.ifremer.echobase.services.csv.EchotypeImportModel; @@ -99,7 +107,7 @@ ResultsImportMode importMode = configuration.getImportMode(); switch (importMode) { - case VOYAGE: + case VOYAGE: { // get selected voyage Voyage voyage = getEntityById(Voyage.class, @@ -146,27 +154,52 @@ ); addResultAndLog(result, inputFile, importResult, user); } - break; + } + break; - case REGION: + case ACOUSTIC_BY_ECHOTYPE: { - if (configuration.getRegionsFile().hasFile()) { - CsvFileImportResult importResult = importRegionsFile( - configuration.getRegionsFile()); + // get selected voyage + Voyage voyage = getEntityById(Voyage.class, + configuration.getVoyageId()); - addResultAndLog(result, configuration.getRegionsFile(), - importResult, user); + InputFile inputFile = configuration.getAcousticByEchotypeFile(); + + if (inputFile.hasFile()) { + + CsvFileImportResult importResult = importAcousticByEchotypeFile( + inputFile, + voyage, + configuration.getResultLabel() + ); + addResultAndLog(result, inputFile, importResult, user); } - if (configuration.getAssociationFile().hasFile()) { - CsvFileImportResult importResult = importRegionAssociationFile( - configuration.getAssociationFile()); + } + break; - addResultAndLog(result, configuration.getAssociationFile(), - importResult, user); + case ACOUSTIC_BY_ECHOTYPE_AND_SPECIES: { + + // get selected voyage + Voyage voyage = getEntityById(Voyage.class, + configuration.getVoyageId()); + + InputFile inputFile = + configuration.getAcousticByEchotypeAnsSpeciesFile(); + + if (inputFile.hasFile()) { + + CsvFileImportResult importResult = importAcousticByEchotypeAndSpeciesFile( + inputFile, + voyage, + configuration.getResultLabel() + ); + addResultAndLog(result, inputFile, importResult, user); } - break; + } + break; - case ACOUSTIC: + case REGION: + if (configuration.getRegionsFile().hasFile()) { CsvFileImportResult importResult = importRegionsFile( configuration.getRegionsFile()); @@ -454,4 +487,167 @@ closeReader(reader, inputFile); } } + + private CsvFileImportResult importAcousticByEchotypeFile(InputFile inputFile, + Voyage voyage, + String resultLabel) throws ImportException { + + if (log.isInfoEnabled()) { + log.info("Starts import of acoustic result by echotype from file " + + inputFile.getFileName()); + } + + // first get header of file to detect which results to import + String[] header = EchoBaseImport.getHeader(inputFile.getFile(), + getCsvSeparator()); + + + CsvFileImportResult importResult = new CsvFileImportResult( + inputFile.getFileName()); + + Map<String, DataMetadata> dataMetadataMap = getEntitiesMap( + DataMetadata.class, + EchoBaseFunctions.DATA_METADATA_NAME); + + + Map<String, Echotype> echotypeMap = getEntitiesMap( + Echotype.class, + EchoBaseFunctions.ECHOTYPE_NAME); + List<DataMetadata> metas = + AcousticResultByEchotypeImportModel.getMetas(dataMetadataMap, header); + + CellDAO cellDAO = (CellDAO) getDAO(Cell.class); + + AcousticResultByEchotypeImportModel csvModel = new AcousticResultByEchotypeImportModel( + serviceContext.getConfiguration().getCsvSeparator(), + echotypeMap, + voyage, + cellDAO, + metas); + + CategoryDAO categoryDAO = (CategoryDAO) getDAO(Category.class); + + Reader reader = getInputFileReader(inputFile); + try { + Import<AcousticResultByEchotypeImportModelRow> importer = + EchoBaseImport.newImport(csvModel, reader); + + for (AcousticResultByEchotypeImportModelRow row : importer) { + + Cell cell = row.getCell(); + + Category category = getResultCategory(categoryDAO, + row.getEchotype(), + null, + null, + null); + + List<Result> results = row.getResult(); + + TopiaDAO<Result> dao = getDAO(Result.class); + + for (Result result : results) { + + result.setCategory(category); + result.setResultLabel(resultLabel); + + Result resultCreated = create(dao, result); + + cell.addResult(resultCreated); + + importResult.incrementsNumberCreated(EchoBaseEntityEnum.Result); + } + } + + return importResult; + } catch (ImportRuntimeException e) { + throw new ImportException(getLocale(), inputFile, e); + } finally { + closeReader(reader, inputFile); + } + } + + private CsvFileImportResult importAcousticByEchotypeAndSpeciesFile(InputFile inputFile, + Voyage voyage, + String resultLabel) throws ImportException { + + if (log.isInfoEnabled()) { + log.info("Starts import of acoustic result by echotype from file " + + inputFile.getFileName()); + } + + // first get header of file to detect which results to import + String[] header = EchoBaseImport.getHeader(inputFile.getFile(), + getCsvSeparator()); + + + CsvFileImportResult importResult = new CsvFileImportResult( + inputFile.getFileName()); + + Map<String, DataMetadata> dataMetadataMap = getEntitiesMap( + DataMetadata.class, + EchoBaseFunctions.DATA_METADATA_NAME); + + Map<String, Echotype> echotypeMap = getEntitiesMap( + Echotype.class, + EchoBaseFunctions.ECHOTYPE_NAME); + + Map<String, Species> speciesMap = getEntitiesMap( + Species.class, + EchoBaseFunctions.SPECIES_BARACOUDA_CODE); + + List<DataMetadata> metas = + AcousticResultByEchotypeImportModel.getMetas(dataMetadataMap, header); + + CellDAO cellDAO = (CellDAO) getDAO(Cell.class); + + AcousticResultByEchotypeAndSpeciesImportModel csvModel = new AcousticResultByEchotypeAndSpeciesImportModel( + serviceContext.getConfiguration().getCsvSeparator(), + echotypeMap, + speciesMap, + voyage, + cellDAO, + metas); + + CategoryDAO categoryDAO = (CategoryDAO) getDAO(Category.class); + + Reader reader = getInputFileReader(inputFile); + try { + EchoBaseImport<AcousticResultByEchotypeAndSpeciesImportModelRow> importer = + EchoBaseImport.newImport(csvModel, reader); + + for (AcousticResultByEchotypeAndSpeciesImportModelRow row : importer) { + + Cell cell = row.getCell(); + + Category category = getResultCategory(categoryDAO, + row.getEchotype(), + row.getSpecies(), + null, + null); + + List<Result> results = row.getResult(); + + TopiaDAO<Result> dao = getDAO(Result.class); + + for (Result result : results) { + + result.setCategory(category); + result.setResultLabel(resultLabel); + + Result resultCreated = create(dao, result); + + cell.addResult(resultCreated); + + importResult.incrementsNumberCreated(EchoBaseEntityEnum.Result); + } + } + + return importResult; + } catch (ImportRuntimeException e) { + throw new ImportException(getLocale(), inputFile, e); + } finally { + closeReader(reader, inputFile); + } + } } Modified: trunk/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties =================================================================== --- trunk/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties 2012-03-11 17:12:24 UTC (rev 352) @@ -1,5 +1,7 @@ csv.import.error.missingMandatoryHeaders= csv.import.error.unrecognizedHeaders= +echobase.common.acousticByEchotypeAnsSpeciesFile= +echobase.common.acousticByEchotypeFile= echobase.common.associationFile= echobase.common.biometrySampleFile= echobase.common.cellPositionReference.end= @@ -22,6 +24,8 @@ echobase.common.operationMetadataFile= echobase.common.regionsFile= echobase.common.resultsImportMode.acoustic= +echobase.common.resultsImportMode.acoustic.byEchotype= +echobase.common.resultsImportMode.acoustic.byEchotypeAndspecies= echobase.common.resultsImportMode.region= echobase.common.resultsImportMode.voyage= echobase.common.subSampleFile= Modified: trunk/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties =================================================================== --- trunk/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties 2012-03-11 17:12:24 UTC (rev 352) @@ -1,5 +1,7 @@ csv.import.error.missingMandatoryHeaders= csv.import.error.unrecognizedHeaders= +echobase.common.acousticByEchotypeAnsSpeciesFile=Fichier résultat acoustic par échotype et espèces +echobase.common.acousticByEchotypeFile=Fichier résultat acoustic par échotype echobase.common.associationFile=Fichier d'associations de cellules echobase.common.biometrySampleFile=Fichier BiometrySample echobase.common.cellPositionReference.end=Fin @@ -22,6 +24,8 @@ echobase.common.operationMetadataFile=Fichier Méta-données opération echobase.common.regionsFile=Fichier des régions echobase.common.resultsImportMode.acoustic=Import des résultats acoustiques +echobase.common.resultsImportMode.acoustic.byEchotype=Import des résultats acoustiques par echotype +echobase.common.resultsImportMode.acoustic.byEchotypeAndspecies=Import des résultats acoustiques par echotype et espèce echobase.common.resultsImportMode.region=Import des cellules régions d'un voyage echobase.common.resultsImportMode.voyage=Import des résultats du voyage echobase.common.subSampleFile=Fichier SubSample Modified: trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/importdata/AcousticDataImportServiceIT.java =================================================================== --- trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/importdata/AcousticDataImportServiceIT.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/importdata/AcousticDataImportServiceIT.java 2012-03-11 17:12:24 UTC (rev 352) @@ -95,13 +95,13 @@ AcousticDataImportService service = getService(AcousticDataImportService.class); - //FIXME : remove this when db will have such data - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES18-11"); - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES38B"); - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES70-7C"); - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES120-7"); - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES200-7C"); - service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ME70"); +// //FIXME : remove this when db will have such data +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES18-11"); +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES38B"); +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES70-7C"); +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES120-7"); +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ES200-7C"); +// service.create(getDAO(AcousticInstrument.class), AcousticInstrument.PROPERTY_ID, "ME70"); List<CsvFileImportResult> result = service.doImport(conf, createFakeUser()); Modified: trunk/echobase-services/src/test/resources/log4j.properties =================================================================== --- trunk/echobase-services/src/test/resources/log4j.properties 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-services/src/test/resources/log4j.properties 2012-03-11 17:12:24 UTC (rev 352) @@ -30,3 +30,4 @@ # package level log4j.logger.fr.ifremer.echobase=INFO +log4j.logger.fr.ifremer.echobase.services.importdata.AcousticDataImportService=DEBUG Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureResults.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureResults.java 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/importData/ConfigureResults.java 2012-03-11 17:12:24 UTC (rev 352) @@ -87,12 +87,18 @@ } @InputConfig(methodName = "input") - public String modeAcoustic() throws Exception { + public String modeAcousticByEchotype() throws Exception { return execute(); } @InputConfig(methodName = "input") + public String modeAcousticByEchotypeAndSpecies() throws Exception { + + return execute(); + } + + @InputConfig(methodName = "input") public String modeRegion() throws Exception { return execute(); Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureResults.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureResults.jsp 2012-03-11 17:09:51 UTC (rev 351) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/importData/configureResults.jsp 2012-03-11 17:12:24 UTC (rev 352) @@ -82,10 +82,8 @@ label='%{getText("echobase.common.echotypeFile")}'/> </fieldset> - <br/> <s:submit action="ConfigureResults-modeVoyage" key='echobase.action.import'/> - </s:form> <s:form id="REGION" namespace="/importData" method="POST" @@ -109,13 +107,38 @@ label='%{getText("echobase.common.associationFile")}'/> </fieldset> - <br/> <s:submit action="ConfigureResults-modeRegion" key='echobase.action.import'/> +</s:form> +<s:form id="ACOUSTIC_BY_ECHOTYPE" namespace="/importData" method="POST" + enctype="multipart/form-data" cssClass="hidden importMode"> + + <fieldset> + <legend> + <s:text name="echobase.legend.importData.configure"/> + </legend> + + <s:hidden key="model.importMode" value="ACOUSTIC" label=''/> + + <s:select key="model.voyageId" required="true" + label='%{getText("echobase.common.voyage")}' + list="voyages" headerKey="" headerValue=""/> + + <s:textfield key="model.resultLabel" size="40" required="true" + label='%{getText("echobase.common.resultLabel")}'/> + + <s:file key="acousticByEchotypeFile" required="true" + label='%{getText("echobase.common.acousticByEchotypeFile")}'/> + + </fieldset> + <br/> + <s:submit action="ConfigureResults-modeAcousticByEchotype" + key='echobase.action.import'/> </s:form> -<s:form id="ACOUSTIC" namespace="/importData" method="POST" +<s:form id="ACOUSTIC_BY_ECHOTYPE_AND_SPECIES" namespace="/importData" + method="POST" enctype="multipart/form-data" cssClass="hidden importMode"> <fieldset> @@ -129,19 +152,14 @@ label='%{getText("echobase.common.voyage")}' list="voyages" headerKey="" headerValue=""/> - <sj:select key="model.vesselId" required="true" - label='%{getText("echobase.common.vessel")}'/> + <s:textfield key="model.resultLabel" size="40" required="true" + label='%{getText("echobase.common.resultLabel")}'/> - <s:file key="regionsFile" required="true" - label='%{getText("echobase.common.regionsFile")}'/> + <s:file key="acousticByEchotypeFile" required="true" + label='%{getText("echobase.common.acousticByEchotypeAndSpeciesFile")}'/> - <s:file key="associationFile" required="true" - label='%{getText("echobase.common.associationFile")}'/> - </fieldset> - <br/> - <s:submit action="ConfigureResults-modeAcoustic" + <s:submit action="ConfigureResults-modeAcousticByEchotypeAndSpecies" key='echobase.action.import'/> - </s:form> \ No newline at end of file
participants (1)
-
tchemit@users.forge.codelutin.com