source: osm/applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/PublicTransportFixer.java

Last change on this file was 36217, checked in by GerdP, 13 months ago

fix #23521: fix some memory leaks

  • dispose dialogs
  • either avoid to create clones of ways or relations or use setNodes(null) / setMembers(null)
  • replaces most ChangeCommand instances by better specialized alternatives
  • add some comments
  • fix some checkstyle / sonar issues
  • Property svn:eol-style set to native
File size: 3.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package relcontext.relationfix;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.util.ArrayList;
7import java.util.List;
8
9import org.openstreetmap.josm.command.ChangeMembersCommand;
10import org.openstreetmap.josm.command.Command;
11import org.openstreetmap.josm.data.osm.DataSet;
12import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
13import org.openstreetmap.josm.data.osm.Relation;
14import org.openstreetmap.josm.data.osm.RelationMember;
15import org.openstreetmap.josm.gui.MainApplication;
16import org.openstreetmap.josm.tools.Utils;
17
18import relcontext.actions.PublicTransportHelper;
19
20/**
21 * Helper function for determinate role in public_transport relation
22 * @author freeExec
23 * @see <a href="https://wiki.openstreetmap.org/wiki/Key:public_transport">osmwiki:Key:public_transport</a>
24 */
25public class PublicTransportFixer extends RelationFixer {
26
27 public PublicTransportFixer() {
28 super("route", "public_transport");
29 }
30
31 @Override
32 public boolean isRelationGood(Relation rel) {
33 for (RelationMember m : rel.getMembers()) {
34 if (m.getType() == OsmPrimitiveType.NODE
35 && !(m.getRole().startsWith(PublicTransportHelper.STOP) || m.getRole().startsWith(PublicTransportHelper.PLATFORM))) {
36 setWarningMessage(tr("Node without ''stop'' or ''platform'' role found"));
37 return false;
38 }
39 if (m.getType() == OsmPrimitiveType.WAY
40 && PublicTransportHelper.isWayPlatform(m)
41 && !m.getRole().startsWith(PublicTransportHelper.PLATFORM)) {
42 setWarningMessage(tr("Way platform without ''platform'' role found") + " r" + m.getUniqueId());
43 return false;
44 }
45 }
46 clearWarningMessage();
47 return true;
48 }
49
50 @Override
51 public Command fixRelation(Relation rel) {
52 List<RelationMember> members = fixStopPlatformRole(rel.getMembers());
53 if (!members.equals(rel.getMembers())) {
54 final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet());
55 return new ChangeMembersCommand(ds, rel, rel.getMembers());
56 }
57 return null;
58 }
59
60 /**
61 * Fix roles of members.
62 * @param origMembers original list of relation members
63 * @return either the original and unmodified list or a new one with at least one new item
64 */
65 private static List<RelationMember> fixStopPlatformRole(List<RelationMember> origMembers) {
66 List<RelationMember> members = origMembers;
67 for (int i = 0; i < members.size(); i++) {
68 RelationMember m = members.get(i);
69 String role = PublicTransportHelper.getRoleByMember(m);
70
71 if (role != null && !m.getRole().startsWith(role)) {
72 if (members == origMembers) {
73 members = new ArrayList<>(origMembers);
74 }
75 members.set(i, new RelationMember(role, m.getMember()));
76 }
77 }
78 return members;
79 }
80}
Note: See TracBrowser for help on using the repository browser.