View Javadoc

1   /*
2    * $Id: FeedSplitter.java 20321 2010-11-24 15:21:24Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  package org.mule.module.rss.routing;
11  
12  import org.mule.DefaultMuleMessage;
13  import org.mule.api.MessagingException;
14  import org.mule.api.MuleEvent;
15  import org.mule.api.MuleException;
16  import org.mule.api.MuleMessage;
17  import org.mule.api.routing.filter.Filter;
18  import org.mule.module.rss.transformers.ObjectToRssFeed;
19  import org.mule.routing.AbstractSplitter;
20  
21  import com.sun.syndication.feed.synd.SyndEntry;
22  import com.sun.syndication.feed.synd.SyndFeed;
23  
24  import java.util.ArrayList;
25  import java.util.Comparator;
26  import java.util.List;
27  import java.util.Set;
28  import java.util.TreeSet;
29  
30  import org.apache.commons.logging.Log;
31  import org.apache.commons.logging.LogFactory;
32  
33  /**
34   * Will split the feed into entries.  This router also filters out any entries that are older than the last one read
35   * The filter can be configured with a date from which to accept feed entries
36   */
37  public class FeedSplitter extends AbstractSplitter
38  {
39      /**
40       * logger used by this class
41       */
42      protected transient final Log logger = LogFactory.getLog(FeedSplitter.class);
43  
44      public static final String FEED_PROPERTY = "feed.object";
45      private Filter entryFilter;
46      private ObjectToRssFeed objectToFeed = new ObjectToRssFeed();
47  
48      public FeedSplitter()
49      {
50          //By default set the filter so that entries are only read once
51          entryFilter = new EntryLastUpdatedFilter(null);
52      }
53  
54      @Override
55      protected List<MuleMessage> splitMessage(MuleEvent event) throws MuleException
56      {
57          //TODO MULE-5048, should not need to set this manually
58          setMuleContext(event.getMuleContext());
59  
60          List<MuleMessage> messages = new ArrayList<MuleMessage>();
61          if(event.getMessage().getInboundProperty("Content-Length", -1) == 0)
62          {
63              logger.info("Feed has no content, ignoring");
64              return messages;
65          }
66  
67          try
68          {
69              Object payload = event.getMessage().getPayload();
70              
71              SyndFeed feed;
72              if (payload instanceof SyndFeed)
73              {
74                  feed = (SyndFeed) payload;
75              }
76              else
77              {
78                  feed = (SyndFeed) objectToFeed.transform(event.getMessage().getPayload());
79              }
80              
81              Set<SyndEntry> entries = new TreeSet<SyndEntry>(new EntryComparator());
82              entries.addAll(feed.getEntries());
83  
84              for (SyndEntry entry : entries)
85              {
86                  MuleMessage m = new DefaultMuleMessage(entry, event.getMuleContext());
87                  if (entryFilter != null && !entryFilter.accept(m))
88                  {
89                      continue;
90                  }
91                  m.setInvocationProperty(FEED_PROPERTY, feed);
92                  messages.add(m);
93              }
94              return messages;
95  
96          }
97          catch (MuleException e)
98          {
99              throw new MessagingException(e.getI18nMessage(), event, e);
100         }
101     }
102 
103     public Filter getEntryFilter()
104     {
105         return entryFilter;
106     }
107 
108     public void setEntryFilter(Filter entryFilter)
109     {
110         this.entryFilter = entryFilter;
111     }
112     
113     class EntryComparator implements Comparator<SyndEntry>
114     {
115         public int compare(SyndEntry e1, SyndEntry e2)
116         {
117             if (e1.getPublishedDate().before(e2.getPublishedDate()))
118             {
119                 return -1;
120             }
121             else if (e1.equals(e2))
122             {
123                 return 0;
124             }
125             else
126             {
127                 return 1;
128             }
129         }
130     }
131 }