| HTTPFileWatcher.java |
/*
* $Id: HTTPFileWatcher.java,v 1.5 2010/09/29 17:21:48 agoubard Exp $
*
* See the COPYRIGHT file for redistribution and use restrictions.
*/
package org.xins.common.io;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.xins.common.Log;
import org.xins.common.Utils;
/**
* File watcher thread. This thread checks if a URL or a set of URLs
* changed and if it has, it notifies the listener.
* The check is performed every <em>n</em> seconds, where <em>n</em> can be configured.
*
* <p>Initially this thread will be a daemon thread. This can be changed by
* calling {@link #setDaemon(boolean)}.
*
* @version $Revision: 1.5 $ $Date: 2010/09/29 17:21:48 $
* @author <a href="mailto:anthony.goubard@japplis.com">Anthony Goubard</a>
*
* @since XINS 2.1
*/
public class HTTPFileWatcher extends FileWatcher {
/**
* The URLs to watch. Not <code>null</code>.
*/
private URL[] _urls;
/**
* Creates a new <code>HTTPFileWatcher</code> for the specified URL.
*
* <p>The interval must be set before the thread can be started.
*
* @param url
* the name of the URL to watch, cannot be <code>null</code>.
*
* @param listener
* the object to notify on events, cannot be <code>null</code>.
*
* @throws IllegalArgumentException
* if <code>url == null || listener == null</code>
*/
public HTTPFileWatcher(String url, Listener listener)
throws IllegalArgumentException {
this(url, 0, listener);
}
/**
* Creates a new <code>HTTPFileWatcher</code> for the specified URL, with the
* specified interval.
*
* @param url
* the name of the URL to watch, cannot be <code>null</code>.
*
* @param interval
* the interval in seconds, must be greater than or equal to 0.
* if the interval is 0 the interval must be set before the thread can
* be started.
*
* @param listener
* the object to notify on events, cannot be <code>null</code>.
*
* @throws IllegalArgumentException
* if <code>url == null || listener == null || interval < 0</code>
*/
public HTTPFileWatcher(String url, int interval, Listener listener)
throws IllegalArgumentException {
this(new String[]{url}, interval, listener);
}
/**
* Creates a new <code>HTTPFileWatcher</code> for the specified set of URLs,
* with the specified interval.
*
* @param urls
* the name of the URLs to watch, cannot be <code>null</code>.
* It should also have at least one URL and none of the URLs should be <code>null</code>.
*
* @param interval
* the interval in seconds, must be greater than or equal to 0.
* if the interval is 0 the interval must be set before the thread can
* be started.
*
* @param listener
* the object to notify on events, cannot be <code>null</code>.
*
* @throws IllegalArgumentException
* if <code>urls == null || listener == null || interval < 0 || urls.length < 1</code>
* or if one of the URL is <code>null</code>.
*/
public HTTPFileWatcher(String[] urls, int interval, Listener listener)
throws IllegalArgumentException {
super(urls, interval, listener);
}
protected void storeFiles(String[] files) {
try {
_urls = new URL[files.length];
_urls[0] = new URL(files[0]);
_filePaths = files[0];
for (int i = 1; i < files.length; i++) {
_urls[i] = new URL(_urls[0], files[i]);
_filePaths += ";" + _urls[i].getPath();
}
} catch (MalformedURLException murlex) {
Log.log_1204(murlex);
}
}
protected void firstCheck() {
for (int i = 0; i < _urls.length; i++) {
URL url = _urls[i];
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
if (connection.getResponseCode() < 400) {
_lastModified = Math.max(_lastModified, connection.getHeaderFieldDate("Last-Modified", 0L));
}
// Ignore a IOException
} catch (IOException exception) {
Log.log_1204(exception);
// Ignore a SecurityException
} catch (SecurityException exception) {
Utils.logIgnoredException(exception);
}
}
}
protected long getLastModified() throws SecurityException {
long lastModified = 0L;
for (int i = 0; i < _urls.length; i++) {
URL url = _urls[i];
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setIfModifiedSince(_lastModified);
connection.connect();
if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
} else if (connection.getResponseCode() < 400) {
lastModified = Math.max(lastModified, connection.getHeaderFieldDate("Last-Modified", 0L));
} else {
return -1L;
}
} catch (IOException ioe) {
Log.log_1204(ioe);
}
}
if (lastModified == 0L) {
return _lastModified;
} else {
return lastModified;
}
}
}