Ticket #18853: osm-writer.patch

File osm-writer.patch, 10.0 KB (added by hiddewie, 6 years ago)
  • core/src/org/openstreetmap/josm/io/ValidatorErrorWriter.java

     
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.io;
    33
    4 import java.io.BufferedWriter;
    5 import java.io.OutputStream;
    6 import java.io.OutputStreamWriter;
    7 import java.io.PrintWriter;
     4import java.io.*;
    85import java.nio.charset.StandardCharsets;
    96import java.util.ArrayList;
    107import java.util.Collection;
     
    6057     * Write validator errors to designated output target
    6158     * @param validationErrors Test error collection to write
    6259     */
    63     public void write(Collection<TestError> validationErrors) {
     60    public void write(Collection<TestError> validationErrors) throws IOException {
    6461        Set<Test> analysers = validationErrors.stream().map(TestError::getTester).collect(Collectors.toCollection(TreeSet::new));
    6562        String timestamp = DateUtils.fromDate(new Date());
    6663
     
    6764        out.println("<?xml version='1.0' encoding='UTF-8'?>");
    6865        out.println("<analysers generator='JOSM' timestamp='"+timestamp+"'>");
    6966
    70         OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(out, true, OsmChangeBuilder.DEFAULT_API_VERSION);
    71         String lang = LanguageInfo.getJOSMLocaleCode();
     67        try(OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(out, true, OsmChangeBuilder.DEFAULT_API_VERSION)) {
     68            String lang = LanguageInfo.getJOSMLocaleCode();
    7269
    73         for (Test test : analysers) {
    74             out.println("  <analyser timestamp='"+timestamp+"' name='"+XmlWriter.encode(test.getName())+"'>");
    75             // Build map of test error classes for the current test
    76             Map<ErrorClass, List<TestError>> map = new HashMap<>();
    77             for (Entry<Severity, Map<String, Map<String, List<TestError>>>> e1 :
    78                 OsmValidator.getErrorsBySeverityMessageDescription(validationErrors, e -> e.getTester() == test).entrySet()) {
    79                 for (Entry<String, Map<String, List<TestError>>> e2 : e1.getValue().entrySet()) {
    80                     ErrorClass errorClass = new ErrorClass(e1.getKey(), e2.getKey());
    81                     List<TestError> list = map.get(errorClass);
    82                     if (list == null) {
    83                         list = new ArrayList<>();
    84                         map.put(errorClass, list);
     70            for (Test test : analysers) {
     71                out.println("  <analyser timestamp='" + timestamp + "' name='" + XmlWriter.encode(test.getName()) + "'>");
     72                // Build map of test error classes for the current test
     73                Map<ErrorClass, List<TestError>> map = new HashMap<>();
     74                for (Entry<Severity, Map<String, Map<String, List<TestError>>>> e1 :
     75                        OsmValidator.getErrorsBySeverityMessageDescription(validationErrors, e -> e.getTester() == test).entrySet()) {
     76                    for (Entry<String, Map<String, List<TestError>>> e2 : e1.getValue().entrySet()) {
     77                        ErrorClass errorClass = new ErrorClass(e1.getKey(), e2.getKey());
     78                        List<TestError> list = map.get(errorClass);
     79                        if (list == null) {
     80                            list = new ArrayList<>();
     81                            map.put(errorClass, list);
     82                        }
     83                        e2.getValue().values().forEach(list::addAll);
    8584                    }
    86                     e2.getValue().values().forEach(list::addAll);
    8785                }
    88             }
    89             // Write classes
    90             for (ErrorClass ec : map.keySet()) {
    91                 out.println("    <class id='"+ec.id+"' level='"+ec.severity.getLevel()+"'>");
    92                 out.println("      <classtext lang='"+XmlWriter.encode(lang)+"' title='"+XmlWriter.encode(ec.message)+"'/>");
    93                 out.println("    </class>");
    94             }
     86                // Write classes
     87                for (ErrorClass ec : map.keySet()) {
     88                    out.println("    <class id='" + ec.id + "' level='" + ec.severity.getLevel() + "'>");
     89                    out.println("      <classtext lang='" + XmlWriter.encode(lang) + "' title='" + XmlWriter.encode(ec.message) + "'/>");
     90                    out.println("    </class>");
     91                }
    9592
    96             // Write errors
    97             for (Entry<ErrorClass, List<TestError>> entry : map.entrySet()) {
    98                 for (TestError error : entry.getValue()) {
    99                     LatLon ll = error.getPrimitives().iterator().next().getBBox().getCenter();
    100                     out.println("    <error class='"+entry.getKey().id+"'>");
    101                     out.print("      <location");
    102                     osmWriter.writeLatLon(ll);
    103                     out.println("/>");
    104                     for (OsmPrimitive p : error.getPrimitives()) {
    105                         p.accept(osmWriter);
    106                     }
    107                     out.println("      <text lang='"+XmlWriter.encode(lang)+"' value='"+XmlWriter.encode(error.getDescription())+"'/>");
    108                     if (error.isFixable()) {
    109                         out.println("      <fixes>");
    110                         Command fix = error.getFix();
    111                         if (fix instanceof AddPrimitivesCommand) {
    112                             Logging.info("TODO: {0}", fix);
    113                         } else if (fix instanceof DeleteCommand) {
    114                             Logging.info("TODO: {0}", fix);
    115                         } else if (fix instanceof ChangePropertyCommand) {
    116                             Logging.info("TODO: {0}", fix);
    117                         } else if (fix instanceof ChangePropertyKeyCommand) {
    118                             Logging.info("TODO: {0}", fix);
    119                         } else {
    120                             Logging.warn("Unsupported command type: {0}", fix);
     93                // Write errors
     94                for (Entry<ErrorClass, List<TestError>> entry : map.entrySet()) {
     95                    for (TestError error : entry.getValue()) {
     96                        LatLon ll = error.getPrimitives().iterator().next().getBBox().getCenter();
     97                        out.println("    <error class='" + entry.getKey().id + "'>");
     98                        out.print("      <location");
     99                        osmWriter.writeLatLon(ll);
     100                        out.println("/>");
     101                        for (OsmPrimitive p : error.getPrimitives()) {
     102                            p.accept(osmWriter);
    121103                        }
    122                         out.println("      </fixes>");
     104                        out.println("      <text lang='" + XmlWriter.encode(lang) + "' value='" + XmlWriter.encode(error.getDescription()) + "'/>");
     105                        if (error.isFixable()) {
     106                            out.println("      <fixes>");
     107                            Command fix = error.getFix();
     108                            if (fix instanceof AddPrimitivesCommand) {
     109                                Logging.info("TODO: {0}", fix);
     110                            } else if (fix instanceof DeleteCommand) {
     111                                Logging.info("TODO: {0}", fix);
     112                            } else if (fix instanceof ChangePropertyCommand) {
     113                                Logging.info("TODO: {0}", fix);
     114                            } else if (fix instanceof ChangePropertyKeyCommand) {
     115                                Logging.info("TODO: {0}", fix);
     116                            } else {
     117                                Logging.warn("Unsupported command type: {0}", fix);
     118                            }
     119                            out.println("      </fixes>");
     120                        }
     121                        out.println("    </error>");
    123122                    }
    124                     out.println("    </error>");
    125123                }
     124
     125                out.println("  </analyser>");
    126126            }
    127 
    128             out.println("  </analyser>");
    129127        }
    130128
    131129        out.println("</analysers>");
  • core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java

     
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.io.session;
    33
    4 import java.io.OutputStream;
    5 import java.io.OutputStreamWriter;
    6 import java.io.PrintWriter;
    7 import java.io.Writer;
     4import java.io.*;
    85import java.nio.charset.StandardCharsets;
    96
    107import org.openstreetmap.josm.data.osm.DataSet;
     
    2724    }
    2825
    2926    @Override
    30     protected void addDataFile(OutputStream out) {
     27    protected void addDataFile(OutputStream out) throws IOException {
    3128        exportData(layer.data, out);
    3229    }
    3330
     
    3734     * @param out output stream
    3835     * @since 15386
    3936     */
    40     public static void exportData(DataSet data, OutputStream out) {
    41         Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
    42         OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
    43         data.getReadLock().lock();
    44         try {
    45             w.write(data);
    46             w.flush();
    47         } finally {
    48             data.getReadLock().unlock();
     37    public static void exportData(DataSet data, OutputStream out) throws IOException {
     38        try (Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
     39             OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
     40        ) {
     41            data.getReadLock().lock();
     42            try {
     43                w.write(data);
     44                w.flush();
     45            } finally {
     46                data.getReadLock().unlock();
     47            }
    4948        }
    5049    }
    5150}