This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository mkgmap.

commit 0a97c7e08d41aa8700c8711fb6020506437185cf
Author: Bas Couwenberg <sebas...@xs4all.nl>
Date:   Fri Feb 6 14:39:48 2015 +0100

    Imported Upstream version 0.0.0+svn3436
---
 doc/options.txt                                    | 23 +++---
 doc/styles/rules-filters.txt                       | 22 ++++++
 doc/tutorial/publish.txt                           | 23 ++++--
 resources/help/en/options                          | 17 +++--
 resources/mkgmap-version.properties                |  4 +-
 resources/styles/default/relations                 |  3 +-
 src/uk/me/parabola/mkgmap/build/MapBuilder.java    | 27 +++----
 .../parabola/mkgmap/osmstyle/StyledConverter.java  |  6 +-
 .../parabola/mkgmap/osmstyle/WrongAngleFixer.java  | 11 +++
 .../osmstyle/actions/NotContainedFilter.java       | 82 +++++++++++++++++++++
 .../mkgmap/osmstyle/actions/ValueBuilder.java      |  3 +
 .../mkgmap/osmstyle/actions/ValueItem.java         |  2 +-
 src/uk/me/parabola/mkgmap/reader/osm/Element.java  | 46 ++++++------
 .../mkgmap/reader/osm/OsmMapDataSource.java        | 60 +++++++++++-----
 .../mkgmap/reader/osm/bin/OsmBinHandler.java       | 56 +++++++--------
 .../mkgmap/reader/osm/o5m/O5mBinHandler.java       | 14 ++--
 .../mkgmap/reader/osm/xml/Osm5XmlHandler.java      | 42 +++++------
 test/func/route/SimpleRouteTest.java               |  2 +-
 .../osmstyle/actions/NotContainedFilterTest.java   | 83 ++++++++++++++++++++++
 19 files changed, 388 insertions(+), 138 deletions(-)

diff --git a/doc/options.txt b/doc/options.txt
index 78086de..5e7456b 100644
--- a/doc/options.txt
+++ b/doc/options.txt
@@ -283,15 +283,20 @@ drop-down. The default is "OSM map".
 :   Area name is displayed on Garmin units (or at least on eTrex) as the 
second 
 part of the mapname in the list of the individual maps.
 
-;--copyright-message=note
-:      Specify a copyright message for files that do not contain one.
-
-;--license-file=file
-:      Specify a file which content will be added as license. 
-All entrys of all maps will be merged in the overview map.
-
-=== Optimization options ===
-
+;--copyright-message=note
+:      Specify a copyright message for files that do not contain one.
+
+;--copyright-file=file
+:      Specify copyright messages from a file.
+Note that the first copyright message is not displayed on a device, but is 
+shown in BaseCamp.
+
+;--license-file=file
+:      Specify a file which content will be added as license. 
+All entries of all maps will be merged in the overview map.
+
+=== Optimization options ===
+
 ;--reduce-point-density=NUM
 :      Simplifies the ways with the Douglas Peucker algorithm.
 NUM is the maximal allowed error distance, by which the resulting
diff --git a/doc/styles/rules-filters.txt b/doc/styles/rules-filters.txt
index 6bf7314..97fb833 100644
--- a/doc/styles/rules-filters.txt
+++ b/doc/styles/rules-filters.txt
@@ -129,6 +129,28 @@ are counted starting from zero and the end position is not 
included.
 `${name\|substring:2:5}`
 If the "name" was "Dorset Lane", then the result is "rse".  If there is just 
the one number,
 then the substring starts from that character until the end of the string.
+
+| not-contained | `separator tag` |
+Used to check for duplicate values. If the value of this tag is contained in 
the list being
+the value of the tag named as the argument to +not-contained+, then value
+of this tag is set to undefined.
+
+....
+type=route & route=bus & ref=* {
+   apply {
+      set route_ref='$(route_ref),${ref\|not-contained:,:route_ref}' \| 
'$(route_ref)' \| '${ref}';
+   }
+}
+....
+
+Here, +ref+ value is only added to +route_ref+ when it is not already 
contained in that list
+(with separator ','). Otherwise, the value of +route_ref+ is unchanged.
+This helps to get correct labeling (no duplicates) for public transport lines 
where there can be multiple relations
+with the same +ref+ attribute (e.g. one for the forward and one for the 
backward direction).
+
+For example, if +route_ref+ was already "1,2,150" and +ref+ would again be 
"150",
+this value would not be added to the list as it is already there.
+In contrast, +ref+ equal to "229" would be added, so after that +route_ref+ 
would have the value "1,2,150,229"
 |=====
 
 === Symbol codes
