Author: tchemit Date: 2011-11-23 20:08:01 +0100 (Wed, 23 Nov 2011) New Revision: 113 Url: http://forge.codelutin.com/repositories/revision/echobase/113 Log: use csv model for export sql Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlCsvModel.java Modified: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlService.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/export/DownloadExportSqlResult.java Modified: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java =================================================================== --- trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java 2011-11-23 18:02:27 UTC (rev 112) +++ trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfiguration.java 2011-11-23 19:08:01 UTC (rev 113) @@ -113,6 +113,12 @@ return file; } + public char getCsvCharSeparator() { + char csvSeparator = applicationConfig.getOption(char.class, EchoBaseConfigurationOption.CSV_CHAR_SEPARATOR.key); + Preconditions.checkNotNull(csvSeparator); + return csvSeparator; + } + public Version getApplicationVersion() { String versionStr = applicationConfig.getOption(EchoBaseConfigurationOption.VERSION.key); Modified: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java =================================================================== --- trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java 2011-11-23 18:02:27 UTC (rev 112) +++ trunk/echobase-entities/src/main/java/fr/ifremer/echobase/EchoBaseConfigurationOption.java 2011-11-23 19:08:01 UTC (rev 113) @@ -50,6 +50,9 @@ SITE_URL("project.siteUrl", "URL du site de l'application", "", URL.class), + CSV_CHAR_SEPARATOR("csv.separator", + "Caractère de séparation pour les fichiers csv", + ";", char.class), WAR_DIRECTORY("war.directory", "Répertoire où est stoqué le war", "${data.directory}/war", File.class), 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-11-23 18:02:27 UTC (rev 112) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2011-11-23 19:08:01 UTC (rev 113) @@ -67,8 +67,6 @@ /** Logger. */ private static final Log log = LogFactory.getLog(DbEditorService.class); - public static final char CSV_CHAR_SEPARATOR = ';'; - protected DecoratorService decoratorService; protected DecoratorService getDecoratorService() { @@ -463,7 +461,7 @@ protected <E extends TopiaEntity> DbEditorCsvModel<E> buildForImport(TableMeta tableMetas) { - DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(CSV_CHAR_SEPARATOR, + DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(getConfiguration().getCsvCharSeparator(), tableMetas); ModelBuilder<E> modelBuilder = model.modelBuilder; @@ -490,7 +488,7 @@ protected <E extends TopiaEntity> DbEditorCsvModel<E> buildForSave(TableMeta tableMetas) { - DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(CSV_CHAR_SEPARATOR, + DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(getConfiguration().getCsvCharSeparator(), tableMetas); ModelBuilder<E> modelBuilder = model.modelBuilder; @@ -521,7 +519,7 @@ protected <E extends TopiaEntity> DbEditorCsvModel<E> buildForExport(TableMeta tableMetas) { - DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(CSV_CHAR_SEPARATOR, + DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(getConfiguration().getCsvCharSeparator(), tableMetas); ModelBuilder<E> modelBuilder = model.modelBuilder; @@ -548,7 +546,7 @@ protected <E extends TopiaEntity> DbEditorCsvModel<E> buildForLoad(TableMeta tableMetas, boolean addDecorated) { - DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(CSV_CHAR_SEPARATOR, + DbEditorCsvModel<E> model = new DbEditorCsvModel<E>(getConfiguration().getCsvCharSeparator(), tableMetas); ModelBuilder<E> modelBuilder = model.modelBuilder; Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlCsvModel.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlCsvModel.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlCsvModel.java 2011-11-23 19:08:01 UTC (rev 113) @@ -0,0 +1,84 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 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; + +import org.nuiton.util.csv.ExportableColumn; +import org.nuiton.util.csv.ImportExportModel; +import org.nuiton.util.csv.ImportableColumn; +import org.nuiton.util.csv.ModelBuilder; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Csv model to export sql in {@link ExportSqlService}. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public class ExportSqlCsvModel implements ImportExportModel<Map<String, Object>> { + + + protected final char separator; + + protected final ModelBuilder<?> modelBuilder; + + public ExportSqlCsvModel(char separator, String[] columnHeaders) { + this.separator = separator; + modelBuilder = new ModelBuilder<Object>(); + for (String columnHeader : columnHeaders) { + modelBuilder.newColumnForExport( + columnHeader, + columnHeader + ); + } + } + + @Override + public char getSeparator() { + return separator; + } + + @Override + public Collection<ExportableColumn<Map<String, Object>, Object>> getColumnsForExport() { + return (Collection) modelBuilder.getColumnsForExport(); + } + + @Override + public Collection<ImportableColumn<Map<String, Object>, Object>> getColumnsForImport() { + // never do import from this model + throw new UnsupportedOperationException(); + } + + @Override + public void pushCsvHeaderNames(List<String> headerNames) { + } + + @Override + public Map<String, Object> newEmptyInstance() { + // never do import from this model + throw new UnsupportedOperationException(); + } +} Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlCsvModel.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/ExportSqlService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlService.java 2011-11-23 18:02:27 UTC (rev 112) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/ExportSqlService.java 2011-11-23 19:08:01 UTC (rev 113) @@ -35,6 +35,7 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.framework.TopiaSQLQuery; +import org.nuiton.util.csv.Export; import java.sql.Connection; import java.sql.PreparedStatement; @@ -117,8 +118,8 @@ // get a query to count all rows for the request GenericSQLQuery sqlQuery = new GenericSQLQuery(sql, pager); try { - Map<String, Object>[] result = sqlQuery.getResult(getTransaction()); - return result; + List<Map<String, Object>> result = sqlQuery.getResult(getTransaction()); + return result.toArray(new Map[result.size()]); } catch (TopiaException eee) { throw new EchoBaseTechnicalException("Could not execute sql query", eee); } @@ -142,26 +143,25 @@ } } - public String createCsvFileContent(String sql, EchoBaseUser echoBaseUser) { + public String createCsvFileContent(String sql) { GenericSQLQuery sqlQuery = new GenericSQLQuery(sql, null); - Map<String, Object>[] rows; - String[] columnNames; + List<Map<String, Object>> rows; try { rows = sqlQuery.getResult(getTransaction()); - columnNames = sqlQuery.getColumnNames(); } catch (TopiaException eee) { throw new EchoBaseTechnicalException("Could not execute sql query", eee); } - StringBuilder buffer = new StringBuilder(); - int rowCount = rows.length; - buffer.append(StringUtils.join(columnNames, ";")); - for (int i = 0; i < rowCount; i++) { - Map<String, Object> row = rows[i]; - buffer.append('\n').append(StringUtils.join(row.values(), ";")); + ExportSqlCsvModel csvModel = sqlQuery.generateCsvModel(getConfiguration().getCsvCharSeparator()); + Export<Map<String, Object>> exporter = Export.newExport(csvModel, rows); + String content = null; + try { + content = exporter.startExportAsString(); + return content; + } catch (Exception eee) { + throw new EchoBaseTechnicalException("Could not export sql", eee); } - return buffer.toString(); } protected ExportQueryDAO getDAO() throws TopiaException { @@ -185,10 +185,18 @@ return columnNames; } - public Map<String, Object>[] getResult(TopiaContext tx) throws TopiaException { + public ExportSqlCsvModel generateCsvModel(char charSeparator) { + ExportSqlCsvModel model = new ExportSqlCsvModel( + charSeparator, + columnNames + ); + return model; + } + + public List<Map<String, Object>> getResult(TopiaContext tx) throws TopiaException { List<Map<String, Object>> rows = findMultipleResult((TopiaContextImplementor) tx); - return rows.toArray(new Map[rows.size()]); + return rows; } public String[] getColumnNames(TopiaContext tx) throws TopiaException { Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/export/DownloadExportSqlResult.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/export/DownloadExportSqlResult.java 2011-11-23 18:02:27 UTC (rev 112) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/export/DownloadExportSqlResult.java 2011-11-23 19:08:01 UTC (rev 113) @@ -84,10 +84,7 @@ ExportSqlService service = newService(ExportSqlService.class); contentType = "text/csv"; - String content = service.createCsvFileContent( - sql, - getEchoBaseSession().getEchoBaseUser() - ); + String content = service.createCsvFileContent(sql); contentLength = content.length(); inputStream = new ByteArrayInputStream(content.getBytes());