Author: tchemit Date: 2012-01-10 17:44:31 +0100 (Tue, 10 Jan 2012) New Revision: 255 Url: http://forge.codelutin.com/repositories/revision/echobase/255 Log: Anomalie #681: Mauvaise mod?\195?\169lisation de la liaison Echotype -> Species Added: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/ trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/EchotypeDAOImpl.java Modified: trunk/echobase-entities/src/main/xmi/echobase.zargo trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EntityCsvModel.java trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EchotypeLoader.java trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EntityLoader.java trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/VoyageLoader.java trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/AbstractLoaderIT.java trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/EchotypeLoaderIT.java trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/VoyageLoaderIT.java Added: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/EchotypeDAOImpl.java =================================================================== --- trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/EchotypeDAOImpl.java (rev 0) +++ trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/EchotypeDAOImpl.java 2012-01-10 16:44:31 UTC (rev 255) @@ -0,0 +1,50 @@ +/* + * #%L + * EchoBase :: Entities + * + * $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.entities.references; + +import org.nuiton.topia.TopiaException; + +import java.util.List; + +/** + * User {@link EchotypeDAO} implementation. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public class EchotypeDAOImpl<E extends Echotype> extends EchotypeDAOAbstract<E> { + + @Override + public Echotype findByIdAndSpecies(Integer id, Species species) throws TopiaException { + List<E> allById = findAllById(id); + Echotype result = null; + for (E echotype : allById) { + if (echotype.getSpecies().contains(species)) { + result = echotype; + break; + } + } + return result; + } +} Property changes on: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/references/EchotypeDAOImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/echobase-entities/src/main/xmi/echobase.zargo =================================================================== (Binary files differ) 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-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/CsvModelUtil.java 2012-01-10 16:44:31 UTC (rev 255) @@ -40,6 +40,7 @@ import java.sql.Timestamp; import java.text.ParseException; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Locale; @@ -85,6 +86,11 @@ return new ForeignKeyValue<E>(type, universe); } + public static <E extends TopiaEntity> ForeignKeyValueForAssociation<E> newForeignKeyValueAssociation(Class<E> type, Collection<E> entitites, Function<E, String> transform) { + Map<String, E> universe = Maps.uniqueIndex(entitites, transform); + return new ForeignKeyValueForAssociation<E>(type, universe); + } + public static <E extends TopiaEntity> ForeignKeyDecoratedValue<E> newForeignKeyDecoratedValue(Class<E> entityType, DecoratorService decoratorService, Locale locale) { return new ForeignKeyDecoratedValue<E>(entityType, decoratorService, locale); @@ -246,6 +252,37 @@ } } + public static class ForeignKeyValueForAssociation<E extends TopiaEntity> implements ValueParser<Collection<E>> { + + protected final Class<E> entityType; + + protected final Map<String, E> universe; + + public ForeignKeyValueForAssociation(Class<E> entityType, + Map<String, E> universe) { + this.entityType = entityType; + this.universe = universe; + } + + @Override + public Collection<E> parse(String value) throws ParseException { + E result = null; + if (StringUtils.isNotBlank(value)) { + + // get entity from universe + result = universe.get(value); + + if (result == null) { + + // can not find entity this is a big problem for us... + throw new EchoBaseTechnicalException( + "Could not find entity with name " + value); + } + } + return Arrays.asList(result); + } + } + public static class ForeignKeyDecoratedValue<E extends TopiaEntity> implements ValueFormatter<E> { protected final Class<E> entityType; Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EntityCsvModel.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EntityCsvModel.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/csv/EntityCsvModel.java 2012-01-10 16:44:31 UTC (rev 255) @@ -118,6 +118,19 @@ ); } + public <E extends TopiaEntity> void addForeignKeyForAssociationForImport(String headerName, + String propertyName, + Class<E> entityType, + Collection<E> universe, + Function<E, String> transform) { + + modelBuilder.newMandatoryColumn( + headerName, + propertyName, + CsvModelUtil.newForeignKeyValueAssociation(entityType, universe, transform) + ); + } + public <E extends TopiaEntity> void addForeignKeyForImport(String propertyName, Class<E> entityType, Collection<E> universe) { Modified: trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EchotypeLoader.java =================================================================== --- trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EchotypeLoader.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EchotypeLoader.java 2012-01-10 16:44:31 UTC (rev 255) @@ -23,16 +23,26 @@ */ package fr.ifremer.echobase.tools.loaders; +import com.google.common.collect.Maps; import fr.ifremer.echobase.EchoBaseFunctions; +import fr.ifremer.echobase.entities.EchoBaseEntityEnum; +import fr.ifremer.echobase.entities.meta.AssociationMeta; import fr.ifremer.echobase.entities.meta.TableMeta; import fr.ifremer.echobase.entities.references.DepthStratum; import fr.ifremer.echobase.entities.references.Echotype; import fr.ifremer.echobase.entities.references.EchotypeCategory; import fr.ifremer.echobase.entities.references.Species; +import fr.ifremer.echobase.services.DbEditorService; import fr.ifremer.echobase.services.csv.EntityCsvModel; import fr.ifremer.echobase.tools.FileType; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.csv.Import; +import java.io.File; +import java.io.IOException; import java.util.List; +import java.util.Map; /** * {@link Echotype} loader. @@ -42,11 +52,28 @@ */ public class EchotypeLoader extends EntityLoader<Echotype> { + /** Logger. */ + private static final Log log = LogFactory.getLog(EchotypeLoader.class); + public EchotypeLoader() { - super(Echotype.class, FileType.NEW); + super(Echotype.class, + new EchoBaseEntityEnum[]{EchoBaseEntityEnum.Species}, + FileType.NEW); } @Override + protected void exportAssociations(File outputDir, + FileType targetType) throws IOException { + super.exportAssociations(outputDir, targetType); + + // also export echotype associations (echotype are references) + AssociationMeta associationMeta = + getMeta().getAssociations(Echotype.PROPERTY_SPECIES); + + exportAssociation(outputDir, targetType, associationMeta); + } + + @Override protected EntityCsvModel<Echotype> createCsvImportModel(TableMeta meta) { List<Species> species = getEntities(Species.class); @@ -62,11 +89,48 @@ "ECHOS";"IMAGES";"LIBELLE_DESCRIPTION_DEVIATION";"ID_DESCRIPTION_DEVIATION";"GENRE_ESP;TYPE_DEVIATION" */ model.addDefaultColumn("ID_DESCRIPTION_DEVIATION", Echotype.PROPERTY_ID, int.class); - model.newMandatoryColumn("ECHOS",Echotype.PROPERTY_NAME); + model.newMandatoryColumn("ECHOS", Echotype.PROPERTY_NAME); model.newMandatoryColumn("LIBELLE_DESCRIPTION_DEVIATION", Echotype.PROPERTY_MEANING); - model.addForeignKeyForImport("GENRE_ESP", Echotype.PROPERTY_SPECIES, Species.class, species, EchoBaseFunctions.SPECIES_BARACOUDA_CODE); model.addForeignKeyForImport("IMAGES", Echotype.PROPERTY_DEPTH_STRATUM, DepthStratum.class, depthStratums, EchoBaseFunctions.DEPTH_STRATUM_ID); model.addForeignKeyForImport("TYPE_DEVIATION", Echotype.PROPERTY_ECHOTYPE_CATEGORY, EchotypeCategory.class, echotypeCategorys, EchoBaseFunctions.ECHO_TYPE_CATEGORY_NAME); + model.addForeignKeyForAssociationForImport("GENRE_ESP", Echotype.PROPERTY_SPECIES, Species.class, species, EchoBaseFunctions.SPECIES_BARACOUDA_CODE); return model; } + + @Override + protected void importNewEntities(DbEditorService dbEditorService, + TableMeta meta, + Import<Echotype> importer) { + + Map<String, String> keystoTopiaId = Maps.newHashMap(); + + for (Echotype entity : importer) { + + // key for this echotype : id + depthStratum + String key = entity.getId() + "_" + entity.getDepthStratum().getId(); + + String topiaId = keystoTopiaId.get(key); + + if (topiaId == null) { + + // create this new echotype + dbEditorService.saveEntity(meta, + "", + entity, + null, + false + ); + + topiaId = entity.getTopiaId(); + keystoTopiaId.put(key, topiaId); + } + + // just push the species of this echotype + // the saveEntity can not save it + Species species = entity.getSpecies().iterator().next(); + + Echotype echotype = getEntityById(Echotype.class, topiaId); + echotype.addSpecies(species); + } + } } Modified: trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EntityLoader.java =================================================================== --- trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EntityLoader.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/EntityLoader.java 2012-01-10 16:44:31 UTC (rev 255) @@ -216,15 +216,7 @@ DbEditorService dbEditorService = getService(DbEditorService.class); - for (E entity : importer) { - - dbEditorService.saveEntity(meta, - "", - entity, - null, - false - ); - } + importNewEntities(dbEditorService, meta, importer); } finally { importer.close(); @@ -238,9 +230,12 @@ bf.close(); } - File out = getTableFile(outputDir, meta, FileType.NEW); +// File out = getTableFile(outputDir, meta, FileType.NEW); +// getExportService().exportDatas(meta, out); - getExportService().exportDatas(meta, out); + exportDatas(outputDir, FileType.NEW); + + exportAssociations(outputDir, FileType.ASSOCIATION); } finally { if (cleanTransaction) { serviceContext.getTransaction().rollbackTransaction(); @@ -248,6 +243,18 @@ } } + protected void importNewEntities(DbEditorService dbEditorService, TableMeta meta, Import<E> importer) { + for (E entity : importer) { + + dbEditorService.saveEntity(meta, + "", + entity, + null, + false + ); + } + } + public final void generateBaracoudaEntities(Database db, File outputDir, boolean cleanTransaction) throws IOException, TopiaException, ParseException { Modified: trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/VoyageLoader.java =================================================================== --- trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/VoyageLoader.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/main/java/fr/ifremer/echobase/tools/loaders/VoyageLoader.java 2012-01-10 16:44:31 UTC (rev 255) @@ -35,6 +35,7 @@ import fr.ifremer.echobase.entities.meta.TableMeta; import fr.ifremer.echobase.entities.references.AreaOfOperation; import fr.ifremer.echobase.entities.references.Echotype; +import fr.ifremer.echobase.entities.references.EchotypeDAO; import fr.ifremer.echobase.entities.references.Mission; import fr.ifremer.echobase.entities.references.Species; import fr.ifremer.echobase.services.csv.CsvModelUtil; @@ -161,7 +162,7 @@ meta.getAssociations(Voyage.PROPERTY_ECHOTYPE); try { - TopiaDAO<Echotype> echotypeDAO = getDAO(Echotype.class); + EchotypeDAO echotypeDAO = (EchotypeDAO) getDAO(Echotype.class); BufferedReader bf = new BufferedReader(new FileReader(csvfile)); try { @@ -174,11 +175,11 @@ String specieEchotype = (String) entity.get("GENRE_ESP"); Voyage voayge = getFK(voyages, campagneName); Species species = getFK(speciess, specieEchotype); - Echotype echotype = echotypeDAO.findByProperties( - Echotype.PROPERTY_ID, Integer.valueOf(idEchotype), - Echotype.PROPERTY_SPECIES, species + Echotype echotype = echotypeDAO.findByIdAndSpecies( + Integer.valueOf(idEchotype), + species ); - Preconditions.checkNotNull(echotype, String.format("Could not find echotype with (id,species) = (%S,%s)", idEchotype, specieEchotype)); + Preconditions.checkNotNull(echotype, String.format("Could not find echotype with (id,species) = (%s,%s)", idEchotype, specieEchotype)); voayge.addEchotype(echotype); } } finally { Modified: trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/AbstractLoaderIT.java =================================================================== --- trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/AbstractLoaderIT.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/AbstractLoaderIT.java 2012-01-10 16:44:31 UTC (rev 255) @@ -205,7 +205,7 @@ loadDependencies(meta, dones); } - private void loadDependencies(MetaFilenameAware meta, + protected void loadDependencies(MetaFilenameAware meta, Set<MetaFilenameAware> dones) throws IOException, TopiaException { Modified: trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/EchotypeLoaderIT.java =================================================================== --- trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/EchotypeLoaderIT.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/EchotypeLoaderIT.java 2012-01-10 16:44:31 UTC (rev 255) @@ -35,7 +35,7 @@ public class EchotypeLoaderIT extends AbstractLoaderIT<Echotype, EchotypeLoader> { public EchotypeLoaderIT() { - super(EchotypeLoader.class, 183, 0); + super(EchotypeLoader.class, 43, 0); } @Test Modified: trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/VoyageLoaderIT.java =================================================================== --- trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/VoyageLoaderIT.java 2012-01-10 16:37:09 UTC (rev 254) +++ trunk/echobase-tools/src/test/java/fr/ifremer/echobase/tools/loaders/VoyageLoaderIT.java 2012-01-10 16:44:31 UTC (rev 255) @@ -27,6 +27,8 @@ import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.meta.AssociationMeta; import fr.ifremer.echobase.entities.meta.MetaFilenameAware; +import fr.ifremer.echobase.entities.meta.TableMeta; +import fr.ifremer.echobase.entities.references.Echotype; import fr.ifremer.echobase.tools.FileType; import org.junit.Assert; import org.junit.Test; @@ -66,6 +68,11 @@ loadDependencies(EchoBaseEntityEnum.Voyage, dones); + TableMeta table = serviceContext.getDbMeta().getTable(EchoBaseEntityEnum.Echotype); + AssociationMeta echotypeAssociation = + table.getAssociations(Echotype.PROPERTY_SPECIES); + loadDependencies(echotypeAssociation, dones); + AssociationMeta associationMeta = loader.getMeta().getAssociations(Voyage.PROPERTY_ECHOTYPE);