// License: GPL. For details, see LICENSE file. package relcontext.relationfix; import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.command.ChangeCommand; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.data.osm.OsmPrimitiveType; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import relcontext.actions.PublicTransportHelper; /** * @see http://wiki.openstreetmap.org/wiki/Key:public_transport */ /** * Helper function for determinate role in public_transport relation * @author freeExec */ public class PublicTransportFixer extends RelationFixer { public PublicTransportFixer() { super("route", "public_transport"); } /*protected PublicTransportFixer(String...types) { super(types); }*/ @Override public boolean isRelationGood(Relation rel) { for (RelationMember m : rel.getMembers()) { if (m.getType().equals(OsmPrimitiveType.NODE) && !(m.getRole().startsWith(PublicTransportHelper.STOP) || m.getRole().startsWith(PublicTransportHelper.PLATFORM))) { setWarningMessage(tr("Node without ''stop'' or ''platform'' role found")); return false; } if (m.getType().equals(OsmPrimitiveType.WAY) && PublicTransportHelper.isWayPlatform(m) && !m.getRole().startsWith(PublicTransportHelper.PLATFORM)) { setWarningMessage(tr("Way platform without ''platform'' role found") + " r" + m.getUniqueId()); return false; } } clearWarningMessage(); return true; } /*@Override public boolean isFixerApplicable(Relation rel) { return true; }*/ @Override public Command fixRelation(Relation rel) { Relation r = rel; Relation rr = fixStopPlatformRole(r); boolean fixed = false; if (rr != null) { fixed = true; r = rr; } return fixed ? new ChangeCommand(rel, r) : null; } private Relation fixStopPlatformRole(Relation source) { Relation r = new Relation(source); boolean fixed = false; for (int i = 0; i < r.getMembersCount(); i++) { RelationMember m = r.getMember(i); String role = PublicTransportHelper.getRoleByMember(m); if (role != null && !m.getRole().startsWith(role)) { r.setMember(i, new RelationMember(role, m.getMember())); fixed = true; } } return fixed ? r : null; } }