@Override
  public Poi getPoi(int id) throws IOException, ClientException {

    if (log.isDebugEnabled()) {
      log.debug("getPoi(): " + id + "...");
    }

    final fr.univmobile.backend.core.Poi dsPoi = poiDataSource.getByUid(id);

    final MutablePoi poi = createPoiFromData(dsPoi);

    if (poi == null) {
      throw new PoiNotFoundException(id);
    }

    return poi;
  }
  @Override
  public MutablePois getPois() throws IOException {

    log.debug("getPois()...");

    final Map<String, fr.univmobile.backend.core.Region> dsRegions //
        = regionDataSource.getAllBy(String.class, "uid");

    // final Map<String, PoiTree> dsPoitree //
    // = poitreeDataSource.getAllBy(String.class, "uid");

    final PoiGroup[] poiGroups = new PoiGroup[dsRegions.size()];

    int i = 0;

    final Set<fr.univmobile.backend.core.Region> sortedSet =
        new TreeSet<fr.univmobile.backend.core.Region>(
            new Comparator<fr.univmobile.backend.core.Region>() {

              @Override
              public int compare(
                  final fr.univmobile.backend.core.Region r1,
                  final fr.univmobile.backend.core.Region r2) {

                final Form form = Form.NFD;

                final String n1 = Normalizer.normalize(r1.getLabel(), form);
                final String n2 = Normalizer.normalize(r2.getLabel(), form);

                return n1.compareTo(n2);
              }
            });

    sortedSet.addAll(dsRegions.values());

    int markerIndex = 0;

    for (final fr.univmobile.backend.core.Region dsRegion : sortedSet) {

      final MutablePoiGroup poiGroup =
          DataBeans //
              .instantiate(MutablePoiGroup.class) //
              .setGroupLabel("Région : " + dsRegion.getLabel());

      poiGroups[i] = poiGroup;

      ++i;

      final String regionId = dsRegion.getUid();

      if (poitreeDataSource.isNullByUid(regionId)) { // TODO

        System.err.println("Cannot load PoiTree for region: " + regionId);

        continue;
      }

      final PoiTree poiTree = poitreeDataSource.getByUid(regionId);

      for (final PoiTree root : poiTree.getRoots()) {

        final int poiUid = Integer.parseInt(root.getUid());

        final fr.univmobile.backend.core.Poi dsPoi = poiDataSource.getByUid(poiUid);

        final MutablePoi poi = createPoiFromData(dsPoi);

        if (poi == null) {
          continue; // Skip empty POIs
        }

        poi.setMarkerType("green");
        poi.setMarkerIndex(Character.toString((char) ('A' + markerIndex)));

        markerIndex = (markerIndex + 1) % 26;

        poiGroup.addToPois(poi);
      }
    }

    final MutablePois pois = DataBeans.instantiate(MutablePois.class);

    for (final PoiGroup poiGroup : poiGroups) {

      pois.addToGroups(poiGroup);
    }

    return pois;
  }