Changeset 143 in josm


Ignore:
Timestamp:
2006-09-30T19:05:43+02:00 (18 years ago)
Author:
imi
Message:

added "gpx" as flag to the external tool feature to also export raw gps data

Files:
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • src/org/openstreetmap/josm/actions/ExternalToolsAction.java

    r142 r143  
    77import java.io.FileReader;
    88import java.io.IOException;
    9 import java.io.OutputStream;
     9import java.io.PrintWriter;
    1010import java.util.Arrays;
    1111import java.util.Collection;
     
    3333import org.openstreetmap.josm.data.osm.Way;
    3434import org.openstreetmap.josm.data.osm.visitor.AddVisitor;
     35import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
    3536import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
    3637import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     38import org.openstreetmap.josm.gui.layer.Layer;
     39import org.openstreetmap.josm.gui.layer.RawGpsLayer;
     40import org.openstreetmap.josm.gui.layer.RawGpsLayer.GpsPoint;
     41import org.openstreetmap.josm.io.GpxWriter;
    3742import org.openstreetmap.josm.io.OsmReader;
    3843import org.openstreetmap.josm.io.OsmWriter;
     
    5560
    5661        private final class ExecuteToolRunner extends PleaseWaitRunnable {
    57         private final Process p;
    58         private DataSet dataSet;
    59         private DataSet fromDataSet;
    60         private ExecuteToolRunner(String msg, Process p) {
    61                 super(msg);
    62                 this.p = p;
    63                 currentAction.setText(tr("Executing {0}",getValue(NAME)));
    64         }
    65    
    66         @Override protected void realRun() throws SAXException, IOException {
    67                 if (!input.isEmpty()) {
    68                         fromDataSet = new DataSet();
    69                         AddVisitor adder = new AddVisitor(fromDataSet, flags.contains("include_references"));
    70                         if (input.contains("selection")) {
    71                                 Collection<OsmPrimitive> sel = Main.ds.getSelected();
    72                                 for (OsmPrimitive osm : sel)
    73                                         osm.visit(adder);
    74                                 if (flags.contains("include_back_references")) {
    75                                         CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
    76                                         for (OsmPrimitive osm : sel)
    77                                                 osm.visit(v);
    78                                         AddVisitor a = new AddVisitor(fromDataSet);
    79                                         for (OsmPrimitive osm : v.data)
    80                                                 osm.visit(a);
    81                                 }
    82                         }
    83                         if (input.contains("all"))
    84                                 for (OsmPrimitive osm : Main.ds.allPrimitives())
    85                                         osm.visit(adder);
    86                         if (input.contains("screen")) {
    87                                 if (Main.map == null) {
    88                                         errorMessage = tr("The Tool requires some data to be loaded.");
    89                                         cancel();
    90                                         return;
    91                                 }
    92                                 LatLon bottomLeft = Main.map.mapView.getLatLon(0,Main.map.mapView.getHeight());
    93                                 LatLon topRight = Main.map.mapView.getLatLon(Main.map.mapView.getWidth(), 0);
    94                                 Bounds b = new Bounds(bottomLeft, topRight);
    95                                 Collection<Node> nodes = new HashSet<Node>();
    96                                 for (Node n : Main.ds.nodes) {
    97                                         if (n.coor.isWithin(b)) {
    98                                                 n.visit(adder);
    99                                                 nodes.add(n);
    100                                         }
    101                                 }
    102                                 Collection<Segment> segments = new HashSet<Segment>();
    103                                 for (Segment s : Main.ds.segments) {
    104                                         if (nodes.contains(s.from) || nodes.contains(s.to)) {
    105                                                 s.visit(adder);
    106                                                 segments.add(s);
    107                                         }
    108                                 }
    109                                 for (Way w : Main.ds.ways) {
    110                                         for (Segment s : w.segments) {
    111                                                 if (segments.contains(s)) {
    112                                                         w.visit(adder);
    113                                                         break;
    114                                                 }
    115                                         }
    116                                 }
    117                         }
    118                         OutputStream out = p.getOutputStream();
    119                         OsmWriter.output(out, fromDataSet, false);
    120                         out.close();
    121                 }
    122                 if (output != null)
    123                         dataSet = OsmReader.parseDataSet(p.getInputStream(), currentAction, progress);
    124         }
    125    
    126         @Override protected void cancel() {
    127                 p.destroy();
    128         }
    129    
    130         @Override protected void finish() {
    131                 if (dataSet == null || output == null || output.equals("discard"))
    132                         return; // user cancelled or no stdout to process
    133                 Collection<OsmPrimitive> allNew = dataSet.allPrimitives();
    134                 Collection<OsmPrimitive> allOld = fromDataSet.allPrimitives();
    135                 if (output.equals("replace")) {
    136                         Command cmd = createCommand(allOld, allNew);
    137                         if (cmd != null) {
    138                                 Main.main.editLayer().add(cmd);
    139                                 Main.ds.clearSelection();
    140                         }
    141                 } else if (output.equals("selection")) {
    142                         Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
    143                         for (OsmPrimitive osm : Main.ds.allPrimitives())
    144                                 if (allNew.contains(osm))
    145                                         sel.add(osm);
    146                         Main.ds.setSelected(sel);
    147                 }
    148         }
    149    
    150         /**
    151          * Create a command that replaces all objects in from with those in to. The lists will be
    152          * changed by createCommand.
    153          */
    154         private Command createCommand(Collection<OsmPrimitive> from, Collection<OsmPrimitive> to) {
    155                 // remove all objects in from/to, that are present in both lists.
    156                 for (Iterator<OsmPrimitive> toIt = to.iterator(); toIt.hasNext();) {
    157                         OsmPrimitive osm = toIt.next();
    158                         for (Iterator<OsmPrimitive> fromIt = from.iterator(); fromIt.hasNext();) {
    159                                 if (fromIt.next().realEqual(osm)) {
    160                                         toIt.remove();
    161                                         fromIt.remove();
    162                                         break;
    163                                 }
    164                         }
    165                 }
    166    
    167                 Collection<Command> cmd = new LinkedList<Command>();
    168    
    169                 // extract all objects that have changed
    170                 for (Iterator<OsmPrimitive> toIt = to.iterator(); toIt.hasNext();) {
    171                         OsmPrimitive toOsm = toIt.next();
    172                         for (Iterator<OsmPrimitive> fromIt = from.iterator(); fromIt.hasNext();) {
    173                                 OsmPrimitive fromOsm = fromIt.next();
    174                                 if (fromOsm.equals(toOsm)) {
    175                                         toIt.remove();
    176                                         fromIt.remove();
    177                                         cmd.add(new ChangeCommand(fromOsm, toOsm));
    178                                         break;
    179                                 }
    180                         }
    181                 }
    182                 for (OsmPrimitive fromOsm : Main.ds.allPrimitives()) {
    183                         for (Iterator<OsmPrimitive> it = to.iterator(); it.hasNext();) {
    184                                 OsmPrimitive toOsm = it.next();
    185                                 if (fromOsm.equals(toOsm)) {
    186                                         it.remove();
    187                                         cmd.add(new ChangeCommand(fromOsm, toOsm));
    188                                         break;
    189                                 }
    190                         }
    191                 }
    192    
    193                 // extract all added objects
    194                 for (OsmPrimitive osm : to)
    195                         cmd.add(new AddCommand(osm));
    196    
    197                 // extract all deleted objects. Delete references as well.
    198                 CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
    199                 for (OsmPrimitive osm : from)
    200                         osm.visit(v);
    201                 v.data.addAll(from);
    202                 if (!v.data.isEmpty())
    203                         cmd.add(new DeleteCommand(v.data));
    204    
    205                 if (cmd.isEmpty())
    206                         return null;
    207                 return new SequenceCommand(tr("Executing {0}",getValue(NAME)), cmd);
    208         }
    209     }
     62                private final Process p;
     63                private DataSet dataSet;
     64                private DataSet fromDataSet;
     65                private ExecuteToolRunner(String msg, Process p) {
     66                        super(msg);
     67                        this.p = p;
     68                        currentAction.setText(tr("Executing {0}",getValue(NAME)));
     69                }
     70
     71                @Override protected void realRun() throws SAXException, IOException {
     72                        if (!input.isEmpty()) {
     73                                fromDataSet = new DataSet();
     74                                final Collection<GpsPoint> gpxPoints = new LinkedList<GpsPoint>();
     75                                final boolean addOsm = !flags.contains("noosm");
     76                                final boolean addGpx = flags.contains("gpx");
     77
     78                                AddVisitor adder = new AddVisitor(fromDataSet, flags.contains("include_references"));
     79                                if (input.contains("selection")) {
     80                                        Collection<OsmPrimitive> sel = Main.ds.getSelected();
     81                                        if (addOsm) {
     82                                                for (OsmPrimitive osm : sel)
     83                                                        osm.visit(adder);
     84                                                if (flags.contains("include_back_references")) {
     85                                                        CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
     86                                                        for (OsmPrimitive osm : sel)
     87                                                                osm.visit(v);
     88                                                        AddVisitor a = new AddVisitor(fromDataSet);
     89                                                        for (OsmPrimitive osm : v.data)
     90                                                                osm.visit(a);
     91                                                }
     92                                        }
     93                                        if (addGpx) {
     94                                                AllNodesVisitor v = new AllNodesVisitor();
     95                                                for (OsmPrimitive osm : sel)
     96                                                        osm.visit(v);
     97                                                Bounds b = new Bounds();
     98                                                for (Node n : v.nodes)
     99                                                        b.extend(n.coor);
     100                                                for (Layer l : Main.map.mapView.getAllLayers()) {
     101                                                        if (!(l instanceof RawGpsLayer))
     102                                                                continue;
     103                                                        RawGpsLayer layer = (RawGpsLayer)l;
     104                                                        for (Collection<GpsPoint> c : layer.data)
     105                                                                for (GpsPoint p : c)
     106                                                                        if (p.latlon.isWithin(b))
     107                                                                                gpxPoints.add(p);
     108                                                }
     109                                        }
     110                                }
     111                                if (input.contains("all")) {
     112                                        if (addOsm)
     113                                                for (OsmPrimitive osm : Main.ds.allPrimitives())
     114                                                        osm.visit(adder);
     115                                        for (Layer l : Main.map.mapView.getAllLayers())
     116                                                if (l instanceof RawGpsLayer)
     117                                                        for (Collection<GpsPoint> c : ((RawGpsLayer)l).data)
     118                                                                for (GpsPoint p : c)
     119                                                                        gpxPoints.add(p);
     120                                }
     121                                if (input.contains("screen")) {
     122                                        if (Main.map == null) {
     123                                                errorMessage = tr("The Tool requires some data to be loaded.");
     124                                                cancel();
     125                                                return;
     126                                        }
     127                                        LatLon bottomLeft = Main.map.mapView.getLatLon(0,Main.map.mapView.getHeight());
     128                                        LatLon topRight = Main.map.mapView.getLatLon(Main.map.mapView.getWidth(), 0);
     129                                        Bounds b = new Bounds(bottomLeft, topRight);
     130                                        if (addOsm) {
     131                                                Collection<Node> nodes = new HashSet<Node>();
     132                                                for (Node n : Main.ds.nodes) {
     133                                                        if (n.coor.isWithin(b)) {
     134                                                                n.visit(adder);
     135                                                                nodes.add(n);
     136                                                        }
     137                                                }
     138                                                Collection<Segment> segments = new HashSet<Segment>();
     139                                                for (Segment s : Main.ds.segments) {
     140                                                        if (nodes.contains(s.from) || nodes.contains(s.to)) {
     141                                                                s.visit(adder);
     142                                                                segments.add(s);
     143                                                        }
     144                                                }
     145                                                for (Way w : Main.ds.ways) {
     146                                                        for (Segment s : w.segments) {
     147                                                                if (segments.contains(s)) {
     148                                                                        w.visit(adder);
     149                                                                        break;
     150                                                                }
     151                                                        }
     152                                                }
     153                                        }
     154                                        if (addGpx) {
     155                                                for (Layer l : Main.map.mapView.getAllLayers())
     156                                                        if (l instanceof RawGpsLayer)
     157                                                                for (Collection<GpsPoint> c : ((RawGpsLayer)l).data)
     158                                                                        for (GpsPoint p : c)
     159                                                                                if (p.latlon.isWithin(b))
     160                                                                                        gpxPoints.add(p);
     161                                        }
     162                                }
     163                                OsmWriter.output(p.getOutputStream(), new OsmWriter.Osm(){
     164                                        public void write(PrintWriter out) {
     165                                                if (addOsm)
     166                                                        new OsmWriter.All(fromDataSet, false).write(out);
     167                                                if (addGpx) {
     168                                                        Collection<Collection<GpsPoint>> c = new LinkedList<Collection<GpsPoint>>();
     169                                                        c.add(gpxPoints);
     170                                                        GpxWriter.Trk writer = new GpxWriter.Trk(c);
     171                                                        writer.header(out);
     172                                                        if (!gpxPoints.isEmpty())
     173                                                                writer.write(out);
     174                                                        writer.footer(out);
     175                                                }
     176                                        }
     177                                });
     178                        }
     179                        if (output != null)
     180                                dataSet = OsmReader.parseDataSet(p.getInputStream(), currentAction, progress);
     181                }
     182
     183                @Override protected void cancel() {
     184                        p.destroy();
     185                }
     186
     187                @Override protected void finish() {
     188                        if (dataSet == null || output == null || output.equals("discard"))
     189                                return; // user cancelled or no stdout to process
     190                        Collection<OsmPrimitive> allNew = dataSet.allPrimitives();
     191                        Collection<OsmPrimitive> allOld = fromDataSet.allPrimitives();
     192                        if (output.equals("replace")) {
     193                                Command cmd = createCommand(allOld, allNew);
     194                                if (cmd != null) {
     195                                        Main.main.editLayer().add(cmd);
     196                                        Main.ds.clearSelection();
     197                                }
     198                        } else if (output.equals("selection")) {
     199                                Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
     200                                for (OsmPrimitive osm : Main.ds.allPrimitives())
     201                                        if (allNew.contains(osm))
     202                                                sel.add(osm);
     203                                Main.ds.setSelected(sel);
     204                        }
     205                }
     206
     207                /**
     208                 * Create a command that replaces all objects in from with those in to. The lists will be
     209                 * changed by createCommand.
     210                 */
     211                private Command createCommand(Collection<OsmPrimitive> from, Collection<OsmPrimitive> to) {
     212                        // remove all objects in from/to, that are present in both lists.
     213                        for (Iterator<OsmPrimitive> toIt = to.iterator(); toIt.hasNext();) {
     214                                OsmPrimitive osm = toIt.next();
     215                                for (Iterator<OsmPrimitive> fromIt = from.iterator(); fromIt.hasNext();) {
     216                                        if (fromIt.next().realEqual(osm)) {
     217                                                toIt.remove();
     218                                                fromIt.remove();
     219                                                break;
     220                                        }
     221                                }
     222                        }
     223
     224                        Collection<Command> cmd = new LinkedList<Command>();
     225
     226                        // extract all objects that have changed
     227                        for (Iterator<OsmPrimitive> toIt = to.iterator(); toIt.hasNext();) {
     228                                OsmPrimitive toOsm = toIt.next();
     229                                for (Iterator<OsmPrimitive> fromIt = from.iterator(); fromIt.hasNext();) {
     230                                        OsmPrimitive fromOsm = fromIt.next();
     231                                        if (fromOsm.equals(toOsm)) {
     232                                                toIt.remove();
     233                                                fromIt.remove();
     234                                                cmd.add(new ChangeCommand(fromOsm, toOsm));
     235                                                break;
     236                                        }
     237                                }
     238                        }
     239                        for (OsmPrimitive fromOsm : Main.ds.allPrimitives()) {
     240                                for (Iterator<OsmPrimitive> it = to.iterator(); it.hasNext();) {
     241                                        OsmPrimitive toOsm = it.next();
     242                                        if (fromOsm.equals(toOsm)) {
     243                                                it.remove();
     244                                                cmd.add(new ChangeCommand(fromOsm, toOsm));
     245                                                break;
     246                                        }
     247                                }
     248                        }
     249
     250                        // extract all added objects
     251                        for (OsmPrimitive osm : to)
     252                                cmd.add(new AddCommand(osm));
     253
     254                        // extract all deleted objects. Delete references as well.
     255                        CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds);
     256                        for (OsmPrimitive osm : from)
     257                                osm.visit(v);
     258                        v.data.addAll(from);
     259                        if (!v.data.isEmpty())
     260                                cmd.add(new DeleteCommand(v.data));
     261
     262                        if (cmd.isEmpty())
     263                                return null;
     264                        return new SequenceCommand(tr("Executing {0}",getValue(NAME)), cmd);
     265                }
     266        }
    210267
    211268        public ExternalToolsAction(String name, String[] exec, String[] flags, String[] input, String output) {
     
    242299                        @Override public void startDocument() {
    243300                                current.push(main);
    244             }
     301                        }
    245302                        @Override public void startElement(String ns, String lname, String qname, Attributes a) throws SAXException {
    246303                                if (qname.equals("group")) {
  • src/org/openstreetmap/josm/actions/GpxExportAction.java

    r113 r143  
    3030import org.openstreetmap.josm.gui.layer.RawGpsLayer;
    3131import org.openstreetmap.josm.io.GpxWriter;
     32import org.openstreetmap.josm.io.XmlWriter;
    3233import org.openstreetmap.josm.tools.GBC;
    3334
     
    117118                        Main.pref.put("lastCopyright", copyright.getText());
    118119               
    119                 try {
    120                         GpxWriter w = new GpxWriter(new FileOutputStream(file), layer.name, desc.getText(),
     120                XmlWriter.OsmWriterInterface w;
     121                if (layer instanceof RawGpsLayer)
     122                        w = new GpxWriter.Trk(((RawGpsLayer)layer).data);
     123                else
     124                        w = new GpxWriter.All(Main.ds, layer.name, desc.getText(),
    121125                                        authorName.getText(), email.getText(), copyright.getText(),
    122126                                        copyrightYear.getText(), keywords.getText());
    123                         if (layer instanceof RawGpsLayer)
    124                                 w.output(((RawGpsLayer)layer).data);
    125                         else
    126                                 w.output(Main.ds);
    127                         w.close();
     127                try {
     128                        XmlWriter.output(new FileOutputStream(file), w);
    128129                } catch (IOException x) {
    129130                        x.printStackTrace();
  • src/org/openstreetmap/josm/actions/SaveAction.java

    r142 r143  
    5454                                GpxExportAction.exportGpx(file, layer);
    5555                        } else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(file.getPath())) {
    56                                 OsmWriter.output(new FileOutputStream(file), Main.ds, false);
     56                                OsmWriter.output(new FileOutputStream(file), new OsmWriter.All(Main.ds, false));
    5757                        } else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(file.getPath())) {
    5858                                JOptionPane.showMessageDialog(Main.parent, tr("CSV output not supported yet."));
  • src/org/openstreetmap/josm/data/osm/visitor/Visitor.java

    r86 r143  
    11package org.openstreetmap.josm.data.osm.visitor;
    22
     3import org.openstreetmap.josm.data.osm.Node;
    34import org.openstreetmap.josm.data.osm.Segment;
    4 import org.openstreetmap.josm.data.osm.Node;
    55import org.openstreetmap.josm.data.osm.Way;
    66
  • src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java

    r129 r143  
    7777         */
    7878        private JTable history = new JTable(data);
     79        private JScrollPane historyPane = new JScrollPane(history);
    7980
    8081        private Map<OsmPrimitive, List<HistoryItem>> cache = new HashMap<OsmPrimitive, List<HistoryItem>>();
     
    8586        public HistoryDialog() {
    8687                super(tr("History"), "history", tr("Display the history of all selected items."), KeyEvent.VK_H, 150);
    87                 history.setVisible(false);
     88                historyPane.setVisible(false);
    8889                notLoaded.setVisible(true);
    8990
     
    115116                JPanel centerPanel = new JPanel(new GridBagLayout());
    116117                centerPanel.add(notLoaded, GBC.eol().fill(GBC.BOTH));
    117                 centerPanel.add(new JScrollPane(history), GBC.eol().fill(GBC.BOTH));
     118                centerPanel.add(historyPane, GBC.eol().fill(GBC.BOTH));
    118119                add(centerPanel, BorderLayout.CENTER);
    119120
     
    160161                Collection<OsmPrimitive> sel = Main.ds.getSelected();
    161162                if (!cache.keySet().containsAll(sel)) {
    162                         history.setVisible(false);
     163                        historyPane.setVisible(false);
    163164                        notLoaded.setVisible(true);
    164165                } else {
     
    169170                        for (HistoryItem i : orderedHistory)
    170171                                data.addRow(new Object[]{i.osm, i.osm.timestamp, i.visible});
    171                         history.setVisible(true);
     172                        historyPane.setVisible(true);
    172173                        notLoaded.setVisible(false);
    173174                }
  • src/org/openstreetmap/josm/io/GpxWriter.java

    r103 r143  
    11package org.openstreetmap.josm.io;
    22
    3 import java.io.OutputStream;
    4 import java.io.OutputStreamWriter;
    53import java.io.PrintWriter;
    6 import java.io.UnsupportedEncodingException;
    74import java.util.Collection;
    85import java.util.LinkedList;
     
    1613import org.openstreetmap.josm.data.osm.Way;
    1714import org.openstreetmap.josm.gui.layer.RawGpsLayer.GpsPoint;
    18 import org.openstreetmap.josm.tools.XmlWriter;
    1915
    2016/**
     
    2824 * @author imi
    2925 */
    30 public class GpxWriter {
    31 
    32         /**
    33          * This is the output writer to store the resulting data in.
    34          */
    35         private PrintWriter out;
    36 
    37         public GpxWriter(OutputStream os, String name, String desc, String author, String email, String copyright, String year, String keywords) {
    38                 try {
    39                         out = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    40                 } catch (UnsupportedEncodingException e) {
    41                         throw new RuntimeException(e);
    42                 }
    43                 out.println(XmlWriter.header());
    44                 out.println("<gpx version='1.1' creator='JOSM' xmlns='http://www.topografix.com/GPX/1/1'>");
    45                 out.println("  <metadata>");
    46                 if (!name.equals(""))
    47                         out.println("    <name>"+XmlWriter.encode(name)+"</name>");
    48                 if (!desc.equals(""))
    49                         out.println("    <desc>"+XmlWriter.encode(desc)+"</desc>");
    50                 if (!author.equals("")) {
    51                         out.println("    <author>");
    52                         out.println("      <name>"+XmlWriter.encode(author)+"</name>");
    53                         if (!email.equals(""))
    54                                 out.println("      <email>"+XmlWriter.encode(email)+"</email>");
    55                         out.println("    </author>");
    56                         if (!copyright.equals("")) {
    57                                 out.println("    <copyright author='"+XmlWriter.encode(author)+"'>");
    58                                 if (!year.equals(""))
    59                                         out.println("      <year>"+XmlWriter.encode(year)+"</year>");
    60                                 out.println("      <license>"+XmlWriter.encode(copyright)+"</license>");
    61                                 out.println("    </copyright>");
    62                         }
    63                 }
    64                 if (!keywords.equals("")) {
    65                         out.println("    <keywords>"+XmlWriter.encode(keywords)+"</keywords>");
    66                 }
    67                 // don't finish here, to give output functions the chance to add <bounds>
     26public class GpxWriter extends XmlWriter {
     27
     28        public GpxWriter(PrintWriter out) {
     29                super(out);
    6830        }
    6931
     
    7537         * all remaining nodes are added as wpt.
    7638         */
    77         public void output(DataSet data) {
    78                 Collection<OsmPrimitive> all = data.allNonDeletedPrimitives();
    79                 if (all.isEmpty()) {
     39        public static final class All implements XmlWriter.OsmWriterInterface {
     40                private final DataSet data;
     41                private final String name;
     42                private final String desc;
     43                private final String author;
     44                private final String email;
     45                private final String copyright;
     46                private final String year;
     47                private final String keywords;
     48                private boolean metadataClosed = false;
     49
     50                public All(DataSet data, String name, String desc, String author, String email, String copyright, String year, String keywords) {
     51                        this.data = data;
     52                        this.name = name;
     53                        this.desc = desc;
     54                        this.author = author;
     55                        this.email = email;
     56                        this.copyright = copyright;
     57                        this.year = year;
     58                        this.keywords = keywords;
     59                }
     60
     61                public void header(PrintWriter out) {
     62                        out.println("<gpx version='1.1' creator='JOSM' xmlns='http://www.topografix.com/GPX/1/1'>");
     63                        out.println("  <metadata>");
     64                        if (!name.equals(""))
     65                                out.println("    <name>"+XmlWriter.encode(name)+"</name>");
     66                        if (!desc.equals(""))
     67                                out.println("    <desc>"+XmlWriter.encode(desc)+"</desc>");
     68                        if (!author.equals("")) {
     69                                out.println("    <author>");
     70                                out.println("      <name>"+XmlWriter.encode(author)+"</name>");
     71                                if (!email.equals(""))
     72                                        out.println("      <email>"+XmlWriter.encode(email)+"</email>");
     73                                out.println("    </author>");
     74                                if (!copyright.equals("")) {
     75                                        out.println("    <copyright author='"+XmlWriter.encode(author)+"'>");
     76                                        if (!year.equals(""))
     77                                                out.println("      <year>"+XmlWriter.encode(year)+"</year>");
     78                                        out.println("      <license>"+XmlWriter.encode(copyright)+"</license>");
     79                                        out.println("    </copyright>");
     80                                }
     81                        }
     82                        if (!keywords.equals("")) {
     83                                out.println("    <keywords>"+XmlWriter.encode(keywords)+"</keywords>");
     84                        }
     85                        // don't finish here, to give output functions the chance to add <bounds>
     86                }
     87
     88                public void write(PrintWriter out) {
     89                        Collection<OsmPrimitive> all = data.allNonDeletedPrimitives();
     90                        if (all.isEmpty())
     91                                return;
     92                        GpxWriter writer = new GpxWriter(out);
     93                        // calculate bounds
     94                        Bounds b = new Bounds(new LatLon(Double.MAX_VALUE, Double.MAX_VALUE), new LatLon(Double.MIN_VALUE, Double.MIN_VALUE));
     95                        for (Node n : data.nodes)
     96                                if (!n.deleted)
     97                                        b.extend(n.coor);
     98                        out.println("    <bounds minlat='"+b.min.lat()+"' minlon='"+b.min.lon()+"' maxlat='"+b.max.lat()+"' maxlon='"+b.max.lon()+"' />");
    8099                        out.println("  </metadata>");
     100                        metadataClosed = true;
     101
     102                        // add ways
     103                        for (Way w : data.ways) {
     104                                if (w.deleted)
     105                                        continue;
     106                                out.println("  <trk>");
     107                                Segment oldLs = null;
     108                                for (Segment ls : w.segments) {
     109                                        if (ls.incomplete)
     110                                                continue;
     111                                        // end old segemnt, if no longer match a chain
     112                                        if (oldLs != null && !oldLs.to.coor.equals(ls.from.coor)) {
     113                                                out.println("    </trkseg>");
     114                                                writer.outputNode(oldLs.to, false);
     115                                                all.remove(oldLs.to);
     116                                                oldLs = null;
     117                                        }
     118                                        // start new segment if necessary
     119                                        if (oldLs == null)
     120                                                out.println("    <trkseg>");
     121                                        writer.outputNode(ls.from, false);
     122                                        all.remove(ls.from);
     123                                        oldLs = ls;
     124                                        all.remove(ls);
     125                                }
     126                                // write last node if there
     127                                if (oldLs != null) {
     128                                        writer.outputNode(oldLs.to, false);
     129                                        all.remove(oldLs.to);
     130                                        out.println("    </trkseg>");
     131                                }
     132                                out.println("  </trk>");
     133                                all.remove(w);
     134                        }
     135
     136                        // add remaining segments
     137                        Collection<Segment> segments = new LinkedList<Segment>();
     138                        for (OsmPrimitive osm : all)
     139                                if (osm instanceof Segment && !((Segment)osm).incomplete)
     140                                        segments.add((Segment)osm);
     141                        if (!segments.isEmpty()) {
     142                                out.println("  <trk>");
     143                                for (Segment ls : segments) {
     144                                        out.println("    <trkseg>");
     145                                        writer.outputNode(ls.from, false);
     146                                        all.remove(ls.from);
     147                                        writer.outputNode(ls.to, false);
     148                                        all.remove(ls.to);
     149                                        out.println("    </trkseg>");
     150                                        all.remove(ls);
     151                                }
     152                                out.println("  </trk>");
     153                        }
     154
     155                        // finally add the remaining nodes
     156                        for (OsmPrimitive osm : all)
     157                                if (osm instanceof Node)
     158                                        writer.outputNode((Node)osm, true);
     159                }
     160
     161                public void footer(PrintWriter out) {
     162                        if (!metadataClosed)
     163                                out.println("  </metadata>");
    81164                        out.println("</gpx>");
    82                         return;
    83                 }
    84                 // calculate bounds
    85                 Bounds b = new Bounds(new LatLon(Double.MAX_VALUE, Double.MAX_VALUE), new LatLon(Double.MIN_VALUE, Double.MIN_VALUE));
    86                 for (Node n : data.nodes)
    87                         if (!n.deleted)
    88                                 b.extend(n.coor);
    89                 out.println("    <bounds minlat='"+b.min.lat()+"' minlon='"+b.min.lon()+"' maxlat='"+b.max.lat()+"' maxlon='"+b.max.lon()+"' />");
    90                 out.println("  </metadata>");
    91 
    92                 // add ways
    93                 for (Way w : data.ways) {
    94                         if (w.deleted)
    95                                 continue;
    96                         out.println("  <trk>");
    97                         Segment oldLs = null;
    98                         for (Segment ls : w.segments) {
    99                                 if (ls.incomplete)
    100                                         continue;
    101                                 // end old segemnt, if no longer match a chain
    102                                 if (oldLs != null && !oldLs.to.coor.equals(ls.from.coor)) {
    103                                         out.println("    </trkseg>");
    104                                         outputNode(oldLs.to, false);
    105                                         all.remove(oldLs.to);
    106                                         oldLs = null;
    107                                 }
    108                                 // start new segment if necessary
    109                                 if (oldLs == null)
    110                                         out.println("    <trkseg>");
    111                                 outputNode(ls.from, false);
    112                                 all.remove(ls.from);
    113                                 oldLs = ls;
    114                                 all.remove(ls);
    115                         }
    116                         // write last node if there
    117                         if (oldLs != null) {
    118                                 outputNode(oldLs.to, false);
    119                                 all.remove(oldLs.to);
    120                                 out.println("    </trkseg>");
    121                         }
    122                         out.println("  </trk>");
    123                         all.remove(w);
    124                 }
    125 
    126                 // add remaining segments
    127                 Collection<Segment> segments = new LinkedList<Segment>();
    128                 for (OsmPrimitive osm : all)
    129                         if (osm instanceof Segment && !((Segment)osm).incomplete)
    130                                 segments.add((Segment)osm);
    131                 if (!segments.isEmpty()) {
    132                         out.println("  <trk>");
    133                         for (Segment ls : segments) {
    134                                 out.println("    <trkseg>");
    135                                 outputNode(ls.from, false);
    136                                 all.remove(ls.from);
    137                                 outputNode(ls.to, false);
    138                                 all.remove(ls.to);
    139                                 out.println("    </trkseg>");
    140                                 all.remove(ls);
    141                         }
    142                         out.println("  </trk>");
    143                 }
    144 
    145                 // finally add the remaining nodes
    146                 for (OsmPrimitive osm : all)
    147                         if (osm instanceof Node)
    148                                 outputNode((Node)osm, true);
    149 
    150                 out.println("</gpx>");
     165                }
    151166        }
    152167
     
    156171         * trk with as many trkseg as there are collections in the outer collection.
    157172         */
    158         public void output(Collection<Collection<GpsPoint>> data) {
    159                 if (data.size() == 0) {
     173        public static final class Trk implements XmlWriter.OsmWriterInterface {
     174                private final Collection<Collection<GpsPoint>> data;
     175                public Trk(Collection<Collection<GpsPoint>> data) {
     176                        this.data = data;
     177                }
     178
     179                public void header(PrintWriter out) {
     180                        out.println("<gpx version='1.1' creator='JOSM' xmlns='http://www.topografix.com/GPX/1/1'>");
     181                }
     182
     183                public void write(PrintWriter out) {
     184                        if (data.size() == 0)
     185                                return;
     186                        // calculate bounds
     187                        Bounds b = new Bounds(new LatLon(Double.MAX_VALUE, Double.MAX_VALUE), new LatLon(Double.MIN_VALUE, Double.MIN_VALUE));
     188                        for (Collection<GpsPoint> c : data)
     189                                for (GpsPoint p : c)
     190                                        b.extend(p.latlon);
    160191                        out.println("  </metadata>");
     192                        out.println("    <bounds minlat='"+b.min.lat()+"' minlon='"+b.min.lon()+"' maxlat='"+b.max.lat()+"' maxlon='"+b.max.lon()+"' />");
     193                        out.println("  </metadata>");
     194
     195                        out.println("  <trk>");
     196                        for (Collection<GpsPoint> c : data) {
     197                                out.println("    <trkseg>");
     198                                LatLon last = null;
     199                                for (GpsPoint p : c) {
     200                                        // skip double entries
     201                                        if (p.latlon.equals(last))
     202                                                continue;
     203                                        last =  p.latlon;
     204                                        LatLon ll = p.latlon;
     205                                        out.print("      <trkpt lat='"+ll.lat()+"' lon='"+ll.lon()+"'");
     206                                        if (p.time != null && p.time.length()!=0) {
     207                                                out.println(">");
     208                                                out.println("        <time>"+p.time+"</time>");
     209                                                out.println("      </trkpt>");
     210                                        } else
     211                                                out.println(" />");
     212                                }
     213                                out.println("    </trkseg>");
     214                        }
     215                        out.println("  </trk>");
     216                }
     217
     218                public void footer(PrintWriter out) {
    161219                        out.println("</gpx>");
    162                         return;
    163                 }
    164                 // calculate bounds
    165                 Bounds b = new Bounds(new LatLon(Double.MAX_VALUE, Double.MAX_VALUE), new LatLon(Double.MIN_VALUE, Double.MIN_VALUE));
    166                 for (Collection<GpsPoint> c : data)
    167                         for (GpsPoint p : c)
    168                                 b.extend(p.latlon);
    169                 out.println("    <bounds minlat='"+b.min.lat()+"' minlon='"+b.min.lon()+"' maxlat='"+b.max.lat()+"' maxlon='"+b.max.lon()+"' />");
    170                 out.println("  </metadata>");
    171 
    172                 out.println("  <trk>");
    173                 for (Collection<GpsPoint> c : data) {
    174                         out.println("    <trkseg>");
    175                         LatLon last = null;
    176                         for (GpsPoint p : c) {
    177                                 // skip double entries
    178                                 if (p.latlon.equals(last))
    179                                         continue;
    180                                 last =  p.latlon;
    181                                 LatLon ll = p.latlon;
    182                                 out.print("      <trkpt lat='"+ll.lat()+"' lon='"+ll.lon()+"'");
    183                                 if (p.time != null && p.time.length()!=0) {
    184                                         out.println(">");
    185                                         out.println("        <time>"+p.time+"</time>");
    186                                         out.println("      </trkpt>");
    187                                 } else
    188                                         out.println(" />");
    189                         }
    190                         out.println("    </trkseg>");
    191                 }
    192                 out.println("  </trk>");
    193                 out.println("</gpx>");
     220        }
    194221        }
    195222
     
    224251                        out.println(" />");
    225252        }
    226 
    227         public void close() {
    228                 out.flush();
    229                 out.close();
    230         }
    231253}
  • src/org/openstreetmap/josm/io/OsmServerWriter.java

    r113 r143  
    164164                        if (addBody) {
    165165                                OutputStream out = activeConnection.getOutputStream();
    166                                 OsmWriter.outputSingle(out, osm, true);
     166                                OsmWriter.output(out, new OsmWriter.Single(osm, true));
    167167                                out.close();
    168168                        }
     
    178178                        if (retCode != 200) {
    179179                                ByteArrayOutputStream o = new ByteArrayOutputStream();
    180                                 OsmWriter.outputSingle(o, osm, true);
     180                                OsmWriter.output(o, new OsmWriter.Single(osm, true));
    181181                                System.out.println(new String(o.toByteArray(), "UTF-8").toString());
    182182                                throw new RuntimeException(retCode+" "+retMsg);
  • src/org/openstreetmap/josm/io/OsmWriter.java

    r103 r143  
    11package org.openstreetmap.josm.io;
    22
    3 import java.io.OutputStream;
    4 import java.io.OutputStreamWriter;
    53import java.io.PrintWriter;
    6 import java.io.UnsupportedEncodingException;
    74import java.util.HashMap;
    85import java.util.Map.Entry;
     
    1411import org.openstreetmap.josm.data.osm.Way;
    1512import org.openstreetmap.josm.data.osm.visitor.Visitor;
    16 import org.openstreetmap.josm.tools.XmlWriter;
    1713
    1814/**
     
    2117 * @author imi
    2218 */
    23 public class OsmWriter implements Visitor {
    24 
    25         /**
    26          * The output writer to save the values to.
    27          */
    28         private PrintWriter out;
     19public class OsmWriter extends XmlWriter implements Visitor {
    2920
    3021        /**
     
    4031        private final boolean osmConform;
    4132
     33        public abstract static class Osm implements OsmWriterInterface {
     34                public void header(PrintWriter out) {
     35                        out.println("<osm version='0.3' generator='JOSM'>");
     36                }
     37                public void footer(PrintWriter out) {
     38                        out.println("</osm>");
     39                }
     40        }
     41       
    4242        /**
    43          * Output the data to the stream
    44          * @param osmConform <code>true</code>, if the xml should be 100% osm conform. In this
    45          *              case, not all information can be retrieved later (as example, modified state
    46          *              is lost and id's remain 0 instead of decrementing from -1)
     43         * An output writer for function output that writes everything of the given dataset into
     44         * the xml
    4745         */
    48         public static void output(OutputStream out, DataSet ds, boolean osmConform) {
    49                 OsmWriter writer = new OsmWriter(out, osmConform);
    50                 writer.out.println("<?xml version='1.0' encoding='UTF-8'?>");
    51                 writer.out.println("<osm version='0.3' generator='JOSM'>");
    52                 for (Node n : ds.nodes)
    53                         writer.visit(n);
    54                 for (Segment ls : ds.segments)
    55                         writer.visit(ls);
    56                 for (Way w : ds.ways)
    57                         writer.visit(w);
    58                 writer.out.println("</osm>");
    59                 writer.close();
     46        public static final class All extends Osm {
     47                private final DataSet ds;
     48                private final boolean osmConform;
     49
     50                /**
     51                 * Construct an writer function
     52                 * @param osmConform <code>true</code>, if the xml should be 100% osm conform. In this
     53                 *              case, not all information can be retrieved later (as example, modified state
     54                 *              is lost and id's remain 0 instead of decrementing from -1)
     55                 */
     56                public All(DataSet ds, boolean osmConform) {
     57                        this.ds = ds;
     58                        this.osmConform = osmConform;
     59                }
     60
     61                public void write(PrintWriter out) {
     62                        Visitor writer = new OsmWriter(out, osmConform);
     63                        for (Node n : ds.nodes)
     64                                writer.visit(n);
     65                        for (Segment ls : ds.segments)
     66                                writer.visit(ls);
     67                        for (Way w : ds.ways)
     68                                writer.visit(w);
     69        }
    6070        }
    6171
    62         public static void outputSingle(OutputStream out, OsmPrimitive osm, boolean osmConform) {
    63                 OsmWriter writer = new OsmWriter(out, osmConform);
    64                 writer.out.println(XmlWriter.header());
    65                 writer.out.println("<osm version='0.3' generator='JOSM'>");
    66                 osm.visit(writer);
    67                 writer.out.println("</osm>");
    68                 writer.close();
     72        /**
     73         * An output writer for functino output that writes only one specific primitive into
     74         * the xml
     75         */
     76        public static final class Single extends Osm {
     77                private final OsmPrimitive osm;
     78                private final boolean osmConform;
     79
     80                public Single(OsmPrimitive osm, boolean osmConform) {
     81                        this.osm = osm;
     82                        this.osmConform = osmConform;
     83                }
     84
     85                public void write(PrintWriter out) {
     86                        osm.visit(new OsmWriter(out, osmConform));
     87        }
    6988        }
    7089
    71         private OsmWriter(OutputStream out, boolean osmConform) {
    72                 try {
    73                 this.out = new PrintWriter(new OutputStreamWriter(out, "UTF-8"));
    74         } catch (UnsupportedEncodingException e) {
    75                 throw new RuntimeException(e);
    76         }
     90        private OsmWriter(PrintWriter out, boolean osmConform) {
     91                super(out);
    7792                this.osmConform = osmConform;
    7893        }
     
    146161                }
    147162        }
    148 
    149         public void close() {
    150             out.close();
    151     }
    152163}
  • src/org/openstreetmap/josm/io/XmlWriter.java

    r141 r143  
    1 package org.openstreetmap.josm.tools;
     1package org.openstreetmap.josm.io;
    22
     3import java.io.OutputStream;
     4import java.io.OutputStreamWriter;
     5import java.io.PrintWriter;
     6import java.io.UnsupportedEncodingException;
    37import java.util.HashMap;
    48
     
    913 */
    1014public class XmlWriter {
     15
     16        /**
     17         * The interface to write the data into an Osm stream
     18         * @author immanuel.scholz
     19         */
     20        public static interface OsmWriterInterface {
     21                void header(PrintWriter out);
     22                void write(PrintWriter out);
     23                void footer(PrintWriter out);
     24        }
     25
     26
     27        protected XmlWriter(PrintWriter out) {
     28                this.out = out;
     29        }
    1130
    1231        /**
     
    2948
    3049        /**
    31          * @return The standard XML1.0 header. Encoding is utf-8
     50         * Write the header and start tag, then call the runnable to add all real tags and finally
     51         * "closes" the xml by writing the footer.
    3252         */
    33         public static String header() {
    34                 return "<?xml version='1.0' encoding='UTF-8'?>";
     53        public static void output(OutputStream outStream, OsmWriterInterface outputWriter) {
     54                PrintWriter out;
     55                try {
     56                        out = new PrintWriter(new OutputStreamWriter(outStream, "UTF-8"));
     57                } catch (UnsupportedEncodingException e) {
     58                        throw new RuntimeException(e);
     59                }
     60                out.println("<?xml version='1.0' encoding='UTF-8'?>");
     61                outputWriter.header(out);
     62                outputWriter.write(out);
     63                outputWriter.footer(out);
     64                out.flush();
     65                out.close();
    3566        }
    3667
    37        
    38        
     68
     69
     70        /**
     71         * The output writer to save the values to.
     72         */
     73        protected final PrintWriter out;
    3974        final private static HashMap<Character, String> encoding = new HashMap<Character, String>();
    4075        static {
  • test/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java

    r135 r143  
    1111import org.openstreetmap.josm.data.osm.Segment;
    1212import org.openstreetmap.josm.data.osm.Way;
    13 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    1413import org.openstreetmap.josm.testframework.Bug;
    1514import org.openstreetmap.josm.testframework.DataSetTestCaseHelper;
     
    267266        /**
    268267         * Deleted segments should be deleted when merged over unchanged segments.
    269          * Deleted segments should also raise an conflict when merged over changed segments.
    270          */
    271         //TODO
    272 
     268         */
     269        public void testMergeDeletedOverUnchangedDeletes() {
     270                DataSet ds = new DataSet();
     271                Segment oldSegment = createSegment(ds, false, false, 23);
     272                Segment s = createSegment(null, false, true, 23);
     273               
     274                MergeVisitor v = new MergeVisitor(ds);
     275                v.visit(s);
     276                v.fixReferences();
     277               
     278                assertEquals(true, oldSegment.deleted);
     279        }
     280       
     281
     282        /**
     283         * Deleted segments should raise an conflict when merged over changed segments.
     284         */
     285        public void testMergeDeletedOverChangedConflict() {
     286                DataSet ds = new DataSet();
     287                createSegment(ds, false, false, 23).modified = true;
     288                Segment s = createSegment(null, false, true, 23);
     289               
     290                MergeVisitor v = new MergeVisitor(ds);
     291                v.visit(s);
     292                v.fixReferences();
     293               
     294                assertEquals(1, v.conflicts.size());
     295        }
     296
     297
     298        private Segment createSegment(DataSet ds, boolean incomplete, boolean deleted, int id) {
     299                Node n1 = DataSetTestCaseHelper.createNode(ds);
     300                Node n2 = DataSetTestCaseHelper.createNode(ds);
     301                Segment s = DataSetTestCaseHelper.createSegment(ds, n1, n2);
     302                s.incomplete = incomplete;
     303                s.id = id;
     304                s.deleted = deleted;
     305                return s;
     306        }
     307       
    273308        /**
    274309         * Create that amount of nodes and add them to the dataset. The id will be 1,2,3,4...
  • test/org/openstreetmap/josm/testframework/DataSetTestCaseHelper.java

    r135 r143  
    4444                Way t = new Way();
    4545                t.segments.addAll(Arrays.asList(segments));
    46                 ds.ways.add(t);
     46                if (ds != null)
     47                        ds.ways.add(t);
    4748                return t;
    4849        }
     
    5354        public static Segment createSegment(DataSet ds, Node n1, Node n2) {
    5455                Segment ls = new Segment(n1, n2);
    55                 ds.segments.add(ls);
     56                if (ds != null)
     57                        ds.segments.add(ls);
    5658                return ls;
    5759        }
Note: See TracChangeset for help on using the changeset viewer.