diff --git a/doc/tutorial/publish.txt b/doc/tutorial/publish.txt
index 1e5d84b..3476975 100644
--- a/doc/tutorial/publish.txt
+++ b/doc/tutorial/publish.txt
@@ -30,10 +30,19 @@ The default is "OSM map".
 --area-name::
 Area name is displayed on Garmin units (or at least on eTrex) as the
 second part of the mapname in the list of the individual maps.
-
---copyright-message=note::
-Specify a copyright message for files that do not contain one.
-
---license-file=file::
-The contents of the file will be used as licence information to
-be added to the map.
+
+--copyright-message=note::
+Specify a copyright message for files that do not contain one.
+A fixed copyright message that is visible in BaseCamp, but not on a
+device, is also included.
+
+--copyright-file=file::
+Specify copyright messages from a file. Used if you need to display more
+than one copyright message or do not want the fixed copyright message to
+be included. Note that the first copyright message is not displayed on a
+device, but is shown in BaseCamp. You can make the first line of the
+copyright file blank to work around this.
+
+--license-file=file::
+The contents of the file will be used as licence information to
+be added to the map.
diff --git a/resources/help/en/options b/resources/help/en/options
index e8ac20f..f13bef2 100644
--- a/resources/help/en/options
+++ b/resources/help/en/options
@@ -280,12 +280,17 @@ Product description options:
   Area name is displayed on Garmin units (or at least on eTrex) as the second 
   part of the mapname in the list of the individual maps.
    
---copyright-message=note
-       Specify a copyright message for files that do not contain one.
-
---license-file=file
-       Specify a file which content will be added as license. 
-  All entrys of all maps will be merged in the overview map.
+--copyright-message=note
+       Specify a copyright message for files that do not contain one.
+
+--copyright-file=file
+       Specify copyright messages from a file.
+       Note that the first copyright message is not displayed on a device, but 
is 
+       shown in BaseCamp.
+
+--license-file=file
+       Specify a file which content will be added as license. 
+  All entrys of all maps will be merged in the overview map.
 
 Optimization options:
 
