Staxで今度こそRSSフィードを纏め上げる(後は文字コード問題)

FeedManager

  1. package org.tarotaro.java.wicket.feed;
  2.  
  3. import java.io.IOException;
  4. import java.io.Serializable;
  5. import java.net.URL;
  6. import java.util.Collection;
  7. import java.util.Collections;
  8. import java.util.Comparator;
  9. import java.util.LinkedHashSet;
  10. import java.util.LinkedList;
  11. import java.util.Set;
  12. import java.util.SortedSet;
  13. import java.util.TreeSet;
  14.  
  15. import com.sun.syndication.feed.synd.SyndEntry;
  16. import com.sun.syndication.feed.synd.SyndFeed;
  17. import com.sun.syndication.feed.synd.SyndFeedImpl;
  18. import com.sun.syndication.fetcher.FeedFetcher;
  19. import com.sun.syndication.fetcher.FetcherException;
  20. import com.sun.syndication.fetcher.impl.HttpClientFeedFetcher;
  21. import com.sun.syndication.io.FeedException;
  22.  
  23. /**
  24.  * フィードを管理するクラス
  25.  * @author tarotarorg
  26.  *
  27.  */
  28. public class FeedManager implements Serializable{
  29.     private static final long serialVersionUID = 1735837604690452296L;
  30.  
  31.     private Set<URL> urlSet;
  32.     private Set<URL> erroredUrlSet;
  33.     private SortedSet<SyndEntry> entrySet;
  34.     private FeedFetcher fetcher;
  35.    
  36.     public FeedManager() {
  37.         this.urlSet = new LinkedHashSet<URL>();
  38.         this.erroredUrlSet = new LinkedHashSet<URL>();
  39.         this.entrySet = Collections.synchronizedSortedSet(
  40.                 new TreeSet<SyndEntry>(new Comparator<SyndEntry>(){
  41.                     @Override
  42.                     public int compare(SyndEntry o1, SyndEntry o2) {
  43.                         return o2.getPublishedDate().compareTo(o1.getPublishedDate());
  44.                     }
  45.                 }
  46.             )
  47.         );
  48.     }
  49.    
  50.     /**
  51.      * フィードのURLを追加する
  52.      * @param url
  53.      */
  54.     public synchronized FeedManager addFeed(URL url) {
  55.         this.urlSet.add(url);
  56.         return this;
  57.     }
  58.    
  59.     /**
  60.      * フィードを取得して返す
  61.      * @return
  62.      */
  63.     public synchronized SyndFeed getFeed() {
  64.         FeedFetcher fetcher = this.getFetcher();
  65.         this.entrySet.clear();
  66.  
  67.         for(URL url:this.urlSet) {
  68.             try {
  69.                 SyndFeed aFeed = fetcher.retrieveFeed(url);
  70.                 this.entrySet.addAll(aFeed.getEntries());
  71.             } catch (IllegalArgumentException e) {
  72.                 this.erroredUrlSet.add(url);
  73.                 this.urlSet.remove(url);
  74.             } catch (IOException e) {
  75.                 this.erroredUrlSet.add(url);
  76.                 this.urlSet.remove(url);
  77.             } catch (FeedException e) {
  78.                 this.erroredUrlSet.add(url);
  79.                 this.urlSet.remove(url);
  80.             } catch (FetcherException e) {
  81.                 this.erroredUrlSet.add(url);
  82.                 this.urlSet.remove(url);
  83.             }
  84.         }
  85.  
  86.         SyndFeed feeds = new SyndFeedImpl();
  87.         feeds.setEntries(new LinkedList<SyndFeed>(
  88.             (Collection<? extends SyndFeed>) this.entrySet)
  89.         );
  90.         return feeds;
  91.     }
  92.    
  93.     synchronized FeedFetcher getFetcher() {
  94.         if (this.fetcher == null) {
  95.             this.fetcher = new HttpClientFeedFetcher();
  96.         }
  97.         return this.fetcher;
  98.     }
  99. }
タイトルとURLをコピーしました