package eu.kielczewski.akanke.web.view;
import com.rometools.rome.feed.rss.*;
import eu.kielczewski.akanke.common.domain.Document;
import eu.kielczewski.akanke.common.service.document.DocumentService;
import eu.kielczewski.akanke.web.service.viewhelper.ViewHelperService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.feed.AbstractRssFeedView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component("blogRssFeedView")
public class BlogRssFeedView extends AbstractRssFeedView {
private static final Logger LOGGER = LoggerFactory.getLogger(BlogRssFeedView.class);
private static final String CHANNEL_TITLE = "Kielczewski.eu";
private static final String CHANNEL_DESCRIPTION = "Software Development & IT Management";
private static final int NUMBER_OF_ITEMS = 10;
private final DocumentService documentService;
private final ViewHelperService viewHelperService;
@Value("${akanke.base-url}")
private String baseUrl;
@Autowired
public BlogRssFeedView(DocumentService documentService, ViewHelperService viewHelperService) {
this.documentService = documentService;
this.viewHelperService = viewHelperService;
}
@Override
protected Channel newFeed() {
Channel channel = new Channel("rss_2.0");
channel.setLink(baseUrl + "/feed/");
channel.setTitle(CHANNEL_TITLE);
channel.setDescription(CHANNEL_DESCRIPTION);
documentService.getOneMostRecent().ifPresent(d -> channel.setPubDate(d.getDatePublished()));
return channel;
}
@Override
protected List<Item> buildFeedItems(Map<String, Object> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
LOGGER.debug("Building feed items");
return documentService.getRecent(0, NUMBER_OF_ITEMS).getContent().stream()
.map(this::createItem)
.collect(Collectors.toList());
}
private Item createItem(Document document) {
Item item = new Item();
item.setLink(baseUrl + document.getId());
item.setTitle(document.getTitle());
item.setDescription(createDescription(document));
item.setCategories(createCategories(document));
item.setPubDate(document.getDatePublished());
return item;
}
private Description createDescription(Document document) {
Description description = new Description();
description.setType(Content.HTML);
description.setValue(viewHelperService.extractExcerpt(document.getContents(), ""));
return description;
}
private List<Category> createCategories(Document document) {
return document.getTags().stream()
.map(this::createCategory)
.collect(Collectors.toList());
}
private Category createCategory(String tag) {
Category category = new Category();
category.setDomain("http://kielczewski.eu/tag/");
category.setValue(tag);
return category;
}
}