diff --git a/resources/mkgmap-version.properties 
b/resources/mkgmap-version.properties
index 0ad5766..78cc6d5 100644
--- a/resources/mkgmap-version.properties
+++ b/resources/mkgmap-version.properties
@@ -1,2 +1,2 @@
-svn.version: 3419
-build.timestamp: 2015-01-19T20:25:08+0000
+svn.version: 3436
+build.timestamp: 2015-02-02T06:43:48+0000
diff --git a/resources/styles/default/relations 
b/resources/styles/default/relations
index cbc587c..5747337 100644
--- a/resources/styles/default/relations
+++ b/resources/styles/default/relations
@@ -38,8 +38,7 @@ type=route
   # Stops can be grouped within subrelations comprising the vehicle
   # stop node and the passenger wait node.
   apply { # node role ~ '(start_|end_)stop'
-    set route_ref='$(route_ref),${ref}' | '${ref}';
-
+               set route_ref='$(route_ref);${ref|not-contained:;:route_ref}' | 
'$(route_ref)' | '${ref}';
     # In route relations, stops may be defined as relations that group
     # the passenger wait area and the vehicle stop area.  If such
     # subrelations exist, copy the ref to them too.
diff --git a/src/uk/me/parabola/mkgmap/build/MapBuilder.java 
b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
index cf9d28a..94d4340 100644
--- a/src/uk/me/parabola/mkgmap/build/MapBuilder.java
+++ b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
@@ -859,19 +859,20 @@ public class MapBuilder implements Configurable {
                        info += s.trim() + "\n";
                }
                if (!info.isEmpty())
-                       map.addInfo(info);
-               if (copyrights.isEmpty()){
-                       // There has to be (at least) two copyright messages or 
else the map
-                       // does not show up.  The second one will be displayed 
at startup,
-                       // although the conditions where that happens are not 
known.
-                       map.addCopyright("program licenced under GPL v2");
-
-                       // This one gets shown when you switch on, so put the 
actual
-                       // map copyright here.
-                       for (String cm : src.copyrightMessages())
-                               map.addCopyright(cm);
-               } else {
-                       for (String cm : copyrights)
+                       map.addInfo(info);
+               if (copyrights.isEmpty()){
+                       // There has to be (at least) two copyright messages or 
else the map
+                       // does not show up.  The second and subsequent ones 
will be displayed
+                       // at startup, although the conditions where that 
happens are not known.
+                       // All copyright messages are displayed in BaseCamp.
+                       String[] copyrightMessages = src.copyrightMessages();
+                       if (copyrightMessages.length < 2)
+                               map.addCopyright("program licenced under GPL 
v2");
+
+                       for (String cm : copyrightMessages)
+                               map.addCopyright(cm);
+               } else {
+                       for (String cm : copyrights)
                                map.addCopyright(cm);
                }
        }
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java 
b/src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
index a11ea4d..d5a98d9 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
@@ -138,7 +138,7 @@ public class StyledConverter implements OsmConverter {
        private int reportDeadEnds; 
        private final boolean linkPOIsToWays;
        private final boolean mergeRoads;
-       private WrongAngleFixer wrongAngleFixer;
+       
 
        private LineAdder lineAdder = new LineAdder() {
                public void add(MapLine element) {
@@ -197,7 +197,7 @@ public class StyledConverter implements OsmConverter {
                // undocumented option - usually used for debugging only
                mergeRoads = props.getProperty("no-mergeroads", false) == false;
 
-               wrongAngleFixer = new WrongAngleFixer(bbox);
+               
        }
 
        /** One type result for ways to avoid recreating one for each way. */ 
@@ -540,7 +540,7 @@ public class StyledConverter implements OsmConverter {
                findUnconnectedRoads();
                rotateClosedWaysToFirstNode();
                filterCoordPOI();
-
+               WrongAngleFixer wrongAngleFixer = new WrongAngleFixer(bbox);
                wrongAngleFixer.optimizeWays(roads, lines, modifiedRoads, 
deletedRoads, restrictions);
 
                // make sure that copies of modified roads have equal points 
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/WrongAngleFixer.java 
b/src/uk/me/parabola/mkgmap/osmstyle/WrongAngleFixer.java
index 7e22452..cc164b6 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/WrongAngleFixer.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/WrongAngleFixer.java
@@ -63,6 +63,17 @@ public class WrongAngleFixer {
        
        public WrongAngleFixer(Area bbox) {
                this.bbox = bbox;
+               if (gpxPath != null && bbox != null){
+                       if (bbox.getWidth() * bbox.getHeight() < 100000){
+                               List<Coord> grid = new ArrayList<>();
+                               for (int lat = bbox.getMinLat(); lat < 
bbox.getMaxLat(); lat++){
+                                       for (int lon = bbox.getMinLong(); lon < 
bbox.getMaxLong(); lon++){
+                                               grid.add(new Coord(lat,lon));
+                                       }
+                               }
+                               GpxCreator.createGpx("e:/ld/grid", 
bbox.toCoords(), grid);
+                       }
+               }
        }
 
        /**
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilter.java 
b/src/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilter.java
new file mode 100644
index 0000000..9ebfa14
--- /dev/null
+++ b/src/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilter.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015.
+ * 
+ * This program is free software; you can redistribute it and/or modify it 
under the terms
+ * of the GNU General Public License version 3 or version 2 as published by 
the Free
+ * Software Foundation.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT 
ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ */
+package uk.me.parabola.mkgmap.osmstyle.actions;
+
+import java.util.regex.Pattern;
+
+import uk.me.parabola.mkgmap.reader.osm.Element;
+import uk.me.parabola.mkgmap.reader.osm.TagDict;
+import uk.me.parabola.mkgmap.scan.SyntaxException;
+
+/**
+ * This can be used to filter out redundant values.<br>
+ * <br>
+ * The filter checks whether the value is contained within another tag's value.
+ * If so, a null string is returned.<br>
+ * <br>
+ * Another tag should consist of values separated by a delimiter (semicolon ';'
+ * by default).<br>
+ * <br>
+ * Example:<br>
+ * <code>
+ * type=route & route=bus & ref=* {<br>
+ *             apply {<br>
+ *                     set 
route_ref='$(route_ref),${ref|not-contained:,:route_ref}' | '$(route_ref)' | 
'${ref}';<br>
+ *             }<br>
+ * }</code><br>
+ * Here, ref value is only added to route_ref when it is not already contained
+ * in that list (with separator ','). Otherwise, the value of route_ref is
+ * unchanged.
+ *
+ * @author Maxim Duester
+ */
+public class NotContainedFilter extends ValueFilter {
+       private String separator;
+       private short tagKey;
+
+       public NotContainedFilter(String arg) {
+               String[] temp = arg.split(":");
+
+               if (temp.length < 2 || temp[1].isEmpty())
+                       throw new SyntaxException(
+                                       "Missing tag to compare in style 
not-contained command: "
+                                                       + arg);
+
+               // set the separator (default to ;)
+               if (temp[0].length() > 0)
+                       separator = temp[0];
+               else
+                       separator = ";";
+               // set the tag short value
+               tagKey = TagDict.getInstance().xlate(temp[1]);
+       }
+
+       public String doFilter(String value, Element el) {
+               if (value == null)
+                       return null;
+
+               String tagValue = el.getTag(tagKey);
+               // tag not found => value not in tag's value
+               if (tagValue == null)
+                       return value;
+
+               // split uses a regex we need to replace special characters
+               String[] temp = tagValue.split(Pattern.quote(separator));
+
+               for (String s : temp)
+                       if (s.equals(value))
+                               return null;
+
+               // nothing found => value not in tag's value
+               return value;
+       }
+}
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueBuilder.java 
b/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueBuilder.java
index 36be8cc..37c934c 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueBuilder.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueBuilder.java
@@ -236,6 +236,9 @@ public class ValueBuilder {
                case "country-ISO":
                        item.addFilter(new CountryISOFilter());
                        break;
+               case "not-contained":
+                       item.addFilter(new NotContainedFilter(arg));
+                       break;
                default:
                        throw new SyntaxException(String.format("Unknown filter 
'%s'", cmd));
                }
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueItem.java 
b/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueItem.java
index 3299598..1798259 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueItem.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/actions/ValueItem.java
@@ -47,7 +47,7 @@ public class ValueItem {
                        Element e = tagname_is_local ? local_el : el;
                        String tagval = e.getTag(tagKey);
                        if (filter != null)
-                               value = filter.filter(tagval,el);
+                               value = filter.filter(tagval, local_el);
                        else
                                value = tagval;
                }
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/Element.java 
b/src/uk/me/parabola/mkgmap/reader/osm/Element.java
index 972d4e2..0c36786 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/Element.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/Element.java
@@ -22,13 +22,13 @@ import java.util.Map;
 /**
  * Superclass of the node, segment and way OSM elements.
  */
-public abstract class Element {
-       private Tags tags;
-       private long id;
-       private long OriginalId;
-
-       public int getTagCount() {
-               return (tags == null ? 0 : tags.size());
+public abstract class Element {
+       private Tags tags;
+       private long id;
+       private long originalId;
+
+       public int getTagCount() {
+               return (tags == null ? 0 : tags.size());
        }
        
        /**
@@ -168,19 +168,25 @@ public abstract class Element {
        }
        
        public long getId() {
-               return id;
-       }
-
-       public long getOriginalId() {
-               return OriginalId;
-       }
-
-       protected void setId(long id) {
-               this.id = id;
-               OriginalId = id;
-       }
-
-       public void setFakeId() {
+               return id;
+       }
+
+       /**
+        * Returns the Id of the original OSM element on which this element was 
based.
+        * <p>
+        * The Id of the original element will be different from the Id of this
+        * element if this element uses a faked Id.
+        */
+       public long getOriginalId() {
+               return originalId;
+       }
+
+       protected void setId(long id) {
+               this.id = id;
+               originalId = id;
+       }
+
+       public void setFakeId() {
                id = FakeIdGenerator.makeFakeId();
        }
        
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java 
b/src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java
index ad83575..ddc29b7 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java
@@ -14,23 +14,25 @@
  * Author: Steve Ratcliffe
  * Create date: 22-Sep-2007
  */
-package uk.me.parabola.mkgmap.reader.osm;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
+package uk.me.parabola.mkgmap.reader.osm;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import uk.me.parabola.imgfmt.FormatException;
-import uk.me.parabola.imgfmt.Utils;
-import uk.me.parabola.log.Logger;
+import java.util.Map;
+import java.util.Set;
+
+import uk.me.parabola.imgfmt.ExitException;
+import uk.me.parabola.imgfmt.FormatException;
+import uk.me.parabola.imgfmt.Utils;
+import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.general.LevelInfo;
 import uk.me.parabola.mkgmap.general.LoadableMapDataSource;
 import uk.me.parabola.mkgmap.osmstyle.StyleImpl;
@@ -132,12 +134,34 @@ public abstract class OsmMapDataSource extends 
MapperBasedMapDataSource
         * include a fixed set of strings on the assumption that .osm files
         * are probably going to have the OSM copyright statements.
         *
-        * @return A list of copyright messages as a String array.
-        */
-       public String[] copyrightMessages() {
-               String note = getConfig().getProperty("copyright-message", 
-                               "OpenStreetMap.org contributors. See: 
http://wiki.openstreetmap.org/index.php/Attribution";);
-               return new String[] { note };
+        * @return A list of copyright messages as a String array.
+        */
+       public String[] copyrightMessages() {
+               String copyrightFileName = 
getConfig().getProperty("copyright-file", null);
+               if (copyrightFileName != null)
+               {
+                       File file = new File(copyrightFileName);
+                       List<String> copyrightArray = new ArrayList<String>();
+                       try {
+                               BufferedReader reader = new BufferedReader(new 
FileReader(file));
+                               String text;
+                               while ((text = reader.readLine()) != null) {
+                                       copyrightArray.add(text);
+                               }
+
+                               reader.close();
+                       } catch (FileNotFoundException e) {
+                               throw new ExitException("Could not open 
copyright file " + copyrightFileName);
+                       } catch (IOException e) {
+                               throw new ExitException("Error reading 
copyright file " + copyrightFileName);
+                       }
+                       String[] copyright = new String[copyrightArray.size()];
+                       copyrightArray.toArray(copyright);
+                       return copyright;
+               }
+               String note = getConfig().getProperty("copyright-message", 
+                               "OpenStreetMap.org contributors. See: 
http://wiki.openstreetmap.org/index.php/Attribution";);
+               return new String[] { note };
        }
 
        protected void setStyle(Style style) {
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/bin/OsmBinHandler.java 
b/src/uk/me/parabola/mkgmap/reader/osm/bin/OsmBinHandler.java
index 4031682..72c43cf 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/bin/OsmBinHandler.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/bin/OsmBinHandler.java
@@ -67,13 +67,13 @@ public class OsmBinHandler extends OsmHandler {
 
                                int tagCount = binNode.getKeysCount();
                                if (tagCount > 0) {
-                                       Node node = new Node(id, co);
-                                       for (int tid = 0; tid < tagCount; 
tid++) {
-                                               String key = 
getStringById(binNode.getKeys(tid));
-                                               String val = 
getStringById(binNode.getVals(tid));
-                                               key = keepTag(key, val);
-                                               if (key != null)
-                                                       node.addTag(key, 
val.intern());
+                                       Node node = new Node(id, co);
+                                       for (int tid = 0; tid < tagCount; 
tid++) {
+                                               String key = 
getStringById(binNode.getKeys(tid));
+                                               String val = 
getStringById(binNode.getVals(tid)).trim();
+                                               key = keepTag(key, val);
+                                               if (key != null)
+                                                       node.addTag(key, 
val.intern());
                                        }
 
                                        saver.addNode(node);
@@ -102,13 +102,13 @@ public class OsmBinHandler extends OsmHandler {
                                        int ntags = 0;
                                        Node node = null;
                                        while (nodes.getKeysVals(kvid) != 0) {
-                                               int keyid = 
nodes.getKeysVals(kvid++);
-                                               int valid = 
nodes.getKeysVals(kvid++);
-                                               String key = 
getStringById(keyid);
-                                               String val = 
getStringById(valid);
-                                               key = keepTag(key, val);
-                                               if (key != null) {
-                                                       if (node == null)
+                                               int keyid = 
nodes.getKeysVals(kvid++);
+                                               int valid = 
nodes.getKeysVals(kvid++);
+                                               String key = 
getStringById(keyid);
+                                               String val = 
getStringById(valid).trim();
+                                               key = keepTag(key, val);
+                                               if (key != null) {
+                                                       if (node == null)
                                                                node = new 
Node(id, co);
                                                        node.addTag(key, 
val.intern());
                                                        ntags++;
@@ -129,13 +129,13 @@ public class OsmBinHandler extends OsmHandler {
                        for (Osmformat.Way binWay : ways) {
                                Way way = startWay(binWay.getId());
 
-                               for (int j = 0; j < binWay.getKeysCount(); j++) 
{
-
-                                       String key = 
getStringById(binWay.getKeys(j));
-                                       String val = 
getStringById(binWay.getVals(j));
-                                       key = keepTag(key, val);
-                                       if (key != null)
-                                               way.addTag(key, val.intern());
+                               for (int j = 0; j < binWay.getKeysCount(); j++) 
{
+
+                                       String key = 
getStringById(binWay.getKeys(j));
+                                       String val = 
getStringById(binWay.getVals(j)).trim();
+                                       key = keepTag(key, val);
+                                       if (key != null)
+                                               way.addTag(key, val.intern());
                                }
 
                                long nid = 0;
@@ -154,13 +154,13 @@ public class OsmBinHandler extends OsmHandler {
                                long id = binRel.getId();
                                GeneralRelation rel = new GeneralRelation(id);
 
-                               boolean tagsIncomplete = false;
-                               for (int j = 0; j < binRel.getKeysCount(); j++) 
{
-                                       String key = 
getStringById(binRel.getKeys(j));
-                                       String val = 
getStringById(binRel.getVals(j));
-                                       // type is required for relations - all 
other tags are filtered
-                                       if ("type".equals(key))
-                                               // intern the string
+                               boolean tagsIncomplete = false;
+                               for (int j = 0; j < binRel.getKeysCount(); j++) 
{
+                                       String key = 
getStringById(binRel.getKeys(j));
+                                       String val = 
getStringById(binRel.getVals(j)).trim();
+                                       // type is required for relations - all 
other tags are filtered
+                                       if ("type".equals(key))
+                                               // intern the string
                                                key = "type";
                                        else
                                                key = keepTag(key, val);
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java 
b/src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java
index c5e843e..26d06ed 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java
@@ -311,13 +311,13 @@ public class O5mBinHandler extends OsmHandler{
        
        private boolean readTags(Element elem) throws IOException{
                boolean tagsIncomplete = false;
-               while (bytesToRead > 0){
-                       readStringPair();
-                       String key = stringPair[0];
-                       String val = stringPair[1];
-                       // the type tag is required for relations - all other 
tags are filtered
-                       if (elem instanceof Relation && "type".equals(key))
-                               // intern the string
+               while (bytesToRead > 0){
+                       readStringPair();
+                       String key = stringPair[0];
+                       String val = stringPair[1].trim();
+                       // the type tag is required for relations - all other 
tags are filtered
+                       if (elem instanceof Relation && "type".equals(key))
+                               // intern the string
                                key = "type";
                        else
                                key = keepTag(key, val);
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java 
b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
index c295b20..730a20d 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
@@ -204,13 +204,13 @@ public class Osm5XmlHandler extends OsmHandler {
         * @param qName The new tag name.
         * @param attributes Its attributes.
         */
-       private void startInNode(String qName, Attributes attributes) {
-               if (qName.equals("tag")) {
-                       String key = attributes.getValue("k");
-                       String val = attributes.getValue("v");
-
-                       // We only want to create a full node for nodes that 
are POI's
-                       // and not just one point of a way.  Only create if it 
has tags that
+       private void startInNode(String qName, Attributes attributes) {
+               if (qName.equals("tag")) {
+                       String key = attributes.getValue("k");
+                       String val = attributes.getValue("v").trim();
+
+                       // We only want to create a full node for nodes that 
are POI's
+                       // and not just one point of a way.  Only create if it 
has tags that
                        // could be used in a POI.
                        key = keepTag(key, val);
                        if (key != null) {
@@ -232,13 +232,13 @@ public class Osm5XmlHandler extends OsmHandler {
        private void startInWay(String qName, Attributes attributes) {
                if (qName.equals("nd")) {
                        long id = idVal(attributes.getValue("ref"));
-                       addCoordToWay(currentWay, id);
-               } else if (qName.equals("tag")) {
-                       String key = attributes.getValue("k");
-                       String val = attributes.getValue("v");
-                       key = keepTag(key, val);
-                       if (key != null)
-                               currentWay.addTag(key, val.intern());
+                       addCoordToWay(currentWay, id);
+               } else if (qName.equals("tag")) {
+                       String key = attributes.getValue("k");
+                       String val = attributes.getValue("v").trim();
+                       key = keepTag(key, val);
+                       if (key != null)
+                               currentWay.addTag(key, val.intern());
                }
        }
 
@@ -273,13 +273,13 @@ public class Osm5XmlHandler extends OsmHandler {
                        } else
                                el = null;
                        if (el != null) // ignore non existing ways caused by 
splitting files
-                               
currentRelation.addElement(attributes.getValue("role"), el);
-               } else if (qName.equals("tag")) {
-                       String key = attributes.getValue("k");
-                       String val = attributes.getValue("v");
-                       // the type tag is required for relations - all other 
tags are filtered
-                       if ("type".equals(key))
-                               // intern the key
+                               
currentRelation.addElement(attributes.getValue("role"), el);
+               } else if (qName.equals("tag")) {
+                       String key = attributes.getValue("k");
+                       String val = attributes.getValue("v").trim();
+                       // the type tag is required for relations - all other 
tags are filtered
+                       if ("type".equals(key))
+                               // intern the key
                                key = "type";
                        else
                                key = keepTag(key, val);
diff --git a/test/func/route/SimpleRouteTest.java 
b/test/func/route/SimpleRouteTest.java
index 81f3e07..63a9c67 100644
--- a/test/func/route/SimpleRouteTest.java
+++ b/test/func/route/SimpleRouteTest.java
@@ -67,7 +67,7 @@ public class SimpleRouteTest extends Base {
                                break;
                        case "LBL":
                                count++;
-                               assertEquals("LBL size", 28744, size);
+                               assertEquals("LBL size", 28742, size);
                                break;
                        case "NET":
                                count++;
diff --git 
a/test/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilterTest.java 
b/test/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilterTest.java
new file mode 100644
index 0000000..aaf98bd
--- /dev/null
+++ b/test/uk/me/parabola/mkgmap/osmstyle/actions/NotContainedFilterTest.java
@@ -0,0 +1,83 @@
+package uk.me.parabola.mkgmap.osmstyle.actions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+import uk.me.parabola.mkgmap.reader.osm.Element;
+import uk.me.parabola.mkgmap.reader.osm.Way;
+import uk.me.parabola.mkgmap.scan.SyntaxException;
+
+/**
+ * @author Maxim Duester
+ *
+ */
+public class NotContainedFilterTest {
+
+       @Test(expected = SyntaxException.class)
+       public void testNoArg() {
+               NotContainedFilter filter = new NotContainedFilter("");
+               filter.doFilter("x", null);
+       }
+
+       @Test(expected = SyntaxException.class)
+       public void testOneArg() {
+               NotContainedFilter filter = new NotContainedFilter(";");
+               filter.doFilter("x", null);
+       }
+
+       @Test(expected = SyntaxException.class)
+       public void test2ndArgMissing() {
+               NotContainedFilter filter = new NotContainedFilter(":");
+               filter.doFilter("x", null);
+       }
+
+       @Test
+       public void test2ndArgNotContained() {
+               NotContainedFilter filter = new NotContainedFilter(";:ref");
+               Element el = stdElement();
+               String s = filter.doFilter("aa", el);
+               assertEquals(s, "aa");
+       }
+
+       @Test
+       public void test2ndArgContained() {
+               NotContainedFilter filter = new NotContainedFilter(":ref");
+               Element el = stdElement();
+               String s = filter.doFilter("x", el);
+               assertNull(s);
+       }
+
+       @Test
+       public void testNonDefaultDelimiterNotContained() {
+               NotContainedFilter filter = new NotContainedFilter("#:ref");
+               Element el = stdElement();
+               String s = filter.doFilter("x", el);
+               assertEquals(s, "x");
+       }
+       
+       @Test
+       public void testNonDefaultDelimiterContained() {
+               NotContainedFilter filter = new NotContainedFilter("#:test");
+               Element el = stdElement();
+               el.addTag("test", "Aa#Bb#Cc#Dd");
+               String s = filter.doFilter("Cc", el);
+               assertNull(s);
+       }
+       
+       @Test
+       public void testMissingTag(){
+               NotContainedFilter filter=new NotContainedFilter(":sometag");
+               Element el = stdElement();
+               String s=filter.doFilter("x", el);
+               assertEquals(s, "x");
+       }
+
+       private Element stdElement() {
+               Element el1 = new Way(1);
+               el1.addTag("ref", "x;y;z");
+               return el1;
+       }
+
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/mkgmap.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to