summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/jogamp/hungryharry/FeedAggregator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/jogamp/hungryharry/FeedAggregator.java')
-rw-r--r--src/main/java/com/jogamp/hungryharry/FeedAggregator.java187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/main/java/com/jogamp/hungryharry/FeedAggregator.java b/src/main/java/com/jogamp/hungryharry/FeedAggregator.java
new file mode 100644
index 0000000..8bfc4eb
--- /dev/null
+++ b/src/main/java/com/jogamp/hungryharry/FeedAggregator.java
@@ -0,0 +1,187 @@
+/*
+ * Created on Saturday, May 14 2010 17:08
+ */
+package com.jogamp.hungryharry;
+
+import com.jogamp.hungryharry.Config.Planet;
+import com.sun.syndication.io.SyndFeedOutput;
+import java.io.PrintWriter;
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.fetcher.FetcherException;
+import com.sun.syndication.io.FeedException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.sun.syndication.feed.synd.SyndFeedImpl;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.fetcher.FeedFetcher;
+import com.sun.syndication.fetcher.impl.FeedFetcherCache;
+import com.sun.syndication.fetcher.impl.HashMapFeedInfoCache;
+import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.util.Comparator;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import static java.util.Collections.*;
+import static java.util.logging.Level.*;
+import static java.io.File.*;
+
+/**
+ * Always hungry, always.
+ *
+ * @author Michael Bien
+ *
+ */
+public class FeedAggregator {
+
+ private static final Logger LOG = Logger.getLogger(FeedAggregator.class.getName());
+
+
+ private void aggregate() throws MalformedURLException {
+
+ Config config = null;
+ try {
+ Unmarshaller unmarshaller = JAXBContext.newInstance(Config.class).createUnmarshaller();
+ Object obj = unmarshaller.unmarshal(getClass().getResourceAsStream("config.xml"));
+ config = (Config) obj;
+ } catch (JAXBException ex) {
+ throw new RuntimeException("can not read configuration", ex);
+ }
+
+
+ List<Config.Feed> feeds = config.feed;
+
+ List<URL> urls = new ArrayList<URL>();
+ for (Config.Feed feed : feeds) {
+ urls.add(new URL(feed.url));
+ }
+
+
+ List<SyndEntry> entries = new ArrayList<SyndEntry>();
+
+ FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance();
+ FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
+
+ for (int i = 0; i < urls.size(); i++) {
+ try {
+ SyndFeed inFeed = feedFetcher.retrieveFeed(urls.get(i));
+ entries.addAll(inFeed.getEntries());
+ } catch (IOException ex) {
+ LOG.log(WARNING, "skipping feed", ex);
+ } catch (FetcherException ex) {
+ LOG.log(WARNING, "skipping feed", ex);
+ } catch (FeedException ex) {
+ LOG.log(WARNING, "skipping feed", ex);
+ }
+ }
+
+ sort(entries, new Comparator<SyndEntry>() {
+ @Override
+ public int compare(SyndEntry o1, SyndEntry o2) {
+ return o2.getPublishedDate().compareTo(o1.getPublishedDate());
+ }
+ });
+
+ Planet planet = config.planet;
+ String path = cutoffTail(planet.templatePath, separatorChar);
+
+ for (String feedType : planet.feeds) {
+
+ try {
+ SyndFeed feed = new SyndFeedImpl();
+ feed.setFeedType(feedType);
+
+ feed.setTitle(planet.title);
+ feed.setDescription(planet.description);
+ feed.setAuthor(planet.author);
+ feed.setLink(planet.link);
+ feed.setEntries(entries);
+
+ SyndFeedOutput output = new SyndFeedOutput();
+
+ output.output(feed, new File(path+separatorChar+feedType+".xml"));
+
+ } catch (IOException ex) {
+ LOG.log(SEVERE, null, ex);
+ } catch (FeedException ex) {
+ LOG.log(SEVERE, null, ex);
+ }
+ }
+
+ StringBuilder content = new StringBuilder();
+ int max = 20;
+ int n = 0;
+ for (SyndEntry entry : entries) {
+ if(n++>max) {
+ break;
+ }
+ String link = entry.getLink();
+ for (Config.Template template : config.template) {
+ if(link.contains(template.keyword)) {
+ Pattern pattern = Pattern.compile(template.idpattern);
+ Matcher matcher = pattern.matcher(link);
+ matcher.find();
+ content.append(template.text.replaceAll("#id#", matcher.group(1)));
+ break;
+ }
+ }
+
+ }
+
+ try {
+ StringBuilder template = readFileAsString(planet.templatePath);
+
+ replace(template, "@atom@", planet.link);
+ replace(template, "@rss@", planet.link);
+ replace(template, "@content@", content.toString());
+
+ FileOutputStream fos = new FileOutputStream(new File(path+separator+"planet.html"));
+ fos.write(template.toString().getBytes());
+
+ } catch (IOException ex) {
+ LOG.log(SEVERE, null, ex);
+ }
+ }
+
+ private String cutoffTail(String text, char cut) {
+ return text.substring(0, text.lastIndexOf(cut));
+ }
+
+ private StringBuilder replace(StringBuilder sb, String token, String replacement) {
+ int start = sb.indexOf(token);
+ sb.replace(start, start+token.length(), replacement);
+ return sb;
+ }
+
+ private static StringBuilder readFileAsString(String filePath) throws java.io.IOException{
+ StringBuilder fileData = new StringBuilder(1000);
+ BufferedReader reader = new BufferedReader(new FileReader(filePath));
+ char[] buf = new char[1024];
+ int numRead=0;
+ while((numRead=reader.read(buf)) != -1){
+ String readData = String.valueOf(buf, 0, numRead);
+ fileData.append(readData);
+ buf = new char[1024];
+ }
+ reader.close();
+ return fileData;
+ }
+
+
+
+ public static void main(String[] args) throws MalformedURLException {
+ new FeedAggregator().aggregate();
+ }
+
+}