From 12fa5bbab6166c23262564e1af18c3b4108bdfce Mon Sep 17 00:00:00 2001 From: Patrick Gotthard Date: Sat, 12 Oct 2013 15:05:21 +0200 Subject: [PATCH] Formatted code Added Eclipse formatter and cleanup configuration --- cleanup.xml | 56 ++ formatter.xml | 291 ++++++++ .../org/rometools/fetcher/FeedFetcher.java | 78 +- .../org/rometools/fetcher/FetcherEvent.java | 114 +-- .../rometools/fetcher/FetcherException.java | 50 +- .../rometools/fetcher/FetcherListener.java | 17 +- .../fetcher/impl/AbstractFeedFetcher.java | 327 +++++---- .../impl/AbstractFeedFetcherBeanInfo.java | 31 +- .../fetcher/impl/DiskFeedInfoCache.java | 111 +-- .../fetcher/impl/FeedFetcherCache.java | 62 +- .../fetcher/impl/HashMapFeedInfoCache.java | 177 ++--- .../fetcher/impl/HttpClientFeedFetcher.java | 188 +++-- .../fetcher/impl/HttpURLFeedFetcher.java | 484 ++++++------ .../impl/LinkedHashMapFeedInfoCache.java | 105 +-- .../fetcher/impl/ResponseHandler.java | 61 +- .../rometools/fetcher/impl/SyndFeedInfo.java | 140 ++-- .../fetcher/samples/FeedAggregator.java | 49 +- .../rometools/fetcher/samples/FeedReader.java | 113 +-- src/main/resources/.gitignore | 1 + .../org/rometools/test/AbstractJettyTest.java | 688 +++++++++--------- .../rometools/test/DiskFeedInfoCacheTest.java | 70 +- .../test/HashMapFeedInfoCacheTest.java | 65 +- .../test/HttpClientFeedFetcherTest.java | 47 +- .../test/HttpURLFeedFetcherTest.java | 44 +- .../rometools/test/ResponseHandlerTest.java | 34 +- .../test/TestBasicAuthenticator.java | 1 + 26 files changed, 1913 insertions(+), 1491 deletions(-) create mode 100644 cleanup.xml create mode 100644 formatter.xml create mode 100644 src/main/resources/.gitignore diff --git a/cleanup.xml b/cleanup.xml new file mode 100644 index 0000000..40f9b7a --- /dev/null +++ b/cleanup.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/formatter.xml b/formatter.xml new file mode 100644 index 0000000..e7ba7aa --- /dev/null +++ b/formatter.xml @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/rometools/fetcher/FeedFetcher.java b/src/main/java/org/rometools/fetcher/FeedFetcher.java index 63db65d..0ccdd06 100644 --- a/src/main/java/org/rometools/fetcher/FeedFetcher.java +++ b/src/main/java/org/rometools/fetcher/FeedFetcher.java @@ -16,23 +16,22 @@ */ package org.rometools.fetcher; +import java.io.IOException; +import java.net.URL; + import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; -import java.io.IOException; - -import java.net.URL; - - public interface FeedFetcher { /** - *

The default user agent. It is not marked final so - * buggy java compiler will not write this string - * into all classes that reference it.

- * - *

http://tinyurl.com/64t5n points to https://rome.dev.java.net - * Some servers ban user agents with "Java" in the name.

- * + *

+ * The default user agent. It is not marked final so buggy java compiler will not write this string into all classes that reference it. + *

+ * + *

+ * http://tinyurl.com/64t5n points to https://rome.dev.java.net Some servers ban user agents with "Java" in the name. + *

+ * */ public static String DEFAULT_USER_AGENT = "Rome Client (http://tinyurl.com/64t5n)"; @@ -47,43 +46,56 @@ public interface FeedFetcher { public abstract String getUserAgent(); /** - *

Turn on or off rfc3229 delta encoding

- * - *

See http://www.ietf.org/rfc/rfc3229.txt and http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html

- * - *

NOTE: This is experimental and feedback is welcome!

- * + *

+ * Turn on or off rfc3229 delta encoding + *

+ * + *

+ * See http://www.ietf.org/rfc/rfc3229.txt and http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html + *

+ * + *

+ * NOTE: This is experimental and feedback is welcome! + *

+ * * @param useDeltaEncoding */ public abstract void setUsingDeltaEncoding(boolean useDeltaEncoding); /** - *

Is this fetcher using rfc3229 delta encoding?

- * + *

+ * Is this fetcher using rfc3229 delta encoding? + *

+ * * @return */ public abstract boolean isUsingDeltaEncoding(); /** - *

Add a FetcherListener.

- * - *

The FetcherListener will receive an FetcherEvent when - * a Fetcher event (feed polled, retrieved, etc) occurs

- * + *

+ * Add a FetcherListener. + *

+ * + *

+ * The FetcherListener will receive an FetcherEvent when a Fetcher event (feed polled, retrieved, etc) occurs + *

+ * * @param listener The FetcherListener to recieve the event */ public abstract void addFetcherEventListener(FetcherListener listener); /** - *

Remove a FetcherListener

- * + *

+ * Remove a FetcherListener + *

+ * * @param listener The FetcherListener to remove */ public abstract void removeFetcherEventListener(FetcherListener listener); /** * Retrieve a feed over HTTP - * + * * @param feedUrl A non-null URL of a RSS/Atom feed to retrieve * @return A {@link com.sun.syndication.feed.synd.SyndFeed} object * @throws IllegalArgumentException if the URL is null; @@ -91,15 +103,13 @@ public interface FeedFetcher { * @throws FeedException if the feed is not valid * @throws FetcherException if a HTTP error occurred */ - public abstract SyndFeed retrieveFeed(URL feedUrl) - throws IllegalArgumentException, IOException, FeedException, FetcherException; + public abstract SyndFeed retrieveFeed(URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException; - 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 the feed will have the corresponding wireEntry property set. + * 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 + * the feed will have the corresponding wireEntry property set. */ void setPreserveWireFeed(boolean preserveWireFeed); } diff --git a/src/main/java/org/rometools/fetcher/FetcherEvent.java b/src/main/java/org/rometools/fetcher/FetcherEvent.java index 232af89..8010113 100644 --- a/src/main/java/org/rometools/fetcher/FetcherEvent.java +++ b/src/main/java/org/rometools/fetcher/FetcherEvent.java @@ -5,81 +5,85 @@ import java.util.EventObject; 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 synchronized, or alternatively make all fields final. + * 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 + * synchronized, or alternatively make all fields final. * * @author nl */ public class FetcherEvent extends EventObject { - private static final long serialVersionUID = 3985600601904140103L; + private static final long serialVersionUID = 3985600601904140103L; - public static final String EVENT_TYPE_FEED_POLLED = "FEED_POLLED"; - public static final String EVENT_TYPE_FEED_RETRIEVED = "FEED_RETRIEVED"; - public static final String EVENT_TYPE_FEED_UNCHANGED = "FEED_UNCHANGED"; - - private String eventType; - private String urlString; - private SyndFeed feed; - - public FetcherEvent(Object source) { - super(source); - } + public static final String EVENT_TYPE_FEED_POLLED = "FEED_POLLED"; + public static final String EVENT_TYPE_FEED_RETRIEVED = "FEED_RETRIEVED"; + public static final String EVENT_TYPE_FEED_UNCHANGED = "FEED_UNCHANGED"; + private String eventType; + private String urlString; + private SyndFeed feed; - public FetcherEvent(Object source, String urlStr, String eventType) { - this(source); - setUrlString(urlStr); - setEventType(eventType); - } + public FetcherEvent(final Object source) { + super(source); + } + + public FetcherEvent(final Object source, final String urlStr, final String eventType) { + this(source); + setUrlString(urlStr); + setEventType(eventType); + } + + public FetcherEvent(final Object source, final String urlStr, final String eventType, final SyndFeed feed) { + this(source, urlStr, eventType); + setFeed(feed); + } - public FetcherEvent(Object source, String urlStr, String eventType, SyndFeed feed) { - this(source, urlStr, eventType); - setFeed(feed); - } - - /** * @return Returns the feed. * - *

The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED

+ *

+ * The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED + *

*/ public SyndFeed getFeed() { return feed; } - + /** * @param feed The feed to set. * - *

The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED

+ *

+ * The feed will only be set if the eventType is EVENT_TYPE_FEED_RETRIEVED + *

*/ - public void setFeed(SyndFeed feed) { + public void setFeed(final SyndFeed feed) { this.feed = feed; } - - /** - * @return Returns the eventType. - */ - public String getEventType() { - return eventType; - } - /** - * @param eventType The eventType to set. - */ - public void setEventType(String eventType) { - this.eventType = eventType; - } - /** - * @return Returns the urlString. - */ - public String getUrlString() { - return urlString; - } - /** - * @param urlString The urlString to set. - */ - public void setUrlString(String urlString) { - this.urlString = urlString; - } + + /** + * @return Returns the eventType. + */ + public String getEventType() { + return eventType; + } + + /** + * @param eventType The eventType to set. + */ + public void setEventType(final String eventType) { + this.eventType = eventType; + } + + /** + * @return Returns the urlString. + */ + public String getUrlString() { + return urlString; + } + + /** + * @param urlString The urlString to set. + */ + public void setUrlString(final String urlString) { + this.urlString = urlString; + } } diff --git a/src/main/java/org/rometools/fetcher/FetcherException.java b/src/main/java/org/rometools/fetcher/FetcherException.java index 48575ec..afaf432 100644 --- a/src/main/java/org/rometools/fetcher/FetcherException.java +++ b/src/main/java/org/rometools/fetcher/FetcherException.java @@ -18,34 +18,34 @@ package org.rometools.fetcher; /** * @author Nick Lothian - * + * */ public class FetcherException extends Exception { - private static final long serialVersionUID = -7479645796948092380L; + private static final long serialVersionUID = -7479645796948092380L; - int responseCode; - - public FetcherException(Throwable cause) { - super(); - initCause(cause); - } - - public FetcherException(String message, Throwable cause) { - super(message); - initCause(cause); - } - - public FetcherException(String message) { - super(message); - } - - public FetcherException(int responseCode, String message) { - this(message); - this.responseCode = responseCode; - } + int responseCode; - public int getResponseCode() { - return responseCode; - } + public FetcherException(final Throwable cause) { + super(); + initCause(cause); + } + + public FetcherException(final String message, final Throwable cause) { + super(message); + initCause(cause); + } + + public FetcherException(final String message) { + super(message); + } + + public FetcherException(final int responseCode, final String message) { + this(message); + this.responseCode = responseCode; + } + + public int getResponseCode() { + return responseCode; + } } diff --git a/src/main/java/org/rometools/fetcher/FetcherListener.java b/src/main/java/org/rometools/fetcher/FetcherListener.java index 3424456..d5640b5 100644 --- a/src/main/java/org/rometools/fetcher/FetcherListener.java +++ b/src/main/java/org/rometools/fetcher/FetcherListener.java @@ -2,14 +2,15 @@ package org.rometools.fetcher; import java.util.EventListener; - public interface FetcherListener extends EventListener { - /** - *

Called when a fetcher event occurs

- * - * @param event the event that fired - */ - public void fetcherEvent(FetcherEvent event); - + /** + *

+ * Called when a fetcher event occurs + *

+ * + * @param event the event that fired + */ + public void fetcherEvent(FetcherEvent event); + } diff --git a/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcher.java b/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcher.java index 4b1823f..c8b01b3 100644 --- a/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcher.java +++ b/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcher.java @@ -26,194 +26,203 @@ import java.util.Iterator; import java.util.Properties; import java.util.Set; -import com.sun.syndication.feed.synd.SyndFeed; import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherListener; +import com.sun.syndication.feed.synd.SyndFeed; public abstract class AbstractFeedFetcher implements FeedFetcher { - private final Set fetcherEventListeners; - private String userAgent; - private boolean usingDeltaEncoding; - private boolean preserveWireFeed; - - - - public AbstractFeedFetcher() { - fetcherEventListeners = Collections.synchronizedSet(new HashSet()); - - Properties props = new Properties(System.getProperties()); - String resourceName = "fetcher.properties"; - - try { - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourceName); - if (inputStream == null) { - inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName); - } - if (inputStream != null) { - props.load(inputStream); - System.getProperties().putAll(props); - inputStream.close(); - } else { - System.err.println("Could not find " + resourceName + " on classpath"); - } - } catch (IOException e) { - // do nothing - we don't want to fail just because we could not find the version - System.err.println("Error reading " + resourceName + " from classpath: " + e.getMessage()); - } - - - setUserAgent(DEFAULT_USER_AGENT + " Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN")); - } + private final Set fetcherEventListeners; + private String userAgent; + private boolean usingDeltaEncoding; + private boolean preserveWireFeed; - /** - * @return the User-Agent currently being sent to servers - */ - public synchronized String getUserAgent() { - return userAgent; - } + public AbstractFeedFetcher() { + fetcherEventListeners = Collections.synchronizedSet(new HashSet()); - /** - * @param string The User-Agent to sent to servers - */ - public synchronized void setUserAgent(String string) { - userAgent = string; - } + final Properties props = new Properties(System.getProperties()); + final String resourceName = "fetcher.properties"; - /** - * @param eventType The event type to fire - * @param connection the current connection - */ - protected void fireEvent(String eventType, URLConnection connection) { - fireEvent(eventType, connection.getURL().toExternalForm(), null); - } - - - /** - * @param eventType The event type to fire - * @param connection the current connection - * @param feed The feed to pass to the event - */ - protected void fireEvent(String eventType, URLConnection connection, SyndFeed feed) { - fireEvent(eventType, connection.getURL().toExternalForm(), feed); - } + try { + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourceName); + if (inputStream == null) { + inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName); + } + if (inputStream != null) { + props.load(inputStream); + System.getProperties().putAll(props); + inputStream.close(); + } else { + System.err.println("Could not find " + resourceName + " on classpath"); + } + } catch (final IOException e) { + // do nothing - we don't want to fail just because we could not find the version + System.err.println("Error reading " + resourceName + " from classpath: " + e.getMessage()); + } - /** - * @param eventType The event type to fire - * @param urlStr the current url as a string - */ - protected void fireEvent(String eventType, String urlStr) { - fireEvent(eventType, urlStr, null); - } - - /** - * @param eventType The event type to fire - * @param urlStr the current url as a string - * @param feed The feed to pass to the event - */ - protected void fireEvent(String eventType, String urlStr, SyndFeed feed) { - FetcherEvent fetcherEvent = new FetcherEvent(this, urlStr, eventType, feed); - synchronized(fetcherEventListeners) { - Iterator iter = fetcherEventListeners.iterator(); - while ( iter.hasNext()) { - FetcherListener fetcherEventListener = (FetcherListener) iter.next(); - fetcherEventListener.fetcherEvent(fetcherEvent); - } - } - } - - /** - * @see com.sun.syndication.fetcher.FeedFetcher#addFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) - */ - public void addFetcherEventListener(FetcherListener listener) { - if (listener != null) { - fetcherEventListeners.add(listener); - } - - } + setUserAgent(DEFAULT_USER_AGENT + " Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN")); + } - /** - * @see com.sun.syndication.fetcher.FeedFetcher#removeFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) - */ - public void removeFetcherEventListener(FetcherListener listener) { - if (listener != null) { - fetcherEventListeners.remove(listener); - } - } + /** + * @return the User-Agent currently being sent to servers + */ + @Override + public synchronized String getUserAgent() { + return userAgent; + } + + /** + * @param string The User-Agent to sent to servers + */ + @Override + public synchronized void setUserAgent(final String string) { + userAgent = string; + } + + /** + * @param eventType The event type to fire + * @param connection the current connection + */ + protected void fireEvent(final String eventType, final URLConnection connection) { + fireEvent(eventType, connection.getURL().toExternalForm(), null); + } + + /** + * @param eventType The event type to fire + * @param connection the current connection + * @param feed The feed to pass to the event + */ + protected void fireEvent(final String eventType, final URLConnection connection, final SyndFeed feed) { + fireEvent(eventType, connection.getURL().toExternalForm(), feed); + } + + /** + * @param eventType The event type to fire + * @param urlStr the current url as a string + */ + protected void fireEvent(final String eventType, final String urlStr) { + fireEvent(eventType, urlStr, null); + } + + /** + * @param eventType The event type to fire + * @param urlStr the current url as a string + * @param feed The feed to pass to the event + */ + protected void fireEvent(final String eventType, final String urlStr, final SyndFeed feed) { + final FetcherEvent fetcherEvent = new FetcherEvent(this, urlStr, eventType, feed); + synchronized (fetcherEventListeners) { + final Iterator iter = fetcherEventListeners.iterator(); + while (iter.hasNext()) { + final FetcherListener fetcherEventListener = (FetcherListener) iter.next(); + fetcherEventListener.fetcherEvent(fetcherEvent); + } + } + } + + /** + * @see com.sun.syndication.fetcher.FeedFetcher#addFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) + */ + @Override + public void addFetcherEventListener(final FetcherListener listener) { + if (listener != null) { + fetcherEventListeners.add(listener); + } + + } + + /** + * @see com.sun.syndication.fetcher.FeedFetcher#removeFetcherEventListener(com.sun.syndication.fetcher.FetcherListener) + */ + @Override + public void removeFetcherEventListener(final FetcherListener listener) { + if (listener != null) { + fetcherEventListeners.remove(listener); + } + } /** * @return Returns the useDeltaEncoding. */ + @Override public synchronized boolean isUsingDeltaEncoding() { return usingDeltaEncoding; } + /** * @param useDeltaEncoding The useDeltaEncoding to set. */ - public synchronized void setUsingDeltaEncoding(boolean useDeltaEncoding) { - this.usingDeltaEncoding = useDeltaEncoding; - } - - /** - *

Handles HTTP error codes.

- * - * @param responseCode the HTTP response code - * @throws FetcherException if response code is in the range 400 to 599 inclusive - */ - protected void handleErrorCodes(int responseCode) throws FetcherException { - // Handle 2xx codes as OK, so ignore them here - // 3xx codes are handled by the HttpURLConnection class - if (responseCode == 403) { - // Authentication is required - throwAuthenticationError(responseCode); - } else if (responseCode >= 400 && responseCode < 500) { - throw4XXError(responseCode); - } else if (responseCode >= 500 && responseCode < 600) { - throw new FetcherException(responseCode, "The server encounted an error. HTTP Response code was:" + responseCode); - } - } - - protected void throw4XXError(int responseCode) throws FetcherException { - throw new FetcherException(responseCode, "The requested resource could not be found. HTTP Response code was:" + responseCode); - } + @Override + public synchronized void setUsingDeltaEncoding(final boolean useDeltaEncoding) { + usingDeltaEncoding = useDeltaEncoding; + } - protected void throwAuthenticationError(int responseCode) throws FetcherException { - throw new FetcherException(responseCode, "Authentication required for that resource. HTTP Response code was:" + responseCode); - } - - /** - *

Combine the entries in two feeds into a single feed.

- * - *

The returned feed will have the same data as the newFeed parameter, with - * the entries from originalFeed appended to the end of its entries.

- * - * @param originalFeed - * @param newFeed - * @return - */ - public static SyndFeed combineFeeds(SyndFeed originalFeed, SyndFeed newFeed) { - SyndFeed result; + /** + *

+ * Handles HTTP error codes. + *

+ * + * @param responseCode the HTTP response code + * @throws FetcherException if response code is in the range 400 to 599 inclusive + */ + protected void handleErrorCodes(final int responseCode) throws FetcherException { + // Handle 2xx codes as OK, so ignore them here + // 3xx codes are handled by the HttpURLConnection class + if (responseCode == 403) { + // Authentication is required + throwAuthenticationError(responseCode); + } else if (responseCode >= 400 && responseCode < 500) { + throw4XXError(responseCode); + } else if (responseCode >= 500 && responseCode < 600) { + throw new FetcherException(responseCode, "The server encounted an error. HTTP Response code was:" + responseCode); + } + } + + protected void throw4XXError(final int responseCode) throws FetcherException { + throw new FetcherException(responseCode, "The requested resource could not be found. HTTP Response code was:" + responseCode); + } + + protected void throwAuthenticationError(final int responseCode) throws FetcherException { + throw new FetcherException(responseCode, "Authentication required for that resource. HTTP Response code was:" + responseCode); + } + + /** + *

+ * Combine the entries in two feeds into a single feed. + *

+ * + *

+ * The returned feed will have the same data as the newFeed parameter, with the entries from originalFeed appended to the end of its entries. + *

+ * + * @param originalFeed + * @param newFeed + * @return + */ + public static SyndFeed combineFeeds(final SyndFeed originalFeed, final SyndFeed newFeed) { + SyndFeed result; try { result = (SyndFeed) newFeed.clone(); - + result.getEntries().addAll(result.getEntries().size(), originalFeed.getEntries()); - + return result; - } catch (CloneNotSupportedException e) { - IllegalArgumentException iae = new IllegalArgumentException("Cannot clone feed"); + } catch (final CloneNotSupportedException e) { + final IllegalArgumentException iae = new IllegalArgumentException("Cannot clone feed"); iae.initCause(e); throw iae; - } - } + } + } - public boolean isPreserveWireFeed() { - return preserveWireFeed; - } + public boolean isPreserveWireFeed() { + return preserveWireFeed; + } + + @Override + public void setPreserveWireFeed(final boolean preserveWireFeed) { + this.preserveWireFeed = preserveWireFeed; + } - public void setPreserveWireFeed(boolean preserveWireFeed) { - this.preserveWireFeed = preserveWireFeed; - } - } diff --git a/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcherBeanInfo.java b/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcherBeanInfo.java index 7342901..34f43bd 100644 --- a/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcherBeanInfo.java +++ b/src/main/java/org/rometools/fetcher/impl/AbstractFeedFetcherBeanInfo.java @@ -9,21 +9,22 @@ import org.rometools.fetcher.FetcherListener; public class AbstractFeedFetcherBeanInfo extends SimpleBeanInfo { - public EventSetDescriptor[] getEventSetDescriptors() { - try { - Class clz = AbstractFeedFetcher.class; // get the class object which we'll describe - Method addMethod = clz.getMethod("addFetcherEventListener", new Class[] { FetcherListener.class }); - Method removeMethod = clz.getMethod("removeFetcherEventListener", new Class[] { FetcherListener.class }); - Method listenerMethod = FetcherListener.class.getMethod("fetcherEvent", new Class[] { FetcherEvent.class }); + @Override + public EventSetDescriptor[] getEventSetDescriptors() { + try { + final Class clz = AbstractFeedFetcher.class; // get the class object which we'll describe + final Method addMethod = clz.getMethod("addFetcherEventListener", 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 }); - EventSetDescriptor est = new EventSetDescriptor("fetcherEvent", clz, new Method[] { listenerMethod }, addMethod, removeMethod); - EventSetDescriptor[] results = new EventSetDescriptor[] { est }; + final EventSetDescriptor est = new EventSetDescriptor("fetcherEvent", clz, new Method[] { listenerMethod }, addMethod, removeMethod); + final EventSetDescriptor[] results = new EventSetDescriptor[] { est }; - return results; - } catch (Exception e) { - // IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown here - // the best we can do is to convert them to runtime exceptions - throw new RuntimeException(e); - } - } + return results; + } catch (final Exception e) { + // IntrospectionException, SecurityException and/or NoSuchMethodException can be thrown here + // the best we can do is to convert them to runtime exceptions + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/org/rometools/fetcher/impl/DiskFeedInfoCache.java b/src/main/java/org/rometools/fetcher/impl/DiskFeedInfoCache.java index df788bc..87ab0d2 100644 --- a/src/main/java/org/rometools/fetcher/impl/DiskFeedInfoCache.java +++ b/src/main/java/org/rometools/fetcher/impl/DiskFeedInfoCache.java @@ -23,112 +23,113 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.URL; -import javax.swing.text.Utilities; - /** * Disk based cache. */ public class DiskFeedInfoCache implements FeedFetcherCache { - + protected String cachePath = null; - public DiskFeedInfoCache(String cachePath) { + + public DiskFeedInfoCache(final String cachePath) { this.cachePath = cachePath; } - public SyndFeedInfo getFeedInfo(URL url) { + + @Override + public SyndFeedInfo getFeedInfo(final URL url) { SyndFeedInfo info = null; - String fileName = cachePath + File.separator + "feed_" - + replaceNonAlphanumeric(url.toString(),'_').trim(); + final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim(); FileInputStream fis; try { fis = new FileInputStream(fileName); - ObjectInputStream ois = new ObjectInputStream(fis); - info = (SyndFeedInfo)ois.readObject(); + final ObjectInputStream ois = new ObjectInputStream(fis); + info = (SyndFeedInfo) ois.readObject(); fis.close(); - } catch (FileNotFoundException fnfe) { + } catch (final FileNotFoundException fnfe) { // That's OK, we'l return null - } catch (ClassNotFoundException cnfe) { + } catch (final ClassNotFoundException cnfe) { // Error writing to cache is fatal throw new RuntimeException("Attempting to read from cache", cnfe); - } catch (IOException fnfe) { + } catch (final IOException fnfe) { // Error writing to cache is fatal throw new RuntimeException("Attempting to read from cache", fnfe); } return info; } - - public void setFeedInfo(URL url, SyndFeedInfo feedInfo) { - String fileName = cachePath + File.separator + "feed_" - + replaceNonAlphanumeric(url.toString(),'_').trim(); + + @Override + public void setFeedInfo(final URL url, final SyndFeedInfo feedInfo) { + final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim(); FileOutputStream fos; try { fos = new FileOutputStream(fileName); - ObjectOutputStream oos = new ObjectOutputStream(fos); + final ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(feedInfo); fos.flush(); fos.close(); - } catch (Exception e) { + } catch (final Exception e) { // Error writing to cache is fatal throw new RuntimeException("Attempting to write to cache", e); } } - - public static String replaceNonAlphanumeric(String str, char subst) { - StringBuffer ret = new StringBuffer(str.length()); - char[] testChars = str.toCharArray(); - for (int i = 0; i < testChars.length; i++) { - if (Character.isLetterOrDigit(testChars[i])) { - ret.append(testChars[i]); + + public static String replaceNonAlphanumeric(final String str, final char subst) { + final StringBuffer ret = new StringBuffer(str.length()); + final char[] testChars = str.toCharArray(); + for (final char testChar : testChars) { + if (Character.isLetterOrDigit(testChar)) { + ret.append(testChar); } else { - ret.append( subst ); + ret.append(subst); } } return ret.toString(); } - + /** - * Clear the cache. + * Clear the cache. */ + @Override public synchronized void clear() { - final File file = new File(this.cachePath); - //only do the delete if the directory exists - if( file.exists() && file.canWrite() ) { - //make the directory empty - final String[] files = file.list(); - final int len = files.length; - for( int i=0; iAn interface to allow caching of feed details. Implementing this allows the - * {@link org.rometools.fetcher.io.HttpURLFeedFetcher} class to - * enable conditional gets

+ *

+ * An interface to allow caching of feed details. Implementing this allows the {@link org.rometools.fetcher.io.HttpURLFeedFetcher} class to enable conditional + * gets + *

* * @author Nick Lothian - * + * */ public interface FeedFetcherCache { - /** - * Get a SyndFeedInfo object from the cache. - * - * @param feedUrl The url of the feed - * @return A SyndFeedInfo or null if it is not in the cache - */ - public SyndFeedInfo getFeedInfo(URL feedUrl); - - /** - * Add a SyndFeedInfo object to the cache - * - * @param feedUrl The url of the feed - * @param syndFeedInfo A SyndFeedInfo for the feed - */ - public void setFeedInfo(URL feedUrl, SyndFeedInfo syndFeedInfo); - - /** - * Removes all items from the cache. - */ - public void clear(); - - /** - * Removes the SyndFeedInfo identified by the url from the cache. - * @return The removed SyndFeedInfo - */ - public SyndFeedInfo remove( URL feedUrl ); + /** + * Get a SyndFeedInfo object from the cache. + * + * @param feedUrl The url of the feed + * @return A SyndFeedInfo or null if it is not in the cache + */ + public SyndFeedInfo getFeedInfo(URL feedUrl); + + /** + * Add a SyndFeedInfo object to the cache + * + * @param feedUrl The url of the feed + * @param syndFeedInfo A SyndFeedInfo for the feed + */ + public void setFeedInfo(URL feedUrl, SyndFeedInfo syndFeedInfo); + + /** + * Removes all items from the cache. + */ + public void clear(); + + /** + * Removes the SyndFeedInfo identified by the url from the cache. + * + * @return The removed SyndFeedInfo + */ + public SyndFeedInfo remove(URL feedUrl); } diff --git a/src/main/java/org/rometools/fetcher/impl/HashMapFeedInfoCache.java b/src/main/java/org/rometools/fetcher/impl/HashMapFeedInfoCache.java index 5f60825..b7279f5 100644 --- a/src/main/java/org/rometools/fetcher/impl/HashMapFeedInfoCache.java +++ b/src/main/java/org/rometools/fetcher/impl/HashMapFeedInfoCache.java @@ -22,104 +22,113 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; - /** - *

A very simple implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.

+ *

+ * A very simple implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface. + *

* - *

This implementation uses a HashMap to cache retrieved feeds. This implementation is - * most suitible for sort term (client aggregator?) use, as the memory usage will increase - * over time as the number of feeds in the cache increases.

+ *

+ * This implementation uses a HashMap to cache retrieved feeds. This implementation is most suitible for sort term (client aggregator?) use, as the memory usage + * will increase over time as the number of feeds in the cache increases. + *

* * @author Nick Lothian - * + * */ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable { - private static final long serialVersionUID = -1594665619950916222L; + private static final long serialVersionUID = -1594665619950916222L; - static HashMapFeedInfoCache _instance; - - private Map infoCache; - - /** - *

Constructor for HashMapFeedInfoCache

- * - *

Only use this if you want multiple instances of the cache. - * Usually getInstance() is more appropriate.

- * - */ - public HashMapFeedInfoCache() { - setInfoCache(createInfoCache()); - } + static HashMapFeedInfoCache _instance; - /** - * Get the global instance of the cache - * @return an implementation of FeedFetcherCache - */ - public static synchronized FeedFetcherCache getInstance() { - if (_instance == null) { - _instance = new HashMapFeedInfoCache(); - } - return _instance; - } + private Map infoCache; - protected Map createInfoCache() { - return (Collections.synchronizedMap(new HashMap())); - } + /** + *

+ * Constructor for HashMapFeedInfoCache + *

+ * + *

+ * Only use this if you want multiple instances of the cache. Usually getInstance() is more appropriate. + *

+ * + */ + public HashMapFeedInfoCache() { + setInfoCache(createInfoCache()); + } - - protected Object get(Object key) { - return getInfoCache().get(key); - } + /** + * Get the global instance of the cache + * + * @return an implementation of FeedFetcherCache + */ + public static synchronized FeedFetcherCache getInstance() { + if (_instance == null) { + _instance = new HashMapFeedInfoCache(); + } + return _instance; + } - /** - * @see extensions.io.FeedFetcherCache#getFeedInfo(java.net.URL) - */ - public SyndFeedInfo getFeedInfo(URL feedUrl) { - return (SyndFeedInfo) get(feedUrl.toString()); - } + protected Map createInfoCache() { + return Collections.synchronizedMap(new HashMap()); + } - protected void put(Object key, Object value) { - getInfoCache().put(key, value); - } + protected Object get(final Object key) { + return getInfoCache().get(key); + } - /** - * @see extensions.io.FeedFetcherCache#setFeedInfo(java.net.URL, extensions.io.SyndFeedInfo) - */ - public void setFeedInfo(URL feedUrl, SyndFeedInfo syndFeedInfo) { - put(feedUrl.toString(), syndFeedInfo); - } + /** + * @see extensions.io.FeedFetcherCache#getFeedInfo(java.net.URL) + */ + @Override + public SyndFeedInfo getFeedInfo(final URL feedUrl) { + return (SyndFeedInfo) get(feedUrl.toString()); + } - protected synchronized final Map getInfoCache() { - return infoCache; - } + protected void put(final Object key, final Object value) { + getInfoCache().put(key, value); + } - /** - * 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. - */ - protected synchronized final void setInfoCache(Map map) { - infoCache = map; - } - - /** - * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#clear() - */ - public void clear() { - synchronized( infoCache ) { - infoCache.clear(); - } - } - - /** - * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#remove(java.net.URL) - */ - public SyndFeedInfo remove( final URL url ) { - if( url == null ) return null; - - return (SyndFeedInfo) infoCache.remove( url.toString() ); - } + /** + * @see extensions.io.FeedFetcherCache#setFeedInfo(java.net.URL, extensions.io.SyndFeedInfo) + */ + @Override + public void setFeedInfo(final URL feedUrl, final SyndFeedInfo syndFeedInfo) { + put(feedUrl.toString(), syndFeedInfo); + } + + protected synchronized final Map getInfoCache() { + return infoCache; + } + + /** + * 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. + */ + protected synchronized final void setInfoCache(final Map map) { + infoCache = map; + } + + /** + * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#clear() + */ + @Override + public void clear() { + synchronized (infoCache) { + infoCache.clear(); + } + } + + /** + * @see com.sun.syndication.fetcher.impl.FeedFetcherCache#remove(java.net.URL) + */ + @Override + public SyndFeedInfo remove(final URL url) { + if (url == null) { + return null; + } + + return (SyndFeedInfo) infoCache.remove(url.toString()); + } } diff --git a/src/main/java/org/rometools/fetcher/impl/HttpClientFeedFetcher.java b/src/main/java/org/rometools/fetcher/impl/HttpClientFeedFetcher.java index 4d3b8bd..4917f93 100644 --- a/src/main/java/org/rometools/fetcher/impl/HttpClientFeedFetcher.java +++ b/src/main/java/org/rometools/fetcher/impl/HttpClientFeedFetcher.java @@ -16,10 +16,12 @@ */ package org.rometools.fetcher.impl; -import com.sun.syndication.feed.synd.SyndFeed; -import com.sun.syndication.io.FeedException; -import com.sun.syndication.io.SyndFeedInput; -import com.sun.syndication.io.XmlReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.zip.GZIPInputStream; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.Header; @@ -28,19 +30,13 @@ import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpClientParams; - import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherException; -import java.io.IOException; -import java.io.InputStream; - -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -import java.util.zip.GZIPInputStream; - +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.io.FeedException; +import com.sun.syndication.io.SyndFeedInput; +import com.sun.syndication.io.XmlReader; /** * @author Nick Lothian @@ -59,53 +55,52 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { /** * @param cache */ - public HttpClientFeedFetcher(FeedFetcherCache cache) { + public HttpClientFeedFetcher(final FeedFetcherCache cache) { this(); setFeedInfoCache(cache); } - public HttpClientFeedFetcher(FeedFetcherCache cache, CredentialSupplier credentialSupplier) { + public HttpClientFeedFetcher(final FeedFetcherCache cache, final CredentialSupplier credentialSupplier) { this(cache); setCredentialSupplier(credentialSupplier); } /** - * @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method name. - * Uses the HttpClientParams method setConnectionManagerTimeout instead of setConnectTimeout - * - */ - public synchronized void setConnectTimeout(int timeout) { + * @param timeout Sets the connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method + * setConnectionManagerTimeout instead of setConnectTimeout + * + */ + public synchronized void setConnectTimeout(final int timeout) { httpClientParams.setConnectionManagerTimeout(timeout); } /** - * @return The currently used connect timeout for the HttpClient but using the URLConnection method name. - * Uses the HttpClientParams method getConnectionManagerTimeout instead of getConnectTimeout - * + * @return The currently used connect timeout for the HttpClient but using the URLConnection method name. Uses the HttpClientParams method + * getConnectionManagerTimeout instead of getConnectTimeout + * */ public int getConnectTimeout() { - return (int) this.getHttpClientParams() - .getConnectionManagerTimeout(); + return (int) getHttpClientParams().getConnectionManagerTimeout(); } /** * @param credentialSupplier The credentialSupplier to set. */ - public synchronized void setCredentialSupplier(CredentialSupplier credentialSupplier) { + public synchronized void setCredentialSupplier(final CredentialSupplier credentialSupplier) { this.credentialSupplier = credentialSupplier; } /** - * @return Returns the credentialSupplier. - */ + * @return Returns the credentialSupplier. + */ public synchronized CredentialSupplier getCredentialSupplier() { return credentialSupplier; } /** - * @param feedInfoCache the feedInfoCache to set - */ - public synchronized void setFeedInfoCache(FeedFetcherCache feedInfoCache) { + * @param feedInfoCache the feedInfoCache to set + */ + public synchronized void setFeedInfoCache(final FeedFetcherCache feedInfoCache) { this.feedInfoCache = feedInfoCache; } @@ -116,7 +111,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { return feedInfoCache; } - public synchronized void setHttpClientMethodCallback(HttpClientMethodCallbackIntf httpClientMethodCallback) { + public synchronized void setHttpClientMethodCallback(final HttpClientMethodCallbackIntf httpClientMethodCallback) { this.httpClientMethodCallback = httpClientMethodCallback; } @@ -127,21 +122,21 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { /** * @param httpClientParams The httpClientParams to set. */ - public synchronized void setHttpClientParams(HttpClientParams httpClientParams) { + public synchronized void setHttpClientParams(final HttpClientParams httpClientParams) { this.httpClientParams = httpClientParams; } /** - * @return Returns the httpClientParams. - */ + * @return Returns the httpClientParams. + */ public synchronized HttpClientParams getHttpClientParams() { - return this.httpClientParams; + return httpClientParams; } /** * @return The currently used read timeout for the URLConnection, 0 is unlimited, i.e. no timeout */ - public synchronized void setReadTimeout(int timeout) { + public synchronized void setReadTimeout(final int timeout) { httpClientParams.setSoTimeout(timeout); } @@ -149,46 +144,43 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { * @return timeout the read timeout for the URLConnection to a specified timeout, in milliseconds. */ public int getReadTimeout() { - return (int) this.getHttpClientParams() - .getSoTimeout(); + return getHttpClientParams().getSoTimeout(); } - public SyndFeed retrieveFeed(URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException { - return this.retrieveFeed(this.getUserAgent(), url); + @Override + public SyndFeed retrieveFeed(final URL url) throws IllegalArgumentException, IOException, FeedException, FetcherException { + return this.retrieveFeed(getUserAgent(), url); } /** * @see org.rometools.fetcher.FeedFetcher#retrieveFeed(java.net.URL) */ - public SyndFeed retrieveFeed(String userAgent, URL feedUrl) - throws IllegalArgumentException, IOException, FeedException, FetcherException { + @Override + public SyndFeed retrieveFeed(final String userAgent, final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { if (feedUrl == null) { throw new IllegalArgumentException("null is not a valid URL"); } // TODO Fix this - //System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); - HttpClient client = new HttpClient(httpClientParams); + // System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); + final HttpClient client = new HttpClient(httpClientParams); if (getCredentialSupplier() != null) { - client.getState() - .setAuthenticationPreemptive(true); + client.getState().setAuthenticationPreemptive(true); // TODO what should realm be here? - Credentials credentials = getCredentialSupplier() - .getCredentials(null, feedUrl.getHost()); + final Credentials credentials = getCredentialSupplier().getCredentials(null, feedUrl.getHost()); if (credentials != null) { - client.getState() - .setCredentials(null, feedUrl.getHost(), credentials); + client.getState().setCredentials(null, feedUrl.getHost(), credentials); } } System.setProperty("httpclient.useragent", userAgent); - String urlStr = feedUrl.toString(); + final String urlStr = feedUrl.toString(); - HttpMethod method = new GetMethod(urlStr); + final HttpMethod method = new GetMethod(urlStr); method.addRequestHeader("Accept-Encoding", "gzip"); method.addRequestHeader("User-Agent", userAgent); method.setFollowRedirects(true); @@ -199,7 +191,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { } } - FeedFetcherCache cache = getFeedInfoCache(); + final FeedFetcherCache cache = getFeedInfoCache(); if (cache != null) { // retrieve feed @@ -220,7 +212,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { } } - int statusCode = client.executeMethod(method); + final int statusCode = client.executeMethod(method); fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr); handleErrorCodes(statusCode); @@ -240,9 +232,9 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { method.recycle(); } } else { - // cache is not in use + // cache is not in use try { - int statusCode = client.executeMethod(method); + final int statusCode = client.executeMethod(method); fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, urlStr); handleErrorCodes(statusCode); @@ -254,30 +246,30 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { } } - private SyndFeed getFeed(SyndFeedInfo syndFeedInfo, String urlStr, HttpMethod method, int statusCode) - throws IOException, HttpException, FetcherException, FeedException { - if ((statusCode == HttpURLConnection.HTTP_NOT_MODIFIED) && (syndFeedInfo != null)) { + private SyndFeed getFeed(final SyndFeedInfo syndFeedInfo, final String urlStr, final HttpMethod method, final int statusCode) throws IOException, + HttpException, FetcherException, FeedException { + if (statusCode == HttpURLConnection.HTTP_NOT_MODIFIED && syndFeedInfo != null) { fireEvent(FetcherEvent.EVENT_TYPE_FEED_UNCHANGED, urlStr); return syndFeedInfo.getSyndFeed(); } - SyndFeed feed = retrieveFeed(urlStr, method); + final SyndFeed feed = retrieveFeed(urlStr, method); fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, urlStr, feed); return feed; } /** - * @param feedUrl - * @param urlStr - * @param method - * @param feed - * @return - * @throws MalformedURLException - */ - private SyndFeedInfo buildSyndFeedInfo(URL feedUrl, String urlStr, HttpMethod method, SyndFeed feed, int statusCode) - throws MalformedURLException { + * @param feedUrl + * @param urlStr + * @param method + * @param feed + * @return + * @throws MalformedURLException + */ + private SyndFeedInfo buildSyndFeedInfo(final URL feedUrl, final String urlStr, final HttpMethod method, SyndFeed feed, final int statusCode) + throws MalformedURLException { SyndFeedInfo syndFeedInfo; syndFeedInfo = new SyndFeedInfo(); @@ -285,19 +277,18 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { syndFeedInfo.setUrl(new URL(urlStr)); syndFeedInfo.setId(feedUrl.toString()); - Header imHeader = method.getResponseHeader("IM"); + final Header imHeader = method.getResponseHeader("IM"); - if ((imHeader != null) && (imHeader.getValue() - .indexOf("feed") >= 0) && isUsingDeltaEncoding()) { - FeedFetcherCache cache = getFeedInfoCache(); + if (imHeader != null && imHeader.getValue().indexOf("feed") >= 0 && isUsingDeltaEncoding()) { + 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 // This response only includes new items - SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl); + final SyndFeedInfo cachedInfo = cache.getFeedInfo(feedUrl); if (cachedInfo != null) { - SyndFeed cachedFeed = cachedInfo.getSyndFeed(); + final SyndFeed cachedFeed = cachedInfo.getSyndFeed(); // set the new feed to be the orginal feed plus the new items feed = combineFeeds(cachedFeed, feed); @@ -305,13 +296,13 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { } } - Header lastModifiedHeader = method.getResponseHeader("Last-Modified"); + final Header lastModifiedHeader = method.getResponseHeader("Last-Modified"); if (lastModifiedHeader != null) { syndFeedInfo.setLastModified(lastModifiedHeader.getValue()); } - Header eTagHeader = method.getResponseHeader("ETag"); + final Header eTagHeader = method.getResponseHeader("ETag"); if (eTagHeader != null) { syndFeedInfo.setETag(eTagHeader.getValue()); @@ -323,21 +314,19 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { } /** - * @param client - * @param urlStr - * @param method - * @return - * @throws IOException - * @throws HttpException - * @throws FetcherException - * @throws FeedException - */ - private SyndFeed retrieveFeed(String urlStr, HttpMethod method) - throws IOException, HttpException, FetcherException, FeedException { + * @param client + * @param urlStr + * @param method + * @return + * @throws IOException + * @throws HttpException + * @throws FetcherException + * @throws FeedException + */ + private SyndFeed retrieveFeed(final String urlStr, final HttpMethod method) throws IOException, HttpException, FetcherException, FeedException { InputStream stream = null; - if ((method.getResponseHeader("Content-Encoding") != null) && - ("gzip".equalsIgnoreCase(method.getResponseHeader("Content-Encoding").getValue()))) { + if (method.getResponseHeader("Content-Encoding") != null && "gzip".equalsIgnoreCase(method.getResponseHeader("Content-Encoding").getValue())) { stream = new GZIPInputStream(method.getResponseBodyAsStream()); } else { stream = method.getResponseBodyAsStream(); @@ -352,7 +341,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { reader = new XmlReader(stream, true); } - SyndFeedInput syndFeedInput = new SyndFeedInput(); + final SyndFeedInput syndFeedInput = new SyndFeedInput(); syndFeedInput.setPreserveWireFeed(isPreserveWireFeed()); return syndFeedInput.build(reader); @@ -369,12 +358,11 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher { 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 (rather than method.addRequestHeader(String, String)) - * - * @param method - */ + * Allows access to the underlying HttpClient HttpMethod object. Note that in most cases, method.setRequestHeader(String, String) is what you want to do + * (rather than method.addRequestHeader(String, String)) + * + * @param method + */ public void afterHttpClientMethodCreate(HttpMethod method); } } diff --git a/src/main/java/org/rometools/fetcher/impl/HttpURLFeedFetcher.java b/src/main/java/org/rometools/fetcher/impl/HttpURLFeedFetcher.java index 6a9026d..16e3e57 100644 --- a/src/main/java/org/rometools/fetcher/impl/HttpURLFeedFetcher.java +++ b/src/main/java/org/rometools/fetcher/impl/HttpURLFeedFetcher.java @@ -24,276 +24,292 @@ import java.net.URL; import java.net.URLConnection; import java.util.zip.GZIPInputStream; -import com.sun.syndication.feed.synd.SyndFeed; import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherException; + +import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedInput; import com.sun.syndication.io.XmlReader; /** - *

Class to retrieve syndication files via HTTP.

- * - *

If passed a {@link org.rometools.fetcher.impl.FeedFetcherCache} in the - * constructor it will use conditional gets to only retrieve modified content.

- * - *

The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where - * supported by the server.

- * - *

Simple usage: - *

- * 	// create the cache
- *	FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getFeedInfoCache();
- *	// retrieve the feed the first time
- *	// any subsequent request will use conditional gets and only
- *	// retrieve the resource if it has changed
- *	SyndFeed feed = new HttpURLFeedFetcher(feedInfoCache).retrieveFeed(feedUrl);
- *
- * + *

+ * Class to retrieve syndication files via HTTP. *

- * - * @see http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers - * @see http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level + * + *

+ * If passed a {@link org.rometools.fetcher.impl.FeedFetcherCache} in the constructor it will use conditional gets to only retrieve modified content. + *

+ * + *

+ * The class uses the Accept-Encoding: gzip header to retrieve gzipped feeds where supported by the server. + *

+ * + *

+ * Simple usage: + * + *

+ * // create the cache
+ * FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getFeedInfoCache();
+ * // retrieve the feed the first time
+ * // any subsequent request will use conditional gets and only
+ * // retrieve the resource if it has changed
+ * SyndFeed feed = new HttpURLFeedFetcher(feedInfoCache).retrieveFeed(feedUrl);
+ * 
+ * + *

+ * + * @see http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers + * @see http://diveintomark.org/archives/2003/07/21/atom_aggregator_behavior_http_level * @see http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html * @author Nick Lothian */ public class HttpURLFeedFetcher extends AbstractFeedFetcher { - static final int POLL_EVENT = 1; - static final int RETRIEVE_EVENT = 2; - static final int UNCHANGED_EVENT = 3; + static final int POLL_EVENT = 1; + static final int RETRIEVE_EVENT = 2; + static final int UNCHANGED_EVENT = 3; - private FeedFetcherCache feedInfoCache; + private FeedFetcherCache feedInfoCache; + /** + * Constructor to use HttpURLFeedFetcher without caching of feeds + * + */ + public HttpURLFeedFetcher() { + super(); + } - /** - * Constructor to use HttpURLFeedFetcher without caching of feeds - * - */ - public HttpURLFeedFetcher() { - super(); - } + /** + * Constructor to enable HttpURLFeedFetcher to cache feeds + * + * @param feedCache - an instance of the FeedFetcherCache interface + */ + public HttpURLFeedFetcher(final FeedFetcherCache feedInfoCache) { + this(); + setFeedInfoCache(feedInfoCache); + } - /** - * Constructor to enable HttpURLFeedFetcher to cache feeds - * - * @param feedCache - an instance of the FeedFetcherCache interface - */ - public HttpURLFeedFetcher(FeedFetcherCache feedInfoCache) { - this(); - setFeedInfoCache(feedInfoCache); - } + @Override + public SyndFeed retrieveFeed(final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { + return this.retrieveFeed(getUserAgent(), feedUrl); + } - public SyndFeed retrieveFeed(URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { - return this.retrieveFeed(this.getUserAgent(), feedUrl); + /** + * Retrieve a feed over HTTP + * + * @param feedUrl A non-null URL of a RSS/Atom feed to retrieve + * @return A {@link com.sun.syndication.feed.synd.SyndFeed} object + * @throws IllegalArgumentException if the URL is null; + * @throws IOException if a TCP error occurs + * @throws FeedException if the feed is not valid + * @throws FetcherException if a HTTP error occurred + */ + @Override + public SyndFeed retrieveFeed(final String userAgent, final URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { + if (feedUrl == null) { + throw new IllegalArgumentException("null is not a valid URL"); } - /** - * Retrieve a feed over HTTP - * - * @param feedUrl A non-null URL of a RSS/Atom feed to retrieve - * @return A {@link com.sun.syndication.feed.synd.SyndFeed} object - * @throws IllegalArgumentException if the URL is null; - * @throws IOException if a TCP error occurs - * @throws FeedException if the feed is not valid - * @throws FetcherException if a HTTP error occurred - */ - public SyndFeed retrieveFeed(String userAgent, URL feedUrl) throws IllegalArgumentException, IOException, FeedException, FetcherException { - if (feedUrl == null) { - throw new IllegalArgumentException("null is not a valid URL"); - } - - URLConnection connection = feedUrl.openConnection(); - if (!(connection instanceof HttpURLConnection)) { - throw new IllegalArgumentException(feedUrl.toExternalForm() + " is not a valid HTTP Url"); - } - HttpURLConnection httpConnection = (HttpURLConnection)connection; - // httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be changed on a claswide basis - - FeedFetcherCache cache = getFeedInfoCache(); - if (cache != null) { - SyndFeedInfo syndFeedInfo = cache.getFeedInfo(feedUrl); - setRequestHeaders(connection, syndFeedInfo); - httpConnection.connect(); - try { - fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, connection); - - if (syndFeedInfo == null) { - // this is a feed that hasn't been retrieved - syndFeedInfo = new SyndFeedInfo(); - retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection); - } else { - // check the response code - int responseCode = httpConnection.getResponseCode(); - if (responseCode != HttpURLConnection.HTTP_NOT_MODIFIED) { - // the response code is not 304 NOT MODIFIED - // This is either because the feed server - // does not support condition gets - // or because the feed hasn't changed - retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection); - } else { - // the feed does not need retrieving - fireEvent(FetcherEvent.EVENT_TYPE_FEED_UNCHANGED, connection); - } - } - - return syndFeedInfo.getSyndFeed(); - } finally { - httpConnection.disconnect(); - } - } else { - fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, connection); - InputStream inputStream = null; - setRequestHeaders(connection, null); + final URLConnection connection = feedUrl.openConnection(); + if (!(connection instanceof HttpURLConnection)) { + throw new IllegalArgumentException(feedUrl.toExternalForm() + " is not a valid HTTP Url"); + } + final HttpURLConnection httpConnection = (HttpURLConnection) connection; + // httpConnection.setInstanceFollowRedirects(true); // this is true by default, but can be changed on a claswide basis - connection.addRequestProperty("User-Agent", userAgent); + final FeedFetcherCache cache = getFeedInfoCache(); + if (cache != null) { + SyndFeedInfo syndFeedInfo = cache.getFeedInfo(feedUrl); + setRequestHeaders(connection, syndFeedInfo); + httpConnection.connect(); + try { + fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, connection); - httpConnection.connect(); - try { - inputStream = httpConnection.getInputStream(); - return getSyndFeedFromStream(inputStream, connection); - } catch (java.io.IOException e) { - handleErrorCodes(((HttpURLConnection)connection).getResponseCode()); - } finally { - if (inputStream != null) { - inputStream.close(); - } - httpConnection.disconnect(); - } - // we will never actually get to this line - return null; - } - } + if (syndFeedInfo == null) { + // this is a feed that hasn't been retrieved + syndFeedInfo = new SyndFeedInfo(); + retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection); + } else { + // check the response code + final int responseCode = httpConnection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_NOT_MODIFIED) { + // the response code is not 304 NOT MODIFIED + // This is either because the feed server + // does not support condition gets + // or because the feed hasn't changed + retrieveAndCacheFeed(feedUrl, syndFeedInfo, httpConnection); + } else { + // the feed does not need retrieving + fireEvent(FetcherEvent.EVENT_TYPE_FEED_UNCHANGED, connection); + } + } - protected void retrieveAndCacheFeed(URL feedUrl, SyndFeedInfo syndFeedInfo, HttpURLConnection connection) throws IllegalArgumentException, FeedException, FetcherException, IOException { - handleErrorCodes(connection.getResponseCode()); + return syndFeedInfo.getSyndFeed(); + } finally { + httpConnection.disconnect(); + } + } else { + fireEvent(FetcherEvent.EVENT_TYPE_FEED_POLLED, connection); + InputStream inputStream = null; + setRequestHeaders(connection, null); - resetFeedInfo(feedUrl, syndFeedInfo, connection); - FeedFetcherCache cache = getFeedInfoCache(); - // resetting feed info in the cache - // could be needed for some implementations - // of FeedFetcherCache (eg, distributed HashTables) - if (cache != null) { - cache.setFeedInfo(feedUrl, syndFeedInfo); - } - } + connection.addRequestProperty("User-Agent", userAgent); - protected void resetFeedInfo(URL orignalUrl, SyndFeedInfo syndFeedInfo, HttpURLConnection connection) throws IllegalArgumentException, IOException, FeedException { - // need to always set the URL because this may have changed due to 3xx redirects - syndFeedInfo.setUrl(connection.getURL()); + httpConnection.connect(); + try { + inputStream = httpConnection.getInputStream(); + return getSyndFeedFromStream(inputStream, connection); + } catch (final java.io.IOException e) { + handleErrorCodes(((HttpURLConnection) connection).getResponseCode()); + } finally { + if (inputStream != null) { + inputStream.close(); + } + httpConnection.disconnect(); + } + // we will never actually get to this line + return null; + } + } - // the ID is a persistant value that should stay the same even if the URL for the - // feed changes (eg, by 3xx redirects) - syndFeedInfo.setId(orignalUrl.toString()); + protected void retrieveAndCacheFeed(final URL feedUrl, final SyndFeedInfo syndFeedInfo, final HttpURLConnection connection) + throws IllegalArgumentException, FeedException, FetcherException, IOException { + handleErrorCodes(connection.getResponseCode()); - // This will be 0 if the server doesn't support or isn't setting the last modified header - syndFeedInfo.setLastModified(new Long(connection.getLastModified())); + resetFeedInfo(feedUrl, syndFeedInfo, connection); + final FeedFetcherCache cache = getFeedInfoCache(); + // resetting feed info in the cache + // could be needed for some implementations + // of FeedFetcherCache (eg, distributed HashTables) + if (cache != null) { + cache.setFeedInfo(feedUrl, syndFeedInfo); + } + } - // This will be null if the server doesn't support or isn't setting the ETag header - syndFeedInfo.setETag(connection.getHeaderField("ETag")); + protected void resetFeedInfo(final URL orignalUrl, final SyndFeedInfo syndFeedInfo, final HttpURLConnection connection) throws IllegalArgumentException, + IOException, FeedException { + // need to always set the URL because this may have changed due to 3xx redirects + syndFeedInfo.setUrl(connection.getURL()); - // get the contents - InputStream inputStream = null; - try { - inputStream = connection.getInputStream(); - SyndFeed syndFeed = getSyndFeedFromStream(inputStream, connection); - - String imHeader = connection.getHeaderField("IM"); - if (isUsingDeltaEncoding() && (imHeader!= null && imHeader.indexOf("feed") >= 0)) { - FeedFetcherCache cache = getFeedInfoCache(); - 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 - // This response only includes new items - SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl); - if (cachedInfo != null) { - SyndFeed cachedFeed = cachedInfo.getSyndFeed(); - - // set the new feed to be the orginal feed plus the new items - syndFeed = combineFeeds(cachedFeed, syndFeed); - } - } - } - - syndFeedInfo.setSyndFeed(syndFeed); - } finally { - if (inputStream != null) { - inputStream.close(); - } - } - } + // the ID is a persistant value that should stay the same even if the URL for the + // feed changes (eg, by 3xx redirects) + syndFeedInfo.setId(orignalUrl.toString()); - /** - *

Set appropriate HTTP headers, including conditional get and gzip encoding headers

- * - * @param connection A URLConnection - * @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null - */ - protected void setRequestHeaders(URLConnection connection, SyndFeedInfo syndFeedInfo) { - if (syndFeedInfo != null) { - // set the headers to get feed only if modified - // we support the use of both last modified and eTag headers - if (syndFeedInfo.getLastModified() != null) { - Object lastModified = syndFeedInfo.getLastModified(); - if (lastModified instanceof Long) { - connection.setIfModifiedSince(((Long)syndFeedInfo.getLastModified()).longValue()); - } - } - if (syndFeedInfo.getETag() != null) { - connection.setRequestProperty("If-None-Match", syndFeedInfo.getETag()); - } + // This will be 0 if the server doesn't support or isn't setting the last modified header + syndFeedInfo.setLastModified(new Long(connection.getLastModified())); - } - // header to retrieve feed gzipped - connection.setRequestProperty("Accept-Encoding", "gzip"); + // This will be null if the server doesn't support or isn't setting the ETag header + syndFeedInfo.setETag(connection.getHeaderField("ETag")); - if (isUsingDeltaEncoding()) { - connection.addRequestProperty("A-IM", "feed"); - } - } + // get the contents + InputStream inputStream = null; + try { + inputStream = connection.getInputStream(); + SyndFeed syndFeed = getSyndFeedFromStream(inputStream, connection); - private SyndFeed readSyndFeedFromStream(InputStream inputStream, URLConnection connection) throws IOException, IllegalArgumentException, FeedException { - BufferedInputStream is; - if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) { - // handle gzip encoded content - is = new BufferedInputStream(new GZIPInputStream(inputStream)); - } else { - is = new BufferedInputStream(inputStream); - } + final String imHeader = connection.getHeaderField("IM"); + if (isUsingDeltaEncoding() && imHeader != null && imHeader.indexOf("feed") >= 0) { + final FeedFetcherCache cache = getFeedInfoCache(); + 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 + // This response only includes new items + final SyndFeedInfo cachedInfo = cache.getFeedInfo(orignalUrl); + if (cachedInfo != null) { + final SyndFeed cachedFeed = cachedInfo.getSyndFeed(); - //InputStreamReader reader = new InputStreamReader(is, ResponseHandler.getCharacterEncoding(connection)); + // set the new feed to be the orginal feed plus the new items + syndFeed = combineFeeds(cachedFeed, syndFeed); + } + } + } - //SyndFeedInput input = new SyndFeedInput(); + syndFeedInfo.setSyndFeed(syndFeed); + } finally { + if (inputStream != null) { + inputStream.close(); + } + } + } - XmlReader reader = null; - if (connection.getHeaderField("Content-Type") != null) { - reader = new XmlReader(is, connection.getHeaderField("Content-Type"), true); - } else { - reader = new XmlReader(is, true); - } - - SyndFeedInput syndFeedInput = new SyndFeedInput(); - syndFeedInput.setPreserveWireFeed(isPreserveWireFeed()); - - return syndFeedInput.build(reader); - - } + /** + *

+ * Set appropriate HTTP headers, including conditional get and gzip encoding headers + *

+ * + * @param connection A URLConnection + * @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null + */ + protected void setRequestHeaders(final URLConnection connection, final SyndFeedInfo syndFeedInfo) { + if (syndFeedInfo != null) { + // set the headers to get feed only if modified + // we support the use of both last modified and eTag headers + if (syndFeedInfo.getLastModified() != null) { + final Object lastModified = syndFeedInfo.getLastModified(); + if (lastModified instanceof Long) { + connection.setIfModifiedSince(((Long) syndFeedInfo.getLastModified()).longValue()); + } + } + if (syndFeedInfo.getETag() != null) { + connection.setRequestProperty("If-None-Match", syndFeedInfo.getETag()); + } - private SyndFeed getSyndFeedFromStream(InputStream inputStream, URLConnection connection) throws IOException, IllegalArgumentException, FeedException { - SyndFeed feed = readSyndFeedFromStream(inputStream, connection); - fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, connection, feed); - return feed; - } + } + // header to retrieve feed gzipped + connection.setRequestProperty("Accept-Encoding", "gzip"); - /** - * @return The FeedFetcherCache used by this fetcher (Could be null) - */ - public synchronized FeedFetcherCache getFeedInfoCache() { - return feedInfoCache; - } + if (isUsingDeltaEncoding()) { + connection.addRequestProperty("A-IM", "feed"); + } + } - /** - * @param cache The cache to be used by this fetcher (pass null to stop using a cache) - */ - public synchronized void setFeedInfoCache(FeedFetcherCache cache) { - feedInfoCache = cache; - } + private SyndFeed readSyndFeedFromStream(final InputStream inputStream, final URLConnection connection) throws IOException, IllegalArgumentException, + FeedException { + BufferedInputStream is; + if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) { + // handle gzip encoded content + is = new BufferedInputStream(new GZIPInputStream(inputStream)); + } else { + is = new BufferedInputStream(inputStream); + } + + // InputStreamReader reader = new InputStreamReader(is, ResponseHandler.getCharacterEncoding(connection)); + + // SyndFeedInput input = new SyndFeedInput(); + + XmlReader reader = null; + if (connection.getHeaderField("Content-Type") != null) { + reader = new XmlReader(is, connection.getHeaderField("Content-Type"), true); + } else { + reader = new XmlReader(is, true); + } + + final SyndFeedInput syndFeedInput = new SyndFeedInput(); + syndFeedInput.setPreserveWireFeed(isPreserveWireFeed()); + + return syndFeedInput.build(reader); + + } + + private SyndFeed getSyndFeedFromStream(final InputStream inputStream, final URLConnection connection) throws IOException, IllegalArgumentException, + FeedException { + final SyndFeed feed = readSyndFeedFromStream(inputStream, connection); + fireEvent(FetcherEvent.EVENT_TYPE_FEED_RETRIEVED, connection, feed); + return feed; + } + + /** + * @return The FeedFetcherCache used by this fetcher (Could be null) + */ + public synchronized FeedFetcherCache getFeedInfoCache() { + return feedInfoCache; + } + + /** + * @param cache The cache to be used by this fetcher (pass null to stop using a cache) + */ + public synchronized void setFeedInfoCache(final FeedFetcherCache cache) { + feedInfoCache = cache; + } } diff --git a/src/main/java/org/rometools/fetcher/impl/LinkedHashMapFeedInfoCache.java b/src/main/java/org/rometools/fetcher/impl/LinkedHashMapFeedInfoCache.java index 82abf6b..0ddbe22 100644 --- a/src/main/java/org/rometools/fetcher/impl/LinkedHashMapFeedInfoCache.java +++ b/src/main/java/org/rometools/fetcher/impl/LinkedHashMapFeedInfoCache.java @@ -5,66 +5,75 @@ import java.util.LinkedHashMap; import java.util.Map; /** - *

An implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface.

+ *

+ * An implementation of the {@link org.rometools.fetcher.impl.FeedFetcherCache} interface. + *

* - *

Unlike the HashMapFeedInfoCache this implementation will not grow unbound

+ *

+ * Unlike the HashMapFeedInfoCache this implementation will not grow unbound + *

* * @author Javier Kohen * @author Nick Lothian - * + * */ public class LinkedHashMapFeedInfoCache extends HashMapFeedInfoCache { - private final class CacheImpl extends LinkedHashMap { - private static final long serialVersionUID = -6977191330127794920L; + private final class CacheImpl extends LinkedHashMap { + private static final long serialVersionUID = -6977191330127794920L; - public CacheImpl() { - super(16, 0.75F, true); - } - - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > getMaxEntries(); - } - } - - private static final int DEFAULT_MAX_ENTRIES = 20; + public CacheImpl() { + super(16, 0.75F, true); + } - private static final long serialVersionUID = 1694228973357997417L; + @Override + protected boolean removeEldestEntry(final Map.Entry eldest) { + return size() > getMaxEntries(); + } + } - private int maxEntries = DEFAULT_MAX_ENTRIES; + private static final int DEFAULT_MAX_ENTRIES = 20; - private final static LinkedHashMapFeedInfoCache _instance = new LinkedHashMapFeedInfoCache(); - - - /** - * Get the global instance of the cache - * @return an implementation of FeedFetcherCache - */ - public static final FeedFetcherCache getInstance() { - return _instance; - } + private static final long serialVersionUID = 1694228973357997417L; - /** - *

Constructor for HashMapFeedInfoCache

- * - *

Only use this if you want multiple instances of the cache. - * Usually {@link #getInstance()} is more appropriate.

- * - * @see #getInstance() - */ - public LinkedHashMapFeedInfoCache() { - super(); - } + private int maxEntries = DEFAULT_MAX_ENTRIES; - protected Map createInfoCache() { - return Collections.synchronizedMap(new CacheImpl()); - } + private final static LinkedHashMapFeedInfoCache _instance = new LinkedHashMapFeedInfoCache(); - public synchronized final int getMaxEntries() { - return maxEntries; - } + /** + * Get the global instance of the cache + * + * @return an implementation of FeedFetcherCache + */ + public static final FeedFetcherCache getInstance() { + return _instance; + } + + /** + *

+ * Constructor for HashMapFeedInfoCache + *

+ * + *

+ * Only use this if you want multiple instances of the cache. Usually {@link #getInstance()} is more appropriate. + *

+ * + * @see #getInstance() + */ + public LinkedHashMapFeedInfoCache() { + super(); + } + + @Override + protected Map createInfoCache() { + return Collections.synchronizedMap(new CacheImpl()); + } + + public synchronized final int getMaxEntries() { + return maxEntries; + } + + public synchronized final void setMaxEntries(final int maxEntries) { + this.maxEntries = maxEntries; + } - public synchronized final void setMaxEntries(int maxEntries) { - this.maxEntries = maxEntries; - } - } diff --git a/src/main/java/org/rometools/fetcher/impl/ResponseHandler.java b/src/main/java/org/rometools/fetcher/impl/ResponseHandler.java index 952edf3..432e3bd 100644 --- a/src/main/java/org/rometools/fetcher/impl/ResponseHandler.java +++ b/src/main/java/org/rometools/fetcher/impl/ResponseHandler.java @@ -22,36 +22,37 @@ import java.util.regex.Pattern; /** * Utility class to help deal with HTTP responses - * + * */ public class ResponseHandler { - public static final String defaultCharacterEncoding = "ISO-8859-1"; - - private final static Pattern characterEncodingPattern = Pattern.compile("charset=([.[^; ]]*)"); - - public static String getCharacterEncoding(URLConnection connection) { - return getCharacterEncoding(connection.getContentType()); - } - - /** - * - *

Gets the character encoding of a response. (Note that this is different to - * the content-encoding)

- * - * @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 - */ - public static String getCharacterEncoding(String contentTypeHeader) { - if (contentTypeHeader == null) { - return defaultCharacterEncoding; - } - - Matcher m = characterEncodingPattern.matcher(contentTypeHeader); - //if (!m.matches()) { - if (!m.find()) { - return defaultCharacterEncoding; - } else { - return m.group(1); - } - } + public static final String defaultCharacterEncoding = "ISO-8859-1"; + + private final static Pattern characterEncodingPattern = Pattern.compile("charset=([.[^; ]]*)"); + + public static String getCharacterEncoding(final URLConnection connection) { + return getCharacterEncoding(connection.getContentType()); + } + + /** + * + *

+ * Gets the character encoding of a response. (Note that this is different to the content-encoding) + *

+ * + * @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 + */ + public static String getCharacterEncoding(final String contentTypeHeader) { + if (contentTypeHeader == null) { + return defaultCharacterEncoding; + } + + final Matcher m = characterEncodingPattern.matcher(contentTypeHeader); + // if (!m.matches()) { + if (!m.find()) { + return defaultCharacterEncoding; + } else { + return m.group(1); + } + } } diff --git a/src/main/java/org/rometools/fetcher/impl/SyndFeedInfo.java b/src/main/java/org/rometools/fetcher/impl/SyndFeedInfo.java index 587f309..1f9eb73 100644 --- a/src/main/java/org/rometools/fetcher/impl/SyndFeedInfo.java +++ b/src/main/java/org/rometools/fetcher/impl/SyndFeedInfo.java @@ -23,35 +23,39 @@ import com.sun.syndication.feed.impl.ObjectBean; import com.sun.syndication.feed.synd.SyndFeed; /** - *

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. + *

+ * + *

+ * This class is thread safe, as expected by the different feed fetcher implementations. + *

* - *

This class is thread safe, as expected by the different feed fetcher - * implementations.

- * * @author Nick Lothian */ public class SyndFeedInfo implements Cloneable, Serializable { - private static final long serialVersionUID = -1874786860901426015L; - - private final ObjectBean _objBean; - private String id; - private URL url; - private Object lastModified; - private String eTag; - private SyndFeed syndFeed; + private static final long serialVersionUID = -1874786860901426015L; + + private final ObjectBean _objBean; + private String id; + private URL url; + private Object lastModified; + private String eTag; + private SyndFeed syndFeed; public SyndFeedInfo() { - _objBean = new ObjectBean(this.getClass(),this); + _objBean = new ObjectBean(this.getClass(), this); } /** * Creates a deep 'bean' clone of the object. *

+ * * @return a clone of the object. * @throws CloneNotSupportedException thrown if an element of the object cannot be cloned. - * + * */ + @Override public Object clone() throws CloneNotSupportedException { return _objBean.clone(); } @@ -59,11 +63,13 @@ public class SyndFeedInfo implements Cloneable, Serializable { /** * Indicates whether some other object is "equal to" this one as defined by the Object equals() method. *

+ * * @param other he reference object with which to compare. * @return true if 'this' object is equal to the 'other' object. - * + * */ - public boolean equals(Object other) { + @Override + public boolean equals(final Object other) { return _objBean.equals(other); } @@ -72,9 +78,11 @@ public class SyndFeedInfo implements Cloneable, Serializable { *

* It follows the contract defined by the Object hashCode() method. *

+ * * @return the hashcode of the bean object. - * + * */ + @Override public int hashCode() { return _objBean.hashCode(); } @@ -82,68 +90,68 @@ public class SyndFeedInfo implements Cloneable, Serializable { /** * Returns the String representation for the object. *

+ * * @return String representation for the object. - * + * */ + @Override public String toString() { return _objBean.toString(); } + /** + * @return the ETag the feed was last retrieved with + */ + public synchronized String getETag() { + return eTag; + } - /** - * @return the ETag the feed was last retrieved with - */ - public synchronized String getETag() { - return eTag; - } + /** + * @return the last modified date for the feed + */ + public synchronized Object getLastModified() { + return lastModified; + } - /** - * @return the last modified date for the feed - */ - public synchronized Object getLastModified() { - return lastModified; - } + /** + * @return the URL the feed was served from + */ + public synchronized URL getUrl() { + return url; + } - /** - * @return the URL the feed was served from - */ - public synchronized URL getUrl() { - return url; - } + public synchronized void setETag(final String string) { + eTag = string; + } - public synchronized void setETag(String string) { - eTag = string; - } + public synchronized void setLastModified(final Object o) { + lastModified = o; + } - public synchronized void setLastModified(Object o) { - lastModified = o; - } + public synchronized void setUrl(final URL url) { + this.url = url; + } - public synchronized void setUrl(URL url) { - this.url = url; - } + public synchronized SyndFeed getSyndFeed() { + return syndFeed; + } - public synchronized SyndFeed getSyndFeed() { - return syndFeed; - } + public synchronized void setSyndFeed(final SyndFeed feed) { + syndFeed = feed; + } - public synchronized void setSyndFeed(SyndFeed feed) { - syndFeed = feed; - } + /** + * @return A unique ID to identify the feed + */ + public synchronized String getId() { + return id; + } - /** - * @return A unique ID to identify the feed - */ - public synchronized String getId() { - return id; - } - - /** - * @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(String string) { - id = string; - } + /** + * @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) { + id = string; + } } diff --git a/src/main/java/org/rometools/fetcher/samples/FeedAggregator.java b/src/main/java/org/rometools/fetcher/samples/FeedAggregator.java index 090a0c0..3a82797 100644 --- a/src/main/java/org/rometools/fetcher/samples/FeedAggregator.java +++ b/src/main/java/org/rometools/fetcher/samples/FeedAggregator.java @@ -21,33 +21,37 @@ 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 org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.impl.FeedFetcherCache; import org.rometools.fetcher.impl.HashMapFeedInfoCache; import org.rometools.fetcher.impl.HttpURLFeedFetcher; + +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.feed.synd.SyndFeedImpl; import com.sun.syndication.io.SyndFeedOutput; /** - *

It aggregates a list of RSS/Atom feeds (they can be of different types) - * into a single feed of the specified type.

- * - *

Converted from the original FeedAggregator sample

- * + *

+ * It aggregates a list of RSS/Atom feeds (they can be of different types) into a single feed of the specified type. + *

+ * + *

+ * Converted from the original FeedAggregator sample + *

+ * * @author Alejandro Abdelnur * @author Nick Lothian - * + * */ public class FeedAggregator { - public static void main(String[] args) { + public static void main(final String[] args) { boolean ok = false; - if (args.length>=2) { + if (args.length >= 2) { try { - String outputType = args[0]; + final String outputType = args[0]; - SyndFeed feed = new SyndFeedImpl(); + final SyndFeed feed = new SyndFeedImpl(); feed.setFeedType(outputType); feed.setTitle("Aggregated Feed"); @@ -55,25 +59,24 @@ public class FeedAggregator { feed.setAuthor("anonymous"); feed.setLink("http://www.anonymous.com"); - List entries = new ArrayList(); + final List entries = new ArrayList(); feed.setEntries(entries); - FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); - FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache); + final FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); + final FeedFetcher feedFetcher = new HttpURLFeedFetcher(feedInfoCache); - for (int i=1;i + * * @author Alejandro Abdelnur * @author Nick Lothian - * + * */ public class FeedReader { - public static void main(String[] args) { - boolean ok = false; - if (args.length==1) { - try { - URL feedUrl = new URL(args[0]); - FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); - FeedFetcher fetcher = new HttpURLFeedFetcher(feedInfoCache); + public static void main(final String[] args) { + boolean ok = false; + if (args.length == 1) { + try { + final URL feedUrl = new URL(args[0]); + final FeedFetcherCache feedInfoCache = HashMapFeedInfoCache.getInstance(); + final FeedFetcher fetcher = new HttpURLFeedFetcher(feedInfoCache); - FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); + final FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); - fetcher.addFetcherEventListener(listener); + fetcher.addFetcherEventListener(listener); - System.err.println("Retrieving feed " + feedUrl); - // Retrieve the feed. - // We will get a Feed Polled Event and then a - // Feed Retrieved event (assuming the feed is valid) - SyndFeed feed = fetcher.retrieveFeed(feedUrl); + System.err.println("Retrieving feed " + feedUrl); + // Retrieve the feed. + // We will get a Feed Polled Event and then a + // Feed Retrieved event (assuming the feed is valid) + final SyndFeed feed = fetcher.retrieveFeed(feedUrl); - System.err.println(feedUrl + " retrieved"); - System.err.println(feedUrl + " has a title: " + feed.getTitle() + " and contains " + feed.getEntries().size() + " entries."); - // We will now retrieve the feed again. If the feed is unmodified - // and the server supports conditional gets, we will get a "Feed - // Unchanged" event after the Feed Polled event - System.err.println("Polling " + feedUrl + " again to test conditional get support."); - SyndFeed feed2 = fetcher.retrieveFeed(feedUrl); - System.err.println("If a \"Feed Unchanged\" event fired then the server supports conditional gets."); + System.err.println(feedUrl + " retrieved"); + System.err.println(feedUrl + " has a title: " + feed.getTitle() + " and contains " + feed.getEntries().size() + " entries."); + // We will now retrieve the feed again. If the feed is unmodified + // and the server supports conditional gets, we will get a "Feed + // Unchanged" event after the Feed Polled event + System.err.println("Polling " + feedUrl + " again to test conditional get support."); + final SyndFeed feed2 = fetcher.retrieveFeed(feedUrl); + System.err.println("If a \"Feed Unchanged\" event fired then the server supports conditional gets."); - ok = true; - } - catch (Exception ex) { - System.out.println("ERROR: "+ex.getMessage()); - ex.printStackTrace(); - } - } + ok = true; + } catch (final Exception ex) { + System.out.println("ERROR: " + ex.getMessage()); + ex.printStackTrace(); + } + } - if (!ok) { - System.out.println(); - System.out.println("FeedReader reads and prints any RSS/Atom feed type."); - System.out.println("The first parameter must be the URL of the feed to read."); - System.out.println(); - } + if (!ok) { + System.out.println(); + System.out.println("FeedReader reads and prints any RSS/Atom feed type."); + System.out.println("The first parameter must be the URL of the feed to read."); + System.out.println(); + } - } + } - static class FetcherEventListenerImpl implements FetcherListener { - /** - * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) - */ - public void fetcherEvent(FetcherEvent event) { - String eventType = event.getEventType(); - if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { - System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); - } else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) { - System.err.println("\tEVENT: Feed Retrieved. URL = " + event.getUrlString()); - } else if (FetcherEvent.EVENT_TYPE_FEED_UNCHANGED.equals(eventType)) { - System.err.println("\tEVENT: Feed Unchanged. URL = " + event.getUrlString()); - } - } - } + static class FetcherEventListenerImpl implements FetcherListener { + /** + * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) + */ + @Override + public void fetcherEvent(final FetcherEvent event) { + final String eventType = event.getEventType(); + if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { + System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); + } else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) { + System.err.println("\tEVENT: Feed Retrieved. URL = " + event.getUrlString()); + } else if (FetcherEvent.EVENT_TYPE_FEED_UNCHANGED.equals(eventType)) { + System.err.println("\tEVENT: Feed Unchanged. URL = " + event.getUrlString()); + } + } + } } diff --git a/src/main/resources/.gitignore b/src/main/resources/.gitignore new file mode 100644 index 0000000..53b845b --- /dev/null +++ b/src/main/resources/.gitignore @@ -0,0 +1 @@ +# needed to commit empty folder \ No newline at end of file diff --git a/src/test/java/org/rometools/test/AbstractJettyTest.java b/src/test/java/org/rometools/test/AbstractJettyTest.java index a032f66..b0fd7e1 100644 --- a/src/test/java/org/rometools/test/AbstractJettyTest.java +++ b/src/test/java/org/rometools/test/AbstractJettyTest.java @@ -16,8 +16,6 @@ */ package org.rometools.test; -import org.rometools.fetcher.impl.HashMapFeedInfoCache; -import org.rometools.fetcher.impl.FeedFetcherCache; import java.net.URL; import junit.framework.TestCase; @@ -31,78 +29,81 @@ import org.mortbay.http.SocketListener; import org.mortbay.http.UserRealm; import org.mortbay.http.handler.SecurityHandler; import org.mortbay.jetty.servlet.ServletHandler; - -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.synd.SyndEntry; -import com.sun.syndication.feed.synd.SyndFeed; import org.rometools.fetcher.FeedFetcher; import org.rometools.fetcher.FetcherEvent; import org.rometools.fetcher.FetcherException; import org.rometools.fetcher.FetcherListener; +import org.rometools.fetcher.impl.FeedFetcherCache; +import org.rometools.fetcher.impl.HashMapFeedInfoCache; + +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndFeed; /** * @author nl */ public abstract class AbstractJettyTest extends TestCase { - private HttpServer server; - private int testPort = 8283; - - /** - * @param s - */ - public AbstractJettyTest(String s) { - super(s); - } + private HttpServer server; + private final int testPort = 8283; - protected HttpServer getServer() { - return server; - } + /** + * @param s + */ + public AbstractJettyTest(final String s) { + super(s); + } - protected abstract FeedFetcher getFeedFetcher(); - - protected abstract FeedFetcher getFeedFetcher(FeedFetcherCache cache); - - /** - * @see junit.framework.TestCase#setUp() - */ - protected void setUp() throws Exception { - setupServer(); - - HttpContext context = createContext(); - - ServletHandler servlets = createServletHandler(); - context.addHandler(servlets); - - server.addContext(context); - - server.start(); - } + protected HttpServer getServer() { + return server; + } - /** + protected abstract FeedFetcher getFeedFetcher(); + + protected abstract FeedFetcher getFeedFetcher(FeedFetcherCache cache); + + /** + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + setupServer(); + + final HttpContext context = createContext(); + + final ServletHandler servlets = createServletHandler(); + context.addHandler(servlets); + + server.addContext(context); + + server.start(); + } + + /** * @throws InterruptedException */ private void setupServer() throws InterruptedException { // Create the server - if (server != null) { - server.stop(); - server = null; - } - server = new HttpServer(); - - // Create a port listener - SocketListener listener=new SocketListener(); - listener.setPort(testPort); - server.addListener(listener); + if (server != null) { + server.stop(); + server = null; + } + server = new HttpServer(); + + // Create a port listener + final SocketListener listener = new SocketListener(); + listener.setPort(testPort); + server.addListener(listener); } /** * @return */ private ServletHandler createServletHandler() { - ServletHandler servlets = new ServletHandler(); - servlets.addServlet("FetcherTestServlet",FetcherTestServlet.SERVLET_MAPPING,"org.rometools.test.FetcherTestServlet"); - servlets.addServlet("FetcherTestServlet",FetcherTestServlet.SERVLET_MAPPING2,"org.rometools.test.FetcherTestServlet"); + final ServletHandler servlets = new ServletHandler(); + servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING, "org.rometools.test.FetcherTestServlet"); + servlets.addServlet("FetcherTestServlet", FetcherTestServlet.SERVLET_MAPPING2, "org.rometools.test.FetcherTestServlet"); return servlets; } @@ -110,312 +111,313 @@ public abstract class AbstractJettyTest extends TestCase { * @return */ private HttpContext createContext() { - HttpContext context = new HttpContext(); - context.setContextPath("/rome/*"); + final HttpContext context = new HttpContext(); + context.setContextPath("/rome/*"); return context; } /** - * @see junit.framework.TestCase#tearDown() - */ - protected void tearDown() throws Exception { - if (server != null) { - server.stop(); - server.destroy(); - server = null; - } - } + * @see junit.framework.TestCase#tearDown() + */ + @Override + protected void tearDown() throws Exception { + if (server != null) { + server.stop(); + server.destroy(); + server = null; + } + } - class FetcherEventListenerImpl implements FetcherListener { - boolean polled = false; - boolean retrieved = false; - boolean unchanged = false; + class FetcherEventListenerImpl implements FetcherListener { + boolean polled = false; + boolean retrieved = false; + boolean unchanged = false; - public void reset() { - polled = false; - retrieved = false; - unchanged = false; - } + public void reset() { + polled = false; + retrieved = false; + unchanged = false; + } - /** - * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) - */ - public void fetcherEvent(FetcherEvent event) { - String eventType = event.getEventType(); - if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { - System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); - polled = true; - } else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) { - System.err.println("\tEVENT: Feed Retrieved. URL = " + event.getUrlString()); - retrieved = true; - } else if (FetcherEvent.EVENT_TYPE_FEED_UNCHANGED.equals(eventType)) { - System.err.println("\tEVENT: Feed Unchanged. URL = " + event.getUrlString()); - unchanged = true; - } - } - } + /** + * @see com.sun.syndication.fetcher.FetcherListener#fetcherEvent(com.sun.syndication.fetcher.FetcherEvent) + */ + @Override + public void fetcherEvent(final FetcherEvent event) { + final String eventType = event.getEventType(); + if (FetcherEvent.EVENT_TYPE_FEED_POLLED.equals(eventType)) { + System.err.println("\tEVENT: Feed Polled. URL = " + event.getUrlString()); + polled = true; + } else if (FetcherEvent.EVENT_TYPE_FEED_RETRIEVED.equals(eventType)) { + System.err.println("\tEVENT: Feed Retrieved. URL = " + event.getUrlString()); + retrieved = true; + } else if (FetcherEvent.EVENT_TYPE_FEED_UNCHANGED.equals(eventType)) { + System.err.println("\tEVENT: Feed Unchanged. URL = " + event.getUrlString()); + unchanged = true; + } + } + } - public void testRetrieveFeed() { - FeedFetcher feedFetcher = getFeedFetcher(); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testBasicAuthentication() { - try { - setupServer(); - - HttpContext context = createContext(); - - URL url = this.getClass().getResource("/testuser.properties"); - UserRealm ur = new HashUserRealm("test", url.getFile()); - context.setRealm(ur); - - BasicAuthenticator ba = new BasicAuthenticator(); - context.setAuthenticator(ba); - - SecurityHandler sh = new SecurityHandler(); - context.addHandler(sh); - - SecurityConstraint sc = new SecurityConstraint(); - sc.setName("test"); - sc.addRole("*"); - sc.setAuthenticate(true); - context.addSecurityConstraint("/", sc); - - ServletHandler servlets = createServletHandler(); - context.addHandler(servlets); - - server.addContext(context); - - server.start(); - - FeedFetcher feedFetcher = getAuthenticatedFeedFetcher(); - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - - - } catch (Exception e) { + public void testRetrieveFeed() { + final FeedFetcher feedFetcher = getFeedFetcher(); + try { + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + } catch (final Exception e) { e.printStackTrace(); fail(e.getMessage()); - } - - - } - - public abstract FeedFetcher getAuthenticatedFeedFetcher(); - - /** - * Test getting a feed via a http 301 redirect - * - */ - public void testRetrieveRedirectedFeed() { - FeedFetcher feedFetcher = getFeedFetcher(); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?redirect=TRUE")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } + } + } - /** - * Test error handling - * - */ - public void testErrorHandling() { - FeedFetcher feedFetcher = getFeedFetcher(); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?error=404")); - fail("4xx error handling did not work correctly"); - } catch (FetcherException e) { - // expect this exception - assertEquals(404, e.getResponseCode()); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?error=500")); - fail("5xx error handling did not work correctly"); - } catch (FetcherException e) { - // expect this exception - assertEquals(500, e.getResponseCode()); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } + public void testBasicAuthentication() { + try { + setupServer(); - public void testUserAgent() { - FeedFetcher feedFetcher = getFeedFetcher(); - //System.out.println(feedFetcher.getUserAgent()); - //System.out.println(System.getProperty("rome.fetcher.version", "UNKNOWN")); - assertEquals("Rome Client (http://tinyurl.com/64t5n) Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"), feedFetcher.getUserAgent()); - } + final HttpContext context = createContext(); - /** - * Test events fired when there is no cache in use - * - */ - public void testFetchEvents() { - FeedFetcher feedFetcher = getFeedFetcher(); - FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); - feedFetcher.addFetcherEventListener(listener); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertTrue(listener.polled); - assertTrue(listener.retrieved); - assertFalse(listener.unchanged); - listener.reset(); - - // since there is no cache, the events fired should be exactly the same if - // we re-retrieve the feed - feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertTrue(listener.polled); - assertTrue(listener.retrieved); - assertFalse(listener.unchanged); - listener.reset(); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } + final URL url = this.getClass().getResource("/testuser.properties"); + final UserRealm ur = new HashUserRealm("test", url.getFile()); + context.setRealm(ur); - /** - * Test events fired when there is a cache in use - * - */ - public void testFetchEventsWithCache() { - FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); - FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); - FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); - feedFetcher.addFetcherEventListener(listener); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertTrue(listener.polled); - assertTrue(listener.retrieved); - assertFalse(listener.unchanged); - listener.reset(); - - // Since the feed is cached, the second request should not - // actually retrieve the feed - feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertTrue(listener.polled); - assertFalse(listener.retrieved); - assertTrue(listener.unchanged); - listener.reset(); - - // now simulate getting the feed after it has changed - feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?refreshfeed=TRUE")); - assertNotNull(feed); - assertTrue(listener.polled); - assertTrue(listener.retrieved); - assertFalse(listener.unchanged); - listener.reset(); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - /** - * Test handling of GZipped feed - * - */ - public void testGZippedFeed() { - FeedFetcher feedFetcher = getFeedFetcher(); - try { - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?gzipfeed=TRUE")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - public void testPreserveWireFeed() throws Exception { - FeedFetcher feedFetcher = getFeedFetcher(); + final BasicAuthenticator ba = new BasicAuthenticator(); + context.setAuthenticator(ba); - // first check we the WireFeed is not preserved by default - SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - assertNull(feed.originalWireFeed()); - - SyndEntry syndEntry = (SyndEntry)feed.getEntries().get(0); - assertNotNull(syndEntry); - assertNull(syndEntry.getWireEntry()); - - // now turn on WireFeed preservation - feedFetcher.setPreserveWireFeed(true); - try { - feed = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet/")); - assertNotNull(feed); - assertEquals("atom_1.0.feed.title", feed.getTitle()); - assertNotNull(feed.originalWireFeed()); + final SecurityHandler sh = new SecurityHandler(); + context.addHandler(sh); + + final SecurityConstraint sc = new SecurityConstraint(); + sc.setName("test"); + sc.addRole("*"); + sc.setAuthenticate(true); + context.addSecurityConstraint("/", sc); + + final ServletHandler servlets = createServletHandler(); + context.addHandler(servlets); + + server.addContext(context); + + server.start(); + + final FeedFetcher feedFetcher = getAuthenticatedFeedFetcher(); + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + + } + + public abstract FeedFetcher getAuthenticatedFeedFetcher(); + + /** + * Test getting a feed via a http 301 redirect + * + */ + public void testRetrieveRedirectedFeed() { + final FeedFetcher feedFetcher = getFeedFetcher(); + try { + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?redirect=TRUE")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + /** + * Test error handling + * + */ + public void testErrorHandling() { + final FeedFetcher feedFetcher = getFeedFetcher(); + try { + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?error=404")); + fail("4xx error handling did not work correctly"); + } catch (final FetcherException e) { + // expect this exception + assertEquals(404, e.getResponseCode()); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + + try { + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?error=500")); + fail("5xx error handling did not work correctly"); + } catch (final FetcherException e) { + // expect this exception + assertEquals(500, e.getResponseCode()); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testUserAgent() { + final FeedFetcher feedFetcher = getFeedFetcher(); + // System.out.println(feedFetcher.getUserAgent()); + // System.out.println(System.getProperty("rome.fetcher.version", "UNKNOWN")); + assertEquals("Rome Client (http://tinyurl.com/64t5n) Ver: " + System.getProperty("rome.fetcher.version", "UNKNOWN"), feedFetcher.getUserAgent()); + } + + /** + * Test events fired when there is no cache in use + * + */ + public void testFetchEvents() { + final FeedFetcher feedFetcher = getFeedFetcher(); + final FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); + feedFetcher.addFetcherEventListener(listener); + try { + SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertTrue(listener.polled); + assertTrue(listener.retrieved); + assertFalse(listener.unchanged); + listener.reset(); + + // since there is no cache, the events fired should be exactly the same if + // we re-retrieve the feed + feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertTrue(listener.polled); + assertTrue(listener.retrieved); + assertFalse(listener.unchanged); + listener.reset(); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + /** + * Test events fired when there is a cache in use + * + */ + public void testFetchEventsWithCache() { + final FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); + final FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); + final FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); + feedFetcher.addFetcherEventListener(listener); + try { + SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertTrue(listener.polled); + assertTrue(listener.retrieved); + assertFalse(listener.unchanged); + listener.reset(); + + // Since the feed is cached, the second request should not + // actually retrieve the feed + feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertTrue(listener.polled); + assertFalse(listener.retrieved); + assertTrue(listener.unchanged); + listener.reset(); + + // now simulate getting the feed after it has changed + feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?refreshfeed=TRUE")); + assertNotNull(feed); + assertTrue(listener.polled); + assertTrue(listener.retrieved); + assertFalse(listener.unchanged); + listener.reset(); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + /** + * Test handling of GZipped feed + * + */ + public void testGZippedFeed() { + final FeedFetcher feedFetcher = getFeedFetcher(); + try { + final SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet?gzipfeed=TRUE")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + public void testPreserveWireFeed() throws Exception { + final FeedFetcher feedFetcher = getFeedFetcher(); + + // first check we the WireFeed is not preserved by default + SyndFeed feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + assertNull(feed.originalWireFeed()); + + SyndEntry syndEntry = feed.getEntries().get(0); + assertNotNull(syndEntry); + assertNull(syndEntry.getWireEntry()); + + // now turn on WireFeed preservation + feedFetcher.setPreserveWireFeed(true); + try { + feed = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + "/rome/FetcherTestServlet/")); + assertNotNull(feed); + assertEquals("atom_1.0.feed.title", feed.getTitle()); + assertNotNull(feed.originalWireFeed()); + + syndEntry = feed.getEntries().get(0); + assertNotNull(syndEntry); + assertNotNull(syndEntry.getWireEntry()); + + final Entry entry = (Entry) syndEntry.getWireEntry(); + assertEquals("atom_1.0.feed.entry[0].rights", entry.getRights()); + + } finally { + feedFetcher.setPreserveWireFeed(false); // reset + } + + } + + public void testDeltaEncoding() { + final FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); + final FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); + try { + feedFetcher.setUsingDeltaEncoding(true); + + // first retrieval should just grab the default feed + final SyndFeed feed1 = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + + "/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); + assertNotNull(feed1); + assertEquals("atom_1.0.feed.title", feed1.getTitle()); + assertEquals(2, feed1.getEntries().size()); + SyndEntry entry1 = feed1.getEntries().get(0); + assertEquals("atom_1.0.feed.entry[0].title", entry1.getTitle()); + + // second retrieval should get only the new item + /* + * This is breaking with Rome 0.5 ?? + */ + final SyndFeed feed2 = feedFetcher.retrieveFeed(new URL("http://localhost:" + testPort + + "/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); + assertNotNull(feed2); + assertEquals(FetcherTestServlet.DELTA_FEED_TITLE, feed2.getTitle()); + assertEquals(3, feed2.getEntries().size()); + entry1 = feed2.getEntries().get(0); + assertEquals(FetcherTestServlet.DELTA_FEED_ENTRY_TITLE, entry1.getTitle()); + + final SyndEntry entry2 = feed2.getEntries().get(1); + assertEquals("atom_1.0.feed.entry[0].title", entry2.getTitle()); + + } catch (final Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } - syndEntry = (SyndEntry)feed.getEntries().get(0); - assertNotNull(syndEntry); - assertNotNull(syndEntry.getWireEntry()); - - Entry entry = (Entry) syndEntry.getWireEntry(); - assertEquals("atom_1.0.feed.entry[0].rights", entry.getRights()); - - } finally { - feedFetcher.setPreserveWireFeed(false); //reset - } - - } - - public void testDeltaEncoding() { - FeedFetcherCache feedInfoCache = new HashMapFeedInfoCache(); - FeedFetcher feedFetcher = getFeedFetcher(feedInfoCache); - try { - feedFetcher.setUsingDeltaEncoding(true); - - // first retrieval should just grab the default feed - SyndFeed feed1 = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); - assertNotNull(feed1); - assertEquals("atom_1.0.feed.title", feed1.getTitle()); - assertEquals(2, feed1.getEntries().size()); - SyndEntry entry1 = (SyndEntry) feed1.getEntries().get(0); - assertEquals("atom_1.0.feed.entry[0].title", entry1.getTitle()); - - // second retrieval should get only the new item - /* - * This is breaking with Rome 0.5 ?? - */ - SyndFeed feed2 = feedFetcher.retrieveFeed(new URL("http://localhost:"+testPort+"/rome/FetcherTestServlet?deltaencode=TRUE&refreshfeed=TRUE")); - assertNotNull(feed2); - assertEquals(FetcherTestServlet.DELTA_FEED_TITLE, feed2.getTitle()); - assertEquals(3, feed2.getEntries().size()); - entry1 = (SyndEntry) feed2.getEntries().get(0); - assertEquals(FetcherTestServlet.DELTA_FEED_ENTRY_TITLE, entry1.getTitle()); - - SyndEntry entry2 = (SyndEntry) feed2.getEntries().get(1); - assertEquals("atom_1.0.feed.entry[0].title", entry2.getTitle()); - - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - } diff --git a/src/test/java/org/rometools/test/DiskFeedInfoCacheTest.java b/src/test/java/org/rometools/test/DiskFeedInfoCacheTest.java index c39d6c2..1952d1e 100644 --- a/src/test/java/org/rometools/test/DiskFeedInfoCacheTest.java +++ b/src/test/java/org/rometools/test/DiskFeedInfoCacheTest.java @@ -1,42 +1,44 @@ package org.rometools.test; +import java.io.File; +import java.net.URL; + +import junit.framework.TestCase; + import org.rometools.fetcher.impl.DiskFeedInfoCache; import org.rometools.fetcher.impl.SyndFeedInfo; -import java.net.*; -import java.io.File; -import junit.framework.TestCase; public class DiskFeedInfoCacheTest extends TestCase { - public void testClear() throws Exception { - File cacheDir = new File("test-cache"); - cacheDir.mkdir(); - cacheDir.deleteOnExit(); - - final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath()); - SyndFeedInfo info = new SyndFeedInfo(); - URL url = new URL("http://nowhere.com"); - cache.setFeedInfo(url, info); - - cache.clear(); - final Object returned = cache.getFeedInfo(url); - assertTrue( returned == null ); - } - - public void testRemove() throws Exception { - File cacheDir = new File("test-cache"); - cacheDir.mkdir(); - cacheDir.deleteOnExit(); - - final DiskFeedInfoCache cache = new DiskFeedInfoCache( cacheDir.getCanonicalPath() ); - SyndFeedInfo info = new SyndFeedInfo(); - URL url = new URL("http://nowhere.com"); - cache.setFeedInfo( url, info ); - - SyndFeedInfo removedInfo = cache.remove( url ); - assertTrue( removedInfo.equals(info) ); - SyndFeedInfo shouldBeNull = cache.remove( url ); - assertTrue( null == shouldBeNull ); - } - + public void testClear() throws Exception { + final File cacheDir = new File("test-cache"); + cacheDir.mkdir(); + cacheDir.deleteOnExit(); + + final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath()); + final SyndFeedInfo info = new SyndFeedInfo(); + final URL url = new URL("http://nowhere.com"); + cache.setFeedInfo(url, info); + + cache.clear(); + final Object returned = cache.getFeedInfo(url); + assertTrue(returned == null); + } + + public void testRemove() throws Exception { + final File cacheDir = new File("test-cache"); + cacheDir.mkdir(); + cacheDir.deleteOnExit(); + + final DiskFeedInfoCache cache = new DiskFeedInfoCache(cacheDir.getCanonicalPath()); + final SyndFeedInfo info = new SyndFeedInfo(); + final URL url = new URL("http://nowhere.com"); + cache.setFeedInfo(url, info); + + final SyndFeedInfo removedInfo = cache.remove(url); + assertTrue(removedInfo.equals(info)); + final SyndFeedInfo shouldBeNull = cache.remove(url); + assertTrue(null == shouldBeNull); + } + } diff --git a/src/test/java/org/rometools/test/HashMapFeedInfoCacheTest.java b/src/test/java/org/rometools/test/HashMapFeedInfoCacheTest.java index 11f3642..8f3d3a8 100644 --- a/src/test/java/org/rometools/test/HashMapFeedInfoCacheTest.java +++ b/src/test/java/org/rometools/test/HashMapFeedInfoCacheTest.java @@ -1,41 +1,42 @@ package org.rometools.test; -import org.rometools.fetcher.impl.HashMapFeedInfoCache; -import org.rometools.fetcher.impl.SyndFeedInfo; import java.net.URL; import junit.framework.TestCase; +import org.rometools.fetcher.impl.HashMapFeedInfoCache; +import org.rometools.fetcher.impl.SyndFeedInfo; + public class HashMapFeedInfoCacheTest extends TestCase { - public void testRemove() throws Exception { - final HashMapFeedInfoCache cache = new HashMapFeedInfoCache(); - assertNotNull( cache ); - - final URL url = new URL("http://foo.com"); - final SyndFeedInfo syndFeedInfo = new SyndFeedInfo(); - syndFeedInfo.setUrl(url); - cache.setFeedInfo(url, syndFeedInfo); - - final SyndFeedInfo returned = cache.remove(url); - assertTrue( returned.equals(syndFeedInfo) ); - assertTrue( url.equals( returned.getUrl() )); - } - - public void testClear() throws Exception { - final HashMapFeedInfoCache cache = new HashMapFeedInfoCache(); - assertNotNull( cache ); - - final URL url = new URL("http://foo.com"); - final SyndFeedInfo syndFeedInfo = new SyndFeedInfo(); - syndFeedInfo.setUrl(url); - cache.setFeedInfo(url, syndFeedInfo); - - //clear it - cache.clear(); - - //we should not get a result back - final Object returned = cache.getFeedInfo(url); - assertTrue( returned == null ); - } + public void testRemove() throws Exception { + final HashMapFeedInfoCache cache = new HashMapFeedInfoCache(); + assertNotNull(cache); + + final URL url = new URL("http://foo.com"); + final SyndFeedInfo syndFeedInfo = new SyndFeedInfo(); + syndFeedInfo.setUrl(url); + cache.setFeedInfo(url, syndFeedInfo); + + final SyndFeedInfo returned = cache.remove(url); + assertTrue(returned.equals(syndFeedInfo)); + assertTrue(url.equals(returned.getUrl())); + } + + public void testClear() throws Exception { + final HashMapFeedInfoCache cache = new HashMapFeedInfoCache(); + assertNotNull(cache); + + final URL url = new URL("http://foo.com"); + final SyndFeedInfo syndFeedInfo = new SyndFeedInfo(); + syndFeedInfo.setUrl(url); + cache.setFeedInfo(url, syndFeedInfo); + + // clear it + cache.clear(); + + // we should not get a result back + final Object returned = cache.getFeedInfo(url); + assertTrue(returned == null); + } } diff --git a/src/test/java/org/rometools/test/HttpClientFeedFetcherTest.java b/src/test/java/org/rometools/test/HttpClientFeedFetcherTest.java index 60cb8e2..13938ab 100644 --- a/src/test/java/org/rometools/test/HttpClientFeedFetcherTest.java +++ b/src/test/java/org/rometools/test/HttpClientFeedFetcherTest.java @@ -16,45 +16,48 @@ */ package org.rometools.test; -import org.rometools.fetcher.impl.HttpClientFeedFetcher; -import org.rometools.fetcher.impl.FeedFetcherCache; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.UsernamePasswordCredentials; - import org.rometools.fetcher.FeedFetcher; +import org.rometools.fetcher.impl.FeedFetcherCache; +import org.rometools.fetcher.impl.HttpClientFeedFetcher; /** * @author Nick Lothian */ public class HttpClientFeedFetcherTest extends AbstractJettyTest { - public HttpClientFeedFetcherTest(String s) { - super(s); - } - - /** - * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() - */ - protected FeedFetcher getFeedFetcher() { - return new HttpClientFeedFetcher(); - } - - protected FeedFetcher getFeedFetcher(FeedFetcherCache cache) { - return new HttpClientFeedFetcher(cache); - } + public HttpClientFeedFetcherTest(final String s) { + super(s); + } + + /** + * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() + */ + @Override + protected FeedFetcher getFeedFetcher() { + return new HttpClientFeedFetcher(); + } + + @Override + protected FeedFetcher getFeedFetcher(final FeedFetcherCache cache) { + return new HttpClientFeedFetcher(cache); + } /** * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher() */ + @Override public FeedFetcher getAuthenticatedFeedFetcher() { return new HttpClientFeedFetcher(null, new HttpClientFeedFetcher.CredentialSupplier() { - public Credentials getCredentials(String realm, String host) { + @Override + public Credentials getCredentials(final String realm, final String host) { if ("localhost".equals(host)) { - return new UsernamePasswordCredentials("username", "password"); + return new UsernamePasswordCredentials("username", "password"); } else { return null; - } - } - }); + } + } + }); } } diff --git a/src/test/java/org/rometools/test/HttpURLFeedFetcherTest.java b/src/test/java/org/rometools/test/HttpURLFeedFetcherTest.java index 12ddfc1..abc497a 100644 --- a/src/test/java/org/rometools/test/HttpURLFeedFetcherTest.java +++ b/src/test/java/org/rometools/test/HttpURLFeedFetcherTest.java @@ -16,40 +16,40 @@ */ package org.rometools.test; -import org.rometools.fetcher.impl.HttpURLFeedFetcher; -import org.rometools.fetcher.impl.FeedFetcherCache; import org.rometools.fetcher.FeedFetcher; - +import org.rometools.fetcher.impl.FeedFetcherCache; +import org.rometools.fetcher.impl.HttpURLFeedFetcher; public class HttpURLFeedFetcherTest extends AbstractJettyTest { - - public HttpURLFeedFetcherTest(String s) { - super(s); - } - /** - * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() - */ - protected FeedFetcher getFeedFetcher() { - return new HttpURLFeedFetcher(); - } - - protected FeedFetcher getFeedFetcher(FeedFetcherCache cache) { - return new HttpURLFeedFetcher(cache); - } + public HttpURLFeedFetcherTest(final String s) { + super(s); + } + + /** + * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getFeedFetcher() + */ + @Override + protected FeedFetcher getFeedFetcher() { + return new HttpURLFeedFetcher(); + } + + @Override + protected FeedFetcher getFeedFetcher(final FeedFetcherCache cache) { + return new HttpURLFeedFetcher(cache); + } /** * @see com.sun.syndication.fetcher.impl.AbstractJettyTest#getAuthenticatedFeedFetcher() */ + @Override public FeedFetcher getAuthenticatedFeedFetcher() { // setup the authenticator java.net.Authenticator.setDefault(new TestBasicAuthenticator()); - - FeedFetcher feedFetcher = getFeedFetcher(); - + + final FeedFetcher feedFetcher = getFeedFetcher(); + return feedFetcher; } - - } diff --git a/src/test/java/org/rometools/test/ResponseHandlerTest.java b/src/test/java/org/rometools/test/ResponseHandlerTest.java index c4bb033..d164372 100644 --- a/src/test/java/org/rometools/test/ResponseHandlerTest.java +++ b/src/test/java/org/rometools/test/ResponseHandlerTest.java @@ -16,27 +16,27 @@ */ package org.rometools.test; -import org.rometools.fetcher.impl.ResponseHandler; - import junit.framework.TestCase; +import org.rometools.fetcher.impl.ResponseHandler; + public class ResponseHandlerTest extends TestCase { - /** - * Constructor for ResponseHandlerTest. - */ - public ResponseHandlerTest(String arg0) { - super(arg0); - } + /** + * Constructor for ResponseHandlerTest. + */ + public ResponseHandlerTest(final String arg0) { + super(arg0); + } - public void testGetCharacterEncodingString() { - assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding((String)null)); - assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml")); - assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml;")); - assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml; charset=ISO-8859-4")); - assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml;charset=ISO-8859-4")); - assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml;charset=ISO-8859-4;something")); - assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml;something")); - } + public void testGetCharacterEncodingString() { + assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding((String) null)); + assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml")); + assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml;")); + assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml; charset=ISO-8859-4")); + assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml;charset=ISO-8859-4")); + assertEquals("ISO-8859-4", ResponseHandler.getCharacterEncoding("text/xml;charset=ISO-8859-4;something")); + assertEquals(ResponseHandler.defaultCharacterEncoding, ResponseHandler.getCharacterEncoding("text/xml;something")); + } } diff --git a/src/test/java/org/rometools/test/TestBasicAuthenticator.java b/src/test/java/org/rometools/test/TestBasicAuthenticator.java index bdd6ed1..0016bbf 100644 --- a/src/test/java/org/rometools/test/TestBasicAuthenticator.java +++ b/src/test/java/org/rometools/test/TestBasicAuthenticator.java @@ -27,6 +27,7 @@ public class TestBasicAuthenticator extends Authenticator { /** * @see java.net.Authenticator#getPasswordAuthentication() */ + @Override protected PasswordAuthentication getPasswordAuthentication() { if ("localhost".equals(getRequestingHost())) { return new PasswordAuthentication("username", "password".toCharArray());