From: <jbo...@li...> - 2005-10-21 09:11:33
|
Author: adamw Date: 2005-10-21 05:11:14 -0400 (Fri, 21 Oct 2005) New Revision: 1424 Added: trunk/forge/portal-extensions/binaries/maven-repo-addons/rome/ trunk/forge/portal-extensions/binaries/maven-repo-addons/rome/jars/ trunk/forge/portal-extensions/binaries/maven-repo-addons/rome/jars/rome-0.7.jar 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/RomeBasedFeed.java Removed: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFileBasedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedElement.java Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java 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/FileBasedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Rss2Feed.java trunk/forge/portal-extensions/forge-prj-downloads/project.xml trunk/forge/portal-extensions/forge-prj-info/project.xml Log: http://jira.jboss.com/jira/browse/JBLAB-408 : Rome, FeedsDescriptor start Added: trunk/forge/portal-extensions/binaries/maven-repo-addons/rome/jars/rome-0.7.jar =================================================================== (Binary files differ) Property changes on: trunk/forge/portal-extensions/binaries/maven-repo-addons/rome/jars/rome-0.7.jar ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -110,6 +110,26 @@ return ""; } } + + /** + * Gets a node that is a child node of the given one and has the given + * name. + * @param root Node which children are to be searched. + * @param name Name of the searched node. + * @return A child node with the given name or null, if no such node + * exists. + */ + public static Node getFirstNodeWithName(Node root, String name) { + NodeList children = root.getChildNodes(); + + for (int i = 0; i < children.getLength(); i++) { + Node n = children.item(i); + if (name.equalsIgnoreCase(n.getNodeName())) + return n; + } + + return null; + } /** * Reads text contained in a tag of the form <tag>text</tag>. Modified: trunk/forge/portal-extensions/forge-feeds/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-feeds/project.xml 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/project.xml 2005-10-21 09:11:14 UTC (rev 1424) @@ -29,5 +29,39 @@ <version>1.0</version> <jar>javax.servlet.jar</jar> </dependency> + + <dependency> + <id>jdom</id> + <version>1.0</version> + <properties> + <war.bundle>true</war.bundle> + </properties> + </dependency> + + <dependency> + <id>rome</id> + <version>0.7</version> + <properties> + <war.bundle>true</war.bundle> + </properties> + </dependency> + + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + <version>2.6.2</version> + </dependency> + + <dependency> + <groupId>xerces</groupId> + <artifactId>xmlParserAPIs</artifactId> + <version>2.6.2</version> + </dependency> + + <dependency> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + <version>2.6.0</version> + </dependency> </dependencies> </project> Deleted: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFeed.java 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFeed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -1,5 +0,0 @@ -package org.jboss.forge.feeds; - -public interface AggregatedFeed { - public Feed getFeed(Feed[] toAggregate); -} Deleted: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFileBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFileBasedFeed.java 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/AggregatedFileBasedFeed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -1,53 +0,0 @@ -package org.jboss.forge.feeds; - -import java.io.File; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -public abstract class AggregatedFileBasedFeed implements AggregatedFeed { - private File file; - - public AggregatedFileBasedFeed(File file) { - this.file = file; - } - - protected abstract Feed createNewFeed(File file); - protected abstract void appendHeader(StringBuffer sb, List<FeedElement> elements); - protected abstract void appendFooter(StringBuffer sb); - - public Feed getFeed(Feed[] toAggregate) { - StringBuffer sb = new StringBuffer(); - - List<FeedElement> allElements = new ArrayList<FeedElement>(); - for (Feed feed : toAggregate) { - allElements.addAll(feed.getElements()); - } - - Collections.sort(allElements, new Comparator<FeedElement>() { - public int compare(FeedElement el1, FeedElement el2) { - return el1.getDate().compareTo(el2.getDate()); - } - }); - - appendHeader(sb, allElements); - - for (FeedElement feedElement : allElements) { - sb.append(feedElement.getContent()); - } - - appendFooter(sb); - - try { - file.createNewFile(); - PrintWriter pw = new PrintWriter(file); - pw.append(sb); - } catch (Exception e) { - // What can we do ... - } - - return createNewFeed(file); - } -} 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-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -2,9 +2,37 @@ import java.io.IOException; import java.io.OutputStream; -import java.util.List; +import java.net.URL; +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 + */ public interface Feed { + /** + * Writes the feed to the given output stream. + * @param os Output stream to write to. + * @throws IOException + */ public void write(OutputStream os) throws IOException; - public List<FeedElement> getElements(); + /** + * Generates a feed getting content from the given url. + * @param url Url from which to get the content. + */ + public void generateFromUrl(URL url) throws IOException; + /** + * Generates a feed using the given feeds. + * @param feeds Feeds which should be aggregated into a single + * feed. + */ + public void generateFromFeeds(Feed[] feeds) + throws IllegalArgumentException, FeedException, IOException; + /** + * Gets a xml reader for the given feed. + * @return A xml read for the given feed. + */ + public XmlReader getXmlReader() throws IOException; } Deleted: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedElement.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedElement.java 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedElement.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -1,21 +0,0 @@ -package org.jboss.forge.feeds; - -import java.util.Date; - -public class FeedElement { - private Date date; - private String content; - - public FeedElement(Date date, String content) { - this.date = date; - this.content = content; - } - - public String getContent() { - return content; - } - - public Date getDate() { - return date; - } -} Added: 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-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -0,0 +1,28 @@ +package org.jboss.forge.feeds; + +import java.util.HashMap; +import java.util.Map; + +public class FeedFactory { + private static Map<String, Class> feedClasses; + + static { + feedClasses = new HashMap<String, Class>(); + feedClasses.put("rss2", Rss2Feed.class); + } + + public static Feed getNewFeed(String type) { + Class feedClass = feedClasses.get(type); + if (feedClass == null) return null; + + try { + return (Feed) feedClass.newInstance(); + } catch (Exception e) { + return null; + } + } + + public static String[] getAllFeedTypes() { + return feedClasses.keySet().toArray(new String[0]); + } +} Added: 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-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -0,0 +1,114 @@ +package org.jboss.forge.feeds; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.xerces.parsers.DOMParser; +import org.jboss.forge.common.XmlTools; +import org.jboss.logging.Logger; +import org.jboss.shotoku.ContentManager; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class FeedsDescriptor { + private static final Logger log = Logger.getLogger(FeedsDescriptor.class); + + private final static String FEEDS_DIRECTORY = "feeds"; + private final static String FEEDS_NODE_ENDING = "-feeds.xml"; + private final static String REM_FEED_TAG = "remote-feed"; + private final static String AGG_FEED_TAG = "aggregated-feed"; + private final static String SHO_FEED_TAG = "shotoku-feed"; + + private final static String ALL_TOKENS = "*"; + private final static String TOKENS_DELIMITER = ","; + + private final static String TYPE_PARAM = "${type}"; + private final static String PROJECT_PARAM = "${project}"; + + /** + * <code>feeds</code> - a map of ready feeds: + * feed name -> (feed type -> feed)). + */ + private Map<String, Map<String, Feed>> feeds; + + public FeedsDescriptor(String portalName) { + ContentManager cm = ContentManager.getContentManager(portalName + + "/" + FEEDS_DIRECTORY); + + // Preparing maps which will hold feed definitions. + Map<String, Node> remoteFeedDefs = new HashMap<String, Node>(); + Map<String, Node> aggregatedFeedDefs = new HashMap<String, Node>(); + Map<String, Node> shotokuFeedDefs = new HashMap<String, Node>(); + + Map<String, Map<String, Node>> allFeedDefs = + new HashMap<String, Map<String, Node>>(); + + allFeedDefs.put(REM_FEED_TAG, remoteFeedDefs); + allFeedDefs.put(AGG_FEED_TAG, aggregatedFeedDefs); + allFeedDefs.put(SHO_FEED_TAG, shotokuFeedDefs); + + // Looking for file containing feed definitons and filling the maps. + for (org.jboss.shotoku.Node feedNode : cm.getRootDirectory().getNodes().toList()) { + if (feedNode.getName().endsWith(FEEDS_NODE_ENDING)) { + try { + addFeedDefinitions(allFeedDefs, feedNode); + } catch (Exception e) { + // We just don't add the feeds ... but log a warning. + log.warn("Can't add feed definitions.", e); + } + } + } + + // Creating the feeds. + feeds = new HashMap<String, Map<String, Feed>>(); + + // Firstly - the remote feeds. + generateRemoteFeeds(remoteFeedDefs); + + // TODO add shotoku feeds + + // After that, we can create the aggregated feeds. + + } + + private void generateRemoteFeeds(Map<String, Node> feedDefs) { + for (String feedName : feedDefs.keySet()) { + Node feedNode = feedDefs.get(feedName); + String addressAttr = XmlTools.getAttributeValue(feedNode, "address"); + String typesAttr = XmlTools.getAttributeValue(feedNode, "type"); + String projectLevelAttr = XmlTools.getAttributeValue(feedNode, "project-level"); + + String[] types; + if (ALL_TOKENS.equals(typesAttr)) { + types = FeedFactory.getAllFeedTypes(); + } else { + types = typesAttr.split("[" + TOKENS_DELIMITER + "]"); + } + + for (String type : types) { + String address = addressAttr.replace(TYPE_PARAM, type); + } + } + } + + private void addFeedDefinitions( + Map<String, Map<String, Node>> feedDefinitions, + org.jboss.shotoku.Node node) throws SAXException, IOException { + DOMParser parser = new DOMParser(); + parser.parse(new InputSource(node.getContentInputStream())); + Node root = parser.getDocument().getDocumentElement(); + + Node n; + NodeList nodes = root.getChildNodes(); + + for (int i = 0; i < nodes.getLength(); i++) { + n = nodes.item(i); + if (feedDefinitions.get(n.getNodeName()) != null) + feedDefinitions.get(n.getNodeName()).put( + XmlTools.getAttributeValue(n, "name"), n); + } + } +} 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-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -9,19 +9,16 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URL; -import java.util.List; +import com.sun.syndication.io.XmlReader; + public abstract class FileBasedFeed implements Feed { private final static int BUF_SIZE = 32768; private File file; - private List<FeedElement> elements; - - protected abstract List<FeedElement> generateElements(); - + public FileBasedFeed(File file) { this.file = file; - elements = null; } private void transfer(InputStream is, OutputStream os) throws IOException { @@ -31,11 +28,9 @@ os.write(buffer, 0, read); } - public FileBasedFeed(File file, URL url) throws IOException { - this(file); - + public void generateFromUrl(URL url) throws IOException { file.createNewFile(); - + InputStream is = url.openStream(); OutputStream os = new BufferedOutputStream(new FileOutputStream(file)); @@ -45,14 +40,6 @@ os.close(); } - public List<FeedElement> getElements() { - if (elements == null) { - elements = generateElements(); - } - - return elements; - } - public void write(OutputStream os) throws IOException { InputStream is = new BufferedInputStream(new FileInputStream(file)); @@ -60,6 +47,10 @@ is.close(); } + public XmlReader getXmlReader() throws IOException { + return new XmlReader(file); + } + protected File getFile() { return file; } Added: 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-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -0,0 +1,45 @@ +package org.jboss.forge.feeds; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +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; + +public abstract class RomeBasedFeed extends FileBasedFeed { + public RomeBasedFeed(File file) { + super(file); + } + + protected abstract void setFeedType(SyndFeed feed); + + @SuppressWarnings("unchecked") + public void generateFromFeeds(Feed[] feeds) throws IllegalArgumentException, FeedException, IOException { + SyndFeed syndFeed = new SyndFeedImpl(); + + setFeedType(syndFeed); + + syndFeed.setTitle("Aggregated Feed"); + syndFeed.setDescription("Anonymous Aggregated Feed"); + syndFeed.setAuthor("anonymous"); + syndFeed.setLink("http://www.anonymous.com"); + + List entries = new ArrayList(); + syndFeed.setEntries(entries); + + for (Feed feed : feeds) { + SyndFeedInput input = new SyndFeedInput(); + SyndFeed inFeed = input.build(feed.getXmlReader()); + + entries.addAll(inFeed.getEntries()); + } + + SyndFeedOutput output = new SyndFeedOutput(); + output.output(syndFeed, getFile()); + } +} Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Rss2Feed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Rss2Feed.java 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Rss2Feed.java 2005-10-21 09:11:14 UTC (rev 1424) @@ -2,21 +2,16 @@ import java.io.File; import java.io.IOException; -import java.net.URL; -import java.util.List; -public class Rss2Feed extends FileBasedFeed { - public Rss2Feed(File file, URL url) throws IOException { - super(file, url); - } +import com.sun.syndication.feed.synd.SyndFeed; - public Rss2Feed(File file) { +public class Rss2Feed extends RomeBasedFeed { + public Rss2Feed(File file) throws IOException { super(file); } @Override - protected List<FeedElement> generateElements() { - - return null; + protected void setFeedType(SyndFeed feed) { + feed.setFeedType("rss_2.0"); } } Modified: trunk/forge/portal-extensions/forge-prj-downloads/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-prj-downloads/project.xml 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-prj-downloads/project.xml 2005-10-21 09:11:14 UTC (rev 1424) @@ -17,21 +17,7 @@ <description></description> <dependencies> - <dependency> - <groupId>tmate</groupId> - <artifactId>javasvn</artifactId> - <version>1.0</version> - <jar>javasvn.jar</jar> - </dependency> - <dependency> - <groupId>tmate</groupId> - <artifactId>jsch</artifactId> - <version>1.0</version> - <jar>jsch.jar</jar> - </dependency> - - <dependency> <groupId>jboss-forge</groupId> <artifactId>forge-common</artifactId> <version>1.0</version> Modified: trunk/forge/portal-extensions/forge-prj-info/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-prj-info/project.xml 2005-10-21 07:54:10 UTC (rev 1423) +++ trunk/forge/portal-extensions/forge-prj-info/project.xml 2005-10-21 09:11:14 UTC (rev 1424) @@ -17,21 +17,7 @@ <description></description> <dependencies> - <dependency> - <groupId>tmate</groupId> - <artifactId>javasvn</artifactId> - <version>1.0</version> - <jar>javasvn.jar</jar> - </dependency> - <dependency> - <groupId>tmate</groupId> - <artifactId>jsch</artifactId> - <version>1.0</version> - <jar>jsch.jar</jar> - </dependency> - - <dependency> <groupId>jboss-forge</groupId> <artifactId>forge-common</artifactId> <version>1.0</version> |