Ignore:
Timestamp:
2009-04-06T20:18:48+02:00 (16 years ago)
Author:
framm
Message:
  • Major redesign of how JOSM talks to the OSM server. Connections now all go through a new OsmApi class that finds out which version the server uses. JOSM should now be able to handle 0.5 and 0.6 without configuration change. Config options osm-server.version and osm-server.additional-versions now obsolete. Handling of error and cancel situations might still need some improvement.
Location:
trunk/src/org/openstreetmap/josm/data/osm
Files:
1 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/Changeset.java

    r1169 r1523  
    22package org.openstreetmap.josm.data.osm;
    33
    4 import org.openstreetmap.josm.Main;
    5 import org.openstreetmap.josm.io.XmlWriter;
    6 import org.openstreetmap.josm.io.XmlWriter.OsmWriterInterface;
    7 import java.io.PrintWriter;
    8 import java.util.Map;
    9 import java.util.Map.Entry;
    10 import java.util.HashMap;
    11 import java.util.Collections;
    12 import java.util.Collection;
     4import org.openstreetmap.josm.data.osm.visitor.Visitor;
     5
    136
    147
     
    1912 *
    2013 */
    21 public final class Changeset /*extends OsmPrimitive*/ implements OsmWriterInterface {
    22     /**
    23      * The key/value list for this primitive.
    24      */
    25     public Map<String, String> keys;
    26 
    27     public long id = 0;
    28 
    29     /**
    30      * User that created this changeset, as specified by the server.
    31      * Never changed by JOSM.
    32      */
    33     public User user = null;
    34 
     14public final class Changeset extends OsmPrimitive {
    3515    /**
    3616     * Time of last modification to this object. This is not set by JOSM but
     
    4525    public String start_timestamp = null;
    4626
    47         private void addTags(PrintWriter out) {
    48                 if (this.keys != null) {
    49                         for (Entry<String, String> e : this.keys.entrySet())
    50                                 out.println("    <tag k='"+ XmlWriter.encode(e.getKey()) +
    51                                                 "' v='"+XmlWriter.encode(e.getValue())+ "' />");
    52                 }
    53         }
    54 
    55     public final void header(PrintWriter out) {
    56             out.print("<osm version='");
    57                 out.print(Main.pref.get("osm-server.version", "0.6"));
    58                 out.println("' generator='JOSM'>");
    59     }
    60     public final void write(PrintWriter out) {
    61         out.print("  <changeset");
    62         if (id != 0)
    63             out.print(" id="+id);
    64         if (this.user != null) {
    65             out.print(" user='"+XmlWriter.encode(this.user.name)+"'");
    66         }
    67         out.println(">\n");
    68         addTags( out );
    69         out.println("  </changeset>");
    70     }
    71     public final void footer(PrintWriter out) {
    72         out.println("</osm>");
     27    public void visit(Visitor v) {
     28        v.visit(this);
    7329    }
    7430
    75     /******************************************************
    76      * This tag stuff is copied from OsmPrimitive. Perhaps a changeset
    77      * really is a primitive, but it's not right now. Perhaps it should
    78      * be...
    79      ******************************************************/
    80 
    81     /**
    82      * Set the given value to the given key
    83      * @param key The key, for which the value is to be set.
    84      * @param value The value for the key.
    85      */
    86     public final void put(String key, String value) {
    87         if (value == null)
    88             remove(key);
    89         else {
    90             if (keys == null)
    91                 keys = new HashMap<String, String>();
    92             keys.put(key, value);
    93         }
     31    public int compareTo(OsmPrimitive arg0) {
     32        if (arg0 instanceof Changeset) return Long.valueOf(id).compareTo(arg0.id);
     33        return 1;
    9434    }
    95     /**
    96      * Remove the given key from the list.
    97      */
    98     public final void remove(String key) {
    99         if (keys != null) {
    100             keys.remove(key);
    101             if (keys.isEmpty())
    102                 keys = null;
    103         }
    104     }
    105 
    106     public final String get(String key) {
    107         return keys == null ? null : keys.get(key);
    108     }
    109 
    110     public final Collection<Entry<String, String>> entrySet() {
    111         if (keys == null)
    112             return Collections.emptyList();
    113         return keys.entrySet();
    114     }
    115 
    116     public final Collection<String> keySet() {
    117         if (keys == null)
    118             return Collections.emptyList();
    119         return keys.keySet();
    120     }
     35   
     36   
    12137}
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r1415 r1523  
    2424public class DataSet implements Cloneable {
    2525
     26    /**
     27     * The API version that created this data set, if any.
     28     */
     29    public String version;
     30   
    2631    /**
    2732     * All nodes goes here, even when included in other data (ways etc). This enables the instant
     
    209214        for (DataSource source : dataSources)
    210215            ds.dataSources.add(new DataSource(source.bounds, source.origin));
     216        ds.version = version;
    211217        return ds;
    212218    }
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r1499 r1523  
    211211        final int[] ret = new int[1];
    212212        Visitor v = new Visitor(){
    213             public void visit(Node n) { ret[0] = 1; }
    214             public void visit(Way w) { ret[0] = 2; }
    215             public void visit(Relation e) { ret[0] = 3; }
     213            public void visit(Node n) { ret[0] = 0; }
     214            public void visit(Way w) { ret[0] = 1; }
     215            public void visit(Relation e) { ret[0] = 2; }
     216            public void visit(Changeset cs) { ret[0] = 3; }
    216217        };
    217218        visit(v);
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java

    r1169 r1523  
    1414 * @author imi
    1515 */
    16 public class AddVisitor implements Visitor {
     16public class AddVisitor extends AbstractVisitor {
    1717
    1818    protected final DataSet ds;
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/AllNodesVisitor.java

    r1169 r1523  
    1616 * @author imi
    1717 */
    18 public class AllNodesVisitor implements Visitor {
     18public class AllNodesVisitor extends AbstractVisitor {
    1919
    2020    /**
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java

    r1415 r1523  
    1717 * @author imi
    1818 */
    19 public class BoundingXYVisitor implements Visitor {
     19public class BoundingXYVisitor extends AbstractVisitor {
    2020
    2121    public EastNorth min, max;
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java

    r1169 r1523  
    1919 * @author imi
    2020 */
    21 public class CollectBackReferencesVisitor implements Visitor {
     21public class CollectBackReferencesVisitor extends AbstractVisitor {
    2222
    2323    private final DataSet ds;
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/CreateOsmChangeVisitor.java

    r1169 r1523  
    66import java.util.Map;
    77
    8 import org.openstreetmap.josm.Main;
    98import org.openstreetmap.josm.data.osm.Changeset;
    109import org.openstreetmap.josm.data.osm.Node;
     
    1211import org.openstreetmap.josm.data.osm.Relation;
    1312import org.openstreetmap.josm.data.osm.Way;
     13import org.openstreetmap.josm.io.OsmApi;
    1414import org.openstreetmap.josm.io.OsmWriter;
    1515
     
    2222 *
    2323 */
    24 public class CreateOsmChangeVisitor implements Visitor {
     24public class CreateOsmChangeVisitor extends AbstractVisitor {
    2525
    26     StringBuffer document;
    27     String currentMode;
    28     Changeset changeset;
    29     PrintWriter writer;
    30     StringWriter swriter;
    31     OsmWriter osmwriter;
     26    private String currentMode;
     27    private PrintWriter writer;
     28    private StringWriter swriter;
     29    private OsmWriter osmwriter;
     30    private OsmApi api;
    3231
    33     public CreateOsmChangeVisitor(Changeset changeset) {
     32    public CreateOsmChangeVisitor(Changeset changeset, OsmApi api) {
    3433        writer = new PrintWriter(swriter = new StringWriter());
    3534        writer.write("<osmChange version=\"");
    36         writer.write(Main.pref.get("osm-server.version", "0.6"));
     35        writer.write(api.getVersion());
    3736        writer.write("\" generator=\"JOSM\">\n");
    38         this.changeset = changeset;
    39         osmwriter = new OsmWriter(writer, false, changeset);
     37        this.api = api;
     38        // need to set osmConform = false here so that negative IDs get transmitted.
     39        // this also enables unnecessary and (if the API were more strict) potentially
     40        // harmful action="..." attributes.
     41        osmwriter = new OsmWriter(writer, false, api.getVersion());
     42        osmwriter.setChangeset(changeset);
    4043    }
    4144
     45    // FIXME: This should really NOT use a visitor pattern, it looks
     46    // stupid. Just have one method named "write" instead of three "visit"s.
     47   
    4248    public void visit(Node n) {
    4349        if (n.deleted) {
    4450            switchMode("delete");
    45             writer.write("<node id=\"");
    46             writer.write(Long.toString(n.id));
    47             writer.write("\" version=\"");
    48             writer.write(Long.toString(n.version));
    49             writer.write("\" changeset=\"");
    50             writer.write(Long.toString(changeset.id));
    51             writer.write("\" />\n");
     51            osmwriter.setWithBody(false);
     52            osmwriter.visit(n);
    5253        } else {
    5354            switchMode((n.id == 0) ? "create" : "modify");
    54             n.visit(osmwriter);
     55            osmwriter.setWithBody(true);
     56            osmwriter.visit(n);
    5557        }
    5658    }
    57 
    5859    public void visit(Way w) {
    5960        if (w.deleted) {
    6061            switchMode("delete");
    61             writer.write("<way id=\"");
    62             writer.write(Long.toString(w.id));
    63             writer.write("\" version=\"");
    64             writer.write(Long.toString(w.version));
    65             writer.write("\" changeset=\"");
    66             writer.write(Long.toString(changeset.id));
    67             writer.write("\" />\n");
     62            osmwriter.setWithBody(false);
     63            osmwriter.visit(w);
    6864        } else {
    6965            switchMode((w.id == 0) ? "create" : "modify");
    70             w.visit(osmwriter);
     66            osmwriter.setWithBody(true);
     67            osmwriter.visit(w);
    7168        }
    7269    }
    73 
    7470    public void visit(Relation r) {
    7571        if (r.deleted) {
    7672            switchMode("delete");
    77             writer.write("<relation id=\"");
    78             writer.write(Long.toString(r.id));
    79             writer.write("\" version=\"");
    80             writer.write(Long.toString(r.version));
    81             writer.write("\" changeset=\"");
    82             writer.write(Long.toString(changeset.id));
    83             writer.write("\" />\n");
     73            osmwriter.setWithBody(false);
     74            osmwriter.visit(r);
    8475        } else {
    8576            switchMode((r.id == 0) ? "create" : "modify");
    86             r.visit(osmwriter);
     77            osmwriter.setWithBody(true);
     78            osmwriter.visit(r);
    8779        }
    8880    }
    89 
     81   
    9082    private void switchMode(String newMode) {
    9183        if ((newMode != null && !newMode.equals(currentMode))||(newMode == null && currentMode != null)) {
     
    9991                writer.write(newMode);
    10092                writer.write(" version=\"");
    101                 writer.write(Main.pref.get("osm-server.version", "0.6"));
     93                writer.write(api.getVersion());
    10294                writer.write("\" generator=\"JOSM\">\n");
    10395            }
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java

    r1169 r1523  
    1414 * @author imi
    1515 */
    16 public class DeleteVisitor implements Visitor {
     16public class DeleteVisitor extends AbstractVisitor {
    1717
    1818    private final DataSet ds;
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

    r1501 r1523  
    1616import java.awt.Stroke;
    1717import java.awt.geom.GeneralPath;
     18import java.util.ArrayList;
    1819import java.util.Arrays;
    19 import java.util.ArrayList;
    2020import java.util.Collection;
     21import java.util.Iterator;
    2122import java.util.LinkedList;
    22 import java.util.Locale;
    23 import java.util.Iterator;
    2423
    2524import javax.swing.ImageIcon;
    2625
    2726import org.openstreetmap.josm.Main;
     27import org.openstreetmap.josm.data.coor.EastNorth;
     28import org.openstreetmap.josm.data.coor.LatLon;
    2829import org.openstreetmap.josm.data.osm.DataSet;
    2930import org.openstreetmap.josm.data.osm.Node;
     
    3233import org.openstreetmap.josm.data.osm.RelationMember;
    3334import org.openstreetmap.josm.data.osm.Way;
    34 import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
    35 import org.openstreetmap.josm.data.coor.LatLon;
    36 import org.openstreetmap.josm.data.coor.EastNorth;
    3735import org.openstreetmap.josm.gui.mappaint.AreaElemStyle;
    3836import org.openstreetmap.josm.gui.mappaint.ElemStyle;
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java

    r1499 r1523  
    2222 * @author imi
    2323 */
    24 public class MergeVisitor implements Visitor {
     24public class MergeVisitor extends AbstractVisitor {
    2525
    2626    /**
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java

    r1169 r1523  
    2020 * @author imi
    2121 */
    22 public class NameVisitor implements Visitor {
     22public class NameVisitor extends AbstractVisitor {
    2323
    2424    /**
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java

    r1499 r1523  
    3333 * @author imi
    3434 */
    35 public class SimplePaintVisitor implements Visitor {
     35public class SimplePaintVisitor extends AbstractVisitor {
    3636
    3737    public final static Color darkerblue = new Color(0,0,96);
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/Visitor.java

    r1169 r1523  
    22package org.openstreetmap.josm.data.osm.visitor;
    33
     4import org.openstreetmap.josm.data.osm.Changeset;
    45import org.openstreetmap.josm.data.osm.Relation;
    56import org.openstreetmap.josm.data.osm.Node;
     
    1617    void visit(Way w);
    1718    void visit(Relation e);
     19    void visit(Changeset cs);
    1820}
Note: See TracChangeset for help on using the changeset viewer.