Changeset 2683 in josm


Ignore:
Timestamp:
Dec 27, 2009 4:51:22 PM (3 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
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java

    r2611 r2683  
    5050 
    5151        oldRole = relation.getMember(position).getRole(); 
     52        if (newRole.equals(oldRole)) return true; 
    5253        relation.setMember(position, new RelationMember(newRole, relation.getMember(position).getMember())); 
    5354 
     
    5859 
    5960    @Override public void undoCommand() { 
    60         relation.getMember(position).getRole().equals(oldRole); 
     61        relation.setMember(position, new RelationMember(oldRole, relation.getMember(position).getMember())); 
    6162        relation.setModified(oldModified); 
    6263    } 
  • trunk/src/org/openstreetmap/josm/command/Command.java

    r2512 r2683  
    9292    public void undoCommand() { 
    9393        for (Entry<OsmPrimitive, PrimitiveData> e : cloneMap.entrySet()) { 
    94             e.getKey().load(e.getValue()); 
     94            OsmPrimitive primitive = e.getKey(); 
     95            if (primitive.getDataSet() != null) { 
     96                e.getKey().load(e.getValue()); 
     97            } 
    9598        } 
    9699    } 
  • 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()); 
  • trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java

    r2573 r2683  
    3535        return REVERSE_VALUES.contains(value); 
    3636    } 
     37 
     38    public static boolean isTrue(String value) { 
     39        return TRUE_VALUES.contains(value); 
     40    } 
     41 
     42    public static boolean isFalse(String value) { 
     43        return FALSE_VALUES.contains(value); 
     44    } 
    3745} 
Note: See TracChangeset for help on using the changeset viewer.