Author: cbrisson Date: Tue Jun 26 15:57:54 2018 New Revision: 1834440 URL: http://svn.apache.org/viewvc?rev=1834440&view=rev Log: [tools/contribs] Add FeedTool to the versionned contribs repository
Added: velocity/contribs/tools/FeedTool/ velocity/contribs/tools/FeedTool/ContextFeedWrapper.java velocity/contribs/tools/FeedTool/FeedTool.java Added: velocity/contribs/tools/FeedTool/ContextFeedWrapper.java URL: http://svn.apache.org/viewvc/velocity/contribs/tools/FeedTool/ContextFeedWrapper.java?rev=1834440&view=auto ============================================================================== --- velocity/contribs/tools/FeedTool/ContextFeedWrapper.java (added) +++ velocity/contribs/tools/FeedTool/ContextFeedWrapper.java Tue Jun 26 15:57:54 2018 @@ -0,0 +1,89 @@ +package org.apache.velocity.tools.view.tools; + +import com.rometools.rome.feed.synd.SyndFeed; +import com.rometools.rome.feed.synd.SyndEntry; + +/** + * Feed wrapper for Velocity context providing + * utility methods for accessing feed object properties + * + * @author Christopher Townson + * + */ +public class ContextFeedWrapper { + + /** + * The feed + */ + private SyndFeed feed; + + /** + * An interger containing the total number of items in the retrieved feed + */ + private int numberOfEntries; + + /** + * A SyndEntry object for holding the most recent feed entry + */ + private SyndEntry latest; + + /** + * + * @param feed + */ + public ContextFeedWrapper(SyndFeed feed) { + // assign feed object + this.setFeed(feed); + + // grab number of entries + this.numberOfEntries = this.getFeed().getEntries().size(); + + // grab most recent entry (presently: just first entry) + // TODO make this loop through entries and compare dates + this.latest = (SyndEntry) this.getFeed().getEntries().get(0); + } + + /** + * @return Returns the feed. + */ + public SyndFeed getFeed() { + return this.feed; + } + + /** + * @param feed The feed to set. + */ + public void setFeed(SyndFeed feed) { + this.feed = feed; + } + + /** + * @return Returns the numberOfEntries. + */ + public int getNumberOfEntries() { + return numberOfEntries; + } + + /** + * @param numberOfEntries The numberOfEntries to set. + */ + public void setNumberOfEntries(int numberOfEntries) { + this.numberOfEntries = numberOfEntries; + } + + /** + * @return Returns the latest feed entry. + */ + public SyndEntry getLatest() { + return latest; + } + + /** + * @param latest The entry to set as the latest + */ + public void setLatest(SyndEntry latest) { + this.latest = latest; + } + +} + Added: velocity/contribs/tools/FeedTool/FeedTool.java URL: http://svn.apache.org/viewvc/velocity/contribs/tools/FeedTool/FeedTool.java?rev=1834440&view=auto ============================================================================== --- velocity/contribs/tools/FeedTool/FeedTool.java (added) +++ velocity/contribs/tools/FeedTool/FeedTool.java Tue Jun 26 15:57:54 2018 @@ -0,0 +1,185 @@ +package org.apache.velocity.tools.view.tools; + +import java.net.URL; +import java.net.HttpURLConnection; +import java.io.IOException; +import java.net.MalformedURLException; + +import sun.misc.BASE64Encoder; + +import com.rometools.rome.feed.synd.SyndFeed; +import com.rometools.rome.io.SyndFeedInput; +import com.rometools.rome.io.FeedException; +import com.rometools.rome.io.XmlReader; +import com.rometools.fetcher.FeedFetcher; +import com.rometools.fetcher.FetcherException; +import com.rometools.fetcher.impl.FeedFetcherCache; +import com.rometools.fetcher.impl.HashMapFeedInfoCache; +import com.rometools.fetcher.impl.HttpURLFeedFetcher; + +/** + * FeedTool + * <p> + * A Velocity View Tool for working with RSS and Atom APIs using Rome + * </p> + * @author C.Townson + */ +public class FeedTool +{ + /** + * The URL of the feed to be fetched by RomeFetcher + */ + private URL feedURL; + + /** + * The FeedObject returned from fetch by RomeFetcher + */ + private ContextFeedWrapper feed; + + /** + * Default view tool no-arg constructor + */ + public FeedTool() { + // do nothing - View Tools must have public no-arg constructor + } + + /** + * Returns the feed located at the specified URL + * <p> + * This is the core method provided with this tool - use this + * from template, rather than any of the other public methods + * </p> + * TODO overloaded method with authenication parameterss + * @param feedURL the url of the feed to retrieve + * @return feed The feed object inside a utility wrapper class + */ + public ContextFeedWrapper get(String feedURL) { + // cast String to URL + this.setFeedURL(feedURL); + + // rev up RomeFetcher + FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); + FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache); + + // retrieve feed or freak out (silently!) + try { + // grab feed + this.setFeed(feedFetcher.retrieveFeed(this.getFeedURL())); + } catch (FetcherException fetchx) { + // do something here? + } catch (FeedException feedx) { + // do something here? + } catch (IOException iox) { + // do something here? + } catch (Exception x) { + // do something here? + } + + // return wrapped feed + return this.getFeed(); + } + + /** + * Returns the feed located at the specified (password protected) URL + * @param feedURL the URL of the feed to retrieve + * @param userName the userName to access the protected URL with + * @param password the password to access the protected URL with + * @return feed the feed object inside a utility wrapper class + */ + public ContextFeedWrapper get(String feedURL, String userName, String password) { + // set feed url + this.setFeedURL(feedURL); + + // construct auth string + String auth = userName + ":" + password; + + // initialize httpcon variable + HttpURLConnection httpcon = null; + + try { + // create connection + httpcon = (HttpURLConnection) this.getFeedURL().openConnection(); + + // encode username:password + String encoding = new BASE64Encoder().encode(auth.getBytes()); + + // set request property + httpcon.setRequestProperty("Authorization","Basic " + encoding); + + // connect + httpcon.connect(); + } catch(IOException iox) { + // do something here? + } + + // rev up Rome (not using fetcher this time) + SyndFeedInput input = new SyndFeedInput(); + + // grab and wrap feed + try { + this.setFeed(input.build(new XmlReader(httpcon))); + } catch(FeedException fx) { + // do something here? + } catch(IOException iox) { + // do something here? + } + + // if we have a connection, disconnect now + if(httpcon != null) { + httpcon.disconnect(); + } + + // return wrapped feed + return this.getFeed(); + } + + /** + * @return Returns the feed. + */ + public ContextFeedWrapper getFeed() { + return this.feed; + } + + /** + * @param feed The feed to set. + */ + public void setFeed(ContextFeedWrapper feed) { + this.feed = feed; + } + + /** + * @param feed The feed to set + */ + public void setFeed(SyndFeed feed) { + this.setFeed(new ContextFeedWrapper(feed)); + } + + /** + * @return Returns the feedURL. + */ + public URL getFeedURL() { + return feedURL; + } + + /** + * @param feedURL The feedURL to set. + */ + public void setFeedURL(URL feedURL) { + this.feedURL = feedURL; + } + + /** + * Private helper method to covert String to URL + * @param url + */ + public void setFeedURL(String url) { + // try to cast URL string to URL + try { + this.setFeedURL(new URL(url)); + } catch(MalformedURLException mfux) { + // do something here? + } catch (Exception x) { + // do something here? + } + } +}