Refactoring code
This commit is contained in:
parent
3d42211970
commit
ace52cfa9f
5 changed files with 85 additions and 98 deletions
|
@ -24,8 +24,10 @@ import java.io.ObjectInputStream;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
|
import com.rometools.utils.IO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disk based cache.
|
* Disk based feed cache.
|
||||||
*/
|
*/
|
||||||
public class DiskFeedInfoCache implements FeedFetcherCache {
|
public class DiskFeedInfoCache implements FeedFetcherCache {
|
||||||
|
|
||||||
|
@ -37,71 +39,42 @@ public class DiskFeedInfoCache implements FeedFetcherCache {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SyndFeedInfo getFeedInfo(final URL url) {
|
public SyndFeedInfo getFeedInfo(final URL url) {
|
||||||
SyndFeedInfo info = null;
|
final String fileName = generateFilename(url);
|
||||||
final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
|
return getFeedInfo(fileName);
|
||||||
FileInputStream fis = null;
|
|
||||||
ObjectInputStream ois = null;
|
|
||||||
try {
|
|
||||||
fis = new FileInputStream(fileName);
|
|
||||||
ois = new ObjectInputStream(fis);
|
|
||||||
info = (SyndFeedInfo) ois.readObject();
|
|
||||||
} catch (final FileNotFoundException e) {
|
|
||||||
// That's OK, we'l return null
|
|
||||||
} catch (final ClassNotFoundException e) {
|
|
||||||
// Error writing to cache is fatal
|
|
||||||
throw new RuntimeException("Attempting to read from cache", e);
|
|
||||||
} catch (final IOException e) {
|
|
||||||
// Error writing to cache is fatal
|
|
||||||
throw new RuntimeException("Attempting to read from cache", e);
|
|
||||||
} finally {
|
|
||||||
if (fis != null) {
|
|
||||||
try {
|
|
||||||
fis.close();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ois != null) {
|
|
||||||
try {
|
|
||||||
ois.close();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFeedInfo(final URL url, final SyndFeedInfo feedInfo) {
|
public void setFeedInfo(final URL url, final SyndFeedInfo feedInfo) {
|
||||||
final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
|
|
||||||
FileOutputStream fos;
|
final String fileName = generateFilename(url);
|
||||||
|
|
||||||
|
FileOutputStream fos = null;
|
||||||
|
ObjectOutputStream oos = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
fos = new FileOutputStream(fileName);
|
fos = new FileOutputStream(fileName);
|
||||||
final ObjectOutputStream oos = new ObjectOutputStream(fos);
|
oos = new ObjectOutputStream(fos);
|
||||||
oos.writeObject(feedInfo);
|
oos.writeObject(feedInfo);
|
||||||
fos.flush();
|
fos.flush();
|
||||||
fos.close();
|
|
||||||
} catch (final Exception e) {
|
} catch (final FileNotFoundException e) {
|
||||||
// Error writing to cache is fatal
|
|
||||||
throw new RuntimeException("Attempting to write to cache", e);
|
throw new RuntimeException("Error while writing to cache", e);
|
||||||
|
|
||||||
|
} catch (final IOException e) {
|
||||||
|
|
||||||
|
throw new RuntimeException("Error while writing to cache", e);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
IO.closeQuietly(fos);
|
||||||
|
IO.closeQuietly(oos);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the cache.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void clear() {
|
public synchronized void clear() {
|
||||||
final File file = new File(cachePath);
|
final File file = new File(cachePath);
|
||||||
|
@ -114,57 +87,72 @@ public class DiskFeedInfoCache implements FeedFetcherCache {
|
||||||
final File deleteMe = new File(cachePath + File.separator + files[i]);
|
final File deleteMe = new File(cachePath + File.separator + files[i]);
|
||||||
deleteMe.delete();
|
deleteMe.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't delete the cache directory
|
// don't delete the cache directory
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SyndFeedInfo remove(final URL url) {
|
public SyndFeedInfo remove(final URL url) {
|
||||||
|
final String fileName = generateFilename(url);
|
||||||
|
final SyndFeedInfo info = getFeedInfo(fileName);
|
||||||
|
if (info != null) {
|
||||||
|
final File file = new File(fileName);
|
||||||
|
if (file.exists()) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SyndFeedInfo getFeedInfo(final String fileName) {
|
||||||
|
|
||||||
SyndFeedInfo info = null;
|
SyndFeedInfo info = null;
|
||||||
final String fileName = cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
|
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
ObjectInputStream ois = null;
|
ObjectInputStream ois = null;
|
||||||
boolean consumed = false;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
fis = new FileInputStream(fileName);
|
fis = new FileInputStream(fileName);
|
||||||
ois = new ObjectInputStream(fis);
|
ois = new ObjectInputStream(fis);
|
||||||
info = (SyndFeedInfo) ois.readObject();
|
info = (SyndFeedInfo) ois.readObject();
|
||||||
consumed = true;
|
|
||||||
|
|
||||||
} catch (final FileNotFoundException e) {
|
} catch (final FileNotFoundException e) {
|
||||||
// That's OK, we'l return null
|
|
||||||
|
// feed is not cached yet
|
||||||
|
|
||||||
} catch (final ClassNotFoundException e) {
|
} catch (final ClassNotFoundException e) {
|
||||||
// Error writing to cache is fatal
|
|
||||||
throw new RuntimeException("Attempting to read from cache", e);
|
throw new RuntimeException("Unable to read from cache", e);
|
||||||
|
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
// Error writing to cache is fatal
|
|
||||||
throw new RuntimeException("Attempting to read from cache", e);
|
throw new RuntimeException("Unable to read from cache", e);
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
if (fis != null) {
|
|
||||||
try {
|
IO.closeQuietly(fis);
|
||||||
fis.close();
|
IO.closeQuietly(ois);
|
||||||
} catch (final IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ois != null) {
|
|
||||||
try {
|
|
||||||
ois.close();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (consumed) {
|
|
||||||
final File file = new File(fileName);
|
|
||||||
if (file.exists()) {
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String replaceNonAlphanumeric(final String string, final char character) {
|
||||||
|
final StringBuffer buffer = new StringBuffer(string.length());
|
||||||
|
for (final char singleChar : string.toCharArray()) {
|
||||||
|
if (Character.isLetterOrDigit(singleChar)) {
|
||||||
|
buffer.append(singleChar);
|
||||||
|
} else {
|
||||||
|
buffer.append(character);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateFilename(final URL url) {
|
||||||
|
return cachePath + File.separator + "feed_" + replaceNonAlphanumeric(url.toString(), '_').trim();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.net.URL;
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface FeedFetcherCache {
|
public interface FeedFetcherCache {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a SyndFeedInfo object from the cache.
|
* Get a SyndFeedInfo object from the cache.
|
||||||
*
|
*
|
||||||
|
@ -55,4 +56,5 @@ public interface FeedFetcherCache {
|
||||||
* @return The removed SyndFeedInfo
|
* @return The removed SyndFeedInfo
|
||||||
*/
|
*/
|
||||||
public SyndFeedInfo remove(URL feedUrl);
|
public SyndFeedInfo remove(URL feedUrl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,10 @@ import java.util.Map;
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
|
public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
static HashMapFeedInfoCache _instance;
|
static HashMapFeedInfoCache instance;
|
||||||
|
|
||||||
private Map<String, SyndFeedInfo> infoCache;
|
private Map<String, SyndFeedInfo> infoCache;
|
||||||
|
|
||||||
|
@ -65,10 +66,10 @@ public class HashMapFeedInfoCache implements FeedFetcherCache, Serializable {
|
||||||
* @return an implementation of FeedFetcherCache
|
* @return an implementation of FeedFetcherCache
|
||||||
*/
|
*/
|
||||||
public static synchronized FeedFetcherCache getInstance() {
|
public static synchronized FeedFetcherCache getInstance() {
|
||||||
if (_instance == null) {
|
if (instance == null) {
|
||||||
_instance = new HashMapFeedInfoCache();
|
instance = new HashMapFeedInfoCache();
|
||||||
}
|
}
|
||||||
return _instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Map<String, SyndFeedInfo> createInfoCache() {
|
protected Map<String, SyndFeedInfo> createInfoCache() {
|
||||||
|
|
|
@ -42,6 +42,7 @@ import com.rometools.rome.feed.synd.SyndFeed;
|
||||||
import com.rometools.rome.io.FeedException;
|
import com.rometools.rome.io.FeedException;
|
||||||
import com.rometools.rome.io.SyndFeedInput;
|
import com.rometools.rome.io.SyndFeedInput;
|
||||||
import com.rometools.rome.io.XmlReader;
|
import com.rometools.rome.io.XmlReader;
|
||||||
|
import com.rometools.utils.IO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Nick Lothian
|
* @author Nick Lothian
|
||||||
|
@ -279,9 +280,7 @@ public class HttpClientFeedFetcher extends AbstractFeedFetcher {
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
|
|
||||||
if (stream != null) {
|
IO.close(stream);
|
||||||
stream.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import com.rometools.rome.feed.synd.SyndFeed;
|
||||||
import com.rometools.rome.io.FeedException;
|
import com.rometools.rome.io.FeedException;
|
||||||
import com.rometools.rome.io.SyndFeedInput;
|
import com.rometools.rome.io.SyndFeedInput;
|
||||||
import com.rometools.rome.io.XmlReader;
|
import com.rometools.rome.io.XmlReader;
|
||||||
|
import com.rometools.utils.IO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -70,7 +71,7 @@ import com.rometools.rome.io.XmlReader;
|
||||||
*/
|
*/
|
||||||
public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
||||||
|
|
||||||
private volatile int connectTimeout = -1;
|
private volatile int connectTimeout = -1;
|
||||||
|
|
||||||
static final int POLL_EVENT = 1;
|
static final int POLL_EVENT = 1;
|
||||||
static final int RETRIEVE_EVENT = 2;
|
static final int RETRIEVE_EVENT = 2;
|
||||||
|
@ -170,9 +171,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
||||||
} catch (final java.io.IOException e) {
|
} catch (final java.io.IOException e) {
|
||||||
handleErrorCodes(((HttpURLConnection) connection).getResponseCode());
|
handleErrorCodes(((HttpURLConnection) connection).getResponseCode());
|
||||||
} finally {
|
} finally {
|
||||||
if (inputStream != null) {
|
IO.close(inputStream);
|
||||||
inputStream.close();
|
|
||||||
}
|
|
||||||
httpConnection.disconnect();
|
httpConnection.disconnect();
|
||||||
}
|
}
|
||||||
// we will never actually get to this line
|
// we will never actually get to this line
|
||||||
|
@ -234,9 +233,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
||||||
|
|
||||||
syndFeedInfo.setSyndFeed(syndFeed);
|
syndFeedInfo.setSyndFeed(syndFeed);
|
||||||
} finally {
|
} finally {
|
||||||
if (inputStream != null) {
|
IO.close(inputStream);
|
||||||
inputStream.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,7 +246,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
||||||
* @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null
|
* @param syndFeedInfo The SyndFeedInfo for the feed to be retrieved. May be null
|
||||||
* @param userAgent the name of the user-agent to be placed in HTTP-header.
|
* @param userAgent the name of the user-agent to be placed in HTTP-header.
|
||||||
*/
|
*/
|
||||||
protected void setRequestHeaders(final URLConnection connection, final SyndFeedInfo syndFeedInfo, String userAgent) {
|
protected void setRequestHeaders(final URLConnection connection, final SyndFeedInfo syndFeedInfo, final String userAgent) {
|
||||||
if (syndFeedInfo != null) {
|
if (syndFeedInfo != null) {
|
||||||
// set the headers to get feed only if modified
|
// set the headers to get feed only if modified
|
||||||
// we support the use of both last modified and eTag headers
|
// we support the use of both last modified and eTag headers
|
||||||
|
@ -288,7 +285,7 @@ public class HttpURLFeedFetcher extends AbstractFeedFetcher {
|
||||||
|
|
||||||
// SyndFeedInput input = new SyndFeedInput();
|
// SyndFeedInput input = new SyndFeedInput();
|
||||||
|
|
||||||
XmlReader reader;
|
final XmlReader reader;
|
||||||
if (connection.getHeaderField("Content-Type") != null) {
|
if (connection.getHeaderField("Content-Type") != null) {
|
||||||
reader = new XmlReader(is, connection.getHeaderField("Content-Type"), true);
|
reader = new XmlReader(is, connection.getHeaderField("Content-Type"), true);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue