Changeset 2604 in josm for trunk/src/org/openstreetmap/josm/io/OsmChangeBuilder.java
- Timestamp:
- 2009-12-10T18:42:41+01:00 (14 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/io/OsmChangeBuilder.java
r2600 r2604 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.data.osm.visitor; 2 package org.openstreetmap.josm.io; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 3 5 4 6 import java.io.PrintWriter; 5 7 import java.io.StringWriter; 6 import java.util. Map;8 import java.util.Collection; 7 9 8 10 import org.openstreetmap.josm.data.osm.Changeset; 9 import org.openstreetmap.josm.data.osm.Node;10 11 import 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;15 12 16 13 /** … … 19 16 * OsmChange format. 20 17 * 21 * @author fred22 *23 18 */ 24 public class CreateOsmChangeVisitor extends AbstractVisitor { 19 public class OsmChangeBuilder { 20 static public final String DEFAULT_API_VERSION = "0.6"; 25 21 26 22 private String currentMode; … … 28 24 private StringWriter swriter; 29 25 private OsmWriter osmwriter; 30 private OsmApi api; 26 private String apiVersion = DEFAULT_API_VERSION; 27 private boolean prologWritten = false; 31 28 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; 33 35 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); 42 37 osmwriter.setChangeset(changeset); 43 38 } 44 39 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()) { 50 42 switchMode("delete"); 51 43 osmwriter.setWithBody(false); 52 osmwriter.visit(n);44 p.visit(osmwriter); 53 45 } else { 54 switchMode( n.isNew() ? "create" : "modify");46 switchMode(p.isNew() ? "create" : "modify"); 55 47 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); 79 49 } 80 50 } … … 83 53 if ((newMode != null && !newMode.equals(currentMode))||(newMode == null && currentMode != null)) { 84 54 if (currentMode != null) { 85 writer. write("</");86 writer. write(currentMode);87 writer. write(">\n");55 writer.print("</"); 56 writer.print(currentMode); 57 writer.println(">"); 88 58 } 89 59 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(">"); 95 63 } 96 64 currentMode = newMode; … … 98 66 } 99 67 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; 103 80 } 104 81 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(); 107 133 } 108 134 }
Note:
See TracChangeset
for help on using the changeset viewer.