From: <jbo...@li...> - 2005-11-03 21:38:37
|
Author: adamw Date: 2005-11-03 16:38:27 -0500 (Thu, 03 Nov 2005) New Revision: 1499 Added: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java Modified: trunk/forge/portal-extensions/forge-feeds/project.xml trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsNodeWatcher.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsPortlet.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsServlet.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RdfFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java Log: http://jira.jboss.com/jira/browse/JBLAB-408 : "beta" version of feeds Modified: trunk/forge/portal-extensions/forge-feeds/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-feeds/project.xml 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/project.xml 2005-11-03 21:38:27 UTC (rev 1499) @@ -45,8 +45,18 @@ <war.bundle>true</war.bundle> </properties> </dependency> - + <dependency> + <groupId>informa</groupId> + <artifactId>informa</artifactId> + <version>0.6.5</version> + <jar>informa.jar</jar> + <properties> + <war.bundle>true</war.bundle> + </properties> + </dependency> + + <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.6.2</version> Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -22,14 +22,12 @@ package org.jboss.forge.feeds; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import javax.servlet.http.HttpServletResponse; -import com.sun.syndication.io.FeedException; -import com.sun.syndication.io.XmlReader; - /** * An interface that should be implemented by classes representing data feeds. * @author adamw @@ -58,11 +56,12 @@ * @param feeds Feeds which should be aggregated into a single * feed. */ - public void generateFromFeeds(Feed[] feeds) - throws IllegalArgumentException, FeedException, IOException; + public void generateFromFeeds(Feed[] feeds, String title, + String description, String author, String link) + throws IllegalArgumentException, IOException; /** - * Gets a xml reader for the given feed. - * @return A xml read for the given feed. + * Gets an input stream of this feed. + * @return Input stream of this feed. */ - public XmlReader getXmlReader() throws IOException; + public InputStream getInputStream(); } Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -41,7 +41,7 @@ feedClasses = new HashMap<String, Class>(); feedClasses.put("rss2", Rss2Feed.class); feedClasses.put("atom", AtomFeed.class); - //feedClasses.put("rdf", RdfFeed.class); + feedClasses.put("rdf", RdfFeed.class); random = new Random(); } Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -74,7 +74,8 @@ protected final static String FEEDS_FILE_PREFIX = "forge-feeds"; - static synchronized FeedsDescriptor getInstance(final String portalName) { + static synchronized FeedsDescriptor getInstance(final String portalName, + final String baseServerAddress) { FeedsDescriptor desc = (FeedsDescriptor) ForgeHelper .getForgeManagement().getFromCache(portalName, FeedsDescriptor.class.getName()); @@ -83,7 +84,7 @@ desc = (FeedsDescriptor) ForgeHelper.getForgeManagement() .addNodeWatcher(portalName, FeedsDescriptor.class.getName(), - new FeedsNodeWatcher()); + new FeedsNodeWatcher(baseServerAddress)); return desc; } @@ -108,7 +109,11 @@ private DelegateContext context; - public FeedsDescriptor(String portalName) { + private String baseServerAddress; + + public FeedsDescriptor(String portalName, String baseServerAddress) { + this.baseServerAddress = baseServerAddress; + ContentManager cm = ContentManager.getContentManager(portalName + "/" + FEEDS_DIRECTORY); @@ -210,7 +215,6 @@ } catch (Exception e) { log.warn("Can't add feeed " + address + " : " + type + ".", e); - e.printStackTrace(); } } @@ -224,6 +228,7 @@ // First building requirements of each feed - that is, whit which // feeds each aggregated feed is built. Map<String, Set<String>> requirements = new HashMap<String, Set<String>>(); + Map<String, String[]> parameters = new HashMap<String, String[]>(); for (String feedName : feedDefs.keySet()) { Node n; @@ -232,6 +237,11 @@ Set<String> feedRequirements = new HashSet<String>(); requirements.put(feedName, feedRequirements); + parameters.put(feedName, new String[] { + XmlTools.getAttributeValue(feedNode, "title"), + XmlTools.getAttributeValue(feedNode, "description"), + XmlTools.getAttributeValue(feedNode, "author") + }); feedDisplayNames.put(feedName, XmlTools.getAttributeValue(feedNode, "display-name")); @@ -257,6 +267,7 @@ iter.hasNext();) { String feedName = iter.next(); Set<String> feedRequirements = requirements.get(feedName); + String[] feedParameters = parameters.get(feedName); Set<String> types = null; // Checking if the all of this feed's requirements are met @@ -293,11 +304,12 @@ Feed newFeed = FeedFactory.getNewFeed(type); try { - newFeed.generateFromFeeds(requiredFeeds.toArray(new Feed[0])); + newFeed.generateFromFeeds(requiredFeeds.toArray(new Feed[0]), + feedParameters[0], feedParameters[1], + feedParameters[2], generateFeedLink(true, feedName, type)); } catch (Exception e) { log.warn("Can't add aggregated feed " + feedName + " : " + type + ".", e); - e.printStackTrace(); } addFeed(feedName, type, newFeed); @@ -314,8 +326,8 @@ } } - private String generateFeedLink(String feedName, String feedType) { - return "/feeds/" + feedName + "/" + feedType; + private String generateFeedLink(boolean full, String feedName, String feedType) { + return (full ? baseServerAddress : "") + "/feeds/" + feedName + "/" + feedType; } private void fillContext() { @@ -337,7 +349,7 @@ for (String feedType : feedTypes.keySet()) { DelegateContext typeContext = feedContext.next("types"); typeContext.put("name", feedType); - typeContext.put("link", generateFeedLink(feedName, feedType)); + typeContext.put("link", generateFeedLink(false, feedName, feedType)); } } } Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsNodeWatcher.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsNodeWatcher.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsNodeWatcher.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -24,8 +24,14 @@ import org.jboss.forge.common.service.NodeWatcher; public class FeedsNodeWatcher implements NodeWatcher { + private String baseServerAddress; + + public FeedsNodeWatcher(String baseServerAddress) { + this.baseServerAddress = baseServerAddress; + } + private FeedsDescriptor getDesc(String portalName) { - return new FeedsDescriptor(portalName); + return new FeedsDescriptor(portalName, baseServerAddress); } public Object init(String portalName) { Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsPortlet.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsPortlet.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsPortlet.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -47,7 +47,8 @@ ProjectsHelper.prepareRequest(request); // Getting the feeds context. - DelegateContext feedsContext = FeedsDescriptor.getInstance(portalName) + DelegateContext feedsContext = FeedsDescriptor.getInstance(portalName, + ForgeHelper.getBaseServerAddress(request)) .getContext(); // Displaying. Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsServlet.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsServlet.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsServlet.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -59,7 +59,8 @@ String type = requestURI.substring(lastSlash+1); String name = requestURI.substring(0, lastSlash); - Feed feed = FeedsDescriptor.getInstance(ForgeHelper.LABS_PORTAL).getFeed(name, type); + Feed feed = FeedsDescriptor.getInstance(ForgeHelper.LABS_PORTAL, + ForgeHelper.getBaseServerAddress(request)).getFeed(name, type); if (feed == null) { invalidRequest(response); Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -25,6 +25,7 @@ import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -33,8 +34,6 @@ import javax.servlet.http.HttpServletResponse; -import com.sun.syndication.io.XmlReader; - public abstract class FileBasedFeed implements Feed { private final static int BUF_SIZE = 32768; @@ -77,10 +76,6 @@ write(response.getOutputStream()); } - public XmlReader getXmlReader() throws IOException { - return new XmlReader(file); - } - protected File getFile() { return file; } @@ -88,4 +83,12 @@ public void finalize() { file.delete(); } + + public InputStream getInputStream() { + try { + return new FileInputStream(file); + } catch (FileNotFoundException e) { + return null; + } + } } Added: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -0,0 +1,51 @@ +package org.jboss.forge.feeds; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Calendar; +import java.util.Iterator; + +import de.nava.informa.core.ChannelExporterIF; +import de.nava.informa.core.ChannelIF; +import de.nava.informa.core.ItemIF; +import de.nava.informa.core.ParseException; +import de.nava.informa.impl.basic.ChannelBuilder; +import de.nava.informa.parsers.FeedParser; + +public abstract class InformaBasedFeed extends FileBasedFeed { + public InformaBasedFeed(File file) { + super(file); + } + + protected abstract ChannelExporterIF getExporter() throws IOException; + + @SuppressWarnings("unchecked") + public void generateFromFeeds(Feed[] feeds, String title, String description, + String author, String link) throws IllegalArgumentException, + IOException { + ChannelBuilder builder = new ChannelBuilder(); + ChannelIF newChannel = builder.createChannel(title); + newChannel.setTitle(title); + newChannel.setDescription(description); + newChannel.setCreator(author); + newChannel.setPublisher(author); + newChannel.setLocation(new URL(link)); + newChannel.setPubDate(Calendar.getInstance().getTime()); + + for (Feed feed : feeds) { + ChannelIF childChannel; + try { + childChannel = FeedParser.parse(builder, feed.getInputStream()); + } catch (ParseException e) { + throw new IOException(e.getMessage()); + } + + for (Iterator iter = childChannel.getItems().iterator(); iter.hasNext();) { + newChannel.addItem((ItemIF) iter.next()); + } + } + + getExporter().write(newChannel); + } +} Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RdfFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RdfFeed.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RdfFeed.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -24,16 +24,16 @@ import java.io.File; import java.io.IOException; -import com.sun.syndication.feed.synd.SyndFeed; +import de.nava.informa.core.ChannelExporterIF; +import de.nava.informa.exporters.RSS_1_0_Exporter; -public class RdfFeed extends RomeBasedFeed { +public class RdfFeed extends InformaBasedFeed { public RdfFeed(File file) throws IOException { super(file); } - @Override - protected void setFeedType(SyndFeed feed) { - feed.setFeedType("rss_2.0"); + protected ChannelExporterIF getExporter() throws IOException { + return new RSS_1_0_Exporter(getFile()); } @Override Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java 2005-11-03 21:37:25 UTC (rev 1498) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java 2005-11-03 21:38:27 UTC (rev 1499) @@ -24,13 +24,19 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.Iterator; import java.util.List; +import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeedImpl; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.SyndFeedOutput; +import com.sun.syndication.io.XmlReader; public abstract class RomeBasedFeed extends FileBasedFeed { public RomeBasedFeed(File file) { @@ -40,27 +46,60 @@ protected abstract void setFeedType(SyndFeed feed); @SuppressWarnings("unchecked") - public void generateFromFeeds(Feed[] feeds) throws IllegalArgumentException, FeedException, IOException { + public void generateFromFeeds(Feed[] feeds, String title, String description, + String author, String link) throws IllegalArgumentException, + IOException { SyndFeed syndFeed = new SyndFeedImpl(); setFeedType(syndFeed); - syndFeed.setTitle("Labs feed"); - syndFeed.setDescription("Labs aggregated feed"); - syndFeed.setAuthor("Labs team"); - syndFeed.setLink("http://labs.jboss.com"); + syndFeed.setTitle(title); + syndFeed.setDescription(description); + syndFeed.setAuthor(author); + syndFeed.setLink(link); List entries = new ArrayList(); syndFeed.setEntries(entries); - + for (Feed feed : feeds) { SyndFeedInput input = new SyndFeedInput(); - SyndFeed inFeed = input.build(feed.getXmlReader()); + SyndFeed inFeed; + try { + inFeed = input.build(new XmlReader(feed.getInputStream())); + } catch (FeedException e) { + throw new IOException(e.getMessage()); + } - entries.addAll(inFeed.getEntries()); + if (inFeed.getAuthor() == null) + entries.addAll(inFeed.getEntries()); + else { + for (Iterator iter = inFeed.getEntries().iterator(); + iter.hasNext();) { + SyndEntry entry = (SyndEntry) iter.next(); + entry.setAuthor(inFeed.getAuthor()); + entries.add(entry); + } + + inFeed.setAuthor(null); + } } + + Collections.sort(entries, new Comparator<SyndEntry>() { + public int compare(SyndEntry o1, SyndEntry o2) { + Date date1 = o1.getPublishedDate(); + Date date2 = o2.getPublishedDate(); + if ((date1 == null) && (date2 == null)) return 0; + if (date1 == null) return 1; + if (date2 == null) return -1; + return date2.compareTo(date1); + } + }); SyndFeedOutput output = new SyndFeedOutput(); - output.output(syndFeed, getFile()); + try { + output.output(syndFeed, getFile()); + } catch (FeedException e) { + throw new IOException(e.getMessage()); + } } } |