From c05710fcdbca2dc9969f1406ec9dcb516e54af45 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 25 Sep 2013 05:50:54 +0200 Subject: [PATCH] oscim.core.Tag: cleanups - consistent String constants --- .../layers/tile/vector/VectorTileLoader.java | 14 ++-- vtm/src/org/oscim/core/Tag.java | 80 ++++++++----------- .../layers/tile/vector/VectorTileLoader.java | 14 ++-- .../tiling/source/mapfile/MapDatabase.java | 14 ++-- .../source/mapfile/header/RequiredFields.java | 4 +- .../tiling/source/mapnik/TileDecoder.java | 6 +- .../tiling/source/oscimap/TileDecoder.java | 11 +-- .../source/oscimap2/OSciMap2TileSource.java | 2 +- .../tiling/source/oscimap4/TileDecoder.java | 8 +- 9 files changed, 71 insertions(+), 82 deletions(-) diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java index eef9eb96..fa69f946 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -68,8 +68,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac // replacement for variable value tags that should not be matched by RenderTheme // FIXME make this general, maybe subclass tags - private static final Tag mTagEmptyName = new Tag(Tag.TAG_KEY_NAME, null, false); - private static final Tag mTagEmptyHouseNr = new Tag(Tag.TAG_KEY_HOUSE_NUMBER, null, false); + private static final Tag mTagEmptyName = new Tag(Tag.KEY_NAME, null, false); + private static final Tag mTagEmptyHouseNr = new Tag(Tag.KEY_HOUSE_NUMBER, null, false); private IRenderTheme renderTheme; private int renderLevels; @@ -208,12 +208,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac for (int i = 0; i < in.numTags; i++) { String key = tags[i].key; - if (key == Tag.TAG_KEY_NAME) { + if (key == Tag.KEY_NAME) { if (tags[i].value != null) { mTagName = tags[i]; tags[i] = mTagEmptyName; } - } else if (key == Tag.TAG_KEY_HOUSE_NUMBER) { + } else if (key == Tag.KEY_HOUSE_NUMBER) { if (tags[i].value != null) { mTagHouseNr = tags[i]; tags[i] = mTagEmptyHouseNr; @@ -221,7 +221,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } else if (mTile.zoomLevel > 16) { // FIXME, allow overlays to intercept // this, or use a theme option for this - if (key == Tag.TAG_KEY_BUILDING) + if (key == Tag.KEY_BUILDING) mRenderBuildingModel = true; else if (key == Tag.KEY_HEIGHT) { try { @@ -381,10 +381,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac private String textValueForKey(Text text) { String value = null; - if (text.textKey == Tag.TAG_KEY_NAME) { + if (text.textKey == Tag.KEY_NAME) { if (mTagName != null) value = mTagName.value; - } else if (text.textKey == Tag.TAG_KEY_HOUSE_NUMBER) { + } else if (text.textKey == Tag.KEY_HOUSE_NUMBER) { if (mTagHouseNr != null) value = mTagHouseNr.value; } diff --git a/vtm/src/org/oscim/core/Tag.java b/vtm/src/org/oscim/core/Tag.java index 98210830..455f581b 100644 --- a/vtm/src/org/oscim/core/Tag.java +++ b/vtm/src/org/oscim/core/Tag.java @@ -1,5 +1,6 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org + * Copyright 2013 Hannes Janetzek * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -15,47 +16,32 @@ package org.oscim.core; /** - * A tag represents an immutable key-value pair. + * A tag represents an immutable key-value pair. Keys are always intern(). */ -// TODO: use own stringshare method instead of internalized strings - public class Tag { - private static final char KEY_VALUE_SEPARATOR = '='; - /** - * The key of the house number OpenStreetMap tag. - */ - public static final String TAG_KEY_HOUSE_NUMBER = "addr:housenumber"; + /** The key of the house number OpenStreetMap tag. */ + public static final String KEY_HOUSE_NUMBER = "addr:housenumber"; - /** - * The key of the name OpenStreetMap tag. - */ - public static final String TAG_KEY_NAME = "name"; + /** The key of the name OpenStreetMap tag. */ + public static final String KEY_NAME = "name"; - /** - * The key of the reference OpenStreetMap tag. - */ - public static final String TAG_KEY_REF = "ref"; + /** The key of the reference OpenStreetMap tag. */ + public static final String KEY_REF = "ref"; - /** - * The key of the elevation OpenStreetMap tag. - */ - public static final String TAG_KEY_ELE = "ele"; - - public static final String TAG_KEY_AMENITY = "amenity"; - - /** - * The key of the elevation OpenStreetMap tag. - */ - public static final String TAG_KEY_BUILDING = "building"; - public static final String TAG_KEY_HIGHWAY = "highway"; - public static final String TAG_KEY_LANDUSE = "landuse"; - public static final String VALUE_YES = "yes"; - public static final String VALUE_NO = "no"; + /** The key of the elevation OpenStreetMap tag. */ + public static final String KEY_ELE = "ele"; + public static final String KEY_AMENITY = "amenity"; + public static final String KEY_BUILDING = "building"; + public static final String KEY_HIGHWAY = "highway"; + public static final String KEY_LANDUSE = "landuse"; public static final String KEY_HEIGHT = "height"; public static final String KEY_MIN_HEIGHT = "min_height"; + public static final String VALUE_YES = "yes"; + public static final String VALUE_NO = "no"; + /** * The key of this tag. */ @@ -66,23 +52,12 @@ public class Tag { */ public String value; - private int hashCodeValue = 0; + /** + * true when value is intern(). + */ private final boolean intern; - /** - * @param tag - * the textual representation of the tag. - */ - - public Tag(String tag) { - int splitPosition = tag.indexOf(KEY_VALUE_SEPARATOR); - if (splitPosition < 0) { - System.out.println("TAG:" + tag); - } - this.key = tag.substring(0, splitPosition).intern(); - this.value = tag.substring(splitPosition + 1).intern(); - this.intern = true; - } + private int hashCodeValue = 0; /** * @param key @@ -165,4 +140,17 @@ public class Tag { result = 31 * result + ((this.value == null) ? 0 : this.value.hashCode()); return result; } + + /** + * @param tag + * the textual representation of the tag. + */ + public static Tag parse(String tag) { + int splitPosition = tag.indexOf("="); + if (splitPosition < 0) { + return new Tag(tag, ""); + } + + return new Tag(tag.substring(0, splitPosition), tag.substring(splitPosition + 1)); + } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index b16ebdc8..4adbfb4f 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -61,8 +61,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac // replacement for variable value tags that should not be matched by RenderTheme // FIXME make this general, maybe subclass tags - private static final Tag mTagEmptyName = new Tag(Tag.TAG_KEY_NAME, null, false); - private static final Tag mTagEmptyHouseNr = new Tag(Tag.TAG_KEY_HOUSE_NUMBER, null, false); + private static final Tag mTagEmptyName = new Tag(Tag.KEY_NAME, null, false); + private static final Tag mTagEmptyHouseNr = new Tag(Tag.KEY_HOUSE_NUMBER, null, false); // private final MapElement mDebugWay, mDebugPoint; @@ -187,12 +187,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac for (int i = 0; i < in.numTags; i++) { String key = tags[i].key; - if (tags[i].key == Tag.TAG_KEY_NAME) { + if (tags[i].key == Tag.KEY_NAME) { if (tags[i].value != null) { mTagName = tags[i]; tags[i] = mTagEmptyName; } - } else if (tags[i].key == Tag.TAG_KEY_HOUSE_NUMBER) { + } else if (tags[i].key == Tag.KEY_HOUSE_NUMBER) { if (tags[i].value != null) { mTagHouseNr = tags[i]; tags[i] = mTagEmptyHouseNr; @@ -200,7 +200,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } else if (mTile.zoomLevel > 16) { // FIXME, allow overlays to intercept // this, or use a theme option for this - if (key == Tag.TAG_KEY_BUILDING) + if (key == Tag.KEY_BUILDING) mRenderBuildingModel = true; else if (key == Tag.KEY_HEIGHT) { @@ -369,10 +369,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac private String textValueForKey(Text text) { String value = null; - if (text.textKey == Tag.TAG_KEY_NAME) { + if (text.textKey == Tag.KEY_NAME) { if (mTagName != null) value = mTagName.value; - } else if (text.textKey == Tag.TAG_KEY_HOUSE_NUMBER) { + } else if (text.textKey == Tag.KEY_HOUSE_NUMBER) { if (mTagHouseNr != null) value = mTagHouseNr.value; } diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java index fb3ddf27..3fab858e 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java @@ -503,7 +503,7 @@ public class MapDatabase implements ITileDataSource { // check if the POI has a name if ((featureByte & POI_FEATURE_NAME) != 0) { String str = mReadBuffer.readUTF8EncodedString(); - mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false)); + mElem.tags.add(new Tag(Tag.KEY_NAME, str, false)); } // check if the POI has a house number @@ -801,30 +801,30 @@ public class MapDatabase implements ITileDataSource { if (hasName) { int textPos = mReadBuffer.readUnsignedInt(); String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos); - mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false)); + mElem.tags.add(new Tag(Tag.KEY_NAME, str, false)); } if (hasHouseNr) { int textPos = mReadBuffer.readUnsignedInt(); String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos); - mElem.tags.add(new Tag(Tag.TAG_KEY_HOUSE_NUMBER, str, false)); + mElem.tags.add(new Tag(Tag.KEY_HOUSE_NUMBER, str, false)); } if (hasRef) { int textPos = mReadBuffer.readUnsignedInt(); String str = mReadBuffer.readUTF8EncodedStringAt(stringOffset + textPos); - mElem.tags.add(new Tag(Tag.TAG_KEY_REF, str, false)); + mElem.tags.add(new Tag(Tag.KEY_REF, str, false)); } } else { if (hasName) { String str = mReadBuffer.readUTF8EncodedString(); - mElem.tags.add(new Tag(Tag.TAG_KEY_NAME, str, false)); + mElem.tags.add(new Tag(Tag.KEY_NAME, str, false)); } if (hasHouseNr) { String str = mReadBuffer.readUTF8EncodedString(); - mElem.tags.add(new Tag(Tag.TAG_KEY_HOUSE_NUMBER, str, false)); + mElem.tags.add(new Tag(Tag.KEY_HOUSE_NUMBER, str, false)); } if (hasRef) { String str = mReadBuffer.readUTF8EncodedString(); - mElem.tags.add(new Tag(Tag.TAG_KEY_REF, str, false)); + mElem.tags.add(new Tag(Tag.KEY_REF, str, false)); } } if ((featureByte & WAY_FEATURE_LABEL_POSITION) != 0) diff --git a/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java b/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java index b51e3f0b..31f5638d 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/header/RequiredFields.java @@ -171,7 +171,7 @@ final class RequiredFields { if (tag == null) { return new OpenResult("POI tag must not be null: " + currentTagId); } - poiTags[currentTagId] = new Tag(tag); + poiTags[currentTagId] = Tag.parse(tag); } mapFileInfoBuilder.poiTags = poiTags; return OpenResult.SUCCESS; @@ -227,7 +227,7 @@ final class RequiredFields { if (tag == null) { return new OpenResult("way tag must not be null: " + currentTagId); } - wayTags[currentTagId] = new Tag(tag); + wayTags[currentTagId] = Tag.parse(tag); } mapFileInfoBuilder.wayTags = wayTags; return OpenResult.SUCCESS; diff --git a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java index 84c20af8..d3ed7fd5 100644 --- a/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/mapnik/TileDecoder.java @@ -175,7 +175,7 @@ public class TileDecoder extends PbfDecoder { for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); - if (!key.startsWith(Tag.TAG_KEY_NAME)) + if (!key.startsWith(Tag.KEY_NAME)) continue; int len = key.length(); if (len == 4) { @@ -222,7 +222,7 @@ public class TileDecoder extends PbfDecoder { if (keyIdx == matchedLocal) { hasName = true; - f.elem.tags.add(new Tag(Tag.TAG_KEY_NAME, val, false)); + f.elem.tags.add(new Tag(Tag.KEY_NAME, val, false)); } else { key = keys.get(keyIdx); @@ -231,7 +231,7 @@ public class TileDecoder extends PbfDecoder { } if (!hasName && fallbackName != null) - f.elem.tags.add(new Tag(Tag.TAG_KEY_NAME, fallbackName, false)); + f.elem.tags.add(new Tag(Tag.KEY_NAME, fallbackName, false)); // FIXME extract layer tag here f.elem.setLayer(5); diff --git a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java index fea0c277..33cb6fac 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/oscimap/TileDecoder.java @@ -130,19 +130,20 @@ public class TileDecoder extends PbfDecoder { String tagString = decodeString(); if (tagString == null || tagString.length() == 0) { - curTags[mCurTagCnt++] = new Tag(Tag.TAG_KEY_NAME, "..."); + curTags[mCurTagCnt++] = new Tag(Tag.KEY_NAME, "..."); return false; } Tag tag = tagHash.get(tagString); if (tag == null) { - if (tagString.startsWith(Tag.TAG_KEY_NAME)) - tag = new Tag(Tag.TAG_KEY_NAME, tagString.substring(5), false); + if (tagString.startsWith(Tag.KEY_NAME)) + tag = new Tag(Tag.KEY_NAME, tagString.substring(5), false); else - tag = new Tag(tagString); + tag = Tag.parse(tagString); - tagHash.put(tagString, tag); + if (tag != null) + tagHash.put(tagString, tag); } if (mCurTagCnt >= MAX_TILE_TAGS) { diff --git a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java index b7c36912..0db5761b 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java +++ b/vtm/src/org/oscim/tiling/source/oscimap2/OSciMap2TileSource.java @@ -155,7 +155,7 @@ public class OSciMap2TileSource extends UrlTileSource { String key = Tags.keys[mSArray[curTag]]; Tag tag; - if (key == Tag.TAG_KEY_NAME) + if (key == Tag.KEY_NAME) tag = new Tag(key, tagString, false); else tag = new Tag(key, tagString, true); diff --git a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java index 6d2bb862..5d709597 100644 --- a/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java +++ b/vtm/src/org/oscim/tiling/source/oscimap4/TileDecoder.java @@ -209,12 +209,12 @@ public class TileDecoder extends PbfDecoder { // FIXME filter out all variable tags // might depend on theme though - if (key == Tag.TAG_KEY_NAME + if (key == Tag.KEY_NAME || key == Tag.KEY_HEIGHT || key == Tag.KEY_MIN_HEIGHT - || key == Tag.TAG_KEY_HOUSE_NUMBER - || key == Tag.TAG_KEY_REF - || key == Tag.TAG_KEY_ELE) + || key == Tag.KEY_HOUSE_NUMBER + || key == Tag.KEY_REF + || key == Tag.KEY_ELE) tag = new Tag(key, val, false); else tag = new Tag(key, val, true);