Author: maartenc Date: Thu Aug 7 14:08:34 2008 New Revision: 683715 URL: http://svn.apache.org/viewvc?rev=683715&view=rev Log: NEW: Add publish support to URL resolver (IVY-848) (thanks to Brian Sanders)
Modified: ant/ivy/core/trunk/CHANGES.txt ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/repository/url/URLRepository.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandler.java ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandlerDispatcher.java Modified: ant/ivy/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/CHANGES.txt (original) +++ ant/ivy/core/trunk/CHANGES.txt Thu Aug 7 14:08:34 2008 @@ -61,6 +61,7 @@ Geoff Reedy Christian Riege Andreas Sahlbach + Brian Sanders Adrian Sandor Ruslan Shevchenko John Shields @@ -75,6 +76,7 @@ trunk version ===================================== +- NEW: Add publish support to URL resolver (IVY-848) (thanks to Brian Sanders) - NEW: Better support for local builds (IVY-857) - NEW: Retain original dependency constraint rules in resolved ivy file (IVY-739) - NEW: Add a new resolve mode (optionally per module) to utilize dynamic constraint rule metadata (IVY-740) Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/repository/url/URLRepository.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/repository/url/URLRepository.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/repository/url/URLRepository.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/repository/url/URLRepository.java Thu Aug 7 14:08:34 2008 @@ -20,13 +20,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - +import java.util.*; import org.apache.ivy.plugins.repository.AbstractRepository; import org.apache.ivy.plugins.repository.RepositoryCopyProgressListener; import org.apache.ivy.plugins.repository.Resource; @@ -75,8 +69,27 @@ } public void put(File source, String destination, boolean overwrite) throws IOException { - throw new UnsupportedOperationException( - "URL repository is not able to put files for the moment"); + if (!overwrite) { + throw new UnsupportedOperationException( + "URL repository do not support append operations at the moment"); + } + + fireTransferInitiated(getResource(destination), TransferEvent.REQUEST_PUT); + try { + long totalLength = source.length(); + if (totalLength > 0) { + progress.setTotalLength(new Long(totalLength)); + } + FileUtil.copy(source, new URL(destination), progress); + } catch (IOException ex) { + fireTransferError(ex); + throw ex; + } catch (RuntimeException ex) { + fireTransferError(ex); + throw ex; + } finally { + progress.setTotalLength(null); + } } private ApacheURLLister lister = new ApacheURLLister(); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/FileUtil.java Thu Aug 7 14:08:34 2008 @@ -136,6 +136,10 @@ URLHandlerRegistry.getDefault().download(src, dest, l); } + public static void copy(File src, URL dest, CopyProgressListener l) throws IOException { + URLHandlerRegistry.getDefault().upload(src, dest, l); + } + public static void copy(InputStream src, File dest, CopyProgressListener l) throws IOException { if (dest.getParentFile() != null) { dest.getParentFile().mkdirs(); @@ -172,6 +176,12 @@ evt.update(EMPTY_BUFFER, 0, total); } + try { + dest.flush(); + } catch (IOException ex) { + // ignore + } + // close the streams src.close(); dest.close(); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java Thu Aug 7 14:08:34 2008 @@ -18,6 +18,8 @@ package org.apache.ivy.util.url; import java.net.URL; +import java.net.HttpURLConnection; +import java.io.IOException; public abstract class AbstractURLHandler implements URLHandler { public boolean isReachable(URL url) { @@ -43,4 +45,23 @@ public long getLastModified(URL url, int timeout) { return getURLInfo(url, timeout).getLastModified(); } + + protected void validatePutStatusCode(URL dest, int statusCode, String statusMessage) throws IOException { + switch (statusCode) { + case HttpURLConnection.HTTP_OK: + /* intentional fallthrough */ + case HttpURLConnection.HTTP_CREATED: + /* intentional fallthrough */ + case HttpURLConnection.HTTP_ACCEPTED: + /* intentional fallthrough */ + case HttpURLConnection.HTTP_NO_CONTENT: + break; + case HttpURLConnection.HTTP_UNAUTHORIZED: + /* intentional fallthrough */ + case HttpURLConnection.HTTP_FORBIDDEN: + throw new IOException("Access to URL " + dest + " was refused by the server" + (statusMessage == null ? "" : ": " + statusMessage)); + default: + throw new IOException("PUT operation to URL " + dest + " failed with status code " + statusCode + (statusMessage == null ? "" : ": " + statusMessage)); + } + } } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java Thu Aug 7 14:08:34 2008 @@ -17,11 +17,7 @@ */ package org.apache.ivy.util.url; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; @@ -143,6 +139,39 @@ } } + public void upload(File source, URL dest, CopyProgressListener l) throws IOException { + if (!"http".equals(dest.getProtocol()) && !"https".equals(dest.getProtocol())) { + throw new UnsupportedOperationException( + "URL repository only support HTTP PUT at the moment"); + } + + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) dest.openConnection(); + conn.setDoOutput(true); + conn.setRequestMethod("PUT"); + conn.setRequestProperty("User-Agent", "Apache Ivy"); + conn.setRequestProperty("Content-type", "application/octet-stream"); + conn.setRequestProperty("Content-length", Long.toString(source.length())); + conn.setInstanceFollowRedirects(true); + + InputStream in = new FileInputStream(source); + try { + OutputStream os = conn.getOutputStream(); + FileUtil.copy(in, os, l); + } finally { + try { + in.close(); + } catch (IOException e) { + /* ignored */ + } + } + validatePutStatusCode(dest, conn.getResponseCode(), conn.getResponseMessage()); + } finally { + disconnect(conn); + } + } + private void disconnect(URLConnection con) { if (con instanceof HttpURLConnection) { ((HttpURLConnection) con).disconnect(); Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java Thu Aug 7 14:08:34 2008 @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.FileInputStream; import java.net.URL; import java.net.UnknownHostException; import java.text.ParseException; @@ -38,6 +39,8 @@ import org.apache.commons.httpclient.auth.AuthPolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.HeadMethod; +import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.commons.httpclient.methods.InputStreamRequestEntity; import org.apache.ivy.util.CopyProgressListener; import org.apache.ivy.util.Credentials; import org.apache.ivy.util.FileUtil; @@ -99,6 +102,28 @@ get.releaseConnection(); } + public void upload(File src, URL dest, CopyProgressListener l) throws IOException { + HttpClient client = getClient(dest); + + PutMethod put = new PutMethod(dest.toExternalForm()); + put.setDoAuthentication(useAuthentication(dest) || useProxyAuthentication()); + FileInputStream fileStream = null; + try { + fileStream = new FileInputStream(src); + put.setRequestEntity(new InputStreamRequestEntity(fileStream)); + int statusCode = client.executeMethod(put); + validatePutStatusCode(dest, statusCode, null); + } finally { + if (fileStream != null) { + try { + fileStream.close(); + } catch (IOException e) { + /* ignored */ + } + } + } + } + public URLInfo getURLInfo(URL url) { return getURLInfo(url, 0); } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandler.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandler.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandler.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandler.java Thu Aug 7 14:08:34 2008 @@ -139,4 +139,6 @@ public InputStream openStream(URL url) throws IOException; public void download(URL src, File dest, CopyProgressListener l) throws IOException; + + public void upload(File src, URL dest, CopyProgressListener l) throws IOException; } Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandlerDispatcher.java URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandlerDispatcher.java?rev=683715&r1=683714&r2=683715&view=diff ============================================================================== --- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandlerDispatcher.java (original) +++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/URLHandlerDispatcher.java Thu Aug 7 14:08:34 2008 @@ -77,6 +77,10 @@ getHandler(src.getProtocol()).download(src, dest, l); } + public void upload(File src, URL dest, CopyProgressListener l) throws IOException { + getHandler(dest.getProtocol()).upload(src, dest, l); + } + public void setDownloader(String protocol, URLHandler downloader) { handlers.put(protocol, downloader); }