// Path: akanke-common/src/main/java/eu/kielczewski/akanke/common/domain/Document.java
// @SuppressWarnings("UnusedDeclaration")
// @Immutable
// @Entity
// public class Document implements Serializable {
// 
//     @Id
//     @NotNull
//     @Column(name = "id", nullable = false, updatable = false)
//     private String id;
// 
//     @NotNull
//     @Column(name = "file", nullable = false, updatable = false)
//     private String file;
// 
//     @NotNull
//     @Column(name = "title", nullable = false, updatable = false)
//     private String title;
// 
//     @Column(name = "description", updatable = false)
//     private String description;
// 
//     @NotNull
//     @Column(name = "contents", nullable = false, updatable = false, length = 65536)
//     @Lob
//     private String contents;
// 
//     @ElementCollection
//     @CollectionTable(name = "document_tags", joinColumns = @JoinColumn(name = "document_id"))
//     @Column(name = "tag", updatable = false)
//     private Collection<String> tags;
// 
//     @NotNull
//     @Temporal(TemporalType.TIMESTAMP)
//     @Column(name = "datePublished", nullable = false, updatable = false)
//     private Date datePublished;
// 
//     @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
//     @JoinColumn(name = "document_id", unique = true)
//     @JsonManagedReference
//     private FacebookStats facebookStats;
// 
//     private Document() {
//     }
// 
//     public Document(String id, String file, String title, String description,
//                     String contents, Collection<String> tags, Date datePublished,
//                     FacebookStats facebookStats) {
//         this.id = id;
//         this.file = file;
//         this.title = title;
//         this.description = description;
//         this.contents = contents;
//         this.tags = tags;
//         this.datePublished = new Date(datePublished.getTime());
//         this.facebookStats = facebookStats;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getFile() {
//         return file;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public String getContents() {
//         return contents;
//     }
// 
//     public Collection<String> getTags() {
//         return ImmutableList.copyOf(tags);
//     }
// 
//     public Date getDatePublished() {
//         return new Date(datePublished.getTime());
//     }
// 
//     public FacebookStats getFacebookStats() {
//         return facebookStats;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(id);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null || getClass() != obj.getClass()) {
//             return false;
//         }
//         final Document other = (Document) obj;
//         return Objects.equal(this.id, other.id);
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("file", file)
//                 .add("title", title)
//                 .add("description", description)
//                 .add("tags", tags)
//                 .add("datePublished", datePublished)
//                 .add("facebookStats", facebookStats)
//                 .toString();
//     }
// 
// }
// 
// Path: akanke-common/src/main/java/eu/kielczewski/akanke/common/service/document/DocumentService.java
// public interface DocumentService {
// 
//     Document get(String id);
// 
//     Map<String, Long> getTagCounts();
// 
//     Page<Document> getRecentByTag(String tag, int page, int numPerPage);
// 
//     Page<Document> getRecent(int page, int numPerPage);
// 
//     Optional<Document> getOneMostRecent();
// 
//     Map<String, Map<String, Long>> getCountInYearMonth();
// 
//     Page<Document> getRecentByYear(int year, int page, int numPerPage);
// 
//     Map<String, Long> getCountInMonthByYear(int year);
// 
//     Page<Document> getRecentByYearMonth(int year, int month, int page, int numPerPage);
// 
//     long getCountByYearMonth(int year, int month);
// 
//     List<Document> getMostPopular(int count);
// }


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;
        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) {
// Path: akanke-common/src/main/java/eu/kielczewski/akanke/common/domain/Document.java
// @SuppressWarnings("UnusedDeclaration")
// @Immutable
// @Entity
// public class Document implements Serializable {
// 
//     @Id
//     @NotNull
//     @Column(name = "id", nullable = false, updatable = false)
//     private String id;
// 
//     @NotNull
//     @Column(name = "file", nullable = false, updatable = false)
//     private String file;
// 
//     @NotNull
//     @Column(name = "title", nullable = false, updatable = false)
//     private String title;
// 
//     @Column(name = "description", updatable = false)
//     private String description;
// 
//     @NotNull
//     @Column(name = "contents", nullable = false, updatable = false, length = 65536)
//     @Lob
//     private String contents;
// 
//     @ElementCollection
//     @CollectionTable(name = "document_tags", joinColumns = @JoinColumn(name = "document_id"))
//     @Column(name = "tag", updatable = false)
//     private Collection<String> tags;
// 
//     @NotNull
//     @Temporal(TemporalType.TIMESTAMP)
//     @Column(name = "datePublished", nullable = false, updatable = false)
//     private Date datePublished;
// 
//     @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
//     @JoinColumn(name = "document_id", unique = true)
//     @JsonManagedReference
//     private FacebookStats facebookStats;
// 
//     private Document() {
//     }
// 
//     public Document(String id, String file, String title, String description,
//                     String contents, Collection<String> tags, Date datePublished,
//                     FacebookStats facebookStats) {
//         this.id = id;
//         this.file = file;
//         this.title = title;
//         this.description = description;
//         this.contents = contents;
//         this.tags = tags;
//         this.datePublished = new Date(datePublished.getTime());
//         this.facebookStats = facebookStats;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getFile() {
//         return file;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public String getContents() {
//         return contents;
//     }
// 
//     public Collection<String> getTags() {
//         return ImmutableList.copyOf(tags);
//     }
// 
//     public Date getDatePublished() {
//         return new Date(datePublished.getTime());
//     }
// 
//     public FacebookStats getFacebookStats() {
//         return facebookStats;
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(id);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null || getClass() != obj.getClass()) {
//             return false;
//         }
//         final Document other = (Document) obj;
//         return Objects.equal(this.id, other.id);
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//                 .add("id", id)
//                 .add("file", file)
//                 .add("title", title)
//                 .add("description", description)
//                 .add("tags", tags)
//                 .add("datePublished", datePublished)
//                 .add("facebookStats", facebookStats)
//                 .toString();
//     }
// 
// }
// 
// Path: akanke-common/src/main/java/eu/kielczewski/akanke/common/service/document/DocumentService.java
// public interface DocumentService {
// 
//     Document get(String id);
// 
//     Map<String, Long> getTagCounts();
// 
//     Page<Document> getRecentByTag(String tag, int page, int numPerPage);
// 
//     Page<Document> getRecent(int page, int numPerPage);
// 
//     Optional<Document> getOneMostRecent();
// 
//     Map<String, Map<String, Long>> getCountInYearMonth();
// 
//     Page<Document> getRecentByYear(int year, int page, int numPerPage);
// 
//     Map<String, Long> getCountInMonthByYear(int year);
// 
//     Page<Document> getRecentByYearMonth(int year, int month, int page, int numPerPage);
// 
//     long getCountByYearMonth(int year, int month);
// 
//     List<Document> getMostPopular(int count);
// }


// Path: akanke-web/src/main/java/eu/kielczewski/akanke/web/view/BlogRssFeedView.java
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;

        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();