Search in sources :

Example 1 with Item

use of org.b3log.solo.model.feed.rss.Item in project solo by b3log.

the class FeedProcessor method tagArticlesRSS.

/**
     * Tag articles RSS output.
     *
     * @param context the specified context
     * @throws IOException io exception
     */
@RequestProcessing(value = { "/tag-articles-rss.do" }, method = { HTTPRequestMethod.GET, HTTPRequestMethod.HEAD })
public void tagArticlesRSS(final HTTPRequestContext context) throws IOException {
    final HttpServletResponse response = context.getResponse();
    final HttpServletRequest request = context.getRequest();
    final RssRenderer renderer = new RssRenderer();
    context.setRenderer(renderer);
    final String queryString = request.getQueryString();
    if (Strings.isEmptyOrNull(queryString)) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return;
    }
    final String oIdMap = queryString.split("&")[0];
    final String tagId = oIdMap.split("=")[1];
    final Channel channel = new Channel();
    try {
        final JSONObject tag = tagRepository.get(tagId);
        if (null == tag) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        final String tagTitle = tag.getString(Tag.TAG_TITLE);
        final JSONObject preference = preferenceQueryService.getPreference();
        if (null == preference) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        final String blogTitle = preference.getString(Option.ID_C_BLOG_TITLE);
        final String blogSubtitle = preference.getString(Option.ID_C_BLOG_SUBTITLE) + ", " + tagTitle;
        final int outputCnt = preference.getInt(Option.ID_C_FEED_OUTPUT_CNT);
        channel.setTitle(StringEscapeUtils.escapeXml(blogTitle));
        channel.setLastBuildDate(new Date());
        channel.setLink(Latkes.getServePath());
        channel.setAtomLink(Latkes.getServePath() + "/tag-articles-rss.do");
        channel.setGenerator("Solo, ver " + SoloServletListener.VERSION);
        final String localeString = preference.getString(Option.ID_C_LOCALE_STRING);
        final String country = Locales.getCountry(localeString).toLowerCase();
        final String language = Locales.getLanguage(localeString).toLowerCase();
        channel.setLanguage(language + '-' + country);
        channel.setDescription(blogSubtitle);
        final JSONObject tagArticleResult = tagArticleRepository.getByTagId(tagId, 1, outputCnt);
        final JSONArray tagArticleRelations = tagArticleResult.getJSONArray(Keys.RESULTS);
        if (0 == tagArticleRelations.length()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        final List<JSONObject> articles = new ArrayList<JSONObject>();
        for (int i = 0; i < tagArticleRelations.length(); i++) {
            final JSONObject tagArticleRelation = tagArticleRelations.getJSONObject(i);
            final String articleId = tagArticleRelation.getString(Article.ARTICLE + "_" + Keys.OBJECT_ID);
            final JSONObject article = articleRepository.get(articleId);
            if (// Skips the unpublished article
            article.getBoolean(Article.ARTICLE_IS_PUBLISHED) && Strings.isEmptyOrNull(article.optString(Article.ARTICLE_VIEW_PWD))) {
                // Skips article with password
                articles.add(article);
            }
        }
        final boolean hasMultipleUsers = userQueryService.hasMultipleUsers();
        String authorName = "";
        if (!hasMultipleUsers && !articles.isEmpty()) {
            authorName = articleQueryService.getAuthor(articles.get(0)).getString(User.USER_NAME);
        }
        final boolean isFullContent = "fullContent".equals(preference.getString(Option.ID_C_FEED_OUTPUT_MODE));
        for (int i = 0; i < articles.size(); i++) {
            Item item = getItemForArticles(articles, hasMultipleUsers, authorName, isFullContent, i);
            channel.addItem(item);
        }
        renderer.setContent(channel.toString());
    } catch (final Exception e) {
        LOGGER.log(Level.ERROR, "Get tag article rss error", e);
        try {
            context.getResponse().sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        } catch (final IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}
Also used : Channel(org.b3log.solo.model.feed.rss.Channel) JSONArray(org.json.JSONArray) ArrayList(java.util.ArrayList) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) RssRenderer(org.b3log.latke.servlet.renderer.RssRenderer) Date(java.util.Date) IOException(java.io.IOException) HttpServletRequest(javax.servlet.http.HttpServletRequest) Item(org.b3log.solo.model.feed.rss.Item) JSONObject(org.json.JSONObject) RequestProcessing(org.b3log.latke.servlet.annotation.RequestProcessing)

Example 2 with Item

use of org.b3log.solo.model.feed.rss.Item in project solo by b3log.

the class FeedProcessor method getItem.

private Item getItem(final JSONArray articles, final boolean hasMultipleUsers, String authorName, final boolean isFullContent, int i) throws org.json.JSONException, org.b3log.latke.service.ServiceException {
    final JSONObject article = articles.getJSONObject(i);
    final Item ret = new Item();
    final String title = StringEscapeUtils.escapeXml(article.getString(Article.ARTICLE_TITLE));
    ret.setTitle(title);
    final String description = isFullContent ? StringEscapeUtils.escapeXml(article.getString(Article.ARTICLE_CONTENT)) : StringEscapeUtils.escapeXml(article.optString(Article.ARTICLE_ABSTRACT));
    ret.setDescription(description);
    final Date pubDate = (Date) article.get(Article.ARTICLE_UPDATE_DATE);
    ret.setPubDate(pubDate);
    final String link = Latkes.getServePath() + article.getString(Article.ARTICLE_PERMALINK);
    ret.setLink(link);
    ret.setGUID(link);
    final String authorEmail = article.getString(Article.ARTICLE_AUTHOR_EMAIL);
    if (hasMultipleUsers) {
        authorName = StringEscapeUtils.escapeXml(articleQueryService.getAuthor(article).getString(User.USER_NAME));
    }
    ret.setAuthor(authorEmail + "(" + authorName + ")");
    final String tagsString = article.getString(Article.ARTICLE_TAGS_REF);
    final String[] tagStrings = tagsString.split(",");
    for (final String tagString : tagStrings) {
        final org.b3log.solo.model.feed.rss.Category catetory = new org.b3log.solo.model.feed.rss.Category();
        ret.addCatetory(catetory);
        final String tag = tagString;
        catetory.setTerm(tag);
    }
    return ret;
}
Also used : Category(org.b3log.solo.model.feed.atom.Category) Date(java.util.Date) Item(org.b3log.solo.model.feed.rss.Item) JSONObject(org.json.JSONObject)

Example 3 with Item

use of org.b3log.solo.model.feed.rss.Item in project solo by b3log.

the class FeedProcessor method getItemForArticles.

private Item getItemForArticles(final List<JSONObject> articles, final boolean hasMultipleUsers, String authorName, final boolean isFullContent, int i) throws org.json.JSONException, org.b3log.latke.service.ServiceException {
    final JSONObject article = articles.get(i);
    final Item ret = new Item();
    final String title = StringEscapeUtils.escapeXml(article.getString(Article.ARTICLE_TITLE));
    ret.setTitle(title);
    final String description = isFullContent ? StringEscapeUtils.escapeXml(article.getString(Article.ARTICLE_CONTENT)) : StringEscapeUtils.escapeXml(article.optString(Article.ARTICLE_ABSTRACT));
    ret.setDescription(description);
    final Date pubDate = (Date) article.get(Article.ARTICLE_UPDATE_DATE);
    ret.setPubDate(pubDate);
    final String link = Latkes.getServePath() + article.getString(Article.ARTICLE_PERMALINK);
    ret.setLink(link);
    ret.setGUID(link);
    final String authorEmail = article.getString(Article.ARTICLE_AUTHOR_EMAIL);
    if (hasMultipleUsers) {
        authorName = StringEscapeUtils.escapeXml(articleQueryService.getAuthor(article).getString(User.USER_NAME));
    }
    ret.setAuthor(authorEmail + "(" + authorName + ")");
    final String tagsString = article.getString(Article.ARTICLE_TAGS_REF);
    final String[] tagStrings = tagsString.split(",");
    for (final String tagString : tagStrings) {
        final org.b3log.solo.model.feed.rss.Category catetory = new org.b3log.solo.model.feed.rss.Category();
        ret.addCatetory(catetory);
        catetory.setTerm(tagString);
    }
    return ret;
}
Also used : Category(org.b3log.solo.model.feed.atom.Category) Date(java.util.Date) Item(org.b3log.solo.model.feed.rss.Item) JSONObject(org.json.JSONObject)

Example 4 with Item

use of org.b3log.solo.model.feed.rss.Item in project solo by b3log.

the class FeedProcessor method blogArticlesRSS.

/**
     * Blog articles RSS output.
     *
     * @param context the specified context
     */
@RequestProcessing(value = { "/blog-articles-rss.do" }, method = { HTTPRequestMethod.GET, HTTPRequestMethod.HEAD })
public void blogArticlesRSS(final HTTPRequestContext context) {
    final HttpServletResponse response = context.getResponse();
    final RssRenderer renderer = new RssRenderer();
    context.setRenderer(renderer);
    final Channel channel = new Channel();
    try {
        final JSONObject preference = preferenceQueryService.getPreference();
        if (null == preference) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        final String blogTitle = preference.getString(Option.ID_C_BLOG_TITLE);
        final String blogSubtitle = preference.getString(Option.ID_C_BLOG_SUBTITLE);
        final int outputCnt = preference.getInt(Option.ID_C_FEED_OUTPUT_CNT);
        channel.setTitle(StringEscapeUtils.escapeXml(blogTitle));
        channel.setLastBuildDate(new Date());
        channel.setLink(Latkes.getServePath());
        channel.setAtomLink(Latkes.getServePath() + "/blog-articles-rss.do");
        channel.setGenerator("Solo, ver " + SoloServletListener.VERSION);
        final String localeString = preference.getString(Option.ID_C_LOCALE_STRING);
        final String country = Locales.getCountry(localeString).toLowerCase();
        final String language = Locales.getLanguage(localeString).toLowerCase();
        channel.setLanguage(language + '-' + country);
        channel.setDescription(blogSubtitle);
        final List<Filter> filters = new ArrayList<Filter>();
        filters.add(new PropertyFilter(Article.ARTICLE_IS_PUBLISHED, FilterOperator.EQUAL, true));
        filters.add(new PropertyFilter(Article.ARTICLE_VIEW_PWD, FilterOperator.EQUAL, ""));
        final Query query = new Query().setCurrentPageNum(1).setPageSize(outputCnt).setFilter(new CompositeFilter(CompositeFilterOperator.AND, filters)).addSort(Article.ARTICLE_UPDATE_DATE, SortDirection.DESCENDING).setPageCount(1);
        final JSONObject articleResult = articleRepository.get(query);
        final JSONArray articles = articleResult.getJSONArray(Keys.RESULTS);
        final boolean hasMultipleUsers = userQueryService.hasMultipleUsers();
        String authorName = "";
        if (!hasMultipleUsers && 0 != articles.length()) {
            authorName = articleQueryService.getAuthor(articles.getJSONObject(0)).getString(User.USER_NAME);
        }
        final boolean isFullContent = "fullContent".equals(preference.getString(Option.ID_C_FEED_OUTPUT_MODE));
        for (int i = 0; i < articles.length(); i++) {
            Item item = getItem(articles, hasMultipleUsers, authorName, isFullContent, i);
            channel.addItem(item);
        }
        renderer.setContent(channel.toString());
    } catch (final Exception e) {
        LOGGER.log(Level.ERROR, "Get blog article rss error", e);
        try {
            context.getResponse().sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        } catch (final IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}
Also used : CompositeFilter(org.b3log.latke.repository.CompositeFilter) Query(org.b3log.latke.repository.Query) Channel(org.b3log.solo.model.feed.rss.Channel) ArrayList(java.util.ArrayList) JSONArray(org.json.JSONArray) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) RssRenderer(org.b3log.latke.servlet.renderer.RssRenderer) Date(java.util.Date) IOException(java.io.IOException) Item(org.b3log.solo.model.feed.rss.Item) JSONObject(org.json.JSONObject) PropertyFilter(org.b3log.latke.repository.PropertyFilter) CompositeFilter(org.b3log.latke.repository.CompositeFilter) Filter(org.b3log.latke.repository.Filter) PropertyFilter(org.b3log.latke.repository.PropertyFilter) RequestProcessing(org.b3log.latke.servlet.annotation.RequestProcessing)

Aggregations

Date (java.util.Date)4 Item (org.b3log.solo.model.feed.rss.Item)4 JSONObject (org.json.JSONObject)4 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 HttpServletResponse (javax.servlet.http.HttpServletResponse)2 RequestProcessing (org.b3log.latke.servlet.annotation.RequestProcessing)2 RssRenderer (org.b3log.latke.servlet.renderer.RssRenderer)2 Category (org.b3log.solo.model.feed.atom.Category)2 Channel (org.b3log.solo.model.feed.rss.Channel)2 JSONArray (org.json.JSONArray)2 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 CompositeFilter (org.b3log.latke.repository.CompositeFilter)1 Filter (org.b3log.latke.repository.Filter)1 PropertyFilter (org.b3log.latke.repository.PropertyFilter)1 Query (org.b3log.latke.repository.Query)1