Ignore:
Timestamp:
2009-12-27T16:51:22+01:00 (10 years ago)
Author:
mjulius
Message:

fixes #4149 - exception when undoing reversal of way with tag corrections

don't try to undo Command for a primitive that does not belong to a dataset

fixes issue with ChangeRelationMemberRoleCommand.undoCommand() doing nothing except resetting modified flag
don't reverse tags on way nodes when reversing way
reversing way now also reverses 'incline=*' tags

Location:
trunk/src/org/openstreetmap/josm/corrector
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java

    r2676 r2683  
    55
    66import java.util.ArrayList;
     7import java.util.Arrays;
    78import java.util.Collection;
    89import java.util.HashMap;
     
    6869    };
    6970
     71    private static ArrayList<String> reversibleTags = new ArrayList<String>(
     72            Arrays.asList(new String[] {"oneway", "incline"}));
     73
    7074    public static boolean isReversible(Way way) {
    71         ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
    72         primitives.add(way);
    73         primitives.addAll(way.getNodes());
    74 
    75         for  (OsmPrimitive primitive : primitives) {
    76             for (String key : primitive.keySet()) {
    77                 if (key.equals("oneway")) return false;
    78                 for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
    79                     if (!key.equals(prefixSuffixSwitcher.apply(key))) return false;
    80                 }
     75        for (String key : way.keySet()) {
     76            if (reversibleTags.contains(key)) return false;
     77            for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
     78                if (!key.equals(prefixSuffixSwitcher.apply(key))) return false;
    8179            }
    8280        }
     
    9593    }
    9694
     95    public String invertNumber(String value) {
     96        Pattern pattern = Pattern.compile("^([+-]?)(\\d.*)$", Pattern.CASE_INSENSITIVE);
     97        Matcher matcher = pattern.matcher(value);
     98        if (!matcher.matches()) return value;
     99        String sign = matcher.group(1);
     100        String rest = matcher.group(2);
     101        sign = sign.equals("-") ? "" : "-";
     102        return sign + rest;
     103    }
     104
    97105    @Override
    98106    public Collection<Command> execute(Way oldway, Way way) throws UserCancelException {
     
    100108            new HashMap<OsmPrimitive, List<TagCorrection>>();
    101109
    102         ArrayList<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
    103         primitives.add(way);
    104         primitives.addAll(way.getNodes());
     110        ArrayList<TagCorrection> tagCorrections = new ArrayList<TagCorrection>();
     111        for (String key : way.keySet()) {
     112            String newKey = key;
     113            String value = way.get(key);
     114            String newValue = value;
    105115
    106         for (OsmPrimitive primitive : primitives) {
    107             tagCorrectionsMap.put(primitive, new ArrayList<TagCorrection>());
    108 
    109             for (String key : primitive.keySet()) {
    110                 String newKey = key;
    111                 String value = primitive.get(key);
    112                 String newValue = value;
    113 
    114                 if (key.equals("oneway")) {
    115                     if (OsmUtils.isReversed(value)) {
    116                         newValue = OsmUtils.trueval;
    117                     } else {
    118                         Boolean boolValue = OsmUtils.getOsmBoolean(value);
    119                         if (boolValue != null && boolValue.booleanValue()) {
    120                             newValue = OsmUtils.reverseval;
    121                         }
    122                     }
    123                 } else {
    124                     for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
    125                         newKey = prefixSuffixSwitcher.apply(key);
    126                         if (!key.equals(newKey)) {
    127                             break;
    128                         }
     116            if (key.equals("oneway")) {
     117                if (OsmUtils.isReversed(value)) {
     118                    newValue = OsmUtils.trueval;
     119                } else if (OsmUtils.isTrue(value)) {
     120                    newValue = OsmUtils.reverseval;
     121                }
     122            } else if (key.equals("incline")) {
     123                PrefixSuffixSwitcher switcher = new PrefixSuffixSwitcher("up", "down");
     124                newValue = switcher.apply(value);
     125                if (newValue.equals(value)) {
     126                    newValue = invertNumber(value);
     127                }
     128            } else {
     129                for (PrefixSuffixSwitcher prefixSuffixSwitcher : prefixSuffixSwitchers) {
     130                    newKey = prefixSuffixSwitcher.apply(key);
     131                    if (!key.equals(newKey)) {
     132                        break;
    129133                    }
    130134                }
     135            }
    131136
    132                 if (!key.equals(newKey) || !value.equals(newValue)) {
    133                     tagCorrectionsMap.get(primitive).add(
    134                             new TagCorrection(key, value, newKey, newValue));
    135                 }
     137            if (!key.equals(newKey) || !value.equals(newValue)) {
     138                tagCorrections.add(new TagCorrection(key, value, newKey, newValue));
    136139            }
     140        }
     141        if (!tagCorrections.isEmpty()) {
     142            tagCorrectionsMap.put(way, tagCorrections);
    137143        }
    138144
    139145        Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap =
    140146            new HashMap<OsmPrimitive, List<RoleCorrection>>();
    141         roleCorrectionMap.put(way, new ArrayList<RoleCorrection>());
     147        ArrayList<RoleCorrection> roleCorrections = new ArrayList<RoleCorrection>();
    142148
    143149        Collection<OsmPrimitive> referrers = oldway.getReferrers();
     
    166172
    167173                if (found) {
    168                     roleCorrectionMap.get(way).add(
    169                             new RoleCorrection(relation, position, member, newRole));
     174                    roleCorrections.add(new RoleCorrection(relation, position, member, newRole));
    170175                }
    171176
    172177                position++;
    173178            }
     179        }
     180        if (!roleCorrections.isEmpty()) {
     181            roleCorrectionMap.put(way, roleCorrections);
    174182        }
    175183
  • trunk/src/org/openstreetmap/josm/corrector/TagCorrector.java

    r2676 r2683  
    5050            String description) throws UserCancelException {
    5151
    52         boolean hasCorrections = false;
    53         for (List<TagCorrection> tagCorrectionList : tagCorrectionsMap.values()) {
    54             if (!tagCorrectionList.isEmpty()) {
    55                 hasCorrections = true;
    56                 break;
    57             }
    58         }
    59 
    60         if (!hasCorrections) {
    61             for (List<RoleCorrection> roleCorrectionList : roleCorrectionMap
    62                     .values()) {
    63                 if (!roleCorrectionList.isEmpty()) {
    64                     hasCorrections = true;
    65                     break;
    66                 }
    67             }
    68         }
    69 
    70         if (hasCorrections) {
     52        if (!tagCorrectionsMap.isEmpty() || !roleCorrectionMap.isEmpty()) {
    7153            Collection<Command> commands = new ArrayList<Command>();
    7254            Map<OsmPrimitive, TagCorrectionTable> tagTableMap =
     
    7456            Map<OsmPrimitive, RoleCorrectionTable> roleTableMap =
    7557                new HashMap<OsmPrimitive, RoleCorrectionTable>();
    76 
    77             //NameVisitor nameVisitor = new NameVisitor();
    7858
    7959            final JPanel p = new JPanel(new GridBagLayout());
Note: See TracChangeset for help on using the changeset viewer.