# HG changeset patch # User gernotbelger # Date 1530187872 -7200 # Node ID 13a0c4be17eac1a8f495eba475c62297bf9ef20d # Parent 3931e8741f53c9a878b61cc0c555686a7ccb5059 bom for csv export added diff -r 3931e8741f53 -r 13a0c4be17ea artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java Thu Jun 28 13:14:44 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java Thu Jun 28 14:11:12 2018 +0200 @@ -305,6 +305,10 @@ final char quote = '"'; final char escape = '\\'; + // Write BOM so excel is happy + final byte[] BOM = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }; + this.out.write(BOM); + final CSVWriter writer = new CSVWriter(new OutputStreamWriter(this.out, DEFAULT_CSV_CHARSET), DEFAULT_CSV_SEPARATOR, quote, escape, "\r\n"); writeCSVData(writer); diff -r 3931e8741f53 -r 13a0c4be17ea artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java Thu Jun 28 13:14:44 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java Thu Jun 28 14:11:12 2018 +0200 @@ -316,9 +316,10 @@ log.debug("export chart as CSV"); try { -// FIXME: decide: to BOM or not to BOM -// final byte[] BOM = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF}; -// out.write(BOM); + + // Write BOM so excel is happy + final byte[] BOM = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF}; + out.write(BOM); final CSVWriter writer = new CSVWriter( new OutputStreamWriter( diff -r 3931e8741f53 -r 13a0c4be17ea artifacts/src/main/resources/messages.properties --- a/artifacts/src/main/resources/messages.properties Thu Jun 28 13:14:44 2018 +0200 +++ b/artifacts/src/main/resources/messages.properties Thu Jun 28 14:11:12 2018 +0200 @@ -1036,8 +1036,8 @@ sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr -sinfo.export.csv.header.waterlevel.difference = \u0394WSPL -sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH +sinfo.export.csv.header.waterlevel.difference = \u0394WSPL +sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH sinfo.export.csv.header.flowdepth.current = Flie\u00dftiefe h-aktuell sinfo.export.csv.header.flowdepth.historical = Flie\u00dftiefe h-historisch diff -r 3931e8741f53 -r 13a0c4be17ea artifacts/src/main/resources/messages_de.properties --- a/artifacts/src/main/resources/messages_de.properties Thu Jun 28 13:14:44 2018 +0200 +++ b/artifacts/src/main/resources/messages_de.properties Thu Jun 28 14:11:12 2018 +0200 @@ -1034,10 +1034,10 @@ sinfo.export.csv.header.channel.width = Sollbreite Fahrrinne sinfo.export.csv.header.channel.depth = Solltiefe Fahrrinne sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung -sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung +sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr -sinfo.export.csv.header.waterlevel.difference = \u0394WSPL -sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH +sinfo.export.csv.header.waterlevel.difference = \u0394WSPL +sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH sinfo.export.csv.header.flowdepth.current = Flie\u00dftiefe h-aktuell sinfo.export.csv.header.flowdepth.historical = Flie\u00dftiefe h-historisch diff -r 3931e8741f53 -r 13a0c4be17ea gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java Thu Jun 28 13:14:44 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java Thu Jun 28 14:11:12 2018 +0200 @@ -8,83 +8,68 @@ package org.dive4elements.river.client.server; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.util.ArrayList; import java.util.List; -import java.io.Reader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.IOException; - +import org.apache.log4j.Logger; +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.river.client.client.services.CSVExportService; +import org.dive4elements.river.client.shared.exceptions.ServerException; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.apache.log4j.Logger; - import com.google.gwt.user.server.rpc.RemoteServiceServlet; import au.com.bytecode.opencsv.CSVReader; -import org.dive4elements.artifacts.common.ArtifactNamespaceContext; -import org.dive4elements.artifacts.common.utils.XMLUtils; - -import org.dive4elements.artifacts.httpclient.http.HttpClient; -import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; - -import org.dive4elements.river.client.shared.exceptions.ServerException; -import org.dive4elements.river.client.client.services.CSVExportService; - - /** * @author Raimund Renkert */ -public class CSVExportServiceImpl -extends RemoteServiceServlet -implements CSVExportService -{ - private static final Logger log = - Logger.getLogger(CSVExportServiceImpl.class); - +public class CSVExportServiceImpl extends RemoteServiceServlet implements CSVExportService { + private static final Logger log = Logger.getLogger(CSVExportServiceImpl.class); - public static final String ERROR_NO_EXPORT_FOUND = - "error_no_export_found"; + public static final String ERROR_NO_EXPORT_FOUND = "error_no_export_found"; - public List getCSV( - String locale, - String uuid, - String name) - throws ServerException - { + @Override + public List getCSV(final String locale, final String uuid, final String name) throws ServerException { log.info("CSVExportServiceImpl.getCSV"); - String url = getServletContext().getInitParameter("server-url"); - - Document requestDoc = XMLUtils.newDocument(); + final String url = getServletContext().getInitParameter("server-url"); - XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( - requestDoc, - ArtifactNamespaceContext.NAMESPACE_URI, - ArtifactNamespaceContext.NAMESPACE_PREFIX); + final Document requestDoc = XMLUtils.newDocument(); - Element action = ec.create("action"); + final XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(requestDoc, ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + final Element action = ec.create("action"); ec.addAttr(action, "type", "csv", true); ec.addAttr(action, "name", name, true); requestDoc.appendChild(action); - HttpClient client = new HttpClientImpl(url, locale); + final HttpClient client = new HttpClientImpl(url, locale); try { - InputStream in = client.collectionOut(requestDoc, uuid, "export"); - Reader reader = new InputStreamReader (in, "UTF-8"); - CSVReader csvReader = new CSVReader (reader, ';'); + final InputStream in = client.collectionOut(requestDoc, uuid, "export"); + final Reader reader = new InputStreamReader(in, "UTF-8"); + final CSVReader csvReader = new CSVReader(reader, ';'); - List lines = new ArrayList(); - String[] line = null; + final byte[] BOM = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }; + final char bomChar = new String(BOM, "UTF-8").charAt(0); + final StringBuilder bomCharCheckBuilder = new StringBuilder().append(bomChar).append("#"); + final List lines = new ArrayList(); + String[] line = null; while ((line = csvReader.readNext()) != null) { if (line != null) { - if (!line[0].startsWith("#") && line.length > 0) { + if (line.length > 0 && !line[0].startsWith("#") && !line[0].startsWith(bomCharCheckBuilder.toString())) { if (line[0].replace("'", "").length() > 0) { lines.add(line); } @@ -94,7 +79,7 @@ return lines; } - catch (IOException ce) { + catch (final IOException ce) { log.error(ce.getLocalizedMessage()); }