Changeset 11989 in josm for trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
- Timestamp:
- 2017-04-23T22:55:45+02:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
r11783 r11989 95 95 } 96 96 97 private static class RolePreset {98 private final List<Role> roles;99 private final String name;100 101 RolePreset(List<Role> roles, String name) {102 this.roles = roles;103 this.name = name;104 }105 }106 107 97 private static class RoleInfo { 108 98 private int total; … … 111 101 @Override 112 102 public void visit(Relation n) { 113 Map<String, RolePreset> allroles = buildAllRoles(n);103 List<Role> allroles = buildAllRoles(n); 114 104 if (allroles.isEmpty() && n.hasTag("type", "route") 115 105 && n.hasTag("route", "train", "subway", "monorail", "tram", "bus", "trolleybus", "aerialway", "ferry")) { … … 151 141 152 142 // return Roles grouped by key 153 private static Map<String, RolePreset> buildAllRoles(Relation n) {154 Map<String, RolePreset> allroles = new HashMap<>();143 private static List<Role> buildAllRoles(Relation n) { 144 List<Role> allroles = new LinkedList<>(); 155 145 156 146 for (TaggingPreset p : relationpresets) { … … 158 148 final Roles r = Utils.find(p.data, Roles.class); 159 149 if (matches && r != null) { 160 for (Role role: r.roles) { 161 String key = role.key; 162 List<Role> roleGroup; 163 if (allroles.containsKey(key)) { 164 roleGroup = allroles.get(key).roles; 165 } else { 166 roleGroup = new LinkedList<>(); 167 allroles.put(key, new RolePreset(roleGroup, p.name)); 168 } 169 roleGroup.add(role); 170 } 150 allroles.addAll(r.roles); 171 151 } 172 152 } … … 199 179 * get all role definition for specified key and check, if some definition matches 200 180 * 201 * @param rolePreset containing preset for roleof the member181 * @param allroles containing list of possible role presets of the member 202 182 * @param member to be verified 203 183 * @param n relation to be verified … … 205 185 * 206 186 */ 207 private boolean checkMemberExpressionAndType( RolePreset rolePreset, RelationMember member, Relation n) {208 if (rolePreset == null || rolePreset.roles == null) {209 // no restrictions on role types210 return true;211 }187 private boolean checkMemberExpressionAndType(List<Role> allroles, RelationMember member, Relation n) { 188 String role = member.getRole(); 189 String name = null; 190 // Set of all accepted types in template 191 Collection<TaggingPresetType> types = EnumSet.noneOf(TaggingPresetType.class); 212 192 TestError possibleMatchError = null; 213 193 // iterate through all of the role definition within preset 214 194 // and look for any matching definition 215 for (Role r: rolePreset.roles) { 195 for (Role r: allroles) { 196 if (!r.isRole(role)) { 197 continue; 198 } 199 name = r.key; 200 types.addAll(r.types); 216 201 if (checkMemberType(r, member)) { 217 202 // member type accepted by role definition … … 238 223 .message(ROLE_VERIF_PROBLEM_MSG, 239 224 marktr("Role of relation member does not match expression ''{0}'' in template {1}"), 240 r.memberExpression, rolePreset.name)225 r.memberExpression, name) 241 226 .primitives(member.getMember().isUsable() ? member.getMember() : n) 242 227 .build(); … … 251 236 } 252 237 253 if (possibleMatchError != null) { 238 if (name == null) { 239 return true; 240 } 241 else if (possibleMatchError != null) { 254 242 // if any error found, then assume that member type was correct 255 243 // and complain about not matching the memberExpression … … 260 248 // it could also fail at memberExpression, but we can't guess at which 261 249 262 // prepare Set of all accepted types in template263 Collection<TaggingPresetType> types = EnumSet.noneOf(TaggingPresetType.class);264 for (Role r: rolePreset.roles) {265 types.addAll(r.types);266 }267 268 250 // convert in localization friendly way to string of accepted types 269 251 String typesStr = types.stream().map(x -> tr(x.getName())).collect(Collectors.joining("/")); … … 272 254 .message(ROLE_VERIF_PROBLEM_MSG, 273 255 marktr("Type ''{0}'' of relation member with role ''{1}'' does not match accepted types ''{2}'' in template {3}"), 274 member.getType(), member.getRole(), typesStr, rolePreset.name)256 member.getType(), member.getRole(), typesStr, name) 275 257 .primitives(member.getMember().isUsable() ? member.getMember() : n) 276 258 .build()); … … 285 267 * @param map contains statistics of occurances of specified role types in relation 286 268 */ 287 private void checkRoles(Relation n, Map<String, RolePreset> allroles, Map<String, RoleInfo> map) {269 private void checkRoles(Relation n, List<Role> allroles, Map<String, RoleInfo> map) { 288 270 // go through all members of relation 289 271 for (RelationMember member: n.getMembers()) { 290 String role = member.getRole();291 292 272 // error reporting done inside 293 checkMemberExpressionAndType(allroles .get(role), member, n);273 checkMemberExpressionAndType(allroles, member, n); 294 274 } 295 275 296 276 // verify role counts based on whole role sets 297 for (RolePreset rp: allroles.values()) { 298 for (Role r: rp.roles) { 299 String keyname = r.key; 300 if (keyname.isEmpty()) { 301 keyname = tr("<empty>"); 302 } 303 checkRoleCounts(n, r, keyname, map.get(r.key)); 304 } 277 for (Role r: allroles) { 278 String keyname = r.key; 279 if (keyname.isEmpty()) { 280 keyname = tr("<empty>"); 281 } 282 checkRoleCounts(n, r, keyname, map.get(r.key)); 283 } 284 if("network".equals(n.get("type")) && !"bicycle".equals(n.get("route"))) { 285 return; 305 286 } 306 287 // verify unwanted members 307 288 for (String key : map.keySet()) { 308 if (!allroles.containsKey(key) && !"network".equals(n.get("type")) && !"bicycle".equals(n.get("route"))) { 309 String templates = allroles.keySet().stream().collect(Collectors.joining("/")); 289 boolean found = false; 290 for (Role r: allroles) { 291 if (r.isRole(key)) { 292 found = true; 293 break; 294 } 295 } 296 297 if (!found) { 298 String templates = allroles.stream().map(r -> r.key).collect(Collectors.joining("/")); 310 299 311 300 if (!key.isEmpty()) {
Note:
See TracChangeset
for help on using the changeset viewer.