[Squirrel-sql-commits] sql12/app/src/net/sourceforge/squirrel_sql/client/update/downloader Artifac
A Java SQL client for any JDBC compliant database
Brought to you by:
colbell,
gerdwagner
From: Rob M. <man...@us...> - 2008-04-27 11:28:15
|
Update of /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/update/downloader In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv27500/app/src/net/sourceforge/squirrel_sql/client/update/downloader Modified Files: ArtifactDownloader.java Log Message: Switched to using Apache commons HttpClient instead of plain java HttpURLConnection. The reasons I have for this are manifold. First, the HTTP support built into Java is not as mature - I may not need all of the features provided by HttpClient at the moment, but it's a hedge against future feature requests. Second, this means that Java's HTTP support will continue to mature and as such, version compatibility will be an issue. HttpClient is stable and feature-rich so it means perhaps no code that detects JVM version will have to be written. Third, I have the source code for HttpClient. No one but Sun has the source code for Java 1.5 which is what we are currently minimally compatible with. I had file transfer stop working on me and I couldn't tell what was going wrong. I sat with the debugger for a while, but there was code that I didn't have (sun.net.www.*) that was causing the transfer to fail. I switched out my implementation to use HttpClient and it works great now. After that experience, and until we require the minimum version of the JVM to be the open-source'd one (jdk6), I'll rely on HttpClient for this functionality. Index: ArtifactDownloader.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/update/downloader/ArtifactDownloader.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ArtifactDownloader.java 30 Mar 2008 00:17:51 -0000 1.2 --- ArtifactDownloader.java 27 Apr 2008 11:28:10 -0000 1.3 *************** *** 30,276 **** import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener; import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus; /** ! * Loops through a list of artifacts and downloads each one into the appropriate ! * directory. Notifies listeners of important events. * * @author manningr */ ! public class ArtifactDownloader implements Runnable { ! private List<ArtifactStatus> _artifactStatus = null; ! private volatile boolean _stopped = false; ! private boolean _isRemoteUpdateSite = true; ! private String _host = null; ! private String _path = null; ! private String _fileSystemUpdatePath = null; ! private UpdateUtil _util = null; ! private List<DownloadStatusListener> listeners = ! new ArrayList<DownloadStatusListener>(); ! Thread downloadThread = null; ! String _updatesDir = null; ! ! ! public ArtifactDownloader(List<ArtifactStatus> artifactStatus) { ! _artifactStatus = artifactStatus; ! downloadThread = new Thread(this, "ArtifactDownloadThread"); ! } ! ! public void start() { ! downloadThread.start(); ! } ! ! /** ! * @see java.lang.Runnable#run() ! */ ! public void run() { ! sendDownloadStarted(_artifactStatus.size()); ! ! File downloadsDir = _util.getDownloadsDir(); ! File coreDownloadDir = _util.getCoreDownloadsDir(); ! File pluginDownloadDir = _util.getPluginDownloadsDir(); ! File i18nDownloadDir = _util.getI18nDownloadsDir(); ! ! for (ArtifactStatus status : _artifactStatus) { ! if (_stopped) { ! sendDownloadStopped(); ! break; ! } else { ! sendDownloadFileStarted(status.getName()); ! } ! String fileToGet = status.getType() + "/" + status.getName(); ! String destDir = coreDownloadDir.getAbsolutePath(); ! if (UpdateUtil.PLUGIN_ARTIFACT_ID.equals(status.getType())) { ! destDir = pluginDownloadDir.getAbsolutePath(); ! } ! if (UpdateUtil.TRANSLATION_ARTIFACT_ID.equals(status.getType())) { ! destDir = i18nDownloadDir.getAbsolutePath(); ! } ! // TODO: If the file is already present and it has the same size, ! // skip download ! ! boolean result = true; ! if (_isRemoteUpdateSite) { ! result = _util.downloadHttpFile(_host, _path, fileToGet, destDir); ! } else { ! fileToGet = this._fileSystemUpdatePath +"/" + fileToGet; ! try { ! result = _util.downloadLocalFile(fileToGet, destDir); ! } catch (FileNotFoundException e) { ! // TODO: alert the user that downloads failed. Prevent installation ! } catch (IOException e) { ! // TODO: alert the user that downloads failed. Prevent installation ! } ! } ! if (result == false) { ! sendDownloadFailed(); ! return; ! } else { ! sendDownloadFileCompleted(status.getName()); ! } ! } ! ! sendDownloadComplete(); ! } ! ! /** ! * Stop downloading files as soon as possible. ! */ ! public void stopDownload() { ! _stopped = true; ! } ! /** ! * @return the list of ArtifactStatus items that describe each file to ! * downloaded ! */ ! public List<ArtifactStatus> getArtifactStatus() { ! return _artifactStatus; ! } ! /** ! * @param status ! * the list of ArtifactStatus items that describe each file to ! * downloaded ! */ ! public void setArtifactStatus(List<ArtifactStatus> status) { ! _artifactStatus = status; ! } ! /** ! * @return a boolean indicating whether a remote site or local dir is being ! * used. ! */ ! public boolean isRemoteUpdateSite() { ! return _isRemoteUpdateSite; ! } ! /** ! * @param remoteUpdateSite ! * a boolean indicating whether a remote site or local dir is being ! * used. ! */ ! public void setIsRemoteUpdateSite(boolean remoteUpdateSite) { ! _isRemoteUpdateSite = remoteUpdateSite; ! } ! /** ! * @return the _host ! */ ! public String getHost() { ! return _host; ! } ! /** ! * @param host the _host to set ! */ ! public void setHost(String host) { ! this._host = host; ! } ! /** ! * @return the _path ! */ ! public String getPath() { ! return _path; ! } ! /** ! * @param path the _path to set ! */ ! public void setPath(String path) { ! this._path = path; ! } ! /** ! * @return the _util ! */ ! public UpdateUtil getUtil() { ! return _util; ! } ! /** ! * @param util the _util to set ! */ ! public void setUtil(UpdateUtil util) { ! this._util = util; ! } ! ! /** ! * Adds the specified listener ! * ! * @param listener ! */ ! public void addDownloadStatusListener(DownloadStatusListener listener) { ! listeners.add(listener); ! } ! ! /** ! * Removes the specified listener ! * ! * @param listener ! */ ! public void removeDownloadListener(DownloadStatusListener listener) { ! listeners.remove(listener); ! } ! ! private void sendEvent(DownloadStatusEvent evt) { ! for (DownloadStatusListener listener : listeners) { ! listener.handleDownloadStatusEvent(evt); ! } ! } ! ! private void sendDownloadStarted(int totalFileCount) { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STARTED); ! evt.setFileCountTotal(totalFileCount); ! sendEvent(evt); ! } ! private void sendDownloadStopped() { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STOPPED); ! sendEvent(evt); ! } ! ! private void sendDownloadComplete() { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_COMPLETED); ! sendEvent(evt); ! } ! ! private void sendDownloadFailed() { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FAILED); ! sendEvent(evt); ! } ! private void sendDownloadFileStarted(String filename) { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_STARTED); ! evt.setFilename(filename); ! sendEvent(evt); ! } ! private void sendDownloadFileCompleted(String filename) { ! DownloadStatusEvent evt = ! new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_COMPLETED); ! evt.setFilename(filename); ! sendEvent(evt); ! } ! ! /** ! * @return the _fileSystemUpdatePath ! */ ! public String getFileSystemUpdatePath() { ! return _fileSystemUpdatePath; ! } ! /** ! * @param systemUpdatePath the _fileSystemUpdatePath to set ! */ ! public void setFileSystemUpdatePath(String systemUpdatePath) { ! _fileSystemUpdatePath = systemUpdatePath; ! } } \ No newline at end of file --- 30,374 ---- import net.sourceforge.squirrel_sql.client.update.downloader.event.DownloadStatusListener; import net.sourceforge.squirrel_sql.client.update.gui.ArtifactStatus; + import net.sourceforge.squirrel_sql.client.update.util.PathUtils; + import net.sourceforge.squirrel_sql.client.update.util.PathUtilsImpl; /** ! * Loops through a list of artifacts and downloads each one into the appropriate directory. Notifies listeners ! * of important events. * * @author manningr */ ! public class ArtifactDownloader implements Runnable ! { ! private List<ArtifactStatus> _artifactStatus = null; ! private volatile boolean _stopped = false; ! private boolean _isRemoteUpdateSite = true; ! private String _host = null; ! private String _path = null; ! private String _fileSystemUpdatePath = null; ! private List<DownloadStatusListener> listeners = new ArrayList<DownloadStatusListener>(); ! Thread downloadThread = null; ! String _updatesDir = null; ! private int _port = 80; ! /** The name of the channel from which we are downloading artifacts */ ! private String _channelName; ! ! private UpdateUtil _util = null; ! ! /** TODO: change this to Spring-injected when this class becomes a Spring bean. */ ! private PathUtils _pathUtils = new PathUtilsImpl(); ! public ArtifactDownloader(List<ArtifactStatus> artifactStatus) ! { ! _artifactStatus = artifactStatus; ! downloadThread = new Thread(this, "ArtifactDownloadThread"); ! } ! public void start() ! { ! downloadThread.start(); ! } ! ! /** ! * @see java.lang.Runnable#run() ! */ ! public void run() ! { ! sendDownloadStarted(_artifactStatus.size()); ! try ! { ! for (ArtifactStatus status : _artifactStatus) ! { ! if (_stopped) ! { ! sendDownloadStopped(); ! return; ! } ! else ! { ! sendDownloadFileStarted(status.getName()); ! } ! String fileToGet = _pathUtils.buildPath(true, _channelName, status.getType(), status.getName()); ! String destDir = getArtifactDownloadDestDir(status); ! if (fileWasDownloadedPreviously(status)) { ! continue; ! } ! ! boolean result = true; ! if (_isRemoteUpdateSite) ! { ! try ! { ! _util.downloadHttpFile(_host, _port, fileToGet, destDir); ! } ! catch (Exception e) ! { ! e.printStackTrace(); ! sendDownloadFailed(); ! return; ! } ! } ! else ! { ! fileToGet = _pathUtils.buildPath(false, this._fileSystemUpdatePath,fileToGet); ! result = _util.downloadLocalFile(fileToGet, destDir); ! } ! if (result == false) ! { ! sendDownloadFailed(); ! return; ! } ! else ! { ! sendDownloadFileCompleted(status.getName()); ! } ! } ! } ! catch (FileNotFoundException e) ! { ! // TODO: alert the user that downloads failed. Prevent installation ! e.printStackTrace(); ! sendDownloadFailed(); ! return; ! } ! catch (IOException e) ! { ! // TODO: alert the user that downloads failed. Prevent installation ! e.printStackTrace(); ! sendDownloadFailed(); ! return; ! } ! sendDownloadComplete(); ! } ! private boolean fileWasDownloadedPreviously(ArtifactStatus status) ! { ! boolean result = false; ! ! // Need to expand interface ArtifactStatus to include file size and/or checksum. ! ! return result; ! } ! ! private String getArtifactDownloadDestDir(ArtifactStatus status) { ! ! File destDir = _util.getCoreDownloadsDir(); ! if (UpdateUtil.PLUGIN_ARTIFACT_ID.equals(status.getType())) ! { ! destDir = _util.getPluginDownloadsDir(); ! } ! if (UpdateUtil.TRANSLATION_ARTIFACT_ID.equals(status.getType())) ! { ! destDir = _util.getI18nDownloadsDir(); ! } ! return destDir.getAbsolutePath(); ! } ! ! /** ! * Stop downloading files as soon as possible. ! */ ! public void stopDownload() ! { ! _stopped = true; ! } ! ! /** ! * @return the list of ArtifactStatus items that describe each file to downloaded ! */ ! public List<ArtifactStatus> getArtifactStatus() ! { ! return _artifactStatus; ! } ! ! /** ! * @param status ! * the list of ArtifactStatus items that describe each file to downloaded ! */ ! public void setArtifactStatus(List<ArtifactStatus> status) ! { ! _artifactStatus = status; ! } ! ! /** ! * @return a boolean indicating whether a remote site or local dir is being used. ! */ ! public boolean isRemoteUpdateSite() ! { ! return _isRemoteUpdateSite; ! } ! ! /** ! * @param remoteUpdateSite ! * a boolean indicating whether a remote site or local dir is being used. ! */ ! public void setIsRemoteUpdateSite(boolean remoteUpdateSite) ! { ! _isRemoteUpdateSite = remoteUpdateSite; ! } ! ! /** ! * @return the _host ! */ ! public String getHost() ! { ! return _host; ! } ! ! /** ! * @param host ! * the _host to set ! */ ! public void setHost(String host) ! { ! this._host = host; ! } ! ! /** ! * @return the _path ! */ ! public String getPath() ! { ! return _path; ! } ! ! /** ! * @param path ! * the _path to set ! */ ! String downloadHttpFile(String host, int port, String path, String fileToGet, String destDir) ! throws Exception ! { ! return _util.downloadHttpFile(host, port, fileToGet, destDir); ! } ! ! public void setPath(String path) ! { ! this._path = path; ! } ! ! /** ! * @return the _util ! */ ! public UpdateUtil getUtil() ! { ! return _util; ! } ! ! /** ! * Adds the specified listener ! * ! * @param listener ! */ ! public void addDownloadStatusListener(DownloadStatusListener listener) ! { ! listeners.add(listener); ! } ! ! /** ! * Removes the specified listener ! * ! * @param listener ! */ ! public void removeDownloadListener(DownloadStatusListener listener) ! { ! listeners.remove(listener); ! } ! ! private void sendEvent(DownloadStatusEvent evt) ! { ! for (DownloadStatusListener listener : listeners) ! { ! listener.handleDownloadStatusEvent(evt); ! } ! } ! ! private void sendDownloadStarted(int totalFileCount) ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STARTED); ! evt.setFileCountTotal(totalFileCount); ! sendEvent(evt); ! } ! ! private void sendDownloadStopped() ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_STOPPED); ! sendEvent(evt); ! } ! ! private void sendDownloadComplete() ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_COMPLETED); ! sendEvent(evt); ! } ! ! private void sendDownloadFailed() ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FAILED); ! sendEvent(evt); ! } ! ! private void sendDownloadFileStarted(String filename) ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_STARTED); ! evt.setFilename(filename); ! sendEvent(evt); ! } ! ! private void sendDownloadFileCompleted(String filename) ! { ! DownloadStatusEvent evt = new DownloadStatusEvent(DownloadEventType.DOWNLOAD_FILE_COMPLETED); ! evt.setFilename(filename); ! sendEvent(evt); ! } ! ! /** ! * @return the _fileSystemUpdatePath ! */ ! public String getFileSystemUpdatePath() ! { ! return _fileSystemUpdatePath; ! } ! ! /** ! * @param systemUpdatePath ! * the _fileSystemUpdatePath to set ! */ ! public void setFileSystemUpdatePath(String systemUpdatePath) ! { ! _fileSystemUpdatePath = systemUpdatePath; ! } ! ! public void setPort(int updateServerPort) ! { ! _port = updateServerPort; ! } ! ! public void setChannelName(String name) ! { ! _channelName = name; ! } ! ! /** ! * Sets the update utility to use. ! * ! * @param util ! */ ! public void setUtil(UpdateUtil util) ! { ! this._util = util; ! } ! } \ No newline at end of file |