diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Matcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Matcher.java index 11ca1c5b1..a4dd2eb1c 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Matcher.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Matcher.java @@ -7,7 +7,7 @@ public interface Matcher { - Collection match(Map tags, TTEntityType type, String uname, int uid); + Collection match(long id, Map tags, TTEntityType type, String uname, int uid); void outputStats(StringBuilder output, String indent); diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Translation.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Translation.java index 6a2134b30..45abfdb08 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Translation.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/Translation.java @@ -7,7 +7,7 @@ public interface Translation { - Collection match(Map tags, TTEntityType entityType, String uname, int uid); + Collection match(long id, Map tags, TTEntityType entityType, String uname, int uid); Map getDataSources(); diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/AndMatcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/AndMatcher.java index 166cfc218..7c6085ad0 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/AndMatcher.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/AndMatcher.java @@ -29,8 +29,8 @@ public AndMatcher(Collection matchers, TTEntityType type, String uname, @Override - public Collection match(Map tags, TTEntityType entityType, String entityUname, - int entityUid) { + public Collection match(long entityId, Map tags, TTEntityType entityType, String entityUname, + int entityUid) { if (this.type != null && this.type != entityType) { return null; } @@ -43,7 +43,7 @@ public Collection match(Map tags, TTEntityType entityType List allMatches = new ArrayList(); for (Matcher matcher : matchers) { - Collection matches = matcher.match(tags, entityType, entityUname, entityUid); + Collection matches = matcher.match(entityId, tags, entityType, entityUname, entityUid); if (matches == null || matches.isEmpty()) { return null; } diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/IdMatcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/IdMatcher.java new file mode 100644 index 000000000..5eae53a67 --- /dev/null +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/IdMatcher.java @@ -0,0 +1,80 @@ +// This software is released into the Public Domain. See copying.txt for details. +package org.openstreetmap.osmosis.tagtransform.impl; + +import org.openstreetmap.osmosis.tagtransform.Match; +import org.openstreetmap.osmosis.tagtransform.Matcher; +import org.openstreetmap.osmosis.tagtransform.TTEntityType; + +import java.util.*; + + +public class IdMatcher implements Matcher { + + private Set ids; + private long matchHits; + + IdMatcher(Set ids) { + this.ids = ids; + } + + @Override + public Collection match(long id, Map tags, TTEntityType type, String uname, int uid) { + if (!ids.contains(id)) { + return null; + } + matchHits += 1; + return Collections.singleton(NULL_MATCH); + } + + + @Override + public void outputStats(StringBuilder output, String indent) { + output.append(indent); + output.append("Ids["); + int i = 0; + for (Long id: ids) { + if (++i>1) { + output.append(","); + } + if (i>5) { + output.append("..."); + break; + } + output.append(id); + } + output.append("]: "); + output.append(matchHits); + output.append('\n'); + } + + private static final Match NULL_MATCH = new Match() { + @Override + public int getValueGroupCount() { + return 0; + } + + + @Override + public String getValue(int group) { + return null; + } + + + @Override + public String getMatchID() { + return null; + } + + + @Override + public int getKeyGroupCount() { + return 0; + } + + + @Override + public String getKey(int group) { + return null; + } + }; +} diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/NoTagMatcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/NoTagMatcher.java index ac510e4ec..f466f3d69 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/NoTagMatcher.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/NoTagMatcher.java @@ -26,7 +26,7 @@ public NoTagMatcher(String keyPattern, String valuePattern) { @Override - public Collection match(Map tags, TTEntityType type, String uname, int uid) { + public Collection match(long id, Map tags, TTEntityType type, String uname, int uid) { // loop through the tags to find matches for (Entry tag : tags.entrySet()) { java.util.regex.Matcher keyMatch = keyPattern.matcher(tag.getKey()); diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/OrMatcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/OrMatcher.java index 0e42abe4c..12ca8cf36 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/OrMatcher.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/OrMatcher.java @@ -29,8 +29,8 @@ public OrMatcher(Collection matchers, TTEntityType type, String uname, @Override - public Collection match(Map tags, TTEntityType entityType, String entityUname, - int entityUid) { + public Collection match(long entityId, Map tags, TTEntityType entityType, String entityUname, + int entityUid) { if (this.type != null && this.type != entityType) { return null; } @@ -43,7 +43,7 @@ public Collection match(Map tags, TTEntityType entityType List allMatches = new ArrayList(); for (Matcher matcher : matchers) { - Collection matches = matcher.match(tags, entityType, entityUname, entityUid); + Collection matches = matcher.match(entityId, tags, entityType, entityUname, entityUid); if (matches != null) { allMatches.addAll(matches); } diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TagMatcher.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TagMatcher.java index 484e4ad79..2ee426a40 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TagMatcher.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TagMatcher.java @@ -30,7 +30,7 @@ public TagMatcher(String matchID, String keyPattern, String valuePattern) { @Override - public Collection match(Map tags, TTEntityType type, String uname, int uid) { + public Collection match(long id, Map tags, TTEntityType type, String uname, int uid) { List matches = new ArrayList(); // loop through the tags to find matches diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformHelper.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformHelper.java index 915d752db..c5fabab47 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformHelper.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformHelper.java @@ -116,6 +116,7 @@ protected EntityContainer processEntityContainer(EntityContainer entityContainer Entity entity = entityContainer.getEntity(); Collection entityTags = entity.getTags(); EntityType entityType = entity.getType(); + long id = entity.getId(); // Store the tags in a map keyed by tag key. Map tagMap = new HashMap(); @@ -125,7 +126,7 @@ protected EntityContainer processEntityContainer(EntityContainer entityContainer // Apply tag transformations. for (Translation translation : translations) { - Collection matches = translation.match(tagMap, TTEntityType.fromEntityType06(entityType), entity + Collection matches = translation.match(id, tagMap, TTEntityType.fromEntityType06(entityType), entity .getUser().getName(), entity.getUser().getId()); if (matches == null || matches.isEmpty()) { continue; diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformLoader.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformLoader.java index e3ad96e84..85774a244 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformLoader.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TransformLoader.java @@ -5,8 +5,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; @@ -162,6 +164,8 @@ private Matcher parseMatcher(Element matcher) { String k = matcher.getAttribute("k"); String v = matcher.getAttribute("v"); return new NoTagMatcher(k, v); + } else if (name.equals("ids")) { + return parseIds(matcher); } return null; } @@ -189,6 +193,23 @@ private Map parseDataSources(File parentDir, Element parent) return dataSources; } + private Matcher parseIds(Element idsElement) { + NodeList children = idsElement.getChildNodes(); + Set ids = new HashSet<>(); + for (int i = 0; i < children.getLength(); i++) { + if (!(children.item(i) instanceof Element)) { + continue; + } + + Element element = (Element)children.item(i); + if (element.getTagName().equals("id")) { + Long id = Long.valueOf(element.getTextContent()); + ids.add(id); + } + } + return new IdMatcher(ids); + } + private TTEntityType getType(String type) { if (type == null || type.isEmpty() || type.equals("all")) { return null; diff --git a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TranslationImpl.java b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TranslationImpl.java index 34f1e4cc9..42830fa84 100644 --- a/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TranslationImpl.java +++ b/osmosis-tagtransform/src/main/java/org/openstreetmap/osmosis/tagtransform/impl/TranslationImpl.java @@ -50,14 +50,14 @@ public boolean isDropOnMatch() { @Override - public Collection match(Map tags, TTEntityType type, String uname, int uid) { - Collection matches = matcher.match(tags, type, uname, uid); + public Collection match(long id, Map tags, TTEntityType type, String uname, int uid) { + Collection matches = matcher.match(id, tags, type, uname, uid); if (matches != null && !matches.isEmpty()) { Collection finds; if (finder == null) { finds = null; } else { - finds = finder.match(tags, type, uname, uid); + finds = finder.match(id, tags, type, uname, uid); } if (finds != null && !finds.isEmpty()) { if (matches instanceof ArrayList) { diff --git a/osmosis-tagtransform/src/test/resources/data/template/v0_6/test-out.osm b/osmosis-tagtransform/src/test/resources/data/template/v0_6/test-out.osm index 3824bc38d..2d6b9ea6e 100644 --- a/osmosis-tagtransform/src/test/resources/data/template/v0_6/test-out.osm +++ b/osmosis-tagtransform/src/test/resources/data/template/v0_6/test-out.osm @@ -20,7 +20,9 @@ - + + + diff --git a/osmosis-tagtransform/src/test/resources/data/template/v0_6/translation.xml b/osmosis-tagtransform/src/test/resources/data/template/v0_6/translation.xml index 016d670aa..f11e5ddd6 100644 --- a/osmosis-tagtransform/src/test/resources/data/template/v0_6/translation.xml +++ b/osmosis-tagtransform/src/test/resources/data/template/v0_6/translation.xml @@ -186,5 +186,19 @@ --> - + + Add tag to feature identified by id + Add a tag to a specific feature, if it does not exist already + + + 4 + 5 + + + + + + + +