Author: tchemit Date: 2011-12-08 06:33:38 +0100 (Thu, 08 Dec 2011) New Revision: 157 Url: http://forge.codelutin.com/repositories/revision/echobase/157 Log: - Use new MetaFilenameAware api - impact model changes Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbImportExportService.java trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2011-12-08 05:25:25 UTC (rev 156) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2011-12-08 05:33:38 UTC (rev 157) @@ -23,18 +23,22 @@ */ package fr.ifremer.echobase.services; +import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.entities.EchoBaseEntityEnum; import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.EntityModificationLog; +import fr.ifremer.echobase.entities.meta.AssociationMeta; import fr.ifremer.echobase.entities.meta.ColumnMeta; import fr.ifremer.echobase.entities.meta.DbMeta; +import fr.ifremer.echobase.entities.meta.MetaFilenameAware; import fr.ifremer.echobase.entities.meta.TableMeta; import fr.ifremer.echobase.services.models.CsvModelUtil; +import fr.ifremer.echobase.services.models.EntityAssociationCsvModel; import fr.ifremer.echobase.services.models.EntityCsvModel; -import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,9 +48,16 @@ import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.beans.BeanMonitor; import org.nuiton.util.beans.PropertyDiff; -import org.nuiton.util.csv.*; +import org.nuiton.util.csv.Export; +import org.nuiton.util.csv.ExportableColumn; +import org.nuiton.util.csv.Import; +import org.nuiton.util.csv.ImportExportModel; +import org.nuiton.util.csv.ImportableColumn; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -102,10 +113,11 @@ public <E extends TopiaEntity> List<E> getEntities(TableMeta tableMeta, Pager pager, String sidx, - Boolean ascendantOrder) { + Boolean ascendantOrder, + String extraWhereQuery) { List<E> result; - EchoBaseEntityEnum entityEnum = tableMeta.getEntityEnum(); + EchoBaseEntityEnum entityEnum = tableMeta.getSource(); try { TopiaDAO<E> dao = getDAO(entityEnum); @@ -114,6 +126,8 @@ countQuery.addSelect("count(*)"); int count = dao.countByQuery(countQuery); + TopiaQuery query = dao.createQuery("e"); + if (pager != null) { pager.setRecords(count); pager.computeIndexesAndPageCount(); @@ -130,7 +144,7 @@ log.debug("pageCount= " + pager.getPageCount()); } - TopiaQuery query = dao.createQuery("e"); + if (StringUtils.isNotEmpty(sidx)) { if (ascendantOrder) { query.addOrder(sidx); @@ -139,12 +153,16 @@ } } query.setLimit(from, to - 1); - result = dao.findAllByQuery(query); + if (StringUtils.isNotEmpty(extraWhereQuery)) { + query.addWhere(extraWhereQuery); + } } else { - // Get all - result = dao.findAll(); + if (StringUtils.isNotEmpty(extraWhereQuery)) { + query.addWhere(extraWhereQuery); + } } + result = dao.findAllByQuery(query); return result; } catch (TopiaException eee) { throw new EchoBaseTechnicalException("Could not obtain data", eee); @@ -160,9 +178,10 @@ TableMeta meta = getTableMeta(entityType); List<TopiaEntity> entities = getEntities(meta, - pager, - sidx, - ascendantOrder + pager, + sidx, + ascendantOrder, + null ); Map<?, ?>[] rows = new Map[entities.size()]; @@ -180,7 +199,7 @@ public Map<?, ?> getData(TableMeta tableMeta, String topiaId) { - EchoBaseEntityEnum entityEnum = tableMeta.getEntityEnum(); + EchoBaseEntityEnum entityEnum = tableMeta.getSource(); try { TopiaDAO<?> dao = getDAO(entityEnum.getContract()); TopiaEntity entity = dao.findByTopiaId(topiaId); @@ -218,10 +237,10 @@ } saveEntity(meta, - "Modification utilisateur", - entity, - user, - false + "Modification utilisateur", + entity, + user, + false ); commitTransaction("Could not commit transaction"); } @@ -237,21 +256,20 @@ String messagePrefix = "Import du fichier " + importFileName + " le " + newDate(); CsvImportResult result = CsvImportResult.newResult(entityType, - importFileName, - createIfNotFound); + importFileName, + createIfNotFound); BufferedReader bf = new BufferedReader(new FileReader(importFile)); try { - Import<TopiaEntity> importer = Import.newImport(csvModel, bf); try { for (TopiaEntity entity : importer) { boolean create = saveEntity(meta, - messagePrefix, - entity, - user, - createIfNotFound + messagePrefix, + entity, + user, + createIfNotFound ); if (create) { @@ -279,12 +297,10 @@ return result; } - public String exportDatas(EchoBaseEntityEnum entityType) { + public String exportDatas(TableMeta tableMeta) { - TableMeta tableMeta = getTableMeta(entityType); + List<TopiaEntity> datas = getEntities(tableMeta, null, null, null, null); - List<TopiaEntity> datas = getEntities(tableMeta, null, null, null); - ImportExportModel<TopiaEntity> model = buildForExport(tableMeta); Export<TopiaEntity> export = Export.newExport(model, datas); @@ -296,38 +312,49 @@ } } - public void exportDatas(EchoBaseEntityEnum entityType, File file) { + public String exportDatas(AssociationMeta associationMeta) { - TableMeta tableMeta = getTableMeta(entityType); + TableMeta tableMeta = getTableMeta(associationMeta.getSource()); - List<TopiaEntity> datas = getEntities(tableMeta, null, null, null); + List<TopiaEntity> datas = getEntities(tableMeta, null, null, null, "size(e." + associationMeta.getName() + ") > 0"); - ImportExportModel<TopiaEntity> model = buildForExport(tableMeta); + ImportExportModel<TopiaEntity> model = buildForExport(associationMeta); Export<TopiaEntity> export = Export.newExport(model, datas); try { - InputStream stream = export.startExport(); - try { - Writer writer = new FileWriter(file); - try { - IOUtils.copy( - stream, - writer, - "utf-8" + return export.startExportAsString(); + } catch (Exception eee) { + throw new EchoBaseTechnicalException("Can not export datas", eee); + } + } - ); - } finally { - writer.close(); - } - } finally { - stream.close(); - } + public void exportDatas(TableMeta tableMeta, File file) { + + if (log.isInfoEnabled()) { + log.info("Export table " + tableMeta + " to " + file); + } + try { + String content = exportDatas(tableMeta); + FileUtils.write(file, content, Charsets.UTF_8.name()); } catch (Exception eee) { throw new EchoBaseTechnicalException("Can not export datas", eee); } } + public void exportDatas(AssociationMeta associationMeta, File file) { + + if (log.isInfoEnabled()) { + log.info("Export association " + associationMeta + " to " + file); + } + try { + String content = exportDatas(associationMeta); + FileUtils.write(file, content, Charsets.UTF_8.name()); + } catch (Exception eee) { + throw new EchoBaseTechnicalException("Can not export datas", eee); + } + } + public boolean saveEntity(TableMeta tableMeta, String messagePrefix, TopiaEntity entity, @@ -339,7 +366,7 @@ String id = entity.getTopiaId(); try { - TopiaDAO<TopiaEntity> dao = getDAO(tableMeta.getEntityEnum()); + TopiaDAO<TopiaEntity> dao = getDAO(tableMeta.getSource()); TopiaEntity entityToSave; @@ -446,9 +473,9 @@ } } buffer.append(String.format("\n Propriété '%s', ancienne valeur : %s, nouvelle valeur : %s", - propertyName, - sourceValue, - targetValue + propertyName, + sourceValue, + targetValue )); } } @@ -457,7 +484,7 @@ getDAO(EntityModificationLog.class); dao.create( - EntityModificationLog.PROPERTY_ENTITY_TYPE, tableMeta.getEntityEnum().name(), + EntityModificationLog.PROPERTY_ENTITY_TYPE, tableMeta.getSource().name(), EntityModificationLog.PROPERTY_ENTITY_ID, topiaId, EntityModificationLog.PROPERTY_MODIFICATION_USER, user.getEmail(), EntityModificationLog.PROPERTY_MODIFICATION_DATE, newDate(), @@ -491,6 +518,16 @@ return row; } + public <E extends TopiaEntity> EntityCsvModel<E> buildForImport(MetaFilenameAware meta) { + if (meta instanceof AssociationMeta) { + return buildForImport((AssociationMeta) meta); + } + if (meta instanceof TableMeta) { + return buildForImport((TableMeta) meta); + } + throw new IllegalStateException("Can't do a thing with " + meta); + } + public <E extends TopiaEntity> EntityCsvModel<E> buildForImport(TableMeta meta) { EntityCsvModel<E> model = EntityCsvModel.newModel( @@ -514,6 +551,15 @@ return model; } + public <E extends TopiaEntity> ImportExportModel<E> buildForExport(AssociationMeta associationMeta) { + + ImportExportModel<E> model = EntityAssociationCsvModel.newModel( + getConfiguration().getCsvSeparator(), + associationMeta + ); + return model; + } + public <E extends TopiaEntity> ImportExportModel<E> buildForExport(TableMeta meta) { EntityCsvModel<E> model = EntityCsvModel.newModel( Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbImportExportService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbImportExportService.java 2011-12-08 05:25:25 UTC (rev 156) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbImportExportService.java 2011-12-08 05:33:38 UTC (rev 157) @@ -26,23 +26,19 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.echobase.EchoBaseTechnicalException; -import fr.ifremer.echobase.entities.EchoBaseDAOHelper; import fr.ifremer.echobase.entities.EchoBaseEntityEnum; import fr.ifremer.echobase.entities.EchoBaseUser; import fr.ifremer.echobase.entities.EntitiesUtil; 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.services.models.EntityAssociationCsvModel; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.framework.TopiaQuery; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.util.FileUtil; -import org.nuiton.util.csv.Export; import org.nuiton.util.csv.Import; import org.nuiton.util.csv.ImportExportModel; @@ -81,14 +77,14 @@ ZipFile zipFile = new ZipFile(file); try { - FileEntry[] entries = getEntries(); + MetaFilenameAware[] entries = getEntries(); List<String> missingEntries = Lists.newArrayList(); - Map<FileEntry, ZipEntry> entriestoConsume = Maps.newLinkedHashMap(); + Map<MetaFilenameAware, ZipEntry> entriestoConsume = Maps.newLinkedHashMap(); // check that all mandatories - for (FileEntry entry : entries) { + for (MetaFilenameAware entry : entries) { String filename = entry.getFilename(); ZipEntry zipEntry = zipFile.getEntry(filename); @@ -108,10 +104,10 @@ } // consume all found entries - for (Map.Entry<FileEntry, ZipEntry> entry : + for (Map.Entry<MetaFilenameAware, ZipEntry> entry : entriestoConsume.entrySet()) { - FileEntry entryDef = entry.getKey(); + MetaFilenameAware entryDef = entry.getKey(); ZipEntry value = entry.getValue(); CsvImportResult csvResult = CsvImportResult.newResult( entryDef.getSource(), @@ -145,25 +141,25 @@ */ public File exportDb(String fileName) { File tempDirectory = new File(FileUtils.getTempDirectory(), - "echobase-exportDb_" + System.nanoTime()); + "echobase-exportDb_" + System.nanoTime()); tempDirectory.deleteOnExit(); File zipFile = new File(tempDirectory, fileName + ".zip"); - FileEntry[] entries = getEntries(); - for (FileEntry entry : entries) { + DbEditorService service = getDbEditorService(); - EchoBaseEntityEnum source = entry.getSource(); + MetaFilenameAware[] entries = getEntries(); + for (MetaFilenameAware entry : entries) { File entryFile = new File(tempDirectory, entry.getFilename()); - List<TopiaEntity> entities = entry.getDatas(getTransaction()); - if (log.isInfoEnabled()) { - log.info("Export " + entities + " entities of type " + - source + " to " + entryFile); + if (entry instanceof AssociationMeta) { + AssociationMeta associationMeta = (AssociationMeta) entry; + service.exportDatas(associationMeta, entryFile); + } else { + TableMeta meta = (TableMeta) entry; + service.exportDatas(meta, entryFile); } - - exportFile(entry, entryFile, entities); } compressZipFile(zipFile, tempDirectory); @@ -171,22 +167,17 @@ return zipFile; } - protected void importFile(FileEntry entry, - Reader reader, - CsvImportResult csvResult) throws IOException { + public void importFile(MetaFilenameAware entry, + Reader reader, + CsvImportResult csvResult) throws IOException { - EchoBaseEntityEnum source = entry.getSource(); - DbEditorService service = getDbEditorService(); - TableMeta tableMeta = getTableMeta(source); + if (entry instanceof AssociationMeta) { - if (entry.isAssociation()) { - // load a association input - AssociationMeta associationMeta = - tableMeta.getAssociations(entry.getPropertyName()); + AssociationMeta associationMeta = (AssociationMeta) entry; ImportExportModel<TopiaEntity> model = EntityAssociationCsvModel.newModel( @@ -200,68 +191,37 @@ // normal entity table import + TableMeta tableMeta = (TableMeta) entry; + ImportExportModel<TopiaEntity> model = service.buildForImport(tableMeta); importEntities(tableMeta, model, csvResult, reader); } } - protected void exportFile(FileEntry entry, - File entryFile, - List<TopiaEntity> entities) { - ImportExportModel<TopiaEntity> model; - TableMeta meta = getTableMeta(entry.getSource()); + public MetaFilenameAware[] getEntries() { - if (entry.isAssociation()) { - AssociationMeta associationMeta = - meta.getAssociations(entry.getPropertyName()); + List<MetaFilenameAware> result = Lists.newArrayList(); - model = EntityAssociationCsvModel.newModel( - getConfiguration().getCsvSeparator(), - associationMeta - ); - - } else { - - model = getDbEditorService().buildForExport(meta); - } - - Export<TopiaEntity> export = Export.newExport(model, entities); - - try { - String entryFileContent = export.startExportAsString(); - FileUtil.writeString(entryFile, entryFileContent, "utf-8"); - } catch (Exception eee) { - throw new EchoBaseTechnicalException("Can not export datas", eee); - } + addEntries(result, EntitiesUtil.getReferenceTypesForCopy()); + addEntries(result, EntitiesUtil.getDataTypesforCopy()); + return result.toArray(new MetaFilenameAware[result.size()]); } - protected TableMeta getTableMeta(EchoBaseEntityEnum tableName) { return getDbEditorService().getTableMeta(tableName); } - public FileEntry[] getEntries() { - - List<FileEntry> result = Lists.newArrayList(); - - addEntries(result, EntitiesUtil.getReferenceTypesForCopy()); - addEntries(result, EntitiesUtil.getDataTypesforCopy()); - return result.toArray(new FileEntry[result.size()]); - } - - protected void addEntries(List<FileEntry> result, EchoBaseEntityEnum[] types) { + protected void addEntries(List<MetaFilenameAware> result, EchoBaseEntityEnum[] types) { for (EchoBaseEntityEnum type : types) { TableMeta tableMeta = getTableMeta(type); + result.add(tableMeta); - result.add(FileEntry.newEntry(tableMeta)); - for (AssociationMeta associationMeta : tableMeta.getAssociations()) { - result.add(FileEntry.newEntry(associationMeta)); + result.add(associationMeta); } - } } @@ -272,7 +232,7 @@ return dbEditorService; } - public void importEntities(TableMeta meta, + protected void importEntities(TableMeta meta, ImportExportModel<TopiaEntity> csvModel, CsvImportResult result, Reader reader) { @@ -281,20 +241,20 @@ try { - TopiaDAO<TopiaEntity> dao = getDAO(meta.getEntityEnum()); + TopiaDAO<TopiaEntity> dao = getDAO(meta.getSource()); for (TopiaEntity entity : importer) { TopiaEntity entityToSave = dao.create(TopiaEntity.TOPIA_ID, - entity.getTopiaId()); + entity.getTopiaId()); meta.copy(entity, entityToSave); result.incrementsNumberUpdated(); } } catch (Exception eee) { - throw new EchoBaseTechnicalException("Could not import entities of type " + meta.getEntityEnum(), eee); + throw new EchoBaseTechnicalException("Could not import entities of type " + meta.getSource(), eee); } finally { importer.close(); @@ -312,14 +272,13 @@ EchoBaseEntityEnum targetType = meta.getTarget(); Import<E> importer = Import.newImport(csvModel, reader); - TopiaDAO<TopiaEntity> sourceDAO = getDAO(sourceType); + TopiaDAO<E> sourceDAO = getDAO(sourceType); TopiaDAO<TopiaEntity> targetDAO = getDAO(targetType); try { for (E row : importer) { - TopiaEntity entityToSave = - sourceDAO.findByTopiaId(row.getTopiaId()); + E entityToSave = sourceDAO.findByTopiaId(row.getTopiaId()); // check entity exits ? if (entityToSave == null) { @@ -350,92 +309,4 @@ } } - public static class FileEntry { - - public static FileEntry newEntry(TableMeta tableMeta) { - return newEntry(tableMeta.getEntityEnum(), null, null); - } - - public static FileEntry newEntry(AssociationMeta tableMeta) { - return newEntry(tableMeta.getSource(), tableMeta.getTarget(), tableMeta.getName()); - } - - public static FileEntry newEntry(EchoBaseEntityEnum source, - EchoBaseEntityEnum target, - String propertyName) { - return new FileEntry(source, target, propertyName); - } - - final EchoBaseEntityEnum source; - - final EchoBaseEntityEnum target; - - final String propertyName; - - protected CsvImportResult importResult; - - FileEntry(EchoBaseEntityEnum source, - EchoBaseEntityEnum target, - String propertyName) { - - this.source = source; - this.target = target; - this.propertyName = propertyName; - } - - public EchoBaseEntityEnum getSource() { - return source; - } - - public EchoBaseEntityEnum getTarget() { - return target; - } - - public String getPropertyName() { - return propertyName; - } - - public boolean isAssociation() { - return target != null && propertyName != null; - } - - public String getFilename() { - String result; - if (isAssociation()) { - result = source.name() + "_" + propertyName + "_" + target.name(); - } else { - result = source.name(); - } - return result + ".csv"; - } - - public CsvImportResult getImportResult() { - return importResult; - } - - public void setImportResult(CsvImportResult importResult) { - this.importResult = importResult; - } - - public List<TopiaEntity> getDatas(TopiaContext transaction) { - - try { - TopiaDAO<TopiaEntity> dao = EchoBaseDAOHelper.<TopiaEntity, TopiaDAO<TopiaEntity>>getDAO(transaction, (Class<TopiaEntity>) source.getContract()); - - List<TopiaEntity> result; - if (isAssociation()) { - - // filter only entities with some data in the association - TopiaQuery query = dao.createQuery("e"); - query.addWhere("size(e." + propertyName + ") > 0"); - result = dao.findAllByQuery(query); - } else { - result = dao.findAll(); - } - return result; - } catch (TopiaException eee) { - throw new EchoBaseTechnicalException("Could not obtain datas for " + this, eee); - } - } - } } Modified: trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java =================================================================== --- trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java 2011-12-08 05:25:25 UTC (rev 156) +++ trunk/echobase-services/src/test/java/fr/ifremer/echobase/services/EmbeddedApplicationServiceTest.java 2011-12-08 05:33:38 UTC (rev 157) @@ -81,7 +81,7 @@ transactionDest = rootContextDest.beginTransaction(); VoyageDAO voyageDAO = EchoBaseDAOHelper.getVoyageDAO(transactionDest); Object stringDefaultValue = MockEntityVisitorCreator.DefaultSimpleValues.STRING.getDefaultValue(); - Voyage voyageReplicated = voyageDAO.findByVoyageName((String) stringDefaultValue); + Voyage voyageReplicated = voyageDAO.findByName((String) stringDefaultValue); // assert voyage is in new base assertNotNull(voyageReplicated);