Ignore:
Timestamp:
2009-12-10T18:42:41+01:00 (14 years ago)
Author:
Gubaer
Message:

New: JOSM reading, writing, merging changeset attribute
fixed #4090: Add changeset:* search option to JOSM's search engine

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/OsmChangeBuilder.java

    r2600 r2604  
    11// License: GPL. For details, see LICENSE file.
    2 package org.openstreetmap.josm.data.osm.visitor;
     2package org.openstreetmap.josm.io;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
    35
    46import java.io.PrintWriter;
    57import java.io.StringWriter;
    6 import java.util.Map;
     8import java.util.Collection;
    79
    810import org.openstreetmap.josm.data.osm.Changeset;
    9 import org.openstreetmap.josm.data.osm.Node;
    1011import org.openstreetmap.josm.data.osm.OsmPrimitive;
    11 import org.openstreetmap.josm.data.osm.Relation;
    12 import org.openstreetmap.josm.data.osm.Way;
    13 import org.openstreetmap.josm.io.OsmApi;
    14 import org.openstreetmap.josm.io.OsmWriter;
    1512
    1613/**
     
    1916 * OsmChange format.
    2017 *
    21  * @author fred
    22  *
    2318 */
    24 public class CreateOsmChangeVisitor extends AbstractVisitor {
     19public class OsmChangeBuilder {
     20    static public final String DEFAULT_API_VERSION = "0.6";
    2521
    2622    private String currentMode;
     
    2824    private StringWriter swriter;
    2925    private OsmWriter osmwriter;
    30     private OsmApi api;
     26    private String apiVersion = DEFAULT_API_VERSION;
     27    private boolean prologWritten = false;
    3128
    32     public CreateOsmChangeVisitor(Changeset changeset, OsmApi api) {
     29    public OsmChangeBuilder(Changeset changeset) {
     30        this(changeset, null /* default api version */);
     31    }
     32
     33    public OsmChangeBuilder(Changeset changeset, String apiVersion) {
     34        this.apiVersion = apiVersion == null ? DEFAULT_API_VERSION : apiVersion;
    3335        writer = new PrintWriter(swriter = new StringWriter());
    34         writer.write("<osmChange version=\"");
    35         writer.write(api.getVersion());
    36         writer.write("\" generator=\"JOSM\">\n");
    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());
     36        osmwriter = new OsmWriter(writer, false, apiVersion);
    4237        osmwriter.setChangeset(changeset);
    4338    }
    4439
    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 
    48     public void visit(Node n) {
    49         if (n.isDeleted()) {
     40    protected void write(OsmPrimitive p) {
     41        if (p.isDeleted()) {
    5042            switchMode("delete");
    5143            osmwriter.setWithBody(false);
    52             osmwriter.visit(n);
     44            p.visit(osmwriter);
    5345        } else {
    54             switchMode(n.isNew() ? "create" : "modify");
     46            switchMode(p.isNew() ? "create" : "modify");
    5547            osmwriter.setWithBody(true);
    56             osmwriter.visit(n);
    57         }
    58     }
    59     public void visit(Way w) {
    60         if (w.isDeleted()) {
    61             switchMode("delete");
    62             osmwriter.setWithBody(false);
    63             osmwriter.visit(w);
    64         } else {
    65             switchMode(w.isNew() ? "create" : "modify");
    66             osmwriter.setWithBody(true);
    67             osmwriter.visit(w);
    68         }
    69     }
    70     public void visit(Relation r) {
    71         if (r.isDeleted()) {
    72             switchMode("delete");
    73             osmwriter.setWithBody(false);
    74             osmwriter.visit(r);
    75         } else {
    76             switchMode(r.isNew() ? "create" : "modify");
    77             osmwriter.setWithBody(true);
    78             osmwriter.visit(r);
     48            p.visit(osmwriter);
    7949        }
    8050    }
     
    8353        if ((newMode != null && !newMode.equals(currentMode))||(newMode == null && currentMode != null)) {
    8454            if (currentMode != null) {
    85                 writer.write("</");
    86                 writer.write(currentMode);
    87                 writer.write(">\n");
     55                writer.print("</");
     56                writer.print(currentMode);
     57                writer.println(">");
    8858            }
    8959            if (newMode != null) {
    90                 writer.write("<");
    91                 writer.write(newMode);
    92                 writer.write(" version=\"");
    93                 writer.write(api.getVersion());
    94                 writer.write("\" generator=\"JOSM\">\n");
     60                writer.print("<");
     61                writer.print(newMode);
     62                writer.println(">");
    9563            }
    9664            currentMode = newMode;
     
    9866    }
    9967
    100     public String getDocument() {
    101         switchMode(null);
    102         return swriter.toString() + "</osmChange>\n";
     68    /**
     69     * Writes the prolog of the OsmChange document
     70     *
     71     * @throws IllegalStateException thrown if the prologs has already been written
     72     */
     73    public void start() throws IllegalStateException{
     74        if (prologWritten)
     75            throw new IllegalStateException(tr("Prolog of OsmChange document already written. Please write only once."));
     76        writer.print("<osmChange version=\"");
     77        writer.print(apiVersion);
     78        writer.println("\" generator=\"JOSM\">");
     79        prologWritten=true;
    10380    }
    10481
    105     public Map<OsmPrimitive,Long> getNewIdMap() {
    106         return osmwriter.usedNewIds;
     82    /**
     83     * Appends a collection of {@see OsmPrimitive}s to the OsmChange document.
     84     *
     85     * @param primitives the collection of primitives. Ignored if null.
     86     * @throws IllegalStateException thrown if the prologs has not been written yet
     87     * @see #start()
     88     * @see #append(OsmPrimitive)
     89     */
     90    public void append(Collection<OsmPrimitive> primitives) throws IllegalStateException{
     91        if (primitives == null) return;
     92        if (!prologWritten)
     93            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write frst."));
     94        for (OsmPrimitive p : primitives) {
     95            write(p);
     96        }
     97    }
     98
     99    /**
     100     * Appends an {@see OsmPrimitive} to the OsmChange document.
     101     *
     102     * @param p the primitive. Ignored if null.
     103     * @throws IllegalStateException thrown if the prologs has not been written yet
     104     * @see #start()
     105     * @see #append(Collection)
     106
     107     */
     108    public void append(OsmPrimitive p) {
     109        if (p == null) return;
     110        if (!prologWritten)
     111            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write frst."));
     112        write(p);
     113    }
     114
     115    /**
     116     * Writes the epilog of the OsmChange document
     117     *
     118     * @throws IllegalStateException thrown if the prologs has not been written yet
     119     */
     120    public void finish() throws IllegalStateException {
     121        if (!prologWritten)
     122            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write frst."));
     123        if (currentMode != null) {
     124            writer.print("</");
     125            writer.print(currentMode);
     126            writer.println(">");
     127        }
     128        writer.println("</osmChange>");
     129    }
     130
     131    public String getDocument() {
     132        return swriter.toString();
    107133    }
    108134}
Note: See TracChangeset for help on using the changeset viewer.