// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.utilsplugin2.search;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.search.SearchCompiler;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.plugins.utilsplugin2.selection.NodeWayUtils;
/**
* Matches all ways connected to [nodes and ways which match the expression]..
*/
public class ConnectedMatch extends SearchCompiler.UnaryMatch {
private Collection<Way> connected = null;
boolean all;
public ConnectedMatch(SearchCompiler.Match match, boolean all) {
super(match);
this.all = all;
}
/**
* Find (all) ways connected to ways or nodes which match the expression.
*/
private void init(boolean all) {
Collection<Way> matchedWays = new HashSet<>();
Set<Node> matchedNodes = new HashSet<>();
// find all ways that match the expression
Collection<Way> allWays = Main.getLayerManager().getEditDataSet().getWays();
for (Way way : allWays) {
if (match.match(way)) {
matchedWays.add(way);
}
}
// find all nodes that match the expression
Collection<Node> allNodes = Main.getLayerManager().getEditDataSet().getNodes();
for (Node node : allNodes) {
if (match.match(node)) {
matchedNodes.add(node);
}
}
Set<Way> newWays = new HashSet<>();
if (all) {
NodeWayUtils.addWaysConnectedToNodes(matchedNodes, newWays);
NodeWayUtils.addWaysConnectedToWaysRecursively(matchedWays, newWays);
} else {
NodeWayUtils.addWaysConnectedToNodes(matchedNodes, newWays);
NodeWayUtils.addWaysConnectedToWays(matchedWays, newWays);
}
connected = newWays;
}
@Override
public boolean match(OsmPrimitive osm) {
if (connected == null) {
init(all); // lazy initialization
}
if (osm instanceof Way) {
return connected.contains(osm);
}
return false;
}
}