changeset 9189:13a0c4be17ea

bom for csv export added
author gernotbelger
date Thu, 28 Jun 2018 14:11:12 +0200
parents 3931e8741f53
children 0633f963c5be
files artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java
diffstat 5 files changed, 46 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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(
--- 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
 
--- 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
 
--- 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 <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
  */
-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<String[]> getCSV(
-        String locale,
-        String uuid,
-        String name)
-    throws ServerException
-    {
+    @Override
+    public List<String[]> 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<String[]> lines = new ArrayList<String[]>();
-            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<String[]> lines = new ArrayList<String[]>();
+            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());
         }
 

http://dive4elements.wald.intevation.org