Author: tchemit Date: 2012-08-22 12:47:37 +0200 (Wed, 22 Aug 2012) New Revision: 2640 Url: http://nuiton.org/repositories/revision/topia/2640 Log: refs #2266: Add some api about import / export in csv format Added: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/ImportStrategy.java Modified: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/CsvFileImportResult.java branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/EntityAssociationImportModel.java branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/TopiaCsvImports.java branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/out/TopiaCsvExports.java Modified: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/CsvFileImportResult.java =================================================================== --- branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/CsvFileImportResult.java 2012-08-22 10:47:23 UTC (rev 2639) +++ branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/CsvFileImportResult.java 2012-08-22 10:47:37 UTC (rev 2640) @@ -35,8 +35,8 @@ /** * To keep result of the import of a file. * + * @author tchemit <chemit@codelutin.com> * @since 2.6.12 - * @author tchemit <chemit@codelutin.com> */ public class CsvFileImportResult<T extends TopiaEntityEnum> implements Serializable { Modified: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/EntityAssociationImportModel.java =================================================================== --- branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/EntityAssociationImportModel.java 2012-08-22 10:47:23 UTC (rev 2639) +++ branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/EntityAssociationImportModel.java 2012-08-22 10:47:37 UTC (rev 2640) @@ -24,8 +24,9 @@ */ import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityEnum; +import org.nuiton.topia.persistence.csv.TopiaCsvCommons; import org.nuiton.topia.persistence.metadata.AssociationMeta; -import org.nuiton.topia.persistence.csv.TopiaCsvCommons; import org.nuiton.util.csv.ImportModel; import java.util.Map; @@ -36,14 +37,13 @@ * @author tchemit <chemit@codelutin.com> * @since 2.6.12 */ -public class EntityAssociationImportModel extends AbstractImportModel<Map<String, Object>> { +public class EntityAssociationImportModel<T extends TopiaEntityEnum> extends AbstractImportModel<Map<String, Object>> { protected final AssociationMeta meta; - public static ImportModel<Map<String, Object>> newImportModel(char separator, - AssociationMeta meta - ) { - EntityAssociationImportModel model = new EntityAssociationImportModel( + public static <T extends TopiaEntityEnum> ImportModel<Map<String, Object>> newImportModel(char separator, + AssociationMeta<T> meta) { + EntityAssociationImportModel<T> model = new EntityAssociationImportModel<T>( separator, meta); // topiaId <-> topiaId @@ -67,7 +67,7 @@ return null; } - public EntityAssociationImportModel(char separator, AssociationMeta meta) { + public EntityAssociationImportModel(char separator, AssociationMeta<T> meta) { super(separator); this.meta = meta; } Added: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/ImportStrategy.java =================================================================== --- branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/ImportStrategy.java (rev 0) +++ branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/ImportStrategy.java 2012-08-22 10:47:37 UTC (rev 2640) @@ -0,0 +1,36 @@ +package org.nuiton.topia.persistence.csv.in; + +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityEnum; +import org.nuiton.topia.persistence.metadata.AssociationMeta; +import org.nuiton.topia.persistence.metadata.TableMeta; +import org.nuiton.util.csv.Import; +import org.nuiton.util.csv.ImportToMap; + +import java.io.Reader; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 2.6.12 + */ +public interface ImportStrategy<T extends TopiaEntityEnum> { + + ImportModelFactory<T> getModelFactory(); + + <E extends TopiaEntity> void importTableFile(Import<E> importer, + TableMeta<T> meta, + Reader reader, + CsvImportResult<T> csvResult) throws TopiaException; + + <T extends TopiaEntityEnum> void importAssociationFile(AssociationMeta<T> meta, + ImportToMap importer, + CsvImportResult<T> csvResult) throws TopiaException; + + void importNMAssociationFile(AssociationMeta<T> meta, + ImportToMap importer, + CsvImportResult<T> csvResult) throws TopiaException; + +} Property changes on: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/ImportStrategy.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/TopiaCsvImports.java =================================================================== --- branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/TopiaCsvImports.java 2012-08-22 10:47:23 UTC (rev 2639) +++ branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/in/TopiaCsvImports.java 2012-08-22 10:47:37 UTC (rev 2640) @@ -30,7 +30,6 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaContextImplementor; -import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.metadata.AssociationMeta; @@ -64,57 +63,100 @@ // no instance of this helper } - public static <T extends TopiaEntityEnum> void importFile(TopiaContextImplementor tx, - ImportModelFactory<T> modelFactory, - MetaFilenameAware<T> entry, - Reader reader, - CsvImportResult<T> csvResult) throws IOException, TopiaException { + public static <T extends TopiaEntityEnum, E extends TopiaEntity> void importTable(Reader reader, + ImportStrategy<T> importStrategy, + TableMeta<T> meta, + CsvImportResult<T> csvResult) throws TopiaException, IOException { - if (entry instanceof AssociationMeta) { - // load a association input - AssociationMeta<T> meta = (AssociationMeta<T>) entry; - ImportModel<Map<String, Object>> model = - modelFactory.buildForImport(meta); - ImportToMap importer = ImportToMap.newImportToMap(model, reader, false); + if (log.isInfoEnabled()) { + log.info("Will import " + meta); + } - try { - if (modelFactory.isNMAssociationMeta(meta)) { - importNMAssociationFile(tx, meta, importer, csvResult, 1000); - } else { - importAssociationFile(tx, meta, importer, csvResult, 1000); - } - } finally { - importer.close(); + ImportModel<E> model = importStrategy.getModelFactory().buildForImport(meta); + Import<E> importer = Import.newImport(model, reader); + + importStrategy.importTableFile(importer, + meta, + reader, + csvResult); + + + } + + public static <T extends TopiaEntityEnum> void importAssociationFile(Reader reader, + ImportStrategy<T> importStrategy, + AssociationMeta<T> meta, + CsvImportResult<T> csvResult) throws IOException, TopiaException { + + + // load a association input + ImportModelFactory<T> modelFactory = importStrategy.getModelFactory(); + ImportModel<Map<String, Object>> model = + modelFactory.buildForImport(meta); + ImportToMap importer = ImportToMap.newImportToMap(model, reader, false); + + try { + if (modelFactory.isNMAssociationMeta(meta)) { + importStrategy.importAssociationFile(meta, importer, csvResult); + } else { + importStrategy.importNMAssociationFile(meta, importer, csvResult); } + } finally { + importer.close(); + } + } - } else { +// public static <T extends TopiaEntityEnum> void importTableFile(TopiaContextImplementor tx, +// ImportModelFactory<T> modelFactory, +// TableMeta<T> meta, +// Reader reader, +// CsvImportResult<T> csvResult) throws IOException, TopiaException { +// +// ImportModel<TopiaEntity> model = modelFactory.buildForImport(meta); +// Import<TopiaEntity> importer = Import.newImport(model, reader); +// +// try { +// TopiaDAO<TopiaEntity> dao = (TopiaDAO<TopiaEntity>) tx.getDAO(meta.getSource().getContract()); +// importEntityFile(dao, meta, importer, csvResult); +// } finally { +// importer.close(); +// } +// } - // normal entity table import - TableMeta<T> meta = (TableMeta<T>) entry; - ImportModel<TopiaEntity> model = modelFactory.buildForImport(meta); - Import<TopiaEntity> importer = Import.newImport(model, reader); + public static <T extends TopiaEntityEnum> void importAssociationFile(TopiaContextImplementor tx, + ImportModelFactory<T> modelFactory, + AssociationMeta<T> meta, + Reader reader, + CsvImportResult<T> csvResult) throws IOException, TopiaException { - try { - TopiaDAO<TopiaEntity> dao = (TopiaDAO<TopiaEntity>) tx.getDAO(meta.getSource().getContract()); - importEntityFile(dao, meta, importer, csvResult); - } finally { - importer.close(); + + // load a association input + ImportModel<Map<String, Object>> model = + modelFactory.buildForImport(meta); + ImportToMap importer = ImportToMap.newImportToMap(model, reader, false); + + try { + if (modelFactory.isNMAssociationMeta(meta)) { + importNMAssociationFile(tx, meta, importer, csvResult, 1000); + } else { + importAssociationFile(tx, meta, importer, csvResult, 1000); } + } finally { + importer.close(); } - } - public static <T extends TopiaEntityEnum> Map<MetaFilenameAware<T>, ZipEntry> discoverEntries( + public static <T extends TopiaEntityEnum, M extends MetaFilenameAware<T>> Map<M, ZipEntry> discoverEntries( String entryPrefix, - MetaFilenameAware<T>[] entries, + Iterable<M> entries, ZipFile zipFile, List<String> missingEntries) { - Map<MetaFilenameAware<T>, ZipEntry> result = Maps.newLinkedHashMap(); + Map<M, ZipEntry> result = Maps.newLinkedHashMap(); // check that all mandatories - for (MetaFilenameAware<T> entry : entries) { + for (M entry : entries) { String filename = entry.getFilename(); ZipEntry zipEntry = zipFile.getEntry(entryPrefix + filename); @@ -127,15 +169,15 @@ return result; } - public static <T extends TopiaEntityEnum> Map<MetaFilenameAware<T>, File> discoverEntries( - MetaFilenameAware<T>[] entries, + public static <T extends TopiaEntityEnum, M extends MetaFilenameAware<T>> Map<M, File> discoverEntries( + Iterable<M> entries, File zipFile, List<String> missingEntries) { - Map<MetaFilenameAware<T>, File> result = Maps.newLinkedHashMap(); + Map<M, File> result = Maps.newLinkedHashMap(); // check that all mandatories - for (MetaFilenameAware<T> entry : entries) { + for (M entry : entries) { String filename = entry.getFilename(); File zipEntry = new File(zipFile, filename); @@ -148,23 +190,23 @@ return result; } - public static <T extends TopiaEntityEnum, E extends TopiaEntity> void importEntityFile(TopiaDAO<E> dao, - TableMeta<T> meta, - Import<E> importer, - CsvImportResult<T> csvResult) throws TopiaException { +// public static <T extends TopiaEntityEnum, E extends TopiaEntity> void importEntityFile(TopiaDAO<E> dao, +// TableMeta<T> meta, +// Import<E> importer, +// CsvImportResult<T> csvResult) throws TopiaException { +// +// for (TopiaEntity entity : importer) { +// +// Map<String, Object> properties = meta.prepareCreate( +// entity, entity.getTopiaId()); +// E entityToSave = dao.create(properties); +// +// meta.copy(entity, entityToSave); +// +// csvResult.incrementsNumberUpdated(); +// } +// } - for (TopiaEntity entity : importer) { - - Map<String, Object> properties = meta.prepareCreate( - entity, entity.getTopiaId()); - E entityToSave = dao.create(properties); - - meta.copy(entity, entityToSave); - - csvResult.incrementsNumberUpdated(); - } - } - public static <T extends TopiaEntityEnum> void importAssociationFile(TopiaContext tx, AssociationMeta<T> meta, ImportToMap importer, CsvImportResult<T> csvResult, @@ -206,7 +248,8 @@ } } - public static <T extends TopiaEntityEnum> void importNMAssociationFile(TopiaContext tx, AssociationMeta<T> meta, + public static <T extends TopiaEntityEnum> void importNMAssociationFile(TopiaContext tx, + AssociationMeta<T> meta, ImportToMap importer, CsvImportResult<T> csvResult, int nbRowBuffer) throws TopiaException { Modified: branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/out/TopiaCsvExports.java =================================================================== --- branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/out/TopiaCsvExports.java 2012-08-22 10:47:23 UTC (rev 2639) +++ branches/topia-2.6.x/topia-persistence/src/main/java/org/nuiton/topia/persistence/csv/out/TopiaCsvExports.java 2012-08-22 10:47:37 UTC (rev 2640) @@ -37,6 +37,7 @@ import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.metadata.AssociationMeta; import org.nuiton.topia.persistence.metadata.MetaFilenameAware; +import org.nuiton.topia.persistence.metadata.Metadatas; import org.nuiton.topia.persistence.metadata.TableMeta; import org.nuiton.util.TimeLog; import org.nuiton.util.csv.Export; @@ -191,6 +192,44 @@ } + public static <T extends TopiaEntityEnum> Map<T, EntityExportContext<T>> createReplicateEntityVisitorContexts(ExportModelFactory<T> modelFactory, + Iterable<TableMeta<T>> entityMetas, + Iterable<AssociationMeta<T>> associationMetas, + File container) { + + Preconditions.checkNotNull(modelFactory); + Preconditions.checkNotNull(entityMetas); + Preconditions.checkNotNull(associationMetas); + Preconditions.checkNotNull(container); + + Multimap<T, AssociationMeta<T>> associations = Metadatas.split(associationMetas); + Map<T, EntityExportContext<T>> contexts = Maps.newHashMap(); + + for (TableMeta<T> meta : entityMetas) { + + ExportModel<TopiaEntity> model = modelFactory.buildForExport(meta); + + EntityExportContext<T> exportContext = EntityExportContext.newExportContext( + model, + meta, + container); + + T source = meta.getSource(); + + contexts.put(source, exportContext); + + for (AssociationMeta<T> associationMeta : associations.get(source)) { + + ExportModel<TopiaEntity> associationModel = + modelFactory.buildForExport(associationMeta); + exportContext.addAssociationExportContext(associationMeta, + associationModel, + container); + } + } + return contexts; + } + /** * to export entity as csv files. *