Coverage Report - net.sourceforge.pebble.web.view.impl.FeedView
 
Classes in this File Line Coverage Branch Coverage Complexity
FeedView
76%
80/104
56%
17/30
4.75
 
 1  
 /*
 2  
  * Copyright (c) 2003-2011, Simon Brown
 3  
  * All rights reserved.
 4  
  *
 5  
  * Redistribution and use in source and binary forms, with or without
 6  
  * modification, are permitted provided that the following conditions are met:
 7  
  *
 8  
  *   - Redistributions of source code must retain the above copyright
 9  
  *     notice, this list of conditions and the following disclaimer.
 10  
  *
 11  
  *   - Redistributions in binary form must reproduce the above copyright
 12  
  *     notice, this list of conditions and the following disclaimer in
 13  
  *     the documentation and/or other materials provided with the
 14  
  *     distribution.
 15  
  *
 16  
  *   - Neither the name of Pebble nor the names of its contributors may
 17  
  *     be used to endorse or promote products derived from this software
 18  
  *     without specific prior written permission.
 19  
  *
 20  
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 21  
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 22  
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 23  
  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 24  
  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 25  
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 26  
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 27  
  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 28  
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 29  
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 30  
  * POSSIBILITY OF SUCH DAMAGE.
 31  
  */
 32  
 package net.sourceforge.pebble.web.view.impl;
 33  
 
 34  
 import com.sun.syndication.feed.synd.*;
 35  
 import net.sourceforge.pebble.Constants;
 36  
 import net.sourceforge.pebble.api.decorator.FeedDecorator;
 37  
 import net.sourceforge.pebble.domain.*;
 38  
 import net.sourceforge.pebble.security.PebbleUserDetails;
 39  
 
 40  
 import java.util.*;
 41  
 
 42  
 /**
 43  
  * The view for the feed
 44  
  *
 45  
  * @author James Roper
 46  
  */
 47  
 public class FeedView extends AbstractRomeFeedView {
 48  
 
 49  
   public FeedView(FeedType feedType) {
 50  12
     super(feedType);
 51  12
   }
 52  
 
 53  
   @SuppressWarnings("unchecked")
 54  
   protected SyndFeed getFeed() {
 55  8
     AbstractBlog blog = (AbstractBlog) getModel().get(Constants.BLOG_KEY);
 56  8
     Collection<FeedDecorator> feedDecorators = Collections.emptyList();
 57  8
     if (blog instanceof Blog) {
 58  8
       feedDecorators = ((Blog) blog).getFeedDecorators();
 59  
     }
 60  8
     Collection<BlogEntry> blogEntries = (Collection<BlogEntry>) getModel().get(Constants.BLOG_ENTRIES);
 61  8
     SyndFeed syndFeed = new SyndFeedImpl();
 62  
 
 63  8
     populateFeedInfo(blog, syndFeed);
 64  
 
 65  8
     List<SyndEntry> feedEntries = new ArrayList<SyndEntry>();
 66  
 
 67  8
     for (BlogEntry entry : blogEntries) {
 68  8
       SyndEntry feedEntry = convertBlogEntry(blog, entry);
 69  8
       for (FeedDecorator feedDecorator : feedDecorators) {
 70  0
         feedDecorator.decorate(feedEntry, (Blog) blog, entry);
 71  
       }
 72  8
       feedEntries.add(feedEntry);
 73  8
     }
 74  8
     syndFeed.setEntries(feedEntries);
 75  8
     for (FeedDecorator feedDecorator : feedDecorators) {
 76  0
       feedDecorator.decorate(syndFeed, (Blog) blog);
 77  
     }
 78  8
     return syndFeed;
 79  
   }
 80  
 
 81  
   private SyndEntry convertBlogEntry(AbstractBlog blog, BlogEntry entry) {
 82  8
     SyndEntry feedEntry = new SyndEntryImpl();
 83  8
     feedEntry.setUri(generateId(blog, entry.getDate(), entry.getId()));
 84  8
     feedEntry.setTitle(entry.getTitle());
 85  8
     feedEntry.setLink(entry.getPermalink());
 86  8
     PebbleUserDetails entryUser = entry.getUser();
 87  8
     if (entryUser == null) {
 88  8
       feedEntry.setAuthor(entry.getAuthor());
 89  
     } else {
 90  0
       SyndPerson entryAuthor = new SyndPersonImpl();
 91  0
       entryAuthor.setName(entryUser.getName());
 92  0
       entryAuthor.setUri(entryUser.getWebsite());
 93  0
       feedEntry.setAuthors(Collections.singletonList(entryAuthor));
 94  
     }
 95  8
     feedEntry.setUpdatedDate(entry.getLastModified());
 96  8
     feedEntry.setPublishedDate(entry.getDate());
 97  
 
 98  8
     List<SyndCategory> feedCategories = new ArrayList<SyndCategory>();
 99  8
     for (Category cat : entry.getCategories()) {
 100  8
       SyndCategory feedCategory = new SyndCategoryImpl();
 101  8
       feedCategory.setName(cat.getName());
 102  8
       feedCategory.setTaxonomyUri(cat.getPermalink());
 103  8
       feedCategories.add(feedCategory);
 104  8
     }
 105  8
     for (Tag entryTag : entry.getAllTags()) {
 106  0
       SyndCategory feedCategory = new SyndCategoryImpl();
 107  0
       feedCategory.setName(entryTag.getName());
 108  0
       feedCategory.setTaxonomyUri(entryTag.getPermalink());
 109  0
       feedCategories.add(feedCategory);
 110  0
     }
 111  8
     feedEntry.setCategories(feedCategories);
 112  
 
 113  8
     SyndContent content = new SyndContentImpl();
 114  8
     content.setType("text/html");
 115  8
     if (entry.getExcerpt() == null || entry.getExcerpt().length() == 0) {
 116  8
       content.setValue(entry.getBody());
 117  
     } else {
 118  0
       content.setValue(entry.getExcerpt());
 119  
     }
 120  8
     feedEntry.setContents(Collections.singletonList(content));
 121  
 
 122  8
     if (entry.getAttachment() != null) {
 123  0
       SyndEnclosure enclosure = new SyndEnclosureImpl();
 124  0
       enclosure.setUrl(entry.getAttachment().getUrl());
 125  0
       enclosure.setType(entry.getAttachment().getType());
 126  0
       enclosure.setLength(entry.getAttachment().getSize());
 127  0
       feedEntry.setEnclosures(Collections.singletonList(enclosure));
 128  
     }
 129  8
     return feedEntry;
 130  
   }
 131  
 
 132  
   private void populateFeedInfo(AbstractBlog blog, SyndFeed syndFeed) {
 133  8
     String blogUrl = blog.getUrl();
 134  
 
 135  8
     Tag tag = (Tag) getModel().get("tag");
 136  8
     Category category = (Category) getModel().get("category");
 137  8
     String author = (String) getModel().get("author");
 138  
 
 139  
     String permalink;
 140  8
     String feedAuthor = blog.getAuthor();
 141  8
     String title = blog.getName();
 142  
 
 143  8
     if (tag != null) {
 144  0
       permalink = tag.getPermalink();
 145  0
       title += tag.getName();
 146  8
     } else if (category != null) {
 147  0
       permalink = category.getPermalink();
 148  0
       title += category.getName();
 149  8
     } else if (author != null) {
 150  0
       permalink = blogUrl + "authors/" + author;
 151  0
       title += author;
 152  
     } else {
 153  8
       permalink = blogUrl;
 154  8
       syndFeed.setTitle(blog.getName());
 155  
     }
 156  
     String xmlLink;
 157  8
     if (permalink.endsWith("/")) {
 158  8
       xmlLink = permalink + getFeedType().getFileName();
 159  
     } else {
 160  0
       xmlLink = permalink + "/" + getFeedType().getFileName();
 161  
     }
 162  8
     syndFeed.setUri(generateId(blog, null, null));
 163  8
     syndFeed.setTitle(title);
 164  8
     syndFeed.setDescription(blog.getDescription());
 165  8
     syndFeed.setLink(permalink);
 166  
     // Alternate link, used in favour of the above link for atom
 167  8
     SyndLink alternate = new SyndLinkImpl();
 168  8
     alternate.setHref(permalink);
 169  8
     alternate.setRel("alternate");
 170  8
     alternate.setType("text/html");
 171  
 
 172  8
     SyndLink self = new SyndLinkImpl();
 173  8
     self.setHref(xmlLink);
 174  8
     self.setRel("self");
 175  8
     self.setType(getFeedType().getContentType());
 176  8
     syndFeed.setLinks(Arrays.asList(alternate, self));
 177  
 
 178  8
     syndFeed.setPublishedDate(blog.getLastModified());
 179  8
     syndFeed.setAuthor(feedAuthor);
 180  
 
 181  8
     if (blog.getImage() != null) {
 182  8
       SyndImage syndImage = new SyndImageImpl();
 183  8
       syndImage.setUrl(blog.getImage());
 184  8
       syndImage.setTitle(title);
 185  8
       syndImage.setUrl(permalink);
 186  8
       syndFeed.setImage(syndImage);
 187  
       // Unfortunately, ROME doesn't support the logo attribute for Atom in a feed agnostic way
 188  
     }
 189  
 
 190  8
     syndFeed.setCopyright(feedAuthor);
 191  8
     syndFeed.setLanguage(blog.getLanguage());
 192  8
   }
 193  
 }