Formatted and cleaned up sources

This commit is contained in:
Patrick Gotthard 2014-05-13 19:28:22 +02:00
parent eb42124975
commit d23d1c2d3c
18 changed files with 145 additions and 113 deletions

View file

@ -25,11 +25,13 @@ import com.sun.syndication.io.FeedException;
public interface FeedFetcher { public interface FeedFetcher {
/** /**
* <p> * <p>
* The default user agent. It is not marked final so buggy java compiler will not write this string into all classes that reference it. * The default user agent. It is not marked final so buggy java compiler will not write this
* string into all classes that reference it.
* </p> * </p>
* *
* <p> * <p>
* http://tinyurl.com/64t5n points to https://rome.dev.java.net Some servers ban user agents with "Java" in the name. * http://tinyurl.com/64t5n points to https://rome.dev.java.net Some servers ban user agents
* with "Java" in the name.
* </p> * </p>
* *
*/ */
@ -51,7 +53,8 @@ public interface FeedFetcher {
* </p> * </p>
* *
* <p> * <p>
* See http://www.ietf.org/rfc/rfc3229.txt and http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html * See http://www.ietf.org/rfc/rfc3229.txt and
* http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html
* </p> * </p>
* *
* <p> * <p>
@ -77,7 +80,8 @@ public interface FeedFetcher {
* </p> * </p>
* *
* <p> * <p>
* The FetcherListener will receive an FetcherEvent when a Fetcher event (feed polled, retrieved, etc) occurs * The FetcherListener will receive an FetcherEvent when a Fetcher event (feed polled,
* retrieved, etc) occurs
* </p> * </p>
* *
* @param listener The FetcherListener to recieve the event * @param listener The FetcherListener to recieve the event
@ -108,8 +112,9 @@ public interface FeedFetcher {
public SyndFeed retrieveFeed(String userAgent, URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException; public SyndFeed retrieveFeed(String userAgent, URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException;
/** /**
* If set to true, the WireFeed will be made accessible from the SyndFeed object returned from the Fetcher via the originalWireFeed() method. Each Entry in * If set to true, the WireFeed will be made accessible from the SyndFeed object returned from
* the feed will have the corresponding wireEntry property set. * the Fetcher via the originalWireFeed() method. Each Entry in the feed will have the
* corresponding wireEntry property set.
*/ */
void setPreserveWireFeed(boolean preserveWireFeed); void setPreserveWireFeed(boolean preserveWireFeed);
} }

View file

@ -5,8 +5,9 @@ import java.util.EventObject;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* Implementation note: FetcherEvent is not thread safe. Make sure that they are only ever accessed by one thread. If necessary, make all getters and setters * Implementation note: FetcherEvent is not thread safe. Make sure that they are only ever accessed
* synchronized, or alternatively make all fields final. * by one thread. If necessary, make all getters and setters synchronized, or alternatively make all
* fields final.
* *
* @author nl * @author nl
*/ */

View file

@ -25,13 +25,13 @@ import java.util.HashSet;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.rometools.fetcher.FeedFetcher; import com.rometools.fetcher.FeedFetcher;
import com.rometools.fetcher.FetcherEvent; import com.rometools.fetcher.FetcherEvent;
import com.rometools.fetcher.FetcherException; import com.rometools.fetcher.FetcherException;
import com.rometools.fetcher.FetcherListener; import com.rometools.fetcher.FetcherListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
public abstract class AbstractFeedFetcher implements FeedFetcher { public abstract class AbstractFeedFetcher implements FeedFetcher {
@ -189,7 +189,8 @@ public abstract class AbstractFeedFetcher implements FeedFetcher {
* </p> * </p>
* *
* <p> * <p>
* The returned feed will have the same data as the newFeed parameter, with the entries from originalFeed appended to the end of its entries. * The returned feed will have the same data as the newFeed parameter, with the entries from
* originalFeed appended to the end of its entries.
* </p> * </p>
* *
* @param originalFeed * @param originalFeed

View file

@ -12,7 +12,9 @@ public class AbstractFeedFetcherBeanInfo extends SimpleBeanInfo {
@Override @Override
public EventSetDescriptor[] getEventSetDescriptors() { public EventSetDescriptor[] getEventSetDescriptors() {
try { try {
final Class<AbstractFeedFetcher> clz = AbstractFeedFetcher.class; // get the class object which we'll describe final Class<AbstractFeedFetcher> clz = AbstractFeedFetcher.class; // get the class
// object which we'll
// describe
final Method addMethod = clz.getMethod("addFetcherEventListener", new Class[] { FetcherListener.class }); final Method addMethod = clz.getMethod("addFetcherEventListener", new Class[] { FetcherListener.class });
final Method removeMethod = clz.getMethod("removeFetcherEventListener", new Class[] { FetcherListener.class }); final Method removeMethod = clz.getMethod("removeFetcherEventListener", new Class[] { FetcherListener.class });
final Method listenerMethod = FetcherListener.class.getMethod("fetcherEvent", new Class[] { FetcherEvent.class }); final Method listenerMethod = FetcherListener.class.getMethod("fetcherEvent", new Class[] { FetcherEvent.class });
@ -20,7 +22,8 @@ public class AbstractFeedFetcherBeanInfo extends SimpleBeanInfo {
final EventSetDescriptor[] results = new EventSetDescriptor[] { est }; final EventSetDescriptor[] results = new EventSetDescriptor[] { est };
return results; return results;
} catch (final Exception e) { } catch (final Exception e) {
// IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown here // IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown
// here
// the best we can do is to convert them to runtime exceptions // the best we can do is to convert them to runtime exceptions
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View file

@ -20,8 +20,8 @@ import java.net.URL;
/** /**
* <p> * <p>
* An interface to allow caching of feed details. Implementing this allows the {@link com.rometools.fetcher.io.HttpURLFeedFetcher} class to enable conditional * An interface to allow caching of feed details. Implementing this allows the
* gets * {@link com.rometools.fetcher.io.HttpURLFeedFetcher} class to enable conditional gets
* </p> * </p>
* *
* @author Nick Lothian * @author Nick Lothian

View file

@ -24,12 +24,14 @@ import java.util.Map;
/** /**
* <p> * <p>
* A very simple implementation of the {@link com.rometools.fetcher.impl.FeedFetcherCache} interface. * A very simple implementation of the {@link com.rometools.fetcher.impl.FeedFetcherCache}
* interface.
* </p> * </p>
* *
* <p> * <p>
* This implementation uses a HashMap to cache retrieved feeds. This implementation is most suitible for sort term (client aggregator?) use, as the memory usage * This implementation uses a HashMap to cache retrieved feeds. This implementation is most suitible
* will increase over time as the number of feeds in the cache increases. * for sort term (client aggregator?) use, as the memory usage will increase over time as the number
* of feeds in the cache increases.
* </p> * </p>
* *
* @author Nick Lothian * @author Nick Lothian
@ -48,7 +50,8 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
* </p> * </p>
* *
* <p> * <p>
* Only use this if you want multiple instances of the cache. Usually getInstance() is more appropriate. * Only use this if you want multiple instances of the cache. Usually getInstance() is more
* appropriate.
* </p> * </p>
* *
*/ */
@ -101,7 +104,8 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
} }
/** /**
* The API of this class indicates that map must thread safe. In other words, be sure to wrap it in a synchronized map unless you know what you are doing. * The API of this class indicates that map must thread safe. In other words, be sure to wrap it
* in a synchronized map unless you know what you are doing.
* *
* @param map the map to use as the info cache. * @param map the map to use as the info cache.
*/ */

View file

@ -31,9 +31,9 @@ import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpClientParams; import org.apache.commons.httpclient.params.HttpClientParams;
import com.rometools.fetcher.FetcherEvent; import com.rometools.fetcher.FetcherEvent;
import com.rometools.fetcher.FetcherException; import com.rometools.fetcher.FetcherException;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException; import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.SyndFeedInput;
@ -67,8 +67,9 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
/** /**
* @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method * @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method
* setConnectionManagerTimeout instead of setConnectTimeout * name. Uses the HttpClientParams method setConnectionManagerTimeout instead of
* setConnectTimeout
* *
*/ */
public synchronized void setConnectTimeout(final int timeout) { public synchronized void setConnectTimeout(final int timeout) {
@ -76,8 +77,9 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
/** /**
* @return The currently used connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method * @return The currently used connect timeout for the HttpClient but using the URLConnection
* getConnectionManagerTimeout instead of getConnectTimeout * method name. Uses the HttpClientParams method getConnectionManagerTimeout instead of
* getConnectTimeout
* *
*/ */
public int getConnectTimeout() { public int getConnectTimeout() {
@ -135,14 +137,16 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
} }
/** /**
* @return The currently used read timeout for the URLConnection, 0 is unlimited, i.e. no timeout * @return The currently used read timeout for the URLConnection, 0 is unlimited, i.e. no
* timeout
*/ */
public synchronized void setReadTimeout(final int timeout) { public synchronized void setReadTimeout(final int timeout) {
httpClientParams.setSoTimeout(timeout); httpClientParams.setSoTimeout(timeout);
} }
/** /**
* @return timeout the read timeout for the URLConnection to a specified timeout, in milliseconds. * @return timeout the read timeout for the URLConnection to a specified timeout, in
* milliseconds.
*/ */
public int getReadTimeout() { public int getReadTimeout() {
return getHttpClientParams().getSoTimeout(); return getHttpClientParams().getSoTimeout();
@ -284,7 +288,8 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
final FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null && statusCode == 226) { if (cache != null && statusCode == 226) {
// client is setup to use http delta encoding and the server supports it and has returned a delta encoded response // client is setup to use http delta encoding and the server supports it and has
// returned a delta encoded response
// This response only includes new items // This response only includes new items
final SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl); final SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl);
@ -360,8 +365,9 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
public interface HttpClientMethodCallbackIntf { public interface HttpClientMethodCallbackIntf {
/** /**
* Allows access to the underlying HttpClient HttpMethod object. Note that in most cases, method.setRequestHeader(String, String) is what you want to do * Allows access to the underlying HttpClient HttpMethod object. Note that in most cases,
* (rather than method.addRequestHeader(String, String)) * method.setRequestHeader(String, String) is what you want to do (rather than
* method.addRequestHeader(String, String))
* *
* @param method * @param method
*/ */

View file

@ -26,7 +26,6 @@ import java.util.zip.GZIPInputStream;
import com.rometools.fetcher.FetcherEvent; import com.rometools.fetcher.FetcherEvent;
import com.rometools.fetcher.FetcherException; import com.rometools.fetcher.FetcherException;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException; import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.SyndFeedInput;
@ -38,11 +37,13 @@ import com.sun.syndication.io.XmlReader;
* </p> * </p>
* *
* <p> * <p>
* If passed a {@link com.rometools.fetcher.impl.FeedFetcherCache} in the constructor it will use conditional gets to only retrieve modified content. * If passed a {@link com.rometools.fetcher.impl.FeedFetcherCache} in the constructor it will use
* conditional gets to only retrieve modified content.
* </p> * </p>
* *
* <p> * <p>
* The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where supported by the server. * The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where supported by the
* server.
* </p> * </p>
* *
* <p> * <p>
@ -63,7 +64,8 @@ import com.sun.syndication.io.XmlReader;
* href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers">http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers</a> * href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers">http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers</a>
* @see <a * @see <a
* href="http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level">http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level</a> * href="http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level">http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level</a>
* @see <a href="http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html">http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html</a> * @see <a
* href="http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html">http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html</a>
* @author Nick Lothian * @author Nick Lothian
*/ */
public class HttpURLFeedFetcher extends AbstractFeedFetcher { public class HttpURLFeedFetcher extends AbstractFeedFetcher {
@ -121,7 +123,8 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
if (connectTimeout >= 0) { if (connectTimeout >= 0) {
httpConnection.setConnectTimeout(connectTimeout); httpConnection.setConnectTimeout(connectTimeout);
} }
// httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be changed on a claswide basis // httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be
// changed on a claswide basis
final FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null) { if (cache != null) {
@ -217,7 +220,8 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
if (isUsingDeltaEncoding() && imHeader != null && imHeader.indexOf("feed") >= 0) { if (isUsingDeltaEncoding() && imHeader != null && imHeader.indexOf("feed") >= 0) {
final FeedFetcherCache cache = getFeedInfoCache(); final FeedFetcherCache cache = getFeedInfoCache();
if (cache != null && connection.getResponseCode() == 226) { if (cache != null && connection.getResponseCode() == 226) {
// client is setup to use http delta encoding and the server supports it and has returned a delta encoded response // client is setup to use http delta encoding and the server supports it and has
// returned a delta encoded response
// This response only includes new items // This response only includes new items
final SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl); final SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl);
if (cachedInfo != null) { if (cachedInfo != null) {
@ -278,7 +282,8 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
is = new BufferedInputStream(inputStream); is = new BufferedInputStream(inputStream);
} }
// InputStreamReader reader = new InputStreamReader(is, ResponseHandler.getCharacterEncoding(connection)); // InputStreamReader reader = new InputStreamReader(is,
// ResponseHandler.getCharacterEncoding(connection));
// SyndFeedInput input = new SyndFeedInput(); // SyndFeedInput input = new SyndFeedInput();

View file

@ -55,7 +55,8 @@ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache {
* </p> * </p>
* *
* <p> * <p>
* Only use this if you want multiple instances of the cache. Usually {@link #getInstance()} is more appropriate. * Only use this if you want multiple instances of the cache. Usually {@link #getInstance()} is
* more appropriate.
* </p> * </p>
* *
* @see #getInstance() * @see #getInstance()

View file

@ -36,10 +36,12 @@ public class ResponseHandler {
/** /**
* *
* <p> * <p>
* Gets the character encoding of a response. (Note that this is different to the content-encoding) * Gets the character encoding of a response. (Note that this is different to the
* content-encoding)
* </p> * </p>
* *
* @param contentTypeHeader the value of the content-type HTTP header eg: text/html; charset=ISO-8859-4 * @param contentTypeHeader the value of the content-type HTTP header eg: text/html;
* charset=ISO-8859-4
* @return the character encoding, eg: ISO-8859-4 * @return the character encoding, eg: ISO-8859-4
*/ */
public static String getCharacterEncoding(final String contentTypeHeader) { public static String getCharacterEncoding(final String contentTypeHeader) {

View file

@ -24,7 +24,8 @@ import com.sun.syndication.feed.synd.SyndFeed;
/** /**
* <p> * <p>
* A class to represent a {@link com.sun.syndication.feed.synd.SyndFeed} and some useful information about it. * A class to represent a {@link com.sun.syndication.feed.synd.SyndFeed} and some useful information
* about it.
* </p> * </p>
* *
* <p> * <p>
@ -61,7 +62,8 @@ public class SyndFeedInfo implements Cloneable, Serializable {
} }
/** /**
* Indicates whether some other object is "equal to" this one as defined by the Object equals() method. * Indicates whether some other object is "equal to" this one as defined by the Object equals()
* method.
* <p> * <p>
* *
* @param other he reference object with which to compare. * @param other he reference object with which to compare.
@ -148,7 +150,8 @@ public class SyndFeedInfo implements Cloneable, Serializable {
} }
/** /**
* @param string A unique ID to identify the feed. Note that if the URL of the feed changes this will remain the same * @param string A unique ID to identify the feed. Note that if the URL of the feed changes this
* will remain the same
*/ */
public synchronized void setId(final String string) { public synchronized void setId(final String string) {
id = string; id = string;

View file

@ -25,7 +25,6 @@ import com.rometools.fetcher.FeedFetcher;
import com.rometools.fetcher.impl.FeedFetcherCache; import com.rometools.fetcher.impl.FeedFetcherCache;
import com.rometools.fetcher.impl.HashMapFeedInfoCache; import com.rometools.fetcher.impl.HashMapFeedInfoCache;
import com.rometools.fetcher.impl.HttpURLFeedFetcher; import com.rometools.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl; import com.sun.syndication.feed.synd.SyndFeedImpl;
@ -33,7 +32,8 @@ import com.sun.syndication.io.SyndFeedOutput;
/** /**
* <p> * <p>
* It aggregates a list of RSS/Atom feeds (they can be of different types) into a single feed of the specified type. * It aggregates a list of RSS/Atom feeds (they can be of different types) into a single feed of the
* specified type.
* </p> * </p>
* *
* <p> * <p>

View file

@ -25,7 +25,6 @@ import com.rometools.fetcher.FetcherListener;
import com.rometools.fetcher.impl.FeedFetcherCache; import com.rometools.fetcher.impl.FeedFetcherCache;
import com.rometools.fetcher.impl.HashMapFeedInfoCache; import com.rometools.fetcher.impl.HashMapFeedInfoCache;
import com.rometools.fetcher.impl.HttpURLFeedFetcher; import com.rometools.fetcher.impl.HttpURLFeedFetcher;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;
/** /**

View file

@ -29,15 +29,15 @@ import org.mortbay.http.SocketListener;
import org.mortbay.http.UserRealm; import org.mortbay.http.UserRealm;
import org.mortbay.http.handler.SecurityHandler; import org.mortbay.http.handler.SecurityHandler;
import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.servlet.ServletHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.rometools.fetcher.FeedFetcher; import com.rometools.fetcher.FeedFetcher;
import com.rometools.fetcher.FetcherEvent; import com.rometools.fetcher.FetcherEvent;
import com.rometools.fetcher.FetcherException; import com.rometools.fetcher.FetcherException;
import com.rometools.fetcher.FetcherListener; import com.rometools.fetcher.FetcherListener;
import com.rometools.fetcher.impl.FeedFetcherCache; import com.rometools.fetcher.impl.FeedFetcherCache;
import com.rometools.fetcher.impl.HashMapFeedInfoCache; import com.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.syndication.feed.atom.Entry; import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeed;

View file

@ -59,7 +59,8 @@ public class FetcherTestServlet extends HttpServlet {
/** /**
* @throws IOException * @throws IOException
* @throws * @throws
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/ */
@Override @Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {

View file

@ -18,6 +18,7 @@ package com.rometools.test;
import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.UsernamePasswordCredentials;
import com.rometools.fetcher.FeedFetcher; import com.rometools.fetcher.FeedFetcher;
import com.rometools.fetcher.impl.FeedFetcherCache; import com.rometools.fetcher.impl.FeedFetcherCache;
import com.rometools.fetcher.impl.HttpClientFeedFetcher; import com.rometools.fetcher.impl.HttpClientFeedFetcher;