I have added some javadoc.

Could someone please commit or deny the patch. It is open for a long time, no one has complained about it and I think it's a useful enhancement.

WanMil
Index: src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java        
(revision 1457)
+++ src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java        
(working copy)
@@ -17,12 +17,9 @@
 package uk.me.parabola.mkgmap.reader.osm.xml;
 
 import java.io.BufferedReader;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.InputStreamReader;
+import java.io.FileReader;
 import java.io.IOException;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -117,7 +114,8 @@
        private final Double minimumArcLength;
        private final String frigRoundabouts;
 
-       private HashMap<String,Set<String>> deletedTags;
+       private Map<String,Set<String>> tagBlackList;
+       private Map<String,Set<String>> tagWhiteList;
 
        public Osm5XmlHandler(EnhancedProperties props) {
                if(props.getProperty("make-all-cycleways", false)) {
@@ -163,9 +161,15 @@
                frigRoundabouts = props.getProperty("frig-roundabouts");
                ignoreTurnRestrictions = 
props.getProperty("ignore-turn-restrictions", false);
                reportUndefinedNodes = 
props.getProperty("report-undefined-nodes", false);
-               String deleteTagsFileName = 
props.getProperty("delete-tags-file");
-               if(deleteTagsFileName != null)
-                       readDeleteTagsFile(deleteTagsFileName);
+               String blacklistTagsFileName = 
props.getProperty("blacklist-tags-file");
+               if (blacklistTagsFileName==null)
+                       // accept the old parameter delete-tags-file
+                       blacklistTagsFileName = 
props.getProperty("delete-tags-file");
+               if(blacklistTagsFileName != null)
+                       tagBlackList = readTagListFile(blacklistTagsFileName);
+               String whitelistTagsFileName = 
props.getProperty("whitelist-tags-file");
+               if(whitelistTagsFileName != null)
+                       tagWhiteList = readTagListFile(whitelistTagsFileName);
 
                if (props.getProperty("preserve-element-order", false)) {
                        nodeMap = new LinkedHashMap<Long, Node>(5000);
@@ -178,11 +182,12 @@
                }
        }
 
-       private void readDeleteTagsFile(String fileName) {
+       private Map<String, Set<String>> readTagListFile(String fileName) {
+               Map<String, Set<String>> tagList = null;
                try {
-                       BufferedReader br = new BufferedReader(new 
InputStreamReader(new DataInputStream(new FileInputStream(fileName))));
+                       BufferedReader br = new BufferedReader(new 
FileReader(fileName));
                        String line;
-                       deletedTags = new HashMap<String,Set<String>>();
+                       tagList = new HashMap<String,Set<String>>();
                        while((line = br.readLine()) != null) {
                                line = line.trim();
                                if(line.length() > 0 && 
@@ -190,20 +195,20 @@
                                   !line.startsWith(";")) {
                                        String parts[] = line.split("=");
                                        if(parts.length != 2) {
-                                               log.error("Ignoring bad line in 
deleted tags file: " + line);
+                                               log.error("Ignoring bad line in 
tag list file: " + line);
                                        }
                                        else {
                                                parts[0] = parts[0].trim();
                                                parts[1] = parts[1].trim();
                                                if("*".equals(parts[1])) {
-                                                       
deletedTags.put(parts[0], new HashSet<String>());
+                                                       tagList.put(parts[0], 
new HashSet<String>());
                                                }
                                                else {
-                                                       Set<String> vals = 
deletedTags.get(parts[0]);
+                                                       Set<String> vals = 
tagList.get(parts[0]);
                                                        if(vals == null)
                                                                vals = new 
HashSet<String>();
                                                        vals.add(parts[1]);
-                                                       
deletedTags.put(parts[0], vals);
+                                                       tagList.put(parts[0], 
vals);
                                                }
                                        }
                                }
@@ -211,21 +216,42 @@
                        br.close();
                }
                catch(FileNotFoundException e) {
-                       log.error("Could not open delete tags file " + 
fileName);
+                       log.error("Could not open tag list file " + fileName);
                }
                catch(IOException e) {
-                       log.error("Error reading delete tags file " + fileName);
+                       log.error("Error reading tag list file " + fileName);
                }
 
-               if(deletedTags != null && deletedTags.size() == 0)
-                       deletedTags = null;
+               if(tagList != null && tagList.size() == 0)
+                       return null;
+               else
+                       return tagList;
        }
 
-       private boolean deleteTag(String key, String val) {
-               if(deletedTags != null) {
-                       Set<String> vals = deletedTags.get(key);
+       /**
+        * Checks if the given tag (key=value) should be deleted because of 
+        * the whitelist and the blacklist.
+        * @param key tag name
+        * @param val tag value
+        * @return <code>true</code> if the tag should be deleted
+        */
+       private boolean checkTagDelete(String key, String val) {
+               // first check if there is a tag whitelist 
+               if (tagWhiteList != null) {
+                       // the tag must be in the whitelist
+                       Set<String> vals = tagWhiteList.get(key);
+                       if(vals == null || (vals.isEmpty() == false && 
vals.contains(val) == false)) {
+                               // the tag is not in the whitelist => delete it
+                               return true;
+                       }                       
+               }
+               // the tag has passed the whitelist check
+               // now check if it is in the blacklist
+               if(tagBlackList != null) {
+                       Set<String> vals = tagBlackList.get(key);
                        if(vals != null && (vals.size() == 0 || 
vals.contains(val))) {
                                //                              
System.err.println("Deleting " + key + "=" + val);
+                               // it is in the blacklist => delete it
                                return true;
                        }
                }
@@ -317,7 +343,7 @@
                } else if (qName.equals("tag")) {
                        String key = attributes.getValue("k");
                        String val = attributes.getValue("v");
-                       if(!deleteTag(key, val))
+                       if(!checkTagDelete(key, val))
                                currentRelation.addTag(key, val);
                }
        }
@@ -329,7 +355,7 @@
                } else if (qName.equals("tag")) {
                        String key = attributes.getValue("k");
                        String val = attributes.getValue("v");
-                       if(!deleteTag(key, val))
+                       if(!checkTagDelete(key, val))
                                currentWay.addTag(key, val);
                }
        }
@@ -339,7 +365,7 @@
                        String key = attributes.getValue("k");
                        String val = attributes.getValue("v");
 
-                       if(deleteTag(key, val))
+                       if(checkTagDelete(key, val))
                                return;
 
                        // We only want to create a full node for nodes that 
are POI's
Index: resources/help/en/options
===================================================================
--- resources/help/en/options   (revision 1457)
+++ resources/help/en/options   (working copy)
@@ -346,11 +346,13 @@
        access (e.g. bollards). Their access restrictions are applied
        to a small region of the way near the POI.
 
---delete-tags-file=FILENAME
+--blacklist-tags-file=FILENAME
+--whitelist-tags-file=FILENAME
        Names a file that should contain one or more lines of the form
        TAG=VALUE or TAG=*. Blank lines and lines that start with
        # or ; are ignored. All tag/value pairs in the OSM input are
-       compared with these patterns and those that match are deleted.
+       compared with these patterns. Those that do not match to the 
+       whitelist or those that match to the blacklist are deleted.
 
 --tdbfile
        Write a .tdb file.
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to