/**
   * Remove river
   *
   * @param river
   */
  public void remove(T river) {
    if (logger.isDebugEnabled()) logger.debug("remove({})", river);

    // We stop the river if running
    if (riverService.checkState(river)) {
      riverService.stop(river);
    }

    // We remove the river in the database
    client
        .prepareDelete(
            SMDSearchProperties.ES_META_INDEX, SMDSearchProperties.ES_META_RIVERS, river.getId())
        .execute()
        .actionGet();

    if (logger.isDebugEnabled()) logger.debug("/remove({})", river);
  }
  /**
   * Stop a river
   *
   * @param river
   */
  public void stop(T river) {
    if (logger.isDebugEnabled()) logger.debug("stop({})", river);
    // We only add the river if the river is started
    if (river == null || !river.isStart()) return;

    riverService.stop(river);

    if (logger.isDebugEnabled()) logger.debug("/stop({})", river);
  }
  /**
   * Start a river
   *
   * @param river
   */
  public void start(T river) {
    if (logger.isDebugEnabled()) logger.debug("start({})", river);
    // We only add the river if the river is started
    if (river == null || !river.isStart()) return;

    riverService.start(river, getHelper().toXContent(river));

    if (logger.isDebugEnabled()) logger.debug("/start({})", river);
  }
  /**
   * Get all active rivers
   *
   * @return
   */
  public List<T> get() {
    if (logger.isDebugEnabled()) logger.debug("get()");
    List<T> rivers = new ArrayList<T>();

    SearchRequestBuilder srb = new SearchRequestBuilder(client);

    try {
      srb.setIndices(SMDSearchProperties.ES_META_INDEX);
      srb.setTypes(SMDSearchProperties.ES_META_RIVERS);

      SearchResponse response = srb.execute().actionGet();

      if (response.getHits().totalHits() > 0) {

        for (int i = 0; i < response.getHits().hits().length; i++) {
          T river = buildInstance();

          SearchHit hit = response.getHits().hits()[i];

          // We only manage rivers for type getHelper().type()
          river = getHelper().toRiver(river, hit.sourceAsMap());

          if (river.getType().equals(getHelper().type())) {
            // For each river, we check if the river is started or not
            river.setStart(riverService.checkState(river));
            rivers.add(river);
          }
        }
      }

    } catch (IndexMissingException e) {
      // That's a common use case. We started with an empty index
    }

    if (logger.isDebugEnabled()) logger.debug("/get()={}", rivers);
    return rivers;
  }