// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse;
import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.plugins.opendata.core.io.NetworkReader;
import org.openstreetmap.josm.plugins.opendata.core.modules.AbstractModule;
import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.associations.Club3eAgeHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.BureauxVoteDecoupageHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.BureauxVoteHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.MairieAnnexeHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.MairieHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.PolesTerritoriauxHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.QuartiersHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.citoyennete.SecteursHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.culture.BibliothequesHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.culture.EquipementCulturelBalmaHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.culture.LudothequeHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.culture.MuseeHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.culture.TheatreHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.enfance.CrechesHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.enfance.EcoleBalmaHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.enfance.EcoleElementaireHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.enfance.EcoleMaternelleHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.enfance.PetiteEnfanceEtJeunesseBalmaHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.environnement.RecupEmballageHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.environnement.RecupVerreHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.environnement.StationEpurationHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.patrimoine.Parcelles1680Handler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.patrimoine.Parcelles1830Handler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.services.MarchesPleinVentHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.services.PointsLumineuxHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.sport.InstallationSportiveBalmaHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.sport.InstallationSportiveToulouseHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.topographie.AltimetrieVoieHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.AiresPietonnesHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.ChantiersLineairesHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.ChantiersPonctuelsHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.HorodateurHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.MetroStationHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.PMRHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.PistesCyclablesHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.ReseauTisseoHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.StationsAutoPartageHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.TramwayStationHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.VeloToulouseHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport.Zone30Handler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.urbanisme.CommuneHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.urbanisme.NumerosRueHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.urbanisme.SanisetteHandler;
import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.urbanisme.VoirieHandler;
public class ToulouseModule extends AbstractModule {
public ToulouseModule(ModuleInformation info) {
super(info);
handlers.add(SanisetteHandler.class);
handlers.add(NumerosRueHandler.class);
handlers.add(CommuneHandler.class);
handlers.add(VoirieHandler.class);
handlers.add(Zone30Handler.class);
handlers.add(HorodateurHandler.class);
handlers.add(VeloToulouseHandler.class);
handlers.add(AltimetrieVoieHandler.class);
handlers.add(MetroStationHandler.class);
handlers.add(TramwayStationHandler.class);
handlers.add(Parcelles1680Handler.class);
handlers.add(Parcelles1830Handler.class);
handlers.add(PMRHandler.class);
handlers.add(PistesCyclablesHandler.class);
handlers.add(BureauxVoteDecoupageHandler.class);
handlers.add(BureauxVoteHandler.class);
handlers.add(Club3eAgeHandler.class);
handlers.add(CrechesHandler.class);
handlers.add(EcoleElementaireHandler.class);
handlers.add(EcoleMaternelleHandler.class);
handlers.add(LudothequeHandler.class);
handlers.add(MairieHandler.class);
handlers.add(MairieAnnexeHandler.class);
handlers.add(BibliothequesHandler.class);
handlers.add(MuseeHandler.class);
handlers.add(PolesTerritoriauxHandler.class);
handlers.add(QuartiersHandler.class);
handlers.add(SecteursHandler.class);
handlers.add(StationEpurationHandler.class);
handlers.add(TheatreHandler.class);
handlers.add(RecupEmballageHandler.class);
handlers.add(RecupVerreHandler.class);
handlers.add(ReseauTisseoHandler.class);
handlers.add(EcoleBalmaHandler.class);
handlers.add(PetiteEnfanceEtJeunesseBalmaHandler.class);
handlers.add(EquipementCulturelBalmaHandler.class);
handlers.add(InstallationSportiveBalmaHandler.class);
handlers.add(ChantiersPonctuelsHandler.class);
handlers.add(ChantiersLineairesHandler.class);
handlers.add(InstallationSportiveToulouseHandler.class);
handlers.add(StationsAutoPartageHandler.class);
handlers.add(MarchesPleinVentHandler.class);
handlers.add(AiresPietonnesHandler.class);
handlers.add(PointsLumineuxHandler.class);
}
public static final DataSet data = new DataSet();
private static final Collection<Relation> getBoundaries(int admin_level) {
Collection<Relation> result = new TreeSet<>(new Comparator<Relation>() {
@Override
public int compare(Relation o1, Relation o2) {
if (o1.hasKey("name") && o2.hasKey("name")) {
return o1.get("name").compareTo(o2.get("name"));
} else if (o1.hasKey("ref") && o2.hasKey("ref")) {
return o1.get("ref").compareTo(o2.get("ref"));
} else {
return o1.get("description").compareTo(o2.get("description"));
}
}
});
synchronized (data) {
for (Relation r : data.getRelations()) {
if (r.hasTag("admin_level", Integer.toString(admin_level)) &&
(r.hasKey("name") || r.hasKey("ref") || r.hasKey("description"))) {
result.add(r);
}
}
}
return result;
}
public static final void downloadData() {
synchronized (data) {
if (data.allPrimitives().isEmpty()) {
for (final ToulouseDataSetHandler handler : new ToulouseDataSetHandler[]{
new CommuneHandler(), new SecteursHandler(), new QuartiersHandler()}) {
Main.worker.submit(new Runnable() {
@Override
public void run() {
try {
DataSet ds = new NetworkReader(handler.getDataURL().toString(), handler, false).
parseOsm(NullProgressMonitor.INSTANCE);
handler.updateDataSet(ds);
synchronized (data) {
data.mergeFrom(ds);
}
} catch (OsmTransferException e) {
e.printStackTrace();
}
}
});
}
}
}
}
public static final Collection<Relation> getMunicipalities() {
return getBoundaries(8);
}
public static final Collection<Relation> getSectors() {
return getBoundaries(10);
}
public static final Collection<Relation> getNeighbourhoods() {
return getBoundaries(11);
}
}