source: josm/trunk/src/org/openstreetmap/josm/data/osm/Relation.java@ 1670

Last change on this file since 1670 was 1670, checked in by Gubaer, 15 years ago

fixed: bug in OsmApi.getOsmApi()
cleanup: exception handling in interfacing with OSM API
new: new action for updating individual elements with the their current state on the server (including new menu item in the file menu)
new: improved user feedback in case of conflicts
new: handles 410 Gone conflicts when uploading a changeset
new: undoable command for "purging" a primitive from the current dataset (necessary if the primitive is already deleted on the server and the user wants to remove it from its local dataset)
new: undoable command for "undeleting" an already deleted primitive on the server (kind of "cloning")
new: after a full upload, checks whether there are primitives in the local dataset which might be deleted on the server.
new: data structures for history data
new: history download support in io package

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1package org.openstreetmap.josm.data.osm;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4import static org.openstreetmap.josm.tools.I18n.trn;
5
6import java.util.Arrays;
7import java.util.ArrayList;
8import java.util.Collection;
9import java.util.List;
10
11import org.openstreetmap.josm.data.osm.visitor.Visitor;
12import org.openstreetmap.josm.Main;
13
14/**
15 * An relation, having a set of tags and any number (0...n) of members.
16 *
17 * @author Frederik Ramm <frederik@remote.org>
18 */
19public final class Relation extends OsmPrimitive {
20
21 /**
22 * All members of this relation. Note that after changing this,
23 * makeBackReferences and/or removeBackReferences should be called.
24 */
25 public final List<RelationMember> members = new ArrayList<RelationMember>();
26
27 final static String[] defnames = {"name", "ref", "restriction", "note"};
28 static Collection<String> names = null;
29
30 @Override public void visit(Visitor visitor) {
31 visitor.visit(this);
32 }
33
34 /**
35 * Create an identical clone of the argument (including the id)
36 */
37 public Relation(Relation clone) {
38 cloneFrom(clone);
39 }
40
41 /**
42 * Create an incomplete Relation.
43 */
44 public Relation(long id) {
45 this.id = id;
46 incomplete = true;
47 }
48
49 /**
50 * Create an empty Relation. Use this only if you set meaningful values
51 * afterwards.
52 */
53 public Relation() {
54 }
55
56 @Override public void cloneFrom(OsmPrimitive osm) {
57 super.cloneFrom(osm);
58 members.clear();
59 // we must not add the members themselves, but instead
60 // add clones of the members
61 for (RelationMember em : ((Relation)osm).members) {
62 members.add(new RelationMember(em));
63 }
64 }
65
66 @Override public String toString() {
67 // return "{Relation id="+id+" version="+version+" members="+Arrays.toString(members.toArray())+"}";
68 // adding members in string increases memory usage a lot and overflows for looped relations
69 return "{Relation id="+id+" version="+version+"}";
70 }
71
72 @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {
73 return osm instanceof Relation ? super.realEqual(osm, semanticOnly) && members.equals(((Relation)osm).members) : false;
74 }
75
76 public int compareTo(OsmPrimitive o) {
77 return o instanceof Relation ? Long.valueOf(id).compareTo(o.id) : -1;
78 }
79
80 @Override
81 public String getName() {
82 String name;
83 if (incomplete) {
84 name = tr("incomplete");
85 } else {
86 name = get("type");
87 if (name == null) {
88 name = tr("relation");
89 }
90
91 name += " (";
92 if(names == null) {
93 names = Main.pref.getCollection("relation.nameOrder", Arrays.asList(defnames));
94 }
95 String nameTag = null;
96 for (String n : names) {
97 nameTag = get(n);
98 if (nameTag != null) {
99 break;
100 }
101 }
102 if (nameTag != null) {
103 name += "\"" + nameTag + "\", ";
104 }
105
106 int mbno = members.size();
107 name += trn("{0} member", "{0} members", mbno, mbno) + ")";
108 if(errors != null) {
109 name = "*"+name;
110 }
111 }
112 return name;
113 }
114
115 // seems to be different from member "incomplete" - FIXME
116 public boolean isIncomplete() {
117 for (RelationMember m : members)
118 if (m.member == null)
119 return true;
120 return false;
121 }
122
123 public RelationMember firstMember() {
124 if (incomplete) return null;
125 return (members.size() == 0) ? null : members.get(0);
126 }
127 public RelationMember lastMember() {
128 if (incomplete) return null;
129 return (members.size() == 0) ? null : members.get(members.size() -1);
130 }
131
132 /**
133 * removes all members with member.member == primitive
134 *
135 * @param primitive the primitive to check for
136 */
137 public void removeMembersFor(OsmPrimitive primitive) {
138 if (primitive == null)
139 return;
140
141 ArrayList<RelationMember> todelete = new ArrayList<RelationMember>();
142 for (RelationMember member: members) {
143 if (member.member == primitive) {
144 todelete.add(member);
145 }
146 }
147 members.removeAll(todelete);
148 }
149}
Note: See TracBrowser for help on using the repository browser.