/** * Download an artifact from a host to the cache. * * @param host the remote host * @param artifact the artifact being retrieved * @param destination the cached destination * @return TRUE if downloaded * @exception IOException if an IO error occurs * @exception TransitException if a transit system error occurs */ private boolean download(ResourceHost host, Artifact artifact, File destination) throws IOException, TransitException { if (host == null) { return false; } CacheMonitorRouter monitor = Transit.getInstance().getCacheMonitorRouter(); File parentDir = destination.getParentFile(); File tempFile = File.createTempFile("~dpml", ".tmp", parentDir); tempFile.deleteOnExit(); // safety harness in case we abort abnormally FileOutputStream tempOut = new FileOutputStream(tempFile); try { Date lastModified = host.download(artifact, tempOut); // An atomic operation and no risk of a corrupted // artifact content. tempFile.renameTo(destination); destination.setLastModified(lastModified.getTime()); return true; } catch (Throwable e) { tempFile.delete(); if (monitor != null) { monitor.failedDownloadFromHost(host.toString(), artifact, e); } return false; } }
/** * Find any host. * * @param artifact the artifact * @return the resource host (possibly null) */ private ResourceHost findAnyPresence(Artifact artifact) { synchronized (m_resourceHosts) { Iterator list = m_resourceHosts.values().iterator(); while (list.hasNext()) { ResourceHost host = (ResourceHost) list.next(); if (host.isEnabled()) { if (host.checkPresence(artifact, false)) { return host; } } } return null; } }