Author: tchemit Date: 2012-08-17 00:56:52 +0200 (Fri, 17 Aug 2012) New Revision: 425 Url: http://forge.codelutin.com/repositories/revision/sammoa/425 Log: refs #1201: Export format application (begin to use topia csv api) + continue export application Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorages.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationModel.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorages.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorages.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorages.java 2012-08-16 22:56:52 UTC (rev 425) @@ -53,18 +53,31 @@ return result; } + public static CampaignStorage createStorage(File directory, + String campaignId) throws IOException { + CampaignStorage result = new CampaignStorage(directory, campaignId); + createEmptyStructure(result); + return result; + } + public static CampaignStorage copyStorage(CampaignStorage source, File targetDirectory, - String... flightIds) throws IOException { + boolean createCsvDirectory, + Iterable<String> flightIds) throws IOException { - CampaignStorage target = new CampaignStorage(targetDirectory, source.getCampaignId()); + CampaignStorage target = createStorage(targetDirectory, + source.getCampaignId()); createEmptyStructure(target); - FileUtils.copyDirectory(source.getMapDirectory(), target.getMapDirectory()); - if (source.getCsvDirectory().exists()) { + FileUtils.copyDirectory(source.getMapDirectory(), + target.getMapDirectory()); + if (createCsvDirectory) { FileUtils.forceMkdir(target.getCsvDirectory()); - FileUtils.copyDirectory(source.getCsvDirectory(), target.getCsvDirectory()); } + if (source.getCsvDirectory().exists()) { + FileUtils.copyDirectory(source.getCsvDirectory(), + target.getCsvDirectory()); + } for (String flightId : flightIds) { FlightStorage flightStorage = source.getFlightStorage(flightId); FlightStorages.copyStorage(flightStorage, target); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationModel.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationModel.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationModel.java 2012-08-16 22:56:52 UTC (rev 425) @@ -23,10 +23,13 @@ * #L% */ +import com.google.common.collect.Iterables; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; +import org.nuiton.topia.persistence.TopiaId; import java.io.File; +import java.util.Set; /** * Model of sammoa export. @@ -37,46 +40,42 @@ public class ExportApplicationModel { public static ExportApplicationModel newModel(File exportDirectory, - String exportFilename, Campaign campaign, - Flight flight, + Set<Flight> flights, ExportApplicationCallbackMode callback) { ExportApplicationModel result = new ExportApplicationModel(); - result.exportDirectory = exportDirectory; - result.exportFilename = exportFilename; + result.exportFile = exportDirectory; result.campaign = campaign; - result.flight = flight; + result.flights = flights; result.callback = callback; return result; } protected Campaign campaign; - protected Flight flight; + protected Set<Flight> flights; - protected File exportDirectory; + protected File exportFile; - protected String exportFilename; - protected ExportApplicationCallbackMode callback; - public File getExportDirectory() { - return exportDirectory; - } - - public String getExportFilename() { - return exportFilename; - } - public Campaign getCampaign() { return campaign; } - public Flight getFlight() { - return flight; + public Set<Flight> getFlights() { + return flights; } public ExportApplicationCallbackMode getCallback() { return callback; } + + public Iterable<String> getFlightIds() { + return Iterables.transform(getFlights(), TopiaId.GET_TOPIA_ID); + } + + public File getExportFile() { + return exportFile; + } } \ No newline at end of file Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java 2012-08-16 22:56:52 UTC (rev 425) @@ -24,13 +24,41 @@ */ import fr.ulr.sammoa.application.SammoaServiceSupport; +import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.CampaignStorages; import fr.ulr.sammoa.persistence.Campaign; +import fr.ulr.sammoa.persistence.SammoaDAOHelper; +import fr.ulr.sammoa.persistence.SammoaDbMetas; +import fr.ulr.sammoa.persistence.SammoaEntityEnum; +import fr.ulr.sammoa.persistence.SammoaPersistence; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +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.topia.persistence.csv.EntityCsvModel; +import org.nuiton.topia.persistence.csv.out.EntityAssociationExportModel; +import org.nuiton.topia.persistence.csv.out.ExportModelFactory; +import org.nuiton.topia.persistence.csv.out.PrepareDataForExport; +import org.nuiton.topia.persistence.csv.out.TopiaCsvExports; +import org.nuiton.topia.persistence.metadata.AssociationMeta; +import org.nuiton.topia.persistence.metadata.ColumnMeta; +import org.nuiton.topia.persistence.metadata.DbMeta; +import org.nuiton.topia.persistence.metadata.MetaFilenameAware; +import org.nuiton.topia.persistence.metadata.TableMeta; import org.nuiton.util.TimeLog; +import org.nuiton.util.ZipUtil; +import org.nuiton.util.csv.ExportModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.IOException; +import java.util.List; + /** * To export application as a {@code sammoa} file. * @@ -43,36 +71,59 @@ private static final Logger logger = LoggerFactory.getLogger(ExportApplicationService.class); - - private static final TimeLog timeLog = + private static final TimeLog TIME_LOG = new TimeLog(ExportApplicationService.class); - public void exportApplication(ExportApplicationModel model) { + public void exportApplication(ExportApplicationModel model) throws IOException { if (logger.isInfoEnabled()) { - logger.info("Start Application export to {} :: {}", - model.getExportDirectory(), - model.getExportFilename()); + logger.info("Start Application export to {}", + model.getExportFile()); } long startTime = TimeLog.getTime(); - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - //BOUH! + Campaign campaign = model.getCampaign(); + + String campaignId = campaign.getTopiaId(); + + CampaignStorage storage = CampaignStorages.getStorage(config, campaignId); + + File targetDirectory = new File(config.getTmpDirectory(), + "exportSammoa-" + System.nanoTime()); + + if (logger.isInfoEnabled()) { + logger.info("Temporary storage: {}", targetDirectory); } - Campaign campaign = model.getCampaign(); + Iterable<String> flightIds = model.getFlightIds(); - CampaignStorage storage = CampaignStorages.getStorage( - config, campaign.getTopiaId()); + CampaignStorage targetStorage = CampaignStorages.copyStorage( + storage, targetDirectory, true, flightIds); - //TODO - startTime = timeLog.log(startTime, "exportApplication", - "after Export execution"); + startTime = TIME_LOG.log(startTime, "exportApplication", + "after create Storage structure"); + File csvDirectory = targetStorage.getCsvDirectory(); + + TopiaContext tx = persistence.beginTransaction(); + + try { + + exportReferential(tx, csvDirectory); + exportData(tx, csvDirectory, campaignId, flightIds); + } finally { + persistence.endTransaction(tx); + } + + compressZipFile(model.getExportFile(), + targetStorage.getDirectory(), + false); + + startTime = TIME_LOG.log(startTime, "exportApplication", + "after export db to csv files "); + switch (model.getCallback()) { case NOTHING: @@ -86,10 +137,52 @@ break; } - timeLog.log(startTime, "exportApplication", "after Callback execution"); + TIME_LOG.log(startTime, "exportApplication", "after Callback execution"); } + protected void exportReferential(TopiaContext tx, File csvDirectory) { + + SammoaEntityEnumPrepareDataForExport prepareDataForExport = + new SammoaEntityEnumPrepareDataForExport(persistence, tx); + + DbMeta<SammoaEntityEnum> dbMetas = persistence.getDbMetas(); + + MetaFilenameAware<SammoaEntityEnum>[] referencialEntries = + SammoaDbMetas.getReferencialEntries(dbMetas); + + for (MetaFilenameAware<SammoaEntityEnum> entry : referencialEntries) { + + File entryFile = new File(csvDirectory, entry.getFilename()); + if (logger.isInfoEnabled()) { + logger.info("Will export {} to {}", entry, entryFile); + } + + if (entry instanceof AssociationMeta) { + AssociationMeta<SammoaEntityEnum> associationMeta = + (AssociationMeta<SammoaEntityEnum>) entry; + TopiaCsvExports.exportData(associationMeta, + defaultExportModelFactory, + prepareDataForExport, + entryFile); + } else { + TableMeta<SammoaEntityEnum> tableMeta = + (TableMeta<SammoaEntityEnum>) entry; + + TopiaCsvExports.exportData(tableMeta, + defaultExportModelFactory, + prepareDataForExport, + entryFile); + } + } + + } + + protected void exportData(TopiaContext tx, File csvDirectory, + String campaignId, + Iterable<String> flightIds) { + } + protected void removeFlightData(ExportApplicationModel model) { if (logger.isInfoEnabled()) { logger.info("Will remove flight data for campaign {}", @@ -102,4 +195,107 @@ logger.info("Will remove all data from current db (create a new db...)"); } } + + private ExportModelFactory<SammoaEntityEnum> defaultExportModelFactory = new ExportModelFactory<SammoaEntityEnum>() { + @Override + public <E extends TopiaEntity> ExportModel<E> buildForExport(TableMeta<SammoaEntityEnum> meta) { + EntityCsvModel<SammoaEntityEnum, E> model = + EntityCsvModel.newModel(config.getCsvSeparator(), + meta, + TopiaEntity.TOPIA_ID); + + + for (ColumnMeta columnMeta : meta) { + String propertyName = columnMeta.getName(); + Class<?> type = columnMeta.getType(); + if (columnMeta.isFK()) { + + Class<TopiaEntity> entityType = (Class<TopiaEntity>) type; + + // export foreign key value as his topiaId + model.addForeignKeyForExport(propertyName, entityType); + + } else { + model.addDefaultColumn(propertyName, type); + } + } + return model; + } + + @Override + public <E extends TopiaEntity> ExportModel<E> buildForExport(AssociationMeta<SammoaEntityEnum> associationMeta) { + ExportModel<E> model = EntityAssociationExportModel.newExportModel( + config.getCsvSeparator(), + associationMeta + ); + return model; + } + }; + + public static void compressZipFile(File zipFile, File directory) throws IOException { + compressZipFile(zipFile, directory, true); + } + + public static void compressZipFile(File zipFile, File directory, boolean delete) throws IOException { + + FileUtils.forceMkdir(zipFile.getParentFile()); + + try { + ZipUtil.compress(zipFile, directory); + } finally { + if (delete) { + FileUtils.deleteDirectory(directory); + } + } + } + + protected class SammoaEntityEnumPrepareDataForExport implements PrepareDataForExport<SammoaEntityEnum> { + + protected final SammoaPersistence persistence; + + protected final TopiaContext tx; + + public SammoaEntityEnumPrepareDataForExport(SammoaPersistence persistence, TopiaContext tx) { + + this.persistence = persistence; + this.tx = tx; + } + + @Override + public <E extends TopiaEntity> List<E> prepareData(TableMeta<SammoaEntityEnum> tableMeta) { + + return getEntities(tx, tableMeta, null); + } + + @Override + public <E extends TopiaEntity> List<E> prepareData(AssociationMeta<SammoaEntityEnum> associationMeta) { + TableMeta<SammoaEntityEnum> tableMeta = persistence.getDbMetas().getTable(associationMeta.getSource()); + return getEntities(tx, tableMeta, "size(e." + associationMeta.getName() + ") > 0"); + } + + protected <E extends TopiaEntity> List<E> getEntities(TopiaContext tx, + TableMeta<SammoaEntityEnum> tableMeta, + String extraWhereQuery) { + + List<E> result; + SammoaEntityEnum entityEnum = tableMeta.getSource(); + try { + TopiaDAO<E> dao = SammoaDAOHelper.<E, TopiaDAO<E>>getDAO( + tx, (Class<E>) entityEnum.getContract()); + + // first query to count datas + + TopiaQuery query = dao.createQuery("e"); + + if (StringUtils.isNotEmpty(extraWhereQuery)) { + query.addWhere(extraWhereQuery); + } + + result = dao.findAllByQuery(query); + return result; + } catch (TopiaException eee) { + throw new SammoaTechnicalException("Could not obtain data", eee); + } + } + } } Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties =================================================================== --- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-16 22:56:52 UTC (rev 425) @@ -6,6 +6,7 @@ sammoa.config.background.shape.file= sammoa.config.campaign.directory=Directory where are stored campaign data (maps, flight audio files,...) sammoa.config.campaign.id= +sammoa.config.csv.separator= sammoa.config.data.directory=Main directory where all data are stored. You can use ${data.directory} in other property values (ex\: ${data.directory}/audio). sammoa.config.effort.number= sammoa.config.flight.number= @@ -19,6 +20,7 @@ sammoa.config.observation.number= sammoa.config.strate.shape.file= sammoa.config.system.id= +sammoa.config.tmp.directory=Temporary directory used for different task (import, export,...) sammoa.config.transect.shape.file= sammoa.config.ui.add=Add sammoa.config.ui.begin=Begin Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java (rev 0) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java 2012-08-16 22:56:52 UTC (rev 425) @@ -0,0 +1,118 @@ +package fr.ulr.sammoa.persistence; + +import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import org.nuiton.topia.persistence.metadata.DbMeta; +import org.nuiton.topia.persistence.metadata.MetaFilenameAware; +import org.nuiton.topia.persistence.metadata.Metadatas; +import org.nuiton.topia.persistence.metadata.TopiaEntityEnumProvider; + +import java.util.List; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ +public class SammoaDbMetas { + + private static final SammoaEntityEnum[] EMPTY_ENTITY_TYPE_ARRAY = + new SammoaEntityEnum[0]; + + public static DbMeta<SammoaEntityEnum> newDbMetas() { + return DbMeta.newDbMeta(SammoaEntityEnum.values(), + EMPTY_ENTITY_TYPE_ARRAY, + new SammoaTopiaEntityEnumProvider()); + } + + /** + * @return the entity types of data in correct order for replication + * purpose. + */ + public static SammoaEntityEnum[] getDataTypes() { + + List<SammoaEntityEnum> result = Lists.newLinkedList(); + + result.add(SammoaEntityEnum.TransectFlight); + result.add(SammoaEntityEnum.Flight); + result.add(SammoaEntityEnum.Route); + result.add(SammoaEntityEnum.Observation); + result.add(SammoaEntityEnum.ObserverPosition); + result.add(SammoaEntityEnum.GeoPoint); + + return result.toArray(new SammoaEntityEnum[result.size()]); + } + + /** + * @return the entity types of reference in correct order for copy + * purpose (says import / export of all a database. + */ + public static SammoaEntityEnum[] getReferenceTypes() { + List<SammoaEntityEnum> result = Lists.newLinkedList(); + + // with no dep + result.add(SammoaEntityEnum.Region); + result.add(SammoaEntityEnum.Campaign); + result.add(SammoaEntityEnum.Strate); + result.add(SammoaEntityEnum.Sector); + result.add(SammoaEntityEnum.Transect); + result.add(SammoaEntityEnum.Observer); + result.add(SammoaEntityEnum.Species); + + return result.toArray(new SammoaEntityEnum[result.size()]); + } + + public static MetaFilenameAware<SammoaEntityEnum>[] getAllEntries(DbMeta<SammoaEntityEnum> dbMeta) { + + List<MetaFilenameAware<SammoaEntityEnum>> entities = Lists.newArrayList(); + List<MetaFilenameAware<SammoaEntityEnum>> associations = Lists.newArrayList(); + + Metadatas.addEntries(dbMeta, entities, associations, getReferenceTypes()); + Metadatas.addEntries(dbMeta, entities, associations, getDataTypes()); + entities.addAll(associations); + return entities.toArray(new MetaFilenameAware[entities.size()]); + } + + public static MetaFilenameAware<SammoaEntityEnum>[] getReferencialEntries(DbMeta<SammoaEntityEnum> dbMeta) { + + List<MetaFilenameAware<SammoaEntityEnum>> entities = Lists.newArrayList(); + List<MetaFilenameAware<SammoaEntityEnum>> associations = Lists.newArrayList(); + entities.addAll(associations); + Metadatas.addEntries(dbMeta, entities, associations, getReferenceTypes()); + + return entities.toArray(new MetaFilenameAware[entities.size()]); + } + + public static MetaFilenameAware<SammoaEntityEnum>[] getDataEntries(DbMeta<SammoaEntityEnum> dbMeta) { + + List<MetaFilenameAware<SammoaEntityEnum>> entities = Lists.newArrayList(); + + Metadatas.addEntries(dbMeta, entities, null, getDataTypes()); + return entities.toArray(new MetaFilenameAware[entities.size()]); + } + + public static Multimap<SammoaEntityEnum, MetaFilenameAware<SammoaEntityEnum>> getDataAssociationsEntries(DbMeta<SammoaEntityEnum> dbMeta) { + + List<MetaFilenameAware<SammoaEntityEnum>> associations = Lists.newArrayList(); + + Metadatas.addEntries(dbMeta, null, associations, getDataTypes()); + + Multimap<SammoaEntityEnum, MetaFilenameAware<SammoaEntityEnum>> associationsBySource = Metadatas.split(associations); + return associationsBySource; + } + + /** + * Implementation of {@link TopiaEntityEnumProvider} for Sammoa. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ + public static class SammoaTopiaEntityEnumProvider implements TopiaEntityEnumProvider<SammoaEntityEnum> { + + @Override + public <E> SammoaEntityEnum getEntityEnum(Class<E> type) { + return SammoaEntityEnum.valueOf(type); + } + } +} Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-08-16 22:56:52 UTC (rev 425) @@ -31,13 +31,14 @@ import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.topia.TopiaRuntimeException; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.metadata.DbMeta; import java.util.Properties; /** * Persistence context for SAMMOA. This class must be used for all transaction * management. An {@link AutoSaveListener} will be used to commit all entities - * changed every {@code autoCommitDelay} defined in constructor + * changed every {@code autoCommitDelay} defined in constructor * {@link #SammoaPersistence(Properties, long)}. * <p/> * You will create a transaction with {@link #beginTransaction()} and on finally @@ -54,17 +55,19 @@ protected TopiaContext rootContext; protected Properties dbConfiguration; - + protected AutoSaveListener autoSaveListener; + protected DbMeta<SammoaEntityEnum> dbMetas; + /** * Constructor of SammoaPersistence with {@code dbConfiguration} for * {@link TopiaContextFactory#getContext(Properties)} and {@code autoCommitDelay} * for {@link AutoSaveListener}. - * + * * @param dbConfiguration Configuration for Topia * @param autoCommitDelay Delay in milliseconds for auto commit period - * @see #open(Properties, long) + * @see #open(Properties, long) */ public SammoaPersistence(Properties dbConfiguration, long autoCommitDelay) { open(dbConfiguration, autoCommitDelay); @@ -96,10 +99,10 @@ * will be automatically bind on all entities change. During the transaction * time, no auto commit will be done, the next {@link #endTransaction(TopiaContext)} * call will release the AutoSaveListener to continue looking for change. - * + * * @return a new TopiaContext - * @see #endTransaction(TopiaContext) - * @see TopiaContext#beginTransaction() + * @see #endTransaction(TopiaContext) + * @see TopiaContext#beginTransaction() */ public TopiaContext beginTransaction() { autoSaveListener.stop(); @@ -110,16 +113,14 @@ /** * Delay the {@code entity} creation using the {@link AutoSaveListener} - * + * * @param entity TopiaEntity to create automatically on next auto commit */ public void delayEntityCreation(TopiaEntity entity) { autoSaveListener.addCreatedEntity(entity); } - /** - * Stop the auto save listener - */ + /** Stop the auto save listener */ public void stopAutoSaveListener() { autoSaveListener.stop(); } @@ -127,19 +128,17 @@ /** * End the {@code transaction}. The {@link AutoSaveListener} will be released * to continue looking for entities change. - * + * * @param transaction TopiaContext to end - * @see #beginTransaction() - * @see TopiaContext#closeContext() + * @see #beginTransaction() + * @see TopiaContext#closeContext() */ public void endTransaction(TopiaContext transaction) { closeContext(transaction); autoSaveListener.start(); } - /** - * @return the main TopiaContext where all other transactions are opened - */ + /** @return the main TopiaContext where all other transactions are opened */ public TopiaContext getRootContext() { if (rootContext == null) { try { @@ -151,17 +150,15 @@ return rootContext; } - /** - * @param rootContext the main TopiaContext to use - */ + /** @param rootContext the main TopiaContext to use */ public void setRootContext(TopiaContext rootContext) { this.rootContext = rootContext; } /** - * Close the persistence context. This will close the main {@link TopiaContext} + * Close the persistence context. This will close the main {@link TopiaContext} * and the {@link AutoSaveListener}. - * + * * @see AutoSaveListener#stop() */ public void close() { @@ -172,11 +169,18 @@ } } + public DbMeta<SammoaEntityEnum> getDbMetas() { + if (dbMetas == null) { + dbMetas = SammoaDbMetas.newDbMetas(); + } + return dbMetas; + } + /** * Open a new {@link TopiaContext}. Errors are thrown using {@link TopiaRuntimeException} - * + * * @return a new topiaContext - * @see TopiaContext#beginTransaction() + * @see TopiaContext#beginTransaction() */ protected TopiaContext openContext() { try { Added: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java =================================================================== --- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java (rev 0) +++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java 2012-08-16 22:56:52 UTC (rev 425) @@ -0,0 +1,74 @@ +package fr.ulr.sammoa.persistence; + +import com.google.common.collect.Multimap; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.topia.persistence.metadata.DbMeta; +import org.nuiton.topia.persistence.metadata.MetaFilenameAware; + +/** + * Tests the{@link SammoaDbMetas}. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ +public class SammoaDbMetasTest { + + protected DbMeta<SammoaEntityEnum> dbMetas; + + + @Before + public void setUp() throws Exception { + dbMetas = SammoaDbMetas.newDbMetas(); + + } + + @Test + public void getAllEntries() throws Exception { + + MetaFilenameAware<SammoaEntityEnum>[] entries = + SammoaDbMetas.getAllEntries(dbMetas); + Assert.assertNotNull(entries); + Assert.assertEquals(SammoaDbMetas.getReferenceTypes().length + + SammoaDbMetas.getDataTypes().length + + 4 /* (data associations) */, + entries.length); + } + + @Test + public void getReferencialEntries() throws Exception { + + MetaFilenameAware<SammoaEntityEnum>[] entries = + SammoaDbMetas.getReferencialEntries(dbMetas); + + Assert.assertNotNull(entries); + Assert.assertEquals(SammoaDbMetas.getReferenceTypes().length, + entries.length); + } + + @Test + public void getDataEntries() throws Exception { + + MetaFilenameAware<SammoaEntityEnum>[] entries = + SammoaDbMetas.getDataEntries(dbMetas); + Assert.assertNotNull(entries); + Assert.assertEquals(SammoaDbMetas.getDataTypes().length, + entries.length); + } + + @Test + public void getDataAssociationsEntries() throws Exception { + + Multimap<SammoaEntityEnum, MetaFilenameAware<SammoaEntityEnum>> entries = + SammoaDbMetas.getDataAssociationsEntries(dbMetas); + Assert.assertNotNull(entries); + Assert.assertEquals(4, entries.size()); + Assert.assertTrue(entries.containsKey(SammoaEntityEnum.TransectFlight)); + Assert.assertEquals(1, entries.get(SammoaEntityEnum.TransectFlight).size()); + Assert.assertTrue(entries.containsKey(SammoaEntityEnum.Flight)); + Assert.assertEquals(2, entries.get(SammoaEntityEnum.Flight).size()); + Assert.assertTrue(entries.containsKey(SammoaEntityEnum.Route)); + Assert.assertEquals(1, entries.get(SammoaEntityEnum.Route).size()); + } +} Property changes on: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java 2012-08-16 22:56:52 UTC (rev 425) @@ -37,6 +37,7 @@ import fr.ulr.sammoa.ui.swing.SammoaUIHandler; import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.ErrorDialogUI; import org.nuiton.util.FileUtil; import org.nuiton.util.decorator.Decorator; import org.slf4j.Logger; @@ -46,6 +47,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -182,6 +184,8 @@ ExportApplicationModel dataModel = getModel().toModel(); exportService.exportApplication(dataModel); + } catch (IOException e) { + ErrorDialogUI.showError(e); } finally { SammoaUtil.updateBusyState(frame, false); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java 2012-08-16 22:54:57 UTC (rev 424) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java 2012-08-16 22:56:52 UTC (rev 425) @@ -24,6 +24,7 @@ */ import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import fr.ulr.sammoa.application.io.output.sammoa.ExportApplicationCallbackMode; import fr.ulr.sammoa.application.io.output.sammoa.ExportApplicationModel; import fr.ulr.sammoa.persistence.Campaign; @@ -32,6 +33,7 @@ import java.io.File; import java.util.List; +import java.util.Set; /** * Model of export application UI. @@ -149,11 +151,21 @@ public ExportApplicationModel toModel() { + Set<Flight> flightsToExport; + + if (getSelectedFlight() != null) { + + // only one flight to export + flightsToExport = Sets.newHashSet(getSelectedFlight()); + } else { + + // all flights of this campaign + flightsToExport = Sets.newHashSet(getFlights()); + } ExportApplicationModel result = ExportApplicationModel.newModel( - getExportDirectory(), - getExportFilename(), + new File(getExportDirectory(), getExportFilename()), getSelectedCampaign(), - getSelectedFlight(), + flightsToExport, getCallback() ); return result;