// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.czechaddress.intelligence;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.plugins.czechaddress.StringUtils;
import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.AddressElement;
import org.openstreetmap.josm.plugins.czechaddress.addressdatabase.Street;
/**
* Updates the names in the database according the map.
*
* @author Radomír Černoch, radomir.cernoch@gmail.com
*/
public class Capitalizator {
Map<Street, OsmPrimitive> map;
Logger logger = Logger.getLogger(Capitalizator.class.getName());
public Capitalizator(Collection<OsmPrimitive> prims, List<Street> elems) {
int expResults = elems.size()/2;
map = new HashMap<>(expResults);
ExecutorService serv = Executors.newCachedThreadPool();
Map<Street, Future<OsmPrimitive>> results
= new HashMap<>(expResults);
for (Street elem : elems) {
results.put(elem, serv.submit(new StreetMatcher(elem, prims)));
}
for (Street elem : results.keySet()) {
try {
OsmPrimitive match = results.get(elem).get();
if (match == null) continue;
map.put(elem, match);
} catch (InterruptedException ex) {
logger.log(Level.SEVERE, "Thread interrupted during matching", ex);
} catch (ExecutionException ex) {
logger.log(Level.SEVERE, "Unknown error during matching", ex);
}
}
}
private static class StreetMatcher implements Callable<OsmPrimitive> {
private AddressElement elem;
private Collection<OsmPrimitive> prims;
StreetMatcher(AddressElement elem, Collection<OsmPrimitive> prims) {
this.elem = elem;
this.prims = prims;
}
@Override
public OsmPrimitive call() throws Exception {
OsmPrimitive candidate = null;
for (OsmPrimitive prim : prims) {
if (prim.get("name") == null)
continue;
if (prim.get("name").equals(elem.getName()))
return prim;
if (StringUtils.matchAbbrev(prim.get("name"), elem.getName()))
candidate = prim;
}
return candidate;
}
}
public OsmPrimitive translate(Street elem) {
return map.get(elem);
}
public Set<Street> getCapitalised() {
return map.keySet();
}
}