private String getFeedByEvents(String extraURI, RSSRequest rssRequest) {
    IWContext iwc = getIWContext(rssRequest);
    String uri = extraURI.substring("group/".length(), extraURI.length());
    String feedFile =
        "events_" + getTypesString(uri) + getPeriod(uri) + iwc.getLocale().getLanguage() + ".xml";

    if (rssFileURIsCacheList.contains(feedFile)) return feedFile;
    String events = extraURI.substring("events/".length());
    String eventsPeriod = null;
    List eventsList = new ArrayList();
    int index = -1;
    String title = "";
    if (events.indexOf("+") == -1) {
      eventsList.add(events.substring(0, events.indexOf("/")));
      events = events.substring(events.indexOf("/") + 1, events.length());
    } else {
      while (true) {
        index = events.indexOf("+");
        if (index == -1) {
          index = events.indexOf("/");
          eventsList.add(events.substring(0, index));
          events = events.substring(index + 1, events.length());
          title = title + events.substring(0, index);
          break;
        } else {
          title = title + events.substring(0, index) + ", ";
          eventsList.add(events.substring(0, index));
          events = events.substring(index + 1, events.length());
        }
      }
    }

    eventsPeriod = events;
    Timestamp from = null;
    Timestamp to = null;
    CalBusiness calendar = new CalBusinessBean();
    List entries = null;
    if (eventsPeriod.length() != 0) {
      String fromStr = eventsPeriod.substring(0, DATE_LENGTH);
      String toStr = eventsPeriod.substring(DATE_LENGTH + 1, eventsPeriod.length() - 1);
      from = getTimeStampFromString(fromStr);
      to = getTimeStampFromString(toStr);
      Collection coll = calendar.getEntriesBetweenTimestamps(from, to);
      entries = new ArrayList();
      title = title + fromStr + "-" + toStr;
      for (Iterator iter = coll.iterator(); iter.hasNext(); ) {
        CalendarEntry element = (CalendarEntry) iter.next();
        if (eventsList.contains(element.getEntryTypeName())) {
          entries.add(element);
        }
      }
    } else entries = new ArrayList(calendar.getEntriesByEvents(eventsList));

    if (entries.isEmpty())
      return getFeed(NO_ENTRIES_FOUND_TITLE, NO_ENTRIES_FOUND_FILE, null, rssRequest, iwc);
    else {
      return getFeed(title, feedFile, entries, rssRequest, iwc);
    }
  }
  @Override
  public void handleRSSRequest(RSSRequest rssRequest) throws IOException {
    String feedParentFolder = null;
    String feedFile = null;
    String category = getCategory(rssRequest.getExtraUri());
    String extraURI = rssRequest.getExtraUri();
    if (extraURI == null) {
      extraURI = CoreConstants.EMPTY;
    }
    if ((!extraURI.endsWith(CoreConstants.SLASH)) && (extraURI.length() != 0)) {
      extraURI = extraURI.concat(CoreConstants.SLASH);
    }

    List<String> categories = new ArrayList<String>();
    List<String> articles = new ArrayList<String>();
    if (category != null) categories.add(category);

    IWContext iwc = getIWContext(rssRequest);
    String language = iwc.getLocale().getLanguage();

    if (StringUtil.isEmpty(extraURI)) {
      feedParentFolder = ARTICLE_RSS;
      feedFile = "all_".concat(language).concat(".xml");
    } else if (category != null) {
      feedParentFolder =
          ARTICLE_RSS.concat("category/").concat(category).concat(CoreConstants.SLASH);
      feedFile = "feed_.".concat(language).concat(".xml");
    } else {
      //	Have page URI
      feedParentFolder = ARTICLE_RSS.concat("page/").concat(extraURI);
      feedFile = "feed_".concat(language).concat(".xml");
      categories = getCategoriesByURI(extraURI, iwc);
      if (ListUtil.isEmpty(categories)) {
        articles = getArticlesByURI(extraURI, iwc);
      }
    }

    String realURI = CoreConstants.WEBDAV_SERVLET_URI + feedParentFolder + feedFile;
    if (rssFileURIsCacheList.contains(feedFile)) {
      try {
        this.dispatch(realURI, rssRequest);
      } catch (ServletException e) {
        LOGGER.log(Level.WARNING, "Error dispatching: " + realURI, e);
      }
    } else {
      //	Generate RSS and store and the dispatch to it and add a listener to that directory
      try {
        // todo code the 3 different cases (see description)
        searchForArticles(rssRequest, feedParentFolder, feedFile, categories, articles, extraURI);
        rssFileURIsCacheList.add(feedFile);

        this.dispatch(realURI, rssRequest);
      } catch (Exception e) {
        LOGGER.log(Level.WARNING, "Error while searching or dispatching: " + realURI, e);
        throw new IOException(e.getMessage());
      }
    }
  }
  private String getFeedByLedger(String extraURI, RSSRequest rssRequest) {
    IWContext iwc = getIWContext(rssRequest);
    //		String feedFile = "ledger_"+extraURI.substring("ledger/".length(),
    // extraURI.length()-1)+"_"+iwc.getLocale().getLanguage()+".xml";
    String uri = extraURI.substring("ledger/".length(), extraURI.length());
    String feedFile =
        "ledger_" + getName(uri) + getPeriod(uri) + "_" + iwc.getLocale().getLanguage() + ".xml";
    if (rssFileURIsCacheList.contains(feedFile)) return PATH_TO_FEED_PARENT_FOLDER + feedFile;
    String ledger = extraURI.substring("ledger/".length());
    String ledgerID = ledger.substring(0, ledger.indexOf("/"));
    String ledgerPeriod = ledger.substring(ledgerID.length() + 1, ledger.length());
    Timestamp from = null;
    Timestamp to = null;
    CalBusiness calendar = new CalBusinessBean();
    int ledgerIdInt;
    List entries = null;
    try {
      ledgerIdInt = Integer.parseInt(ledgerID);
    } catch (NumberFormatException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      return getFeed(
          INCORRECT_URI_TITLE, INCORRECT_URI_FILE, null, rssRequest, getIWContext(rssRequest));
    }

    LedgerVariationsHandler ledgerVariationsHandler = new DefaultLedgerVariationsHandler();
    String title =
        ((DefaultLedgerVariationsHandler) ledgerVariationsHandler)
            .getCalBusiness(iwc)
            .getLedger(Integer.parseInt(ledgerID))
            .getName();

    if (ledgerPeriod.length() != 0) {
      String fromStr = ledgerPeriod.substring(0, DATE_LENGTH);
      String toStr = ledgerPeriod.substring(DATE_LENGTH + 1, ledgerPeriod.length() - 1);
      from = getTimeStampFromString(fromStr);
      to = getTimeStampFromString(toStr);
      if (to.before(from))
        return getFeed(INCORRECT_PERIOD_TITLE, INCORRECT_PERIOD_FILE, null, rssRequest, iwc);
      title = title + " " + fromStr + "-" + toStr;
      Collection coll = calendar.getEntriesBetweenTimestamps(from, to);
      entries = new ArrayList();
      for (Iterator iter = coll.iterator(); iter.hasNext(); ) {
        CalendarEntry element = (CalendarEntry) iter.next();
        if (element.getLedgerID() == ledgerIdInt) {
          entries.add(element);
        }
      }
    } else entries = new ArrayList(calendar.getEntriesByLedgerID(ledgerIdInt));
    if (entries.isEmpty())
      return getFeed(NO_ENTRIES_FOUND_TITLE, NO_ENTRIES_FOUND_FILE, null, rssRequest, iwc);
    else {

      return getFeed(title, feedFile, entries, rssRequest, iwc);
    }
  }
  private String getFeedByPeriod(String extraURI, RSSRequest rssRequest) {
    IWContext iwc = getIWContext(rssRequest);
    String uri = extraURI.substring("period/".length(), extraURI.length());
    String feedFile = "period_" + getName(uri) + iwc.getLocale().getLanguage() + ".xml";

    if (rssFileURIsCacheList.contains(feedFile)) return PATH_TO_FEED_PARENT_FOLDER + feedFile;

    String period = extraURI.substring("period/".length());
    String fromStr = period.substring(0, DATE_LENGTH);
    String toStr = period.substring(DATE_LENGTH + 1, period.length() - 1);
    Timestamp fromTmst = getTimeStampFromString(fromStr);
    Timestamp toTmst = getTimeStampFromString(toStr);

    if (toTmst.before(fromTmst))
      return getFeed(INCORRECT_PERIOD_TITLE, INCORRECT_PERIOD_FILE, null, rssRequest, iwc);
    CalBusiness calendar = new CalBusinessBean();

    Collection entries = calendar.getEntriesBetweenTimestamps(fromTmst, toTmst);
    if (entries.isEmpty())
      return getFeed(NO_ENTRIES_FOUND_TITLE, NO_ENTRIES_FOUND_FILE, null, rssRequest, iwc);
    String title = fromStr + "-" + toStr;

    return getFeed(title, feedFile, entries, rssRequest, iwc);
  }